async def add_member(bot: NoneBot, ctx: Context_T, args: ParseResult): bm = BattleMaster(ctx['group_id']) clan = _check_clan(bm) uid = args['@'] or args.at or ctx['user_id'] name = args[''] if uid != ctx['user_id']: _check_admin(ctx, '才能添加其他人') try: # 尝试获取群员信息,用以检查该成员是否在群中 await bot.get_group_member_info(self_id=ctx['self_id'], group_id=bm.group, user_id=uid) except: raise NotFoundError(f'Error: 无法获取群员信息,请检查{uid}是否属于本群') if not name: m = await bot.get_group_member_info(self_id=ctx['self_id'], group_id=bm.group, user_id=uid) name = util.escape(m['card']) or util.escape(m['nickname']) or str( m['user_id']) mem = bm.get_member(uid, bm.group) or bm.get_member(uid, 0) # 兼容cmdv1 if mem: bm.mod_member(uid, mem['alt'], name, 1) await bot.send(ctx, f'成员{ms.at(uid)}昵称已修改为{name}') else: bm.add_member(uid, bm.group, name, 1) await bot.send(ctx, f"成员{ms.at(uid)}添加成功!欢迎{name}加入{clan['name']}")
async def description_guess_group_ranking(bot, ev: CQEvent): ranking = gm.db.get_ranking(ev.group_id) msg = ["【猜角色小游戏排行榜】"] for i, item in enumerate(ranking): uid, count = item m = await bot.get_group_member_info(self_id=ev.self_id, group_id=ev.group_id, user_id=uid) name = util.escape(m["card"]) or util.escape(m["nickname"]) or str(uid) msg.append(f"第{i + 1}名:{name} 猜对{count}次") await bot.send(ev, "\n".join(msg))
async def decherulize(bot, ev: CQEvent): s = ev.message.extract_plain_text() if len(s) > 1501: await bot.send(ev, '切、切噜太长切不动勒切噜噜...', at_sender=True) return msg = '的切噜噜是:\n' + util.filt_message(util.escape(cheru2str(s))) await bot.send(ev, msg, at_sender=True)
async def whois(bot, ev: CQEvent): name = escape(ev.message.extract_plain_text().strip()) if not name: return id_ = chara.name2id(name) confi = 100 guess = False if id_ == chara.UNKNOWN: id_, guess_name, confi = chara.guess_id(name) guess = True c = chara.fromid(id_) if confi < 60: return uid = ev.user_id if not lmt.check(uid): await bot.finish(ev, f'兰德索尔花名册冷却中(剩余 {int(lmt.left_time(uid)) + 1}秒)', at_sender=True) lmt.start_cd(uid, 120 if guess else 0) if guess: msg = f'兰德索尔似乎没有叫"{name}"的人...\n角色别称补全计划: github.com/Ice-Cirno/HoshinoBot/issues/5' await bot.send(ev, msg) msg = f'您有{confi}%的可能在找{guess_name} {c.icon.cqcode} {c.name}' await bot.send(ev, msg) else: msg = f'{c.icon.cqcode} {c.name}' await bot.send(ev, msg, at_sender=True)
async def switch_service(session: CommandSession, turn_on: bool): action_tip = '启用' if turn_on else '禁用' if session.ctx['message_type'] == 'group': names = session.current_arg_text.split() if not names: session.finish(f"空格后接要{action_tip}的服务名", at_sender=True) group_id = session.ctx['group_id'] svs = Service.get_loaded_services() succ, notfound = [], [] for name in names: if name in svs: sv = svs[name] u_priv = priv.get_user_priv(session.ctx) if u_priv >= sv.manage_priv: sv.set_enable(group_id) if turn_on else sv.set_disable( group_id) succ.append(name) else: try: await session.send( f'权限不足!{action_tip}{name}需要:{sv.manage_priv},您的:{u_priv}\n{PRIV_TIP}', at_sender=True) except: pass else: notfound.append(util.escape(name)) msg = [] if succ: msg.append(f'已{action_tip}服务:' + ', '.join(succ)) if notfound: msg.append('未找到服务:' + ', '.join(notfound)) if msg: session.finish('\n'.join(msg), at_sender=True) else: if session.ctx['user_id'] not in session.bot.config.SUPERUSERS: return args = session.current_arg_text.split() if len(args) < 2: session.finish( 'Usage: <service_name> <group_id1> [<group_id2>, ...]') name, *group_ids = args svs = Service.get_loaded_services() if name not in svs: session.finish(f'未找到服务:{name}') sv = svs[name] succ = [] for gid in group_ids: try: gid = int(gid) sv.set_enable(gid) if turn_on else sv.set_disable(gid) succ.append(gid) except: try: await session.send(f'非法群号:{gid}') except: pass session.finish(f'服务{name}已于{len(succ)}个群内{action_tip}:{succ}')
def parse(self, args: List[str], message: Message) -> ParseResult: result = ParseResult() # 解析参数,以一个字符开头,或无前缀 for arg in args: name, x = arg[0].upper(), arg[1:] if name in self.arg_dict: holder = self.arg_dict[name] elif '' in self.arg_dict: holder = self.arg_dict[''] name, x = '', arg else: raise ParseError(f'命令含有未知参数', self.usage) try: if holder.type == str: result.setdefault(name, escape(holder.type(x))) else: result.setdefault(name, holder.type(x)) # 多个参数只取第1个 except ParseError as e: e.append(self.usage) raise e except Exception: msg = f"请给出正确的{holder.tip or '参数'}" if name: msg += f"以{name}开头" raise ParseError(msg, self.usage) # 检查所有参数是否以赋值 for name, holder in self.arg_dict.items(): if name not in result: if holder.default is None: # 缺失必要参数 抛异常 msg = f"请给出{holder.tip or '缺少的参数'}" if name: msg += f"以{name}开头" raise ParseError(msg, self.usage) else: result[name] = holder.default # 解析Message内的at result['at'] = 0 for seg in message: if seg.type == 'at': result['at'] = int(seg.data['qq']) return result
async def kc_marriage(bot, ev: CQEvent): wife = escape(ev.message.extract_plain_text().strip()) tip = f'与{wife}的ケッコンカッコカリ结果是:' if wife else '的ケッコンカッコカリ结果是:' await do_dice(bot, ev, 1, 3, 6, 1, 0, tip)
async def guess(bot, ev: CQEvent): s = escape(ev.message.extract_plain_text().strip()) msg = await query(s) if msg: await bot.send(ev, msg, at_sender=True)
async def get_cqcode(session: CommandSession): await session.send(escape(str(session.current_arg)))