Archived
1
0
Fork 0

autocomplete

This commit is contained in:
yzhh 2022-08-17 13:34:26 +08:00
parent a198e605f6
commit a77a4c709c
3 changed files with 64 additions and 19 deletions

View file

@ -1,16 +1,44 @@
import asyncio
import re
import discord
from bots.discord.client import client
from bots.discord.slash_parser import slash_parser
from bots.discord.slash_parser import slash_parser, ctx_to_session
from modules.wiki import WikiLib, WikiTargetInfo
wiki = client.create_group("wiki", "查询Mediawiki的相关信息", guild_ids=[557879624575614986])
async def auto_search(ctx: discord.AutocompleteContext):
title = ctx.options["title"]
iw = ''
target = WikiTargetInfo(ctx_to_session(ctx))
iws = target.get_interwikis()
query_wiki = target.get_start_wiki()
if match_iw := re.match(r'(.*?):(.*)', title):
if match_iw.group(1) in iws:
query_wiki = iws[match_iw.group(1)]
iw = match_iw.group(1) + ':'
title = match_iw.group(2)
if query_wiki is None:
return []
wiki = WikiLib(query_wiki)
if title != "":
return [iw + x for x in (await wiki.search_page(title))]
else:
return [iw + (await wiki.get_json(action='query', list='random', rnnamespace='0'))['query']['random'][0]['title']]
async def auto_get_custom_iw_list(ctx: discord.AutocompleteContext):
target = WikiTargetInfo(ctx_to_session(ctx)).get_interwikis()
if not target:
return []
else:
return list(target.keys())
@wiki.command(description="根据页面名称查询一个wiki页面")
@discord.option(name="title", description="页面名称")
@discord.option(name="title", description="页面名称", autocomplete=auto_search)
async def query(ctx: discord.ApplicationContext, title: str):
await slash_parser(ctx, title)
@ -28,7 +56,7 @@ async def page_id(ctx: discord.ApplicationContext, pid: str):
@wiki.command(name="set", description="设置起始查询wiki")
@discord.option(name="link", description="页面链接")
@discord.option(name="link", description="页面链接", autocomplete=['https://minecraft.fandom.com/zh/'])
async def set_base(ctx: discord.ApplicationContext, link: str):
await slash_parser(ctx, f'set {link}')
@ -43,8 +71,8 @@ async def add(ctx: discord.ApplicationContext, iw: str, link: str):
await slash_parser(ctx, f'iw add {iw} {link}')
@iw.command(name='remove',description="删除自定义Interwiki")
@discord.option(name="iw", description="自定义iw名")
@iw.command(name='remove', description="删除自定义Interwiki")
@discord.option(name="iw", description="自定义iw名", autocomplete=auto_get_custom_iw_list)
async def iw_remove(ctx: discord.ApplicationContext, iw: str):
await slash_parser(ctx, f'iw rm {iw}')
@ -55,7 +83,7 @@ async def iw_list(ctx: discord.ApplicationContext):
@iw.command(description="获取自定义Interwiki的链接")
@discord.option(name="iw", description="自定义interwiki名")
@discord.option(name="iw", description="自定义interwiki名", autocomplete=auto_get_custom_iw_list)
async def get(ctx: discord.ApplicationContext, iw: str):
await slash_parser(ctx, f'iw get {iw}')

View file

@ -1,4 +1,5 @@
import asyncio
from typing import Union
import discord
@ -8,18 +9,34 @@ from core.logger import Logger
from core.parser.message import parser
def ctx_to_session(ctx: Union[discord.ApplicationContext, discord.AutocompleteContext]):
target = "Discord|Channel"
if isinstance(ctx, discord.ApplicationContext):
if isinstance(ctx.channel, discord.DMChannel):
target = "Discord|DM|Channel"
targetId = f"{target}|{ctx.channel.id}"
senderId = f"Discord|Client|{ctx.author.id}",
else:
if isinstance(ctx.interaction.channel, discord.PartialMessage):
target = "Discord|DM|Channel"
targetId = f"{target}|{ctx.interaction.channel.id}"
else:
targetId = f"{target}|{ctx.interaction.channel_id}"
senderId = f"Discord|Client|{ctx.interaction.user.id}"
return MessageSession(target=MsgInfo(targetId=targetId,
senderId=senderId,
senderName=ctx.author.name if isinstance(ctx, discord.ApplicationContext) else ctx.interaction.user.name,
targetFrom=target, senderFrom="Discord|Client",
clientName='Discord|Slash',
messageId=0),
session=Session(message=ctx,
target=ctx.channel if isinstance(ctx, discord.ApplicationContext) else ctx.interaction.channel,
sender=ctx.author if isinstance(ctx, discord.ApplicationContext) else ctx.interaction.user))
async def slash_parser(ctx: discord.ApplicationContext, command: str):
await ctx.defer()
target = "Discord|Channel"
if isinstance(ctx.channel, discord.DMChannel):
target = "Discord|DM|Channel"
targetId = f"{target}|{ctx.channel.id}"
session = MessageSession(target=MsgInfo(targetId=targetId,
senderId=f"Discord|Client|{ctx.author.id}",
senderName=ctx.author.name, targetFrom=target, senderFrom="Discord|Client",
clientName='Discord|Slash',
messageId=0),
session=Session(message=ctx, target=ctx.channel, sender=ctx.author))
session = ctx_to_session(ctx)
session.command = f'/{str(ctx.command).split(" ")[0]} {command}'
Logger.info(f'parsing..')
await parser(session, prefix=['/'])

View file

@ -699,6 +699,6 @@ class WikiLib:
:return: 页面信息
"""
await self.fixup_wiki_info()
random_url = await self.get_json(action='query', list='random')
random_url = await self.get_json(action='query', list='random', rnnamespace='0')
page_title = random_url['query']['random'][0]['title']
return await self.parse_page_info(page_title)