Merge branch 'master' of https://github.com/Teahouse-Studios/bot
This commit is contained in:
commit
4bea41eeb3
12 changed files with 175 additions and 13 deletions
|
@ -88,6 +88,15 @@ class MessageSession(MS):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
async def checkNativePermission(self):
|
||||||
|
if self.target.targetFrom == 'QQ':
|
||||||
|
return True
|
||||||
|
get_member_info = await bot.call_action('get_group_member_info', group_id=self.session.target,
|
||||||
|
user_id=self.session.sender)
|
||||||
|
if get_member_info['role'] in ['owner', 'admin']:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def checkSuperUser(self):
|
def checkSuperUser(self):
|
||||||
return True if self.target.senderInfo.query.isSuperUser else False
|
return True if self.target.senderInfo.query.isSuperUser else False
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,15 @@ class MessageSession(MS):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
async def checkNativePermission(self):
|
||||||
|
match_guild = re.match(r'(.*)\|(.*)', self.session.target)
|
||||||
|
get_member_info = await bot.call_action('get_guild_members', guild_id=match_guild.group(1))
|
||||||
|
tiny_id = self.session.sender
|
||||||
|
for m in get_member_info['admins']:
|
||||||
|
if m['tiny_id'] == tiny_id:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def checkSuperUser(self):
|
def checkSuperUser(self):
|
||||||
return True if self.target.senderInfo.query.isSuperUser else False
|
return True if self.target.senderInfo.query.isSuperUser else False
|
||||||
|
|
||||||
|
@ -187,4 +196,4 @@ class FetchTarget(FT):
|
||||||
except Exception:
|
except Exception:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
return send_list
|
return send_list
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -84,6 +84,14 @@ class MessageSession(MS):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
async def checkNativePermission(self):
|
||||||
|
if self.session.message.chat.type == 'private':
|
||||||
|
return True
|
||||||
|
admins = [member.user.id for member in await dp.bot.get_chat_administrators(self.session.message.chat.id)]
|
||||||
|
if self.session.sender in admins:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def checkSuperUser(self):
|
def checkSuperUser(self):
|
||||||
return True if self.target.senderInfo.query.isSuperUser else False
|
return True if self.target.senderInfo.query.isSuperUser else False
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,12 @@ class MessageSession(MS):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
async def checkNativePermission(self):
|
||||||
|
if self.session.message.channel.permissions_for(self.session.message.author).administrator \
|
||||||
|
or isinstance(self.session.message.channel, discord.DMChannel):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def checkSuperUser(self):
|
def checkSuperUser(self):
|
||||||
return True if self.target.senderInfo.query.isSuperUser else False
|
return True if self.target.senderInfo.query.isSuperUser else False
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,10 @@ class Template(MessageSession):
|
||||||
print("(Try to check your permissions, but this is a unit test environment. Have fun!)")
|
print("(Try to check your permissions, but this is a unit test environment. Have fun!)")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
async def checkNativePermission(self):
|
||||||
|
print("(Try to check your native permissions, but this is a unit test environment. Have fun!)")
|
||||||
|
return True
|
||||||
|
|
||||||
def checkSuperUser(self):
|
def checkSuperUser(self):
|
||||||
print("(Try to check if you are superuser, but this is a unit test environment. Have fun!)")
|
print("(Try to check if you are superuser, but this is a unit test environment. Have fun!)")
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -74,6 +74,12 @@ class MessageSession:
|
||||||
"""
|
"""
|
||||||
...
|
...
|
||||||
|
|
||||||
|
async def checkNativePermission(self):
|
||||||
|
"""
|
||||||
|
用于检查消息发送者原本在聊天平台中是否具有管理员权限。
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
async def fake_forward_msg(self, nodelist):
|
async def fake_forward_msg(self, nodelist):
|
||||||
"""
|
"""
|
||||||
用于发送假转发消息(QQ)。
|
用于发送假转发消息(QQ)。
|
||||||
|
|
|
@ -85,6 +85,9 @@ async def parser(msg: MessageSession):
|
||||||
msg.trigger_msg = command # 触发该命令的消息,去除消息前缀
|
msg.trigger_msg = command # 触发该命令的消息,去除消息前缀
|
||||||
command_first_word = command_spilt[0].lower()
|
command_first_word = command_spilt[0].lower()
|
||||||
sudo = False
|
sudo = False
|
||||||
|
mute = False
|
||||||
|
if command_first_word == 'mute':
|
||||||
|
mute = True
|
||||||
if command_first_word == 'sudo':
|
if command_first_word == 'sudo':
|
||||||
if not msg.checkSuperUser():
|
if not msg.checkSuperUser():
|
||||||
return await msg.sendMessage('你不是本机器人的超级管理员,无法使用sudo命令。')
|
return await msg.sendMessage('你不是本机器人的超级管理员,无法使用sudo命令。')
|
||||||
|
@ -93,6 +96,11 @@ async def parser(msg: MessageSession):
|
||||||
command_first_word = command_spilt[0].lower()
|
command_first_word = command_spilt[0].lower()
|
||||||
msg.trigger_msg = ' '.join(command_spilt)
|
msg.trigger_msg = ' '.join(command_spilt)
|
||||||
if senderInfo.query.isInBlockList and not senderInfo.query.isInAllowList and not sudo: # 如果是以 sudo 执行的命令,则不检查是否已 ban
|
if senderInfo.query.isInBlockList and not senderInfo.query.isInAllowList and not sudo: # 如果是以 sudo 执行的命令,则不检查是否已 ban
|
||||||
|
ExecutionLockList.remove(msg)
|
||||||
|
return
|
||||||
|
in_mute = BotDBUtil.Muting(msg).check()
|
||||||
|
if in_mute and not mute:
|
||||||
|
ExecutionLockList.remove(msg)
|
||||||
return
|
return
|
||||||
if command_first_word in ModulesAliases:
|
if command_first_word in ModulesAliases:
|
||||||
command_spilt[0] = ModulesAliases[command_first_word]
|
command_spilt[0] = ModulesAliases[command_first_word]
|
||||||
|
@ -133,7 +141,10 @@ async def parser(msg: MessageSession):
|
||||||
await msg.sendMessage(f'{command_first_word}模块未启用,请发送~enable {command_first_word}启用本模块。')
|
await msg.sendMessage(f'{command_first_word}模块未启用,请发送~enable {command_first_word}启用本模块。')
|
||||||
continue
|
continue
|
||||||
elif module.required_admin:
|
elif module.required_admin:
|
||||||
if not await msg.checkPermission():
|
if not await msg.checkPermission() and not mute:
|
||||||
|
if in_mute:
|
||||||
|
ExecutionLockList.remove(msg)
|
||||||
|
continue
|
||||||
await msg.sendMessage(f'{command_first_word}命令仅能被该群组的管理员所使用,请联系管理员执行此命令。')
|
await msg.sendMessage(f'{command_first_word}命令仅能被该群组的管理员所使用,请联系管理员执行此命令。')
|
||||||
continue
|
continue
|
||||||
if not module.match_list.set:
|
if not module.match_list.set:
|
||||||
|
|
|
@ -62,6 +62,18 @@ async def get_url(url: str, status_code: int = False, headers: dict = None, fmt=
|
||||||
return text
|
return text
|
||||||
|
|
||||||
|
|
||||||
|
@retry(stop=stop_after_attempt(3), wait=wait_fixed(3), reraise=True)
|
||||||
|
async def post_url(url: str, data: any, headers: dict = None):
|
||||||
|
'''发送POST请求。
|
||||||
|
:param url: 需要发送的url。
|
||||||
|
:param data: 需要发送的数据。
|
||||||
|
:param headers: 请求时使用的http头。
|
||||||
|
:returns: 发送请求后的响应。'''
|
||||||
|
async with aiohttp.ClientSession(headers=headers) as session:
|
||||||
|
async with session.post(url, data=data, headers=headers) as req:
|
||||||
|
return await req.text()
|
||||||
|
|
||||||
|
|
||||||
@retry(stop=stop_after_attempt(3), wait=wait_fixed(3), reraise=True)
|
@retry(stop=stop_after_attempt(3), wait=wait_fixed(3), reraise=True)
|
||||||
async def download_to_cache(link: str) -> Union[str, bool]:
|
async def download_to_cache(link: str) -> Union[str, bool]:
|
||||||
'''利用AioHttp下载指定url的内容,并保存到缓存(./cache目录)。
|
'''利用AioHttp下载指定url的内容,并保存到缓存(./cache目录)。
|
||||||
|
|
|
@ -6,7 +6,7 @@ from config import Config
|
||||||
from core.elements.message import MessageSession
|
from core.elements.message import MessageSession
|
||||||
from core.elements.temp import EnabledModulesCache, SenderInfoCache
|
from core.elements.temp import EnabledModulesCache, SenderInfoCache
|
||||||
from database.orm import DBSession
|
from database.orm import DBSession
|
||||||
from database.tables import EnabledModules, SenderInfo, TargetAdmin, CommandTriggerTime, GroupAllowList
|
from database.tables import EnabledModules, MuteList, SenderInfo, TargetAdmin, CommandTriggerTime, GroupAllowList
|
||||||
|
|
||||||
cache = Config('db_cache')
|
cache = Config('db_cache')
|
||||||
|
|
||||||
|
@ -226,4 +226,33 @@ class BotDBUtil:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class Muting:
|
||||||
|
@retry(stop=stop_after_attempt(3))
|
||||||
|
@auto_rollback_error
|
||||||
|
def __init__(self, msg: MessageSession):
|
||||||
|
self.msg = msg
|
||||||
|
self.targetId = msg.target.targetId
|
||||||
|
self.query = session.query(MuteList).filter_by(targetId=self.targetId).first()
|
||||||
|
|
||||||
|
@retry(stop=stop_after_attempt(3))
|
||||||
|
@auto_rollback_error
|
||||||
|
def check(self):
|
||||||
|
if self.query is not None:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
@retry(stop=stop_after_attempt(3))
|
||||||
|
@auto_rollback_error
|
||||||
|
def add(self):
|
||||||
|
session.add(MuteList(targetId=self.targetId))
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
@retry(stop=stop_after_attempt(3))
|
||||||
|
@auto_rollback_error
|
||||||
|
def remove(self):
|
||||||
|
if self.query is not None:
|
||||||
|
session.delete(self.query)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
|
||||||
__all__ = ["BotDBUtil", "auto_rollback_error", "session"]
|
__all__ = ["BotDBUtil", "auto_rollback_error", "session"]
|
||||||
|
|
|
@ -30,6 +30,11 @@ class TargetAdmin(Base):
|
||||||
targetId = Column(String(512))
|
targetId = Column(String(512))
|
||||||
|
|
||||||
|
|
||||||
|
class MuteList(Base):
|
||||||
|
"""禁言列表"""
|
||||||
|
__tablename__ = "MuteList"
|
||||||
|
targetId = Column(String(512), primary_key=True)
|
||||||
|
|
||||||
class CommandTriggerTime(Base):
|
class CommandTriggerTime(Base):
|
||||||
"""命令触发时间"""
|
"""命令触发时间"""
|
||||||
__tablename__ = "CommandTriggerTime"
|
__tablename__ = "CommandTriggerTime"
|
||||||
|
|
|
@ -424,25 +424,32 @@ async def del_su(message: MessageSession):
|
||||||
await message.sendMessage('操作成功:已将' + user + '移出超级用户。')
|
await message.sendMessage('操作成功:已将' + user + '移出超级用户。')
|
||||||
|
|
||||||
|
|
||||||
whoami = on_command('whoami', developers=['Dianliang233'], desc='获取发送命令的账号在机器人内部的识别码', base=True)
|
whoami = on_command('whoami', developers=['Dianliang233'], desc='获取发送命令的账号在机器人内部的 ID', base=True)
|
||||||
|
|
||||||
|
|
||||||
@whoami.handle()
|
@whoami.handle()
|
||||||
async def _(msg: MessageSession):
|
async def _(msg: MessageSession):
|
||||||
await msg.sendMessage(f'你是:{msg.target.senderId}\n本对话是:{msg.target.targetId}', disable_secret_check=True)
|
rights = ''
|
||||||
|
if await msg.checkNativePermission():
|
||||||
|
rights += '\n(你拥有本对话的管理员权限)'
|
||||||
|
elif await msg.checkPermission():
|
||||||
|
rights += '\n(你拥有本对话的机器人管理员权限)'
|
||||||
|
if msg.checkSuperUser():
|
||||||
|
rights += '\n(你拥有本机器人的超级用户权限)'
|
||||||
|
await msg.sendMessage(f'你的 ID 是:{msg.target.senderId}\n本对话的 ID 是:{msg.target.targetId}' + rights, disable_secret_check=True)
|
||||||
|
|
||||||
|
|
||||||
ab = on_command('abuse', alias=['ae'], developers=['Dianliang233'], required_superuser=True)
|
ae = on_command('abuse', alias=['ae'], developers=['Dianliang233'], required_superuser=True)
|
||||||
|
|
||||||
|
|
||||||
@ab.handle('check <user>')
|
@ae.handle('check <user>')
|
||||||
async def _(msg: MessageSession):
|
async def _(msg: MessageSession):
|
||||||
user = msg.parsed_msg['<user>']
|
user = msg.parsed_msg['<user>']
|
||||||
warns = BotDBUtil.SenderInfo(user).query.warns
|
warns = BotDBUtil.SenderInfo(user).query.warns
|
||||||
await msg.sendMessage(f'{user} 已被警告 {warns} 次。')
|
await msg.sendMessage(f'{user} 已被警告 {warns} 次。')
|
||||||
|
|
||||||
|
|
||||||
@ab.handle('warn <user> [<count>]')
|
@ae.handle('warn <user> [<count>]')
|
||||||
async def _(msg: MessageSession):
|
async def _(msg: MessageSession):
|
||||||
count = int(msg.parsed_msg['<count>'] or 1)
|
count = int(msg.parsed_msg['<count>'] or 1)
|
||||||
user = msg.parsed_msg['<user>']
|
user = msg.parsed_msg['<user>']
|
||||||
|
@ -450,7 +457,7 @@ async def _(msg: MessageSession):
|
||||||
await msg.sendMessage(f'成功警告 {user} {count} 次。此用户已被警告 {warn_count} 次。')
|
await msg.sendMessage(f'成功警告 {user} {count} 次。此用户已被警告 {warn_count} 次。')
|
||||||
|
|
||||||
|
|
||||||
@ab.handle('revoke <user> [<count>]')
|
@ae.handle('revoke <user> [<count>]')
|
||||||
async def _(msg: MessageSession):
|
async def _(msg: MessageSession):
|
||||||
count = 0 - int(msg.parsed_msg['<count>'] or -1)
|
count = 0 - int(msg.parsed_msg['<count>'] or -1)
|
||||||
user = msg.parsed_msg['<user>']
|
user = msg.parsed_msg['<user>']
|
||||||
|
@ -458,28 +465,28 @@ async def _(msg: MessageSession):
|
||||||
await msg.sendMessage(f'成功移除警告 {user} 的 {count} 次警告。此用户已被警告 {warn_count} 次。')
|
await msg.sendMessage(f'成功移除警告 {user} 的 {count} 次警告。此用户已被警告 {warn_count} 次。')
|
||||||
|
|
||||||
|
|
||||||
@ab.handle('clear <user>')
|
@ae.handle('clear <user>')
|
||||||
async def _(msg: MessageSession):
|
async def _(msg: MessageSession):
|
||||||
user = msg.parsed_msg['<user>']
|
user = msg.parsed_msg['<user>']
|
||||||
await pardon_user(user)
|
await pardon_user(user)
|
||||||
await msg.sendMessage(f'成功清除 {user} 的警告。')
|
await msg.sendMessage(f'成功清除 {user} 的警告。')
|
||||||
|
|
||||||
|
|
||||||
@ab.handle('untempban <user>')
|
@ae.handle('untempban <user>')
|
||||||
async def _(msg: MessageSession):
|
async def _(msg: MessageSession):
|
||||||
user = msg.parsed_msg['<user>']
|
user = msg.parsed_msg['<user>']
|
||||||
await remove_temp_ban(user)
|
await remove_temp_ban(user)
|
||||||
await msg.sendMessage(f'成功解除 {user} 的临时封禁。')
|
await msg.sendMessage(f'成功解除 {user} 的临时封禁。')
|
||||||
|
|
||||||
|
|
||||||
@ab.handle('ban <user>')
|
@ae.handle('ban <user>')
|
||||||
async def _(msg: MessageSession):
|
async def _(msg: MessageSession):
|
||||||
user = msg.parsed_msg['<user>']
|
user = msg.parsed_msg['<user>']
|
||||||
if BotDBUtil.SenderInfo(user).edit('isInBlockList', True):
|
if BotDBUtil.SenderInfo(user).edit('isInBlockList', True):
|
||||||
await msg.sendMessage(f'成功封禁 {user}。')
|
await msg.sendMessage(f'成功封禁 {user}。')
|
||||||
|
|
||||||
|
|
||||||
@ab.handle('unban <user>')
|
@ae.handle('unban <user>')
|
||||||
async def _(msg: MessageSession):
|
async def _(msg: MessageSession):
|
||||||
user = msg.parsed_msg['<user>']
|
user = msg.parsed_msg['<user>']
|
||||||
if BotDBUtil.SenderInfo(user).edit('isInBlockList', False):
|
if BotDBUtil.SenderInfo(user).edit('isInBlockList', False):
|
||||||
|
@ -570,3 +577,16 @@ async def _(msg: MessageSession):
|
||||||
else:
|
else:
|
||||||
target.edit('disable_typing', False)
|
target.edit('disable_typing', False)
|
||||||
await msg.sendMessage('成功打开输入提示。')
|
await msg.sendMessage('成功打开输入提示。')
|
||||||
|
|
||||||
|
|
||||||
|
mute = on_command('mute', developers=['Dianliang233'], base=True, required_admin=True)
|
||||||
|
|
||||||
|
|
||||||
|
@mute.handle()
|
||||||
|
async def _(msg: MessageSession):
|
||||||
|
if BotDBUtil.Muting(msg).check():
|
||||||
|
BotDBUtil.Muting(msg).remove()
|
||||||
|
await msg.sendMessage('成功取消禁言。')
|
||||||
|
else:
|
||||||
|
BotDBUtil.Muting(msg).add()
|
||||||
|
await msg.sendMessage('成功禁言。')
|
||||||
|
|
43
modules/nbnhhsh/__init__.py
Normal file
43
modules/nbnhhsh/__init__.py
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
import ujson as json
|
||||||
|
|
||||||
|
from core.elements import MessageSession
|
||||||
|
from core.component import on_command
|
||||||
|
from core.utils import post_url
|
||||||
|
|
||||||
|
n = on_command(
|
||||||
|
bind_prefix='nbnhhsh',
|
||||||
|
desc='能不能好好说话?拼音首字母缩写释义工具',
|
||||||
|
developers=['Dianliang233'],)
|
||||||
|
|
||||||
|
|
||||||
|
@n.handle('<term>')
|
||||||
|
async def _(msg: MessageSession):
|
||||||
|
await msg.sendMessage(await nbnhhsh(msg.parsed_msg['<term>']))
|
||||||
|
|
||||||
|
async def nbnhhsh(term: str):
|
||||||
|
'''查询nbnhhsh。
|
||||||
|
|
||||||
|
:param term: 需要查询的term。
|
||||||
|
:returns: 查询结果。'''
|
||||||
|
try:
|
||||||
|
url = 'https://lab.magiconch.com/api/nbnhhsh/guess'
|
||||||
|
req = json.dumps({'text': term})
|
||||||
|
text = await post_url(url, data=req, headers={'Content-Type': 'application/json', 'Accept': '*/*', 'Content-Length': str(len(req))})
|
||||||
|
print(text)
|
||||||
|
data = json.loads(text)
|
||||||
|
result = data[0]
|
||||||
|
if 'trans' in result:
|
||||||
|
trans = result['trans']
|
||||||
|
count = trans.__len__()
|
||||||
|
return f'[nbnhhsh]({count}个结果,已收录):{"、".join(trans)}'
|
||||||
|
elif 'inputting' in result and result['inputting'] != []:
|
||||||
|
inputting = result['inputting']
|
||||||
|
count = inputting.__len__()
|
||||||
|
return f'[nbnhhsh]({count}个结果,AI 猜测):{"、".join(inputting)}'
|
||||||
|
else:
|
||||||
|
return '[nbnhhsh] 没有找到相关结果。'
|
||||||
|
except Exception:
|
||||||
|
traceback.print_exc()
|
||||||
|
return '[nbnhhsh] 查询出错。'
|
Reference in a new issue