async def common_pixiv_rank(session, mode: str): commandname = session.event['raw_message'].split(' ')[0] page = session.state['page'] date = session.state['date'] minbookmarks = session.state['min_bookmarks'] original = session.state['original'] multiimage = session.state['multiimage'] r18, r18g = await _getperm(session) if date: year, month, day = [int(i) for i in date.split('-')] date_str = f'{year}年{month}月{day}日' await session.send(M(f'开始搜索{date_str}的{commandname}第{page}页数据')) else: await session.send(M(f'开始搜索{commandname}第{page}页数据')) try: await refreshtoken() pids = await _pixiv_instance.illust_ranking(mode=mode, page=page, date=date, min_bookmarks=minbookmarks, 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: await common_multiimage_msgsender(session, pids) finally: await session.send(M(f'搜索{commandname}第{page}页数据完毕'))
async def uid_search_bookmarks(session, bot): type = session.state['type'] page = session.state['page'] minbookmarks = session.state['min_bookmarks'] original = session.state['original'] multiimage = session.state['multiimage'] uid = session.get('uid', prompt='请输入想查询的UID') r18, r18g = await _getperm(session) await session.send(M(f'开始搜索用户{uid}的收藏作品第{page}页数据')) try: await refreshtoken() pids = await _pixiv_instance.user_bookmarks_illust( uid, type=type, page=page, min_bookmarks=minbookmarks, 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: await common_multiimage_msgsender(session, pids) finally: await session.send(M(f'搜索用户{uid}的收藏作品第{page}页完毕'))
async def recommend(session, bot): type = session.state['type'] page = session.state['page'] minbookmarks = session.state['min_bookmarks'] original = session.state['original'] multiimage = session.state['multiimage'] r18, r18g = await _getperm(session) await session.send(M(f'开始搜索推荐第{page}页数据')) try: await refreshtoken() pids = await _pixiv_instance.illust_recommended( type=type, page=page, min_bookmarks=minbookmarks, 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: await common_multiimage_msgsender(session, pids, original, multiimage) finally: await session.send(M(f'搜索推荐第{page}页完毕'))
async def common_keywords_search(session, search_target: str): type = session.state['type'] page = session.state['page'] minbookmarks = session.state['min_bookmarks'] original = session.state['original'] multiimage = session.state['multiimage'] keywords = session.get('keywords', prompt='输入关键词') r18, r18g = await _getperm(session) await session.send(M(f'开始搜索关键词“{keywords}”第{page}页数据')) try: await refreshtoken() pids = await _pixiv_instance.search_illust(keywords, type=type, page=page, search_target=search_target, min_bookmarks=minbookmarks, 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: await common_multiimage_msgsender(session, pids, original, multiimage) finally: await session.send(M(f'搜索关键词“{keywords}”第{page}页完毕'))
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}评论区完毕'))
async def disabler18g(session, bot): selfid = session.self_id if session.event['message_type'] == 'group': groupid = session.event['group_id'] groupdict[selfid][groupid]['mods_config']['pixiv']['allowr18g'] = False await session.send(M(f'群{groupid}已禁止R18G图像')) else: userid = session.event['user_id'] frienddict[selfid][userid]['mods_config']['pixiv']['allowr18g'] = False await session.send(M(f'用户{userid}已禁止R18G图像'))
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 users_search(session, bot): page = session.state['page'] keywords = session.get('keywords', prompt='输入关键词') await session.send(M(f'开始依据关键词“{keywords}”搜索用户')) try: await refreshtoken() uids = await _pixiv_instance.search_user(keywords, page=page) except InfoNotFoundError: await session.send(M('未查询到信息')) except PixivError as e: await session.send(M('插件出错')) raise e else: await common_multiuser_msgsender(session, uids) finally: await session.send(M(f'依据关键词“{keywords}”搜索搜索用户第{page}页完毕'))
async def disable_pcr(session, bot): selfid = session.self_id groupid = session.event['group_id'] groupdict[selfid][groupid]['mods_config']['pcr']['disable'] = True await session.send(M(f'已在群{groupid}禁用pcr模块')) logger.info( f'group {groupid} call Azusa.modules.pcr disable_pcr successfully')
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 uid_search_mypixiv(session, bot): page = session.state['page'] uid = session.get('uid', prompt='请输入想查询的UID') await session.send(M(f'开始搜索用户{uid}的好P友第{page}页数据')) try: await refreshtoken() uids = await _pixiv_instance.user_mypixiv(uid, page=page) except InfoNotFoundError: await session.send(M('未查询到信息')) except PixivError as e: await session.send(M('插件出错')) raise e else: await common_multiuser_msgsender(session, uids) finally: await session.send(M(f'搜索用户{uid}的好P友第{page}页完毕'))
async def enable_chat(session, bot): selfid = session.self_id groupid = session.event['group_id'] groupdict[selfid][groupid]['mods_config']['chat']['disable'] = False await session.send(M(f'已在群{groupid}启用chat模块')) logger.info( f'group {groupid} call Azusa.modules.chat disable_chat successfully')
async def common_uid_parser(session): """ uid参数解析器,获取一个uid参数 """ paramList = session.current_arg_text.strip().split(' ') if paramList[0] == '': paramList = [] if session.is_first_run: try: session.state['uid'] = int(paramList[0]) except (IndexError, ValueError): pass elif not paramList: session.pause(M('请输入有效的uid')) else: try: session.state['uid'] = int(paramList[0]) except ValueError: session.pause(M('参数必须是数字'))
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 datasave(session, bot): selfid = session.self_id for cmd in CommandManager().commands: if 'datasave' not in cmd and 'save' in repr(cmd): await call_command(bot, session.event, cmd) try: mods_config = {} for selfid in groupdict.keys(): mods_config[str(selfid)] = { 'group': {k: v['mods_config'] for k, v in groupdict[selfid].items()}, 'private': {k: v['mods_config'] for k, v in frienddict[selfid].items()}, } datastorage.save('data', mods_config) await session.send(M('所有信息保存完成')) except Exception as e: await session.send(M('保存出现错误,请检查日志')) raise e
async def common_keywords_search_parser(session): stripped_args = session.current_arg_text.strip() stripped_args = re_keywords_search_parser_object.sub( '', stripped_args).strip() if session.is_first_run: await common_type_page_minbookmarks_original_multiimage_parser(session) if stripped_args: session.state['keywords'] = stripped_args elif not stripped_args: session.pause(M('关键词不能为空')) else: session.state['keywords'] = stripped_args
async def users_search_parser(session): stripped_args = session.current_arg_text.strip() if session.is_first_run: re_page = re_page_object.search(stripped_args) session.state['page'] = int(re_page.group(0)[1:]) if re_page else 1 stripped_args = re_page_object.sub('', stripped_args).strip() if stripped_args: session.state['keywords'] = stripped_args elif not stripped_args: session.pause(M('关键词不能为空')) else: session.state['keywords'] = stripped_args
async def dataload(session, bot): selfid = session.self_id for cmd in CommandManager().commands: if 'dataload' not in cmd and 'load' in repr(cmd): await call_command(bot, session.event, cmd) mods_config = datastorage.load('data') for k in groupdict[selfid].keys(): try: groupdict[selfid][k]['mods_config'].update( mods_config[str(selfid)]['group'][str(k)]) except KeyError: pass for k in frienddict[selfid].keys(): try: frienddict[selfid][k]['mods_config'].update( mods_config[str(selfid)]['private'][str(k)]) except KeyError: pass await session.send(M('所有信息读取完成'))
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 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)
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 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 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 test(session, bot): await session.send(M(str(session.event)))
async def echo(session, bot): msg = M(session.current_arg_text.strip()) await session.send(msg)
async def exit(session, bot): await session.send(M('Azusa即将退出...')) try: sys.exit() finally: await call_command(bot, session.event, 'datasave')
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}的详细信息完成'))
async def del_group_blacklist(session, bot): ids = await get_id(session) for id in ids: BLACKLIST['group'].discard(id) await session.send(M(f'将{",".join([str(i) for i in ids])}从群黑名单移除。'))
async def set_group_blacklist(session, bot): ids = await get_id(session) BLACKLIST['group'].update(ids) await session.send(M(f'将{",".join([str(i) for i in ids])}添加到群聊黑名单。'))
async def resetmain(session, bot): selfid = session.self_id SIGNAL['MainQQ'] = selfid await session.send(M(f'重置主要QQ为{selfid}'))