2022-09-06 15:30:39 +00:00
|
|
|
import asyncio
|
|
|
|
import re
|
|
|
|
import urllib.parse
|
|
|
|
|
|
|
|
import filetype
|
|
|
|
|
2023-02-05 14:33:33 +00:00
|
|
|
from core.builtins import Bot, Plain, Image, Voice
|
2023-03-04 08:51:56 +00:00
|
|
|
from core.component import module
|
2022-09-06 15:30:39 +00:00
|
|
|
from core.dirty_check import check
|
2022-12-08 09:13:48 +00:00
|
|
|
from core.logger import Logger
|
2023-02-05 14:33:33 +00:00
|
|
|
from core.utils.http import download_to_cache
|
2022-09-06 15:30:39 +00:00
|
|
|
from modules.wiki.utils.dbutils import WikiTargetInfo
|
2023-01-19 05:53:22 +00:00
|
|
|
from modules.wiki.utils.screenshot_image import generate_screenshot_v1, generate_screenshot_v2
|
2022-09-06 15:30:39 +00:00
|
|
|
from modules.wiki.utils.wikilib import WikiLib
|
2023-01-18 18:32:33 +00:00
|
|
|
from .wiki import query_pages, generate_screenshot_v2_blocklist
|
2022-09-06 15:30:39 +00:00
|
|
|
|
2023-03-04 08:51:56 +00:00
|
|
|
wiki_inline = module('wiki_inline',
|
2023-06-18 06:52:04 +00:00
|
|
|
desc='{wiki.help.wiki_inline.desc}', recommend_modules=['wiki'],
|
2023-03-04 08:51:56 +00:00
|
|
|
alias='wiki_regex', developers=['OasisAkari'])
|
2022-09-06 15:30:39 +00:00
|
|
|
|
|
|
|
|
2023-05-21 06:41:50 +00:00
|
|
|
@wiki_inline.handle(re.compile(r'\[\[(.*?)]]', flags=re.I), mode='A',
|
2023-05-21 07:49:51 +00:00
|
|
|
desc="{wiki.help.wiki_inline.page}")
|
2023-02-05 14:33:33 +00:00
|
|
|
async def _(msg: Bot.MessageSession):
|
2022-09-06 15:30:39 +00:00
|
|
|
query_list = []
|
|
|
|
for x in msg.matched_msg:
|
|
|
|
if x != '' and x not in query_list and x[0] != '#':
|
|
|
|
query_list.append(x.split("|")[0])
|
|
|
|
if query_list:
|
|
|
|
await query_pages(msg, query_list, inline_mode=True)
|
|
|
|
|
|
|
|
|
2023-05-21 06:41:50 +00:00
|
|
|
@wiki_inline.handle(re.compile(r'\{\{(.*?)}}', flags=re.I), mode='A',
|
2023-06-07 05:01:57 +00:00
|
|
|
desc='{wiki.help.wiki_inline.template}')
|
2023-02-05 14:33:33 +00:00
|
|
|
async def _(msg: Bot.MessageSession):
|
2022-09-06 15:30:39 +00:00
|
|
|
query_list = []
|
|
|
|
for x in msg.matched_msg:
|
|
|
|
if x != '' and x not in query_list and x[0] != '#' and x.find("{") == -1:
|
|
|
|
query_list.append(x.split("|")[0])
|
|
|
|
if query_list:
|
|
|
|
await query_pages(msg, query_list, template=True, inline_mode=True)
|
|
|
|
|
|
|
|
|
2023-06-07 05:43:31 +00:00
|
|
|
@wiki_inline.handle(re.compile(r'≺(.*?)≻|⧼(.*?)⧽', flags=re.I), mode='A', show_typing=False,
|
2023-06-07 05:01:57 +00:00
|
|
|
desc='{wiki.help.wiki_inline.mediawiki}')
|
2023-02-05 14:33:33 +00:00
|
|
|
async def _(msg: Bot.MessageSession):
|
2022-09-06 15:30:39 +00:00
|
|
|
query_list = []
|
|
|
|
for x in msg.matched_msg:
|
|
|
|
for y in x:
|
|
|
|
if y != '' and y not in query_list and y[0] != '#':
|
|
|
|
query_list.append(y)
|
|
|
|
if query_list:
|
|
|
|
await query_pages(msg, query_list, mediawiki=True, inline_mode=True)
|
|
|
|
|
|
|
|
|
|
|
|
@wiki_inline.handle(re.compile(
|
|
|
|
r'(https?://[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,4}\b[-a-zA-Z0-9@:%_+.~#?&/=]*)', flags=re.I),
|
2023-05-21 07:49:51 +00:00
|
|
|
mode='A', show_typing=False, logging=False,
|
2023-06-07 05:01:57 +00:00
|
|
|
desc='{wiki.help.wiki_inline.url}')
|
2023-02-05 14:33:33 +00:00
|
|
|
async def _(msg: Bot.MessageSession):
|
2022-09-06 15:30:39 +00:00
|
|
|
match_msg = msg.matched_msg
|
|
|
|
|
|
|
|
async def bgtask():
|
|
|
|
query_list = []
|
|
|
|
target = WikiTargetInfo(msg)
|
|
|
|
headers = target.get_headers()
|
|
|
|
for x in match_msg:
|
|
|
|
wiki_ = WikiLib(x)
|
|
|
|
if check_from_database := await wiki_.check_wiki_info_from_database_cache():
|
|
|
|
if check_from_database.available:
|
|
|
|
check_from_api = await wiki_.check_wiki_available()
|
|
|
|
if check_from_api.available:
|
|
|
|
query_list.append({x: check_from_api.value})
|
|
|
|
if query_list:
|
2022-12-08 09:13:48 +00:00
|
|
|
Logger.info(query_list)
|
2022-09-06 15:30:39 +00:00
|
|
|
for q in query_list:
|
|
|
|
img_send = False
|
|
|
|
for qq in q:
|
2023-01-29 14:33:16 +00:00
|
|
|
wiki_ = WikiLib(qq)
|
2022-09-06 15:30:39 +00:00
|
|
|
articlepath = q[qq].articlepath.replace('$1', '(.*)')
|
2023-01-29 14:33:16 +00:00
|
|
|
get_id = re.sub(r'.*curid=(\d+)', '\\1', qq)
|
2022-09-06 15:30:39 +00:00
|
|
|
get_title = re.sub(r'' + articlepath, '\\1', qq)
|
2023-01-29 14:33:16 +00:00
|
|
|
get_page = None
|
|
|
|
if get_id.isdigit():
|
|
|
|
get_page = await wiki_.parse_page_info(pageid=int(get_id))
|
|
|
|
if not q[qq].in_allowlist:
|
|
|
|
for result in await check(get_page.title):
|
|
|
|
if not result['status']:
|
|
|
|
return
|
|
|
|
elif get_title != '':
|
2022-09-06 15:30:39 +00:00
|
|
|
title = urllib.parse.unquote(get_title)
|
|
|
|
if not q[qq].in_allowlist:
|
|
|
|
for result in await check(title):
|
|
|
|
if not result['status']:
|
|
|
|
return
|
|
|
|
get_page = await wiki_.parse_page_info(title)
|
2023-01-29 14:33:16 +00:00
|
|
|
if get_page is not None:
|
2022-09-06 15:30:39 +00:00
|
|
|
if get_page.status and get_page.file is not None:
|
|
|
|
dl = await download_to_cache(get_page.file)
|
|
|
|
guess_type = filetype.guess(dl)
|
|
|
|
if guess_type is not None:
|
|
|
|
if guess_type.extension in ["png", "gif", "jpg", "jpeg", "webp", "bmp", "ico"]:
|
|
|
|
if msg.Feature.image:
|
2023-05-19 04:46:29 +00:00
|
|
|
await msg.sendMessage([Plain(msg.locale.t('wiki.message.wiki_inline.flies', file=get_page.file)), Image(dl)],
|
2022-09-06 15:30:39 +00:00
|
|
|
quote=False)
|
|
|
|
img_send = True
|
|
|
|
elif guess_type.extension in ["oga", "ogg", "flac", "mp3", "wav"]:
|
|
|
|
if msg.Feature.voice:
|
2023-05-19 04:46:29 +00:00
|
|
|
await msg.sendMessage([Plain(msg.locale.t('wiki.message.wiki_inline.flies', file=get_page.file)), Voice(dl)],
|
2022-09-06 15:30:39 +00:00
|
|
|
quote=False)
|
2023-01-27 11:20:11 +00:00
|
|
|
if msg.Feature.image:
|
2023-01-29 14:08:55 +00:00
|
|
|
if get_page.status and wiki_.wiki_info.in_allowlist:
|
|
|
|
if wiki_.wiki_info.realurl not in generate_screenshot_v2_blocklist:
|
2023-01-27 11:20:11 +00:00
|
|
|
get_infobox = await generate_screenshot_v2(qq,
|
|
|
|
allow_special_page=q[qq].in_allowlist,
|
2023-04-30 03:30:59 +00:00
|
|
|
content_mode=get_page.has_template_doc or
|
2023-02-05 14:33:33 +00:00
|
|
|
get_page.title.split(':')[0] in [
|
2023-04-30 03:30:59 +00:00
|
|
|
'User'] or
|
2023-04-16 11:04:21 +00:00
|
|
|
('Template:Disambiguation' in get_page.templates
|
|
|
|
or 'Template:Version disambiguation' in get_page.templates))
|
2023-01-29 14:08:55 +00:00
|
|
|
if get_infobox:
|
|
|
|
await msg.sendMessage(Image(get_infobox), quote=False)
|
|
|
|
else:
|
|
|
|
get_infobox = await generate_screenshot_v1(q[qq].realurl, qq, headers)
|
2023-01-27 11:20:11 +00:00
|
|
|
if get_infobox:
|
|
|
|
await msg.sendMessage(Image(get_infobox), quote=False)
|
2022-09-06 15:30:39 +00:00
|
|
|
if len(query_list) == 1 and img_send:
|
|
|
|
return
|
|
|
|
if msg.Feature.image:
|
|
|
|
for qq in q:
|
|
|
|
section_ = []
|
|
|
|
quote_code = False
|
2023-04-04 16:36:07 +00:00
|
|
|
page_name = urllib.parse.unquote(qq)
|
|
|
|
for qs in page_name:
|
2022-09-06 15:30:39 +00:00
|
|
|
if qs == '#':
|
|
|
|
quote_code = True
|
|
|
|
if qs == '?':
|
|
|
|
quote_code = False
|
|
|
|
if quote_code:
|
|
|
|
section_.append(qs)
|
|
|
|
if section_:
|
|
|
|
s = urllib.parse.unquote(''.join(section_)[1:])
|
2023-01-19 12:42:00 +00:00
|
|
|
if q[qq].realurl and q[qq].in_allowlist:
|
2023-01-18 18:32:33 +00:00
|
|
|
if q[qq].realurl in generate_screenshot_v2_blocklist:
|
|
|
|
get_section = await generate_screenshot_v1(q[qq].realurl, qq, headers, section=s)
|
|
|
|
else:
|
|
|
|
get_section = await generate_screenshot_v2(qq, section=s)
|
2022-09-06 15:30:39 +00:00
|
|
|
if get_section:
|
|
|
|
await msg.sendMessage(Image(get_section))
|
2022-09-16 14:20:30 +00:00
|
|
|
|
2022-09-06 15:30:39 +00:00
|
|
|
asyncio.create_task(bgtask())
|