Add API bot
This commit is contained in:
parent
c86524d6a9
commit
2cd45da332
8 changed files with 3109 additions and 3182 deletions
0
bots/api/__init__.py
Normal file
0
bots/api/__init__.py
Normal file
102
bots/api/bot.py
Normal file
102
bots/api/bot.py
Normal file
|
@ -0,0 +1,102 @@
|
|||
import datetime
|
||||
import os
|
||||
import sys
|
||||
from fastapi.responses import JSONResponse
|
||||
import uvicorn
|
||||
from fastapi import FastAPI
|
||||
import jwt
|
||||
|
||||
sys.path.append(os.getcwd())
|
||||
|
||||
from config import Config # noqa: E402
|
||||
from database import BotDBUtil # noqa: E402
|
||||
from modules.wiki.utils.dbutils import WikiTargetInfo # noqa: E402
|
||||
|
||||
app = FastAPI()
|
||||
jwt_secret = Config('jwt_secret')
|
||||
|
||||
|
||||
@app.get("/")
|
||||
async def root():
|
||||
return {"message": "Hello World"}
|
||||
|
||||
|
||||
@app.get('/auth/{token}')
|
||||
async def auth(token: str):
|
||||
try:
|
||||
return jwt.decode(token, jwt_secret, algorithms=['HS256'])
|
||||
except jwt.InvalidSignatureError:
|
||||
return JSONResponse(status_code=403, content={
|
||||
'token': token,
|
||||
'invalid': True
|
||||
})
|
||||
|
||||
|
||||
@app.get('/target/{target_id}')
|
||||
async def get_target(target_id: str):
|
||||
target = BotDBUtil.TargetInfo(target_id)
|
||||
if target.query is None:
|
||||
return JSONResponse(status_code=404, content={
|
||||
'targetId': target_id,
|
||||
'notFound': True,
|
||||
})
|
||||
enabled_modules = target.enabled_modules
|
||||
is_muted = target.is_muted
|
||||
custom_admins = target.custom_admins
|
||||
locale = target.locale
|
||||
petal = target.petal
|
||||
|
||||
command_alias = target.get_option('command_alias')
|
||||
command_prefix = target.get_option('command_prefix')
|
||||
ban = target.get_option('ban')
|
||||
typo_check = target.get_option('typo_check')
|
||||
dice_dc_reversed = target.get_option('dice_dc_reversed')
|
||||
wiki_fandom_addon = target.get_option('wiki_fandom_addon')
|
||||
|
||||
wiki_target = WikiTargetInfo(target_id)
|
||||
wiki_headers = wiki_target.get_headers()
|
||||
wiki_start_wiki = wiki_target.get_start_wiki()
|
||||
wiki_interwikis = wiki_target.get_interwikis()
|
||||
|
||||
return {
|
||||
'targetId': target_id,
|
||||
'enabledModules': enabled_modules,
|
||||
'isMuted': is_muted,
|
||||
'customAdmins': custom_admins,
|
||||
'locale': locale,
|
||||
'petal': petal,
|
||||
'commandAlias': command_alias,
|
||||
'commandPrefix': command_prefix,
|
||||
'ban': ban,
|
||||
'typoCheck': typo_check,
|
||||
'diceDcReversed': dice_dc_reversed,
|
||||
'wiki': {
|
||||
'fandomAddon': wiki_fandom_addon,
|
||||
'headers': wiki_headers,
|
||||
'startWiki': wiki_start_wiki,
|
||||
'interwikis': wiki_interwikis
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@app.get('/sender/{sender_id}')
|
||||
async def get_sender(sender_id: str):
|
||||
sender = BotDBUtil.SenderInfo(sender_id)
|
||||
isInBlockList = sender.query.isInBlockList
|
||||
isInAllowList = sender.query.isInAllowList
|
||||
isSuperUser = sender.query.isSuperUser
|
||||
warns = sender.query.warns
|
||||
disable_typing = sender.query.disable_typing
|
||||
|
||||
return {
|
||||
'senderId': sender_id,
|
||||
'isInBlockList': isInBlockList,
|
||||
'isInAllowList': isInAllowList,
|
||||
'isSuperUser': isSuperUser,
|
||||
'warns': warns,
|
||||
'disableTyping': disable_typing
|
||||
}
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
uvicorn.run("bot:app", port=Config('api_port') or 5000, log_level="info", reload=True)
|
|
@ -1,63 +1,65 @@
|
|||
# https://toml.io/en/v1.0.0
|
||||
# REMEMBER: TOML is not like Python. Do not use Python syntax here.
|
||||
# Example: Boolean values in TOML must be lowercase.
|
||||
# If you don't need some functions, please delete the corresponding keys.
|
||||
|
||||
[secret]
|
||||
db_path = "mysql+pymysql://"
|
||||
check_accessKeyId =
|
||||
check_accessKeySecret =
|
||||
web_render =
|
||||
proxy =
|
||||
dc_token =
|
||||
tg_token =
|
||||
matrix_homeserver =
|
||||
matrix_user =
|
||||
matrix_token =
|
||||
kook_token =
|
||||
openai_api_key =
|
||||
nl2c_model =
|
||||
curseforge_api_key =
|
||||
exchange_rate_api_key =
|
||||
wolfram_alpha_appid =
|
||||
|
||||
[cfg]
|
||||
base_superuser = "QQ|2596322644"
|
||||
debug = false
|
||||
cache_path = "./cache/"
|
||||
command_prefix = ["~", "~"]
|
||||
confirm_command = ["是", "对", "對", "yes", "Yes", "YES", "y", "Y"]
|
||||
bug_report_url = "https://s.wd-ljt.com/botreportbug"
|
||||
bug_report_targets =
|
||||
donate_url = "https://afdian.net/@teahouse"
|
||||
help_url = "https://bot.teahouse.team"
|
||||
issue_url = "https://github.com/Teahouse-Studios/bot/issues/new/choose"
|
||||
wiki_whitelist_url = "https://s.wd-ljt.com/botwhitelist"
|
||||
rickroll_url = "https://wdf.ink/6OUp"
|
||||
web_render_local =
|
||||
qq_account = 2314163511
|
||||
qq_host = "127.0.0.1:11451"
|
||||
qq_invite_join_group_notice = true
|
||||
qq_disable_temp_session = false
|
||||
qq_enable_listening_self_message = false
|
||||
allow_request_private_ip = false
|
||||
allow_bot_auto_approve_group_invite = false
|
||||
qq_join_group_application_link = "https://github.com/Teahouse-Studios/bot/issues/new?assignees=OasisAkari&labels=New&template=add_new_group.yaml&title=%5BNEW%5D%3A+"
|
||||
slower_schedule = false
|
||||
enable_dirty_check = true
|
||||
enable_urlmanager = true
|
||||
enable_tos = false
|
||||
enable_analytics = true
|
||||
enable_eval = true
|
||||
enable_rickroll = true
|
||||
coin_limit = 10000
|
||||
coin_faceup_rate = 4994
|
||||
coin_facedown_rate = 4994
|
||||
dice_limit = 100
|
||||
dice_roll_limit = 10
|
||||
dice_mod_max = 10000
|
||||
dice_mod_min = -10000
|
||||
dice_output_cnt = 50
|
||||
dice_output_len = 200
|
||||
dice_detail_cnt = 5
|
||||
dice_count_limit = 10
|
||||
# https://toml.io/en/v1.0.0
|
||||
# REMEMBER: TOML is not like Python. Do not use Python syntax here.
|
||||
# Example: Boolean values in TOML must be lowercase.
|
||||
# If you don't need some functions, please delete the corresponding keys.
|
||||
|
||||
[secret]
|
||||
db_path = "mysql+pymysql://"
|
||||
check_accessKeyId =
|
||||
check_accessKeySecret =
|
||||
web_render =
|
||||
proxy =
|
||||
dc_token =
|
||||
tg_token =
|
||||
matrix_homeserver =
|
||||
matrix_user =
|
||||
matrix_token =
|
||||
kook_token =
|
||||
openai_api_key =
|
||||
nl2c_model =
|
||||
curseforge_api_key =
|
||||
exchange_rate_api_key =
|
||||
wolfram_alpha_appid =
|
||||
jwt_secret =
|
||||
|
||||
[cfg]
|
||||
base_superuser = "QQ|2596322644"
|
||||
debug = false
|
||||
cache_path = "./cache/"
|
||||
command_prefix = ["~", "~"]
|
||||
confirm_command = ["是", "对", "對", "yes", "Yes", "YES", "y", "Y"]
|
||||
bug_report_url = "https://s.wd-ljt.com/botreportbug"
|
||||
bug_report_targets =
|
||||
donate_url = "https://afdian.net/@teahouse"
|
||||
help_url = "https://bot.teahouse.team"
|
||||
issue_url = "https://github.com/Teahouse-Studios/bot/issues/new/choose"
|
||||
wiki_whitelist_url = "https://s.wd-ljt.com/botwhitelist"
|
||||
rickroll_url = "https://wdf.ink/6OUp"
|
||||
web_render_local =
|
||||
qq_account = 2314163511
|
||||
qq_host = "127.0.0.1:11451"
|
||||
qq_invite_join_group_notice = true
|
||||
qq_disable_temp_session = false
|
||||
qq_enable_listening_self_message = false
|
||||
allow_request_private_ip = false
|
||||
allow_bot_auto_approve_group_invite = false
|
||||
qq_join_group_application_link = "https://github.com/Teahouse-Studios/bot/issues/new?assignees=OasisAkari&labels=New&template=add_new_group.yaml&title=%5BNEW%5D%3A+"
|
||||
slower_schedule = false
|
||||
enable_dirty_check = true
|
||||
enable_urlmanager = true
|
||||
enable_tos = false
|
||||
enable_analytics = true
|
||||
enable_eval = true
|
||||
enable_rickroll = true
|
||||
coin_limit = 10000
|
||||
coin_faceup_rate = 4994
|
||||
coin_facedown_rate = 4994
|
||||
dice_limit = 100
|
||||
dice_roll_limit = 10
|
||||
dice_mod_max = 10000
|
||||
dice_mod_min = -10000
|
||||
dice_output_cnt = 50
|
||||
dice_output_len = 200
|
||||
dice_detail_cnt = 5
|
||||
dice_count_limit = 10
|
||||
api_port = 5000
|
||||
|
|
|
@ -1,83 +1,83 @@
|
|||
from sqlalchemy import Column, Integer, String, Text, TIMESTAMP, Boolean, text
|
||||
from sqlalchemy.dialects.mysql import LONGTEXT
|
||||
|
||||
from database.orm import Session, DB_LINK
|
||||
from database.orm_base import Base
|
||||
|
||||
is_mysql = DB_LINK.startswith('mysql')
|
||||
|
||||
|
||||
class SenderInfo(Base):
|
||||
"""发送者信息"""
|
||||
__tablename__ = "SenderInfo"
|
||||
id = Column(String(512), primary_key=True)
|
||||
isInBlockList = Column(Boolean, default=False)
|
||||
isInAllowList = Column(Boolean, default=False)
|
||||
isSuperUser = Column(Boolean, default=False)
|
||||
warns = Column(Integer, default='0')
|
||||
disable_typing = Column(Boolean, default=False)
|
||||
|
||||
|
||||
class TargetInfo(Base):
|
||||
__tablename__ = "TargetInfo"
|
||||
targetId = Column(String(512), primary_key=True)
|
||||
enabledModules = Column(LONGTEXT if is_mysql else Text, default='[]')
|
||||
options = Column(LONGTEXT if is_mysql else Text, default='{}')
|
||||
custom_admins = Column(LONGTEXT if is_mysql else Text, default='[]')
|
||||
muted = Column(Boolean, default=False)
|
||||
locale = Column(String(512), default='zh_cn')
|
||||
petal = Column(Integer, default=0)
|
||||
|
||||
|
||||
class StoredData(Base):
|
||||
"""数据存储"""
|
||||
__tablename__ = "StoredData"
|
||||
name = Column(String(512), primary_key=True)
|
||||
value = Column(LONGTEXT if is_mysql else Text)
|
||||
|
||||
|
||||
class CommandTriggerTime(Base):
|
||||
"""命令触发时间"""
|
||||
__tablename__ = "CommandTriggerTime"
|
||||
targetId = Column(String(512), primary_key=True)
|
||||
commandName = Column(String(512))
|
||||
timestamp = Column(TIMESTAMP, default=text('CURRENT_TIMESTAMP'))
|
||||
|
||||
|
||||
class GroupAllowList(Base):
|
||||
__tablename__ = "GroupAllowList"
|
||||
targetId = Column(String(512), primary_key=True)
|
||||
|
||||
|
||||
class AnalyticsData(Base):
|
||||
"""统计信息"""
|
||||
__tablename__ = "Analytics"
|
||||
id = Column(Integer, primary_key=True)
|
||||
moduleName = Column(String(512))
|
||||
moduleType = Column(String(512))
|
||||
targetId = Column(String(512))
|
||||
senderId = Column(String(512))
|
||||
command = Column(LONGTEXT if is_mysql else Text)
|
||||
timestamp = Column(TIMESTAMP, default=text('CURRENT_TIMESTAMP'))
|
||||
|
||||
__table_args__ = {'mysql_charset': 'utf8mb4'}
|
||||
|
||||
|
||||
class DBVersion(Base):
|
||||
__tablename__ = "DBVersion"
|
||||
value = Column(String(512), primary_key=True)
|
||||
|
||||
|
||||
class UnfriendlyActionsTable(Base):
|
||||
__tablename__ = "unfriendly_action"
|
||||
id = Column(Integer, primary_key=True)
|
||||
targetId = Column(String(512))
|
||||
senderId = Column(String(512))
|
||||
action = Column(String(512))
|
||||
detail = Column(String(512))
|
||||
timestamp = Column(TIMESTAMP, default=text('CURRENT_TIMESTAMP'))
|
||||
|
||||
|
||||
Session.create()
|
||||
__all__ = ["SenderInfo", "TargetInfo", "CommandTriggerTime", "GroupAllowList",
|
||||
"StoredData", "DBVersion", "AnalyticsData", "UnfriendlyActionsTable"]
|
||||
from sqlalchemy import Column, Integer, String, Text, TIMESTAMP, Boolean, text
|
||||
from sqlalchemy.dialects.mysql import LONGTEXT
|
||||
|
||||
from database.orm import Session, DB_LINK
|
||||
from database.orm_base import Base
|
||||
|
||||
is_mysql = DB_LINK.startswith('mysql')
|
||||
|
||||
|
||||
class SenderInfo(Base):
|
||||
"""发送者信息"""
|
||||
__tablename__ = "SenderInfo"
|
||||
id = Column(String(512), primary_key=True)
|
||||
isInBlockList = Column(Boolean, default=False)
|
||||
isInAllowList = Column(Boolean, default=False)
|
||||
isSuperUser = Column(Boolean, default=False)
|
||||
warns = Column(Integer, default='0')
|
||||
disable_typing = Column(Boolean, default=False)
|
||||
|
||||
|
||||
class TargetInfo(Base):
|
||||
__tablename__ = "TargetInfo"
|
||||
targetId = Column(String(512), primary_key=True)
|
||||
enabledModules = Column(LONGTEXT if is_mysql else Text, default='[]')
|
||||
options = Column(LONGTEXT if is_mysql else Text, default='{}')
|
||||
custom_admins = Column(LONGTEXT if is_mysql else Text, default='[]')
|
||||
muted = Column(Boolean, default=False)
|
||||
locale = Column(String(512), default='zh_cn')
|
||||
petal = Column(Integer, default=0)
|
||||
|
||||
|
||||
class StoredData(Base):
|
||||
"""数据存储"""
|
||||
__tablename__ = "StoredData"
|
||||
name = Column(String(512), primary_key=True)
|
||||
value = Column(LONGTEXT if is_mysql else Text)
|
||||
|
||||
|
||||
class CommandTriggerTime(Base):
|
||||
"""命令触发时间"""
|
||||
__tablename__ = "CommandTriggerTime"
|
||||
targetId = Column(String(512), primary_key=True)
|
||||
commandName = Column(String(512))
|
||||
timestamp = Column(TIMESTAMP, default=text('CURRENT_TIMESTAMP'))
|
||||
|
||||
|
||||
class GroupAllowList(Base):
|
||||
__tablename__ = "GroupAllowList"
|
||||
targetId = Column(String(512), primary_key=True)
|
||||
|
||||
|
||||
class AnalyticsData(Base):
|
||||
"""统计信息"""
|
||||
__tablename__ = "Analytics"
|
||||
id = Column(Integer, primary_key=True)
|
||||
moduleName = Column(String(512))
|
||||
moduleType = Column(String(512))
|
||||
targetId = Column(String(512))
|
||||
senderId = Column(String(512))
|
||||
command = Column(LONGTEXT if is_mysql else Text)
|
||||
timestamp = Column(TIMESTAMP, default=text('CURRENT_TIMESTAMP'))
|
||||
|
||||
__table_args__ = {'mysql_charset': 'utf8mb4'}
|
||||
|
||||
|
||||
class DBVersion(Base):
|
||||
__tablename__ = "DBVersion"
|
||||
value = Column(String(512), primary_key=True)
|
||||
|
||||
|
||||
class UnfriendlyActionsTable(Base):
|
||||
__tablename__ = "unfriendly_action"
|
||||
id = Column(Integer, primary_key=True)
|
||||
targetId = Column(String(512))
|
||||
senderId = Column(String(512))
|
||||
action = Column(String(512))
|
||||
detail = Column(String(512))
|
||||
timestamp = Column(TIMESTAMP, default=text('CURRENT_TIMESTAMP'))
|
||||
|
||||
|
||||
Session.create()
|
||||
__all__ = ["SenderInfo", "TargetInfo", "CommandTriggerTime", "GroupAllowList",
|
||||
"StoredData", "DBVersion", "AnalyticsData", "UnfriendlyActionsTable"]
|
||||
|
|
|
@ -1,229 +1,243 @@
|
|||
import os
|
||||
import platform
|
||||
import psutil
|
||||
import time
|
||||
|
||||
from config import Config
|
||||
from core.builtins import Bot, command_prefix, PrivateAssets
|
||||
from core.component import module
|
||||
from core.utils.i18n import get_available_locales, Locale, load_locale_file
|
||||
from cpuinfo import get_cpu_info
|
||||
from database import BotDBUtil
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
version = module('version', base=True, desc='{core.help.version}', developers=['OasisAkari', 'Dianliang233'])
|
||||
|
||||
|
||||
@version.handle()
|
||||
async def bot_version(msg: Bot.MessageSession):
|
||||
|
||||
ver = os.path.abspath(PrivateAssets.path + '/version')
|
||||
tag = os.path.abspath(PrivateAssets.path + '/version_tag')
|
||||
open_version = open(ver, 'r')
|
||||
open_tag = open(tag, 'r')
|
||||
msgs = msg.locale.t('core.message.version', version_tag=open_tag.read(), commit=open_version.read())
|
||||
open_version.close()
|
||||
await msg.finish(msgs, msgs)
|
||||
|
||||
|
||||
ping = module('ping', base=True, desc='{core.help.ping}', developers=['OasisAkari'])
|
||||
|
||||
started_time = datetime.now()
|
||||
|
||||
|
||||
@ping.handle()
|
||||
async def _(msg: Bot.MessageSession):
|
||||
checkpermisson = msg.checkSuperUser()
|
||||
result = "Pong!"
|
||||
if checkpermisson:
|
||||
timediff = str(datetime.now() - started_time)
|
||||
Boot_Start = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(psutil.boot_time()))
|
||||
Cpu_usage = psutil.cpu_percent()
|
||||
RAM = int(psutil.virtual_memory().total / (1024 * 1024))
|
||||
RAM_percent = psutil.virtual_memory().percent
|
||||
Swap = int(psutil.swap_memory().total / (1024 * 1024))
|
||||
Swap_percent = psutil.swap_memory().percent
|
||||
Disk = int(psutil.disk_usage('/').used / (1024 * 1024 * 1024))
|
||||
DiskTotal = int(psutil.disk_usage('/').total / (1024 * 1024 * 1024))
|
||||
"""
|
||||
try:
|
||||
GroupList = len(await app.groupList())
|
||||
except Exception:
|
||||
GroupList = msg.locale.t('core.message.ping.failed')
|
||||
try:
|
||||
FriendList = len(await app.friendList())
|
||||
except Exception:
|
||||
FriendList = msg.locale.t('core.message.ping.failed')
|
||||
"""
|
||||
result += '\n' + msg.locale.t("core.message.ping.detail",
|
||||
system_boot_time=Boot_Start,
|
||||
bot_running_time=timediff,
|
||||
python_version=platform.python_version(),
|
||||
cpu_brand=get_cpu_info()['brand_raw'],
|
||||
cpu_usage=Cpu_usage,
|
||||
ram=RAM,
|
||||
ram_percent=RAM_percent,
|
||||
swap=Swap,
|
||||
swap_percent=Swap_percent,
|
||||
disk_space=Disk,
|
||||
disk_space_total=DiskTotal)
|
||||
await msg.finish(result)
|
||||
|
||||
|
||||
admin = module('admin',
|
||||
base=True,
|
||||
required_admin=True,
|
||||
developers=['OasisAkari'],
|
||||
desc='{core.help.admin}'
|
||||
)
|
||||
|
||||
|
||||
@admin.handle([
|
||||
'add <UserID> {{core.help.admin.add}}',
|
||||
'del <UserID> {{core.help.admin.del}}',
|
||||
'list {{core.help.admin.list}}'])
|
||||
async def config_gu(msg: Bot.MessageSession):
|
||||
if 'list' in msg.parsed_msg:
|
||||
if msg.custom_admins:
|
||||
await msg.finish(msg.locale.t("core.message.admin.list") + '\n'.join(msg.custom_admins))
|
||||
else:
|
||||
await msg.finish(msg.locale.t("core.message.admin.list.none"))
|
||||
user = msg.parsed_msg['<UserID>']
|
||||
if not user.startswith(f'{msg.target.senderFrom}|'):
|
||||
await msg.finish(msg.locale.t('core.message.admin.invalid', target=msg.target.senderFrom))
|
||||
if 'add' in msg.parsed_msg:
|
||||
if user and user not in msg.custom_admins:
|
||||
if msg.data.add_custom_admin(user):
|
||||
await msg.finish(msg.locale.t('success'))
|
||||
else:
|
||||
await msg.finish(msg.locale.t("core.message.admin.already"))
|
||||
if 'del' in msg.parsed_msg:
|
||||
if user:
|
||||
if msg.data.remove_custom_admin(user):
|
||||
await msg.finish(msg.locale.t('success'))
|
||||
|
||||
|
||||
@admin.handle('ban <UserID> {{core.help.admin.ban}}', 'unban <UserID> {{core.help.admin.unban}}')
|
||||
async def config_ban(msg: Bot.MessageSession):
|
||||
user = msg.parsed_msg['<UserID>']
|
||||
if not user.startswith(f'{msg.target.senderFrom}|'):
|
||||
await msg.finish(msg.locale.t('core.message.admin.invalid', target=msg.target.senderFrom))
|
||||
if user == msg.target.senderId:
|
||||
await msg.finish(msg.locale.t("core.message.admin.ban.self"))
|
||||
if 'ban' in msg.parsed_msg:
|
||||
if user not in msg.options.get('ban', []):
|
||||
msg.data.edit_option('ban', msg.options.get('ban', []) + [user])
|
||||
await msg.finish(msg.locale.t('success'))
|
||||
else:
|
||||
await msg.finish(msg.locale.t("core.message.admin.ban.already"))
|
||||
if 'unban' in msg.parsed_msg:
|
||||
if user in (banlist := msg.options.get('ban', [])):
|
||||
banlist.remove(user)
|
||||
msg.data.edit_option('ban', banlist)
|
||||
await msg.finish(msg.locale.t('success'))
|
||||
else:
|
||||
await msg.finish(msg.locale.t("core.message.admin.ban.not_yet"))
|
||||
|
||||
|
||||
locale = module('locale', base=True, developers=['Dianliang233', 'Light-Beacon'])
|
||||
|
||||
|
||||
@locale.handle('{{core.help.locale}}')
|
||||
async def _(msg: Bot.MessageSession):
|
||||
lang = msg.locale.t("language")
|
||||
avaliable_lang = msg.locale.t("message.delimiter").join(get_available_locales())
|
||||
await msg.finish(f"{msg.locale.t('core.message.locale')}{msg.locale.t('language')}\n{msg.locale.t('core.message.locale.set.prompt', langlist=avaliable_lang, prefix=command_prefix[0])}")
|
||||
|
||||
|
||||
@locale.handle('<lang> {{core.help.locale.set}}', required_admin=True)
|
||||
async def config_gu(msg: Bot.MessageSession):
|
||||
lang = msg.parsed_msg['<lang>']
|
||||
if lang in get_available_locales():
|
||||
if BotDBUtil.TargetInfo(msg.target.targetId).edit('locale', lang):
|
||||
await msg.finish(Locale(lang).t('success'))
|
||||
else:
|
||||
avaliable_lang = msg.locale.t("message.delimiter").join(get_available_locales())
|
||||
await msg.finish(msg.locale.t("core.message.locale.set.invalid", langlist=avaliable_lang))
|
||||
|
||||
|
||||
@locale.handle('reload {{core.help.locale.reload}}', required_superuser=True)
|
||||
async def reload_locale(msg: Bot.MessageSession):
|
||||
err = load_locale_file()
|
||||
if len(err) == 0:
|
||||
await msg.finish(msg.locale.t("success"))
|
||||
else:
|
||||
await msg.finish(msg.locale.t("core.message.locale.reload.failed", detail='\n'.join(err)))
|
||||
|
||||
|
||||
whoami = module('whoami', developers=['Dianliang233'], base=True)
|
||||
|
||||
|
||||
@whoami.handle('{{core.help.whoami}}')
|
||||
async def _(msg: Bot.MessageSession):
|
||||
rights = ''
|
||||
if await msg.checkNativePermission():
|
||||
rights += '\n' + msg.locale.t("core.message.whoami.admin")
|
||||
elif await msg.checkPermission():
|
||||
rights += '\n' + msg.locale.t("core.message.whoami.botadmin")
|
||||
if msg.checkSuperUser():
|
||||
rights += '\n' + msg.locale.t("core.message.whoami.superuser")
|
||||
await msg.finish(msg.locale.t('core.message.whoami', senderid=msg.target.senderId, targetid=msg.target.targetId) + rights,
|
||||
disable_secret_check=True)
|
||||
|
||||
|
||||
tog = module('toggle', developers=['OasisAkari'], base=True, required_admin=True)
|
||||
|
||||
|
||||
@tog.handle('typing {{core.help.toggle.typing}}')
|
||||
async def _(msg: Bot.MessageSession):
|
||||
target = BotDBUtil.SenderInfo(msg.target.senderId)
|
||||
state = target.query.disable_typing
|
||||
if not state:
|
||||
target.edit('disable_typing', True)
|
||||
await msg.finish(msg.locale.t('core.message.toggle.typing.disable'))
|
||||
else:
|
||||
target.edit('disable_typing', False)
|
||||
await msg.finish(msg.locale.t('core.message.toggle.typing.enable'))
|
||||
|
||||
|
||||
@tog.handle('check {{core.help.toggle.check}}')
|
||||
async def _(msg: Bot.MessageSession):
|
||||
state = msg.options.get('typo_check')
|
||||
if state:
|
||||
msg.data.edit_option('typo_check', False)
|
||||
await msg.finish(msg.locale.t('core.message.toggle.check.enable'))
|
||||
else:
|
||||
msg.data.edit_option('typo_check', True)
|
||||
await msg.finish(msg.locale.t('core.message.toggle.check.disable'))
|
||||
|
||||
|
||||
mute = module('mute', developers=['Dianliang233'], base=True, required_admin=True,
|
||||
desc='{core.help.mute}')
|
||||
|
||||
|
||||
@mute.handle()
|
||||
async def _(msg: Bot.MessageSession):
|
||||
state = msg.data.switch_mute()
|
||||
if state:
|
||||
await msg.finish(msg.locale.t('core.message.mute.enable'))
|
||||
else:
|
||||
await msg.finish(msg.locale.t('core.message.mute.disable'))
|
||||
|
||||
|
||||
leave = module(
|
||||
'leave',
|
||||
developers=['OasisAkari'],
|
||||
base=True,
|
||||
required_admin=True,
|
||||
available_for='QQ|Group',
|
||||
alias='dismiss',
|
||||
desc='{core.help.leave}')
|
||||
|
||||
|
||||
@leave.handle()
|
||||
async def _(msg: Bot.MessageSession):
|
||||
confirm = await msg.waitConfirm(msg.locale.t('core.message.leave.confirm'))
|
||||
if confirm:
|
||||
await msg.sendMessage(msg.locale.t('core.message.leave.success'))
|
||||
await msg.call_api('set_group_leave', group_id=msg.session.target)
|
||||
import os
|
||||
import platform
|
||||
import jwt
|
||||
import psutil
|
||||
import time
|
||||
|
||||
from config import Config
|
||||
from core.builtins import Bot, command_prefix, PrivateAssets
|
||||
from core.component import module
|
||||
from core.utils.i18n import get_available_locales, Locale, load_locale_file
|
||||
from cpuinfo import get_cpu_info
|
||||
from database import BotDBUtil
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
jwt_secret = Config('jwt_secret')
|
||||
|
||||
version = module('version', base=True, desc='{core.help.version}', developers=['OasisAkari', 'Dianliang233'])
|
||||
|
||||
|
||||
@version.handle()
|
||||
async def bot_version(msg: Bot.MessageSession):
|
||||
|
||||
ver = os.path.abspath(PrivateAssets.path + '/version')
|
||||
tag = os.path.abspath(PrivateAssets.path + '/version_tag')
|
||||
open_version = open(ver, 'r')
|
||||
open_tag = open(tag, 'r')
|
||||
msgs = msg.locale.t('core.message.version', version_tag=open_tag.read(), commit=open_version.read())
|
||||
open_version.close()
|
||||
await msg.finish(msgs, msgs)
|
||||
|
||||
|
||||
ping = module('ping', base=True, desc='{core.help.ping}', developers=['OasisAkari'])
|
||||
|
||||
started_time = datetime.now()
|
||||
|
||||
|
||||
@ping.handle()
|
||||
async def _(msg: Bot.MessageSession):
|
||||
checkpermisson = msg.checkSuperUser()
|
||||
result = "Pong!"
|
||||
if checkpermisson:
|
||||
timediff = str(datetime.now() - started_time)
|
||||
Boot_Start = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(psutil.boot_time()))
|
||||
Cpu_usage = psutil.cpu_percent()
|
||||
RAM = int(psutil.virtual_memory().total / (1024 * 1024))
|
||||
RAM_percent = psutil.virtual_memory().percent
|
||||
Swap = int(psutil.swap_memory().total / (1024 * 1024))
|
||||
Swap_percent = psutil.swap_memory().percent
|
||||
Disk = int(psutil.disk_usage('/').used / (1024 * 1024 * 1024))
|
||||
DiskTotal = int(psutil.disk_usage('/').total / (1024 * 1024 * 1024))
|
||||
"""
|
||||
try:
|
||||
GroupList = len(await app.groupList())
|
||||
except Exception:
|
||||
GroupList = msg.locale.t('core.message.ping.failed')
|
||||
try:
|
||||
FriendList = len(await app.friendList())
|
||||
except Exception:
|
||||
FriendList = msg.locale.t('core.message.ping.failed')
|
||||
"""
|
||||
result += '\n' + msg.locale.t("core.message.ping.detail",
|
||||
system_boot_time=Boot_Start,
|
||||
bot_running_time=timediff,
|
||||
python_version=platform.python_version(),
|
||||
cpu_brand=get_cpu_info()['brand_raw'],
|
||||
cpu_usage=Cpu_usage,
|
||||
ram=RAM,
|
||||
ram_percent=RAM_percent,
|
||||
swap=Swap,
|
||||
swap_percent=Swap_percent,
|
||||
disk_space=Disk,
|
||||
disk_space_total=DiskTotal)
|
||||
await msg.finish(result)
|
||||
|
||||
|
||||
admin = module('admin',
|
||||
base=True,
|
||||
required_admin=True,
|
||||
developers=['OasisAkari'],
|
||||
desc='{core.help.admin}'
|
||||
)
|
||||
|
||||
|
||||
@admin.handle([
|
||||
'add <UserID> {{core.help.admin.add}}',
|
||||
'del <UserID> {{core.help.admin.del}}',
|
||||
'list {{core.help.admin.list}}'])
|
||||
async def config_gu(msg: Bot.MessageSession):
|
||||
if 'list' in msg.parsed_msg:
|
||||
if msg.custom_admins:
|
||||
await msg.finish(msg.locale.t("core.message.admin.list") + '\n'.join(msg.custom_admins))
|
||||
else:
|
||||
await msg.finish(msg.locale.t("core.message.admin.list.none"))
|
||||
user = msg.parsed_msg['<UserID>']
|
||||
if not user.startswith(f'{msg.target.senderFrom}|'):
|
||||
await msg.finish(msg.locale.t('core.message.admin.invalid', target=msg.target.senderFrom))
|
||||
if 'add' in msg.parsed_msg:
|
||||
if user and user not in msg.custom_admins:
|
||||
if msg.data.add_custom_admin(user):
|
||||
await msg.finish(msg.locale.t('success'))
|
||||
else:
|
||||
await msg.finish(msg.locale.t("core.message.admin.already"))
|
||||
if 'del' in msg.parsed_msg:
|
||||
if user:
|
||||
if msg.data.remove_custom_admin(user):
|
||||
await msg.finish(msg.locale.t('success'))
|
||||
|
||||
|
||||
@admin.handle('ban <UserID> {{core.help.admin.ban}}', 'unban <UserID> {{core.help.admin.unban}}')
|
||||
async def config_ban(msg: Bot.MessageSession):
|
||||
user = msg.parsed_msg['<UserID>']
|
||||
if not user.startswith(f'{msg.target.senderFrom}|'):
|
||||
await msg.finish(msg.locale.t('core.message.admin.invalid', target=msg.target.senderFrom))
|
||||
if user == msg.target.senderId:
|
||||
await msg.finish(msg.locale.t("core.message.admin.ban.self"))
|
||||
if 'ban' in msg.parsed_msg:
|
||||
if user not in msg.options.get('ban', []):
|
||||
msg.data.edit_option('ban', msg.options.get('ban', []) + [user])
|
||||
await msg.finish(msg.locale.t('success'))
|
||||
else:
|
||||
await msg.finish(msg.locale.t("core.message.admin.ban.already"))
|
||||
if 'unban' in msg.parsed_msg:
|
||||
if user in (banlist := msg.options.get('ban', [])):
|
||||
banlist.remove(user)
|
||||
msg.data.edit_option('ban', banlist)
|
||||
await msg.finish(msg.locale.t('success'))
|
||||
else:
|
||||
await msg.finish(msg.locale.t("core.message.admin.ban.not_yet"))
|
||||
|
||||
|
||||
locale = module('locale', base=True, developers=['Dianliang233', 'Light-Beacon'])
|
||||
|
||||
|
||||
@locale.handle('{{core.help.locale}}')
|
||||
async def _(msg: Bot.MessageSession):
|
||||
lang = msg.locale.t("language")
|
||||
avaliable_lang = msg.locale.t("message.delimiter").join(get_available_locales())
|
||||
await msg.finish(f"{msg.locale.t('core.message.locale')}{msg.locale.t('language')}\n{msg.locale.t('core.message.locale.set.prompt', langlist=avaliable_lang, prefix=command_prefix[0])}")
|
||||
|
||||
|
||||
@locale.handle('<lang> {{core.help.locale.set}}', required_admin=True)
|
||||
async def config_gu(msg: Bot.MessageSession):
|
||||
lang = msg.parsed_msg['<lang>']
|
||||
if lang in get_available_locales():
|
||||
if BotDBUtil.TargetInfo(msg.target.targetId).edit('locale', lang):
|
||||
await msg.finish(Locale(lang).t('success'))
|
||||
else:
|
||||
avaliable_lang = msg.locale.t("message.delimiter").join(get_available_locales())
|
||||
await msg.finish(msg.locale.t("core.message.locale.set.invalid", langlist=avaliable_lang))
|
||||
|
||||
|
||||
@locale.handle('reload {{core.help.locale.reload}}', required_superuser=True)
|
||||
async def reload_locale(msg: Bot.MessageSession):
|
||||
err = load_locale_file()
|
||||
if len(err) == 0:
|
||||
await msg.finish(msg.locale.t("success"))
|
||||
else:
|
||||
await msg.finish(msg.locale.t("core.message.locale.reload.failed", detail='\n'.join(err)))
|
||||
|
||||
|
||||
whoami = module('whoami', developers=['Dianliang233'], base=True)
|
||||
|
||||
|
||||
@whoami.handle('{{core.help.whoami}}')
|
||||
async def _(msg: Bot.MessageSession):
|
||||
rights = ''
|
||||
if await msg.checkNativePermission():
|
||||
rights += '\n' + msg.locale.t("core.message.whoami.admin")
|
||||
elif await msg.checkPermission():
|
||||
rights += '\n' + msg.locale.t("core.message.whoami.botadmin")
|
||||
if msg.checkSuperUser():
|
||||
rights += '\n' + msg.locale.t("core.message.whoami.superuser")
|
||||
await msg.finish(msg.locale.t('core.message.whoami', senderid=msg.target.senderId, targetid=msg.target.targetId) + rights,
|
||||
disable_secret_check=True)
|
||||
|
||||
|
||||
tog = module('toggle', developers=['OasisAkari'], base=True, required_admin=True)
|
||||
|
||||
|
||||
@tog.handle('typing {{core.help.toggle.typing}}')
|
||||
async def _(msg: Bot.MessageSession):
|
||||
target = BotDBUtil.SenderInfo(msg.target.senderId)
|
||||
state = target.query.disable_typing
|
||||
if not state:
|
||||
target.edit('disable_typing', True)
|
||||
await msg.finish(msg.locale.t('core.message.toggle.typing.disable'))
|
||||
else:
|
||||
target.edit('disable_typing', False)
|
||||
await msg.finish(msg.locale.t('core.message.toggle.typing.enable'))
|
||||
|
||||
|
||||
@tog.handle('check {{core.help.toggle.check}}')
|
||||
async def _(msg: Bot.MessageSession):
|
||||
state = msg.options.get('typo_check')
|
||||
if state:
|
||||
msg.data.edit_option('typo_check', False)
|
||||
await msg.finish(msg.locale.t('core.message.toggle.check.enable'))
|
||||
else:
|
||||
msg.data.edit_option('typo_check', True)
|
||||
await msg.finish(msg.locale.t('core.message.toggle.check.disable'))
|
||||
|
||||
|
||||
mute = module('mute', developers=['Dianliang233'], base=True, required_admin=True,
|
||||
desc='{core.help.mute}')
|
||||
|
||||
|
||||
@mute.handle()
|
||||
async def _(msg: Bot.MessageSession):
|
||||
state = msg.data.switch_mute()
|
||||
if state:
|
||||
await msg.finish(msg.locale.t('core.message.mute.enable'))
|
||||
else:
|
||||
await msg.finish(msg.locale.t('core.message.mute.disable'))
|
||||
|
||||
|
||||
leave = module(
|
||||
'leave',
|
||||
developers=['OasisAkari'],
|
||||
base=True,
|
||||
required_admin=True,
|
||||
available_for='QQ|Group',
|
||||
alias='dismiss',
|
||||
desc='{core.help.leave}')
|
||||
|
||||
|
||||
@leave.handle()
|
||||
async def _(msg: Bot.MessageSession):
|
||||
confirm = await msg.waitConfirm(msg.locale.t('core.message.leave.confirm'))
|
||||
if confirm:
|
||||
await msg.sendMessage(msg.locale.t('core.message.leave.success'))
|
||||
await msg.call_api('set_group_leave', group_id=msg.session.target)
|
||||
|
||||
|
||||
token = module('token', base=True, desc='{core.help.token}', developers=['Dianliang233'])
|
||||
|
||||
|
||||
@token.handle()
|
||||
async def _(msg: Bot.MessageSession):
|
||||
await msg.finish(jwt.encode({
|
||||
'exp': datetime.utcnow() + timedelta(seconds=60 * 60 * 24 * 7), # 7 days
|
||||
'iat': datetime.utcnow(),
|
||||
'senderId': msg.target.senderId,
|
||||
}, jwt_secret, algorithm='HS256'))
|
||||
|
|
670
poetry.lock
generated
670
poetry.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -56,6 +56,8 @@ toml = "^0.10.2"
|
|||
khl-py = "^0.3.16"
|
||||
matrix-nio = "^0.21.2"
|
||||
attrs = "^23.1.0"
|
||||
uvicorn = {extras = ["standard"], version = "^0.23.2"}
|
||||
pyjwt = {extras = ["crypto"], version = "^2.8.0"}
|
||||
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
|
|
4751
requirements.txt
4751
requirements.txt
File diff suppressed because it is too large
Load diff
Reference in a new issue