[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)
Nach Letztes Mal erstellen wir dieses Mal ein Programm, das über den Haupt-Discord verwaltet werden kann.
$ 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.
$ cd $HOME/python/discord
$ vim 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