async def _handle_filtr(bot: Bot, event: Event): """ ``store.db`` Tables 说明 ``status`` 储存用户状态 Columns: [message_type: TEXT, session_id: INT PRIMARY KEY, command_active: INT] ``commands`` 储存会话的所有命令 Columns: [session_id: INT PRIMARY KEY, commands: TEXT] """ def text_encode(f: str) -> str: return base64.b64encode(f.encode()).decode() def text_decode(f: str) -> str: return base64.b64decode(f.encode()).decode() next_cmd = event.get_plaintext().strip().strip('\n') await database.connect() if next_cmd in ['exit', 'exit()', 'quit']: await database.execute(f"UPDATE commands SET commands = NULL WHERE session_id = {event.get_session_id()}") await database.execute(f"UPDATE status SET command_active = 0 WHERE session_id = {event.get_session_id()}") await database.disconnect() await filtr.finish('Stopped') if next_cmd == 'history': if msg := await database.fetch_val(f"SELECT commands FROM commands WHERE session_id = {event.get_session_id()}"): await bot.send(message=f'{text_decode(msg)}', event=event) else: await bot.send(message='无历史输入', event=event) await database.disconnect() await filtr.finish()
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 decherulize(bot, ev: Event): s = ev.get_plaintext() if len(s) > 1501: await bot.send(ev, '切、切噜太长切不动勒切噜噜...', at_sender=True) return msg = '的切噜噜是:\n' + escape(cheru2str(s)) await bot.send(ev, msg, at_sender=True)
async def msg_event_deal(bot: Bot, event: Event, state: T_State): message_event_name = event.get_event_name() message_event_des = event.get_event_description() message = event.get_plaintext() await test_event_com.send(message_event_name) await test_event_com.send(message_event_des) await test_event_com.send(message) await test_event_com.finish('finish')
async def say_unescape(bot: Bot, event: Event, state: T_State): try: await bot.send(message=Message(event.get_plaintext()), event=event) except ActionFailed as e: logger.error( f'ActionFailed | {e.info["msg"].lower()} | retcode = {e.info["retcode"]} | {e.info["wording"]}' ) return
async def test_ip(bot: Bot, event: Event, state: T_State): if isinstance(event, MessageEvent): if event.get_plaintext() is None: await testip.send('testip ip <port>') return args = event.get_plaintext().split() good_input = False if len(args) == 1: ip = args[0] port = None if re.match(r'^\d{1,3}(?:\.\d{1,3}){3}$', ip): good_input = True elif len(args) == 2: ip, port = args if re.match(r'^\d{1,3}(?:\.\d{1,3}){3}$', ip) and port.isdigit(): good_input = True if not good_input: try: await testip.send('testip ip <port>') return except ActionFailed as e: logger.error( f'ActionFailed | {e.info["msg"].lower()} | retcode = {e.info["retcode"]} | {e.info["wording"]}' ) return results = await asyncio.gather( icmp_ping(ip), prob_tcp(ip, port), ip_location(ip), ) try: await testip.send('\n'.join((r for r in results if r))) except ActionFailed as e: logger.error( f'ActionFailed | {e.info["msg"].lower()} | retcode = {e.info["retcode"]} | {e.info["wording"]}' ) return else: logger.warning('Not supported: testip') return
async def process_msg(bot: Bot, event: Event, enable: bool): try: args = event.get_plaintext().strip() if not args: msg = _GROUP_USAGE if isinstance( event, GroupMessageEvent) else _PRIVATE_USAGE raise ValueError('未找到参数。' + msg) args = args.split(' ') # 从群组内调用 if isinstance(event, GroupMessageEvent): succeed = set() failed = set() group_id = event.group_id services = args for sv_name in services: sv = Service.get_loaded_services().get(sv_name) if sv: await set_sv(sv, group_id, enable) succeed.add(sv_name) else: failed.add(sv_name) msg = '' if succeed: msg += '服务' + '、'.join([str(i) for i in succeed]) + \ '已启用' if enable else '已禁用' + '\n' if failed: msg += '不存在这些服务:' + '、'.join([str(i) for i in failed]) await bot.send(event, msg) # 私聊调用,需要superuser权限 elif isinstance(event, PrivateMessageEvent): if not is_superuser(event.get_user_id()): return parser = ArgParserPrivate(enable, args) await parser.run() msg = '' if parser.succeed: msg += '执行完毕。\n' if parser.failed: msg += '以下群组发生错误:\n' msg += '\n'.join( [f' {name}: {msg}\n' for name, msg in parser.failed]) + '\n' msg += _PRIVATE_USAGE await bot.send(event, msg) except ValueError as e: await bot.send(event, str(e))
async def comic(bot: Bot, event: Event): episode = event.get_plaintext() if not re.fullmatch(r'\d{0,3}', episode): return episode = episode.lstrip('0') if not episode: await bot.send(event, '请输入漫画集数 如:官漫132', at_sender=True) return index = load_index() if episode not in index: await bot.send(event, f'未查找到第{episode}话,敬请期待官方更新', at_sender=True) return title = index[episode]['title'] pic = R.img('priconne/comic/', get_pic_name(episode)).cqcode msg = f'プリンセスコネクト!Re:Dive公式4コマ\n第{episode}話 {title}\n{pic}' await bot.send(event, msg, at_sender=True)
async def _(bot: Bot, event: Event, state: T_State): if not random.randint(1, 100) <= 1: return msg = event.get_plaintext() if msg.startswith(f'[CQ:at,qq={bot.self_id}]'): return text = re.sub(cq_code_pattern, '', msg).strip() global salt if salt is None: salt = rand_string() session_id = md5((str(event.user_id) + salt).encode()).hexdigest() param = { 'app_id': app_id, 'session': session_id, 'question': text, 'time_stamp': str(int(time.time())), 'nonce_str': rand_string(), } sign = getReqSign(param) param['sign'] = sign async with aiohttp.request( 'POST', 'https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat', params=param, ) as response: code = response.status if code != 200: raise ValueError(f'bad server http code: {code}') res = await response.read() param = json.loads(res) if param['ret'] != 0: raise ValueError(param['msg']) reply = param['data']['answer'] try: await chat.send(Message(reply)) except ValueError as e: logger.info(f'api call failed : {e}') except ActionFailed as e: logger.error( f'ActionFailed | {e.info["msg"].lower()} | retcode = {e.info["retcode"]} | {e.info["wording"]}' ) return
async def novel_continue(bot: Bot, event: Event): await bot.send(event, '请耐心等候', at_sender=True) text = event.get_plaintext().strip() res = await get_single_continuation(text) if res: await bot.send(event, res, at_sender=True)
async def _event_plain_text(event: Event) -> str: return event.get_plaintext()
async def kc_marriage(bot, event: Event): wife = event.get_plaintext().strip() tip = f'与{wife}的ケッコンカッコカリ结果是:' if wife else '的ケッコンカッコカリ结果是:' await do_dice(bot, event, 1, 3, 6, 1, 0, tip)
async def cherulize(bot, ev: Event): s = ev.get_plaintext() if len(s) > 500: await bot.send(ev, '切、切噜太长切不动勒切噜噜...', at_sender=True) return await bot.send(ev, '切噜~♪' + str2cheru(s))
async def fullmatch_checker(bot: Bot, event: Event, state: T_State): return event.get_plaintext() in words