新增对话式查询武器和原魔,添加鹿野院平藏材料,修复深渊登场率

This commit is contained in:
CMHopeSunshine 2022-05-24 17:36:07 +08:00
parent ec5fa675c1
commit c04406ceb0
5 changed files with 98 additions and 28 deletions

View File

@ -3,6 +3,7 @@ import random
from nonebot import on_regex, on_command, logger from nonebot import on_regex, on_command, logger
from nonebot.matcher import matchers from nonebot.matcher import matchers
from nonebot.rule import Rule from nonebot.rule import Rule
from nonebot import get_driver
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent, MessageSegment from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent, MessageSegment
from nonebot.exception import FinishedException from nonebot.exception import FinishedException
@ -11,6 +12,8 @@ from utils.auth_util import FreqLimiter2
from utils.message_util import MessageBuild from utils.message_util import MessageBuild
from utils.file_handler import load_json_from_url from utils.file_handler import load_json_from_url
driver = get_driver()
voice_url = 'https://static.cherishmoon.fun/LittlePaimon/voice/' voice_url = 'https://static.cherishmoon.fun/LittlePaimon/voice/'
chat_lmt = FreqLimiter2(60) chat_lmt = FreqLimiter2(60)
@ -27,8 +30,8 @@ def check_group(event: GroupMessageEvent) -> bool:
async def update_paimon_voice(event: MessageEvent): async def update_paimon_voice(event: MessageEvent):
try: try:
old_len = len([m for m in matchers[10] if m.plugin_name == 'Paimon_Chat']) old_len = len([m for m in matchers[10] if m.plugin_name == 'Paimon_Chat'])
voice_list = await load_json_from_url('https://static.cherishmoon.fun/LittlePaimon/voice/voice_list.json')
matchers[10] = [m for m in matchers[10] if m.plugin_name != 'Paimon_Chat'] matchers[10] = [m for m in matchers[10] if m.plugin_name != 'Paimon_Chat']
voice_list = load_json_from_url('https://static.cherishmoon.fun/LittlePaimon/voice/voice_list.json')
for key, value in voice_list.items(): for key, value in voice_list.items():
create_matcher(key, value['pattern'], value['cooldown'], value['pro'], value['files']) create_matcher(key, value['pattern'], value['cooldown'], value['pro'], value['files'])
new_len = len(voice_list) - old_len new_len = len(voice_list) - old_len
@ -65,6 +68,8 @@ def create_matcher(chat_word: str, pattern: str, cooldown: int, pro: float, resp
logger.error('派蒙发送语音失败', e) logger.error('派蒙发送语音失败', e)
voice_list = load_json_from_url('https://static.cherishmoon.fun/LittlePaimon/voice/voice_list.json') @driver.on_startup
for k, v in voice_list.items(): async def load_voice():
create_matcher(k, v['pattern'], v['cooldown'], v['pro'], v['files']) voice_list = await load_json_from_url('https://static.cherishmoon.fun/LittlePaimon/voice/voice_list.json')
for k, v in voice_list.items():
create_matcher(k, v['pattern'], v['cooldown'], v['pro'], v['files'])

View File

@ -3,12 +3,13 @@ import re
import time import time
from nonebot import on_endswith, on_command, on_regex from nonebot import on_endswith, on_command, on_regex
from nonebot.adapters.onebot.v11 import MessageSegment, MessageEvent from nonebot.adapters.onebot.v11 import MessageEvent, Message, MessageSegment
from nonebot.params import RegexDict from nonebot.params import RegexDict
from nonebot.typing import T_State
from utils.character_alias import get_id_by_alias from utils.character_alias import get_id_by_alias
from utils.decorator import exception_handler from utils.decorator import exception_handler
from utils.message_util import MessageBuild from utils.message_util import MessageBuild, match_alias
from .abyss_rate_draw import draw_rate_rank, draw_teams_rate from .abyss_rate_draw import draw_rate_rank, draw_teams_rate
from .blue import get_blue_pic from .blue import get_blue_pic
@ -54,7 +55,7 @@ async def genshin_guide(event: MessageEvent):
async def genshin_material(event: MessageEvent): async def genshin_material(event: MessageEvent):
name: str = event.message.extract_plain_text().replace('角色材料', '').strip() name: str = event.message.extract_plain_text().replace('角色材料', '').strip()
realname = get_id_by_alias(name) realname = get_id_by_alias(name)
if name in ['夜兰', '久岐忍'] or realname: if name in ['夜兰', '久岐忍', '鹿野院平藏'] or realname:
name = realname[1][0] if realname else name name = realname[1][0] if realname else name
await material.finish(await MessageBuild.StaticImage(f'LittlePaimon/RoleMaterials/{name}材料.jpg')) await material.finish(await MessageBuild.StaticImage(f'LittlePaimon/RoleMaterials/{name}材料.jpg'))
else: else:
@ -132,15 +133,55 @@ async def abyss_team_handler(event: MessageEvent, reGroup=RegexDict()):
await abyss_team.finish(abyss_img) await abyss_team.finish(abyss_img)
@weapon_guide.handle() def create_choice_command(endswith: str, type_: str, url: str, file_type: str = 'jpg'):
@exception_handler() command = on_endswith(endswith, priority=6, block=False)
async def weapon_guide_handler(event: MessageEvent):
name: str = event.message.extract_plain_text().replace('武器攻略', '').strip() @command.handle()
await weapon_guide.finish(await MessageBuild.StaticImage(url=f'LittlePaimon/WeaponGuild/{name}.png')) async def _(event: MessageEvent, state: T_State):
name = event.message.extract_plain_text().replace(endswith, '').strip()
if name:
state['name'] = name
@command.got('name', prompt=f'请把要查询的{endswith[0:2]}告诉我哦~')
async def _(event: MessageEvent, state: T_State):
name = state['name']
if isinstance(name, Message):
name = name.extract_plain_text().strip()
if name == 'q':
await command.finish()
finally_name = await match_alias(name, type_)
if isinstance(finally_name, str):
await command.finish(await MessageBuild.StaticImage(url=url + finally_name + '.' + file_type))
elif isinstance(finally_name, list):
if not finally_name:
await command.finish(f'没有该{endswith[0:2]}的信息哦,问一个别的吧~')
else:
if 'choice' not in state:
msg = f'你要找的{endswith[0:2]}是哪个呀:\n'
msg += '\n'.join([f'{int(i) + 1}. {name}' for i, name in enumerate(finally_name)])
await command.send(msg + '\n回答\"q\"可以取消查询')
state['match_alias'] = finally_name
@command.got('choice')
async def _(event: MessageEvent, state: T_State):
match_alias = state['match_alias']
choice = state['choice']
choice = choice.extract_plain_text().strip()
if choice == 'q':
await command.finish()
if choice.isdigit() and (1 <= int(choice) <= len(match_alias)):
await command.finish(
await MessageBuild.StaticImage(url=url + match_alias[int(choice) - 1] + '.' + file_type))
if choice not in match_alias:
state['times'] = state['times'] + 1 if 'times' in state else 1
if state['times'] >= 3:
await command.finish(f'看来旅行者您有点神志不清哦(,下次再问派蒙吧' + MessageSegment.face(146))
elif state['times'] == 1:
await command.reject(f'请旅行者从上面的{endswith[0:2]}中选一个问派蒙\n回答\"q\"可以取消查询')
elif state['times'] == 2:
await command.reject(f'别调戏派蒙啦,快选一个吧,不想问了麻烦回答\"q\"')
await command.finish(await MessageBuild.StaticImage(url=url + choice + '.' + file_type))
@monster_map.handle() create_choice_command('原魔图鉴', 'monsters', 'LittlePaimon/MonsterMaps/', 'jpg')
@exception_handler() create_choice_command('武器攻略', 'weapons', 'LittlePaimon/WeaponGuild/', 'png')
async def monster_map_handler(event: MessageEvent):
name = event.message.extract_plain_text().replace('原魔图鉴', '').strip()
await monster_map.finish(await MessageBuild.StaticImage(url=f'LittlePaimon/MonsterMaps/{name}.jpg'))

View File

@ -37,9 +37,8 @@ async def draw_rate_rank(type: str = 'role', mode: str = 'used'):
role_draw.text((28 if len(role['rate']) == 6 else 38, 158), role['rate'], font=get_font(30), fill='black') role_draw.text((28 if len(role['rate']) == 6 else 38, 158), role['rate'], font=get_font(30), fill='black')
bg_img.alpha_composite(role_img, (50 + 204 * (n % 5), 180 + 240 * int(n / 5))) bg_img.alpha_composite(role_img, (50 + 204 * (n % 5), 180 + 240 * int(n / 5)))
n += 1 n += 1
bg_img = pil2b64(bg_img, 75)
bg_img = MessageSegment.image(bg_img) return MessageBuild.Image(bg_img, quality=75)
return bg_img
async def draw_teams_rate(floor='上半半'): async def draw_teams_rate(floor='上半半'):

View File

@ -1,9 +1,9 @@
import json import json
import requests
from pathlib import Path from pathlib import Path
from typing import Union, Optional, Tuple from typing import Union, Optional, Tuple
from ssl import SSLCertVerificationError from ssl import SSLCertVerificationError
from PIL import Image from PIL import Image
from utils import aiorequests
def load_image( def load_image(
@ -37,12 +37,18 @@ def load_json(file: str = None, path: Union[Path, str] = None, encoding: str = '
return json.load(path.open('r', encoding=encoding)) return json.load(path.open('r', encoding=encoding))
def load_json_from_url(url: str): async def load_json_from_url(url: str, encoding: str = 'utf-8', refresh: bool = False):
try: if 'static.cherishmoon.fun' in url:
resp = requests.get(url) url_path = Path() / 'data' / url.split('static.cherishmoon.fun/')[1]
except SSLCertVerificationError: if refresh or not url_path.exists():
resp = requests.get(url.replace('https', 'http')) try:
return resp.json() resp = await aiorequests.get(url)
except SSLCertVerificationError:
resp = await aiorequests.get(url.replace('https', 'http'))
save_json(resp.json(), path=url_path, encoding=encoding)
return resp.json()
else:
return load_json(path=url_path, encoding=encoding)
def save_json(data, file: str = None, path: Union[Path, str] = None, encoding: str = 'utf-8'): def save_json(data, file: str = None, path: Union[Path, str] = None, encoding: str = 'utf-8'):

View File

@ -1,5 +1,6 @@
import re import re
import base64 import base64
import difflib
from PIL import Image from PIL import Image
from pathlib import Path from pathlib import Path
@ -10,7 +11,7 @@ from nonebot import get_bot, logger
from nonebot.adapters.onebot.v11 import MessageEvent, Message, MessageSegment from nonebot.adapters.onebot.v11 import MessageEvent, Message, MessageSegment
from .db_util import get_last_query, update_last_query from .db_util import get_last_query, update_last_query
from .file_handler import load_image from .file_handler import load_image, load_json_from_url
from . import aiorequests from . import aiorequests
@ -132,3 +133,21 @@ def get_message_id(event):
return event.group_id return event.group_id
elif event.message_type == 'guild': elif event.message_type == 'guild':
return event.channel_id return event.channel_id
async def match_alias(msg: str, type: str = 'weapons') -> Union[str, list]:
alias_file = await load_json_from_url(url='https://static.cherishmoon.fun/LittlePaimon/alias.json')
alias_list = alias_file[type]
if type == 'weapons':
possible = []
for name, alias in alias_list.items():
match_list = difflib.get_close_matches(msg, alias, cutoff=0.4, n=5)
if msg in match_list:
return name
elif match_list:
possible.append(name)
return possible
elif type == 'monsters':
match_list = difflib.get_close_matches(msg, alias_list, cutoff=0.4, n=5)
return match_list[0] if len(match_list) == 1 else match_list