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/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
@@ -0,0 +1,7 @@
1
+ from Hyper import Configurator
2
+
3
+ config = Configurator.cm.get_cfg()
4
+
5
+ if config.protocol == "OneBot":
6
+ from Hyper.Adapters.OneBot import *
7
+ servicing = []
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
@@ -0,0 +1,6 @@
1
+ from Hyper.Configurator import *
2
+
3
+ config = cm.get_cfg()
4
+
5
+ if config.protocol == "OneBot":
6
+ from Hyper.Adapters.OneBotLib.Manager import *
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