/
manager.py
132 lines (113 loc) · 4.01 KB
/
manager.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import threading
from time import sleep
import pexpect
import os
import json
from mcstatus import MinecraftServer
class ServerEncoder(json.JSONEncoder):
def default(self, obj):
if not isinstance(obj, Server):
return super(ServerEncoder, self).default(obj)
return obj.__dict__
class Server(object):
def __run__(self):
while self.child.isalive():
try:
line = self.child.readline().decode("UTF-8").replace("\n","")
print(self.name,line)
if "Done" in line:
print("Server is UP!")
except Exception:
self.sendCommand("/n")
self.child.readline()
self.child.readline()
print(self.name, "has stopped!")
def __init__(self, folder, name, ram=512, args="", jar="minecraft.jar"):
self.name = name
self.ram = ram
self.args = args
self.folder = folder + name + "/"
self.jar = jar
if not os.path.exists(self.folder):
os.makedirs(self.folder)
def __init__(self, config):
self.name = config["name"]
self.ram = config["ram"]
self.args = config["args"]
self.folder = config["folder"]
self.jar = config["jar"]
def start(self):
print("server has started")
self.child = pexpect.spawn("java -jar " + "-Xms%sM" % self.ram + " " + self.jar + " " + self.args, cwd=self.folder)
self.reader = threading.Thread(target=self.__run__)
self.reader.daemon = True
self.reader.start()
def sendCommand(self, command):
self.child.sendline(command)
def isRunning(self):
return self.child.isalive()
def wait(self):
if self.child.isalive():
return self.child.wait()
def getProperties(self):
propfile = self.folder + "server.properties"
data = {}
if (os.path.isfile(propfile)):
with open(propfile, "r") as file:
lines = file.readlines()
for line in lines:
line = line.replace("\n","")
if not line.startswith('#') and "=" in line:
linedata = line.split("=")
data[linedata[0]]=linedata[1]
return data
def getStatus(self):
prop = self.getProperties()
port = prop["server-port"]
host = prop["server-ip"]
if not host:
host = "127.0.0.1"
print(port, host)
return MinecraftServer.lookup(host + ":" + port).status()
class serverPool(object):
servers = {}
def __init__(self, folder):
self.folder = folder
self.configfile = folder + "servers.json"
if os.path.isfile(self.configfile):
with open(self.configfile, "r") as file:
servers = json.load(file)
for server in servers:
self.addServerConfig(servers[server])
else:
self.__save__config__()
def __save__config__(self):
with open(self.configfile, "w", encoding="UTF-8") as file:
json.dump(self.servers,file, ensure_ascii=True, cls=ServerEncoder, indent=4)
def addServer(self, server):
self.servers[server.name]= server
print(self.servers, server)
self.__save__config__()
def addServerConfig(self, config):
self.addServer(Server(config))
def startall(self):
for server in self.servers.values():
server.start()
def waitall(self):
for server in self.servers.values():
server.wait()
def getServer(self, name):
return self.servers[name]
serverFolder = "./servers/"
if __name__ == "__main__":
pool = serverPool(serverFolder)
server = pool.getServer("server1")
server.start();
while (True):
try:
sleep(10)
print("Trying to get status!!")
status = server.getStatus()
print(status.players.online, server.players.max)
except Exception:
continue