Archived
1
0
Fork 0
This repository has been archived on 2024-04-26. You can view files and clone it, but cannot push or open issues or pull requests.
akari-bot/modules/wiki/__init__.py
yzhh 3ae9337171 🤡
2021-03-31 23:44:44 +08:00

604 lines
27 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import re
import random
import googletrans
from graia.application import MessageChain
from graia.application.friend import Friend
from graia.application.group import Group, Member
from graia.application.message.elements.internal import Image, UploadMethods, Face
from graia.application.message.elements.internal import Plain
from modules.wiki.database import WikiDB
import modules.wiki.wikilib
from core.template import sendMessage, check_permission, wait_confirm, revokeMessage, Nudge, wait_anything
from database import BotDB
from modules.wiki.helper import check_wiki_available
from .getinfobox import get_infobox_pic
database = WikiDB()
bot_db = BotDB()
LANGUAGES = {
'af': 'afrikaans',
'sq': 'albanian',
'am': 'amharic',
'ar': 'arabic',
'hy': 'armenian',
'az': 'azerbaijani',
'eu': 'basque',
'be': 'belarusian',
'bn': 'bengali',
'bs': 'bosnian',
'bg': 'bulgarian',
'ca': 'catalan',
'ceb': 'cebuano',
'ny': 'chichewa',
'zh-cn': 'chinese (simplified)',
'zh-tw': 'chinese (traditional)',
'co': 'corsican',
'hr': 'croatian',
'cs': 'czech',
'da': 'danish',
'nl': 'dutch',
'en': 'english',
'eo': 'esperanto',
'et': 'estonian',
'tl': 'filipino',
'fi': 'finnish',
'fr': 'french',
'fy': 'frisian',
'gl': 'galician',
'ka': 'georgian',
'de': 'german',
'el': 'greek',
'gu': 'gujarati',
'ht': 'haitian creole',
'ha': 'hausa',
'haw': 'hawaiian',
'iw': 'hebrew',
'he': 'hebrew',
'hi': 'hindi',
'hmn': 'hmong',
'hu': 'hungarian',
'is': 'icelandic',
'ig': 'igbo',
'id': 'indonesian',
'ga': 'irish',
'it': 'italian',
'ja': 'japanese',
'jw': 'javanese',
'kn': 'kannada',
'kk': 'kazakh',
'km': 'khmer',
'ko': 'korean',
'ku': 'kurdish (kurmanji)',
'ky': 'kyrgyz',
'lo': 'lao',
'la': 'latin',
'lv': 'latvian',
'lt': 'lithuanian',
'lb': 'luxembourgish',
'mk': 'macedonian',
'mg': 'malagasy',
'ms': 'malay',
'ml': 'malayalam',
'mt': 'maltese',
'mi': 'maori',
'mr': 'marathi',
'mn': 'mongolian',
'my': 'myanmar (burmese)',
'ne': 'nepali',
'no': 'norwegian',
'or': 'odia',
'ps': 'pashto',
'fa': 'persian',
'pl': 'polish',
'pt': 'portuguese',
'pa': 'punjabi',
'ro': 'romanian',
'ru': 'russian',
'sm': 'samoan',
'gd': 'scots gaelic',
'sr': 'serbian',
'st': 'sesotho',
'sn': 'shona',
'sd': 'sindhi',
'si': 'sinhala',
'sk': 'slovak',
'sl': 'slovenian',
'so': 'somali',
'es': 'spanish',
'su': 'sundanese',
'sw': 'swahili',
'sv': 'swedish',
'tg': 'tajik',
'ta': 'tamil',
'te': 'telugu',
'th': 'thai',
'tr': 'turkish',
'uk': 'ukrainian',
'ur': 'urdu',
'ug': 'uyghur',
'uz': 'uzbek',
'vi': 'vietnamese',
'cy': 'welsh',
'xh': 'xhosa',
'yi': 'yiddish',
'yo': 'yoruba',
'zu': 'zulu'}
async def wiki_loader(kwargs: dict):
kwargs['trigger_msg'] = cmd = re.sub(r'^wiki ', '', kwargs['trigger_msg'])
cmd = cmd.split(' ')
if isinstance(cmd, list):
if len(cmd) > 1:
if cmd[0] == 'set':
kwargs['trigger_msg'] = cmd[1]
await set_start_wiki(kwargs)
if cmd[0] == 'iw':
kwargs['trigger_msg'] = ' '.join(cmd[1:])
await interwiki(kwargs)
if cmd[0] == 'headers':
kwargs['trigger_msg'] = ' '.join(cmd[1:])
await set_headers(kwargs)
else:
await wiki_wrapper(kwargs)
else:
await wiki_wrapper(kwargs)
async def wiki_wrapper(kwargs: dict):
command = kwargs['trigger_msg']
if Group in kwargs:
start_table = 'start_wiki_link_group'
headtable = 'request_headers_group'
headtarget = kwargs[Group].id
if Friend in kwargs:
start_table = 'start_wiki_link_self'
headtable = 'request_headers_self'
headtarget = kwargs[Friend].id
headers = database.config_headers('get', headtable, headtarget)
prompt = False
get_link = database.get_start_wiki(start_table, kwargs[Group].id)
if not get_link:
if Group in kwargs:
prompt = '没有指定起始Wiki已默认指定为中文Minecraft Wiki管理员可以在群内发送~wiki_start_site <域名>来设定自定义起始Wiki。' \
'\n例子:~wiki set https://minecraft-zh.gamepedia.com/'
database.add_start_wiki('start_wiki_link_group', kwargs[Group].id,
'https://minecraft-zh.gamepedia.com/api.php')
elif Friend in kwargs:
prompt = '没有指定起始Wiki已默认指定为中文Minecraft Wiki可以发送~wiki_start_site <域名>来设定自定义起始Wiki。' \
'\n例子:~wiki set https://minecraft-zh.gamepedia.com/'
database.add_start_wiki('start_wiki_link_self', kwargs[Friend].id,
'https://minecraft-zh.gamepedia.com/api.php')
get_link = 'https://minecraft-zh.gamepedia.com/api.php'
iw = None
co = False
if Group in kwargs:
check_gamepedia_addon_enable = bot_db.check_enable_modules(kwargs[Group].id,
'wiki_gamepedia_addon')
if Friend in kwargs:
check_gamepedia_addon_enable = bot_db.check_enable_modules_self(kwargs[Group].id,
'wiki_gamepedia_addon')
if check_gamepedia_addon_enable:
matchsite = re.match(r'~(.*?) (.*)', command)
if matchsite:
get_link = 'https://' + matchsite.group(1) + '.gamepedia.com/api.php'
iw = 'gp:' + matchsite.group(1)
co = True
command = matchsite.group(2)
matchgp = re.match(r'^gp:(.*?):(.*)', command)
if matchgp:
get_link = 'https://' + matchgp.group(1) + '.gamepedia.com/api.php'
iw = 'gp:' + matchgp.group(1)
co = True
command = matchsite.group(2)
if Group in kwargs:
check_fandom_addon_enable = bot_db.check_enable_modules(kwargs[Group].id,
'wiki_fandom_addon')
if Friend in kwargs:
check_fandom_addon_enable = bot_db.check_enable_modules_self(kwargs[Group].id,
'wiki_fandom_addon')
if check_fandom_addon_enable:
matchsite = re.match(r'\?(.*?) (.*)', command)
if matchsite:
get_link = 'https://' + matchsite.group(1) + '.fandom.com/api.php'
iw = 'fd:' + matchsite.group(1)
co = True
command = matchsite.group(2)
matchfd = re.match(r'^fd:(.*?):(.*)', command)
if matchfd:
get_link = 'https://' + matchfd.group(1) + '.fandom.com/api.php'
iw = 'fd:' + matchfd.group(1)
co = True
command = matchsite.group(2)
matchinterwiki = re.match(r'(.*?):(.*)', command)
if matchinterwiki:
if matchinterwiki.group(1) == 'w':
matchinterwiki = re.match(r'(.*?):(.*)', matchinterwiki.group(2))
if matchinterwiki:
if matchinterwiki.group(1) == 'c':
matchinterwiki = re.match(r'(.*?):(.*)', matchinterwiki.group(2))
if matchinterwiki:
interwiki_split = matchinterwiki.group(1).split('.')
if len(interwiki_split) == 2:
get_link = f'https://{interwiki_split[1]}.fandom.com/api.php'
command = interwiki_split[0] + ':' + matchinterwiki.group(2)
iw = interwiki_split[0]
else:
get_link = f'https://{matchinterwiki.group(1)}.fandom.com/api.php'
command = matchinterwiki.group(2)
iw = matchinterwiki.group(1)
co = True
print(co)
matchinterwiki = re.match(r'(.*?):(.*)', command)
if matchinterwiki and not co:
if Group in kwargs:
get_custom_iw = database.get_custom_interwiki('custom_interwiki_group', kwargs[Group].id,
matchinterwiki.group(1))
if Friend in kwargs:
get_custom_iw = database.get_custom_interwiki('custom_interwiki_self', kwargs[Friend].id,
matchinterwiki.group(1))
if get_custom_iw:
iw = matchinterwiki.group(1)
get_link = get_custom_iw
command = re.sub(matchinterwiki.group(1) + ':', '', command)
if command == 'random':
msg = await wikilib.wikilib().random_page(get_link, iw=iw, headers=headers)
else:
msg = await wikilib.wikilib().main(get_link, command, interwiki=iw, headers=headers)
if msg['status'] == 'done':
msgchain = MessageChain.create(
[Plain((prompt + '\n' if prompt else '') + (msg['url'] + '\n' if 'url' in msg else '') + msg['text'])])
if 'net_image' in msg:
try:
if Group in kwargs:
mth = UploadMethods.Group
elif Friend in kwargs:
mth = UploadMethods.Friend
imgchain = MessageChain.create([Image.fromNetworkAddress(msg['net_image'], method=mth)])
msgchain = msgchain.plusWith(imgchain)
except:
pass
await sendMessage(kwargs, msgchain)
if 'apilink' in msg:
get_link = msg['apilink']
if 'url' in msg:
check_options = bot_db.check_enable_modules_self(kwargs[Member].id if Group in kwargs else kwargs[Friend].id,
'wiki_infobox')
print(check_options)
if check_options:
pic = await get_infobox_pic(get_link, msg['url'], headers)
imgchain = MessageChain.create([Image.fromLocalFile(pic)])
await sendMessage(kwargs, imgchain)
elif msg['status'] == 'wait':
await sendMessage(kwargs, MessageChain.create([Plain(msg['text'])]))
wait = await wait_confirm(kwargs)
if wait:
msg = await wikilib.wikilib().main(get_link, msg['title'])
await sendMessage(kwargs, MessageChain.create([Plain((prompt + '\n' if prompt else '') + msg['title'])]))
elif msg['status'] == 'warn':
if Group in kwargs:
trigger = kwargs[Member].id
if Friend in kwargs:
trigger = kwargs[Friend].id
bot_db.warn_someone(trigger)
await sendMessage(kwargs, MessageChain.create([Plain((prompt + '\n' if prompt else '') + msg['text'])]))
async def set_start_wiki(kwargs: dict):
command = kwargs['trigger_msg']
command = re.sub(r'^wiki_start_site ', '', command)
if Group in kwargs:
if check_permission(kwargs):
check = await check_wiki_available(command)
if check:
result = database.add_start_wiki('start_wiki_link_group', kwargs[Group].id, check[0])
await sendMessage(kwargs, MessageChain.create([Plain(result + check[1])]))
else:
result = '错误此Wiki不是一个有效的MediaWiki/尝试建立连接超时。'
await sendMessage(kwargs, MessageChain.create([Plain(result)]))
else:
result = '你没有使用该命令的权限。'
await sendMessage(kwargs, MessageChain.create([Plain(result)]))
if Friend in kwargs:
check = await check_wiki_available(command)
if check:
result = database.add_start_wiki('start_wiki_link_self', kwargs[Friend].id, check[0])
await sendMessage(kwargs, MessageChain.create([Plain(result + check[1])]))
else:
result = '错误此Wiki不是一个有效的MediaWiki/尝试建立连接超时。'
await sendMessage(kwargs, MessageChain.create([Plain(result)]))
async def interwiki(kwargs: dict):
command = kwargs['trigger_msg']
command = re.sub(r'^interwiki ', '', command)
command = command.split(' ')
print(command)
if Group in kwargs:
check = check_permission(kwargs)
if not check:
result = '你没有使用该命令的权限。'
await sendMessage(kwargs, MessageChain.create([Plain(result)]))
return
table = 'custom_interwiki_group'
target = kwargs[Group].id
if Friend in kwargs:
table = 'custom_interwiki_self'
target = kwargs[Friend].id
if command[0] == 'add':
command = ' '.join(command[1:])
command = re.sub(' ', '>', command)
iw = command.split('>')
try:
check = await check_wiki_available(iw[1])
except:
await sendMessage(kwargs, '错误:命令不合法:~wiki iw add <interwiki> <url>')
return
if check:
result = database.config_custom_interwiki('add', table, target, iw[0],
check[0])
await sendMessage(kwargs, MessageChain.create([Plain(result + f'{iw[0]} > {check[1]}')]))
else:
result = '错误此Wiki不是一个有效的MediaWiki/尝试建立连接超时。'
link = re.match(r'^(https?://).*', iw[1])
if not link:
result = '错误所给的链接没有指明协议头链接应以http://或https://开头)。'
article = re.match(r'.*/wiki/', iw[1])
if article:
result += '\n提示:所给的链接似乎是文章地址(/wiki/请将文章地址去掉或直接指定api地址后再试。'
await sendMessage(kwargs, MessageChain.create([Plain(result)]))
elif command[0] == 'del':
result = database.config_custom_interwiki('del', table, target, command[1])
await sendMessage(kwargs, MessageChain.create([Plain(result)]))
elif command[0] == 'list':
query_database = database.get_custom_interwiki_list(table, target)
if query_database:
result = '当前设置了以下Interwiki\n' + query_database
await sendMessage(kwargs, result)
else:
await sendMessage(kwargs, '当前没有设置任何Interwiki使用~wiki iw add <interwiki> <wikilink>添加一个。')
else:
await sendMessage(kwargs, '命令不合法参数应为add/del/list。')
async def set_headers(kwargs: dict):
command = kwargs['trigger_msg']
command = command.split(' ')
if Group in kwargs:
check = check_permission(kwargs)
if not check:
result = '你没有使用该命令的权限。'
await sendMessage(kwargs, MessageChain.create([Plain(result)]))
return
table = 'request_headers_group'
id = kwargs[Group].id
if Friend in kwargs:
table = 'request_headers_self'
id = kwargs[Friend].id
do = command[0]
if do == 'show':
headers = database.config_headers(do, table, id)
msg = f'当前设置了以下标头:\n{headers}\n如需自定义,请使用~wiki headers <set> <headers>,不同标头之间使用换行隔开。'
else:
msg = database.config_headers(do, table, id, ' '.join(command[1:]))
await sendMessage(kwargs, msg)
async def regex_wiki(kwargs: dict):
display = kwargs[MessageChain].asDisplay()
async def regex_proc(kwargs: dict, display):
mains = re.findall(r'\[\[(.*?)\]\]', display, re.I)
templates = re.findall(r'\{\{(.*?)\}\}', display, re.I)
find_dict = {}
global_status = 'done'
for main in mains:
if main == '' or main in find_dict or main.find("{") != -1:
pass
else:
find_dict.update({main: 'main'})
for template in templates:
if template == '' or template in find_dict or template.find("{") != -1:
pass
else:
find_dict.update({template: 'template'})
if find_dict != {}:
await Nudge(kwargs)
waitlist = []
imglist = []
urllist = {}
msglist = MessageChain.create([])
waitmsglist = MessageChain.create([])
if Group in kwargs:
table = 'start_wiki_link_group'
target = kwargs[Group].id
mth = UploadMethods.Group
headtable = 'request_headers_group'
if Friend in kwargs:
table = 'start_wiki_link_self'
target = kwargs[Friend].id
mth = UploadMethods.Friend
headtable = 'request_headers_self'
headers = database.config_headers('get', headtable, target)
for find in find_dict:
if find_dict[find] == 'template':
template = True
else:
template = False
get_link = database.get_start_wiki(table, target)
prompt = False
if not get_link:
if Group in kwargs:
prompt = '没有指定起始Wiki已默认指定为中文Minecraft Wiki管理员可以在群内发送~wiki set <域名>来设定自定义起始Wiki。' \
'\n例子:~wiki_start_site https://minecraft-zh.gamepedia.com/'
database.add_start_wiki('start_wiki_link_group', kwargs[Group].id,
'https://minecraft-zh.gamepedia.com/api.php')
elif Friend in kwargs:
prompt = '没有指定起始Wiki已默认指定为中文Minecraft Wiki可以发送~wiki set <域名>来设定自定义起始Wiki。' \
'\n例子:~wiki_start_site https://minecraft-zh.gamepedia.com/'
database.add_start_wiki('start_wiki_link_self', kwargs[Friend].id,
'https://minecraft-zh.gamepedia.com/api.php')
get_link = 'https://minecraft-zh.gamepedia.com/api.php'
iw = None
matchinterwiki = re.match(r'(.*?):(.*)', find)
if matchinterwiki:
if Group in kwargs:
iw_table = 'custom_interwiki_group'
if Friend in kwargs:
iw_table = 'custom_interwiki_self'
get_custom_iw = modules.wiki.database.get_custom_interwiki(iw_table,
target,
matchinterwiki.group(1))
if get_custom_iw:
get_link = get_custom_iw
find = re.sub(matchinterwiki.group(1) + ':', '', find)
iw = matchinterwiki.group(1)
# fandom addon
if matchinterwiki.group(1) == 'w':
matchinterwiki = re.match(r'(.*?):(.*)', matchinterwiki.group(2))
if matchinterwiki:
if matchinterwiki.group(1) == 'c':
check_fandom_addon_enable = bot_db.check_enable_modules(kwargs[Group].id,
'wiki_fandom_addon')
if check_fandom_addon_enable:
matchinterwiki = re.match(r'(.*?):(.*)', matchinterwiki.group(2))
if matchinterwiki:
interwiki_split = matchinterwiki.group(1).split('.')
if len(interwiki_split) == 2:
get_link = f'https://{interwiki_split[1]}.fandom.com/api.php'
find = interwiki_split[0] + ':' + matchinterwiki.group(2)
iw = interwiki_split[0]
else:
get_link = f'https://{matchinterwiki.group(1)}.fandom.com/api.php'
find = matchinterwiki.group(2)
iw = matchinterwiki.group(1)
msg = await modules.wiki.wikilib.wikilib().main(get_link, find, interwiki=iw, template=template, headers=headers)
status = msg['status']
r = random.randint(1, 3)
msgtext = msg['text']
if r == 3:
try:
traaanslator = googletrans.Translator()
traanslang = random.randint(1, 106)
lang = []
for x in LANGUAGES:
lang.append(x)
msgtext = traaanslator.translate(msgtext, dest=lang[traanslang]).text
except Exception:
msgtext = msg['text']
text = (prompt + '\n' if prompt else '') + msgtext
if status == 'wait':
global_status = 'wait'
waitlist.append(msg['title'])
waitmsglist = waitmsglist.plusWith(MessageChain.create(
[Plain(('\n' if waitmsglist != MessageChain.create([]) else '') + text)]))
if status == 'warn':
global_status = 'warn'
msglist = msglist.plusWith(MessageChain.create(
[Plain(('\n' if msglist != MessageChain.create([]) else '') + text)]))
if status == 'done':
msglist = msglist.plusWith(MessageChain.create([Plain(
('\n' if msglist != MessageChain.create([]) else '') + (
msg['url'] + '\n' if 'url' in msg else '') + text)]))
if 'net_image' in msg:
imglist.append(msg['net_image'])
if 'apilink' in msg:
get_link = msg['apilink']
if 'url' in msg:
urllist.update({msg['url']: get_link})
if status is None:
msglist = msglist.plusWith(MessageChain.create([Plain('发生错误:机器人内部代码错误,请联系开发者解决。')]))
if msglist != MessageChain.create([]):
await sendMessage(kwargs, msglist)
if imglist != []:
imgchain = MessageChain.create([])
for img in imglist:
imgchain = imgchain.plusWith(MessageChain.create([Image.fromNetworkAddress(img, method=mth)]))
await sendMessage(kwargs, imgchain)
if urllist != {}:
print(urllist)
check_options = bot_db.check_enable_modules_self(
kwargs[Member].id if Group in kwargs else kwargs[Friend].id, 'wiki_infobox')
if check_options:
infoboxchain = MessageChain.create([])
for url in urllist:
r = random.randint(3, 5)
print(r)
get_infobox = None
if r == 3:
get_infobox = await get_infobox_pic(urllist[url], url, headers, True, True, True)
if r == 4:
get_infobox = await get_infobox_pic(urllist[url], url, headers, True, True, True, True)
if r == 5:
r2 = random.randint(1, 3)
if r2 == 1:
get_infobox = await get_infobox_pic(urllist[url], url, headers, False, True, True, True)
if r2 == 2:
get_infobox = await get_infobox_pic(urllist[url], url, headers, False, False, False, True)
if r2 == 3:
get_infobox = await get_infobox_pic(urllist[url], url, headers, False, False, False, True, True)
if get_infobox == None:
get_infobox = await get_infobox_pic(urllist[url], url, headers)
if get_infobox:
infoboxchain = infoboxchain.plusWith(
MessageChain.create([Image.fromLocalFile(get_infobox, method=mth)]))
if infoboxchain != MessageChain.create([]):
await sendMessage(kwargs, infoboxchain, Quote=False)
if global_status == 'warn':
if Group in kwargs:
trigger = kwargs[Member].id
if Friend in kwargs:
trigger = kwargs[Friend].id
bot_db.warn_someone(trigger)
if waitmsglist != MessageChain.create([]):
send = await sendMessage(kwargs, waitmsglist)
wait = await wait_confirm(kwargs)
if wait:
nwaitlist = []
for waits in waitlist:
waits1 = f'[[{waits}]]'
nwaitlist.append(waits1)
r = random.randint(1, 10)
if r == 5:
await sendMessage(kwargs, '哦,自己查吧', Quote=False)
await wait_anything(kwargs)
if r == 6:
await sendMessage(kwargs, '那你为什么不自己上wiki查呢:rina:', Quote=False)
await wait_anything(kwargs)
if r == 7:
await sendMessage(kwargs, MessageChain.create([Face(faceId=281)]), Quote=False)
await wait_anything(kwargs)
await regex_proc(kwargs, '\n'.join(nwaitlist))
else:
await revokeMessage(send)
await regex_proc(kwargs, display)
command = {'wiki': wiki_loader, 'wiki_start_site': set_start_wiki, 'interwiki': interwiki}
regex = {'wiki_regex': regex_wiki}
self_options = ['wiki_infobox']
options = ['wiki_fandom_addon', 'wiki_gamepedia_addon']
help = {'wiki': {'help': '~wiki [interwiki:]<pagename> - 查询Wiki内容。\n' +
'~wiki set <wikilink> - 设置起始查询Wiki。\n' +
'~wiki iw <add/del> <interwiki> <wikiurl> - 设置自定义Interwiki跨站查询。\n' +
'~wiki headers <set/reset/show> - 设置请求标头。'},
'wiki_start_site': {'help': '~wiki_start_site <wikilink> - 设置起始查询Wiki。'},
'interwiki': {
'help': '~interwiki <add/del> <interwiki> <wikiurl> - 设置自定义Interwiki跨站查询。'},
'wiki_regex': {'help': '[[<pagename>]]|{{<pagename>}} - 当聊天中出现此种Wikitext时进行自动查询。'},
'wiki_infobox': {
'help': 'Infobox渲染当被查询的页面包含Infobox时自动提取并渲染为图片发送。群聊默认开启且不可全局关闭个人可使用~disable self wiki_infobox关闭',
'depend': 'wiki'},
'wiki_fandom_addon': {
'help': '为Fandom定制的Wiki查询功能包含有[[w:c:<wikiname>:[langcode:]<pagename>]]的消息会自动定向查询至Fandom的Wiki。'},
'wiki_gamepedia_addon': {
'help': '为Gamepedia定制的查询功能输入~wiki ~<wikiname> <pagename>会自动定向查询至Gamepedia的Wiki。'}}