Exemple #1
0
async def music_receive(bot: Bot,
                        event: Event,
                        regroup: Tuple[Any, ...] = RegexGroup()):

    if event.dict()["message_type"] == "private":
        return await bot.send(event=event,
                              message=Message(
                                  MessageSegment.text("私聊无法启用解析功能")))
    info = setting.search(Q["group_id"] == event.dict()["group_id"])
    # logger.info(info)
    nid = regroup[1]
    logger.debug(f"已识别NID:{nid}的歌曲")
    if info:
        if info[0]["song"]:

            msg = f"歌曲ID:{nid}\r\n如需下载请回复该条消息\r\n关闭解析请使用指令\r\n{cmd}ncm f"
            await bot.send(event=event,
                           message=Message(MessageSegment.text(msg)))

    else:
        setting.insert({
            "group_id": event.dict()["group_id"],
            "song": False,
            "list": False
        })
Exemple #2
0
async def deal_event(bot: Bot, event: Event, state: T_State):
    """
    说明
    """
    cmd_words = ['song_name', 'index']
    cmd_flag = ['song_name_flag', 'index_flag']
    state['song_name_flag'] = False
    state['index_flag'] = False
    des = event.get_event_description()
    des = des.split(' ')[3].split('@')
    args = str(event.get_message()).strip()
    if len(des) == 1:
        state['type'] = 'friend'
        state['user_id'] = int(des[0])
        # await music_listen.finish('该命令不支持私聊,请通过群聊进行')
    else:
        des = des[1].split(':')[1].replace(']', '')
        state['type'] = 'group'
        state['group_id'] = int(des)
    if args:
        args = args.split('#')
        args.remove('')
        for i in range(len(args)):
            state[cmd_words[i]] = args[i]
            state[cmd_flag[i]] = True
Exemple #3
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
Exemple #4
0
    def get_value(cls, bot: Bot, event: Event, state: T_State) -> CMD_RESULT:
        prefix = CMD_RESULT(
            command=None, raw_command=None, command_arg=None, command_start=None
        )
        state[PREFIX_KEY] = prefix
        if event.get_type() != "message":
            return prefix

        message = event.get_message()
        message_seg: MessageSegment = message[0]
        if message_seg.is_text():
            segment_text = str(message_seg).lstrip()
            pf = cls.prefix.longest_prefix(segment_text)
            if pf:
                value: TRIE_VALUE = pf.value
                prefix[RAW_CMD_KEY] = pf.key
                prefix[CMD_START_KEY] = value.command_start
                prefix[CMD_KEY] = value.command
                msg = message.copy()
                msg.pop(0)
                new_message = msg.__class__(segment_text[len(pf.key) :].lstrip())
                for new_segment in reversed(new_message):
                    msg.insert(0, new_segment)
                prefix[CMD_ARG_KEY] = msg

        return prefix
Exemple #5
0
async def receive(x: Event = Received("receive"),
                  y: Event = LastReceived(),
                  z: Event = Received()):
    assert str(x.get_message()) == "text"
    assert str(z.get_message()) == "text"
    assert x is y
    await test_receive.pause("pause", at_sender=True)
Exemple #6
0
async def push_start(bot: Bot, event: Event, state: T_State):
    push_infor = Push_information()
    state['push_infor'] = push_infor
    des = event.get_event_description()
    des = des.split(' ')[3].split('@')
    args = str(event.get_message()).strip()
    # msg = str(event.get_message())

    if len(des) == 1:
        for i in push_list:
            if i.num == int(des[0]):
                await push_start_event.finish('start push already')
                break
        else:
            push_infor.type = 'friend'
            push_infor.num = int(des[0])
    else:
        des = des[1].split(':')[1].replace(']', '')
        for i in push_list:
            if i.num == int(des):
                await push_start_event.finish('start push already')
                break
        else:
            push_infor.type = 'group'
            push_infor.num = int(des)
    if args:
        state['citys'] = args

    if len(start_time) == 0:
        start_time.append('0')
        push_schedule.add_job(weather_push, 'cron', hour='7, 19', minute='30', jitter=120)
        push_schedule.start()
Exemple #7
0
async def _(bot: Bot, event: Event, state: T_State):

    yml_path = "src/plugins/jrrp/jrrp.yml"
    if not event.is_tome():
        sender = event.get_user_id()

        with open(yml_path, "r", encoding="utf-8") as f:
            jrrp_log = yaml.load(f, Loader=yaml.FullLoader)

        today = datetime.date.today()
        if not jrrp_log['date'] == today:
            jrrp_log = {'date': today}

        if sender in jrrp_log.keys():
            rp = jrrp_log[sender]
        else:
            rp = randint(0, 100)
            jrrp_log[sender] = rp
            with open("src/plugins/jrrp/jrrp.yml", "w", encoding="utf-8") as f:
                yaml.dump(jrrp_log, f)

        msg = [{
            'type': 'at',
            'data': {
                'qq': sender
            }
        }, {
            'type': 'text',
            'data': {
                'text': f'你今天的人品是 {rp}%'
            }
        }]
        await jrrp.send(msg)
async def handle(bot: Bot, event: Event, state: T_State):
    try :
        args = str(event.get_message().split(" ")[1]).strip()
    except Exception as e: 
        args = str(event.get_message()).strip()
    if args:
        state["phrase"] = args
Exemple #9
0
async def _(bot: Bot, event: Event, state: dict):
    qq = int(event.get_user_id())
    argv = str(event.get_message()).strip().split(' ')
    try:
        nickname = binding_map[qq]
        if len(argv) != 2:
            await sancheck.send("你这白痴又弄错命令格式了!给我记好了,正确的格式是.sc <成功> <失败>!")
            return
        role = role_cache[nickname]
        value = random.randint(1, 100)
        sanity = role['stats']['san']
        if value > sanity:
            s, v = roll_expression(argv[1])
            role['stats']['san'] -= v
            await sancheck.send(
                "【%s】的理智检定:%d/%d 失败,理智扣除%s点,剩余%d点" %
                (nickname, value, sanity, s, role['stats']['san']))
        else:
            s, v = roll_expression(argv[0])
            role['stats']['san'] -= v
            await sancheck.send(
                "【%s】的理智检定:%d/%d 成功,理智扣除%s点,剩余%d点" %
                (nickname, value, sanity, s, role['stats']['san']))
    except KeyError:
        await sancheck.send("【%s】看起来还没绑定角色呢。输入.bind <角色名称> 进行绑定吧?" %
                            (event.sender.nickname))
        return
Exemple #10
0
async def _(bot: Bot, event: Event, state: dict):
    qq = int(event.get_user_id())
    try:
        nickname = binding_map[qq]
    except KeyError:
        await rollcheck.send("【%s】看起来还没绑定角色呢。输入.bind <角色名称> 进行绑定吧?" %
                             (event.sender.nickname))
        return
    argv = str(event.get_message()).strip().split(' ')
    try:
        stat_name = argv[0]
        if len(argv) == 2:
            value = int(argv[1])
            await rollcheck.send(check(nickname, stat_name, value))
            return
        try:
            role = role_cache[nickname]
            value, err = search_check(role, stat_name)
            if not err:
                await rollcheck.send("未找到能力值【%s】!真的有这个能力吗?" % stat_name)
                return
            await rollcheck.send(check(nickname, stat_name, value))
        except KeyError:
            await rollcheck.send("【%s】看起来还没绑定角色呢。输入.bind <角色名称> 进行绑定吧?" %
                                 (event.sender.nickname))
            return
    except Exception:
        await rollcheck.send("你这白痴又弄错命令格式了!给我记好了,正确的格式是.rc <技能/属性> [值]!")
        return
Exemple #11
0
async def _(bot: Bot, event: Event, state: dict):
    name = str(event.get_message()).strip()
    qq = int(event.get_user_id())
    try:
        var = binding_map[qq]
    except KeyError:
        try:
            var = role_cache[name]
        except KeyError:
            text = requests.get("http://47.100.50.175:25565/query", {
                "name": name
            }).text
            if text == "{}":
                await bind.send("千雪没能找到角色【%s】,下次再出错就把你拉入黑名单了哦!" % name)
                return
            role_cache[name] = demjson.decode(text, encoding='utf-8')
        if check_map(name):
            binding_map[qq] = name
        else:
            await bind.send("这个角色已经绑定过啦!难道还想两个人控制一个角色吗?!")
            return
        await bind.send("绑定成功!现在千雪已经认为【%s】就是【%s】了哦!" %
                        (event.sender.nickname, name))
        return
    await bind.send("你已经绑定过角色了哟~")
 async def _onFocus(event: Event):
     if isinstance(event, GroupMessageEvent):
         return (event.message_type == message_type
                 and event.get_user_id() == user_id
                 and event.group_id == group_id)
     elif isinstance(event, PrivateMessageEvent):
         return event.message_type == message_type and event.get_user_id(
         ) == user_id
Exemple #13
0
async def _(bot: Bot, event: Event, state: dict):
    result = roll_expression(str(event.get_message()).strip())
    name = event.sender.nickname
    try:
        name = binding_map[int(event.get_user_id())]
    except KeyError:
        pass
    await roll.send("【%s】的掷骰结果:%s" % (name, result[0]))
Exemple #14
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')
Exemple #15
0
async def get_result(bot: Bot, event: Event, state: T_State):
    if state.get("content") in ('help', 'h'):
        at_user = MessageSegment.at(event.get_user_id())
        result = await get_help()
    else:
        at_user = MessageSegment.at(event.get_user_id())
        roll_result = await roll_dice(state.get("content"))
        result = MessageSegment.text(roll_result)
    await dice.finish(Message().append(at_user).append(result))
Exemple #16
0
async def handle(bot: Bot, event: Event, state: T_State):
    # print(event.get_event_name().split(".")[1])

    if not ENABLE_PRIVATE and event.get_event_name().split(".")[1] != "group":
        await twqd.send(Message(PRIVATE_PROMPT))

    args = str(event.get_message()).strip()
    if args:
        state["stu_nums"] = args
Exemple #17
0
async def handle(bot: Bot, event: Event, state: T_State):
    try:
        if not ENABLE_PRIVATE and event.get_event_name().split(
                ".")[1] != "group":
            await twqdall.send(Message(PRIVATE_PROMPT))

        logger.debug(f'session id: {event.get_session_id()}')
        logger.debug(f'event description: {event.get_event_description()}')
        # event description: Message -639288931 from 729320011@[群:1001320858] ""
        group_id = str(event.dict()['group_id'])
        logger.debug(f'group id {group_id}')
        if SEND_LOG:
            await twqdall.send(Message(group_id))

        # Get All User
        group_member_list = await bot.get_group_member_list(group_id=group_id)
        logger.debug(group_member_list)
        if SEND_LOG:
            await twqdall.send(Message(str(group_member_list)))

        # Map User
        db = pymysql.connect(host=QQMAP_HOST,
                             port=3306,
                             user=QQMAP_USERNAME,
                             passwd=QQMAP_PASSWORD,
                             db="cpds_db",
                             charset='utf8')

        cursor = db.cursor()
        for member in group_member_list:
            user_id = str(member['user_id'])
            logger.debug(f'processing: {user_id}')
            at_ = "[CQ:at,qq={}]".format(user_id)
            if SEND_LOG:
                await twqdall.send(Message(at_ + TWQDALL_RUNNING_PROMPT))

            stu_num = await qq2stunum(user_id, cursor)
            logger.debug(f'will process: {user_id} {stu_num}')

            if not stu_num:
                # await twqdall.send(Message(at_ + TWQDALL_NOT_IN_DATASET_PROMPT))
                continue

            # await twqdall.send(Message(at_ + TWQDALL_RUNNING_PROMPT + f'{stu_num}'))
            await twqdall.send(Message(at_ + TWQDALL_RUNNING_PROMPT))
            await tempReportEvent(at_, stu_num, twqdall)

        db.close()
        cursor.close()
        await twqdall.send(Message(TWQDALL_SUCCESS_PROMPT))
    except Exception as e:
        msg = f"Exception: {Exception}\n"
        msg += f"str(e): {str(e)}\nrepr(e): {repr(e)}\n"
        msg += f"traceback.format_exc(): {traceback.format_exc()}"
        await exception_log(bot, msg)
Exemple #18
0
async def faq_local(bot: Bot, event: Event):
    raw_question = str(event.get_message())
    question = raw_question.replace(' ', '')
    question = question.replace('\r\n', '')
    if question:
        reply, confidence = await test_local(question, event.is_tome())
        if event.is_tome():
            if confidence < config.CONFIDENCE:
                reply = '我现在还不太明白,但没关系,以后的我会变得更强呢!'
            reply = add_at(reply, event.get_user_id())
            await faq.send(message.Message(reply))
Exemple #19
0
async def combine(a: str = ArgStr(), b: str = ArgStr(), r: Event = Received()):
    if a == "text":
        await test_combine.reject_arg("a")
    elif b == "text":
        await test_combine.reject_arg("b")
    elif str(r.get_message()) == "text":
        await test_combine.reject_receive()

    assert a == "text_next"
    assert b == "text_next"
    assert str(r.get_message()) == "text_next"
Exemple #20
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))
Exemple #21
0
async def _(bot: Bot, event: Event, state: T_State):
    if not event.is_tome():
        sender = event.get_user_id()
        qq = int(sender)
        msg = Message([{
            'type': 'at',
            'data': {
                'qq': sender
            }
        }, {
            'type': 'text',
            'data': {
                'text': f'(简单算法版)你今天的人品是 {get_rp(qq)}%'
            }
        }])
        await rp.send(msg)
Exemple #22
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)
Exemple #23
0
async def handle_first_receive(bot: Bot, event: Event, state: T_State):
    args = str(event.get_message()).strip()
    logger.debug(args)
    if args:
        state["content"] = args
    else:
        state["content"] = ""
Exemple #24
0
async def get_result(bot: Bot, event: Event, state: T_State):
    at = MessageSegment.at(event.get_user_id())
    if not state.get("content"):
        result = await get_help()
    elif str(state.get("content")).lower() == "list":
        plugin_set = nonebot.plugin.get_loaded_plugins()
        plugin_names = []
        for plugin in plugin_set:
            try:
                name = f'{plugin.name} | ' \
                    f'{plugin.module.__getattribute__("__help_plugin_name__")}'
            except:
                name = f'{plugin.name}'
            try:
                version = plugin.module.__getattribute__("__help_version__")
            except:
                version = ""
            plugin_names.append(f'{name} {version}')
        plugin_names.sort()
        newline_char = '\n'
        result = f'已加载插件:\n{newline_char.join(plugin_names)}'
    else:
        try:
            plugin = nonebot.plugin.get_plugin(state.get("content"))
        except AttributeError:
            plugin = None
        try:
            result = plugin.module.__getattribute__("__usage__")
        except:
            try:
                result = plugin.module.__doc__
            except AttributeError:
                result = f'{state.get("content")}插件不存在或未加载'
    await helper.finish(Message().append(at).append(
        MessageSegment.text(result)))
Exemple #25
0
        async def help(bot: Bot, event: Event, state: T_State, matcher: Matcher):
            # get real command content
            logger.debug(f"event: {event}")
            logger.debug(f"state: {state}")
            msg = event.get_message().extract_plain_text()
            logger.debug(f"got message '{msg}'")
            _, origin_command, command_text = re.match(regex, msg, flags=re.MULTILINE).groups()
            logger.debug(f"got command text '{command_text}'")
            extra_prompt = ""
            if not command_text.startswith(" ") and command_text != "":
                extra_prompt += f"treat '{origin_command + command_text}' as '{origin_command}'\n"
                logger.warning(extra_prompt)
                command_text = ""
            else:
                command_text = command_text.strip()
            command_without_help = origin_command.split()[-1]
            logger.debug(f"{command_without_help} => {self.cmd}")
            logger.debug(f"planning to call with '{self.cmd}', '{command_text}', '{self.help_long}'")
            help_long_text = await self.help_long_async_factory(self.cmd, command_text, self.help_long)
            
            sub_commands_texts = await asyncio.gather(*[command.help_short_async_factory(command.cmd, command_text, command.help_short) for command in self.sub_commands])
            newline = '\n'
            output = \
f"""
{extra_prompt}{help_long_text.strip()}

sub-commands:
{newline.join(f'{k}[{u}]:{v.strip()}' for k,u,v in zip(
    ('|'.join(comm.cmd_in_dice) for comm in self.sub_commands), 
    (f'{comm.run_as}' for comm in self.sub_commands), 
    sub_commands_texts
    )
).strip()}
""".strip()
            await matcher.finish(output)
Exemple #26
0
async def _(bot: Bot, event: Event, state: dict):
    t = int(str(event.get_message()).strip().split(' ')[-1])
    s = flush_buffer(t)
    if s == "":
        await time.send("经过了%d小时,但没有玩家的能力值发生变化。" % t)
    else:
        await time.send("经过%d小时后,玩家的能力发生了如下变化:\n%s" % (t, s))
Exemple #27
0
async def handle(bot: Bot, event: Event, state: T_State):
    try:
        user_id = event.get_user_id()
        at_ = "[CQ:at,qq={}]".format(user_id)
        args = str(state["args"]).split()
        if len(args) != 2:
            await query.send(Message(QUERY_ARGS_PROMPT))
        db = pymysql.connect(host=QQMAP_HOST, port=3306, user=QQMAP_USERNAME,
                             passwd=QQMAP_PASSWORD, db="cpds_db", charset='utf8')

        cursor = db.cursor()
        type, key = args
        logger.debug(f'query: {type} {key}')
        if type == '学号':
            qq = await stunum2qq(key, cursor)
            if not qq:
                await query.send(Message(at_ + QUERY_NO_DATA_PROMPT))
            else:
                await query.send(Message(at_ + QUERY_DATA_FORMAT.format(key, qq)))
        elif str(type).lower() == 'qq':
            stunum = await qq2stunum(key, cursor)
            if not stunum:
                await query.send(Message(at_ + QUERY_NO_DATA_PROMPT))
            else:
                await query.send(Message(at_ + QUERY_DATA_FORMAT.format(stunum, key)))
        else:
            await query.send(Message(QUERY_NO_SUCH_TYPE_PROMPT))
        db.close()
        cursor.close()
    except Exception as e:
        msg = f"Exception: {Exception}\n"
        msg += f"str(e): {str(e)}\nrepr(e): {repr(e)}\n"
        msg += f"traceback.format_exc(): {traceback.format_exc()}"
        await exception_log(bot, msg)
Exemple #28
0
async def _(bot: Bot, event: Event, state: T_State):
    r = "([绿黄红紫白])(?:id)?([0-9]+)"
    argv = str(event.get_message()).strip().split(" ")
    if len(argv) == 1 and argv[0] == '帮助':
        await query_score.send(query_score_mes)
    elif len(argv) == 2:
        try:
            grp = re.match(r, argv[0]).groups()
            level_labels = ['绿', '黄', '红', '紫', '白']
            level_labels2 = [
                'Basic', 'Advanced', 'Expert', 'Master', 'Re:MASTER'
            ]
            level_index = level_labels.index(grp[0])
            chart_id = grp[1]
            line = float(argv[1])
            music = total_list.by_id(chart_id)
            chart: Dict[Any] = music['charts'][level_index]
            tap = int(chart['notes'][0])
            slide = int(chart['notes'][2])
            hold = int(chart['notes'][1])
            touch = int(chart['notes'][3]) if len(chart['notes']) == 5 else 0
            brk = int(chart['notes'][-1])
            total_score = 500 * tap + slide * 1500 + hold * 1000 + touch * 500 + brk * 2500
            break_bonus = 0.01 / brk
            break_50_reduce = total_score * break_bonus / 4
            reduce = 101 - line
            if reduce <= 0 or reduce >= 101:
                raise ValueError
            await query_chart.send(
                f'''{music['title']} {level_labels2[level_index]}
    分数线 {line}% 允许的最多 TAP GREAT 数量为 {(total_score * reduce / 10000):.2f}(每个-{10000 / total_score:.4f}%),
    BREAK 50落(一共{brk}个)等价于 {(break_50_reduce / 100):.3f} 个 TAP GREAT(-{break_50_reduce / total_score * 100:.4f}%)'''
            )
        except Exception:
            await query_chart.send("格式错误或未找到乐曲,输入“分数线 帮助”以查看帮助信息")
async def handle(bot: Bot, event: Event, state: T_State):
    args = str(event.get_message()).strip()
    print("狗屁不通生成器", args)
    logger.debug('开始进行狗屁不通生成器' + args)
    print(type(args))
    if args:
        state["theme"] = args
Exemple #30
0
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]