[PYTHON] Die Geschichte des Starts eines Minecraft-Servers von Discord

Einführung

Hallo. Ich bin ein Yin-Yang-Student. Als Student sind meine Freunde nur online. Deshalb spiele ich oft Online-Spiele. Diesmal ist die Geschichte.

Als Student lebe ich in einer Genossenschaftswohnung. Selbst wenn ich einen Server einrichte, kann ich den Port nicht öffnen und nicht spielen. Daher richte ich normalerweise einen Server mit EC2 von AWS ein.

Es wäre sehr praktisch, wenn dieser Server über das Voice-Chat-Tool Discord gestartet und gestoppt werden könnte.

Dann ist die Einführung länger geworden, aber bitte.

Vorbereitung für EC2

Überblick

image.png

--__ discord-bot EC2 t2.micro Instanz __ --__ Spieleserver EC2 t2.large Instanz __

Der Umriss des Systems sieht so aus. Der Punkt hier ist

Gründe für zwei Instanzen

Weil ich kein Geld habe. Zum Ausführen des Minecraft-Servers ist mindestens t2.large Leistung (8 GB Speicher) erforderlich. Der Bot von Discord muss jedoch ständig aktiv sein, und das teurere t2.large kann nicht immer gestartet werden.

Instanzeinstellungen

Viele Leute haben erklärt, wie man eine EC2-Instanz startet, deshalb werde ich sie weglassen.

discord-bot Instanztyp: t2.micro Eingehende Regel: Keine Bearbeitung OK (nur SSH 22-Port) Konsole: AWS-Befehle können verwendet werden

Der Discord BOT verwendet discord.py. Der Grund für Python ist, dass es mir gefällt. ..

game-server Instanztyp: t2.large Eingehende Regel: TCP25565-Port hinzugefügt (für Minecraft)

Implementierung

Erstellen eines Discord-Bot-Kontos

Informationen zum Erstellen finden Sie unter hier. Notieren Sie sich das Zugriffstoken.

Erstellen eines Discord-Bots

Arbeiten Sie mit der __discord-bot-Instanz __. Führen Sie die folgenden Schritte in dem über SSH verbundenen Terminal aus.

python3 -m pip install -U discord.py

Schreiben Sie den Hauptquellcode. Starten Sie diesmal den Server, wenn "$ start minecraft" eingegeben wird, und stoppen Sie den Server, wenn "$ stop minecraft" eingegeben wird.



import discord
import subprocess
import paramiko
import time

#Ersetzen Sie durch den Zugriffstoken Ihres Bots
TOKEN = 'your access token'
# game-Bitte geben Sie die Instanz-ID des Servers an
INSTANCEID = 'your instance id'

#Generieren Sie die für die Verbindung benötigten Objekte
client = discord.Client()

# ***************************
# ***Verarbeitungsfunktion
# ***************************
class DiscordBOT:
    def __init__(self, client):
        self.SSHClient = None

    async def main(self, discord_event):
        get_text = discord_event.content
        send_text = ""

        if "$start minecraft" in get_text:
            #Instanz starten
            subprocess.call("aws ec2 start-instances --instance-ids {}".format(INSTANCEID), shell=True)
            time.sleep(3)

            #Warten Sie, bis die Instanz gestartet wird
            subprocess.call("aws ec2 wait instance-running --instance-ids {}".format(INSTANCEID), shell=True)
            time.sleep(3)

            #Rufen Sie die IP-Adresse der Instanz ab
            proc = subprocess.run(["aws ec2 describe-instances --instance-ids {} --query 'Reservations[*].Instances[*].PublicIpAddress' --output text".format(INSTANCEID)], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
            ip_add = proc.stdout.decode("utf-8")
            ip_add = ip_add.replace(".", "-").replace("\n", "")
            self.server_ip = ip_add
            time.sleep(3)

            #Erstellen Sie einen SSH-Verbindungsclient
            self.SSHClient = paramiko.SSHClient()
            self.SSHClient.set_missing_host_key_policy(paramiko.WarningPolicy())
            self.SSHClient.connect('ec2-{}.compute-1.amazonaws.com'.format(ip_add), username='root', password='')
            time.sleep(2)
            
            #Starten Sie den Minecraft-Server mit SSH
            stdin, stdout, stderr = self.SSHClient.exec_command("java -Xmx4096M -Xms4096M -jar server.jar nogui")
            for x in stdout:
                print(x)
            for x in stderr:
                print(x)
            time.sleep(2)

            #Senden Sie die IP-Adresse für die Verbindung an discord
            send_text = "Sie haben die Instanz erfolgreich gestartet und eine Verbindung zum Minecraft-Server hergestellt.\n Nach dem Starten des Servers{}Sie können sich mit verbinden".format(ip_add.replace("-", "."))

        elif "$stop minecraft" in get_text:
            #Stoppen Sie den Server
            self.SSHClient.connect('ec2-{}.compute-1.amazonaws.com'.format(ip_add), username='root', password='')
            time.sleep(2)
            stdin, stdout, stderr = self.SSHClient.exec_command("stop")
            self.SSHClient.close()

            #Instanz stoppen
            subprocess.call("aws ec2 stop-instances --instance-ids {}".format(INSTANCEID), shell=True)
            send_text = "Der Serverstopp ist abgeschlossen."

        if send_text:
            await discord_event.channel.send(send_text)


discordbot = DiscordBOT(client)

@client.event
async def on_ready():
    print('Sie sind jetzt angemeldet')

# on get message
@client.event
async def on_message(message):
    if message.author.bot:
        return

    await discordbot.main(message)

#Starten Sie Bot und stellen Sie eine Verbindung zum Discord-Server her
client.run(TOKEN)

Führen Sie dies auf EC2 aus und Sie sind fertig.

nohup python3 main.py &

Game-Server-Einstellungen

Sie müssen Java installieren. Weitere Informationen finden Sie unter hier.

Speichern Sie außerdem das Minecraft-Serverskript (server.jar) im Home-Verzeichnis des Root-Benutzers.

Da die SSH-Verbindung über die Authentifizierung mit öffentlichem Schlüssel hergestellt wird, nehmen Sie die Einstellungen dort vor. Es gibt hier bereits einen Artikel, daher werde ich ihn vorstellen.

So melden Sie sich zwischen EC2-Instanzen ohne SSH-Kennwort an

Sicherheitsgruppeneinstellungen

Ein Fernstart mit dem Befehl aws ist derzeit nicht möglich. Sie müssen also jede in dieselbe Sicherheitsgruppe einordnen, um dies zuzulassen.

image.png

Wählen Sie Zuweisen / Ersetzen __ für diese __IAM-Rolle

image.png

Fügen Sie nach dem Erstellen einer neuen IAM-Rolle jede Instanz derselben IAM-Rolle hinzu, und Sie können loslegen.

Ergebnis

daw.png

image.png

Es hat sicher funktioniert. Ich bin glücklich.

Recommended Posts

Die Geschichte des Starts eines Minecraft-Servers von Discord
Die Geschichte des erneuten Bereitstellens des Anwendungsservers
Die Geschichte des Exportierens eines Programms
Die Geschichte des Django-Modellfeldes verschwindet aus der Klasse
Die Geschichte der Verarbeitung A von Blackjack (Python)
Eine Geschichte über den Betrieb einer GCP-Instanz von Discord
Die Geschichte eines Mel-Icon-Generators
Die Geschichte vom Umzug von Pipenv zur Poesie
Die Geschichte von sys.path.append ()
SSH-Anmeldung am Zielserver von Windows mit einem Klick auf eine Verknüpfung
Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert
Berechnen Sie das Volumen aus der zweidimensionalen Struktur einer Verbindung
Erstellen Sie einen BOT, der die Discord-URL verkürzt
Python zeigt aus der Perspektive eines C-Sprachprogrammierers
Die Geschichte eines neuronalen Netzwerks der Musikgeneration
Eine Geschichte über die Änderung des Master-Namens von BlueZ
Zip 4 Gbyte Problem ist eine Geschichte der Vergangenheit
Eine Geschichte, die die Lieferung von Nico Nama analysierte.
Stecken Sie Befehle aus dem Discord-Textchat in den Micra-Server
Die Geschichte des Wechsels von WoSign zu Let's Encrypt für ein kostenloses SSL-Zertifikat
Die Geschichte des Baus von Zabbix 4.4
Die Geschichte der Einrichtung eines VIP-Kanals im internen Chatwork
Anders als der Importtyp von Python. Bedeutung von aus A Import B.
Fand die Ursache für die mysteriöse Kommunikation des Minecraft-Servers (Spigot)
Die Geschichte des Kopierens von Daten von S3 auf Googles TeamDrive
Erstellen Sie ein Korrelationsdiagramm aus dem Konversationsverlauf von Twitter
Immerhin die Geschichte der Rückkehr von Linux zu Windows
Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Eine Geschichte über einen GCP-Anfänger, der versucht, mit GCE einen Micra-Server aufzubauen
Python-Skript, das den Status des Servers über den Browser überprüfen kann
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Die Geschichte von Python und die Geschichte von NaN
Eine Geschichte über die Vorhersage von Präfekturen aus Städtenamen mit Jubatus
Die Geschichte der Teilnahme an AtCoder
Eine Formel, die einfach das Alter ab dem Geburtsdatum berechnet
Existenz aus Sicht von Python
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
[Python] Ruft das Aktualisierungsdatum eines Nachrichtenartikels aus HTML ab
Die Geschichte der Erstellung einer Website, auf der die Veröffentlichungsdaten von Büchern aufgeführt sind
Die Geschichte des "Lochs" in der Akte
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Beste 3 aus den Eindrücken des Lesens des neuen Shell-Programmierlehrbuchs
Richten Sie mit Python einen Dummy-SMTP-Server ein und überprüfen Sie den Sendevorgang von Action Mailer
Eine Geschichte über das Erstellen eines Programms, mit dem die Anzahl der Instagram-Follower in einer Woche von 0 auf 700 erhöht wird
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
Die Geschichte eines Parksensors in 10 Minuten mit dem GrovePi + Starter Kit
Die Geschichte, wie man mit Python einen 100-Yen-Frühstücks-Bot für die Universität macht
Die Geschichte der Entwicklung einer WEB-Anwendung, die automatisch Fangkopien generiert [MeCab]
Eine Geschichte von einer Person, die von Anfang an auf Datenwissenschaftler abzielte
Die Geschichte einer Soundkamera mit Touch Designer und ReSpeaker
Sprechen Sie über die Fluchtwahrscheinlichkeit eines zufälligen Gehens auf einem ganzzahligen Gitter
Die Geschichte, ein Paket zu erstellen, das den Betrieb von Juman (Juman ++) & KNP beschleunigt
Holen Sie sich das durchschnittliche Gehalt eines Jobs mit bestimmten Bedingungen von Indeed.com
Aus einem Buch, das die Denkweise des Programmierers interessanterweise gelernt hat (Python)
Die Geschichte des Versuchs, den Client wieder zu verbinden