nonebot_plugin_admin
nonebot_plugin_admin copied to clipboard
[BUG] 成员清理,遇到Q群管家会报错
如题
主要修改,可以替换 kick_member_by_rule.py :
- 在 get_qq_lever 函数中添加了错误处理
- 添加了失败QQ号的记录
- 增加了更详细的错误提示
- 对于获取失败的情况,将等级默认设为0级并通知用户 这样修改后,即使获取某些成员的等级信息失败,机器人也能继续运行,不会直接崩溃,并且会告知用户哪些成员的等级获取失败了。
async def get_qq_lever(bot: Bot, qq: int):
"""
:param bot: bot
:param qq: qq号
:return: qq等级
获取qq等级
"""
try:
return (await bot.get_stranger_info(user_id=qq, no_cache=True))['level']
except ActionFailed:
logger.warning(f"获取QQ {qq} 的等级信息失败")
return 0 # 获取失败时返回0级
# ... 其他代码保持不变 ...
@kick_by_rule.got('kick_condition', prompt='请输入:')
async def _(
bot: Bot,
event: GroupMessageEvent,
matcher: Matcher,
state: T_State,
kick_condition=ArgStr()
):
global level_dic, last_send_dict
await kick_by_rule.send("请坐和放宽,轮询成员信息中,这可能会花费几分钟...")
kick_condition = str(kick_condition)
kick_list = []
await finish_Matcher(matcher, state, kick_condition)
member_list = await bot.get_group_member_list(group_id=event.group_id)
category = str(state['k_category'])
qq_list = [member['user_id'] for member in member_list]
if category == "1":
# 获取所有成员等级
level_dic = {}
failed_list = [] # 记录获取失败的QQ
for qq in qq_list:
try:
level = await get_qq_lever(bot, qq)
if level == 0:
failed_list.append(qq)
level_dic[qq] = level
except Exception as e:
logger.error(f"获取QQ {qq} 等级时发生错误: {e}")
level_dic[qq] = 0
failed_list.append(qq)
if failed_list:
await kick_by_rule.send(f"以下成员等级获取失败(将被视为0级):\n{' '.join(map(str, failed_list))}")