1
0
Fork 0
mirror of synced 2024-06-26 18:20:50 +12:00
Rare/rare/utils/game_process_helper.py

106 lines
3.1 KiB
Python
Raw Normal View History

import datetime
import json
import os
import sys
import time
from logging import getLogger
from typing import List, Union
from PyQt5.QtCore import QObject, QCoreApplication, QProcess, pyqtSignal
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
from rare.legendary.legendary.core import LegendaryCore
class GameProcessHelper(QObject):
game_process: QProcess
server: QLocalServer
socket: QLocalSocket = None
exit_app = pyqtSignal()
success: bool = True
def __init__(self, app_name: str):
super(GameProcessHelper, self).__init__()
self.game_process = QProcess()
self.app_name = app_name
self.logger = getLogger(self.app_name)
self.core = LegendaryCore()
self.server = QLocalServer()
ret = self.server.listen(f"rare_{self.app_name}")
if not ret:
self.logger.info(self.server.errorString())
print("Error")
self.server.close()
self.success = False
return
self.server.newConnection.connect(self.new_server_connection)
self.game_process.readyReadStandardOutput.connect(
lambda: print(
str(self.game_process.readAllStandardOutput().data(), "utf-8", "ignore")
)
)
self.game_process.readyReadStandardError.connect(
lambda: print(
str(self.game_process.readAllStandardError().data(), "utf-8", "ignore")
)
)
self.game_process.finished.connect(self.game_finished)
self.start_time = time.time()
def get_args(self) -> List[str]:
# self.core.whatever
return [
"python", os.path.expanduser("~/testx.py")
]
def new_server_connection(self):
if self.socket is not None:
self.socket.disconnectFromServer()
self.logger.info("New connection")
self.socket = self.server.nextPendingConnection()
self.socket.disconnected.connect(self.socket.deleteLater)
self.socket.write(b'Test')
self.socket.flush()
def send_message(self, message: Union[bytes, str]):
if isinstance(message, str):
message = message.encode("utf-8")
if self.socket:
self.socket.write(message)
self.socket.flush()
else:
print("error: ", self.socket.errorString())
def game_finished(self, exit_code):
print("game finished")
self.send_message(
json.dumps({
"action": "finished",
"exit_code": exit_code,
"playtime": int(time.time() - self.start_time)
})
)
self.exit_app.emit()
def start(self):
args = self.get_args()
self.game_process.start(args[0], args[1:])
self.start_time = time.time()
def run_game(app_name: str):
app = QCoreApplication(sys.argv)
helper = GameProcessHelper(app_name)
if not helper.success:
return
helper.start()
helper.exit_app.connect(lambda: app.exit(0))
app.exec_()
helper.server.close()
if __name__ == '__main__':
run_game("CrabEA")