Merge branch 'master' of cybre.tech:chr/matrix-appservice-minecraft
This commit is contained in:
commit
52ad431877
|
@ -72,14 +72,14 @@ class socket_util(object):
|
|||
string_message = json.dumps(message)
|
||||
select.select([], [self.soc], [])
|
||||
self.write_int(len(string_message))
|
||||
self.write(string_message)
|
||||
self.write(string_message.encode('utf-8'))
|
||||
return 0
|
||||
|
||||
def write_int(self, integer):
|
||||
integer_buf = struct.pack('>i', integer)
|
||||
self.write(integer_buf)
|
||||
|
||||
def write(self, data):
|
||||
def write(self, data: bytes):
|
||||
#socket.bind(address)
|
||||
data_len = len(data)
|
||||
offset = 0
|
||||
|
@ -122,8 +122,10 @@ class socket_util(object):
|
|||
class MinecraftWrapper(socket_util):
|
||||
def __init__(self, command, host, port):
|
||||
super().__init__(host, port)
|
||||
self.logger = LOG.getChild("MinecraftWrapper")
|
||||
self.logger.debug(command)
|
||||
self.command = command
|
||||
LOG.info("Starting Wrapper Polling Thread")
|
||||
self.logger.info("Starting Wrapper Polling Thread")
|
||||
poll_process = threading.Thread(target=self.cli_poll)
|
||||
poll_process.daemon = True
|
||||
poll_process.start()
|
||||
|
@ -131,16 +133,19 @@ class MinecraftWrapper(socket_util):
|
|||
|
||||
def socket_reset(self):
|
||||
super().socket_reset()
|
||||
self.logger.debug("Connecting to {}:{}".format(self.host, self.port))
|
||||
self.soc.connect((self.host, self.port))
|
||||
LOG.info("Socket Connected")
|
||||
self.logger.info("Socket Connected")
|
||||
|
||||
def exe_mc(self):
|
||||
self.proc = subprocess.Popen(self.command, shell=True, stdout=PIPE, stdin=PIPE, universal_newlines=True)
|
||||
self.proc = subprocess.Popen(
|
||||
" ".join(self.command), shell=True, stdout=PIPE, stdin=PIPE, universal_newlines=True
|
||||
)
|
||||
for stdout_line in iter(self.proc.stdout.readline, ""):
|
||||
yield stdout_line
|
||||
return_code = self.proc.wait()
|
||||
if return_code:
|
||||
raise subprocess.CalledProcessError(return_code, cmd)
|
||||
raise subprocess.CalledProcessError(return_code, self.command)
|
||||
|
||||
def msg_process(self):
|
||||
while(not self.exit):
|
||||
|
@ -154,7 +159,7 @@ class MinecraftWrapper(socket_util):
|
|||
self.msg_handle(rcv)
|
||||
if status == 0: self.msglist.pop()
|
||||
except Exception as e:
|
||||
LOG.info(e)
|
||||
self.logger.exception(e)
|
||||
self.socket_reset()
|
||||
|
||||
|
||||
|
@ -167,23 +172,22 @@ class MinecraftWrapper(socket_util):
|
|||
|
||||
def proc_monitor(self):
|
||||
try:
|
||||
if self.proc.poll() is not None:
|
||||
if self.proc is not None and self.proc.poll() is not None:
|
||||
self.exit = True
|
||||
self.close_socket()
|
||||
sys.exit(0)
|
||||
except:
|
||||
LOG.error("poll error")
|
||||
except Exception as e:
|
||||
self.logger.exception("poll error")
|
||||
pass
|
||||
|
||||
def cli_poll(self):
|
||||
prog = re.compile("^\[(.*)\] \[(.*)\]: <(.*)> (.*)")
|
||||
prog = re.compile("\[.*\] \[(.*)\] \[(.*)\]: <(.*)> (.*)")
|
||||
EXAMPLE = "[07:36:28] [Server thread/INFO] [minecraft/DedicatedServer]: <khr_> test"
|
||||
for line in self.exe_mc():
|
||||
LOG.info(line.rstrip('\n'))
|
||||
# regex to get user and text: ^<(.*)> (.*)\n
|
||||
self.logger.info(line.rstrip('\n'))
|
||||
result = prog.search(line)
|
||||
if result:
|
||||
#LOG.info("user: " + result.group(3) + " msg: " +result.group(4).rstrip('\n'))
|
||||
#msb.send({"user":result.group(3),"msg":result.group(4).rstrip('\n')})
|
||||
self.logger.info("user: " + result.group(3) + " msg: " +result.group(4).rstrip('\n'))
|
||||
self.msglist.insert(0, {"user":result.group(3),"msg":result.group(4).rstrip('\n')})
|
||||
|
||||
class MinecraftServerBridge(socket_util):
|
||||
|
@ -259,7 +263,7 @@ class MinecraftServerBridge(socket_util):
|
|||
user_id = new_user + ":" + global_config['server_name']
|
||||
self.api.register("m.login.application_service",username = "mc_" + msg['user'])
|
||||
except Exception as e:
|
||||
LOG.info(e)
|
||||
LOG.exception(e)
|
||||
#for each room we're aware of, post server chat inside. Eventually 1 room should equal 1 server
|
||||
for room in roomsync:
|
||||
#generate a unique transaction id based on the current time
|
||||
|
@ -410,13 +414,7 @@ def main():
|
|||
appservice_token=global_config["as_token"],
|
||||
)
|
||||
LOG.info("All Threads Running")
|
||||
cmd = ""
|
||||
# Allow stdin commands to the minecraft server
|
||||
while (not minecraft.exit):
|
||||
if minecraft.proc != None and 'stop' not in cmd:
|
||||
cmd = input()
|
||||
minecraft.proc.stdin.write(cmd + '\n')
|
||||
else:
|
||||
time.sleep(1)
|
||||
LOG.info("Calling exit() in main thread...")
|
||||
sys.exit()
|
||||
|
|
Loading…
Reference in New Issue