Esempio n. 1
0
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()
Esempio n. 2
0
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
Esempio n. 3
0
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)
Esempio n. 4
0
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')
Esempio n. 5
0
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
Esempio n. 6
0
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
Esempio n. 7
0
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))
Esempio n. 8
0
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)
Esempio n. 9
0
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
Esempio n. 10
0
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)
Esempio n. 11
0
async def _event_plain_text(event: Event) -> str:
    return event.get_plaintext()
Esempio n. 12
0
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)
Esempio n. 13
0
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))
Esempio n. 14
0
 async def fullmatch_checker(bot: Bot, event: Event, state: T_State):
     return event.get_plaintext() in words