hyper-bot 0.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- Hyper/Adapters/OneBot.py +278 -0
- Hyper/Adapters/OneBotLib/Manager.py +93 -0
- Hyper/Configurator.py +83 -0
- Hyper/DataBase.py +81 -0
- Hyper/Errors.py +18 -0
- Hyper/Events.py +268 -0
- Hyper/Listener.py +7 -0
- Hyper/Logger.py +156 -0
- Hyper/Logic.py +167 -0
- Hyper/Manager.py +6 -0
- Hyper/ModuleClass.py +67 -0
- Hyper/Network.py +70 -0
- Hyper/Segments.py +289 -0
- Hyper/WordSafety.py +68 -0
- hyper_bot-0.7.dist-info/LICENSE +547 -0
- hyper_bot-0.7.dist-info/METADATA +9 -0
- hyper_bot-0.7.dist-info/RECORD +19 -0
- hyper_bot-0.7.dist-info/WHEEL +5 -0
- hyper_bot-0.7.dist-info/top_level.txt +1 -0
Hyper/Events.py
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
from Hyper import Configurator, Logger, Manager
|
|
2
|
+
from Hyper.Segments import message_types
|
|
3
|
+
from Hyper.Logger import levels
|
|
4
|
+
|
|
5
|
+
config = Configurator.cm.get_cfg()
|
|
6
|
+
logger = Logger.Logger()
|
|
7
|
+
logger.set_level(config.log_level)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class EventManager:
|
|
11
|
+
def __init__(self):
|
|
12
|
+
self.event_lis = {
|
|
13
|
+
"message": {},
|
|
14
|
+
"notice": {},
|
|
15
|
+
"request": {}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
def reg(self, type_of: str, str_eql: str) -> callable:
|
|
19
|
+
def wrapper(cls):
|
|
20
|
+
self.event_lis[type_of][str_eql] = cls
|
|
21
|
+
return cls
|
|
22
|
+
|
|
23
|
+
return wrapper
|
|
24
|
+
|
|
25
|
+
def new(self, data: dict) -> "Event":
|
|
26
|
+
try:
|
|
27
|
+
return self.event_lis[data["post_type"]][data[f"{data['post_type']}_type"]](data)
|
|
28
|
+
except KeyError:
|
|
29
|
+
typ = data[f"{data['post_type']}_type"]
|
|
30
|
+
logger.log(f"不存在的事件类型:{data['post_type']}.{typ}", levels.WARNING)
|
|
31
|
+
return Event(data)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
em = EventManager()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class GroupSender:
|
|
38
|
+
def __init__(self, json_data: dict):
|
|
39
|
+
self.user_id = json_data.get("user_id")
|
|
40
|
+
self.nickname = json_data.get("nickname")
|
|
41
|
+
self.sex = json_data.get("sex")
|
|
42
|
+
self.age = json_data.get("age")
|
|
43
|
+
self.card = json_data.get("card")
|
|
44
|
+
self.area = json_data.get("area")
|
|
45
|
+
self.level = json_data.get("level")
|
|
46
|
+
self.role = json_data.get("role")
|
|
47
|
+
self.title = json_data.get("title")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class PrivateSender:
|
|
51
|
+
def __init__(self, json_data: dict):
|
|
52
|
+
self.user_id = json_data.get("user_id")
|
|
53
|
+
self.nickname = json_data.get("nickname")
|
|
54
|
+
self.sex = json_data.get("sex")
|
|
55
|
+
self.age = json_data.get("age")
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class GroupAnonymous:
|
|
59
|
+
def __init__(self, json_data: dict):
|
|
60
|
+
if json_data is None:
|
|
61
|
+
pass
|
|
62
|
+
else:
|
|
63
|
+
self.id = json_data.get("id")
|
|
64
|
+
self.name = json_data.get("name")
|
|
65
|
+
self.flag = json_data.get("flag")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def gen_message(data: dict) -> Manager.Message:
|
|
69
|
+
message = Manager.Message()
|
|
70
|
+
for i in data["message"]:
|
|
71
|
+
if i["type"] in message_types:
|
|
72
|
+
args = []
|
|
73
|
+
for j in message_types[i["type"]]["args"]:
|
|
74
|
+
args.append(i["data"].get(j))
|
|
75
|
+
message.add(message_types[i["type"]]["type"](*args))
|
|
76
|
+
else:
|
|
77
|
+
logger.log(f"无法序列化的消息段 {i['type']}", levels.WARNING)
|
|
78
|
+
|
|
79
|
+
return message
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class Event:
|
|
83
|
+
def __init__(self, data: dict):
|
|
84
|
+
self.data = data
|
|
85
|
+
self.time = data.get("time")
|
|
86
|
+
self.self_id = data.get("self_id")
|
|
87
|
+
self.post_type = data.get("post_type")
|
|
88
|
+
self.user_id = data.get("user_id")
|
|
89
|
+
self.group_id = data.get("group_id")
|
|
90
|
+
|
|
91
|
+
self.is_owner = int(self.user_id) in config.owner
|
|
92
|
+
self.servicing = False
|
|
93
|
+
self.blocked = True if self.user_id in config.black_list or self.group_id in config.black_list else False
|
|
94
|
+
self.is_silent = self.user_id in config.silents or self.group_id in config.silents or 0 in config.silents
|
|
95
|
+
|
|
96
|
+
def print_log(self, **kwargs) -> None:
|
|
97
|
+
...
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class MessageEvent(Event):
|
|
101
|
+
def __init__(self, data: dict):
|
|
102
|
+
super().__init__(data)
|
|
103
|
+
self.sub_type = data.get("sub_type")
|
|
104
|
+
self.message_id = str(data.get("message_id"))
|
|
105
|
+
self.message = gen_message(data=data)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
@em.reg("message", "private")
|
|
109
|
+
class PrivateMessageEvent(MessageEvent):
|
|
110
|
+
def __init__(self, data: dict):
|
|
111
|
+
super().__init__(data)
|
|
112
|
+
self.sender = PrivateSender(data.get("sender"))
|
|
113
|
+
|
|
114
|
+
self.print_log()
|
|
115
|
+
|
|
116
|
+
def print_log(self) -> None:
|
|
117
|
+
logger.log(f"收到 {self.user_id} 的消息:{self.message}")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@em.reg("message", "group")
|
|
121
|
+
class GroupMessageEvent(MessageEvent):
|
|
122
|
+
def __init__(self, data: dict):
|
|
123
|
+
super().__init__(data)
|
|
124
|
+
self.sender = GroupSender(data.get("sender"))
|
|
125
|
+
self.anonymous = GroupAnonymous(data.get("anonymous"))
|
|
126
|
+
|
|
127
|
+
self.print_log()
|
|
128
|
+
|
|
129
|
+
def print_log(self) -> None:
|
|
130
|
+
logger.log(f"收到来自群 {self.group_id} 中 {self.user_id} 的消息: {self.message}")
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class NoticeEvent(Event):
|
|
134
|
+
def __init__(self, data: dict):
|
|
135
|
+
super().__init__(data)
|
|
136
|
+
self.notice_type = data.get("notice_type")
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
@em.reg("notice", "group_upload")
|
|
140
|
+
class GroupFileUploadEvent(NoticeEvent):
|
|
141
|
+
def __init__(self, data: dict):
|
|
142
|
+
super().__init__(data)
|
|
143
|
+
self.file = data.get("file")
|
|
144
|
+
|
|
145
|
+
self.print_log()
|
|
146
|
+
|
|
147
|
+
def print_log(self) -> None:
|
|
148
|
+
logger.log(f"{self.user_id} 在 {self.group_id} 上传了文件 {self.file}")
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
@em.reg("notice", "group_admin")
|
|
152
|
+
class GroupAdminEvent(NoticeEvent):
|
|
153
|
+
def __init__(self, data: dict):
|
|
154
|
+
super().__init__(data)
|
|
155
|
+
self.sub_type = data.get("sub_type")
|
|
156
|
+
|
|
157
|
+
self.print_log()
|
|
158
|
+
|
|
159
|
+
def print_log(self) -> None:
|
|
160
|
+
logger.log(f"用户 {self.user_id} 在群 {self.group_id} 被{'设置' if self.sub_type == 'set' else '取消'}管理员身份")
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@em.reg("notice", "group_decrease")
|
|
164
|
+
class GroupMemberDecreaseEvent(NoticeEvent):
|
|
165
|
+
def __init__(self, data: dict):
|
|
166
|
+
super().__init__(data)
|
|
167
|
+
self.sub_type = data.get("sub_type")
|
|
168
|
+
self.operator_id = data.get("operator_id")
|
|
169
|
+
|
|
170
|
+
self.print_log()
|
|
171
|
+
|
|
172
|
+
def print_log(self) -> None:
|
|
173
|
+
logger.log(f"{self.user_id} 离开群 {self.group_id}, [{self.sub_type}, {self.operator_id}]")
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
@em.reg("notice", "group_increase")
|
|
177
|
+
class GroupMemberIncreaseEvent(NoticeEvent):
|
|
178
|
+
def __init__(self, data: dict):
|
|
179
|
+
super().__init__(data)
|
|
180
|
+
self.sub_type = data.get("sub_type")
|
|
181
|
+
self.operator_id = data.get("operator_id")
|
|
182
|
+
|
|
183
|
+
self.print_log()
|
|
184
|
+
|
|
185
|
+
def print_log(self) -> None:
|
|
186
|
+
logger.log(f"{self.user_id} 加入群 {self.group_id}, [{self.sub_type}, {self.operator_id}]")
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
@em.reg("notice", "group_ban")
|
|
190
|
+
class GroupMuteEvent(NoticeEvent):
|
|
191
|
+
def __init__(self, data: dict):
|
|
192
|
+
super().__init__(data)
|
|
193
|
+
self.sub_type = data.get("sub_type")
|
|
194
|
+
self.operator_id = data.get("operator_id")
|
|
195
|
+
self.duration = data.get("duration")
|
|
196
|
+
|
|
197
|
+
self.print_log()
|
|
198
|
+
|
|
199
|
+
def print_log(self) -> None:
|
|
200
|
+
logger.log(f"{self.user_id} 在群 {self.group_id} 被{'' if self.sub_type == 'ban' else '解除'}禁言, 时长为{self.duration}")
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
@em.reg("notice", "friend_add")
|
|
204
|
+
class FriendAddEvent(NoticeEvent):
|
|
205
|
+
def __init__(self, data: dict):
|
|
206
|
+
super().__init__(data)
|
|
207
|
+
|
|
208
|
+
self.print_log()
|
|
209
|
+
|
|
210
|
+
def print_log(self) -> None:
|
|
211
|
+
logger.log(f"收到 {self.user_id} 的好友请求")
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
@em.reg("notice", "group_recall")
|
|
215
|
+
class GroupRecallEvent(NoticeEvent):
|
|
216
|
+
def __init__(self, data: dict):
|
|
217
|
+
super().__init__(data)
|
|
218
|
+
self.operator_id = data.get("operator_id")
|
|
219
|
+
self.message_id = data.get("message_id")
|
|
220
|
+
|
|
221
|
+
self.print_log()
|
|
222
|
+
|
|
223
|
+
def print_log(self) -> None:
|
|
224
|
+
logger.log(f"{self.operator_id} 在群 {self.group_id} 中撤回了 {self.user_id} 的消息 {self.message_id}")
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
@em.reg("notice", "friend_recall")
|
|
228
|
+
class FriendRecallEvent(NoticeEvent):
|
|
229
|
+
def __init__(self, data: dict):
|
|
230
|
+
super().__init__(data)
|
|
231
|
+
self.message_id = data.get("message_id")
|
|
232
|
+
|
|
233
|
+
self.print_log()
|
|
234
|
+
|
|
235
|
+
def print_log(self) -> None:
|
|
236
|
+
logger.log(f"{self.user_id} 撤回了一条消息")
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
@em.reg("notice", "notify")
|
|
240
|
+
class NotifyEvent(NoticeEvent):
|
|
241
|
+
def __init__(self, data: dict):
|
|
242
|
+
super().__init__(data)
|
|
243
|
+
self.sub_type = data.get("sub_type")
|
|
244
|
+
self.target_id = data.get("target_id")
|
|
245
|
+
self.honor_type = data.get("honor_type")
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
class RequestEvent(Event):
|
|
249
|
+
def __init__(self, data: dict):
|
|
250
|
+
super().__init__(data)
|
|
251
|
+
self.comment = data.get("comment")
|
|
252
|
+
self.flag = data.get("flag")
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
@em.reg("request", "friend")
|
|
256
|
+
class FriendAddEvent(RequestEvent):
|
|
257
|
+
def __init__(self, data: dict):
|
|
258
|
+
super().__init__(data)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
@em.reg("request", "group")
|
|
262
|
+
class GroupAddInviteEvent(RequestEvent):
|
|
263
|
+
def __init__(self, data: dict):
|
|
264
|
+
super().__init__(data)
|
|
265
|
+
self.sub_type = data.get("sub_type")
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
|
Hyper/Listener.py
ADDED
Hyper/Logger.py
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import textwrap
|
|
2
|
+
import datetime
|
|
3
|
+
import typing
|
|
4
|
+
import inspect
|
|
5
|
+
from functools import wraps
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Levels:
|
|
9
|
+
def __init__(self):
|
|
10
|
+
self.TRACE = f"✔️ \033[{47}m\033[{30}mTRACE \033[0m\033[0m "
|
|
11
|
+
self.INFO = f"ℹ️ \033[{47}m\033[{30}mINFO \033[0m\033[0m "
|
|
12
|
+
self.WARNING = f"⚠️ \033[{43}mWARN \033[0m "
|
|
13
|
+
self.ERROR = f"❌ \033[{41}mERROR\033[0m "
|
|
14
|
+
self.CRITICAL = f"🔴 \033[{41};{1}m*CRIT\033[0m "
|
|
15
|
+
self.DEBUG = f"🛠️ \033[{43}mDEBUG\033[0m "
|
|
16
|
+
|
|
17
|
+
self.level_nums = {
|
|
18
|
+
self.TRACE: -1,
|
|
19
|
+
self.INFO: 0,
|
|
20
|
+
self.WARNING: 1,
|
|
21
|
+
self.ERROR: 2,
|
|
22
|
+
self.CRITICAL: 3,
|
|
23
|
+
self.DEBUG: 10,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
self.level_names = {
|
|
27
|
+
"TRACE": self.TRACE,
|
|
28
|
+
"INFO": self.INFO,
|
|
29
|
+
"WARNING": self.WARNING,
|
|
30
|
+
"ERROR": self.ERROR,
|
|
31
|
+
"CRITICAL": self.CRITICAL,
|
|
32
|
+
"DEBUG": self.DEBUG,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
levels = Levels()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class Logger:
|
|
40
|
+
def __init__(self):
|
|
41
|
+
self.log_level = levels.INFO
|
|
42
|
+
|
|
43
|
+
def set_level(self, level: str):
|
|
44
|
+
if level in levels.level_names:
|
|
45
|
+
self.log_level = levels.level_names[level]
|
|
46
|
+
else:
|
|
47
|
+
self.log("未知的日志等级", levels.ERROR)
|
|
48
|
+
|
|
49
|
+
def log(self, message: str, level: str = levels.INFO):
|
|
50
|
+
if levels.level_nums[level] < levels.level_nums[self.log_level]:
|
|
51
|
+
return None
|
|
52
|
+
time = datetime.datetime.now()
|
|
53
|
+
if "\n" in message:
|
|
54
|
+
listed = message.split("\n")
|
|
55
|
+
for i in listed:
|
|
56
|
+
content = f" \033[38;5;244m[{str(time)[:-4]}]\033[0m {level} {i}"
|
|
57
|
+
print(content)
|
|
58
|
+
else:
|
|
59
|
+
content = f" \033[38;5;244m[{str(time)[:-4]}]\033[0m {level} {message}"
|
|
60
|
+
print(content)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class AutoLog:
|
|
64
|
+
def __init__(self, func: callable, template: str, logger: Logger, level: str = levels.INFO):
|
|
65
|
+
self.func = func
|
|
66
|
+
self.template = template
|
|
67
|
+
self.logger = logger
|
|
68
|
+
self.level = level
|
|
69
|
+
|
|
70
|
+
@staticmethod
|
|
71
|
+
def templates(lang: str = "zh_CN"):
|
|
72
|
+
class Base:
|
|
73
|
+
on_message: str
|
|
74
|
+
on_notice: str
|
|
75
|
+
on_request: str
|
|
76
|
+
send: str
|
|
77
|
+
recall: str
|
|
78
|
+
kick: str
|
|
79
|
+
mute: str
|
|
80
|
+
unmute: str
|
|
81
|
+
set_req: str
|
|
82
|
+
set_ess: str
|
|
83
|
+
|
|
84
|
+
if lang == "zh_CN":
|
|
85
|
+
class Templates(Base):
|
|
86
|
+
on_message = "收到群 <group_id> 中 <user_id> 的消息:<message>"
|
|
87
|
+
on_notice = "在 <group_id> 中 <operator_id> 对 <user_id> 进行了 <notice_type>/<sub_type> 操作"
|
|
88
|
+
on_request = "在群 <group_id> 收到来自 <user_id> 的 <request_type>/<sub_type> 请求"
|
|
89
|
+
send = "向群 <group_id> 用户 <user_id> 发送消息:<message>"
|
|
90
|
+
recall = "撤回消息 <message_id>"
|
|
91
|
+
kick = "将 <user_id> 踢出 <group_id>"
|
|
92
|
+
mute = "将 <user_id> 在 <group_id> 禁言 <duration> 秒"
|
|
93
|
+
unmute = "将 <user_id> 在 <group_id> 解除禁言"
|
|
94
|
+
set_req = "处理 <sub_type> 请求 <flag> 的结果为 <approve>"
|
|
95
|
+
set_ess = "将 <message_id> 设为精华"
|
|
96
|
+
else:
|
|
97
|
+
class Templates(Base):
|
|
98
|
+
on_message = "Msg received in grp <group_id> from <user_id> : <message>"
|
|
99
|
+
on_notice = "<operator_id> acted '<notice_type>/<sub_type>' to <user_id> in <group_id>"
|
|
100
|
+
on_request = "Received '<request_type>/<sub_type>' request from <user_id> in <group_id>"
|
|
101
|
+
send = "Sent a msg in grp <group_id> to <user_id> : <message>"
|
|
102
|
+
recall = "Deleted <message_id>"
|
|
103
|
+
kick = "kicked <user_id> out of <group_id>"
|
|
104
|
+
mute = "Muted <user_id> in <group_id> for <duration>s"
|
|
105
|
+
unmute = "Unmuted <user_id> in <group_id>"
|
|
106
|
+
set_req = "Resulted <sub_type>/<flag> as <approve>"
|
|
107
|
+
set_ess = "Pinned msg <message_id>"
|
|
108
|
+
|
|
109
|
+
return Templates
|
|
110
|
+
|
|
111
|
+
def __rel_tpl(self, args: dict) -> str:
|
|
112
|
+
log = self.template
|
|
113
|
+
for i in args:
|
|
114
|
+
if f"<{i}>" in log:
|
|
115
|
+
log = log.replace(f"<{i}>", str(args[i]))
|
|
116
|
+
return log
|
|
117
|
+
|
|
118
|
+
@classmethod
|
|
119
|
+
def register(cls, *args, **kwargs) -> callable:
|
|
120
|
+
def create(func):
|
|
121
|
+
@wraps(func)
|
|
122
|
+
def wrapper(*args_, **kwargs_):
|
|
123
|
+
return cls(func, *args, **kwargs)(*args_, **kwargs_)
|
|
124
|
+
|
|
125
|
+
return wrapper
|
|
126
|
+
|
|
127
|
+
return create
|
|
128
|
+
|
|
129
|
+
def handler(self, res, *args, **kwargs) -> typing.Any:
|
|
130
|
+
sig = inspect.signature(self.func)
|
|
131
|
+
argv = {}
|
|
132
|
+
|
|
133
|
+
if len(list(args)) > 0:
|
|
134
|
+
sigs = list(sig.parameters.items())
|
|
135
|
+
for i in list(args):
|
|
136
|
+
index = list(args).index(i)
|
|
137
|
+
argv[sigs[index][0]] = i
|
|
138
|
+
|
|
139
|
+
if len(kwargs) > 0:
|
|
140
|
+
for i in kwargs:
|
|
141
|
+
argv[i] = kwargs[i]
|
|
142
|
+
|
|
143
|
+
log = self.__rel_tpl(argv)
|
|
144
|
+
self.logger.log(log, level=self.level)
|
|
145
|
+
|
|
146
|
+
return res
|
|
147
|
+
|
|
148
|
+
def __call__(self, *args, **kwargs) -> typing.Any:
|
|
149
|
+
res = self.func(*args, **kwargs)
|
|
150
|
+
return self.handler(res, *args, **kwargs)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class AutoLogAsync(AutoLog):
|
|
154
|
+
async def __call__(self, *args, **kwargs) -> typing.Any:
|
|
155
|
+
res = await self.func(*args, **kwargs)
|
|
156
|
+
return self.handler(res, *args, **kwargs)
|
Hyper/Logic.py
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
import shutil
|
|
4
|
+
import traceback
|
|
5
|
+
|
|
6
|
+
from Hyper import Logger
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Cacher:
|
|
10
|
+
def __init__(self, cache_time: int = 5):
|
|
11
|
+
self.cache_time: int = cache_time
|
|
12
|
+
self.cached: dict = {}
|
|
13
|
+
|
|
14
|
+
def cache(self, func):
|
|
15
|
+
def wrapper(*args, **kwargs):
|
|
16
|
+
if kwargs.get("no_cache", False):
|
|
17
|
+
kwargs.pop("no_cache")
|
|
18
|
+
return func(*args, **kwargs)
|
|
19
|
+
if str(kwargs) not in self.cached:
|
|
20
|
+
ret = func(*args, **kwargs)
|
|
21
|
+
self.cached[str(kwargs)] = ret
|
|
22
|
+
if len(self.cached) >= self.cache_time:
|
|
23
|
+
for i in self.cached:
|
|
24
|
+
del self.cached[i]
|
|
25
|
+
break
|
|
26
|
+
return ret
|
|
27
|
+
else:
|
|
28
|
+
return self.cached[str(kwargs)]
|
|
29
|
+
|
|
30
|
+
return wrapper
|
|
31
|
+
|
|
32
|
+
def cache_async(self, func):
|
|
33
|
+
async def wrapper(*args, **kwargs):
|
|
34
|
+
if kwargs.get("no_cache", False):
|
|
35
|
+
kwargs.pop("no_cache")
|
|
36
|
+
return await func(*args, **kwargs)
|
|
37
|
+
if str(kwargs) not in self.cached:
|
|
38
|
+
ret = await func(*args, **kwargs)
|
|
39
|
+
self.cached[str(kwargs)] = ret
|
|
40
|
+
if len(self.cached) >= self.cache_time:
|
|
41
|
+
for i in self.cached:
|
|
42
|
+
del self.cached[i]
|
|
43
|
+
break
|
|
44
|
+
return ret
|
|
45
|
+
else:
|
|
46
|
+
return self.cached[str(kwargs)]
|
|
47
|
+
|
|
48
|
+
return wrapper
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class ErrorHandler:
|
|
52
|
+
def __init__(self, level=Logger.levels.ERROR, retries: int = 0):
|
|
53
|
+
self.level = level
|
|
54
|
+
self.logger = Logger.Logger()
|
|
55
|
+
self.retries = retries
|
|
56
|
+
|
|
57
|
+
def handle(self, func):
|
|
58
|
+
def wrapper(*args, **kwargs):
|
|
59
|
+
try:
|
|
60
|
+
return func(*args, **kwargs)
|
|
61
|
+
except:
|
|
62
|
+
self.logger.log(f"出现错误:\n{str(traceback.format_exc())}", level=self.level)
|
|
63
|
+
|
|
64
|
+
return wrapper
|
|
65
|
+
|
|
66
|
+
def handle_async(self, func):
|
|
67
|
+
async def wrapper(*args, **kwargs):
|
|
68
|
+
try:
|
|
69
|
+
return await func(*args, **kwargs)
|
|
70
|
+
except:
|
|
71
|
+
self.logger.log(f"出现错误:\n{str(traceback.format_exc())}", level=self.level)
|
|
72
|
+
|
|
73
|
+
return wrapper
|
|
74
|
+
|
|
75
|
+
def auto_retry(self, func):
|
|
76
|
+
def wrapper(*args, **kwargs):
|
|
77
|
+
retried = 0
|
|
78
|
+
while retried < self.retries:
|
|
79
|
+
retried += 1
|
|
80
|
+
try:
|
|
81
|
+
return func(*args, **kwargs)
|
|
82
|
+
except Exception as e:
|
|
83
|
+
self.logger.log(f"出现错误:\n{str(e)}, 正在重试...", level=self.level)
|
|
84
|
+
self.logger.log(f"错误在{retried}次重试后失败", level=self.level)
|
|
85
|
+
|
|
86
|
+
return wrapper
|
|
87
|
+
|
|
88
|
+
def auto_retry_async(self, func):
|
|
89
|
+
async def wrapper(*args, **kwargs):
|
|
90
|
+
retried = 0
|
|
91
|
+
while retried < self.retries:
|
|
92
|
+
retried += 1
|
|
93
|
+
try:
|
|
94
|
+
return await func(*args, **kwargs)
|
|
95
|
+
except Exception as e:
|
|
96
|
+
self.logger.log(f"出现错误:\n{str(e)}, 正在重试...", level=self.level)
|
|
97
|
+
self.logger.log(f"错误在{retried}次重试后失败", level=self.level)
|
|
98
|
+
|
|
99
|
+
return wrapper
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class Random:
|
|
103
|
+
def __init__(self, seed: int = None):
|
|
104
|
+
self.seed = seed
|
|
105
|
+
|
|
106
|
+
def random(self) -> int:
|
|
107
|
+
self.seed = self.seed ** 2
|
|
108
|
+
self.seed = int(str(self.seed)[:7])
|
|
109
|
+
return int(str(self.seed)[1:5])
|
|
110
|
+
|
|
111
|
+
def __call__(self) -> int:
|
|
112
|
+
return self.random()
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class FileManager:
|
|
116
|
+
@staticmethod
|
|
117
|
+
def create(path: str) -> bool:
|
|
118
|
+
try:
|
|
119
|
+
with open(path, "w") as f:
|
|
120
|
+
f.write("")
|
|
121
|
+
except (FileExistsError | OSError | IOError):
|
|
122
|
+
return False
|
|
123
|
+
|
|
124
|
+
return True
|
|
125
|
+
|
|
126
|
+
@staticmethod
|
|
127
|
+
def exists(path: str) -> bool:
|
|
128
|
+
try:
|
|
129
|
+
with open(path, "r") as f:
|
|
130
|
+
f.read()
|
|
131
|
+
return True
|
|
132
|
+
except FileNotFoundError:
|
|
133
|
+
return False
|
|
134
|
+
|
|
135
|
+
@staticmethod
|
|
136
|
+
@Cacher(7).cache
|
|
137
|
+
def read_as_text(path: str, encoding: str = "utf-8") -> str:
|
|
138
|
+
with open(path, "r", encoding=encoding) as f:
|
|
139
|
+
return f.read()
|
|
140
|
+
|
|
141
|
+
@staticmethod
|
|
142
|
+
@Cacher(7).cache
|
|
143
|
+
def read_as_json(path: str, encoding: str = "utf-8") -> dict | list:
|
|
144
|
+
with open(path, "r", encoding=encoding) as f:
|
|
145
|
+
return json.load(f)
|
|
146
|
+
|
|
147
|
+
@staticmethod
|
|
148
|
+
@Cacher(7).cache
|
|
149
|
+
def read_raw(path: str) -> bytes:
|
|
150
|
+
with open(path, "rb") as f:
|
|
151
|
+
return f.read()
|
|
152
|
+
|
|
153
|
+
@staticmethod
|
|
154
|
+
def delete(path: str) -> bool:
|
|
155
|
+
try:
|
|
156
|
+
os.remove(path)
|
|
157
|
+
return True
|
|
158
|
+
except (FileNotFoundError | OSError | IOError):
|
|
159
|
+
return False
|
|
160
|
+
|
|
161
|
+
@staticmethod
|
|
162
|
+
def copy(path1: str, path2: str) -> bool:
|
|
163
|
+
try:
|
|
164
|
+
shutil.copy(path1, path2)
|
|
165
|
+
return True
|
|
166
|
+
except (FileNotFoundError | OSError | IOError):
|
|
167
|
+
return False
|
Hyper/Manager.py
ADDED
Hyper/ModuleClass.py
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
from Hyper import Events, Listener, Logger, Configurator
|
|
2
|
+
|
|
3
|
+
import dataclasses
|
|
4
|
+
|
|
5
|
+
config = Configurator.cm.get_cfg()
|
|
6
|
+
logger = Logger.Logger()
|
|
7
|
+
logger.set_level(config.log_level)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclasses.dataclass
|
|
11
|
+
class ModuleInfo:
|
|
12
|
+
is_hidden: bool = True
|
|
13
|
+
module_name: str = "None"
|
|
14
|
+
author: str = "None"
|
|
15
|
+
version: str = "0.0"
|
|
16
|
+
desc: str = "None"
|
|
17
|
+
helps: str = "None"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Module:
|
|
21
|
+
def __init__(self, actions, event):
|
|
22
|
+
self.actions = actions
|
|
23
|
+
self.event = event
|
|
24
|
+
|
|
25
|
+
async def handle(self):
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
@staticmethod
|
|
29
|
+
def info() -> ModuleInfo:
|
|
30
|
+
return ModuleInfo()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class InnerHandler:
|
|
34
|
+
def __init__(self, module: Module, allowed: list):
|
|
35
|
+
self.module = module
|
|
36
|
+
self.allowed = allowed
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
register_modules: list[InnerHandler] = []
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class ModuleRegister:
|
|
43
|
+
@staticmethod
|
|
44
|
+
def register(*args):
|
|
45
|
+
def decorator(cls):
|
|
46
|
+
if len(args) < 1:
|
|
47
|
+
allowed = [Events.Event]
|
|
48
|
+
else:
|
|
49
|
+
allowed = list(args)
|
|
50
|
+
|
|
51
|
+
from typing import Union
|
|
52
|
+
|
|
53
|
+
def init(self, actions: Listener.Actions, event: Union[*allowed]):
|
|
54
|
+
self.actions = actions
|
|
55
|
+
self.event = event
|
|
56
|
+
|
|
57
|
+
cls.__init__ = init
|
|
58
|
+
|
|
59
|
+
register_modules.append(InnerHandler(cls, allowed))
|
|
60
|
+
|
|
61
|
+
return cls
|
|
62
|
+
|
|
63
|
+
return decorator
|
|
64
|
+
|
|
65
|
+
@staticmethod
|
|
66
|
+
def get_registered() -> list:
|
|
67
|
+
return register_modules
|