Archived
1
0
Fork 0

auto dealing with mute operations that violate tos

This commit is contained in:
yzhh 2021-10-17 00:17:21 +08:00
parent 2351df0546
commit dadd6b82fe
5 changed files with 112 additions and 9 deletions

View file

@ -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)

View file

@ -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()

View file

@ -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"]

View file

@ -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()

View file

@ -37,4 +37,9 @@ class CommandTriggerTime(Base):
timestamp = Column(TIMESTAMP, default=text('CURRENT_TIMESTAMP'))
__all__ = ["Base", "EnabledModules", "TargetAdmin", "SenderInfo", "CommandTriggerTime"]
class GroupWhiteList(Base):
__tablename__ = "GroupWhiteList"
targetId = Column(String(512), primary_key=True)
__all__ = ["Base", "EnabledModules", "TargetAdmin", "SenderInfo", "CommandTriggerTime", "GroupWhiteList"]