-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
147 lines (124 loc) · 4.04 KB
/
main.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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import os
import sys
import core
from asyncio import new_event_loop, set_event_loop
from platform import system
from os.path import basename, isfile
from glob import glob
import logging
from os.path import expanduser
from loguru import logger
import subprocess
from pprint import pformat
from loguru._defaults import LOGURU_FORMAT
def get_git_revision_short_hash() -> str:
return (
subprocess.check_output(["git", "rev-parse", "--short", "HEAD"])
.decode("ascii")
.strip()
)
class TPC:
class PCHandlers:
pass
try:
version = get_git_revision_short_hash()
except Exception:
version = "unknown"
tasks = {}
name = "tpc"
resource_path = core.resource_path
icon_path = resource_path("assets/ico.gif")
icon = None
static_icon = None
system = system().lower()
pc_handlers = PCHandlers()
setup_hook = None
tray = None
loop = None
bot = None
bot_loop = None
bot_thread = None
logger = logger
def restart_bot(self):
self.logger.info("Restarting bot")
try:
if self.bot_loop:
# self.bot_loop.run_until_complete(self.dp.stop_polling())
if self.bot_task:
self.bot_task.cancel()
self.bot_loop.stop()
except Exception as exc:
self.logger.exception(f"Failed to stop old bot loop: {exc}")
self.bot_loop = new_event_loop()
try:
self.bot_task = self.bot_loop.create_task(core.create_dp(self))
self.bot_loop.run_until_complete(self.bot_task)
except Exception as exc:
self.logger.exception(exc)
def exit(self):
os._exit(-1)
def restart(self):
os.execl(sys.executable, sys.executable, *sys.argv)
os._exit(-1)
def format_record(record: dict) -> str:
format_string = LOGURU_FORMAT
if record["extra"].get("payload") is not None:
record["extra"]["payload"] = pformat(
record["extra"]["payload"], indent=4, compact=True, width=88
)
format_string += "\n<level>{extra[payload]}</level>"
format_string += "{exception}\n"
return format_string
if __name__ == "__main__":
tpc = TPC()
logger.info("Created TPC instance")
documents_folder = expanduser("~")
tpc_folder = os.path.join(documents_folder, ".config/tpc")
if not os.path.exists(tpc_folder):
os.mkdir(tpc_folder)
try:
tpc.logger.configure(
handlers=[
{"sink": sys.stdout, "level": logging.DEBUG, "format": format_record},
{
"sink": tpc_folder + "/logs/{time:YYYY}-{time:MM}-{time:DD}.log",
"level": logging.DEBUG,
"format": format_record,
},
]
)
except Exception as exc:
tpc.logger.exception(exc)
tpc.logger.configure(
handlers=[
{
"sink": tpc_folder + "/logs/{time:YYYY}-{time:MM}-{time:DD}.log",
"level": logging.DEBUG,
"format": format_record,
}
]
)
tpc.translator = core.Translator(tpc)
tpc.tl = tpc.translator.tl
tpc.translator.chache_translations()
tpc.tray = core.Tray(tpc)
module = glob(core.resource_path("core/pc/*.py"))
__all__ = [
basename(f)[:-3] for f in module if isfile(f) and not f.endswith("__init__.py")
]
for file in __all__:
if file != tpc.system and file != "crossplatform":
continue
handler = __import__(f"core.pc.{file}", globals(), locals(), ["PCHandlers"], 0)
for attr in dir(handler.PCHandlers):
if attr.startswith("__"):
continue
setattr(tpc.pc_handlers, attr, getattr(handler.PCHandlers(tpc), attr))
loop = new_event_loop()
set_event_loop(loop)
tpc.loop = loop
tpc.setup_hook = core.setup_hook
tpc.tray.run()
def on_close():
tpc.pc_handlers.on_shutdown()
tpc.tray._app.aboutToQuit.connect(on_close)