nonebot_plugin_admin icon indicating copy to clipboard operation
nonebot_plugin_admin copied to clipboard

[BUG] 成员清理,遇到Q群管家会报错

Open yzyyz1387 opened this issue 2 years ago • 1 comments

如题

yzyyz1387 avatar Dec 05 '23 19:12 yzyyz1387

主要修改,可以替换 kick_member_by_rule.py :

  1. 在 get_qq_lever 函数中添加了错误处理
  2. 添加了失败QQ号的记录
  3. 增加了更详细的错误提示
  4. 对于获取失败的情况,将等级默认设为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))}")

Enceladus6 avatar Mar 24 '25 05:03 Enceladus6