Archived
1
0
Fork 0
This commit is contained in:
yzhh 2023-02-05 22:33:33 +08:00
parent 8dca12f8ec
commit a6972ddd91
114 changed files with 536 additions and 336 deletions

View file

@ -8,9 +8,10 @@ from bots.aiocqhttp.client import bot
from bots.aiocqhttp.message import MessageSession, FetchTarget
from bots.aiocqhttp.message_guild import MessageSession as MessageSessionGuild
from config import Config
from core.elements import MsgInfo, Session, EnableDirtyWordCheck, PrivateAssets, Url
from core.builtins import EnableDirtyWordCheck, PrivateAssets, Url
from core.parser.message import parser
from core.utils import init, load_prompt, init_async
from core.types import MsgInfo, Session
from core.utils.bot import init, load_prompt, init_async
from database import BotDBUtil
PrivateAssets.set(os.path.abspath(os.path.dirname(__file__) + '/assets'))

View file

@ -15,11 +15,12 @@ from bots.aiocqhttp.client import bot
from bots.aiocqhttp.message_guild import MessageSession as MessageSessionGuild
from config import Config
from core.builtins import Bot
from core.builtins import Plain, Image, Voice, Temp
from core.builtins.message import MessageSession as MS
from core.elements import Plain, Image, MsgInfo, Session, Voice, FetchTarget as FT, \
FetchedSession as FS, FinishedSession as FinS, Temp
from core.elements.message.chain import MessageChain
from core.builtins.message.chain import MessageChain
from core.logger import Logger
from core.types import MsgInfo, Session, FetchTarget as FT, \
FetchedSession as FS, FinishedSession as FinS
from database import BotDBUtil
enable_analytics = Config('enable_analytics')
@ -220,7 +221,8 @@ class FetchTarget(FT):
Temp.data['waiting_for_send_group_message'].append({'fetch': fetch_, 'message': message})
fetch_base_superuser = await FetchTarget.fetch_target(base_superuser)
if fetch_base_superuser:
await fetch_base_superuser.sendDirectMessage('群消息发送被服务器拦截,已暂停群消息发送,使用~resume命令恢复推送。')
await fetch_base_superuser.sendDirectMessage(
'群消息发送被服务器拦截,已暂停群消息发送,使用~resume命令恢复推送。')
except Exception:
Logger.error(traceback.format_exc())

View file

@ -6,10 +6,10 @@ from pathlib import Path
from aiocqhttp import MessageSegment
from bots.aiocqhttp.client import bot
from core.builtins.message import MessageSession as MS
from core.elements import Plain, Image, ExecutionLockList, FinishedSession as FinS
from core.elements.message.chain import MessageChain
from core.builtins import Plain, Image, ExecutionLockList, MessageSession as MS
from core.builtins.message.chain import MessageChain
from core.logger import Logger
from core.types import FinishedSession as FinS
class FinishedSession(FinS):

View file

@ -4,9 +4,10 @@ from aiogram import types, executor
from bots.aiogram.client import dp
from bots.aiogram.message import MessageSession, FetchTarget
from core.elements import MsgInfo, Session, PrivateAssets, Url
from core.builtins import PrivateAssets, Url
from core.parser.message import parser
from core.utils import init, load_prompt, init_async
from core.types import MsgInfo, Session
from core.utils.bot import init, load_prompt, init_async
PrivateAssets.set(os.path.abspath(os.path.dirname(__file__) + '/assets'))
init()

View file

@ -4,13 +4,12 @@ from typing import List, Union
from bots.aiogram.client import dp, bot
from config import Config
from core.builtins import Bot
from core.builtins.message import MessageSession as MS
from core.elements import Plain, Image, MsgInfo, Session, Voice, FetchTarget as FT, FetchedSession as FS, \
FinishedSession as FinS
from core.elements.message.chain import MessageChain
from core.builtins import Bot, Plain, Image, Voice, MessageSession as MS
from core.builtins.message.chain import MessageChain
from core.logger import Logger
from core.utils import image_split
from core.types import MsgInfo, Session, FetchTarget as FT, FetchedSession as FS, \
FinishedSession as FinS
from core.utils.image import image_split
from database import BotDBUtil
enable_analytics = Config('enable_analytics')

View file

@ -8,10 +8,11 @@ import discord
from bots.discord.client import client
from bots.discord.message import MessageSession, FetchTarget
from config import Config
from core.elements import MsgInfo, Session, PrivateAssets, Url
from core.builtins import PrivateAssets, Url
from core.logger import Logger
from core.parser.message import parser
from core.utils import init, init_async, load_prompt
from core.types import MsgInfo, Session
from core.utils.bot import init, init_async, load_prompt
PrivateAssets.set(os.path.abspath(os.path.dirname(__file__) + '/assets'))
init()

View file

@ -7,13 +7,12 @@ import discord
from bots.discord.client import client
from config import Config
from core.builtins import Bot
from core.builtins.message import MessageSession as MS
from core.elements import Plain, Image, MsgInfo, Session, FetchTarget as FT, \
FetchedSession as FS, FinishedSession as FinS
from core.elements.message.chain import MessageChain
from core.elements.message.internal import Embed
from core.builtins import Bot, Plain, Image, MessageSession as MS
from core.builtins.message.chain import MessageChain
from core.builtins.message.internal import Embed
from core.logger import Logger
from core.types import MsgInfo, Session, FetchTarget as FT, \
FetchedSession as FS, FinishedSession as FinS
from database import BotDBUtil
enable_analytics = Config('enable_analytics')

View file

@ -4,7 +4,7 @@ import discord
from bots.discord.client import client
from bots.discord.slash_parser import slash_parser
from core.utils import get_url
from core.utils.http import get_url
api = 'https://ca.projectxero.top/idlist/search'

View file

@ -4,11 +4,11 @@ import discord
from bots.discord.message import convert_embed
from config import Config
from core.builtins.message import MessageSession as MS
from core.elements import Plain, Image, FinishedSession as FinS
from core.elements.message.chain import MessageChain
from core.elements.message.internal import Embed
from core.builtins import Plain, Image, MessageSession as MS
from core.builtins.message.chain import MessageChain
from core.builtins.message.internal import Embed
from core.logger import Logger
from core.types import FinishedSession as FinS
enable_analytics = Config('enable_analytics')

View file

@ -3,9 +3,9 @@ from typing import Union
import discord
from bots.discord.slash_message import MessageSession
from core.elements import MsgInfo, Session
from core.logger import Logger
from core.parser.message import parser
from core.types import MsgInfo, Session
def ctx_to_session(ctx: Union[discord.ApplicationContext, discord.AutocompleteContext]):

View file

@ -18,10 +18,11 @@ import traceback
import aioconsole
from bot import init_bot
from core.elements import MsgInfo, AutoSession, PrivateAssets, EnableDirtyWordCheck, Plain
from core.builtins import PrivateAssets, EnableDirtyWordCheck, Plain
from core.types import MsgInfo, AutoSession
from core.console.template import Template as MessageSession, FetchTarget
from core.parser.message import parser
from core.utils import init, init_async
from core.utils.bot import init, init_async
from core.logger import Logger
query_dbver = session.query(DBVersion).first()

View file

@ -1,10 +1,12 @@
from core.types.message import FetchTarget
from .message import *
from core.elements.message import FetchTarget
from .message.chain import *
from .message.internal import *
from .tasks import *
from .temp import *
from .utils import *
class Bot:
MessageSession = MessageSession
FetchTarget = FetchTarget
__all__ = ['Bot']

View file

@ -1,11 +1,13 @@
import asyncio
from typing import List
from core.elements import ExecutionLockList, Plain, confirm_command
from core.elements.message import *
from core.elements.message.chain import MessageChain
from core.builtins.message.chain import *
from core.builtins.message.internal import *
from core.builtins.tasks import MessageTaskManager
from core.builtins.temp import ExecutionLockList
from core.builtins.utils import confirm_command
from core.exceptions import WaitCancelException
from core.utils import MessageTaskManager
from core.types.message import *
from core.utils.i18n import get_target_locale
from database import BotDBUtil
@ -106,4 +108,3 @@ class MessageSession(MessageSession):
__all__ = ["MessageSession"]

View file

@ -5,12 +5,13 @@ from urllib.parse import urlparse
import ujson as json
from core.elements.others import Secret
from core.builtins.message.internal import Plain, Image, Voice, Embed, Url, ErrorMessage
from core.builtins.utils import Secret
from core.logger import Logger
from .internal import Plain, Image, Voice, Embed, Url, ErrorMessage
from core.types.message import MessageChain as MC
class MessageChain:
class MessageChain(MC):
def __init__(self, elements: Union[str, List[Union[Plain, Image, Voice, Embed, Url]],
Tuple[Union[Plain, Image, Voice, Embed, Url]],
Plain, Image, Voice, Embed, Url]):

View file

@ -10,9 +10,11 @@ from PIL import Image as PImage
from tenacity import retry, stop_after_attempt
from config import CachePath
from core.types.message.internal import Plain as P, Image as I, Voice as V, Embed as E, EmbedField as EF, \
Url as U, ErrorMessage as EMsg
class Plain:
class Plain(P):
def __init__(self,
text, *texts):
self.text = str(text)
@ -26,7 +28,7 @@ class Plain:
return f'Plain(text="{self.text}")'
class Url:
class Url(U):
mm = False
disable_mm = False
@ -46,7 +48,7 @@ class Url:
return f'Url(url="{self.url}")'
class ErrorMessage:
class ErrorMessage(EMsg):
def __init__(self, error_message):
self.error_message = '发生错误:' + error_message + '\n错误汇报地址: ' + \
str(Url(
@ -59,7 +61,7 @@ class ErrorMessage:
return self.error_message
class Image:
class Image(I):
def __init__(self,
path, headers=None):
self.need_get = False
@ -96,7 +98,7 @@ class Image:
return f'Image(path="{self.path}", headers={self.headers})'
class Voice:
class Voice(V):
def __init__(self,
path=None):
self.path = path
@ -108,7 +110,7 @@ class Voice:
return f'Voice(path={self.path})'
class EmbedField:
class EmbedField(EF):
def __init__(self,
name: str = None,
value: str = None,
@ -124,7 +126,7 @@ class EmbedField:
return f'EmbedField(name="{self.name}", value="{self.value}", inline={self.inline})'
class Embed:
class Embed(E):
def __init__(self,
title: str = None,
description: str = None,

View file

@ -1,6 +1,6 @@
from datetime import datetime
from core.elements import MessageSession
from core.types import MessageSession
class MessageTaskManager:

View file

@ -1,4 +1,4 @@
from core.elements import MessageSession
from core.types import MessageSession
class Temp:

View file

@ -7,10 +7,10 @@ from apscheduler.triggers.cron import CronTrigger
from apscheduler.triggers.date import DateTrigger
from apscheduler.triggers.interval import IntervalTrigger
from core.elements import Command, RegexCommand, Schedule, StartUp
from core.elements.module.component_meta import *
from core.loader import ModulesManager
from core.parser.args import parse_template
from core.types import Command, RegexCommand, Schedule, StartUp
from core.types.module.component_meta import *
class Bind:

View file

@ -2,12 +2,12 @@ from typing import List, Union
from PIL import Image
from core.builtins import Plain, Image as BImage, confirm_command
from core.builtins.message import MessageSession as MS
from core.elements import Plain, Image as BImage, Session, MsgInfo, FetchTarget as FT, \
FetchedSession as FS, FinishedSession as FinS, AutoSession as AS
from core.elements.message.chain import MessageChain
from core.elements.others import confirm_command
from core.builtins.message.chain import MessageChain
from core.logger import Logger
from core.types import Session, MsgInfo, FetchTarget as FT, \
FetchedSession as FS, FinishedSession as FinS, AutoSession as AS
class FinishedSession(FinS):

View file

@ -13,7 +13,7 @@ import aiohttp
from tenacity import retry, wait_fixed, stop_after_attempt
from config import Config
from core.elements import EnableDirtyWordCheck
from core.builtins import EnableDirtyWordCheck
from core.logger import Logger
from database.local import DirtyWordCache

View file

@ -1,5 +0,0 @@
from .message import *
from .message.internal import *
from .module import *
from .others import *
from .temp import *

View file

@ -5,8 +5,9 @@ import sys
import traceback
from typing import Dict, Union
from core.elements import Command, Schedule, RegexCommand, StartUp, PrivateAssets
from core.builtins import PrivateAssets
from core.logger import Logger
from core.types import Command, Schedule, RegexCommand, StartUp
load_dir_path = os.path.abspath('./modules/')

View file

@ -4,8 +4,8 @@ import shlex
import traceback
from typing import Union, Dict
from core.elements import Command, MessageSession
from core.exceptions import InvalidCommandFormatError
from core.types import Command, MessageSession
from .args import parse_argv, Template, templates_to_str, DescPattern
from ..logger import Logger

View file

@ -8,9 +8,7 @@ from typing import List, Dict
from aiocqhttp.exceptions import ActionFailed
from config import Config
from core.builtins.message import MessageSession
from core.elements import Command, command_prefix, ExecutionLockList, RegexCommand, ErrorMessage
from core.elements.module.component_meta import CommandMeta
from core.builtins import command_prefix, ExecutionLockList, ErrorMessage, MessageSession, MessageTaskManager
from core.exceptions import AbuseWarning, FinishedException, InvalidCommandFormatError, InvalidHelpDocTypeError, \
WaitCancelException, NoReportException
from core.loader import ModulesManager
@ -18,7 +16,9 @@ from core.logger import Logger
from core.parser.args import Template, ArgumentPattern, templates_to_str
from core.parser.command import CommandParser
from core.tos import warn_target
from core.utils import removeIneffectiveText, removeDuplicateSpace, MessageTaskManager
from core.types import Command, RegexCommand
from core.types.module.component_meta import CommandMeta
from core.utils.message import removeIneffectiveText, removeDuplicateSpace
from database import BotDBUtil
enable_tos = Config('enable_tos')

View file

@ -1,4 +1,10 @@
'''基于apscheduler的计划任务。'''
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.combining import AndTrigger, OrTrigger
from apscheduler.triggers.cron import CronTrigger
from apscheduler.triggers.date import DateTrigger
from apscheduler.triggers.interval import IntervalTrigger
Scheduler = AsyncIOScheduler()
__all__ = ["Scheduler", "AndTrigger", "OrTrigger", "CronTrigger", "DateTrigger", "IntervalTrigger"]

View file

@ -1,4 +1,4 @@
from core.elements import MessageSession
from core.builtins import MessageSession
from database import BotDBUtil

2
core/types/__init__.py Normal file
View file

@ -0,0 +1,2 @@
from .message import *
from .module import *

View file

@ -1,8 +1,8 @@
import asyncio
from typing import List, Union
from core.elements.message.chain import MessageChain
from core.exceptions import FinishedException
from .chain import MessageChain
class MsgInfo:

View file

@ -0,0 +1,42 @@
from typing import Union, List, Tuple
from .internal import Plain, Image, Voice, Embed, Url
class MessageChain:
"""
消息链
"""
def __init__(self, elements: Union[str, List[Union[Plain, Image, Voice, Embed, Url]],
Tuple[Union[Plain, Image, Voice, Embed, Url]],
Plain, Image, Voice, Embed, Url]):
"""
:param elements: 消息链元素
"""
self.elements = elements
@property
def is_safe(self) -> bool:
"""
检查消息链是否安全
"""
return True
def asSendable(self, embed=True) -> list:
"""
将消息链转换为可发送的格式
"""
def append(self, element):
"""
添加一个消息链元素到末尾
"""
def remove(self, element):
"""
删除一个消息链元素
"""
__all__ = ["MessageChain"]

View file

@ -0,0 +1,154 @@
from typing import Union, List
from PIL import Image as PImage
class Plain:
"""
文本消息
"""
def __init__(self, text, *texts):
"""
:param text: 文本内容
"""
self.text = str(text)
for t in texts:
self.text += str(t)
class Url:
"""
URL消息
"""
mm = False
disable_mm = False
def __init__(self, url: str, use_mm: bool = False, disable_mm: bool = False):
"""
:param url: URL
:param use_mm: 是否使用跳转链接覆盖全局设置
:param disable_mm: 是否禁用跳转链接覆盖全局设置
"""
self.url = url
self.mm = use_mm
self.disable_mm = disable_mm
class ErrorMessage:
"""
错误消息
"""
def __init__(self, error_message):
"""
:param error_message: 错误信息文本
"""
self.error_message = error_message
class Image:
"""
图片消息
"""
def __init__(self,
path: Union[str, PImage.Image], headers=None):
"""
:param path: 图片路径或PIL.Image对象
:param headers: 获取图片时的请求头
"""
self.need_get = False
self.path = path
self.headers = headers
async def get(self):
"""
获取图片
"""
async def get_image(self):
"""
从网络下载图片
"""
class Voice:
"""
语音消息
"""
def __init__(self,
path=None):
"""
:param path: 语音文件路径
"""
self.path = path
class EmbedField:
"""
Embed消息的字段
"""
def __init__(self,
name: str = None,
value: str = None,
inline: bool = False):
"""
:param name: 字段名
:param value: 字段值
:param inline: 是否为行内字段
"""
self.name = name
self.value = value
self.inline = inline
class Embed:
"""
Embed消息
"""
def __init__(self,
title: str = None,
description: str = None,
url: str = None,
timestamp: float = None,
color: int = None,
image: Image = None,
thumbnail: Image = None,
author: str = None,
footer: str = None,
fields: List[EmbedField] = None):
"""
:param title: 标题
:param description: 描述
:param url: 跳转链接
:param timestamp: 时间戳
:param color: 颜色
:param image: 图片
:param thumbnail: 缩略图
:param author: 作者
:param footer: 页脚
:param fields: 字段
"""
self.title = title
self.description = description
self.url = url
self.timestamp = timestamp
self.color = color
self.image = image
self.thumbnail = thumbnail
self.author = author
self.footer = footer
self.fields = fields
def to_msgchain(self):
"""
将Embed转换为消息链
"""
__all__ = ["Plain", "Image", "Voice", "Embed", "EmbedField", "Url", "ErrorMessage"]

View file

@ -1,11 +0,0 @@
from .bot import *
from .cache import *
from .http import *
from .ip import *
from .i18n import *
from .image import *
from .image_table import *
from .message import *
from .message import *
from .storedata import *
from .tasks import *

View file

@ -7,11 +7,12 @@ from os.path import abspath
import ujson as json
from core.elements import PrivateAssets, StartUp, Schedule, Secret
from core.builtins import PrivateAssets, Secret
from core.exceptions import ConfigFileNotFound
from core.loader import load_modules, ModulesManager
from core.logger import Logger
from core.scheduler import Scheduler
from core.types import StartUp, Schedule
from core.utils.http import get_url
from core.utils.ip import IP
@ -73,6 +74,7 @@ async def load_secret():
Secret.add(ip['ip'])
IP.country = ip['country']
IP.address = ip['ip']
Logger.info('Fetching IP information...')
await asyncio.create_task(append_ip())
Logger.info('Successfully fetched IP information.')

View file

@ -7,7 +7,7 @@ import urllib.parse as urlparse
from textwrap import wrap
from typing import Dict, List, Optional, Tuple, Union
from core.elements import Url
from core.builtins import Url
from . import config
from .elements import AnchorElement, ListElement
from .typing import OutCallback

View file

@ -5,7 +5,7 @@ from typing import TypedDict
import ujson as json
from core.elements.message import MessageSession
from core.builtins.message import MessageSession
# Load all locale files into memory

View file

@ -2,7 +2,7 @@ from typing import List
from PIL import Image as PImage
from core.elements import Image
from core.builtins import Image
async def image_split(i: Image) -> List[Image]:

View file

@ -3,7 +3,7 @@ from typing import Union
from discord import Embed as DiscordEmbed
from core.elements.message.internal import Embed, EmbedField
from core.builtins.message.internal import Embed, EmbedField
def removeIneffectiveText(prefix: str, lst: list) -> list:

View file

@ -1,6 +1,6 @@
import ujson as json
from core.elements import FetchTarget
from core.types import FetchTarget
from database import BotDBUtil

View file

@ -4,7 +4,7 @@ from typing import Union, List
import ujson as json
from tenacity import retry, stop_after_attempt
from core.elements.message import MessageSession, FetchTarget, FetchedSession
from core.types.message import MessageSession, FetchTarget, FetchedSession
from database.orm import Session
from database.tables import *
from database.tables import TargetInfo

View file

@ -1,4 +1,4 @@
from core.elements.others import command_prefix
from core.builtins import command_prefix
from core.parser.command import CommandParser
c = CommandParser(('~wiki <PageName> {搜索一个Wiki页面}',

View file

@ -1,6 +1,6 @@
from core.builtins import Plain, Image
from core.builtins.message import MessageSession
from core.component import on_command
from core.elements import Plain, Image
test = on_command('test')

View file

@ -1,8 +1,8 @@
from datetime import datetime
from config import Config
from core.builtins import Bot, Image
from core.component import on_command
from core.elements import MessageSession, Image
from .daily_trials import fetch_daily_trials, json_render
dun = on_command('dungeons_trials', alias=['dungeons', 'dungeon', 'dungeonstrials', 'dungeontrials', 'dungeon_trials'],
@ -12,7 +12,7 @@ records = {'ts': 0}
@dun.handle()
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
await msg.sendMessage('请稍等...')
if datetime.now().timestamp() - records['ts'] > 43200:
records['data'] = await fetch_daily_trials(Config('xbox_gametag'), Config('xbox_token'))
@ -30,7 +30,7 @@ async def _(msg: MessageSession):
@dun.handle('reset {强制重置缓存。}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
records['ts'] = 0
await msg.sendMessage('重置成功。')

View file

@ -2,10 +2,10 @@ import os
import traceback
from config import Config
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.builtins import Plain, Image
from core.component import on_command
from core.elements import Plain, Image
from core.utils import get_url
from core.utils.http import get_url
from .dbutils import ArcBindInfoManager
from .getb30 import getb30
from .getb30_official import getb30_official
@ -24,7 +24,7 @@ assets_path = os.path.abspath('./assets/arcaea')
@arc.handle('b30 [<friendcode>] {查询一个Arcaea用户的b30列表自动选择使用API}',
'b30 official [<friendcode>] {使用官方API}',
'b30 unofficial [<friendcode>] {使用非官方API}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
if not os.path.exists(assets_path):
await msg.finish(
'未找到资源文件请放置一枚arcaea的apk到机器人的assets目录并重命名为arc.apk后使用~arcaea initialize初始化资源。')
@ -82,7 +82,7 @@ async def _(msg: MessageSession):
@arc.handle('info [<friendcode>] {查询一个Arcaea用户的最近游玩记录}',
'info official [<friendcode>] {使用官方API}',
'info unofficial [<friendcode>] {使用非官方API}', )
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
if not os.path.exists(assets_path):
await msg.sendMessage(
'未找到资源文件请放置一枚arcaea的apk到机器人的assets目录并重命名为arc.apk后使用~arcaea initialize初始化资源。')
@ -136,7 +136,7 @@ async def _(msg: MessageSession):
@arc.handle('song <songname+prs/pst/byd> {查询一首Arcaea谱面的信息}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
songname_ = msg.parsed_msg.get('<songname+prs/pst/byd>', False)
songname_split = songname_.split(' ')
diff = -1
@ -164,7 +164,7 @@ async def _(msg: MessageSession):
@arc.handle('bind <friendcode/username> {绑定一个Arcaea用户}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
code: str = msg.parsed_msg['<friendcode/username>']
getcode = await get_userinfo(code)
if getcode:
@ -181,14 +181,14 @@ async def _(msg: MessageSession):
@arc.handle('unbind {取消绑定用户}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
unbind = ArcBindInfoManager(msg).remove_bind_info()
if unbind:
await msg.finish('取消绑定成功。')
@arc.handle('initialize', required_superuser=True)
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
assets_apk = os.path.abspath('./assets/arc.apk')
if not os.path.exists(assets_apk):
await msg.finish('未找到arc.apk')
@ -199,7 +199,7 @@ async def _(msg: MessageSession):
@arc.handle('download {获取最新版本的游戏apk}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
if not webrender:
await msg.finish(['未配置webrender无法使用此命令。'])
resp = await get_url(webrender + 'source?url=https://webapi.lowiro.com/webapi/serve/static/bin/arcaea/apk/', 200,
@ -209,7 +209,7 @@ async def _(msg: MessageSession):
@arc.handle('random {随机一首曲子}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
if not webrender:
await msg.finish(['未配置webrender无法使用此命令。'])
resp = await get_url(webrender + 'source?url=https://webapi.lowiro.com/webapi/song/showcase/', 200, fmt='json')
@ -223,7 +223,7 @@ async def _(msg: MessageSession):
@arc.handle('rank free {查看当前免费包游玩排行}', 'rank paid {查看当前付费包游玩排行}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
if not webrender:
await msg.finish(['未配置webrender无法使用此命令。'])
if msg.parsed_msg.get('free', False):
@ -240,7 +240,7 @@ async def _(msg: MessageSession):
@arc.handle('switch {切换查询时默认优先使用的API接口}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
value = msg.options.get('arc_api', True)
set_value = msg.data.edit_option('arc_api', not value)
await msg.finish(f'已切换为{"官方" if not value else "非官方"}API。')

View file

@ -2,7 +2,7 @@ from typing import Union
from tenacity import retry, stop_after_attempt
from core.elements import MessageSession
from core.builtins import Bot
from database import session, auto_rollback_error
from .orm import ArcBindInfo
@ -10,7 +10,7 @@ from .orm import ArcBindInfo
class ArcBindInfoManager:
@retry(stop=stop_after_attempt(3), reraise=True)
@auto_rollback_error
def __init__(self, msg: MessageSession):
def __init__(self, msg: Bot.MessageSession):
self.targetId = msg.target.senderId
self.query = session.query(ArcBindInfo).filter_by(targetId=self.targetId).first()
if self.query is None:

View file

@ -8,7 +8,7 @@ import uuid
from config import Config
from core.logger import Logger
from core.utils import get_url
from core.utils.http import get_url
from .drawb30img import drawb30
from .drawsongimg import dsimg
from .utils import autofix_b30_song_background

View file

@ -4,9 +4,9 @@ import traceback
from datetime import datetime
from config import Config
from core.elements import Plain, Image
from core.builtins import Plain, Image
from core.logger import Logger
from core.utils import get_url
from core.utils.http import get_url
from modules.arcaea.utils import autofix_b30_song_background, errcode
assets_path = os.path.abspath('./assets/arcaea')

View file

@ -6,9 +6,9 @@ import traceback
from datetime import datetime
from config import Config
from core.elements import Plain
from core.builtins import Plain
from core.logger import Logger
from core.utils import get_url
from core.utils.http import get_url
assets_path = os.path.abspath('./assets/arcaea')
apiurl = Config('arcapi_official_url')

View file

@ -3,9 +3,9 @@ import traceback
from datetime import datetime
from config import Config
from core.elements import Plain
from core.builtins import Plain
from core.logger import Logger
from core.utils import get_url
from core.utils.http import get_url
from .utils import errcode
assets_path = os.path.abspath('./assets/arcaea')

View file

@ -3,7 +3,7 @@ import shutil
import traceback
from config import Config
from core.utils import get_url, download_to_cache
from core.utils.http import get_url, download_to_cache
from .initialize import blur_song_img
botarcapi_url = Config("botarcapi_url")

View file

@ -1,7 +1,7 @@
import asyncio
import re
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command, on_regex
from .bugtracker import bugtracker_get
@ -9,7 +9,7 @@ bug = on_command('bug', alias='b', developers=['OasisAkari'])
@bug.handle('<MojiraID> {查询Mojira上的漏洞编号内容}')
async def bugtracker(msg: MessageSession):
async def bugtracker(msg: Bot.MessageSession):
mojira_id = msg.parsed_msg['<MojiraID>']
if mojira_id:
q = re.match(r'(.*-.*)', mojira_id)
@ -24,7 +24,7 @@ rbug = on_regex('bug_regex',
@rbug.handle(pattern=r'^\!(?:bug |)(.*)-(.*)', mode='M')
async def regex_bugtracker(msg: MessageSession):
async def regex_bugtracker(msg: Bot.MessageSession):
matched_msg = msg.matched_msg
if len(matched_msg.group(1)) < 10 and len(matched_msg.group(2)) < 10:
result = await bugtracker_get(matched_msg.group(1) + '-' + matched_msg.group(2))
@ -32,8 +32,8 @@ async def regex_bugtracker(msg: MessageSession):
@rbug.handle(re.compile(r'https://bugs\.mojang\.com/browse/(.*?-\d*)'), mode='A')
async def _(msg: MessageSession):
async def bgtask(msg: MessageSession):
async def _(msg: Bot.MessageSession):
async def bgtask(msg: Bot.MessageSession):
for title in msg.matched_msg:
await msg.sendMessage(await bugtracker_get(title, nolink=True))

View file

@ -1,7 +1,7 @@
import json
from core.elements import Url, ErrorMessage
from core.utils import get_url
from core.builtins import Url, ErrorMessage
from core.utils.http import get_url
async def bugtracker_get(mojiraId: str, nolink=False):

View file

@ -3,7 +3,7 @@ import os
import subprocess
import sys
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command
from core.exceptions import NoReportException
from core.logger import Logger
@ -38,7 +38,7 @@ c = on_command('calc', developers=[
'hex()': '转换为十六进制hex(268) -> 0x10c',
'更多可用运算符和函数': 'https://bot.teahouse.team/-/340',
})
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
expr = msg.asDisplay().split(' ', 1)[1]
if sys.platform == 'win32' and sys.version_info.minor < 10:
try:

View file

@ -9,11 +9,12 @@ from PIL import Image as PILImage
from bs4 import BeautifulSoup
from tenacity import retry, stop_after_attempt
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.builtins import Image, Plain
from core.component import on_command
from core.elements import Image, Plain
from core.logger import Logger
from core.utils import get_url, download_to_cache, random_cache_path
from core.utils.cache import random_cache_path
from core.utils.http import get_url, download_to_cache
csr_link = 'https://www.chemspider.com' # ChemSpider 的链接
special_id = ["22398", "140526", "4509317", "4509318", "4510681", "4510778", "4512975", "4514248", "4514266", "4514293",
@ -57,17 +58,17 @@ play_state = {} # 创建一个空字典用于存放游戏状态
@cc.handle('{普通样式(时间限制,多人)}') # 直接使用 cc 命令将触发此装饰器
async def chemical_code_by_random(msg: MessageSession):
async def chemical_code_by_random(msg: Bot.MessageSession):
await chemical_code(msg) # 将消息会话传入 chemical_code 函数
@cc.handle('captcha {验证码样式不支持指定ID只限一次单人}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
await chemical_code(msg, captcha_mode=True)
@cc.handle('stop {停止当前的游戏。}')
async def s(msg: MessageSession):
async def s(msg: Bot.MessageSession):
state = play_state.get(msg.target.targetId, False) # 尝试获取 play_state 中是否有此对象的游戏状态
if state: # 若有
if state['active']: # 检查是否为活跃状态

View file

@ -3,7 +3,7 @@ from decimal import Decimal
from pint import UnitRegistry
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command
ureg = UnitRegistry(os.path.dirname(os.path.abspath(__file__)) +
@ -15,7 +15,7 @@ i = on_command('convert', alias=('conv', 'unit'), desc='全能单位转换。',
@i.handle('<from_val> <to_unit> {单位转换。大小写敏感。单位原文为英文,由 ChatGPT 翻译生成,欢迎汇报错误。}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
from_val = msg.parsed_msg['<from_val>']
to_unit = msg.parsed_msg['<to_unit>']
ori = ureg.parse_expression(from_val)

View file

@ -1,4 +1,4 @@
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command
ali = on_command('alias', required_admin=True, base=True)
@ -6,7 +6,7 @@ ali = on_command('alias', required_admin=True, base=True)
@ali.handle('add <alias> <command> {添加自定义命令别名}', 'remove <alias> {移除自定义命令别名}',
'reset {重置自定义命令别名}')
async def set_alias(msg: MessageSession):
async def set_alias(msg: Bot.MessageSession):
alias = msg.options.get('command_alias')
arg1 = msg.parsed_msg.get('<alias>', False)
arg2 = msg.parsed_msg.get('<command>', False)

View file

@ -1,11 +1,11 @@
import traceback
from core.builtins.message import MessageSession
from core.builtins import Image, Plain, Bot
from core.component import on_command
from core.elements import Command, Image, Plain
from core.exceptions import InvalidHelpDocTypeError
from core.loader import ModulesManager
from core.parser.command import CommandParser
from core.types import Command
from core.utils.image_table import ImageTable, image_table_render, web_render
from database import BotDBUtil
@ -25,7 +25,7 @@ module = on_command('module',
'disable all {关闭所有模块。}',
'reload <module> ... {重载一个/多个模块。}',
'list {查看所有可用模块}'], exclude_from=['QQ|Guild'])
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
if msg.parsed_msg.get('list', False):
await modules_help(msg)
await config_modules(msg)
@ -38,13 +38,13 @@ async def _(msg: MessageSession):
'reload <module> [-f] {重载一个模块。}',
'list {查看所有可用模块}'], options_desc={'-g': '对频道进行全局操作'},
available_for=['QQ|Guild'])
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
if msg.parsed_msg.get('list', False):
await modules_help(msg)
await config_modules(msg)
async def config_modules(msg: MessageSession):
async def config_modules(msg: Bot.MessageSession):
alias = ModulesManager.return_modules_alias_map()
modules_ = ModulesManager.return_modules_list_as_dict(
targetFrom=msg.target.targetFrom)
@ -198,7 +198,7 @@ hlp = on_command('help',
@hlp.handle('<module> {查看一个模块的详细信息}')
async def bot_help(msg: MessageSession):
async def bot_help(msg: Bot.MessageSession):
module_list = ModulesManager.return_modules_list_as_dict(
targetFrom=msg.target.targetFrom)
developers = ModulesManager.return_modules_developers_map()
@ -244,7 +244,7 @@ async def bot_help(msg: MessageSession):
@hlp.handle('{查看帮助列表}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
module_list = ModulesManager.return_modules_list_as_dict(
targetFrom=msg.target.targetFrom)
target_enabled_list = msg.enabled_modules
@ -324,7 +324,7 @@ async def _(msg: MessageSession):
await send.delete()
async def modules_help(msg: MessageSession):
async def modules_help(msg: Bot.MessageSession):
module_list = ModulesManager.return_modules_list_as_dict(
targetFrom=msg.target.targetFrom)
developers = ModulesManager.return_modules_developers_map()

View file

@ -9,14 +9,14 @@ import ujson as json
from config import Config
from core.builtins import Bot
from core.builtins import PrivateAssets, Image, Plain, ExecutionLockList, Temp
from core.builtins.message import MessageSession
from core.builtins.tasks import MessageTaskManager
from core.component import on_command
from core.elements import PrivateAssets, Image, Plain, ExecutionLockList, Temp
from core.loader import ModulesManager
from core.parser.message import remove_temp_ban
from core.tos import pardon_user, warn_user
from core.utils.cache import random_cache_path
from core.utils.tasks import MessageTaskManager
from database import BotDBUtil
su = on_command('superuser', alias=['su'], developers=['OasisAkari', 'Dianliang233'], required_superuser=True)
@ -281,6 +281,7 @@ async def update_and_restart_bot(msg: MessageSession):
if Bot.FetchTarget.name == 'QQ':
resume = on_command('resume', developers=['OasisAkari'], required_superuser=True)
@resume.handle()
async def resume_sending_group_message(msg: MessageSession):
if targets := Temp.data['waiting_for_send_group_message']:
@ -292,7 +293,6 @@ if Bot.FetchTarget.name == 'QQ':
else:
await msg.sendMessage('没有需要重发的消息。')
echo = on_command('echo', developers=['OasisAkari'], required_superuser=True)

View file

@ -6,9 +6,9 @@ from datetime import datetime
import psutil
from cpuinfo import get_cpu_info
from core.builtins import PrivateAssets
from core.builtins.message import MessageSession
from core.component import on_command
from core.elements import PrivateAssets
from core.utils.i18n import get_available_locales, get_target_locale
from database import BotDBUtil
@ -86,7 +86,8 @@ admin = on_command('admin',
)
@admin.handle(['add <UserID> {设置成员为机器人管理员,实现不设置成员为群聊管理员的情况下管理机器人的功能。已是群聊管理员无需设置此项目。}',
@admin.handle([
'add <UserID> {设置成员为机器人管理员,实现不设置成员为群聊管理员的情况下管理机器人的功能。已是群聊管理员无需设置此项目。}',
'del <UserID> {取消成员的机器人管理员}',
'list {列出所有机器人管理员}'])
async def config_gu(msg: MessageSession):

View file

@ -1,6 +1,6 @@
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.builtins import Image
from core.component import on_command
from core.elements import Image
from database import BotDBUtil
from .dbutils import CytoidBindInfoManager
from .profile import cytoid_profile
@ -12,13 +12,13 @@ cytoid = on_command('cytoid',
@cytoid.handle('profile [<UserID>] {查询一个用户的基本信息}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
if msg.parsed_msg['profile']:
await cytoid_profile(msg)
@cytoid.handle('(b30|r30) [<UserID>] {查询一个用户的b30/r30记录}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
if 'b30' in msg.parsed_msg:
query = 'b30'
elif 'r30' in msg.parsed_msg:
@ -53,7 +53,7 @@ async def _(msg: MessageSession):
@cytoid.handle('bind <username> {绑定一个Cytoid用户}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
code: str = msg.parsed_msg['<username>']
getcode = await get_profile_name(code)
if getcode:
@ -69,7 +69,7 @@ async def _(msg: MessageSession):
@cytoid.handle('unbind {取消绑定用户}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
unbind = CytoidBindInfoManager(msg).remove_bind_info()
if unbind:
await msg.finish('取消绑定成功。')

View file

@ -2,7 +2,7 @@ from typing import Union
from tenacity import retry, stop_after_attempt
from core.elements import MessageSession
from core.builtins import Bot
from database import session, auto_rollback_error
from .orm import CytoidBindInfo
@ -10,7 +10,7 @@ from .orm import CytoidBindInfo
class CytoidBindInfoManager:
@retry(stop=stop_after_attempt(3), reraise=True)
@auto_rollback_error
def __init__(self, msg: MessageSession):
def __init__(self, msg: Bot.MessageSession):
self.targetId = msg.target.senderId
self.query = session.query(CytoidBindInfo).filter_by(targetId=self.targetId).first()
if self.query is None:

View file

@ -1,12 +1,12 @@
import ujson as json
from core.builtins.message import MessageSession
from core.elements import Plain, Image
from core.utils import get_url
from core.builtins import Bot
from core.builtins import Plain, Image
from core.utils.http import get_url
from .dbutils import CytoidBindInfoManager
async def cytoid_profile(msg: MessageSession):
async def cytoid_profile(msg: Bot.MessageSession):
pat = msg.parsed_msg.get('<UserID>', False)
if pat:
query_id = pat

View file

@ -15,7 +15,7 @@ from gql.transport.aiohttp import AIOHTTPTransport
from config import Config
from core.logger import Logger
from core.utils import get_url
from core.utils.http import get_url
async def get_rating(uid, query_type):

View file

@ -1,6 +1,6 @@
import ujson as json
from core.utils import get_url
from core.utils.http import get_url
async def get_profile_name(userid):

View file

@ -1,6 +1,5 @@
from core.builtins.message import MessageSession
from core.builtins import Bot, Image, Plain
from core.component import on_command
from core.elements import Image, Plain
from .screenshot import get_pic
dict_module = on_command('dictionary', alias=["dict"],
@ -8,7 +7,7 @@ dict_module = on_command('dictionary', alias=["dict"],
@dict_module.handle(help_doc='<term> {在科林斯词典中查询单词,暂仅支持英文}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
print(str(msg.parsed_msg['<term>']).replace(' ', '-').lower())
pic_collins = await get_pic(
'https://www.collinsdictionary.com/dictionary/english/' + str(msg.parsed_msg['<term>']).replace(' ',

View file

@ -1,14 +1,13 @@
import datetime
from core.builtins.message import MessageSession
from core.builtins import Bot, Embed, Image, EmbedField
from core.component import on_command
from core.elements import Embed, Image, EmbedField
t = on_command('embed_test', required_superuser=True)
@t.handle()
async def _(session: MessageSession):
async def _(session: Bot.MessageSession):
await session.sendMessage(Embed(title='Embed Test', description='This is a test embed.',
url='https://minecraft.fandom.com/zh/wiki/Minecraft_Wiki',
color=0x00ff00, timestamp=datetime.datetime.now().timestamp(),

View file

@ -1,4 +1,4 @@
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command
from modules.github import repo, user, search
@ -6,7 +6,7 @@ github = on_command('github', alias=['gh'], developers=['Dianliang233'])
@github.handle('<name> {尝试自动识别并区分 repo/user}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
if '/' in msg.parsed_msg['<name>']:
await repo.repo(msg)
else:
@ -14,15 +14,15 @@ async def _(msg: MessageSession):
@github.handle('repo <name> {获取 GitHub 仓库信息}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
await repo.repo(msg)
@github.handle(['user <name> {获取 GitHub 用户或组织信息}', 'org <name> {~github user 的别名}'])
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
await user.user(msg)
@github.handle('search <query> {搜索 GitHub 上的仓库}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
await search.search(msg)

View file

@ -1,13 +1,13 @@
import asyncio
import traceback
from core.builtins.message import MessageSession
from core.elements import Image, Plain, Url, ErrorMessage
from core.utils import get_url, download_to_cache
from core.builtins import Bot
from core.builtins import Image, Plain, Url, ErrorMessage
from core.utils.http import get_url, download_to_cache
from modules.github.utils import time_diff, dirty_check, darkCheck
async def repo(msg: MessageSession):
async def repo(msg: Bot.MessageSession):
try:
result = await get_url('https://api.github.com/repos/' + msg.parsed_msg['<name>'], 200, fmt='json')
if 'message' in result and result['message'] == 'Not Found':

View file

@ -1,12 +1,11 @@
import traceback
from core.builtins.message import MessageSession
from core.elements import Url, ErrorMessage
from core.utils import get_url
from core.builtins import Bot, Url, ErrorMessage
from core.utils.http import get_url
from modules.github.utils import dirty_check, darkCheck
async def search(msg: MessageSession):
async def search(msg: Bot.MessageSession):
try:
result = await get_url('https://api.github.com/search/repositories?q=' + msg.parsed_msg['<query>'], 200,
fmt='json')

View file

@ -1,12 +1,11 @@
import traceback
from core.builtins.message import MessageSession
from core.elements import Url, ErrorMessage
from core.utils import get_url
from core.builtins import Url, ErrorMessage, Bot
from core.utils.http import get_url
from modules.github.utils import time_diff, dirty_check, darkCheck
async def user(msg: MessageSession):
async def user(msg: Bot.MessageSession):
try:
result = await get_url('https://api.github.com/users/' + msg.parsed_msg['<name>'], 200, fmt='json')
if 'message' in result and result['message'] == 'Not Found':

View file

@ -1,9 +1,9 @@
# https://github.com/XeroAlpha/caidlist/blob/master/backend/API.md
import urllib.parse
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command
from core.utils import get_url
from core.utils.http import get_url
api = 'https://ca.projectxero.top/idlist/search'
@ -11,7 +11,7 @@ i = on_command('idlist')
@i.handle('<query> {查询MCBEID表。}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
query = msg.parsed_msg['<query>']
query_options = {'q': query, 'limit': '6'}
query_url = api + '?' + urllib.parse.urlencode(query_options)

View file

@ -1,8 +1,7 @@
import re
from core.builtins.message import MessageSession
from core.builtins import Bot, Plain, Image as BImage
from core.component import on_command, on_regex
from core.elements import Plain, Image as BImage
from core.logger import Logger
from modules.maimai.libraries.image import *
from modules.maimai.libraries.maimai_best_40 import generate
@ -38,7 +37,7 @@ mai = on_command('maimai', developers=['mai-bot', 'OasisAkari'], alias=['mai'],
@mai.handle(['inner <rating> {根据定数查询对应歌曲}',
'inner <rating_min> <rating_max> {根据定数查询对应歌曲}'])
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
if '<rating>' in msg.parsed_msg:
result_set = await inner_level_q(float(msg.parsed_msg['<rating>']))
else:
@ -57,7 +56,7 @@ mrgex1 = on_regex('maimai_random_music_regex1',
@mrgex1.handle(r"随个((?:dx|sd|标准))?([绿黄红紫白]?)([0-9]+\+?)")
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
res = msg.matched_msg
if res:
try:
@ -89,7 +88,7 @@ mrgex2 = on_regex('maimai_random_music_regex2', desc='打开后将在发送的
@mrgex2.handle(r".*maimai.*什么", )
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
await msg.finish(song_txt((await total_list.get()).random()))
@ -99,7 +98,7 @@ msrgex = on_regex('maimai_search_music_regex', desc='打开后将在发送的聊
@msrgex.handle(r"查歌(.+)")
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
name = msg.matched_msg.groups()[0].strip()
if name == "":
return
@ -121,7 +120,7 @@ mqrgex = on_regex('maimai_query_chart_regex',
@msrgex.handle(r"([绿黄红紫白]?)id([0-9]+)")
async def _(message: MessageSession):
async def _(message: Bot.MessageSession):
groups = message.matched_msg.groups()
level_labels = ['绿', '', '', '', '']
if groups[0] != "":
@ -172,7 +171,7 @@ wm_list = ['拼机', '推分', '越级', '下埋', '夜勤', '练底力', '练
@mai.handle('today {查看今天的舞萌运势}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
if msg.target.senderFrom == "Discord|Client":
qq = int(msg.session.sender.id)
else:
@ -196,7 +195,7 @@ async def _(msg: MessageSession):
@mai.handle(['scoreline <difficulty+sid> <scoreline> {查找某首歌的分数线}',
'scoreline help {查看分数线帮助}'])
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
r = "([绿黄红紫白])(id)?([0-9]+)"
arg1 = msg.parsed_msg.get('<difficulty+sid>')
args2 = msg.parsed_msg.get('<scoreline>')
@ -245,7 +244,7 @@ BREAK 50落(一共{brk}个)等价于 {(break_50_reduce / 100):.3f} 个 TAP GREAT
@mai.handle('b40 <username> {查询B40信息仅限大陆版maimai使用}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
username = msg.parsed_msg['<username>']
if username == "":
payload = {'qq': msg.session.sender}
@ -263,7 +262,7 @@ async def _(msg: MessageSession):
@mai.handle('b50 <username> {查询B50信息仅限大陆版maimai使用}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
username = msg.parsed_msg['<username>']
if username == "":
payload = {'qq': msg.session.sender, 'b50': True}

View file

@ -2,7 +2,7 @@ import random
from copy import deepcopy
from typing import Dict, List, Optional, Union, Tuple, Any
from core.utils import get_url
from core.utils.http import get_url
def get_cover_len4_id(mid) -> str:

View file

@ -1,6 +1,5 @@
from core.builtins.message import MessageSession
from core.builtins import Bot, Url
from core.component import on_command
from core.elements import Url
from core.logger import Logger
from .mcbbs_news import news
@ -12,7 +11,7 @@ mcbbs_news = on_command(
@mcbbs_news.handle('{获得 MCBBS 幻翼快讯版最新新闻(未被版主高亮过的新闻将被忽略)}')
async def main(msg: MessageSession):
async def main(msg: Bot.MessageSession):
res = await news()
Logger.debug('res' + str(res))
if res is None:

View file

@ -3,9 +3,9 @@ import datetime
from bs4 import BeautifulSoup
from config import Config
from core.elements import Url
from core.builtins import Url
from core.logger import Logger
from core.utils import get_url
from core.utils.http import get_url
async def news():

View file

@ -1,4 +1,4 @@
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command
from .mcmod import mcmod as m
@ -11,12 +11,12 @@ mcmod = on_command(
@mcmod.handle('<mod_name> {通过模组名获取模组简介及链接,可使用无歧义简写和准确中文。}')
async def main(msg: MessageSession):
async def main(msg: Bot.MessageSession):
message = await m(msg.parsed_msg['<mod_name>'])
await msg.finish(message)
@mcmod.handle('details <content> {通过 Mod 内容的名称获取模组简介及链接,可使用物品/方块/实体的 ID 或准确中文。}')
async def main(msg: MessageSession):
async def main(msg: Bot.MessageSession):
message = await m(msg.parsed_msg['<content>'], detail=True)
await msg.finish(message)

View file

@ -3,9 +3,9 @@ from urllib.parse import quote
from bs4 import BeautifulSoup
from config import Config
from core.elements import Url
from core.builtins import Url
from core.logger import Logger
from core.utils import get_url
from core.utils.http import get_url
api = 'https://search.mcmod.cn/s?key='
api_details = 'https://search.mcmod.cn/s?filter=3&key='

View file

@ -1,6 +1,6 @@
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.builtins import Plain, Image, Url
from core.component import on_command
from core.elements import Plain, Image, Url
from .mojang_api import *
mcplayer = on_command(
@ -11,7 +11,7 @@ mcplayer = on_command(
@mcplayer.handle('<username_or_uuid> {通过玩家名或玩家 UUID 获取玩家信息。}')
async def main(msg: MessageSession):
async def main(msg: Bot.MessageSession):
arg = msg.parsed_msg['<username_or_uuid>']
try:
if len(arg) == 32:

View file

@ -1,7 +1,7 @@
import ujson as json
from PIL import Image
from core.utils import get_url, download_to_cache
from core.utils.http import get_url, download_to_cache
async def uuid_to_name(uuid):

View file

@ -1,4 +1,4 @@
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command
from .mcv import mcv, mcbv, mcdv, mcev
@ -10,7 +10,7 @@ m = on_command(
@m.handle('{查询当前Minecraft Java版启动器内最新版本。}')
async def mcv_loader(msg: MessageSession):
async def mcv_loader(msg: Bot.MessageSession):
await msg.finish(await mcv())
@ -20,7 +20,7 @@ mb = on_command(
@mb.handle('{查询当前Minecraft 基岩版Jira内记录的最新版本。}')
async def mcbv_loader(msg: MessageSession):
async def mcbv_loader(msg: Bot.MessageSession):
await msg.finish(await mcbv())
@ -30,7 +30,7 @@ md = on_command(
@md.handle('{查询当前Minecraft Dungeons Jira内记录的最新版本。}')
async def mcdv_loader(msg: MessageSession):
async def mcdv_loader(msg: Bot.MessageSession):
await msg.finish(await mcdv())
@ -40,5 +40,5 @@ me = on_command(
@me.handle('{查询当前Minecraft教育版Windows版记录的最新版本。}')
async def mcev_loader(msg: MessageSession):
async def mcev_loader(msg: Bot.MessageSession):
await msg.finish(await mcev())

View file

@ -3,9 +3,10 @@ import re
from google_play_scraper import app as google_play_scraper
from core.elements import ErrorMessage
from core.builtins import ErrorMessage
from core.logger import Logger
from core.utils import get_url, IP
from core.utils.http import get_url
from core.utils.ip import IP
async def mcv():

View file

@ -7,10 +7,13 @@ from bs4 import BeautifulSoup
from google_play_scraper import app as google_play_scraper
from config import Config
from core.builtins import Bot
from core.component import on_schedule
from core.elements import FetchTarget, IntervalTrigger
from core.logger import Logger
from core.utils import get_stored_list, update_stored_list, get_url, IP
from core.scheduler import IntervalTrigger
from core.utils.http import get_url
from core.utils.ip import IP
from core.utils.storedata import get_stored_list, update_stored_list
async def get_article(version):
@ -64,7 +67,7 @@ trigger_times = 60 if not Config('slower_schedule') else 180
recommend_modules=['mcv_jira_rss', 'mcbv_jira_rss', 'mcdv_jira_rss'],
trigger=IntervalTrigger(seconds=trigger_times),
desc='开启后当Minecraft启动器更新Java版Minecraft时将会自动推送消息。', alias='mcvrss')
async def mcv_rss(bot: FetchTarget):
async def mcv_rss(bot: Bot.FetchTarget):
url = 'https://piston-meta.mojang.com/mc/game/version_manifest.json'
try:
verlist = get_stored_list(bot, 'mcv_rss')
@ -103,7 +106,7 @@ async def mcv_rss(bot: FetchTarget):
recommend_modules=['mcbv_jira_rss'],
trigger=IntervalTrigger(seconds=180),
desc='开启后当Minecraft基岩版商店更新时将会自动推送消息。', alias='mcbvrss')
async def mcbv_rss(bot: FetchTarget):
async def mcbv_rss(bot: Bot.FetchTarget):
if IP.country == 'China':
return # 中国大陆无法访问Google Play商店
try:
@ -122,7 +125,7 @@ async def mcbv_rss(bot: FetchTarget):
recommend_modules=['mcv_rss', 'mcbv_jira_rss', 'mcdv_jira_rss'],
trigger=IntervalTrigger(seconds=trigger_times),
desc='开启后当Jira更新Java版时将会自动推送消息。', alias='mcvjirarss')
async def mcv_jira_rss(bot: FetchTarget):
async def mcv_jira_rss(bot: Bot.FetchTarget):
try:
verlist = get_stored_list(bot, 'mcv_jira_rss')
file = json.loads(await get_url('https://bugs.mojang.com/rest/api/2/project/10400/versions', 200, attempt=1))
@ -156,7 +159,7 @@ async def mcv_jira_rss(bot: FetchTarget):
recommend_modules=['mcv_rss', 'mcv_jira_rss', 'mcdv_jira_rss'],
trigger=IntervalTrigger(seconds=trigger_times),
desc='开启后当Jira更新基岩版时将会自动推送消息。', alias='mcbvjirarss')
async def mcbv_jira_rss(bot: FetchTarget):
async def mcbv_jira_rss(bot: Bot.FetchTarget):
try:
verlist = get_stored_list(bot, 'mcbv_jira_rss')
file = json.loads(await get_url('https://bugs.mojang.com/rest/api/2/project/10200/versions', 200, attempt=1))
@ -185,7 +188,7 @@ async def mcbv_jira_rss(bot: FetchTarget):
recommend_modules=['mcv_rss', 'mcbv_jira_rss', 'mcv_jira_rss'],
trigger=IntervalTrigger(seconds=trigger_times),
desc='开启后当Jira更新Dungeons版本时将会自动推送消息。', alias='mcdvjirarss')
async def mcdv_jira_rss(bot: FetchTarget):
async def mcdv_jira_rss(bot: Bot.FetchTarget):
try:
verlist = get_stored_list(bot, 'mcdv_jira_rss')
file = json.loads(await get_url('https://bugs.mojang.com/rest/api/2/project/11901/versions', 200, attempt=1))

View file

@ -1,4 +1,4 @@
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command
from core.dirty_check import check
from modules.meme.jiki import jiki
@ -15,7 +15,7 @@ meme = on_command(
@meme.handle(help_doc='<term> {在萌娘百科、nbnhhsh、Urban Dictionary 中查询梗}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
res_jiki = await jiki(msg.parsed_msg['<term>'])
res_moegirl = await moegirl(msg.parsed_msg['<term>'])
res_nbnhhsh = await nbnhhsh(msg.parsed_msg['<term>'])

View file

@ -3,9 +3,9 @@ import traceback
from bs4 import BeautifulSoup
from config import Config
from core.elements import Url
from core.builtins import Url
from core.logger import Logger
from core.utils import get_url
from core.utils.http import get_url
async def jiki(term: str):

View file

@ -3,7 +3,7 @@ import traceback
import ujson as json
from core.logger import Logger
from core.utils import post_url
from core.utils.http import post_url
async def nbnhhsh(term: str):

View file

@ -3,9 +3,9 @@ import traceback
import ujson as json
from config import Config
from core.elements import Url
from core.builtins import Url
from core.logger import Logger
from core.utils import get_url
from core.utils.http import get_url
async def urban(term: str):

View file

@ -6,10 +6,12 @@ from urllib.parse import quote
import ujson as json
from config import Config
from core.builtins import Url, Bot
from core.component import on_schedule
from core.elements import FetchTarget, IntervalTrigger, Url
from core.logger import Logger
from core.utils import get_url, get_stored_list, update_stored_list
from core.scheduler import IntervalTrigger
from core.utils.http import get_url
from core.utils.storedata import get_stored_list, update_stored_list
class Article:
@ -42,7 +44,7 @@ class Article:
recommend_modules=['feedback_news'],
trigger=IntervalTrigger(seconds=60 if not Config('slower_schedule') else 180),
desc='开启后将会自动推送来自Minecraft官网的新闻。', alias='minecraftnews')
async def start_check_news(bot: FetchTarget):
async def start_check_news(bot: Bot.FetchTarget):
baseurl = 'https://www.minecraft.net'
url = quote(
f'https://www.minecraft.net/content/minecraft-net/_jcr_content.articles.grid?tileselection=auto&tagsPath={",".join(Article.random_tags())}&offset=0&pageSize={Article.count}')
@ -78,7 +80,7 @@ async def start_check_news(bot: FetchTarget):
@on_schedule('feedback_news', developers=['Dianliang233'], recommend_modules=['minecraft_news'],
trigger=IntervalTrigger(seconds=300), desc='开启后将会推送来自Minecraft Feedback的更新记录。',
alias='feedbacknews')
async def feedback_news(bot: FetchTarget):
async def feedback_news(bot: Bot.FetchTarget):
sections = [{'name': 'beta',
'url': 'https://minecraftfeedback.zendesk.com/api/v2/help_center/en-us/sections/360001185332/articles?per_page=5'},
{'name': 'article',

View file

@ -3,9 +3,9 @@ import urllib.parse
from bs4 import BeautifulSoup
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command
from core.utils import get_url
from core.utils.http import get_url
mod_dl = on_command(
bind_prefix='mod_dl',
@ -26,7 +26,7 @@ source_url = 'https://files.xmdhs.com/curseforge/'
@mod_dl.handle('<mod_name> [<version>] {通过模组名获取模组下载链接CloudFlare CDN支持。}')
async def main(msg: MessageSession):
async def main(msg: Bot.MessageSession):
mod_name = msg.parsed_msg['<mod_name>']
ver = msg.parsed_msg.get('<version>', False)
if ver:

View file

@ -1,7 +1,7 @@
# ported from kurisu(https://github.com/nh-server/Kurisu/tree/main/cogs/results)
import discord
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command
from core.utils.message import convertDiscordEmbed
from . import switch, wiiu_support, wiiu_results, ctr_support, ctr_results
@ -82,7 +82,7 @@ e = on_command('err', developers=['OasisAkari', 'kurisu'])
@e.handle('<errcode> {解析任天堂系列主机的报错码并给出原因。}')
async def result(msg: MessageSession):
async def result(msg: Bot.MessageSession):
"""
Displays information on game console result codes, with a fancy embed.
0x prefix is not required for hex input.

View file

@ -1,6 +1,6 @@
from typing import Optional
from core.elements import Url
from core.builtins import Url
class Module:

View file

@ -2,9 +2,9 @@ import os
from PIL import Image, ImageDraw, ImageFont
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.builtins import Image as Img
from core.component import on_command
from core.elements import Image as Img
from core.utils.cache import random_cache_path
assets_path = os.path.abspath('./assets/arcaea')
@ -14,7 +14,7 @@ p = on_command('ptt',
@p.handle('<potential> {生成一张Arcaea Potential图片}')
async def pttimg(msg: MessageSession):
async def pttimg(msg: Bot.MessageSession):
ptt = msg.parsed_msg['<potential>']
# ptt
if ptt == '--':

View file

@ -1,6 +1,6 @@
import secrets
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command
r = on_command('random', alias={'rand': 'random', 'rng': 'random', 'dice': 'random number 1 6',
@ -10,7 +10,7 @@ r = on_command('random', alias={'rand': 'random', 'rng': 'random', 'dice': 'rand
@r.handle('number <min> <max> {生成区间内的随机整数}', )
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
_min = msg.parsed_msg['<min>']
_max = msg.parsed_msg['<max>']
random = secrets.randbelow(int(_max) - int(_min) + 1) + int(_min)
@ -18,6 +18,6 @@ async def _(msg: MessageSession):
@r.handle('choice ... {从集合中选择元素}', )
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
choices = msg.parsed_msg['...']
await msg.finish(secrets.choice(choices))

View file

@ -1,6 +1,6 @@
from core.builtins import Bot
from core.component import on_startup
from core.dirty_check import check
from core.elements import FetchTarget
from core.logger import Logger
from core.scheduler import Scheduler
from modules.wiki.utils.UTC8 import UTC8
@ -10,7 +10,7 @@ wiki = WikiLib('https://minecraft.fandom.com/zh/api.php')
@on_startup('__check_newbie__', required_superuser=True, developers=['OasisAkari'])
async def newbie(bot: FetchTarget):
async def newbie(bot: Bot.FetchTarget):
if bot.name not in ['QQ', 'TEST']:
return
Logger.info('Start newbie monitoring...')
@ -40,7 +40,7 @@ async def newbie(bot: FetchTarget):
@on_startup('__check_abuse__', required_superuser=True, developers=['OasisAkari'])
async def _(bot: FetchTarget):
async def _(bot: Bot.FetchTarget):
if bot.name not in ['QQ', 'TEST']:
return
Logger.info('Start abuse monitoring...')

View file

@ -2,7 +2,7 @@ import asyncio
import re
import traceback
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command
from core.dirty_check import check
from .server import server
@ -12,7 +12,7 @@ s = on_command('server', alias='s', developers=['_LittleC_', 'OasisAkari'])
@s.handle('<ServerIP:Port> [-r] [-p] {获取Minecraft Java/基岩版服务器motd。}',
options_desc={'-r': '显示原始信息', '-p': '显示玩家列表'})
async def main(msg: MessageSession):
async def main(msg: Bot.MessageSession):
enabled_addon = msg.options.get('server_revoke')
if enabled_addon is None:
enabled_addon = True
@ -65,7 +65,7 @@ async def main(msg: MessageSession):
@s.handle('revoke <enable|disable> {是否启用自动撤回功能(默认为是)。}')
async def revoke(msg: MessageSession):
async def revoke(msg: Bot.MessageSession):
if msg.parsed_msg.get('<enable|disable>') == 'enable':
msg.data.edit_option('server_revoke', True)
await msg.finish('已启用自动撤回功能。')
@ -74,7 +74,7 @@ async def revoke(msg: MessageSession):
await msg.finish('已禁用自动撤回功能。')
async def s(msg: MessageSession, address, raw, showplayer, mode, enabled_addon):
async def s(msg: Bot.MessageSession, address, raw, showplayer, mode, enabled_addon):
sendmsg = await server(address, raw, showplayer, mode)
if sendmsg != '':
sendmsg = await check(sendmsg)

View file

@ -4,7 +4,7 @@ import traceback
import aiohttp
import ujson as json
from core.elements import ErrorMessage
from core.builtins import ErrorMessage
from core.logger import Logger

View file

@ -1,6 +1,6 @@
import re
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.component import on_command
from modules.wiki.utils.dbutils import WikiTargetInfo
from .user import get_user_info
@ -10,7 +10,7 @@ usr = on_command('user', alias=['u'],
@usr.handle('<username> [-p] {获取一个MediaWiki用户的信息。}', options_desc={'-p': '生成一张图片'})
async def user(msg: MessageSession):
async def user(msg: Bot.MessageSession):
target = WikiTargetInfo(msg)
get_url = target.get_start_wiki()
if get_url:

View file

@ -6,8 +6,8 @@ import urllib.parse
from bs4 import BeautifulSoup as bs
from core.elements import Plain, Image
from core.utils import get_url, download_to_cache
from core.builtins import Plain, Image
from core.utils.http import get_url, download_to_cache
from modules.wiki.utils.UTC8 import UTC8
from modules.wiki.utils.wikilib import WikiLib
from .tpg import tpg

View file

@ -2,10 +2,10 @@ import re
import ujson as json
from core.builtins.message import MessageSession
from core.builtins import Bot
from core.builtins import Plain, Image, Url
from core.component import on_command
from core.elements import Plain, Image, Url
from core.utils import get_url
from core.utils.http import get_url
from .teahouse import get_rss as get_teahouse_rss
@ -37,12 +37,12 @@ wky = on_command('weekly', developers=['Dianliang233'])
@wky.handle('{获取中文 Minecraft Wiki 的每周页面}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
weekly = await get_weekly(True if msg.target.clientName == 'QQ' else False)
await msg.finish(weekly)
@wky.handle('teahouse {获取茶馆周报}')
async def _(msg: MessageSession):
async def _(msg: Bot.MessageSession):
weekly = await get_teahouse_rss()
await msg.finish(weekly)

Some files were not shown because too many files have changed in this diff Show more