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 })
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
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
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
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)
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()
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
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
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
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
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]))
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 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))
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
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)
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))
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"
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 _(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)
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 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"] = ""
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)))
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)
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))
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)
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
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]