auto dealing with mute operations that violate tos
This commit is contained in:
parent
2351df0546
commit
dadd6b82fe
5 changed files with 112 additions and 9 deletions
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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"]
|
||||
|
|
Reference in a new issue