Пример #1
0
async def common_multiuser_msgsender(session, uids: tuple):
    """
    通用多用户消息发送函数。
    参数:
        session
        uids: 作者uid组成的元组
    """
    msg = M()
    msglimit = 20
    msgcurrent = 0
    useb64 = False if session.self_id == SIGNAL['MainQQ'] else True
    for user in _pixiv_instance.getusers(uids, useb64):
        msgcurrent += 1
        if msgcurrent > msglimit:
            await session.send(msg)
            msgcurrent = 1
            msg.clear()
        msg.append(MS.text('-' * 20 + '\n'))
        msg.append(MS.text(f'用户名:{user["user"]["name"]}\n'))
        msg.append(MS.text(f'用户ID:{user["user"]["id"]}\n'))
        if SIGNAL['RegisteredQQ'][session.self_id][
                'coolq_edition'] == 'pro' and user['user']['profile_image']:
            msg.append(MS.text('用户头像:'))
            msg.append(MS.image(user['user']['profile_image']))
            msg.append(MS.text('\n'))
    if msg:
        await session.send(msg)
Пример #2
0
async def query_blacklist(session, bot):
    msg = M()
    if BLACKLIST['user']:
        msg.append(
            MS.text(
                f'用户黑名单:{",".join([str(i) for i in BLACKLIST["user"]])}。\n'))
    if BLACKLIST['group']:
        msg.append(
            MS.text(f'群黑名单:{",".join([str(i) for i in BLACKLIST["group"]])}。'))
    await session.send(msg)
Пример #3
0
async def _(session: NoticeSession):
    user_id = session.ctx.get('user_id')
    msg = MessageSegment.at(session.ctx['user_id']) + ' ' + MessageSegment.text(
        '欢迎新进群的小伙伴:\n并仔细阅读本群【所有公告】和【帮助文档】,进群先看【群文件和群相册】,看完有问题再问,为了让你安心看群文件,先禁言三分钟哈~请见谅')
    msg = f'[CQ:at, qq = {user_id}]' +'\n'+msg
    await session.send(msg)
    await bot.set_group_ban(group_id=session.ctx['group_id'], user_id=session.ctx['user_id'], duration=180)
Пример #4
0
 def flash(self) -> MessageSegment:
     if hoshino.config.RES_PROTOCOL == 'http':
         return MessageSegment(type_='image', data={'url': self.url, 'type': 'flash'})
     elif hoshino.config.RES_PROTOCOL == 'file':
         return MessageSegment(type_='image', data={'file': f'file:///{os.path.abspath(self.path)}', 'type': 'flash'})
     else:
         return MessageSegment.text('[图片出错]')
Пример #5
0
 def cqcode(self) -> MessageSegment:
     if hoshino.config.RES_PROTOCOL == 'http':
         return MessageSegment.record(self.url)
     elif hoshino.config.RES_PROTOCOL == 'file':
         return MessageSegment.record(f'file:///{os.path.abspath(self.path)}')
     else:
         return MessageSegment.text('[不支持的协议]')
Пример #6
0
async def pid_search_comment(session, bot):
    pid = session.get('pid', prompt='请输入想查询的PID')
    await session.send(M(f'开始搜索作品{pid}的评论区'))
    try:
        await refreshtoken()
        comments = await _pixiv_instance.illust_comments(pid)
    except InfoNotFoundError:
        await session.send(M('未查询到信息'))
    except PixivError as e:
        await session.send(M('插件出错'))
        raise e
    else:
        msg = M()
        msglimit = 10
        msgcurrent = 0
        for comment in comments:
            msgcurrent += 1
            if msgcurrent > msglimit:
                await session.send(msg)
                msgcurrent = 1
                msg.clear()
            msg.append(MS.text(comment))
        if msg:
            await session.send(msg)
    finally:
        await session.send(M(f'搜索作品{pid}评论区完毕'))
Пример #7
0
 def msg_from_text(cls, text: str):
     text = text.strip()
     msg: Message = Message()
     for t in text.split():
         if msg:
             msg.append(MessageSegment.text(' '))
         msg.append(cls.build(t))
     return msg
Пример #8
0
async def _(session: NoticeSession):
    msg = MessageSegment.at(session.ctx['user_id']) + ' ' + MessageSegment.text(
        '欢迎新进群的小伙伴:\n请按照群公告的要求改好自己的【群名片】,并仔细阅读本群【所有公告】和【2019帮助文档】,进群先看【群文件和群相册】,看完有问题再问,为了让你安心看群文件,先禁言三分钟哈~请见谅'
    )
    await session.send(msg)
    await bot.set_group_ban(group_id=session.ctx['group_id'],
                            user_id=session.ctx['user_id'],
                            duration=180)
Пример #9
0
 def cqcode(self) -> MessageSegment:
     if get_bot().config.RESOURCE_URL:
         return MessageSegment.image(self.url)
     else:
         try:
             return MessageSegment.image(pic2b64(self.open()))
         except Exception as e:
             logger.exception(e)
             return MessageSegment.text('[图片]')
Пример #10
0
 def cqcode(self) -> MessageSegment:
     if get_bot().config.RESOURCE_URL:
         return MessageSegment.image(self.url)
     else:
         try:
             return MessageSegment.image('file:///' + self.path)
         except Exception as e:
             logger.exception(e)
             return MessageSegment.text('[图片]')
Пример #11
0
 def cqcode(self) -> MessageSegment:
     if hoshino.config.RES_PROTOCOL == 'http':
         return MessageSegment.image(self.url)
     elif hoshino.config.RES_PROTOCOL == 'file':
         return MessageSegment.image(f'file:///{os.path.abspath(self.path)}')
     else:
         try:
             return MessageSegment.image(util.pic2b64(self.open()))
         except Exception as e:
             hoshino.logger.exception(e)
             return MessageSegment.text('[图片出错]')
Пример #12
0
async def common_multiimage_msgsender(session,
                                      pids: tuple,
                                      original: bool = False,
                                      multiimage: bool = False):
    '''
    通用多图片消息发送函数。
    参数:
        session
        pids: 图片pid组成的元组
        original: 是否使用原图
        multiimage: 是否使用多图
    '''
    msg = M()
    msglimit = 20
    msgcurrent = 0
    useb64 = False if session.self_id == SIGNAL['MainQQ'] else True
    for illust in _pixiv_instance.getpics(pids, useb64):
        msgcurrent += illust['count'] if multiimage else 1
        if msgcurrent > msglimit:
            await session.send(msg)
            msgcurrent = illust['count'] if multiimage else 1
            msg.clear()
        msg.append(MS.text('-' * 20 + '\n'))
        msg.append(MS.text(f'作品名:{illust["title"]}\n'))
        msg.append(MS.text(f'PID:{illust["id"]}\n'))
        if SIGNAL['RegisteredQQ'][session.self_id]['coolq_edition'] == 'pro':
            files = illust['files']['original'] if original else illust[
                'files']['large']
            multiimage = session.state['multiimage']
            if multiimage:
                for file in files:
                    msg.append(MS.image(file))
                    msg.append(MS.text('\n'))
            else:
                msg.append(MS.image(files[0]))
                msg.append(MS.text('\n'))
    if msg:
        await session.send(msg)
Пример #13
0
async def query_modules_status(session, bot):
    msg = M()
    if session.event['message_type'] == 'group':
        groupid = session.event['group_id']
        msg.append(MS.text(f'群{groupid}的插件启用状态:\n'))
        mods_config = groupdict[session.self_id][groupid]['mods_config']
    else:
        userid = session.event['user_id']
        msg.append(MS.text(f'用户{userid}的插件启用状态:\n'))
        mods_config = frienddict[session.self_id][userid]['mods_config']
    for k in mods_config.keys():
        msg.append(
            MS.text(f'{k}:{"已禁用" if mods_config[k]["disable"] else "已启用"}\n'))
        if k == 'pixiv':
            msg.append(
                MS.text(
                    f'{k}(R18):{"已启用" if mods_config[k]["allowr18"] else "已禁用"}\n'
                ))
            msg.append(
                MS.text(
                    f'{k}(R18G):{"已启用" if mods_config[k]["allowr18g"] else "已禁用"}\n'
                ))
    await session.send(msg)
Пример #14
0
async def dice(session, bot):
    selfid = session.self_id
    msgat = []
    for msg in session.event['message']:
        if msg['type'] == 'at' and msg['data']['qq'] != 'all':
            msgat.append(int(msg['data']['qq']))
    msg = M()
    if session.event['message_type'] == 'group':
        msg.append(
            MS.text(
                f'{session.event["sender"]["card"] or session.event["sender"]["nickname"]}掷出了{random.randint(1, 100)}点'
            ))
    else:
        msg.append(
            MS.text(
                f'{session.event["sender"]["nickname"]}掷出了{random.randint(1, 100)}点'
            ))
    for i in msgat:
        alias = groupdict[selfid][session.event['group_id']]['member'][i][
            'card'] or groupdict[selfid][
                session.event['group_id']]['member'][i]['nickname']
        msg.append(MS.text(f'\n{alias}掷出了{random.randint(1, 100)}点'))
    await session.send(msg)
Пример #15
0
def get_setu():
    try:
        path = None
        filename = None
        filelist = os.listdir(setu_folder)
        filelist = sorted(filelist, key=lambda x: os.path.getmtime(os.path.join(setu_folder, x)), reverse=True)
        while not path or not os.path.isfile(path):
            # i = round(random.expovariate(0.02))  # 期望为 1 / λ
            i = random.randint(0, len(filelist) - 1) # if i >= len(filelist) else i
            filename = filelist[i]
            path = os.path.join(setu_folder, filename)
        return R.img('setu/', filename).cqcode
    except Exception as e:
        sv.logger.exception(e)
        sv.logger.exception(f'f={filename}, x={path}')
        return MessageSegment.text('Error: 挑选涩图时发生异常')
Пример #16
0
async def clanbattlehelp(session, bot):
    msg = M()
    if session.is_first_run and 'page0' not in session.state.keys():
        tips = M()
        tips.append(MS.text("欢迎使用AzusaBot的公主连结会战管理插件。"))
        tips.append(MS.text('本插件仅可在群聊中生效。所有指令均以空格分割;@代表需要at机器人才能执行;/代表其前后的指令均可执行且为同一效果(别名);执行成功的指令一定会收到文字提示。\n'))
        tips.append(MS.text("-" * 10 + "\n目录:1.会战管理指令,2.公会指令(所有时期可用),3.会战限定指令(仅会战期间可用)。4.调试用指令(仅su可执行)。"))
        await session.send(tips)
    page0 = session.get('page0', prompt='请输入查询的页码哦')
    try:
        helpdict = {
            '1': {
                '0': '会战管理指令:\n1.<@创建公会/注册公会>,2.<@删除公会/解除注册公会>,3.<@开始公会战/开始会战>,4.<@结束公会战/结束会战>。',
                '1': '<@创建公会/注册公会>:可选1个参数。仅群主可执行。可选参数为“国服(B服、b服、cn服),台服(tw服),日服(jp服)”,未设置参数则默认为台服。将当前群注册为使用公会战插件的公会,公会战指令有效,使用服务器类型初始化会战数据(各阶段boss血量上限以及各阶段boss分数倍率信息,允许使用指令<设置最大血量><设置分数倍率>进行修改)。\n'+ '-' * 10 + '\n例:“创建公会 cn服”,创建一个类型为国服的公会。\n例:“创建公会”,创建一个类型为台服的公会。',
                '2': '<@删除公会/解除注册公会>:不接受参数。仅群主可执行。将当前群从使用公会战插件的公会中去除,公会战指令无效。',
                '3': '<@开始公会战/开始会战>:可选0,1,2个参数。仅群主和管理员可执行。参数依次为“会战总天数”、“会战已进行天数”,默认设置为“7”,“0”。允许使用会战限定指令,立即重置所有会战数据,并且会战进行到第1天时会自动重置所有会战数据。\n'+ '-' * 10 + '\n例:“@开始公会战”,开始为期7天的公会战,当前为会战前1天,命令执行后第2天时正式记录分数,第8天时自动结束。\n例:“@开始公会战 6 -1”,开始为期6天的公会战,当前为会战前2天,命令执行后第3天时正式记录分数,第8天时自动结束。',
                '4': '<@结束公会战/结束会战>:不接受参数。仅群主和管理员可执行。执行后结束当期会战,保存玩家分数并且禁止使用会战限定指令。由于已存在自动结束功能,不推荐使用此指令。',
                },
            '2': {
                '0': '公会指令:\n1.<注册/加入公会/入会>,2.<解除注册/退出公会/退会>,3.<修改昵称/改名/修改名称>,4.<查分/查询分数>,5.<查询排行>,6.<设置战斗力/修改战斗力>,7.<查询昵称>,8.<查询ID>,9.<查询所有玩家>。',
                '1': '<注册/加入公会/入会>:可选0,1个参数。参数为“昵称”,“昵称”默认设置为群名片。向公会内注册新玩家,以昵称为自己的名称。\n' + '-' * 10 + '\n例:“注册”,以QQ昵称作为自己的名称注册。\n例:“注册 AAA”,以AAA作为自己的名称注册。',
                '2': '<解除注册/退出公会/退会>:可选0,1个参数。参数为“昵称”,“昵称”默认设置为自己的名称。删除公会内以昵称为名称的玩家。\n' + '-' * 10 + '\n例:“解除注册”, 删除自己。\n例:“解除注册 AAA”,删除公会内名为AAA的玩家。',
                '3': '<修改昵称/改名/修改名称>:可选1,2个参数。参数依次为“旧昵称”、“新昵称”,“旧昵称”默认设置为公会内自己的名称。必须接受新昵称参数。将旧昵称的玩家的名称修改为新昵称。\n' + '-' * 10 + '\n例:“改名 AAA”,将自己的名称修改为AAA。\n例:“改名 AAA BBB”,将名称AAA的玩家的名称修改为BBB。',
                '4': '<查分/查询分数>:可选0,1个参数。参数为“昵称”,“昵称”默认设置为公会内自己的名称。查询名称为昵称的玩家的分数。\n' + '-' * 10 + '\n例:“查分”,查询自己的分数。\n例:“查分 AAA”,查询名称为AAA的玩家的分数。',
                '5': '<查询排行>:可选0,1个参数。无参数时返回所有玩家的总分排行信息。带一个参数时,该参数为boss序号,返回所有玩家对该boss的分数排行信息。\n' + '-' * 10 + '\n例:“查询排行”,返回所有玩家总分排行信息。\n例:“查询排行 5”,返回所有玩家五王分数排行信息。',
                '6': '<设置战斗力/修改战斗力>:可选1,2个参数。参数依次为“昵称”,“战斗力数值”,“昵称”默认设置为公会内自己的名称。将名称为昵称的玩家的战斗力设置为战斗力数值。\n' + '-' * 10 + '\n例:“修改战斗力 5”,将自己的战斗力设置为5。\n例:“修改战斗力 AAA 5”,将名称为AAA的玩家的战斗力修改为5。',
                '7': '<查询昵称>:必选1个参数。参数为“QQ号”。查询以QQ号为内部ID的玩家的名称。',
                '8': '<查询ID>:必选1个参数。参数为“昵称”。查询以昵称为名称的玩家的QQ号。',
                '9': '<查询所有玩家>:不接受参数。查询公会内所有注册玩家的名称。',
                },
            '3': {
                '0': '会战限定指令:\n1.<出刀/刀/报刀>,2.<申请出刀>,3.<预约刀/预约>,4.<取消预约>,5.<挂树/上树>,6.<取消挂树/下树>,7.<重置状态>,8.<调整boss/校正boss>,9.<boss信息不正确>,10.<设置最大血量>,11.<设置分数倍率>,12.<设置阶段转换>,13.<@撤回出刀>,14.<查询已出刀信息>,15.<查询BOSS/查询Boss/查询boss>,16.<查询挂树>,17.<查询剩余刀>,18.<查询预约刀/查询预约>,19.<查询公会总分>,20.<查询会战信息>,21.<作业>。',
                '1': '<出刀/刀/报刀>:可选1,2,3,4个参数。带1或2个参数时,参数依次为“昵称”、“伤害值”,“昵称”默认设置为公会内自己的名称,执行后名称为昵称的玩家对当前boss造成伤害值的伤害。带3或4个参数时,参数依次为“昵称”、“阶段”、“boss序号”、“伤害值”,“昵称”默认设置为公会内自己的名称,执行后名称为昵称的玩家对阶段的阶段的boss序号的boss造成伤害值的伤害,此时伤害不计入当前boss数值。\n' + '-' * 15 + '\n例:“刀 10”,自己对当前boss造成10点伤害。\n例:“刀 AAA 10”,玩家AAA对当前boss造成10点伤害。\n例:“刀 3 4 20”,自己对三阶段四号boss造成20点伤害且当前boss信息不变。\n例:“刀 AAA 3 4 20”,玩家AAA对三阶段四号boss造成20点伤害且当前boss信息不变。',
                '2': '<申请出刀>:可选0,1个参数。参数为“昵称”,“昵称”默认设置为公会内自己的名称。为名称为昵称的玩家申请出刀,可使用正常出刀指令。\n' + '-' * 10 + '\n例:“申请出刀”,为自己申请出刀。\n例:“申请出刀 AAA”,为玩家AAA申请出刀。',
                '3': '<预约刀/预约>:可选随意长度的参数。若第一个参数不是数字,则将其设置为“昵称”,并将其后所有参数作为boss序号传入;否则“昵称”默认设置为公会内自己的名称,并将所有参数作为boss序号传入。执行后为名称为昵称的玩家预约所有boss序号的boss。\n' + '-' * 10 + '\n例:“预约 2 3”,为自己预约2号3号boss。\n例:“预约 AAA 1”,为玩家AAA预约1号boss。',
                '4': '<取消预约>:可选随意长度的参数。若第一个参数不是数字,则将其设置为“昵称”,并将其后所有参数作为boss序号传入;否则“昵称”默认设置为公会内自己的名称,并将所有参数作为boss序号传入。执行后为名称为昵称的玩家取消预约所有boss序号的boss。\n' + '-' * 10 + '\n例:“取消预约 2 3”,为自己取消预约2号3号boss。\n例:“取消预约 AAA 1”,为玩家AAA取消预约1号boss。',
                '5': '<挂树/上树>:可选0,1个参数。参数为“昵称”,“昵称”默认设置为公会内自己的名称。将名称为昵称的玩家设置为挂树状态。\n' + '-' * 10 + '\n例:“挂树”,为自己设置挂树。\n例:“挂树 AAA”,将名称为AAA的玩家设置挂树。',
                '6': '<取消挂树/下树>:可选0,1个参数。参数为“昵称”,“昵称”默认设置为公会内自己的名称。将名称为昵称的玩家取消挂树状态。当boss击破时所有挂树状态的玩家自动下树,不建议使用此指令。\n' + '-' * 10 + '\n例:“下树”,为自己取消挂树。\n例:“下树 AAA”,将名称为AAA的玩家取消挂树。',
                '7': '<重置状态>:可选0,1个参数。仅群主或管理员可执行。参数为“昵称”,“昵称”默认设置为公会内自己的名称。将名称为昵称的玩家的状态重置,包括剩余刀数,预约boss信息,挂树信息,尾刀信息。\n' + '-' * 10 + '\n例:“重置状态”,重置自己的状态。\n例:“重置状态 AAA”,重置名称为AAA的玩家的状态。',
                '8': '<调整boss/校正boss>:必选3个参数。仅群主或管理员可执行。参数依次为“周数”,“序号”,“当前血量”。将当前boss信息设置为周数的周目,序号的boss,当前血量的血量。\n' + '-' * 10 + '\n例:“调整boss 22 4 6800000”,将当前boss设置为22周目的4号boss且血量为6800000。',
                '9': '<boss信息不正确>:不接受参数。将当前boss信息设置为过时。此时出刀必须带3或4个参数,并且不再统计boss信息,预约刀、挂树将自动失效。',
                '10': '<设置最大血量>:必选6个参数。仅群主或管理员可执行。参数依次为boss阶段、boss1至boss5的血量上限。\n' + '-' * 10 + '\n例:“设置最大血量 3 7000000 9000000 12000000 14000000 17000000”,将三阶段五个boss的血量上限依次设置为7000000,9000000,12000000,14000000,17000000。',
                '11': '<设置分数倍率>:必选6个参数。仅群主或管理员可执行。参数依次为boss阶段、boss1至boss5的分数倍率。\n' + '-' * 10 + '\n例:“设置分数倍率 3 2 2 2.4 2.4 2.6”,将三阶段五个boss的分数倍率依次设置为2,2,2.4,2.4,2.6。',
                '12': '<设置阶段转换>:可选1个以上参数。仅群主或管理员可执行。参数依次为进入第1,第2,...,第n阶段的周数。\n' + '-' * 10 + '\n例:“设置阶段转换 1 4 11 35”,将阶段转换设置为第1周目进入第1阶段,第4周目进入第2阶段,第11周目进入第3阶段,第35周目进入第4阶段。',
                '13': '<@撤回出刀>:不接受参数。回滚所有信息至上一个出刀之前。用于报错刀修正。对任意形式的出刀均有效。将会保存Azusa从开始公会战(或读取会战信息)之后的所有出刀信息。每日五点清空。',
                '14': '<查询已出刀信息>:可选1,2,3个参数。可选参数为“正序”,“X(-Y)”,“昵称”。查询已出刀的信息,带有“正序”参数则按从前往后出刀的顺序查询,否则按从后往前的顺序查询。单独“X”参数查询第X条数据,“X-Y”参数查询第X到第Y条数据,Y必须大于X,此参数默认设置为“1”。“昵称”参数指定查询玩家昵称为“昵称”的出刀信息。\n' + '-' * 10 + '\n例:“查询已出刀信息”,查询倒序第一刀(前一刀)的出刀信息。\n例:“查询已出刀信息 3”,查询倒序第三刀(前第三刀)的出刀信息。\n例:“查询已出刀信息 4-7”,查询倒序第四到第七刀(前第七到第四刀)的所有出刀信息。\n例:“查询已出刀信息 正序 5”,查询正序第五刀的出刀信息。\n例:“查询已出刀信息 ABC”,查询昵称为“ABC”的玩家的出刀信息。',
                '15': '<查询BOSS/查询Boss/查询boss>:不接受参数。查询当前boss信息。',
                '16': '<查询挂树>:不接受参数。查询当前挂树信息。',
                '17': '<查询剩余刀>:可选0,1个参数。无参数时返回所有剩余刀数大于0的玩家的剩余刀信息。带一个参数时,若该参数为数字,则参数为剩余刀数,返回所有剩余刀数为参数的玩家名单;否则参数为玩家名称,返回该玩家的剩余刀数。\n' + '-' * 10 + '\n例:“查询剩余刀”,返回所有剩余刀数大于0的玩家的剩余刀信息。\n例:“查询剩余刀 3”,返回所有剩余刀数为3的玩家名单。\n例:“查询剩余刀 AAA”,返回玩家AAA的剩余刀数。',
                '18': '<查询预约刀/查询预约>:可选0,1个参数。无参数时返回所有玩家的挂树信息。带一个参数时,若该参数为数字,则参数为boss序号,返回所有预约了该boss的玩家名单;否则参数为玩家名称,返回该玩家的预约信息。\n' + '-' * 10 + '\n例:“查询预约”,返回所有玩家预约信息。\n例:“查询预约 5”,返回所有预约了五王的玩家名单。\n例:“查询预约 AAA”,返回玩家AAA的预约信息。',
                '19': '<查询公会总分>:不接受参数。查询当前公会的战斗总分。',
                '20': '<查询会战详细信息>:不接受参数。返回当前会战信息,包括期数(年月),总时长,已进行天数,所有boss血量上限设置以及所有boss分数倍率设置。',
                '21': '<作业>:可选参数。必选第一个参数“提交”或“删除”或“查询”,若为提交则可选2,3个参数“阶段”“图片”(此时提交为所有boss作业)或“阶段”“boss序号”“图片”(此时提交为指定boss作业),“删除”则必选1个参数“图片”,“查询”则可选1,2个参数“阶段”(查询指定阶段所有boss作业)或“阶段”“boss序号”(查询指定阶段指定boss作业)。依据参数不同操作作业系统。\n' + '-' * 10 + '\n例:“作业 提交 3 【图片】”,将图片保存为阶段3的全boss的作业。\n例:“作业 提交 3 1 【图片】”,将图片保存为阶段3的1号boss的作业。\n例:“作业 删除 【图片】”,将图片从作业库中删除。\n例:“作业 查询 3”,查询阶段3的全boss作业。\n例:“作业 查询 3 1”,查询阶段3的1号boss的作业。',
                },
            '4': {
                '0': '调试用指令:\n1.<@保存会战信息>,2.<@读取会战信息>。',
                '1': '<@保存会战信息>:不接受参数。高权限指令。执行后将所有注册使用公会战插件的群聊的会战信息保存为文件。',
                '2': '<@读取会战信息>:可选接受参数“仅玩家”。高权限指令。执行后从文件中读入会战信息。“仅玩家”参数存在时,仅读取玩家信息,否则读取所有信息。',
                },
            }
        page1 = session.get('page1', prompt=helpdict[page0]['0'] + '\n查询详细参数与效果请输入命令序号。' + '\n输入“0”结束查询。')
        if page1 != '0':
            msg.append(MS.text(helpdict[page0][page1]))
        await session.send(msg)
    except KeyError:
        await session.send(M('页码不存在哦'))
Пример #17
0
async def pixivhelp(session, bot):
    msg = M()
    if session.is_first_run and 'page0' not in session.state.keys():
        tips = M()
        tips.append(MS.text("欢迎使用AzusaBot的pixiv插件。"))
        tips.append(MS.text('本插件所有指令名中字母均为英文大写,参数均以空格分割。\n'))
        tips.append(
            MS.text(
                "-" * 10 +
                "\n目录:1.群r18管理指令,2.PID搜索,3.推荐,4.关键词搜索,5.UID搜索,6.榜单,7.统计信息,8.清理缓存。"
            ))
        await session.send(tips)
    page0 = session.get('page0', prompt='请输入查询的页码哦')
    try:
        helpdict = {
            '1': {
                '0':
                '群r18管理指令:\n1.<禁用pixiv>,2.<启用pixiv>,3.<允许R18>,4.<禁止R18>,5.<允许R18G>,6.<禁止R18G>。',
                '1':
                '<禁用pixiv>:不接受参数。仅群主和管理员可执行。在本群禁用P站插件,不响应所有P站插件指令。',
                '2':
                '<启用pixiv>:不接受参数。仅群主和管理员可执行。在本群启用P站插件。默认为启用。',
                '3':
                '<允许R18>:不接受参数。仅群主和管理员可执行。允许在本群发送R18图像。',
                '4':
                '<禁止R18>:不接受参数。仅群主和管理员可执行。禁止在本群发送R18图像,所有R18图像将被过滤。特别的,<PID搜索>功能将输出除图片外的所有信息。默认为禁止。',
                '5':
                '<允许R18G>:不接受参数。仅群主和管理员可执行。允许在本群发送R18G图像,启用此项必须要先执行<允许R18>。',
                '6':
                '<禁止R18G>:不接受参数。仅群主和管理员可执行。禁止在本群发送R18G图像,所有R18G图像将被过滤。特别的,<PID搜索>功能将输出除图片外的所有信息。默认为禁止。',
            },
            '2': {
                '0':
                'PID搜索:\n1.<PID搜索>,2.<PID搜索评论区>,3.<PID搜索相关>。',
                '1':
                '<PID搜索>:接受至少一个PID参数。可选参数为“多图”“原图”,“多图”参数将指定多图作品全部输出,“原图”参数将指定输出原图。输出ID为PID的图片的所有信息。\n'
                + '-' * 10 + '\n例:“PID搜索 12345678”,将输出ID为12345678的图片的所有信息。',
                '2':
                '<PID搜索评论区>:接受一个PID参数。输出ID为PID的图片的所有评论。\n' + '-' * 10 +
                '\n例:“PID评论区 12345678”,将输出ID为12345678的图片的所有评论。',
                '3':
                '<PID搜索相关>:接受至少一个PID参数。可选参数为“原图”“多图”“收藏x”“页x”。“多图”参数将指定多图作品全部输出,“原图”参数将指定输出原图,“收藏x”将指定输出作品的最小收藏数,“页x”将指定查找结果的页码。输出与ID为PID图片相关的所有图片。\n'
                + '-' * 10 +
                '\n例:“PID搜索相关 12345678”,将输出与ID为12345678的图片相关的所有图片。',
            },
            '3': {
                '0':
                '推荐:\n1.<PIXIV推荐>。\n本系列指令全部拥有可选参数“多图”“原图”“收藏x”“页x”,“多图”参数将指定多图作品全部输出,“原图”参数将指定输出原图,“收藏x”将指定输出作品的最小收藏数,“页x”将指定查找结果的页码。',
                '1':
                '<PIXIV推荐>:接受可选参数。\n' + '-' * 10 + '\n例:“PIXIV推荐”,将输出推荐的所有图片。',
            },
            '4': {
                '0':
                '关键词搜索:\n1.<标签搜索>,2.<精确标签搜索>,3.<标题搜索>,4.<用户搜索>。\n本系列前三个指令全部拥有可选参数“多图”“原图”“收藏x”“页x”;第四个指令拥有可选参数“页x”,“多图”参数将指定多图作品全部输出,“原图”参数将指定输出原图,“收藏x”将指定输出作品的最小收藏数,“页x”将指定查找结果的页码。',
                '1':
                '<标签搜索>:接受至少一个关键字参数。输出以关键字搜索得到的所有图片。\n' + '-' * 10 +
                '\n例:“标签搜索 ロリ”,将输出以“ロリ”为关键字搜索得到的所有图片。',
                '2':
                '<精确标签搜索>:接受一个关键字参数。输出以关键字搜索得到的所有图片。因为禁止模糊匹配,所以应当使用最多一个关键词进行搜索。\n'
                + '-' * 10 + '\n例:“精确标签搜索 ロリ”,将输出以“ロリ”为关键字搜索得到的所有图片。',
                '3':
                '<标题搜索>:接受至少一个关键字参数。输出以关键字搜索得到的标题符合的所有图片。不推荐使用。\n' + '-' * 10 +
                '\n例:“标题搜索 ロリ”,将输出以“ロリ”为关键字搜索得到的所有标题含有“ロリ”的图片。',
                '4':
                '<用户搜索>:接受至少一个关键字参数。输出以关键字搜索得到的所有用户。\n' + '-' * 10 +
                '\n例:“用户搜索 USER”,将输出以“USER”为关键字搜索得到的所有用户。',
            },
            '5': {
                '0':
                'UID搜索:\n1.<UID搜索>,2.<UID搜索作品>,3.<UID搜索关注>,4.<UID搜索好P友>,5.<UID搜索收藏>。',
                '1':
                '<UID搜索>:接受一个UID参数。输出以UID搜索得到的用户信息。\n' + '-' * 10 +
                '\n例:“UID搜索 12345678”,将输出用户12345667的详细信息。',
                '2':
                '<UID搜索作品>:接受至少一个UID参数。可选参数为“多图”“原图”“收藏x”“页x”,“多图”参数将指定多图作品全部输出,“原图”参数将指定输出原图,“收藏x”将指定输出作品的最小收藏数,“页x”将指定查找结果的页码。输出以UID搜索得到的用户的所有作品。\n'
                + '-' * 10 + '\n例:“UID搜索作品 12345678”,输出用户12345678的所有作品。',
                '3':
                '<UID搜索关注>:接受一个UID参数。输出以UID搜索得到的用户的关注信息。\n' + '-' * 10 +
                '\n例:“UID搜索关注 12345678”,将输出用户12345678的关注的用户信息。',
                '4':
                '<UID搜索好P友>:接受一个UID参数。输出以UID搜索得到的用户的好P友信息\n' + '-' * 10 +
                '\n例:“UID搜索好P友 12345678”,将输出用户12345678的所有好P友信息。',
                '5':
                '<UID搜索收藏>:接受至少一个UID参数。可选参数为“多图”“原图”“收藏x”“页x”,“多图”参数将指定多图作品全部输出,“原图”参数将指定输出原图,“收藏x”将指定输出作品的最小收藏数,“页x”将指定查找结果的页码。输出以UID搜索得到的用户的所有收藏作品。\n'
                + '-' * 10 + '\n例:“UID搜索收藏 12345678”,输出用户12345678的所有收藏作品。',
            },
            '6': {
                '0':
                '榜单:\n1.<P站日榜>,2.<P站周榜>,3.<P站月榜>,4.<P站男性向日榜>,5.<P站女性向日榜>,6.<P站原创周榜>,7.<P站新人周榜>,8.<P站R18日榜>,9.<P站R18男性向日榜>,10.<P站R18女性向日榜>,11.<P站R18周榜>,12.<P站R18G周榜>,13.<P站漫画日榜>,14.<P站漫画周榜>,15.<P站漫画月榜>,16.<P站新人漫画周榜>,17.<P站R18漫画日榜>,18.<P站R18漫画周榜>,19.<P站R18G漫画周榜>。\n本系列指令全部拥有可选参数“页x”“xxxx-xx-xx”“多图”“原图”,“页x”参数将指定输出第x页内容,“xxxx-xx-xx”参数将指定以xxxx-xx-xx为日期的搜索(例:2020-01-01),“多图”参数将指定多图作品全部输出,“原图”参数将指定输出原图。',
                '1': '<P站日榜>:输出日排行榜。',
                '2': '<P站周榜>:输出周排行榜。',
                '3': '<P站月榜>:输出月排行榜。',
                '4': '<P站男性向日榜>:输出男性向日排行榜。',
                '5': '<P站女性向日榜>:输出女性向日排行榜。',
                '6': '<P站原创周榜>:输出原创周排行榜。',
                '7': '<P站新人周榜>:输出新人周排行榜。',
                '8': '<P站R18日榜>:输出R18日排行榜。',
                '9': '<P站R18男性向日榜>:输出R18男性向日排行榜。',
                '10': '<P站R18女性向日榜>:输出R18女性向日排行榜。',
                '11': '<P站R18周榜>:输出R18周排行榜。',
                '12': '<P站R18G周榜>:输出R18G周排行榜。',
                '13': '<P站漫画日榜>:输出漫画日排行榜。',
                '14': '<P站漫画周榜>:输出漫画周排行榜。',
                '15': '<P站漫画月榜>:输出漫画月排行榜。',
                '16': '<P站新人漫画周榜>:输出新人漫画周排行榜。',
                '17': '<P站R18漫画日榜>:输出R18漫画日排行榜。',
                '18': '<P站R18漫画周榜>:输出R18漫画周排行榜。',
                '19': '<P站R18G漫画周榜>:输出R18G漫画周排行榜。',
            },
            '7': {
                '0': '统计信息:\n1.<PIXIV本地统计>',
                '1':
                '<PIXIV本地统计>:可选一个参数“详细信息”。默认输出本地存在图片的图库统计信息,使用参数则输出全图库的统计信息。',
            },
            '8': {
                '0': '高权限指令:\n1.<清理P站图片缓存>。',
                '1': '<清理P站图片缓存>:不接受参数。清理所有P站图片缓存。',
            }
        }
        page1 = session.get('page1',
                            prompt=helpdict[page0]['0'] +
                            '\n查询详细参数与效果请输入命令序号。' + '\n输入“0”结束查询。')
        if page1 != '0':
            msg.append(MS.text(helpdict[page0][page1]))
        await session.send(msg)
    except KeyError:
        await session.send(M('页码不存在哦'))
Пример #18
0
async def statistics(session, bot):
    only_file_exist = False if '详细' in session.current_arg_text.strip(
    ) else True
    illusts_stat, users_stat = _pixiv_instance.statistics(only_file_exist)
    msg = M()
    msg.append(MS.text('*' * 20 + '\n'))
    msg.append(MS.text('图片统计:\n'))
    msg.append(MS.text(f'总数:{illusts_stat["total"]}\n'))
    tags_stat_limit = 20
    msg.append(MS.text(f'标签统计(仅显示占比最高的{tags_stat_limit}条):\n'))
    msg.append(MS.text(f'总标签量:{len(illusts_stat["tags_stat"])}\n'))
    for i in range(tags_stat_limit):
        item = illusts_stat['tags_stat'][i]
        msg.append(
            MS.text(
                f'{i+1}:{item[0]}{"(" + item[1] + ")" if item[1] else ""}:总数{item[2]},占比{item[3]}\n'
            ))
    msg.append(MS.text('阅读量统计\n'))
    for k, v in illusts_stat['views_stat'].items():
        msg.append(MS.text(f'阅读量{k}:总数{v["total"]},占比{v["rate"]}\n'))
    msg.append(MS.text('收藏量统计\n'))
    for k, v in illusts_stat['bookmarks_stat'].items():
        msg.append(MS.text(f'收藏量{k}:总数{v["total"]},占比{v["rate"]}\n'))
    msg.append(MS.text('-' * 20 + '\n'))
    msg.append(MS.text('用户统计:\n'))
    msg.append(MS.text(f'总数:{users_stat["total"]}\n'))
    msg.append(MS.text('*' * 20 + '\n'))
    await session.send(msg)
Пример #19
0
async def random_image(event, bot):
    msg = event['raw_message']
    # 处理入口
    entry0 = pattern0.search(msg)
    entry1 = pattern1.search(msg)
    entry2 = pattern2.search(msg)
    entry3 = pattern3.search(msg)
    if entry0 or entry1 or entry2 or entry3:
        useb64 = False if event['self_id'] == SIGNAL['MainQQ'] else True
        if event['message_type'] == 'group':
            r18 = groupdict[event['self_id']][
                event['group_id']]['mods_config']['pixiv']['allowr18']
            r18g = groupdict[event['self_id']][
                event['group_id']]['mods_config']['pixiv']['allowr18g']
        else:
            if event['sub_type'] == 'group':
                r18 = r18g = True
            else:
                r18 = frienddict[event['self_id']][
                    event['user_id']]['mods_config']['pixiv']['allowr18']
                r18g = frienddict[event['self_id']][
                    event['user_id']]['mods_config']['pixiv']['allowr18g']
        if entry0:
            entry = 0
            if '铜图' in msg:
                tags = ('ロリ', '萝莉', 'loli')
                no_image_tips = '没萝莉了'
            else:
                re0 = pattern00.search(msg)
                re1 = pattern01.search(msg)
                if re0:
                    msg00 = re0.group(0)
                    msg01 = re.sub(r'有没有|[要再多]?来一?[点份张]|的?([色涩瑟蛇铜]|射爆?)图', '',
                                   msg00)
                    tags = (msg01, ) if re0 and msg01 else tuple()
                elif re1:
                    msg10 = re1.group(0)
                    msg11 = re.sub(r'的?([色涩瑟蛇铜]|射爆?)图来?', '', msg10)
                    tags = (msg11, ) if re1 and msg11 else tuple()
        elif entry1:
            entry = 1
            if '不够铜' in msg:
                tags = ('ロリ', '萝莉', 'loli')
                no_image_tips = '没萝莉了'
            elif '不够大' in msg:
                tags = ('おっぱい', '魅惑の谷間', '巨乳')
                no_image_tips = '没欧派了'
            else:
                tags = tuple()
        elif entry2:
            entry = 2
            if '铜' in msg:
                tags = ('ロリ', '萝莉', 'loli')
                no_image_tips = '没萝莉了'
            elif '丝' in msg:
                if '黑丝' in msg:
                    tags = ('黒ストッキング', '黒タイツ', '黒ニーソ')
                    no_image_tips = '没黑丝了'
                elif '白丝' in msg:
                    tags = ('白ストッキング', '白タイツ', '白ニーソ')
                    no_image_tips = '没白丝了'
                else:
                    tags = ('ストッキング', 'タイツ', 'ニーソ')
                    no_image_tips = '没丝袜了'
            elif '腿' in msg:
                tags = ('魅惑のふともも', 'ふともも')
                no_image_tips = '没腿了'
            elif '腋' in msg:
                tags = ('腋', '脇')
                no_image_tips = '没腋了'
            elif '尻' in msg or '屁股' in msg:
                tags = ('尻神様', 'ねじ込みたい尻', 'お尻')
                no_image_tips = '没尻了'
            elif '大姐姐' in msg:
                tags = ('むちむち', 'ぽっちゃり')
                no_image_tips = '没大姐姐了'
            elif re.search(r'奶子|奈子|萘子|莱莱|欧派', msg):
                tags = ('おっぱい', '魅惑の谷間', '巨乳')
                no_image_tips = '没欧派了'
            elif '足' in msg:
                tags = ('裸足', '足裏', '足指')
                no_image_tips = '没足了'
            else:
                tags = tuple()
        elif entry3:
            entry = 3
            m = re.sub(r'[再多]?来一?[点份张]', '', msg)
            # 无后缀时使用无效tag以避免发出图片
            tags = (m, ) if m else ('++++++++++++', )
        file, signal = await _pixiv_instance.random_image(tags=tags,
                                                          allowr18=r18,
                                                          allowr18g=r18g,
                                                          useb64=useb64)
        if file:
            msg = M()
            if entry in (1, 2):
                if not signal:
                    msg.append(MS.text(no_image_tips + ',来点铜吧'))
            elif entry in (0, 3):
                if not signal:
                    return
            msg.append(MS.image(file))
            if msg:
                if event['message_type'] == 'group':
                    await bot.send_group_msg(self_id=event['self_id'],
                                             group_id=event['group_id'],
                                             message=msg)
                else:
                    await bot.send_private_msg(self_id=event['self_id'],
                                               user_id=event['user_id'],
                                               message=msg)
                return 1
        return 0
Пример #20
0
async def pid_search_detail(session, bot):
    original = session.state['original']
    multiimage = session.state['multiimage']
    pid = session.get('pid', prompt='请输入想查询的PID')
    r18, r18g = await _getperm(session)
    useb64 = False if session.self_id == SIGNAL['MainQQ'] else True
    await session.send(M(f'开始搜索图片{pid}'))
    try:
        await refreshtoken()
        pids = await _pixiv_instance.illust_detail(pid,
                                                   original_image=original,
                                                   multiimage=multiimage,
                                                   allowr18=r18,
                                                   allowr18g=r18g)
    except InfoNotFoundError:
        await session.send(M('未查询到信息'))
    except PixivError as e:
        await session.send(M('插件出错'))
        raise e
    else:
        msg = M()
        for illust in _pixiv_instance.getpics(pids, useb64):
            msg.append(MS.text(f'作品名: {illust["title"]}\n'))
            msg.append(MS.text(f'作品ID: {illust["id"]}\n'))
            msg.append(MS.text(f'作品类型: {illust["type"]}\n'))
            msg.append(MS.text(f'作品页数: {illust["count"]}\n'))
            msg.append(MS.text(f'作品创作时间(JST): {illust["time"]}\n'))
            msg.append(
                MS.text(
                    f'作品标签: {",".join([i["name"] + "(" + i["translated_name"] + ")" if i["translated_name"] is not None else i["name"] for i in illust["tags"]])}\n'
                ))
            msg.append(MS.text(f'作者名: {illust["author_name"]}\n'))
            msg.append(MS.text(f'作者ID: {illust["author_id"]}\n'))
            msg.append(MS.text(f'阅览人数: {illust["views"]}\n'))
            msg.append(MS.text(f'收藏数: {illust["bookmarks"]}\n'))
            msg.append(MS.text(f'评论数: {illust["comments"]}\n'))
            if SIGNAL['RegisteredQQ'][
                    session.self_id]['coolq_edition'] == 'pro':
                if ('R-18' in str(illust['tags'])
                        or 'R18' in str(illust['tags'])) and not r18:
                    break
                elif ('R-18G' in str(illust['tags'])
                      or 'R18G' in str(illust['tags'])) and not r18g:
                    break
                msglimit = 20
                msgcurrent = 0
                files = illust['files']['original'] if original else illust[
                    'files']['large']
                if multiimage:
                    for file in files:
                        msgcurrent += 1
                        if msgcurrent >= msglimit:
                            await session.send(msg)
                            msgcurrent = 1
                            msg.clear()
                        msg.append(MS.image(file))
                else:
                    msg.append(MS.image(files[0]))
        if msg:
            await session.send(msg)
    finally:
        await session.send(M(f'搜索图片{pid}完毕'))
Пример #21
0
import random
from datetime import timedelta

import nonebot
from nonebot import on_command, message_preprocessor, Message, MessageSegment
from nonebot.command import parse_command
from nonebot.message import _check_calling_me_nickname

from hoshino import logger, util
from hoshino.service import Service
from hoshino.res import R

bot = nonebot.get_bot()
BLANK_MESSAGE = Message(MessageSegment.text(''))

@message_preprocessor
async def black_filter(bot, ctx):
    first_msg_seg = ctx['message'][0]
    if first_msg_seg.type == 'hb':
        return  # pass normal Luck Money Pack to avoid abuse
    if ctx['message_type'] == 'group' and Service.check_block_group(ctx['group_id']) \
       or Service.check_block_user(ctx['user_id']):
        ctx['message'] = BLANK_MESSAGE


def _check_hbtitle_is_cmd(ctx, title):
    ctx = ctx.copy()    # 复制一份,避免影响原有的ctx
    ctx['message'] = Message(title)
    _check_calling_me_nickname(bot, ctx)
    cmd, _ = parse_command(bot, str(ctx['message']).lstrip())
    return bool(cmd)
Пример #22
0
async def admin_only_func(event, bot):
    count = 0
    # 正式的消息处理
    selfid = event['self_id']
    senderid = event['user_id']
    groupid = event['group_id']
    # 分割文本信息,at信息,图片信息等等
    allmsg = event['message']
    msgtext = []
    msgat = []
    for msg in allmsg:
        if msg['type'] == 'text':
            msgtext.append(msg['data']['text'])
        elif msg['type'] == 'at' and msg['data']['qq'] != 'all':
            msgat.append(int(msg['data']['qq']))
        elif msg['type'] == 'image':
            pass
    msg = M()
    # “一带一路”功能,允许一个群成员选择另一个群成员一起被禁言,时长控制为1-9分钟
    msgtextstr = ''.join(msgtext)
    if '一带一路' in msgtextstr and msgat:
        if groupdict[selfid][groupid]['member'][selfid]['role'] <= groupdict[
                selfid][groupid]['member'][senderid]['role']:
            msg.append(MS.text('权限狗无法参与(请自裁'))
        else:
            if len(msgat) > 1:
                msg.append(MS.text('是不是太贪心了呢'))
            elif senderid == msgat[0]:
                msg.append(MS.text('你成功促进了自己的经济发展'))
            elif groupdict[selfid][groupid]['member'][selfid][
                    'role'] > groupdict[selfid][groupid]['member'][
                        msgat[0]]['role']:
                msg.append(MS.text('你成功带动了'))
                msg.append(MS.at(msgat[0]))
                msg.append(MS.text('的经济发展'))
                await bot.set_group_ban(self_id=selfid,
                                        group_id=groupid,
                                        user_id=msgat[0],
                                        duration=random.randint(1, 9) * 60)
            else:
                msg.append(MS.text('没有符合帮扶政策的群员,你将独享'))
            await bot.set_group_ban(self_id=selfid,
                                    group_id=groupid,
                                    user_id=senderid,
                                    duration=random.randint(1, 9) * 60)
        if msg:
            await bot.send_group_msg(self_id=selfid,
                                     group_id=groupid,
                                     message=msg)
        count += 1
    # “抽奖”功能,允许一个群成员禁言自己,娱乐用,时长控制为1-9分钟
    if re.match(r'.*抽.*奖.*', msgtextstr):
        if groupdict[selfid][groupid]['member'][selfid]['role'] <= groupdict[
                selfid][groupid]['member'][senderid]['role']:
            msg.append(MS.text('权限狗无法参与(请自裁'))
        # “大抽奖”功能,抽奖升级版,时长控制为4-8小时
        elif re.match(r'.*[大带(da)].*抽.*奖.*', msgtextstr):
            await bot.set_group_ban(self_id=selfid,
                                    group_id=groupid,
                                    user_id=senderid,
                                    duration=random.randint(240, 480) * 60)
        else:
            await bot.set_group_ban(self_id=selfid,
                                    group_id=groupid,
                                    user_id=senderid,
                                    duration=random.randint(1, 9) * 60)
        if msg:
            await bot.send_group_msg(self_id=selfid,
                                     group_id=groupid,
                                     message=msg)
        count += 1
    return 1 if count > 0 else 0
Пример #23
0
 def build(cls, text: str):
     if text.startswith('@'):
         if text[1:].isdecimal():
             return MessageSegment.at(int(text[1:]))
     else:
         return MessageSegment.text(text)
Пример #24
0
async def chp(session: CommandSession):
    await session.send(MessageSegment.text(await fang_chp()))
Пример #25
0
async def help(session, bot):
    plugins = list(filter(lambda p: p.name, get_loaded_plugins()))
    arg = session.current_arg_text.strip().lower()
    if not arg:
        msg = M()
        msg.append(MS.text('欢迎使用AzusaBot!\n'))
        msg.append(
            MS.text('Azusa现在启用的模块有:' +
                    ','.join(i for i in bot.config.LOAD_MODULES) + '\n'))
        msg.append(
            MS.text(
                '群主及管理员可控制群聊中插件的开关。使用指令“disable_<模块名>”(例:disable_chat)可在本群禁用对应模块的功能。\n'
            ))
        msg.append(
            MS.text('Azusa现在启用的功能有:' + ','.join(p.name
                                                for p in plugins) + '\n'))
        msg.append(MS.text('查询详细帮助请使用指令“帮助 <功能名>”(例:“帮助 公主连结公会战”)\n'))
        msg.append(MS.text('-' * 20))
        msg.append(MS.text('常用功能(无法禁用):\n'))
        msg.append(MS.text('手动复读<echo>。复读参数。例:“echo ABC”,复读ABC。\n'))
        msg.append(MS.text('骰子<dice/骰子>。为自己及at到的人(群聊)进行随机骰点。\n'))
        msg.append(
            MS.text('查询插件状态<query_modules_status/查询插件状态>。查询对应的群或者个人的插件状态。\n'))
        if session.event['user_id'] in bot.config.SUPERUSERS:
            msg.append(MS.text('-' * 20))
            msg.append(MS.text('测试指令<test>。仅superuser可以使用。\n'))
            msg.append(
                MS.text(
                    '数据保存<datasave>。仅superuser可以使用。执行所有的save命令,额外保存群与好友的模块控制开关信息。\n'
                ))
            msg.append(
                MS.text(
                    '数据读取<dataload>。仅superuser可以使用。执行所有的load命令。额外读取群与好友的模块控制开关信息,会覆盖现有信息。\n'
                ))
            msg.append(
                MS.text(
                    '重置主要QQ<resetmain/重置主QQ>。仅superuser可以使用。确保在主QQ无法登录(封禁等)且不用重启Azusa的情况下重新设置主QQ。\n'
                ))
            msg.append(
                MS.text(
                    '设置用户黑名单<set_user_blacklist/添加到用户黑名单>。仅superuser可以使用。将用户添加到黑名单。\n'
                ))
            msg.append(
                MS.text(
                    '设置群黑名单<set_group_blacklist/添加到群黑名单>。仅superuser可以使用。将群添加到黑名单。\n'
                ))
            msg.append(
                MS.text(
                    '取消用户黑名单<del_user_blacklist/删除用户黑名单>。仅superuser可以使用。将用户从黑名单中删除。\n'
                ))
            msg.append(
                MS.text(
                    '取消群黑名单<del_group_blacklist/删除群黑名单>。仅superuser可以使用。将群从黑名单中删除。\n'
                ))
            msg.append(
                MS.text(
                    '查询黑名单<query_blacklist/查询黑名单>。仅superuser可以使用。查询黑名单内容。\n'))
            msg.append(MS.text('退出机器人<_exit>。仅superuser可以使用。退出机器人并保存所有信息。'))
        await session.send(msg)
        return
    for p in plugins:
        if p.name.lower() == arg:
            await session.send(M(p.usage))
Пример #26
0
async def vote(s: CommandSession, user, group, user_in_group, state):
    parser = ArgumentParser(session=s, usage=USAGE)
    parser.add_argument(
        'command',
        choices=['list', 'new', 'yea', 'nay', 'commit', 'count', 'announce'])
    parser.add_argument('ITEM')
    parser.add_argument('extra', nargs='?')
    args = parser.parse_args(s.argv)

    name = args.ITEM.strip()
    db: orm.Session = orm.getSession()
    vote_item = db.query(VoteItem).filter(VoteItem.GroupId == group.GroupId,
                                          VoteItem.Name == name).one_or_none()
    try:
        if args.command == 'list':
            msg = Message("List of available vote items:\n")
            items = None
            if args.extra == 'all':
                # Extract all items
                items = db.query(VoteItem).filter(
                    VoteItem.GroupId == group.GroupId).all()
            else:
                # Extract active items
                items = db.query(VoteItem).filter(
                    VoteItem.GroupId == group.GroupId,
                    VoteItem.Committed == False).all()
            for item in items:
                msg.append(
                    MessageSegment.text(
                        f"'{item.Name}' - {item.Description}\n"))
            await s.send(msg)

        elif args.command == 'new':
            if not vote_item:
                if not args.extra:
                    desc = f"Vote on {name}"
                else:
                    desc = args.extra
                item = VoteItem(GroupId=group.GroupId,
                                ProposerId=user.UserId,
                                Name=name,
                                Committed=False,
                                Description=desc)
                db.add(item)
                db.commit()
                await s.send(
                    f"Vote item '{item.Description}' ({item.Name}) created.",
                    at_sender=True)
            else:
                await s.send(f"Vote item '{vote_item.Name}' already exisist.",
                             at_sender=True)
        elif args.command == 'yea':
            if not vote_item:
                raise _VoteItemNotFound()
            if vote_item.Committed:
                raise _VoteClosed()
            vote = db.query(Vote).filter(
                Vote.Item == vote_item.Id,
                Vote.Voter == user.UserId).one_or_none()
            if not vote:
                vote = Vote(Item=vote_item.Id,
                            Voter=user.UserId,
                            Ballot=_BALLOT_YEA)
                db.add(vote)
            else:
                vote.Ballot = _BALLOT_YEA
            db.commit()
            await s.send(
                f"You voted YES to '{vote_item.Description}' ({vote_item.Name}).",
                at_sender=True)

        elif args.command == 'nay':
            if not vote_item:
                raise _VoteItemNotFound
            if vote_item.Committed:
                raise _VoteClosed
            vote = db.query(Vote).filter(
                Vote.Item == vote_item.Id,
                Vote.Voter == user.UserId).one_or_none()
            if not vote:
                vote = Vote(Item=vote_item.Id,
                            Voter=user.UserId,
                            Ballot=_BALLOT_NAY)
                db.add(vote)
            else:
                vote.Ballot = _BALLOT_NAY
            db.commit()
            await s.send(
                f"You voted NO to '{vote_item.Description}' ({vote_item.Name}).",
                at_sender=True)

        elif args.command == 'commit':
            if not vote_item:
                raise _VoteItemNotFound()
            if vote_item.ProposerId != user.UserId:
                raise _NotVoteOwner()
            vote_item.Committed = True
            db.commit()
            await s.send(
                f"You concluded vote item '{vote_item.Description}' ({vote_item.Name}).",
                at_sender=True)

        elif args.command == 'count':
            if not vote_item:
                raise _VoteItemNotFound
            total_count = db.query(Vote).filter(
                Vote.Item == vote_item.Id).count()
            positives = db.query(Vote).filter(
                Vote.Item == vote_item.Id, Vote.Ballot == _BALLOT_YEA).count()
            await s.send(
                f"Vote item '{vote_item.Description}' ({vote_item.Name}) got {positives} YES among {total_count} votes."
            )

        elif args.command == 'announce':
            if not vote_item:
                raise _VoteItemNotFound
            total_count = db.query(Vote).filter(
                Vote.Item == vote_item.Id).count()
            # proposer = db.query(orm.User).filter(orm.User.UserId==vote_item.ProposerId).one()
            positives = db.query(Vote).filter(
                Vote.Item == vote_item.Id, Vote.Ballot == _BALLOT_YEA).all()
            # positives = db.query(Vote, orm.User) \
            #               .join(Vote.Voter == orm.User.UserId) \
            #               .filter(Item=vote_item.Id, Ballot=_BALLOT_YEA) \
            #               .all()
            msg = nonebot.Message(
                f"Vote item '{vote_item.Description}' ({vote_item.Name}) initiated by "
            )
            msg.append(MessageSegment.at(vote_item.ProposerId))
            msg.append(
                MessageSegment.text(
                    f" got {len(positives)} YES among {total_count} votes. "))
            msg.append(
                MessageSegment.text(
                    f"The following users in favor of the item:"))
            segs = [
                nonebot.MessageSegment.at(vote.Voter) for vote in positives
            ]
            for seg in segs:
                msg.append(seg)
            await s.send(msg)
        else:
            raise Exception

    except _VoteItemNotFound:
        await s.send(f"Vote item '{name}' does not exist.", at_sender=True)

    except _NotVoteOwner:
        await s.send(f"You does not own vote item '{name}'.", at_sender=True)

    except _VoteClosed:
        await s.send(f"Voting for '{name}' is already closed.", at_sender=True)
Пример #27
0
async def uid_search_detail(session, bot):
    uid = session.get('uid', prompt='请输入想查询的UID')
    await session.send(M(f'开始搜索用户{uid}的详细信息'))
    try:
        await refreshtoken()
        uids = await _pixiv_instance.user_detail(uid)
    except InfoNotFoundError:
        await session.send(M('未查询到信息'))
    except PixivError as e:
        await session.send(M('插件出错'))
        raise e
    else:
        msg = M()
        useb64 = False if session.self_id == SIGNAL['MainQQ'] else True
        for user in _pixiv_instance.getusers(uids, useb64):
            msg.append(MS.text(f'用户名:{user["user"]["name"]}\n'))
            msg.append(MS.text(f'用户ID:{user["user"]["id"]}\n'))
            d = {
                'user': {
                    'profile_image':
                    '用户头像' if 'profile_image' in user['user'].keys() else '',
                    'comment':
                    '自我介绍' if 'comment' in user['user'].keys() else '',
                },
                'profile': {
                    'webpage':
                    '网站' if 'webpage' in user['profile'].keys() else '',
                    'gender':
                    '性别' if 'gender' in user['profile'].keys() else '',
                    'job':
                    '职业' if 'job' in user['profile'].keys() else '',
                    'region':
                    '国家或地区' if 'region' in user['profile'].keys() else '',
                    'total_follow_users':
                    '关注的人数'
                    if 'total_follow_users' in user['profile'].keys() else '',
                    'total_mypixiv_users':
                    '好P友人数'
                    if 'total_mypixiv_users' in user['profile'].keys() else '',
                    'total_illusts':
                    '创作插画数'
                    if 'total_illusts' in user['profile'].keys() else '',
                    'total_manga':
                    '创作漫画数' if 'total_manga' in user['profile'].keys() else '',
                    'total_novels':
                    '创作小说数'
                    if 'total_novels' in user['profile'].keys() else '',
                    'total_illust_bookmarks_public':
                    '公开收藏作品数' if 'total_illust_bookmarks_public'
                    in user['profile'].keys() else '',
                    'total_illust_series':
                    '创作系列插画数'
                    if 'total_illust_series' in user['profile'].keys() else '',
                    'total_novel_series':
                    '创作系列漫画数'
                    if 'total_novel_series' in user['profile'].keys() else '',
                    'background_image':
                    '个人资料背景图'
                    if 'background_image' in user['profile'].keys() else '',
                    'twitter_account':
                    'twitter帐号'
                    if 'twitter_account' in user['profile'].keys() else '',
                    'twitter_url':
                    'twitter链接地址'
                    if 'twitter_url' in user['profile'].keys() else '',
                    'pawoo_url':
                    'pawoo链接地址'
                    if 'pawoo_url' in user['profile'].keys() else '',
                },
                'workspace': {
                    'pc':
                    '电脑' if 'pc' in user['workspace'].keys() else '',
                    'monitor':
                    '显示器' if 'monitor' in user['workspace'].keys() else '',
                    'tool':
                    '软件' if 'tool' in user['workspace'].keys() else '',
                    'scanner':
                    '扫描仪' if 'scanner' in user['workspace'].keys() else '',
                    'tablet':
                    '数位板' if 'tablet' in user['workspace'].keys() else '',
                    'mouse':
                    '鼠标' if 'mouse' in user['workspace'].keys() else '',
                    'printer':
                    '打印机' if 'printer' in user['workspace'].keys() else '',
                    'desktop':
                    '桌子上的东西' if 'desktop' in user['workspace'].keys() else '',
                    'music':
                    '绘图时听的音乐' if 'music' in user['workspace'].keys() else '',
                    'desk':
                    '桌子' if 'desk' in user['workspace'].keys() else '',
                    'chair':
                    '椅子' if 'chair' in user['workspace'].keys() else '',
                    'comment':
                    '其他' if 'comment' in user['workspace'].keys() else '',
                    'workspace_image':
                    '工作环境图'
                    if 'workspace_image' in user['workspace'].keys() else '',
                }
            }
            for k, v in d.items():
                for k1 in v.keys():
                    if user[k][k1]:
                        if 'image' not in k1:
                            msg.append(MS.text(f'{d[k][k1]}:{user[k][k1]}\n'))
                        elif 'image' in k1 and SIGNAL['RegisteredQQ'][
                                session.self_id]['coolq_edition'] == 'pro':
                            msg.append(MS.text(f'{d[k][k1]}:'))
                            msg.append(MS.image(user[k][k1]))
                            msg.append(MS.text('\n'))
        await session.send(msg)
    finally:
        await session.send(M(f'搜索用户{uid}的详细信息完成'))