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)
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)
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)
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('[图片出错]')
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('[不支持的协议]')
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}评论区完毕'))
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
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)
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('[图片]')
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('[图片]')
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('[图片出错]')
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)
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)
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)
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: 挑选涩图时发生异常')
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('页码不存在哦'))
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('页码不存在哦'))
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)
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
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}完毕'))
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)
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
def build(cls, text: str): if text.startswith('@'): if text[1:].isdecimal(): return MessageSegment.at(int(text[1:])) else: return MessageSegment.text(text)
async def chp(session: CommandSession): await session.send(MessageSegment.text(await fang_chp()))
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))
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)
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}的详细信息完成'))