From e4f6c34cc75963bc62c7184fdf840403eb36769a Mon Sep 17 00:00:00 2001 From: CMHopeSunshine <277073121@qq.com> Date: Thu, 9 Jun 2022 21:57:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B8=AE=E5=8A=A9=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Guess_voice/__init__.py | 14 ++++ Paimon_Calender/__init__.py | 10 +++ Paimon_Chat/__init__.py | 2 + Paimon_Gacha/__init__.py | 22 ++++++ Paimon_Gacha_Log/__init__.py | 20 ++++++ Paimon_Info/__init__.py | 61 +++++++++++++++- Paimon_Plugins/__init__.py | 33 +++++---- Paimon_Plugins/couplets.py | 10 +++ Paimon_Plugins/news.py | 10 +++ Paimon_Plugins/order.py | 11 +++ Paimon_Plugins/paimon_help.py | 131 ++++++++++++++++++++++++++++++++++ Paimon_Plugins/random_img.py | 15 ++++ Paimon_Wiki/__init__.py | 24 +++++-- README.md | 2 + res/help/bg.jpg | Bin 0 -> 28446 bytes 15 files changed, 341 insertions(+), 24 deletions(-) create mode 100644 Paimon_Plugins/paimon_help.py create mode 100644 res/help/bg.jpg diff --git a/Guess_voice/__init__.py b/Guess_voice/__init__.py index 63434c5..b8c31d2 100644 --- a/Guess_voice/__init__.py +++ b/Guess_voice/__init__.py @@ -16,9 +16,23 @@ setting_time = config.paimon_guess_voice # 游戏持续时间 dir_name = Path() / 'data' / 'LittlePaimon' / 'guess_voice' / 'voice' +__paimon_help__ = { + 'type': '娱乐', + 'range': ['group'] +} guess_game = on_command('原神猜语音', priority=12, block=True) +guess_game.__paimon_help__ = { + "usage": "原神猜语音[语言]", + "introduce": "来一起猜语音吧", + "priority": 5 +} ys_voice = on_command('原神语音', priority=12, block=True) +ys_voice.__paimon_help__ = { + "usage": "原神语音[语言]<角色名>", + "introduce": "随机发一条该角色的语音", + "priority": 6 +} update_ys_voice = on_command('更新原神语音资源', priority=12, permission=SUPERUSER, block=True) diff --git a/Paimon_Calender/__init__.py b/Paimon_Calender/__init__.py index c509795..eb49484 100644 --- a/Paimon_Calender/__init__.py +++ b/Paimon_Calender/__init__.py @@ -16,7 +16,17 @@ HELP_STR = ''' 原神日历 status : 查看本群日历推送设置 '''.strip() +__paimon_help__ = { + 'type': '原神Wiki', + 'range': ['private', 'group', 'guild'] +} + calendar = on_command('原神日历', aliases={"原神日历", 'ysrl', '原神日程'}, priority=24, block=True) +calendar.__paimon_help__ = { + "usage": "原神日历", + "introduce": "查看原神活动日历,后加on时间/off可以开启定时推送", + "priority": 99 +} scheduler = require('nonebot_plugin_apscheduler').scheduler diff --git a/Paimon_Chat/__init__.py b/Paimon_Chat/__init__.py index 2d55894..4f23a9a 100644 --- a/Paimon_Chat/__init__.py +++ b/Paimon_Chat/__init__.py @@ -26,6 +26,8 @@ chat_lmt = FreqLimiter2(60) update_voice = on_command('更新派蒙语音', priority=2) +# TODO 被动效果 + def check_group(event: GroupMessageEvent) -> bool: if event.group_id in config.paimon_chat_group: diff --git a/Paimon_Gacha/__init__.py b/Paimon_Gacha/__init__.py index 157179a..f2dddc7 100644 --- a/Paimon_Gacha/__init__.py +++ b/Paimon_Gacha/__init__.py @@ -23,12 +23,34 @@ __usage__ = ''' ''' __help_version__ = '1.0.1' +__paimon_help__ = { + 'type': '原神模拟抽卡', + 'range': ['private', 'group', 'guild'] +} + sim_gacha = on_regex(r'^抽((?P\d+)|(?:.*))十连(?P.*?)$', priority=5, block=True) +sim_gacha.__paimon_help__ = { + "usage": "抽[数量]十连[卡池]", + "introduce": "模拟抽卡,池有角色1|角色2|武器|常驻|菜单", + "priority": 1 +} + show_log = on_command('模拟抽卡记录', aliases={'查看模拟抽卡记录'}, priority=5, block=True) +show_log.__paimon_help__ = { + "usage": "模拟抽卡记录[角色|武器]", + "introduce": "查看你的模拟抽卡记录,前加删除可以删除记录", + "priority": 2 +} + delete_log = on_command('删除模拟抽卡记录', priority=5, block=True) show_dg = on_command('查看定轨', priority=5, block=True) delete_dg = on_command('删除定轨', priority=5, block=True) choose_dg = on_command('选择定轨', priority=5, block=True) +choose_dg.__paimon_help__ = { + "usage": "选择定轨<武器名>", + "introduce": "模拟抽卡定轨,另有 查看|删除定轨", + "priority": 3 +} lmt_group = FreqLimiter(config.paimon_gacha_cd_group) lmt_user = FreqLimiter(config.paimon_gacha_cd_user) diff --git a/Paimon_Gacha_Log/__init__.py b/Paimon_Gacha_Log/__init__.py index cf049b1..581025f 100644 --- a/Paimon_Gacha_Log/__init__.py +++ b/Paimon_Gacha_Log/__init__.py @@ -20,10 +20,30 @@ __usage__ = ''' ''' __help_version__ = '0.9.0' +__paimon_help__ = { + 'type': '原神抽卡记录', + 'range': ['private', 'group', 'guild'] +} + gacha_log_export = on_command('ckjldc', aliases={'抽卡记录导出', '导出抽卡记录'}, priority=5, block=True) +gacha_log_export.__paimon_help__ = { + "usage": "抽卡记录导出(uid)", + "introduce": "将抽卡记录导出到群文件中", + "priority": 3 +} gacha_log_update = on_command('ckjlgx', aliases={'抽卡记录更新', '更新抽卡记录', '获取抽卡记录'}, priority=5, block=True) +gacha_log_update.__paimon_help__ = { + "usage": "获取抽卡记录<链接>(uid)", + "introduce": "从抽卡链接获取抽卡记录,抽卡链接通过祈愿页面断网取得", + "priority": 1 +} gacha_log_show = on_command('ckjl', aliases={'抽卡记录', '查看抽卡记录'}, priority=5, block=True) +gacha_log_show.__paimon_help__ = { + "usage": "查看抽卡记录(uid)", + "introduce": "查看你的抽卡记录分析", + "priority": 2 +} data_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'user_data', 'gacha_log_data') if not os.path.exists(data_path): diff --git a/Paimon_Info/__init__.py b/Paimon_Info/__init__.py index 2b04255..71ea77e 100644 --- a/Paimon_Info/__init__.py +++ b/Paimon_Info/__init__.py @@ -59,23 +59,78 @@ __usage__ = ''' [添加公共ck cookie]添加公共cookie以供大众查询*仅管理员 ''' +__paimon_help__ = { + 'type': '原神信息查询', + 'range': ['private', 'group', 'guild'] +} + __help_version__ = '1.1.0' sy = on_command('sy', aliases={'深渊信息', '深境螺旋信息'}, priority=7, block=True) +sy.__paimon_help__ = { + "usage": "sy[层数](uid)", + "introduce": "查看深渊战绩信息", + "priority": 6 +} ssbq = on_command('ssbq', aliases={'实时便笺', '实时便签', '当前树脂'}, priority=7, block=True) +ssbq.__paimon_help__ = { + "usage": "ssbq(uid)", + "introduce": "*查看当前树脂、洞天宝钱、派遣状况等", + "priority": 7 +} myzj = on_command('myzj', aliases={'札记信息', '每月札记'}, priority=7, block=True) +myzj.__paimon_help__ = { + "usage": "myzj[月份](uid)", + "introduce": "*查看该月份获得的原石、摩拉数", + "priority": 8 +} ys = on_command('ys', aliases={'原神卡片', '个人卡片'}, priority=7, block=True) +ys.__paimon_help__ = { + "usage": "ys(uid)", + "introduce": "查看原神个人卡片(宝箱、探索度等)", + "priority": 1 +} ysa = on_command('ysa', aliases={'角色背包'}, priority=7, block=True) +ysa.__paimon_help__ = { + "usage": "ysa(uid)", + "introduce": "查看原神公开角色的简略信息", + "priority": 2 +} ysc = on_command('ysc', aliases={'角色卡片'}, priority=7, block=True) +ysc.__paimon_help__ = { + "usage": "ysc<角色名>(uid)", + "introduce": "查看原神指定角色的简略信息", + "priority": 3 +} ysb = on_command('ysb', aliases={'原神绑定', '绑定cookie'}, priority=7, block=True) +ysb.__paimon_help__ = { + "usage": "ysb", + "introduce": "绑定私人cookie以开启更多功能", + "priority": 99 +} mys_sign = on_command('mys_sign', aliases={'mys签到', '米游社签到'}, priority=7, block=True) mys_sign_auto = on_command('mys_sign_auto', aliases={'mys自动签到', '米游社自动签到'}, priority=7, block=True) +mys_sign_auto.__paimon_help__ = { + "usage": "mys自动签到", + "introduce": "*米游社原神区自动签到奖励获取", + "priority": 9 +} mys_sign_all = on_command('mys_sign_all', aliases={'全部重签'}, priority=1, permission=SUPERUSER, rule=to_me(), block=True) update_all = on_command('update_all', aliases={'更新全部玩家'}, priority=1, permission=SUPERUSER, rule=to_me(), block=True) add_public_ck = on_command('add_ck', aliases={'添加公共cookie', '添加公共ck'}, permission=SUPERUSER, priority=7, block=True) delete_ck = on_command('delete_ck', aliases={'删除ck', '删除cookie'}, priority=7, block=True) update_info = on_command('udi', aliases={'更新角色信息', '更新角色面板', '更新玩家信息'}, priority=6, block=True) +update_info.__paimon_help__ = { + "usage": "更新角色信息(uid)", + "introduce": "更新游戏内展柜8个角色的面板信息,以便使用ysd指令", + "priority": 5 +} role_info = on_command('角色面板', aliases={'角色详情', '角色信息', 'ysd'}, block=True, priority=7) +role_info.__paimon_help__ = { + "usage": "ysd<角色名>(uid)", + "introduce": "查看指定角色的详细面板信息", + "priority": 4 +} @sy.handle() @@ -411,15 +466,15 @@ async def mys_sign_auto_handler(event: MessageEvent, msg: Message = CommandArg() await mys_sign_auto.finish('请把正确的需要帮忙签到的uid给派蒙哦!', at_sender=True) else: uid = find_uid.group('uid') - find_action = re.search(r'(?P开启|启用|打开|关闭|禁用)', msg) + find_action = re.search(r'(?P开启|启用|打开|关闭|禁用|on|off)', msg) if find_action: - if find_action.group('action') in ['开启', '启用', '打开']: + if find_action.group('action') in ['开启', '启用', '打开', 'on']: cookie = await get_private_cookie(uid, key='uid') if not cookie: await mys_sign_auto.finish('你的该uid还没绑定cookie哦,先用ysb绑定吧!', at_sender=True) await add_auto_sign(str(event.user_id), uid, str(event.group_id)) await mys_sign_auto.finish('开启米游社自动签到成功,派蒙会在每日0点帮你签到', at_sender=True) - elif find_action.group('action') in ['关闭', '禁用']: + elif find_action.group('action') in ['关闭', '禁用', 'off']: await delete_auto_sign(str(event.user_id), uid) await mys_sign_auto.finish('关闭米游社自动签到成功', at_sender=True) else: diff --git a/Paimon_Plugins/__init__.py b/Paimon_Plugins/__init__.py index 5ca4798..9f61fd9 100644 --- a/Paimon_Plugins/__init__.py +++ b/Paimon_Plugins/__init__.py @@ -1,21 +1,26 @@ -# 点餐功能 -from .order import * - -# 新闻功能 -from .news import * - -# 随机图片功能 -from .random_img import * - -# 处理好友和群请求功能 -from .auto_handle import * - -# 对联功能 -from .couplets import * +# # 点餐功能 +# from .order import * +# +# # 新闻功能 +# from .news import * +# +# # 随机图片功能 +# from .random_img import * +# +# # 处理好友和群请求功能 +# from .auto_handle import * +# +# # 对联功能 +# from .couplets import * +# +# from .help import help_ # 如果不需要某项功能,将其from xx import * 注释掉即可 +from nonebot import load_plugins +import os +load_plugins(os.path.dirname(__file__)) diff --git a/Paimon_Plugins/couplets.py b/Paimon_Plugins/couplets.py index 07ea549..301f369 100644 --- a/Paimon_Plugins/couplets.py +++ b/Paimon_Plugins/couplets.py @@ -7,7 +7,17 @@ from utils.message_util import get_message_id from utils.config import config from utils import aiorequests +__paimon_help__ = { + 'type': '娱乐', + 'range': ['private', 'group', 'guild'] +} + couplets = on_command('对联', aliases={'对对联'}, priority=13, block=True) +couplets.__paimon_help__ = { + "usage": "对对联 <对联内容>", + "introduce": "人工智能和你对对联", + "priority": 8 + } couplets_limit = FreqLimiter(config.paimon_couplets_cd) diff --git a/Paimon_Plugins/news.py b/Paimon_Plugins/news.py index 8cc7f4c..3acee7b 100644 --- a/Paimon_Plugins/news.py +++ b/Paimon_Plugins/news.py @@ -6,7 +6,17 @@ from utils import aiorequests from utils.file_handler import load_json, save_json from utils.message_util import get_message_id +__paimon_help__ = { + 'type': '娱乐', + 'range': ['private', 'group', 'guild'] +} + news60s_pic = on_command('早报', aliases={'今日早报', '今日新闻', '60s读世界'}, priority=13, block=True) +news60s_pic.__paimon_help__ = { + "usage": "今日早报", + "introduce": "获取60秒读世界早报,后加on时间/off可以开启/关闭推送", + "priority": 10 +} scheduler = require('nonebot_plugin_apscheduler').scheduler diff --git a/Paimon_Plugins/order.py b/Paimon_Plugins/order.py index 53ff790..3c3132b 100644 --- a/Paimon_Plugins/order.py +++ b/Paimon_Plugins/order.py @@ -5,7 +5,18 @@ from nonebot.adapters.onebot.v11 import Message, MessageEvent, MessageSegment from utils.auth_util import FreqLimiter from utils import aiorequests +__paimon_help__ = { + 'type': '娱乐', + 'range': ['private', 'group', 'guild'] +} + order_pic = on_command('点菜', aliases={'点餐', '食谱', '我想吃'}, priority=13, block=True) +order_pic.__paimon_help__ = { + "usage": "点餐<食品名>", + "introduce": "群主,来一份派蒙!", + "priority": 11 +} + order_lmt = FreqLimiter(10) diff --git a/Paimon_Plugins/paimon_help.py b/Paimon_Plugins/paimon_help.py new file mode 100644 index 0000000..a62a3a6 --- /dev/null +++ b/Paimon_Plugins/paimon_help.py @@ -0,0 +1,131 @@ +from pathlib import Path +from PIL import Image, ImageDraw, ImageFont +from typing import Dict, List +from nonebot import on_command +from nonebot import plugin as nb_plugin +from nonebot.params import Depends +from nonebot.adapters.onebot.v11 import MessageEvent + +from utils.message_util import MessageBuild + +__version__ = 'v1.0.0' + +__paimon_help__ = { + 'type': '工具', + 'range': ['private', 'group', 'guild'] +} + +help_ = on_command('help', aliases={'帮助菜单'}, priority=1, block=True) +help_.__paimon_help__ = { + "usage": "帮助菜单|help", + "introduce": "查看派蒙的帮助信息", + "priority": 99 +} + +font_path = Path(__file__).parent.parent / 'res' +res_path = Path(__file__).parent.parent / 'res' / 'help' + + +def get_font(size, font='hywh.ttf') -> ImageFont: + return ImageFont.truetype(str(font_path / font), size=size) + + +# 绘制带阴影的文字 +def draw_shadow_text(draw: ImageDraw, pos: tuple, text: str, font: ImageFont, color: tuple, shadow_color: tuple, + shadow_offset: tuple = (1, 1)): + draw.text(pos, text, font=font, fill=shadow_color) + draw.text((pos[0] - shadow_offset[0], pos[1] - shadow_offset[1]), text, font=font, fill=color) + + +def draw_table(title: str, funcs: List[dict], total_width: int): + row = len(funcs) // 3 if not len(funcs) % 3 else len(funcs) // 3 + 1 + total_height = 120 + row * 160 + bg_color = (100, 100, 100, 100) + title_color = (40, 40, 40, 125) + usage_color = (255, 255, 255, 255) + introduce_color = (200, 200, 200, 255) + radius = 50 + bg = Image.new('RGBA', (total_width, total_height), (0, 0, 0, 0)) + bg_draw = ImageDraw.Draw(bg) + + bg_draw.ellipse((0, 0, radius, radius), fill=bg_color) + bg_draw.ellipse((total_width - radius, 0, total_width, radius), fill=bg_color) + bg_draw.ellipse((0, total_height - radius, radius, total_height), fill=bg_color) + bg_draw.ellipse((total_width - radius, total_height - radius, total_width, total_height), fill=bg_color) + bg_draw.rectangle((radius / 2, 0, total_width - radius / 2, total_height), fill=bg_color) + bg_draw.rectangle((0, radius / 2, total_width, total_height - radius / 2), fill=bg_color) + + draw_shadow_text(bg_draw, (50, 23), title, get_font(50), (255, 255, 255), (0, 0, 0, 255), (2, 2)) + i = 0 + for func in funcs: + x = (i % 3) * (total_width / 3) + 4 + y = 100 + (i // 3) * 160 + 4 + bg_draw.rectangle((x, y, x + total_width / 3 - 8, y + 160 - 8), fill=title_color) + bg_draw.text((x + 7, y + 7), func['usage'], font=get_font(36), fill=usage_color) + # 如果introduce长度大于15, 就分多行绘制 + if len(func['introduce']) > 15: + bg_draw.text((x + 10, y + 60), func['introduce'][:15], font=get_font(30), fill=introduce_color) + bg_draw.text((x + 10, y + 90), func['introduce'][15:], font=get_font(30), fill=introduce_color) + else: + bg_draw.text((x + 10, y + 60), func['introduce'], font=get_font(30), fill=introduce_color) + i += 1 + return row, bg + + +def draw_help_info(help_info: dict): + total_height = 400 + len(help_info) * 150 - 50 + for m in help_info: + total_height += 160 * len(help_info[m]) // 3 + if len(help_info[m]) % 3: + total_height += 160 + total_height += 150 + img = Image.new('RGBA', (1500, total_height), color=(255, 255, 255, 255)) + bg_img = Image.open(str(res_path / 'bg.jpg')).convert('RGBA').resize((1500, total_height)) + img.paste(bg_img, (0, 0), bg_img) + draw = ImageDraw.Draw(img) + draw_shadow_text(draw, (50, 50), '派蒙帮助', get_font(140), (255, 255, 255), (0, 0, 0, 255), (3, 3)) + draw_shadow_text(draw, (610, 140), __version__, get_font(50), (255, 255, 255), (0, 0, 0, 255), (3, 3)) + draw_shadow_text(draw, (520, 250), '<>内为必须,[]内为可选,()内只需要第一次', get_font(50), (255, 255, 255), (0, 0, 0, 255), (2, 2)) + draw_shadow_text(draw, (620, 300), '描述前带*号说明需要绑定私人cookie', get_font(50), (255, 255, 255), (0, 0, 0, 255), (2, 2)) + n = 400 + for type, func_list in help_info.items(): + row, table = draw_table(type, func_list, 1500 - 100) + img.alpha_composite(table, (50, n)) + n += 170 + row * 160 + draw_shadow_text(draw, (800, n + 15), 'Created by LittlePaimon', get_font(50), (255, 255, 255), (0, 0, 0, 255), (2, 2)) + return MessageBuild.Image(img, size=0.7, mode='RGB', quality=80) + + +async def get_all_plugin(event: MessageEvent) -> dict: + plugin_list = nb_plugin.get_loaded_plugins() + help_info: Dict[str, List[dict]] = {} + for plugin in plugin_list: + try: + plugin_info = plugin.module.__getattribute__('__paimon_help__') + except AttributeError: + plugin_info = {'type': '其他', 'range': ['private', 'group', 'guild']} + if event.message_type not in plugin_info['range']: + continue + if plugin_info['type'] not in help_info: + help_info[plugin_info['type']] = [] + matchers = plugin.matcher + for matcher in matchers: + try: + matchers_info = matcher.__paimon_help__ + if 'priority' not in matchers_info: + matchers_info['priority'] = 99 + help_info[plugin_info['type']].append(matchers_info) + except AttributeError: + pass + help_info = {k: v for k, v in help_info.items() if v} + if not help_info: + await help_.finish('当前没有已加载的插件哦') + for m in help_info: + help_info[m].sort(key=lambda x: x['priority']) + help_info = dict(sorted(help_info.items(), key=lambda x: len(x[1]), reverse=True)) + return help_info + + +@help_.handle() +async def _(event: MessageEvent, help_info: dict = Depends(get_all_plugin)): + await help_.finish(draw_help_info(help_info)) diff --git a/Paimon_Plugins/random_img.py b/Paimon_Plugins/random_img.py index 4a2048d..d1b7cc7 100644 --- a/Paimon_Plugins/random_img.py +++ b/Paimon_Plugins/random_img.py @@ -7,12 +7,27 @@ from utils.auth_util import FreqLimiter from utils.message_util import get_message_id from utils.decorator import auto_withdraw +__paimon_help__ = { + 'type': '娱乐', + 'range': ['private', 'group', 'guild'] +} + cat_lmt = FreqLimiter(config.paimon_cat_cd) ecy_lmt = FreqLimiter(config.paimon_ecy_cd) ys_lmt = FreqLimiter(config.paimon_ysp_cd) cat_img = on_command('猫图', aliases={'来点猫片', '看看猫猫', '来个猫猫'}, priority=13, block=True) +cat_img.__paimon_help__ = { + "usage": "来点猫片", + "introduce": "谁会拒绝可爱的猫猫图呢", + "priority": 13 +} ecy_img = on_regex(r'^来点(二次元|二刺螈|银发|兽耳|星空|竖屏|横屏)图?$', priority=13, block=True) +ecy_img.__paimon_help__ = { + "usage": "来点<类型>图", + "introduce": "懂得都懂,类型有原神|二次元|二刺螈|银发|兽耳|星空|竖屏|横屏", + "priority": 13 +} ys_img = on_command('原神壁纸', aliases={'来点原神图', '来点原神壁纸'}, priority=13, block=True) diff --git a/Paimon_Wiki/__init__.py b/Paimon_Wiki/__init__.py index 632d824..8b531ff 100644 --- a/Paimon_Wiki/__init__.py +++ b/Paimon_Wiki/__init__.py @@ -23,6 +23,10 @@ __usage__ = ''' 7.[深渊上半/下半阵容出场率]查看2.6深渊阵容出场率 ''' __help_version__ = '1.0.4' +__paimon_help__ = { + 'type': '原神Wiki', + 'range': ['private', 'group', 'guild'] +} res_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'res') @@ -96,8 +100,14 @@ async def abyss_team_handler(event: MessageEvent, reGroup=RegexDict()): await abyss_team.finish(abyss_img) -def create_choice_command(endswith: str, type_: str, url: str, tips: str = None): +def create_choice_command(endswith: str, type_: str, url: str, tips: str = None, help_tips: str = None): command = on_endswith(endswith, priority=6, block=True) + command.plugin_name = 'Paimon_Wiki' + command.__paimon_help__ = { + "usage": f'<{help_tips}名> ' + endswith, + "introduce": f"查看该{help_tips}的{endswith}", + "priority": 3 + } @command.handle() async def _(event: MessageEvent, state: T_State): @@ -105,7 +115,7 @@ def create_choice_command(endswith: str, type_: str, url: str, tips: str = None) if name: state['name'] = name - @command.got('name', prompt=f'请把要查询的{endswith[0:2]}告诉我哦~') + @command.got('name', prompt=f'请把要查询的{help_tips}告诉我哦~') async def _(event: MessageEvent, state: T_State): name = state['name'] if isinstance(name, Message): @@ -153,8 +163,8 @@ def create_choice_command(endswith: str, type_: str, url: str, tips: str = None) await command.finish(await MessageBuild.StaticImage(url=url.format(choice), tips=tips.format(choice))) -create_choice_command('原魔图鉴', 'monsters', 'LittlePaimon/MonsterMaps/{}.jpg', '暂时没有{}的原魔图鉴哦~') -create_choice_command('武器攻略', 'weapons', 'LittlePaimon/WeaponGuild/{}.png', '暂时没有{}的武器攻略哦~') -create_choice_command('角色攻略', 'roles', 'LittlePaimon/XFGuide/{}.jpg', '暂时没有{}的角色攻略哦~') -create_choice_command('角色材料', 'roles', 'LittlePaimon/RoleMaterials/{}材料.jpg', '暂时没有{}的角色材料哦~') -create_choice_command('收益曲线', 'roles', 'LittlePaimon/blue/{}.jpg', '暂时没有{}的收益曲线哦~') +create_choice_command('原魔图鉴', 'monsters', 'LittlePaimon/MonsterMaps/{}.jpg', '暂时没有{}的原魔图鉴哦~', '原魔') +create_choice_command('武器攻略', 'weapons', 'LittlePaimon/WeaponGuild/{}.png', '暂时没有{}的武器攻略哦~', '武器') +create_choice_command('角色攻略', 'roles', 'LittlePaimon/XFGuide/{}.jpg', '暂时没有{}的角色攻略哦~', '角色') +create_choice_command('角色材料', 'roles', 'LittlePaimon/RoleMaterials/{}材料.jpg', '暂时没有{}的角色材料哦~', '角色') +create_choice_command('收益曲线', 'roles', 'LittlePaimon/blue/{}.jpg', '暂时没有{}的收益曲线哦~', '角色') diff --git a/README.md b/README.md index 724ec47..fc70ed7 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,8 @@ - 修复`模拟抽卡定轨`和`抽卡记录导出`bug + 6.7 - 修复`原神猜语音`和`模拟抽卡`因`nonebot2.0.0b3`版本Union校验产生的bug,但`原神猜语音`将暂时无法私聊使用 ++ 6.9 + - 新增`帮助菜单`指令~~(不太好看,继续美化)~~ ## 丨功能列表 diff --git a/res/help/bg.jpg b/res/help/bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e420a09691a70c5d02fc48bf9c628acf628d1afe GIT binary patch literal 28446 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 literal 0 HcmV?d00001