Пример #1
0
async def handle_announce(bot: Bot, event: Event, state: T_State):
    group = state['group']
    msg = state['announce_text']
    if group == 'all':
        t = DBTable(table_name='Group')
        for item in t.list_col('group_id').result:
            group_id = item[0]
            await bot.call_api(api='send_group_msg', group_id=group_id, message=msg)
    elif group == 'notice':
        t = DBTable(table_name='Group')
        for item in t.list_col_with_condition('group_id', 'notice_permissions', 1).result:
            group_id = item[0]
            await bot.call_api(api='send_group_msg', group_id=group_id, message=msg)
    elif group == 'command':
        t = DBTable(table_name='Group')
        for item in t.list_col_with_condition('group_id', 'command_permissions', 1).result:
            group_id = item[0]
            await bot.call_api(api='send_group_msg', group_id=group_id, message=msg)
    elif re.match(r'^\d+$', group):
        group_id = int(group)
        await bot.call_api(api='send_group_msg', group_id=group_id, message=msg)
    else:
        logger.warning(f'公告未发送, 不合规的群组类型或群号: {group}')
        await announce.finish('不合规的群组类型或群号')
    logger.warning(f'公告已成功发送群组: {group}')
    await announce.finish('公告发送完成')
Пример #2
0
async def skill_list(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result:
    skill_table = DBTable(table_name='Skill')
    _res = skill_table.list_col(col_name='name')
    if _res.success():
        msg = '目前已有的技能列表如下:'
        for skill_name in _res.result:
            msg += f'\n{skill_name[0]}'
        result = Result(False, _res.info, msg)
    else:
        result = Result(True, _res.info, '')
    return result
Пример #3
0
async def handle_skill(bot: Bot, event: GroupMessageEvent, state: T_State):
    skill = state['skill']
    group_id = event.group_id
    group = DBGroup(group_id=group_id)
    if not skill:
        result = group.idle_member_list()
        if result.success() and result.result:
            msg = ''
            for nickname, user_skill in result.result:
                msg += f'\n【{nickname}{user_skill}】'
            logger.info(
                f"Group: {event.group_id}, get_idle, Success, {result.info}")
            await get_idle.finish(f'现在有空的人: \n{msg}')
        elif result.success() and not result.result:
            logger.info(
                f"Group: {event.group_id}, get_idle, Success, {result.info}")
            await get_idle.finish(f'现在似乎没人有空呢QAQ')
        else:
            logger.error(
                f"Group: {event.group_id}, get_idle, Failed, {result.info}")
            await get_idle.finish(f'似乎发生了点错误QAQ')
    else:
        skill_table = DBTable(table_name='Skill')
        exist_skill = []
        for _skill in skill_table.list_col(col_name='name').result:
            exist_skill.append(_skill[0])
        if skill not in exist_skill:
            await get_idle.reject(f'没有{skill}这个技能, 请重新输入, 取消命令请发送【取消】:')
        result = group.idle_skill_list(skill=DBSkill(name=skill))
        if result.success() and result.result:
            msg = ''
            for nickname in result.result:
                msg += f'\n【{nickname}】'
            await get_idle.finish(f'现在有空的{skill}人: \n{msg}')
        elif result.success() and not result.result:
            logger.info(
                f"Group: {event.group_id}, get_idle, Success, {result.info}")
            await get_idle.finish(f'现在似乎没有{skill}人有空呢QAQ')
        else:
            logger.error(
                f"Group: {event.group_id}, get_idle, Failed, {result.info}")
            await get_idle.finish(f'似乎发生了点错误QAQ')
Пример #4
0
async def pixivision_monitor():
    logger.debug(f"pixivision_monitor: checking started")

    # 获取当前bot列表
    bots = []
    for bot_id, bot in get_bots().items():
        bots.append(bot)

    # 获取所有有通知权限的群组
    all_noitce_groups = []
    t = DBTable(table_name='Group')
    for item in t.list_col_with_condition('group_id', 'notice_permissions',
                                          1).result:
        all_noitce_groups.append(int(item[0]))

    # 初始化tag黑名单
    block_tag_id = []
    block_tag_name = []
    for block_tag in TAG_BLOCK_LIST:
        block_tag_id.append(block_tag.get('id'))
        block_tag_name.append(block_tag.get('name'))

    # 提取数据库中已有article的id列表
    exist_article = []
    t = DBTable(table_name='Pixivision')
    for item in t.list_col('aid').result:
        exist_article.append(int(item[0]))

    # 获取最新一页pixivision的article
    new_article = []
    _res = await get_pixivsion_article()
    if _res.success() and not _res.result.get('error'):
        try:
            pixivsion_article = dict(_res.result)
            for article in pixivsion_article['body']['illustration']:
                article_tags_id = []
                article_tags_name = []
                for tag in article['tags']:
                    article_tags_id.append(int(tag['tag_id']))
                    article_tags_name.append(str(tag['tag_name']))
                # 跳过黑名单tag的article
                if list(set(article_tags_id) & set(block_tag_id)) or list(
                        set(article_tags_name) & set(block_tag_name)):
                    continue
                # 获取新的article内容
                if int(article['id']) not in exist_article:
                    logger.info(
                        f"pixivision_monitor: 检查到新的Pixivision article: {article['id']}"
                    )
                    new_article.append({
                        'aid': int(article['id']),
                        'tags': article_tags_name
                    })
        except Exception as e:
            logger.error(
                f'pixivision_monitor: an error occured in checking pixivision: {repr(e)}'
            )
            return
    else:
        logger.error(
            f'pixivision_monitor: checking pixivision timeout or other error: {_res.info}'
        )
        return

    if not new_article:
        logger.info(f'pixivision_monitor: checking completed, 没有新的article')
        return

    sub = DBSubscription(sub_type=8, sub_id=-1)
    # 获取订阅了该直播间的所有群
    sub_group = sub.sub_group_list().result
    # 需通知的群
    notice_group = list(set(all_noitce_groups) & set(sub_group))

    # 处理新的aritcle
    for article in new_article:
        aid = int(article['aid'])
        tags = list(article['tags'])
        a_res = await pixivsion_article_parse(aid=aid, tags=tags)
        if a_res.success():
            if not notice_group:
                continue
            article_data = a_res.result
            msg = f"新的Pixivision特辑!\n\n" \
                  f"《{article_data['title']}》\n\n{article_data['description']}\n{article_data['url']}"
            for group_id in notice_group:
                for _bot in bots:
                    try:
                        await _bot.call_api(api='send_group_msg',
                                            group_id=group_id,
                                            message=msg)
                    except Exception as e:
                        logger.warning(
                            f"向群组: {group_id} 发送article简介信息失败, error: {repr(e)}"
                        )
                        continue
            # 处理article中图片内容
            tasks = []
            for pid in article_data['illusts_list']:
                tasks.append(fetch_image_b64(pid=pid))
            p_res = await asyncio.gather(*tasks)
            image_error = 0
            for image_res in p_res:
                if not image_res.success():
                    image_error += 1
                    continue
                else:
                    img_seg = MessageSegment.image(image_res.result)
                # 发送图片
                for group_id in notice_group:
                    for _bot in bots:
                        try:
                            await _bot.call_api(api='send_group_msg',
                                                group_id=group_id,
                                                message=img_seg)
                        except Exception as e:
                            logger.warning(
                                f"向群组: {group_id} 发送图片内容失败, error: {repr(e)}")
                            continue
            logger.info(f"article: {aid} 图片已发送完成, 失败: {image_error}")
        else:
            logger.error(f"article: {aid} 信息解析失败, info: {a_res.info}")
    logger.info(
        f'pixivision_monitor: checking completed, 已处理新的article: {repr(new_article)}'
    )