autocomplete
This commit is contained in:
parent
a198e605f6
commit
a77a4c709c
3 changed files with 64 additions and 19 deletions
|
@ -1,16 +1,44 @@
|
||||||
import asyncio
|
import re
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
|
|
||||||
from bots.discord.client import client
|
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])
|
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页面")
|
@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):
|
async def query(ctx: discord.ApplicationContext, title: str):
|
||||||
await slash_parser(ctx, title)
|
await slash_parser(ctx, title)
|
||||||
|
|
||||||
|
@ -28,7 +56,7 @@ async def page_id(ctx: discord.ApplicationContext, pid: str):
|
||||||
|
|
||||||
|
|
||||||
@wiki.command(name="set", description="设置起始查询wiki")
|
@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):
|
async def set_base(ctx: discord.ApplicationContext, link: str):
|
||||||
await slash_parser(ctx, f'set {link}')
|
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}')
|
await slash_parser(ctx, f'iw add {iw} {link}')
|
||||||
|
|
||||||
|
|
||||||
@iw.command(name='remove',description="删除自定义Interwiki")
|
@iw.command(name='remove', description="删除自定义Interwiki")
|
||||||
@discord.option(name="iw", description="自定义iw名")
|
@discord.option(name="iw", description="自定义iw名", autocomplete=auto_get_custom_iw_list)
|
||||||
async def iw_remove(ctx: discord.ApplicationContext, iw: str):
|
async def iw_remove(ctx: discord.ApplicationContext, iw: str):
|
||||||
await slash_parser(ctx, f'iw rm {iw}')
|
await slash_parser(ctx, f'iw rm {iw}')
|
||||||
|
|
||||||
|
@ -55,7 +83,7 @@ async def iw_list(ctx: discord.ApplicationContext):
|
||||||
|
|
||||||
|
|
||||||
@iw.command(description="获取自定义Interwiki的链接")
|
@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):
|
async def get(ctx: discord.ApplicationContext, iw: str):
|
||||||
await slash_parser(ctx, f'iw get {iw}')
|
await slash_parser(ctx, f'iw get {iw}')
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
|
|
||||||
|
@ -8,18 +9,34 @@ from core.logger import Logger
|
||||||
from core.parser.message import parser
|
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):
|
async def slash_parser(ctx: discord.ApplicationContext, command: str):
|
||||||
await ctx.defer()
|
await ctx.defer()
|
||||||
target = "Discord|Channel"
|
session = ctx_to_session(ctx)
|
||||||
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.command = f'/{str(ctx.command).split(" ")[0]} {command}'
|
session.command = f'/{str(ctx.command).split(" ")[0]} {command}'
|
||||||
Logger.info(f'parsing..')
|
Logger.info(f'parsing..')
|
||||||
await parser(session, prefix=['/'])
|
await parser(session, prefix=['/'])
|
||||||
|
|
|
@ -699,6 +699,6 @@ class WikiLib:
|
||||||
:return: 页面信息
|
:return: 页面信息
|
||||||
"""
|
"""
|
||||||
await self.fixup_wiki_info()
|
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']
|
page_title = random_url['query']['random'][0]['title']
|
||||||
return await self.parse_page_info(page_title)
|
return await self.parse_page_info(page_title)
|
||||||
|
|
Reference in a new issue