[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3

Überblick

[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3 (Umgebungskonstruktion) [Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3 (Erstellen eines BOT, der über Discord verwaltet werden kann) [Python] Ich möchte 7DaysToDie von Discord aus verwalten! 3/3 (Funktionsprüfung)

Erstellen eines BOT, der über Discord verwaltet werden kann

Nach Letztes Mal erstellen wir dieses Mal ein Programm, das über den Haupt-Discord verwaltet werden kann.

Erstellen von sdtd_run.py

$ cd
$ mkdir -p $HOME/python/discord/Sdtd
$ cd $HOME/python/discord/
$ vim sdtd_run.py

** Als nächstes muss sdtd_run.py zwei Punkte überprüfen. ** **.

sdtd_run.py


#!/bin/env python
import discord
import threading
import os
import re
import time
import subprocess as prc
from Sdtd import command

API = "Geben Sie hier die Discord-API ein."
ADMIN = "Geben Sie hier den Namen des Festplattencode-Serveradministrators ein. Beispiel:Dream"
#SubADMIN ="Falls erforderlich, Name des stellvertretenden Beamten"

client = discord.Client()
@client.event
async def on_message(message):
    #Geben Sie den Serveradministrator an. Wenn Sie einen stellvertretenden Beamten haben, wenden Sie sich bitte an oder wie folgt.
    #if message.author.name == (ADMIN) or message.author.name == ("SubADMIN"):
    if message.author.name == (ADMIN):
        cmd = command.SDTD()
        if message.content.startswith('/help'):
            cmdhelp = cmd.command_help()
            await message.channel.send(cmdhelp)

        elif message.content.startswith('/member'):
            await message.channel.send(cmd.player_joined_check())

        elif message.content.startswith('/server-start'):
            timemsg = time.strftime("%Y/%m/%d %H:%M:%S ", time.strptime(time.ctime()))
            await message.channel.send(timemsg + "---Starten Sie den Server.(Der Start kann bis zu 5 Minuten dauern.)")
            thread = threading.Thread(target=cmd.start)
            thread.start()

        elif message.content.startswith('/server-stop'):
            timemsg = time.strftime("%Y/%m/%d %H:%M:%S ", time.strptime(time.ctime()))
            await message.channel.send(timemsg + "---Stoppen Sie den Server.")
            thread = threading.Thread(target=cmd.stop)
            thread.start()

        elif message.content.startswith('/server-restart'):
            timemsg = time.strftime("%Y/%m/%d %H:%M:%S ", time.strptime(time.ctime()))
            await message.channel.send(timemsg + "---Starten Sie den Server neu.")
            thread = threading.Thread(target=cmd.stop)
            thread.start()
            time.sleep(15)
            timemsg = time.strftime("%Y/%m/%d %H:%M:%S ", time.strptime(time.ctime()))
            await message.channel.send(timemsg + "---Starten Sie den Server.(Der Start kann bis zu 5 Minuten dauern.)")
            thread = threading.Thread(target=cmd.start)
            thread.start()

        elif message.content.startswith('/server-status'):
            timemsg = time.strftime("%Y/%m/%d %H:%M:%S ", time.strptime(time.ctime()))
            await message.channel.send(timemsg + "---Zeigt den Status des Servers an.")
            await message.channel.send(cmd.status())

client.run(API)

Erstellen Sie dann command.py.

$ cd Sdtd
$ vim command.py

** Als nächstes muss command.py drei Punkte überprüfen. ** **.

--Füllen Sie die Webhooks-API aus --Überprüfen Sie den Speicherort des Spielverzeichnisses. (Für Vanille ist die Standardeinstellung OK) --Überprüfen Sie die Position des Bildschirms (wahrscheinlich standardmäßig OK).

command.py


#!/bin/env python
import os
import re
import sys
import requests
import subprocess as prc
import time
import glob as g
from telnetlib import Telnet

class SDTD(object):

    def __init__(self):
        #Füllen Sie die Discord Webhooks-API aus.
        self.discord = "Discord_Webhooks_API"
        #Überprüfen Sie das Bildschirmgenerierungsverzeichnis.
        self.screendir = "/var/run/screen/S-" + os.environ['USER']
        #Diesmal/Da es mit sdtd erstellt wurde, legen Sie es unten fest. Wechseln Sie rechtzeitig, wenn Sie zu Mod Makrele wechseln.
        self.gamedir = os.environ['HOME'] + "/steamcmd/sdtd"

    def port_check(self):
        p1 = prc.Popen(["lsof"], stdout=prc.PIPE)
        p2 = prc.Popen(["grep", "7Days"], stdin=p1.stdout, stdout=prc.PIPE)
        p3 = prc.Popen(["grep","-E","TCP..:"], stdin=p2.stdout, stdout=prc.PIPE)
        p4 = prc.Popen(["awk", "-F:", "NR==1 {print $2}"], stdin=p3.stdout, stdout=prc.PIPE)
        p5 = prc.Popen(["awk", "{print $1}"], stdin=p4.stdout, stdout=prc.PIPE)
        p1.stdout.close()
        p2.stdout.close()
        p3.stdout.close()
        p4.stdout.close()
        output = p5.communicate()[0].decode('utf-8')
        return output[:-1]

    def proc_check(self):
        p1 = prc.Popen(['ps', 'x'], stdout=prc.PIPE)
        p2 = prc.Popen(["grep", "-v","grep"], stdin=p1.stdout, stdout=prc.PIPE)
        p3 = prc.Popen(["grep", "7DaysToDieServer.x86_64"], stdin=p2.stdout, stdout=prc.PIPE)
        p4 = prc.Popen(["awk","{print $1}"], stdin=p3.stdout,stdout=prc.PIPE)
        p1.stdout.close()
        p2.stdout.close()
        p3.stdout.close()
        output = p4.communicate()[0].decode('utf-8')
        return output[:-1]

    def screen_check(self):
        p1 = prc.Popen(['ps', 'x'], stdout=prc.PIPE)
        p2 = prc.Popen(["grep", "-v","grep"], stdin=p1.stdout, stdout=prc.PIPE)
        p3 = prc.Popen(["grep", "SCREEN"], stdin=p2.stdout, stdout=prc.PIPE)
        p4 = prc.Popen(["awk","{print $1}"], stdin=p3.stdout, stdout=prc.PIPE)
        p1.stdout.close()
        p2.stdout.close()
        p3.stdout.close()
        output = p4.communicate()[0].decode('utf-8')
        return output[:-1]

    def command_help(self):
        lists = (
 "` `/ help Zeige diesen Inhalt. \ N"
 "/ server-stop 7Days to Die Stoppt den Server. \ N"
 "/ server-start 7Days to Die Starten Sie den Server. \ N"
 "/ server-restart 7Days to Die Starten Sie den Server neu. \ N"
 "/ server-status 7Days to Die Serverstatus anzeigen. \ N"
        "/Mitglied Überprüfen Sie den aktuell verbundenen Benutzer.\n```"
        )
        return lists

    def server_status(self):
        init = 0
        port = self.port_check()
        if port != "":
            port_status_msg = "Hafen[" + port + "]Wird bei veröffentlicht."
            init += 1
        else:
            port_status_msg = "Der Port wurde nicht freigegeben."
            init -= 1

        process = self.proc_check()
        if process != "":
            proc_status_msg = "GAME PID [" + process[:-1] + "]Es arbeitet in."
            init += 1
        else:
            proc_status_msg = "Der Prozess wird nicht ausgeführt."
            init -= 1

        screen = self.screen_check()
        if screen != "":
            screen_status_msg = "SCREEN PID [" + screen[:-1] + "]Es arbeitet in."
            init += 1
        else:
            screen_status_msg = "Der Bildschirm funktioniert nicht."
            init -= 1

        message = port_status_msg + "\n" + proc_status_msg + "\n" + screen_status_msg + "\n"

        return message,init

    def status(self):
        message = self.server_status()[0]
        return message

    def player_joined_check(self):
        status = self.server_status()[1]
        sts_msg = self.server_status()[0]
        if status <= 0:
            msg = "Der Server wurde nicht normal gestartet.\n" + sts_msg
            return msg
        login_status = []
        member = ""
        with Telnet('localhost',8081) as tn:
            tn.write(b'lp\n')
            time.sleep(1)
            tn.write(b'exit\n')
            login_mem = tn.read_all().decode().split("\n")[16:-1]

            for i in range(len(login_mem)):
                login_status += [login_mem[i].replace('\r','\n')]
                member += login_status[i]

        return member[:-1]

    def start_check(self):
        for i in range(420):
            status = self.server_status()[1]
            if status == 3:
                timemsg = time.strftime("%Y/%m/%d %H:%M:%S ", time.strptime(time.ctime()))
                payload = {
                    "content" : timemsg + "---Der Serverstart ist abgeschlossen."
                }
                requests.post(self.discord, data=payload)
                sys.exit()

            time.sleep(1)

        else:
            status = self.server_status()[0]
            timemsg = time.strftime("%Y/%m/%d %H:%M:%S ", time.strptime(time.ctime()))
            payload = {
                "content" : timemsg + "---Server konnte nicht gestartet werden. Bitte überprüfen Sie die Situation.\n" + status
            }
            requests.post(self.discord, data=payload)
            sys.exit()

    def stop_check(self):
        for i in range(30):
            status = self.server_status()[1]
            if status == -3:
                timemsg = time.strftime("%Y/%m/%d %H:%M:%S ", time.strptime(time.ctime()))
                payload = {
                    "content" : timemsg + "---Der Serverstopp ist abgeschlossen."
                }
                requests.post(self.discord, data=payload)
                sys.exit()

            time.sleep(1)

        else:
            status = self.server_status()[0]
            timemsg = time.strftime("%Y/%m/%d %H:%M:%S ", time.strptime(time.ctime()))
            payload = {
                "content" : timemsg + "---Fehler beim Stoppen des Servers. Bitte überprüfen Sie die Situation.\n" + status
            }
            requests.post(self.discord, data=payload)
            sys.exit()

    def start(self):
        status = self.server_status()[1]
        if status == 3:
            timemsg = time.strftime("%Y/%m/%d %H:%M:%S ", time.strptime(time.ctime()))
            payload = {
                "content" : timemsg + "---Der Server ist bereits gestartet."
            }
            requests.post(self.discord, data=payload)
            sys.exit()

        os.chdir(self.gamedir)
        com1 = prc.run(["screen", "-dmS", "sdtd"], stdout=prc.PIPE)
        time.sleep(2)
        com2 = prc.run(['screen','-S','sdtd','-p','0','-X','exec','/bin/bash','startserver.sh'], stdout=prc.PIPE)
        sys.stdout.buffer.write(com1.stdout)
        time.sleep(2)
        sys.stdout.buffer.write(com2.stdout)

        self.start_check()

    def stop(self):
        prc_chk = self.proc_check()
        scn_chk = self.screen_check()
        status = self.server_status()[1]
        if status == 3:
            message = "Sagen Sie Stoppen Sie den Server nach 10 Sekunden.\n\n".encode('utf-8')
            with Telnet('localhost',8081) as tn:
                tn.write(message)
                time.sleep(10)
                tn.write(b'shutdown\n')
                try:
                    tn.interact()
                except: pass

        if status == -3:
            timemsg = time.strftime("%Y/%m/%d %H:%M:%S ", time.strptime(time.ctime()))
            payload = {
                "content" : timemsg + "---Der Server ist bereits gestoppt."
            }
            requests.post(self.discord, data=payload)
            sys.exit()

        if prc_chk != "":
            prc.Popen(['kill', '-9',prc_chk], stdout=prc.PIPE)

        if scn_chk != "":
            prc.Popen(['kill', '-9',scn_chk], stdout=prc.PIPE)
            os.chdir(self.screendir)
            for remove in g.glob("*"):
                os.remove(remove)

        self.stop_check()

** * Über den folgenden Teil von port_check (entweder ist OK) ** p3 = prc.Popen(["grep","-E","TCP..:"], stdin=p2.stdout, stdout=prc.PIPE) Ursprünglich p3 = prc.Popen ([" grep "," TCP \ *: "], stdin = p2.stdout, stdout = prc.PIPE) Als ich es veröffentlichte, war die Textfarbe von Python jedoch fehlerhaft, sodass ich es ändern muss.

Erstellen von sdtd_start.sh

$ cd $HOME/python/discord
$ vim sdtd_start.sh

Inhalt von sdtd_start.sh

Schreiben Sie als Nächstes ein Shell-Skript für den Start.

sdtd_start.sh


#!/bin/sh
DIR=$(cd $(dirname $0); pwd)
PID=$(ps x |grep sdtd_run.py |grep -v grep |awk '{print $1}')

case "$1" in
  "start" )
        if [[ $PID == "" ]]; then
            env python $DIR/sdtd_run.py > /dev/null &
            sleep 3
            PID=$(ps x |grep sdtd_run.py |grep -v grep |awk '{print $1}')
            date +"%Y-%m-%d %H:%M:%S --- [$PID] start"
        else
            echo "pid already exists.[$PID]"
        fi
        ;;

  "restart" )
        if [[ $PID != "" ]]; then
                kill -9 $PID
                sleep 2
                date +"%Y-%m-%d %H:%M:%S --- [$PID] kill ok"
        fi
        env python $DIR/sdtd_run.py > /dev/null &
        sleep 3
        PID=$(ps x |grep sdtd_run.py |grep -v grep |awk '{print $1}')
        date +"%Y-%m-%d %H:%M:%S ---[$PID] start"
        ;;

  "stop" )
        if [[ $PID != "" ]]; then
                kill -9 $PID
                sleep 2
                date +"%Y-%m-%d %H:%M:%S --- [$PID] kill ok"
        else
                echo "pid does not exist."
        fi
        ;;

  "status" )
        if [[ $PID != "" ]]; then
                echo "running PID:"$PID
        else
                echo "not running."
        fi
        ;;

  * )
        if [[ $PID != "" ]]; then
            kill -9 $PID
            sleep 2
            date +"%Y-%m-%d %H:%M:%S --- [$PID] kill ok"
        fi
        env python $DIR/sdtd_run.py > /dev/null &
        sleep 3
        PID=$(ps x |grep sdtd_run.py |grep -v grep |awk '{print $1}')
        date +"%Y-%m-%d %H:%M:%S --- [$PID] start"
esac

Berechtigungsänderung von sdtd_start.sh

$ chmod +x sdtd_start.sh

Danke für deine harte Arbeit. Lassen Sie es uns überprüfen, indem Sie es unter Last ausführen.

Recommended Posts

[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
Ich möchte ein Glas aus Python verwenden
Ich möchte mit Python eine E-Mail von Google Mail senden.
Ich möchte C ++ - Code aus Python-Code erstellen!
Ich möchte mit Python debuggen
Ich möchte viele Prozesse von Python aus starten
Ich möchte eine Nachricht von Python an LINE Bot senden
Ich möchte eine Python-Umgebung erstellen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
Ich möchte aus verschiedenen Sprachen eine Verbindung zu PostgreSQL herstellen
Ich möchte Dunnetts Test in Python machen
Ich möchte MATLAB feval mit Python verwenden
Änderungen von Python 3.0 zu Python 3.5
Änderungen von Python 2 zu Python 3.0
Ich möchte mit Python ein Fenster erstellen
Ich möchte ein Spiel mit Python machen
[Python-Memo] Ich möchte eine zweistellige Hexadezimalzahl aus einer Dezimalzahl erhalten
Ich möchte verschachtelte Dicts in Python zusammenführen
Ich möchte Passungen aus meinem Kopf machen
Ich möchte systemd nach Zeitzone verwalten! !!
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
#Unresolved Ich möchte Gobject-Introspection mit Python3 kompilieren
Ich möchte APG4b mit Python lösen (Kapitel 2)
Ich möchte die Produkte verkaufen, die ich durch Python Scraping Mercari aufgelistet habe
Ich möchte mit Python in eine Datei schreiben
Ich möchte den Fortschritt in Python anzeigen!
Ich möchte Variablen / Funktionen / Klassen externer Dateien von Python abrufen / ausführen
Ich möchte in Python schreiben! (1) Überprüfung des Codeformats
Ich möchte den Dateinamen von DataLoader sehen
Selbst Anfänger möchten sagen "Ich verstehe Python voll und ganz"
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte Timeout einfach in Python implementieren
Ich möchte Bilder von Katzen von Instagram erkennen
Ich möchte einen Python-Generator viele Male iterieren
Ich möchte schnell UUID generieren (Gedenknotiz) ~ Python Edition ~
Ich möchte die Optimierung mit Python und CPlex behandeln
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Auch mit JavaScript möchte ich Python `range ()` sehen!
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich möchte Lambda mit Python auf Mac AWS!
Ich möchte R-Datensatz mit Python verwenden
Ich möchte einen Quantencomputer mit Python betreiben
Ich möchte am Ende etwas mit Python machen
Ich möchte Strings in Kotlin wie Python manipulieren!
Post von Python nach Slack
Flirte von PHP nach Python
Ich möchte SUDOKU lösen
Wechseln Sie von Python2.7 zu Python3.6 (centos7)
Stellen Sie von Python aus eine Verbindung zu SQLite her
[Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!
Ich möchte Leuten sagen, die mit Python direnv aus einem höheren Verzeichnis importieren möchten
Ich möchte Daten mit Python analysieren können (Teil 3)