async def postprocess(event: Event): try: session_id = event.get_session_id() except Exception: return if session_id in _running_matcher: del _running_matcher[session_id]
async def command_env_settings(bot: Bot, event: Event, state: T_State, matcher: Matcher, regex: str): env_vars = os.environ.copy() old_python_env = env_vars.get("PYTHONPATH", "") if old_python_env.strip() == "": old_python_env = [] else: old_python_env = old_python_env.split(":") env_vars["PYTHONPATH"] = ":".join(old_python_env + [str(PROJECT_ROOT)]) if event is not None: env_vars["BOT_USER_ID"] = str(event.get_user_id()) env_vars["BOT_SESSION_ID"] = str(event.get_session_id()) if event.is_tome(): env_vars["TO_BOT"] = str(1) env_vars["BOT_EVENT_TYPE"] = str(event.get_type()) msg = str(event.get_plaintext()) env_vars["BOT_EVENT_MESSAGE"] = msg group_id = getattr(event, "group_id", None) if group_id is not None: env_vars["BOT_GROUP_ID"] = str(group_id) if regex is not None: match = re.match(regex, msg, flags=re.MULTILINE | re.DOTALL) if match: _, origin_command, command_text = match.groups() env_vars["BOT_EVENT_COMMAND"] = origin_command env_vars["BOT_EVENT_COMMAND_ARGS"] = command_text return env_vars
async def _(matcher: Matcher, exception: Optional[Exception], bot: Bot, event: Event, state: T_State): try: session_id = event.get_session_id() except: session_id = None if session_id in _running_matcher: del _running_matcher[session_id]
async def _(matcher: Matcher, bot: Bot, event: Event, state: T_State): session_id = event.get_session_id() event_id = id(event) if _running_matcher.get(session_id, None) != event_id: raise IgnoredException("Annother matcher running") _running_matcher[session_id] = event_id
async def postprocess(matcher: Matcher, exception: Optional[Exception], bot: Bot, event: Event, state: T_State): try: session_id = event.get_session_id() except Exception: return if session_id in _running_matcher: del _running_matcher[session_id]
async def preprocess(event: Event): try: session_id = event.get_session_id() except Exception: return current_event_id = id(event) event_id = _running_matcher.get(session_id, None) if event_id and event_id != current_event_id: raise IgnoredException("Another matcher running") _running_matcher[session_id] = current_event_id
async def _(matcher: Matcher, bot: Bot, event: Event, state: T_State): try: session_id = event.get_session_id() except Exception: return current_event_id = id(event) event_id = _running_matcher.get(session_id, None) if event_id and event_id != current_event_id: raise IgnoredException("Another matcher running") _running_matcher[session_id] = current_event_id
async def _(matcher: Matcher, bot: Bot, event: Event, state: T_State): try: session_id = event.get_session_id() except: session_id = None event_id = id(event) eid = _running_matcher.get(session_id, None) if eid != event_id and eid is not None: raise IgnoredException("Annother matcher running") _running_matcher[session_id] = event_id
async def _handle_init(bot: Bot, event: Event, state: T_State): await database.connect() user_status = await database.fetch_val(f"SELECT command_active FROM status WHERE session_id = {event.get_session_id()}") # 用户不存在 if user_status == None: await database.execute("INSERT INTO status (message_type, session_id, command_active) VALUES (:mgt,:sid,:cat)", {'mgt': str(event.get_event_name()), 'sid': int(event.get_session_id()), 'cat': 1}) await database.execute("INSERT INTO commands (session_id) VALUES (:sid)", {'sid': int(event.get_session_id())}) await bot.send(message='* 进入交互环境,输入 exit 退出', event=event) # 用户存在,判断状态 if user_status == 0: await database.execute(f"UPDATE status SET command_active = 1 WHERE session_id = {event.get_session_id()}") await bot.send(message='进入交互环境,输入 exit 退出', event=event) elif user_status == 1: await bot.send(message='已处于交互环境,输入 exit 退出', event=event) await database.disconnect()
async def matcher_mutex(event: Event) -> AsyncGenerator[bool, None]: result = False try: session_id = event.get_session_id() except Exception: yield result else: current_event_id = id(event) event_id = _running_matcher.get(session_id, None) if event_id: result = event_id != current_event_id else: _running_matcher[session_id] = current_event_id yield result if not result: del _running_matcher[session_id]
async def handle_best30(bot: Bot, event: Event, state: T_State): userlst = str(showuser()) if state['arg'] == 'userinfo': if str(event.get_session_id()) in userlst: try: code = qqnum2code(int(event.get_session_id())) userinfo = await getuserinfo(code) await bot.send(message=str(userinfo), event=event) except: await bot.send(message='失败了~', event=event) else: await bot.send(message='未注册', event=event) await arcbot.finish() if state['arg'] == 'recent': if str(event.get_session_id()) in userlst: try: code = qqnum2code(int(event.get_session_id())) recent = await getrecent(code) await bot.send(message=str(recent), event=event) except: await bot.send(message='失败了~', event=event) else: await bot.send(message='未注册', event=event) await arcbot.finish() if state['arg'] == 'b30': # await bot.send(message="[CQ:image,file=file:///root/service/notebook_workdir/img.jpg]b30", event=event) # await bot.send(message=[{"type":"image","data":{"file":"file:///root/service/notebook_workdir/img.jpg"}}], event=event) # cq_img = await get_best30(int(event.get_session_id())) # await bot.send(message=event.get_event_name(), event=event) # if 'private' in event.get_event_name(): # await get_best30(int(event.get_session_id()), False) # else: # await get_best30(int(event.get_session_id()), True) # await bot.send(message=event.get_user_id(), event=event) if str(event.get_session_id()) in str(showuser()): try: await bot.send(message= 'ID: ' + str(event.get_session_id()) + '\n努力生成中`(*>﹏<*)\n注意:初次查分会耗时 1min 左右', event=event) code = qqnum2code(int(event.get_session_id())) # path = await genimg(code) path = await getbest30(code) await bot.send(message=[{"type":"image","data":{"file":f"file://{path}"}}], event=event) except: await bot.send(message='异常警报!请联系 Master', event=event) else: await bot.send(message='未注册哼哼 啊啊啊啊啊啊 啊啊啊啊啊啊啊啊啊啊啊ヾο(=ω<=)ρ', event=event) await arcbot.finish() if state['arg'].split(' ')[0] == 'register' or 'bind': code = state['arg'].split(' ')[-1] or '' if len(code) == 9: if event.get_session_id() not in userlst: adduser(int(code), int(event.get_session_id())) await bot.send(message='Success', event=event) else: await bot.send(message='已注册', event=event) else: await bot.send(message='Code invalid', event=event) if state['arg'].split(' ')[0] == 'removeuser': code = state['arg'].split(' ')[1] or None if code != None and str(code) in str(showuser()): _ = deluser(int(code)) await bot.send(message=f'Delete {code} Success', event=event) else: await bot.send(message='Code invalid',event=event) await arcbot.finish() await arcbot.finish()
async def __call__(self, bot: Bot, event: Event) -> bool: return bool( event.get_session_id() in self.users and (self.perm is None or await self.perm(bot, event)) )
async def update_permission(self, bot: Bot, event: Event) -> Permission: updater = self.__class__._default_permission_updater if not updater: return USER(event.get_session_id(), perm=self.permission) return await updater(bot=bot, event=event, state=self.state, matcher=self)