diff --git a/core/bots/aiocqhttp/bot.py b/core/bots/aiocqhttp/bot.py index c194f708..03bc6d20 100644 --- a/core/bots/aiocqhttp/bot.py +++ b/core/bots/aiocqhttp/bot.py @@ -13,6 +13,9 @@ from core.loader import ModulesManager from core.parser.message import parser from core.scheduler import Scheduler from core.utils import init, load_prompt +from database import BotDBUtil +from database.logging_message import UnfriendlyActions + PrivateAssets.set(os.path.abspath(os.path.dirname(__file__) + '/assets')) EnableDirtyWordCheck.status = True @@ -55,8 +58,36 @@ async def _(event: Event): @bot.on('request.friend') async def _(event: Event): + if BotDBUtil.SenderInfo('QQ|' + str(event.user_id)).query.isInBlackList: + return {'approve': False} return {'approve': True} -host, port = Config('qq_host').split(':') -bot.run(host=host, port=port, debug=False) +@bot.on_notice('group_ban') +async def _(event: Event): + if event.user_id == int(Config("qq_account")): + if event.duration >= 259200: + result = True + else: + result = UnfriendlyActions(targetId=event.group_id, senderId=event.operator_id).add_and_check('mute') + if result: + await bot.call_action('set_group_leave', group_id=event.group_id) + BotDBUtil.SenderInfo('QQ|' + str(event.operator_id)).edit('isInBlackList', True) + await bot.call_action('delete_friend', friend_id=event.operator_id) + + +""" +@bot.on_message('group') +async def _(event: Event): + result = BotDBUtil.isGroupInWhiteList(f'QQ|Group|{str(event.group_id)}') + if not result: + await bot.send(event=event, message='此群不在白名单中,已自动退群。' + '\n如需申请白名单,请至https://github.com/Teahouse-Studios/bot/issues/new/choose发起issue。') + await bot.call_action('set_group_leave', group_id=event.group_id) +""" + + +qq_host = Config("qq_host") +if qq_host: + host, port = qq_host.split(':') + bot.run(host=host, port=port, debug=False) diff --git a/core/utils/bot.py b/core/utils/bot.py index a7b1df52..b01cf7e6 100644 --- a/core/utils/bot.py +++ b/core/utils/bot.py @@ -19,14 +19,14 @@ def init(): write_version = open(version, 'w') try: write_version.write(os.popen('git rev-parse HEAD', 'r').read()[0:6]) - except Exception: + except ValueError: write_version.write('Not a git repo') write_version.close() tag = os.path.abspath(PrivateAssets.path + '/version_tag') write_tag = open(tag, 'w') try: write_tag.write(os.popen('git tag -l', 'r').read().split('\n')[-2]) - except Exception: + except ValueError: write_tag.write('v4.?.?') write_tag.close() diff --git a/database/__init__.py b/database/__init__.py index 24e202e4..87eb4468 100644 --- a/database/__init__.py +++ b/database/__init__.py @@ -3,7 +3,7 @@ import datetime from core.elements.message import MessageSession from core.elements.temp import EnabledModulesCache, SenderInfoCache from database.orm import DBSession -from database.tables import EnabledModules, SenderInfo, TargetAdmin, CommandTriggerTime +from database.tables import EnabledModules, SenderInfo, TargetAdmin, CommandTriggerTime, GroupWhiteList from config import Config from tenacity import retry, stop_after_attempt @@ -223,3 +223,19 @@ class BotDBUtil: except Exception: session.rollback() raise + + @staticmethod + @retry(stop=stop_after_attempt(3)) + def isGroupInWhiteList(targetId): + try: + session.expire_all() + query = session.query(GroupWhiteList).filter_by(targetId=targetId).first() + if query is not None: + return True + return False + except Exception: + session.rollback() + raise + + +__all__ = ["BotDBUtil"] diff --git a/database/logging_message.py b/database/logging_message.py index bcb3fa2f..e4695381 100644 --- a/database/logging_message.py +++ b/database/logging_message.py @@ -18,13 +18,22 @@ class MSG(Base): message = Column(Text) -class DirtyFilter(Base): +class DirtyFilterTable(Base): __tablename__ = "filter_cache" desc = Column(Text, primary_key=True) result = Column(Text) timestamp = Column(TIMESTAMP, default=text('CURRENT_TIMESTAMP')) +class UnfriendlyActionsTable(Base): + __tablename__ = "unfriendly_action" + id = Column(Integer, primary_key=True) + targetId = Column(String(512)) + senderId = Column(String(512)) + action = Column(String(512)) + timestamp = Column(TIMESTAMP, default=text('CURRENT_TIMESTAMP')) + + class MSGDBSession: def __init__(self): self.engine = engine = create_engine(DB_LINK) @@ -48,7 +57,7 @@ def LoggerMSG(userid, command, msg): class DirtyWordCache: def __init__(self, query_word): self.query_word = query_word - self.query = session.query(DirtyFilter).filter_by(desc=self.query_word).first() + self.query = session.query(DirtyFilterTable).filter_by(desc=self.query_word).first() self.need_insert = False if self.query is None: self.need_insert = True @@ -58,7 +67,7 @@ class DirtyWordCache: self.need_insert = True def update(self, result: dict): - session.add_all([DirtyFilter(desc=self.query_word, result=json.dumps(result))]) + session.add_all([DirtyFilterTable(desc=self.query_word, result=json.dumps(result))]) session.commit() def get(self): @@ -66,3 +75,45 @@ class DirtyWordCache: return json.loads(self.query.result) else: return False + + +class UnfriendlyActions: + def __init__(self, targetId, senderId): + self.targetId = targetId + self.senderId = senderId + + def check_mute(self) -> bool: + """ + + :return: True = yes, False = no + """ + query = session.query(UnfriendlyActionsTable).filter_by(targetId=self.targetId).all() + unfriendly_list = [] + for records in query: + if datetime.datetime.now().timestamp() - records.timestamp.timestamp() < 432000: + unfriendly_list.append(records) + if len(unfriendly_list) > 5: + return True + count = {} + for criminal in unfriendly_list: + if datetime.datetime.now().timestamp() - criminal.timestamp.timestamp() < 86400: + if criminal.senderId not in count: + count[criminal.senderId] = 0 + else: + count[criminal.senderId] += 1 + if len(count) >= 3: + return True + for convict in count: + if count[convict] >= 3: + return True + return False + + def add_and_check(self, action='default') -> bool: + """ + + :return: True = yes, False = no + """ + session.add_all([UnfriendlyActionsTable(targetId=self.targetId, senderId=self.senderId, action=action)]) + session.commit() + return self.check_mute() + diff --git a/database/tables.py b/database/tables.py index 4da69d96..1d2c55d7 100644 --- a/database/tables.py +++ b/database/tables.py @@ -37,4 +37,9 @@ class CommandTriggerTime(Base): timestamp = Column(TIMESTAMP, default=text('CURRENT_TIMESTAMP')) -__all__ = ["Base", "EnabledModules", "TargetAdmin", "SenderInfo", "CommandTriggerTime"] \ No newline at end of file +class GroupWhiteList(Base): + __tablename__ = "GroupWhiteList" + targetId = Column(String(512), primary_key=True) + + +__all__ = ["Base", "EnabledModules", "TargetAdmin", "SenderInfo", "CommandTriggerTime", "GroupWhiteList"]