Archived
1
0
Fork 0
This commit is contained in:
yzhh 2021-11-09 00:09:06 +08:00
parent 4c255ece7a
commit c4e166bd8c
10 changed files with 249 additions and 111 deletions

View file

@ -13,6 +13,6 @@ dc_token =
base_superuser = QQ|2596322644
Check_accessKeyId =
Check_accessKeySecret =
infobox_render =
web_render =
arcapi_url =
tg_token =

View file

@ -5,7 +5,6 @@ import traceback
from typing import Dict, Union, List, Set
from core.elements import Command, Option, Schedule, RegexCommand, StartUp, PrivateAssets
from core.elements.module.meta import Meta
from core.logger import Logger
load_dir_path = os.path.abspath('./modules/')
@ -105,12 +104,12 @@ class ModulesManager:
if isinstance(x, (tuple, list)):
for y in x:
if isinstance(y, str):
alias_list[module.bind_prefix].append(x)
alias_list[module.bind_prefix].append(y)
if isinstance(y, dict):
for z in y:
if z not in alias_list:
alias_list.update({z: []})
alias_list[z].append(y[z])
if y[z] not in alias_list:
alias_list.update({y[z]: []})
alias_list[y[z]].append(z)
return alias_list
@staticmethod

View file

@ -80,7 +80,7 @@ class CommandParser:
if match_detail_help:
x = f'{match_detail_help.group(1)}- {match_detail_help.group(2)}'
arglst.append(x)
args = f'用法:\n ' + '\n '.join(y for y in arglst)
args = '\n'.join(y for y in arglst)
else:
raise InvalidHelpDocTypeError
return args

69
core/utils/image_table.py Normal file
View file

@ -0,0 +1,69 @@
import os
import traceback
import uuid
import re
from typing import List, Union
import ujson as json
import aiohttp
from tabulate import tabulate
from config import Config
web_render = Config('web_render')
class ImageTable:
def __init__(self, data, headers):
self.data = data
self.headers = headers
async def image_table_render(table: Union[ImageTable, List[ImageTable]]):
if not web_render:
return False
try:
tblst = []
if isinstance(table, ImageTable):
table = [table]
max_width = 500
for tbl in table:
d = []
for row in tbl.data:
cs = []
for c in row:
cs.append(re.sub(r'\n', '<br>', c))
d.append(cs)
w = len(tbl.headers) * 500
if w > max_width:
max_width = w
tblst.append(re.sub(r'<table>|</table>', '', tabulate(d, tbl.headers, tablefmt='unsafehtml')))
tblst = '<table>' + '\n'.join(tblst) + '</table>'
css = """
<style>table {
border-collapse: collapse;
}
table, th, td {
border: 1px solid rgba(0,0,0,0.05);
font-size: 0.8125rem;
font-weight: 500;
}
th, td {
padding: 15px;
text-align: left;
}</style>"""
html = {'content': tblst + css, 'width': w}
picname = os.path.abspath(f'./cache/{str(uuid.uuid4())}.jpg')
if os.path.exists(picname):
os.remove(picname)
async with aiohttp.ClientSession() as session:
async with session.post(web_render, headers={
'Content-Type': 'application/json',
}, data=json.dumps(html)) as resp:
with open(picname, 'wb+') as jpg:
jpg.write(await resp.read())
return picname
except Exception:
traceback.print_exc()
return False

View file

@ -6,9 +6,10 @@ import time
import psutil
import ujson as json
from core.elements import MessageSession, Command, PrivateAssets
from core.elements import MessageSession, Command, PrivateAssets, Image, Plain
from core.loader import ModulesManager
from core.component import on_command
from core.utils.image_table import ImageTable, image_table_render, web_render
from core.parser.command import CommandParser, InvalidHelpDocTypeError
from database import BotDBUtil
@ -148,30 +149,86 @@ async def bot_help(msg: MessageSession):
else:
await msg.sendMessage('此模块可能不存在,请检查输入。')
@hlp.handle()
async def _(msg: MessageSession):
module_list = ModulesManager.return_modules_list_as_dict()
target_enabled_list = BotDBUtil.Module(msg).check_target_enabled_module_list()
developers = ModulesManager.return_modules_developers_map()
alias = ModulesManager.return_modules_alias_map()
help_msg = ['基础命令:']
essential = []
for x in module_list:
if isinstance(module_list[x], Command) and module_list[x].base:
essential.append(module_list[x].bind_prefix)
help_msg.append(' | '.join(essential))
help_msg.append('模块扩展命令:')
module_ = []
for x in module_list:
if x in BotDBUtil.Module(msg).check_target_enabled_module_list():
module_.append(x)
help_msg.append(' | '.join(module_))
print(help_msg)
help_msg.append(
'使用~help <对应模块名>查看详细信息。\n使用~modules查看所有的可用模块。\n你也可以通过查阅文档获取帮助:\nhttps://bot.teahou.se/wiki/')
help_msg.append('[本消息将在一分钟后撤回]')
send = await msg.sendMessage('\n'.join(help_msg))
await msg.sleep(60)
await send.delete()
legacy_help = False
if web_render and msg.Feature.image:
tables = []
essential = []
m = []
for x in module_list:
module_ = module_list[x]
appends = [module_.bind_prefix]
help_ = CommandParser(module_)
doc_ = []
if module_.desc is not None:
doc_.append(module_.desc)
if help_.args is not None:
doc_.append(help_.return_formatted_help_doc())
doc = '\n'.join(doc_)
appends.append(doc)
module_alias = ModulesManager.return_module_alias(module_.bind_prefix)
malias = []
for a in module_alias:
for b in module_alias[a]:
malias.append(f'{b} -> {a}')
if malias:
appends.append('\n'.join(malias))
else:
appends.append('')
if x in developers:
dev_list = developers[x]
if isinstance(dev_list, (list, tuple)):
devs = ''.join(developers[x]) if developers[x] is not None else ''
elif isinstance(dev_list, str):
devs = dev_list
else:
devs = '<数据类型错误,请联系开发者解决>'
else:
devs = ''
appends.append(devs)
if isinstance(module_, Command) and module_.base:
essential.append(appends)
if x in target_enabled_list:
m.append(appends)
if essential:
tables.append(ImageTable(essential, ['基础模块列表', '帮助信息', '命令别名', '作者']))
if m:
tables.append(ImageTable(m, ['扩展模块列表', '帮助信息', '命令别名', '作者']))
if tables:
render = await image_table_render(tables)
if render:
await msg.sendMessage([Image(render),
Plain('使用~modules查看所有的可用模块。'
'\n你也可以通过查阅文档获取帮助:\nhttps://bot.teahou.se/wiki/')])
else:
legacy_help = True
else:
legacy_help = True
if legacy_help:
help_msg = ['基础命令:']
essential = []
for x in module_list:
if isinstance(module_list[x], Command) and module_list[x].base:
essential.append(module_list[x].bind_prefix)
help_msg.append(' | '.join(essential))
help_msg.append('模块扩展命令:')
module_ = []
for x in module_list:
if x in target_enabled_list:
module_.append(x)
help_msg.append(' | '.join(module_))
print(help_msg)
help_msg.append(
'使用~help <对应模块名>查看详细信息。\n使用~modules查看所有的可用模块。\n你也可以通过查阅文档获取帮助:\nhttps://bot.teahou.se/wiki/')
help_msg.append('[本消息将在一分钟后撤回]')
send = await msg.sendMessage('\n'.join(help_msg))
await msg.sleep(60)
await send.delete()
modules = on_command('modules',
@ -184,22 +241,77 @@ modules = on_command('modules',
@modules.handle()
async def modules_help(msg: MessageSession):
module_list = ModulesManager.return_modules_list_as_dict()
help_msg = ['当前可用的模块有:']
module_ = []
for x in module_list:
if x[0] == '_':
continue
if isinstance(module_list[x], Command) and module_list[x].base and module_list[x]\
.required_superuser:
continue
module_.append(module_list[x].bind_prefix)
help_msg.append(' | '.join(module_))
help_msg.append(
'使用~help <模块名>查看详细信息。\n你也可以通过查阅文档获取帮助:\nhttps://bot.teahou.se/wiki/')
help_msg.append('[本消息将在一分钟后撤回]')
send = await msg.sendMessage('\n'.join(help_msg))
await msg.sleep(60)
await send.delete()
target_enabled_list = BotDBUtil.Module(msg).check_target_enabled_module_list()
developers = ModulesManager.return_modules_developers_map()
legacy_help = False
if web_render and msg.Feature.image:
tables = []
m = []
for x in module_list:
module_ = module_list[x]
if x[0] == '_':
continue
if isinstance(module_, Command) and module_.base and module_ \
.required_superuser:
continue
appends = [module_.bind_prefix]
help_ = CommandParser(module_)
doc_ = []
if module_.desc is not None:
doc_.append(module_.desc)
if help_.args is not None:
doc_.append(help_.return_formatted_help_doc())
doc = '\n'.join(doc_)
appends.append(doc)
module_alias = ModulesManager.return_module_alias(module_.bind_prefix)
malias = []
for a in module_alias:
for b in module_alias[a]:
malias.append(f'{b} -> {a}')
if malias:
appends.append('\n'.join(malias))
else:
appends.append('')
if x in developers:
dev_list = developers[x]
if isinstance(dev_list, (list, tuple)):
devs = ''.join(developers[x]) if developers[x] is not None else ''
elif isinstance(dev_list, str):
devs = dev_list
else:
devs = '<数据类型错误,请联系开发者解决>'
else:
devs = ''
appends.append(devs)
if x in target_enabled_list:
m.append(appends)
if m:
tables.append(ImageTable(m, ['扩展模块列表', '帮助信息', '命令别名', '作者']))
if tables:
render = await image_table_render(tables)
if render:
await msg.sendMessage([Image(render)])
else:
legacy_help = True
else:
legacy_help = True
if legacy_help:
help_msg = ['当前可用的模块有:']
module_ = []
for x in module_list:
if x[0] == '_':
continue
if isinstance(module_list[x], Command) and module_list[x].base and module_list[x] \
.required_superuser:
continue
module_.append(module_list[x].bind_prefix)
help_msg.append(' | '.join(module_))
help_msg.append(
'使用~help <模块名>查看详细信息。\n你也可以通过查阅文档获取帮助:\nhttps://bot.teahou.se/wiki/')
help_msg.append('[本消息将在一分钟后撤回]')
send = await msg.sendMessage('\n'.join(help_msg))
await msg.sleep(60)
await send.delete()
version = on_command('version',

View file

@ -30,7 +30,7 @@ def inner_level_q(ds1, ds2=None):
return result_set
innlevel = on_command('maimai_inner_level', alias=['定数查歌'])
innlevel = on_command('maimai_inner_level', alias=['定数查歌'], developers=['mai-bot', 'OasisAkari'])
@innlevel.handle(['~maimai_inner_level <定数>',
@ -49,7 +49,7 @@ async def _(msg: MessageSession):
mrgex1 = on_regex('maimai_random_music_regex1',
desc='随个[dx/标准][绿黄红紫白]<难度> 随机一首指定条件的乐曲')
desc='随个[dx/标准][绿黄红紫白]<难度> 随机一首指定条件的乐曲', developers=['mai-bot', 'OasisAkari'])
@mrgex1.handle(r"随个((?:dx|sd|标准))?([绿黄红紫白]?)([0-9]+\+?)")
@ -78,7 +78,7 @@ async def _(msg: MessageSession):
await msg.sendMessage("随机命令错误,请检查语法")
mrgex2 = on_regex('maimai_random_music_regex2', desc='XXXmaimaiXXX什么 随机一首歌')
mrgex2 = on_regex('maimai_random_music_regex2', desc='XXXmaimaiXXX什么 随机一首歌', developers=['mai-bot', 'OasisAkari'])
@mrgex2.handle(r".*maimai.*什么", )
@ -86,7 +86,7 @@ async def _(msg: MessageSession):
await msg.sendMessage(song_txt(total_list.random()))
msrgex = on_regex('maimai_search_music_regex', desc='查歌<乐曲标题的一部分> 查询符合条件的乐曲')
msrgex = on_regex('maimai_search_music_regex', desc='查歌<乐曲标题的一部分> 查询符合条件的乐曲', developers=['mai-bot', 'OasisAkari'])
@msrgex.handle(r"查歌(.+)")
@ -107,7 +107,7 @@ async def _(msg: MessageSession):
mqrgex = on_regex('maimai_query_chart_regex',
desc='[绿黄红紫白]id<歌曲编号> 查询乐曲信息或谱面信息')
desc='[绿黄红紫白]id<歌曲编号> 查询乐曲信息或谱面信息', developers=['mai-bot', 'OasisAkari'])
@msrgex.handle(r"([绿黄红紫白]?)id([0-9]+)")
@ -160,7 +160,7 @@ BREAK: {chart['notes'][4]}
wm_list = ['拼机', '推分', '越级', '下埋', '夜勤', '练底力', '练手法', '打旧框', '干饭', '抓绝赞', '收歌']
today = on_command('maimai_today', alias=['今日舞萌', '今日mai'], desc='查看今天的舞萌运势')
today = on_command('maimai_today', alias=['今日舞萌', '今日mai'], desc='查看今天的舞萌运势', developers=['mai-bot', 'OasisAkari'])
@today.handle()
@ -193,7 +193,7 @@ for t in tmp:
if arr[i] != "":
music_aliases[arr[i].lower()].append(arr[0])
mfsrgx = on_regex('maimai_find_song_regex', desc='<歌曲别名>是什么歌 查询乐曲别名对应的乐曲')
mfsrgx = on_regex('maimai_find_song_regex', desc='<歌曲别名>是什么歌 查询乐曲别名对应的乐曲', developers=['mai-bot', 'OasisAkari'])
@mfsrgx.handle(r"(.+)是什么歌")
@ -211,7 +211,7 @@ async def _(msg: MessageSession):
await msg.sendMessage(f"您要找的可能是以下歌曲中的其中一首:\n{s}")
sline = on_command('maimai_scoreline', alias='分数线')
sline = on_command('maimai_scoreline', alias='分数线', developers=['mai-bot', 'OasisAkari'])
@sline.handle(['<难度+歌曲id> <分数线>', '帮助'])
@ -261,7 +261,7 @@ BREAK 50落(一共{brk}个)等价于 {(break_50_reduce / 100):.3f} 个 TAP GREAT
await msg.sendMessage("格式错误,输入“分数线 帮助”以查看帮助信息")
b40 = on_command('maimai_b40')
b40 = on_command('maimai_b40', developers=['mai-bot', 'OasisAkari'])
@b40.handle('<username>')

View file

@ -29,7 +29,7 @@ async def start_check_news(bot: FetchTarget):
file_ = os.path.abspath(f'{PrivateAssets.path}/mcnews.txt')
baseurl = 'https://www.minecraft.net'
url = quote('https://www.minecraft.net/content/minecraft-net/_jcr_content.articles.grid?tileselection=auto&tagsPath=minecraft:article/news,minecraft:article/insider,minecraft:article/culture,minecraft:article/merch,minecraft:stockholm/news,minecraft:stockholm/guides,minecraft:stockholm/deep-dives,minecraft:stockholm/merch,minecraft:stockholm/events,minecraft:stockholm/minecraft-builds,minecraft:stockholm/marketplace&offset=0&pageSize=10')
webrender = Config('infobox_render')
webrender = Config('web_render')
get = webrender + 'source?url=' + url
if not webrender:
return

View file

@ -10,13 +10,13 @@ import ujson as json
from core.elements import MessageSession, Plain, Image, Voice
from core.component import on_command, on_regex, on_option
from core.utils import download_to_cache
from core.utils.image_table import image_table_render, ImageTable
from core.exceptions import AbuseWarning
from database import BotDBUtil
from .dbutils import WikiTargetInfo
from .wikilib_v2 import WikiLib, WhatAreUDoingError, PageInfo
from .getinfobox import get_infobox_pic
from .audit import WikiWhitelistError, audit_allow, audit_remove, audit_list, audit_query
from .htmltable import image_table_render
wiki = on_command('wiki',
alias={'wiki_start_site': 'wiki set', 'interwiki': 'wiki iw'},
@ -67,13 +67,17 @@ async def _(msg: MessageSession):
await msg.sendMessage(f'成功删除自定义Interwiki“{msg.parsed_msg["<Interwiki>"]}')
@wiki.handle(['iw list {展示当前设置的Interwiki}', 'iw show {iw list的别名}'])
@wiki.handle(['iw list {展示当前设置的Interwiki}', 'iw show {iw list的别名}',
'iw (list|show) legacy {展示当前设置的Interwiki旧版}'])
async def _(msg: MessageSession):
target = WikiTargetInfo(msg)
query = target.get_interwikis()
if query != {}:
columns = [[x, query[x]] for x in query]
img = await image_table_render(columns, headers=['Interwiki', 'Url'])
if not msg.parsed_msg['legacy'] and msg.Feature.image:
columns = [[x, query[x]] for x in query]
img = await image_table_render(ImageTable(columns, ['Interwiki', 'Url']))
else:
img = False
if img:
await msg.sendMessage([Image(img), Plain(f'使用~wiki iw get <Interwiki> 可以获取interwiki对应的链接。')])
else:
@ -278,7 +282,7 @@ async def query_pages(msg: MessageSession, title: Union[str, list, tuple],
msg_list = []
wait_msg_list = []
wait_list = []
infobox_render_list = []
web_render_list = []
for q in query_task:
current_task = query_task[q]
ready_for_query_pages = current_task['query']
@ -327,7 +331,7 @@ async def query_pages(msg: MessageSession, title: Union[str, list, tuple],
msg_list.append(Voice(dl))
else:
if msg.Feature.image and r.link is not None:
infobox_render_list.append({r.link: r.info.realurl})
web_render_list.append({r.link: r.info.realurl})
else:
plain_slice = []
wait_plain_slice = []
@ -350,9 +354,9 @@ async def query_pages(msg: MessageSession, title: Union[str, list, tuple],
traceback.print_exc()
if msg_list:
await msg.sendMessage(msg_list)
if infobox_render_list:
if web_render_list and msg.Feature.image:
infobox_msg_list = []
for i in infobox_render_list:
for i in web_render_list:
for ii in i:
get_infobox = await get_infobox_pic(i[ii], ii, headers)
if get_infobox:

View file

@ -12,11 +12,11 @@ from bs4 import BeautifulSoup
from config import Config
from core.logger import Logger
infobox_render = Config('infobox_render')
web_render = Config('web_render')
async def get_infobox_pic(link, page_link, headers) -> Union[str, bool]:
if not infobox_render or page_link == 'https://wdf.ink/6OUp':
if not web_render or page_link == 'https://wdf.ink/6OUp':
return False
try:
Logger.info('Starting find infobox..')
@ -126,7 +126,7 @@ a .heimu,\
if os.path.exists(picname):
os.remove(picname)
async with aiohttp.ClientSession() as session:
async with session.post(infobox_render, headers={
async with session.post(web_render, headers={
'Content-Type': 'application/json',
}, data=json.dumps(html)) as resp:
with open(picname, 'wb+') as jpg:

View file

@ -1,46 +0,0 @@
import os
import traceback
import uuid
import ujson as json
import aiohttp
from tabulate import tabulate
from config import Config
infobox_render = Config('infobox_render')
async def image_table_render(table, headers=None):
if not infobox_render:
return False
try:
convert_to_html = tabulate(table, headers, tablefmt="html")
css = """
<style>table {
border-collapse: collapse;
}
table, th, td {
border: 1px solid black;
}
th, td {
padding: 15px;
text-align: left;
}
tr:nth-child(even) {background-color: #f2f2f2;}</style>"""
html = {'content': convert_to_html + css}
picname = os.path.abspath(f'./cache/{str(uuid.uuid4())}.jpg')
if os.path.exists(picname):
os.remove(picname)
async with aiohttp.ClientSession() as session:
async with session.post(infobox_render, headers={
'Content-Type': 'application/json',
}, data=json.dumps(html)) as resp:
with open(picname, 'wb+') as jpg:
jpg.write(await resp.read())
return picname
except Exception:
traceback.print_exc()
return False