2022-11-23 14:56:07 +00:00
|
|
|
import asyncio
|
2023-03-14 01:27:22 +00:00
|
|
|
from typing import Awaitable, Dict, List, cast
|
2022-08-06 09:07:47 +00:00
|
|
|
from uuid import uuid4
|
|
|
|
|
2022-12-04 11:56:39 +00:00
|
|
|
from telegram import (
|
2023-03-14 01:27:22 +00:00
|
|
|
InlineQuery,
|
2022-12-04 11:56:39 +00:00
|
|
|
InlineQueryResultArticle,
|
2023-03-14 01:27:22 +00:00
|
|
|
InlineQueryResultCachedPhoto,
|
2023-04-26 08:48:05 +00:00
|
|
|
InlineQueryResultCachedDocument,
|
2022-12-04 11:56:39 +00:00
|
|
|
InputTextMessageContent,
|
|
|
|
Update,
|
|
|
|
)
|
2022-08-06 09:07:47 +00:00
|
|
|
from telegram.constants import ParseMode
|
|
|
|
from telegram.error import BadRequest
|
2022-09-08 01:08:37 +00:00
|
|
|
from telegram.ext import CallbackContext, InlineQueryHandler
|
2022-08-06 09:07:47 +00:00
|
|
|
|
2023-03-14 01:27:22 +00:00
|
|
|
from core.plugin import Plugin, handler
|
|
|
|
from core.services.search.services import SearchServices
|
|
|
|
from core.services.wiki.services import WikiService
|
2022-09-08 01:08:37 +00:00
|
|
|
from utils.log import logger
|
2022-08-06 09:07:47 +00:00
|
|
|
|
|
|
|
|
2022-09-08 01:08:37 +00:00
|
|
|
class Inline(Plugin):
|
2022-08-06 09:07:47 +00:00
|
|
|
"""Inline模块"""
|
|
|
|
|
2022-11-23 14:56:07 +00:00
|
|
|
def __init__(
|
|
|
|
self,
|
2023-03-14 01:27:22 +00:00
|
|
|
wiki_service: WikiService,
|
|
|
|
search_service: SearchServices,
|
2022-11-23 14:56:07 +00:00
|
|
|
):
|
2022-08-06 09:07:47 +00:00
|
|
|
self.wiki_service = wiki_service
|
2022-11-23 14:56:07 +00:00
|
|
|
self.weapons_list: List[Dict[str, str]] = []
|
|
|
|
self.characters_list: List[Dict[str, str]] = []
|
|
|
|
self.refresh_task: List[Awaitable] = []
|
2022-12-04 11:56:39 +00:00
|
|
|
self.search_service = search_service
|
2022-11-23 14:56:07 +00:00
|
|
|
|
2023-03-14 01:27:22 +00:00
|
|
|
async def initialize(self):
|
2022-11-23 14:56:07 +00:00
|
|
|
async def task_characters():
|
|
|
|
logger.info("Inline 模块正在获取角色列表")
|
2023-04-26 08:48:05 +00:00
|
|
|
datas: Dict[str, str] = {}
|
|
|
|
for character in self.wiki_service.character.all_avatars:
|
|
|
|
if not character.icon:
|
|
|
|
logger.warning(f"角色 {character.name} 无图标")
|
2022-11-23 15:02:34 +00:00
|
|
|
continue
|
2023-04-26 08:48:05 +00:00
|
|
|
datas[character.name] = character.icon
|
|
|
|
for character in self.wiki_service.raider.get_name_list():
|
|
|
|
if character in datas:
|
|
|
|
self.characters_list.append({"name": character, "icon": datas[character]})
|
|
|
|
else:
|
|
|
|
for key, value in datas.items():
|
|
|
|
if character.startswith(key):
|
|
|
|
self.characters_list.append({"name": character, "icon": value})
|
|
|
|
break
|
2022-11-23 14:56:07 +00:00
|
|
|
logger.success("Inline 模块获取角色列表成功")
|
|
|
|
|
|
|
|
self.refresh_task.append(asyncio.create_task(task_characters()))
|
2022-08-06 09:07:47 +00:00
|
|
|
|
2022-09-08 01:08:37 +00:00
|
|
|
@handler(InlineQueryHandler, block=False)
|
2023-03-14 01:27:22 +00:00
|
|
|
async def inline_query(self, update: Update, _: CallbackContext) -> None:
|
2022-08-06 09:07:47 +00:00
|
|
|
user = update.effective_user
|
|
|
|
ilq = cast(InlineQuery, update.inline_query)
|
|
|
|
query = ilq.query
|
2022-11-23 14:56:07 +00:00
|
|
|
logger.info("用户 %s[%s] inline_query 查询\nquery[%s]", user.full_name, user.id, query)
|
2022-08-06 09:07:47 +00:00
|
|
|
switch_pm_text = "需要帮助嘛?"
|
|
|
|
results_list = []
|
|
|
|
args = query.split(" ")
|
|
|
|
if args[0] == "":
|
2022-12-04 11:56:39 +00:00
|
|
|
results_list.append(
|
|
|
|
InlineQueryResultArticle(
|
|
|
|
id=str(uuid4()),
|
|
|
|
title="角色攻略查询",
|
|
|
|
description="输入角色名即可查询角色攻略",
|
|
|
|
input_message_content=InputTextMessageContent("角色攻略查询"),
|
|
|
|
)
|
|
|
|
)
|
2022-08-06 09:07:47 +00:00
|
|
|
else:
|
2023-04-26 08:48:05 +00:00
|
|
|
if args[0] == "查看角色攻略列表并查询":
|
2022-11-23 14:56:07 +00:00
|
|
|
for character in self.characters_list:
|
|
|
|
name = character["name"]
|
|
|
|
icon = character["icon"]
|
2022-08-06 09:07:47 +00:00
|
|
|
results_list.append(
|
|
|
|
InlineQueryResultArticle(
|
|
|
|
id=str(uuid4()),
|
2022-11-23 14:56:07 +00:00
|
|
|
title=name,
|
|
|
|
description=f"查看角色攻略列表并查询 {name}",
|
|
|
|
thumb_url=icon,
|
2022-08-06 09:07:47 +00:00
|
|
|
input_message_content=InputTextMessageContent(
|
2023-03-14 01:27:22 +00:00
|
|
|
f"角色攻略查询{name}", parse_mode=ParseMode.MARKDOWN_V2
|
2022-10-10 11:07:28 +00:00
|
|
|
),
|
2022-08-06 09:07:47 +00:00
|
|
|
)
|
2022-10-10 11:07:28 +00:00
|
|
|
)
|
2022-12-04 11:56:39 +00:00
|
|
|
else:
|
|
|
|
simple_search_results = await self.search_service.search(args[0])
|
|
|
|
if simple_search_results:
|
|
|
|
results_list.append(
|
|
|
|
InlineQueryResultArticle(
|
|
|
|
id=str(uuid4()),
|
|
|
|
title=f"当前查询内容为 {args[0]}",
|
|
|
|
description="如果无查看图片描述 这是正常的 客户端问题",
|
2023-04-26 08:48:05 +00:00
|
|
|
thumb_url="https://www.miyoushe.com/_nuxt/img/game-sr.4f80911.jpg",
|
2022-12-04 11:56:39 +00:00
|
|
|
input_message_content=InputTextMessageContent(f"当前查询内容为 {args[0]}\n如果无查看图片描述 这是正常的 客户端问题"),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
for simple_search_result in simple_search_results:
|
2023-04-26 08:48:05 +00:00
|
|
|
description = simple_search_result.description
|
|
|
|
if len(description) >= 10:
|
|
|
|
description = description[:10]
|
|
|
|
item = None
|
2022-12-04 11:56:39 +00:00
|
|
|
if simple_search_result.photo_file_id:
|
2023-04-26 08:48:05 +00:00
|
|
|
item = InlineQueryResultCachedPhoto(
|
|
|
|
id=str(uuid4()),
|
|
|
|
title=simple_search_result.title,
|
|
|
|
photo_file_id=simple_search_result.photo_file_id,
|
|
|
|
description=description,
|
|
|
|
caption=simple_search_result.caption,
|
|
|
|
parse_mode=simple_search_result.parse_mode,
|
2022-12-04 11:56:39 +00:00
|
|
|
)
|
2023-04-26 08:48:05 +00:00
|
|
|
elif simple_search_result.document_file_id:
|
|
|
|
item = InlineQueryResultCachedDocument(
|
|
|
|
id=str(uuid4()),
|
|
|
|
title=simple_search_result.title,
|
|
|
|
document_file_id=simple_search_result.document_file_id,
|
|
|
|
description=description,
|
|
|
|
caption=simple_search_result.caption,
|
|
|
|
parse_mode=simple_search_result.parse_mode,
|
|
|
|
)
|
|
|
|
if item:
|
|
|
|
results_list.append(item)
|
2022-08-31 06:48:15 +00:00
|
|
|
if not results_list:
|
2022-08-06 09:07:47 +00:00
|
|
|
results_list.append(
|
|
|
|
InlineQueryResultArticle(
|
|
|
|
id=str(uuid4()),
|
|
|
|
title="好像找不到问题呢",
|
2023-04-26 08:48:05 +00:00
|
|
|
description="这个问题我也不知道。",
|
|
|
|
input_message_content=InputTextMessageContent("这个问题我也不知道。"),
|
2022-08-06 09:07:47 +00:00
|
|
|
)
|
2022-10-10 11:07:28 +00:00
|
|
|
)
|
2022-08-06 09:07:47 +00:00
|
|
|
try:
|
|
|
|
await ilq.answer(
|
|
|
|
results=results_list,
|
|
|
|
switch_pm_text=switch_pm_text,
|
|
|
|
switch_pm_parameter="inline_message",
|
|
|
|
cache_time=0,
|
|
|
|
auto_pagination=True,
|
|
|
|
)
|
|
|
|
except BadRequest as exc:
|
|
|
|
if "Query is too old" in exc.message: # 过时请求全部忽略
|
2022-11-23 14:56:07 +00:00
|
|
|
logger.warning("用户 %s[%s] inline_query 请求过时", user.full_name, user.id)
|
2022-08-06 09:07:47 +00:00
|
|
|
return
|
|
|
|
if "can't parse entities" not in exc.message:
|
|
|
|
raise exc
|
2022-09-08 01:08:37 +00:00
|
|
|
logger.warning("inline_query发生BadRequest错误", exc_info=exc)
|
2022-08-06 09:07:47 +00:00
|
|
|
await ilq.answer(
|
|
|
|
results=[],
|
|
|
|
switch_pm_text="糟糕,发生错误了。",
|
|
|
|
switch_pm_parameter="inline_message",
|
|
|
|
)
|