2023-02-26 22:17:26 +08:00
|
|
|
|
import time
|
2022-09-03 17:30:03 +08:00
|
|
|
|
from io import BytesIO
|
2023-02-26 22:17:26 +08:00
|
|
|
|
from typing import Any, Dict, Tuple
|
2022-09-03 17:30:03 +08:00
|
|
|
|
|
|
|
|
|
|
import imagehash
|
2023-02-26 22:17:26 +08:00
|
|
|
|
from nonebot import on_command, on_message
|
|
|
|
|
|
from nonebot.adapters.onebot.v11 import ActionFailed, Bot, GroupMessageEvent, Message
|
2022-02-19 18:20:19 +08:00
|
|
|
|
from nonebot.adapters.onebot.v11.permission import GROUP
|
2023-02-26 22:17:26 +08:00
|
|
|
|
from nonebot.params import Command, CommandArg
|
|
|
|
|
|
from PIL import Image
|
|
|
|
|
|
|
|
|
|
|
|
from configs.config import NICKNAME, Config
|
2021-11-23 21:44:59 +08:00
|
|
|
|
from configs.path_config import DATA_PATH, TEMP_PATH
|
2021-05-20 19:27:31 +08:00
|
|
|
|
from services.log import logger
|
2021-11-23 21:44:59 +08:00
|
|
|
|
from utils.http_utils import AsyncHttpx
|
2023-02-26 22:17:26 +08:00
|
|
|
|
from utils.image_utils import get_img_hash
|
|
|
|
|
|
from utils.utils import get_message_img, get_message_text, is_number
|
2021-07-30 21:21:51 +08:00
|
|
|
|
|
2021-05-20 19:27:31 +08:00
|
|
|
|
try:
|
|
|
|
|
|
import ujson as json
|
|
|
|
|
|
except ModuleNotFoundError:
|
|
|
|
|
|
import json
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-10-03 14:24:07 +08:00
|
|
|
|
__zx_plugin_name__ = "刷屏禁言 [Admin]"
|
|
|
|
|
|
__plugin_usage__ = f"""
|
|
|
|
|
|
usage:
|
|
|
|
|
|
刷屏禁言相关操作,需要 {NICKNAME} 有群管理员权限
|
|
|
|
|
|
指令:
|
|
|
|
|
|
设置刷屏检测时间 [秒]
|
|
|
|
|
|
设置刷屏检测次数 [次数]
|
|
|
|
|
|
设置刷屏禁言时长 [分钟]
|
|
|
|
|
|
刷屏检测设置: 查看当前的刷屏检测设置
|
|
|
|
|
|
* 即 X 秒内发送同样消息 N 次,禁言 M 分钟 *
|
|
|
|
|
|
""".strip()
|
|
|
|
|
|
__plugin_des__ = "刷屏禁言相关操作"
|
|
|
|
|
|
__plugin_cmd__ = ["设置刷屏检测时间 [秒]", "设置刷屏检测次数 [次数]", "设置刷屏禁言时长 [分钟]", "刷屏检测设置"]
|
|
|
|
|
|
__plugin_version__ = 0.1
|
|
|
|
|
|
__plugin_author__ = "HibiKier"
|
2021-11-04 16:11:50 +08:00
|
|
|
|
__plugin_settings__ = {"admin_level": Config.get_config("mute", "MUTE_LEVEL")}
|
|
|
|
|
|
__plugin_configs__ = {
|
2023-02-26 22:17:26 +08:00
|
|
|
|
"MUTE_LEVEL [LEVEL]": {
|
|
|
|
|
|
"value": 5,
|
|
|
|
|
|
"help": "更改禁言设置的管理权限",
|
|
|
|
|
|
"default_value": 5,
|
|
|
|
|
|
"type": int,
|
|
|
|
|
|
},
|
|
|
|
|
|
"MUTE_DEFAULT_COUNT": {
|
|
|
|
|
|
"value": 10,
|
|
|
|
|
|
"help": "刷屏禁言默认检测次数",
|
|
|
|
|
|
"default_value": 10,
|
|
|
|
|
|
"type": int,
|
|
|
|
|
|
},
|
|
|
|
|
|
"MUTE_DEFAULT_TIME": {
|
|
|
|
|
|
"value": 7,
|
|
|
|
|
|
"help": "刷屏检测默认规定时间",
|
|
|
|
|
|
"default_value": 7,
|
|
|
|
|
|
"type": int,
|
|
|
|
|
|
},
|
2021-11-04 16:11:50 +08:00
|
|
|
|
"MUTE_DEFAULT_DURATION": {
|
|
|
|
|
|
"value": 10,
|
|
|
|
|
|
"help": "刷屏检测默禁言时长(分钟)",
|
2021-11-23 21:44:59 +08:00
|
|
|
|
"default_value": 10,
|
2023-02-26 22:17:26 +08:00
|
|
|
|
"type": int,
|
2021-11-04 16:11:50 +08:00
|
|
|
|
},
|
|
|
|
|
|
}
|
2021-06-15 10:57:08 +08:00
|
|
|
|
|
2021-05-20 19:27:31 +08:00
|
|
|
|
|
|
|
|
|
|
mute = on_message(priority=1, block=False)
|
2021-07-30 21:21:51 +08:00
|
|
|
|
mute_setting = on_command(
|
|
|
|
|
|
"mute_setting",
|
2021-10-03 14:24:07 +08:00
|
|
|
|
aliases={"设置刷屏检测时间", "设置刷屏检测次数", "设置刷屏禁言时长", "刷屏检测设置"},
|
2021-07-30 21:21:51 +08:00
|
|
|
|
permission=GROUP,
|
|
|
|
|
|
block=True,
|
2021-10-03 14:24:07 +08:00
|
|
|
|
priority=5,
|
2021-07-30 21:21:51 +08:00
|
|
|
|
)
|
2021-05-20 19:27:31 +08:00
|
|
|
|
|
|
|
|
|
|
|
2022-05-21 15:58:29 +08:00
|
|
|
|
def get_data() -> Dict[Any, Any]:
|
2021-05-20 19:27:31 +08:00
|
|
|
|
try:
|
2022-02-19 18:20:19 +08:00
|
|
|
|
with open(DATA_PATH / "group_mute_data.json", "r", encoding="utf8") as f:
|
2021-05-20 19:27:31 +08:00
|
|
|
|
data = json.load(f)
|
|
|
|
|
|
except (ValueError, FileNotFoundError):
|
|
|
|
|
|
data = {}
|
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def save_data():
|
|
|
|
|
|
global mute_data
|
2022-02-19 18:20:19 +08:00
|
|
|
|
with open(DATA_PATH / "group_mute_data.json", "w", encoding="utf8") as f:
|
2021-05-20 19:27:31 +08:00
|
|
|
|
json.dump(mute_data, f, indent=4)
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-09-03 17:30:03 +08:00
|
|
|
|
async def download_img_and_hash(url) -> str:
|
2023-02-26 22:17:26 +08:00
|
|
|
|
return str(
|
|
|
|
|
|
imagehash.average_hash(Image.open(BytesIO((await AsyncHttpx.get(url)).content)))
|
|
|
|
|
|
)
|
2021-05-20 19:27:31 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mute_dict = {}
|
|
|
|
|
|
mute_data = get_data()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mute.handle()
|
2022-05-21 13:46:29 +08:00
|
|
|
|
async def _(bot: Bot, event: GroupMessageEvent):
|
2021-05-20 19:27:31 +08:00
|
|
|
|
group_id = str(event.group_id)
|
2022-05-21 13:46:29 +08:00
|
|
|
|
msg = get_message_text(event.json())
|
2022-02-19 18:20:19 +08:00
|
|
|
|
img_list = get_message_img(event.json())
|
2021-07-30 21:21:51 +08:00
|
|
|
|
img_hash = ""
|
2022-02-19 18:20:19 +08:00
|
|
|
|
for img in img_list:
|
2022-09-03 17:30:03 +08:00
|
|
|
|
img_hash += await download_img_and_hash(img)
|
2021-05-20 19:27:31 +08:00
|
|
|
|
msg += img_hash
|
|
|
|
|
|
if not mute_data.get(group_id):
|
|
|
|
|
|
mute_data[group_id] = {
|
2021-11-04 16:11:50 +08:00
|
|
|
|
"count": Config.get_config("mute", "MUTE_DEFAULT_COUNT"),
|
|
|
|
|
|
"time": Config.get_config("mute", "MUTE_DEFAULT_TIME"),
|
|
|
|
|
|
"duration": Config.get_config("mute", "MUTE_DEFAULT_DURATION"),
|
2021-05-20 19:27:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
if not mute_dict.get(event.user_id):
|
2021-07-30 21:21:51 +08:00
|
|
|
|
mute_dict[event.user_id] = {"time": time.time(), "count": 1, "msg": msg}
|
2021-05-20 19:27:31 +08:00
|
|
|
|
else:
|
2021-07-30 21:21:51 +08:00
|
|
|
|
if msg and msg.find(mute_dict[event.user_id]["msg"]) != -1:
|
|
|
|
|
|
mute_dict[event.user_id]["count"] += 1
|
2021-05-20 19:27:31 +08:00
|
|
|
|
else:
|
2021-07-30 21:21:51 +08:00
|
|
|
|
mute_dict[event.user_id]["time"] = time.time()
|
|
|
|
|
|
mute_dict[event.user_id]["count"] = 1
|
|
|
|
|
|
mute_dict[event.user_id]["msg"] = msg
|
|
|
|
|
|
if time.time() - mute_dict[event.user_id]["time"] > mute_data[group_id]["time"]:
|
|
|
|
|
|
mute_dict[event.user_id]["time"] = time.time()
|
|
|
|
|
|
mute_dict[event.user_id]["count"] = 1
|
|
|
|
|
|
if (
|
|
|
|
|
|
mute_dict[event.user_id]["count"] > mute_data[group_id]["count"]
|
|
|
|
|
|
and time.time() - mute_dict[event.user_id]["time"]
|
|
|
|
|
|
< mute_data[group_id]["time"]
|
|
|
|
|
|
):
|
2021-05-20 19:27:31 +08:00
|
|
|
|
try:
|
2021-07-30 21:21:51 +08:00
|
|
|
|
if mute_data[group_id]["duration"] != 0:
|
|
|
|
|
|
await bot.set_group_ban(
|
|
|
|
|
|
group_id=event.group_id,
|
|
|
|
|
|
user_id=event.user_id,
|
2022-05-21 13:46:29 +08:00
|
|
|
|
duration=mute_data[group_id]["duration"] * 60,
|
2021-07-30 21:21:51 +08:00
|
|
|
|
)
|
2021-08-17 23:17:08 +08:00
|
|
|
|
await mute.send(f"检测到恶意刷屏,{NICKNAME}要把你关进小黑屋!", at_sender=True)
|
2021-07-30 21:21:51 +08:00
|
|
|
|
mute_dict[event.user_id]["count"] = 0
|
|
|
|
|
|
logger.info(
|
|
|
|
|
|
f"USER {event.user_id} GROUP {event.group_id} "
|
|
|
|
|
|
f'检测刷屏 被禁言 {mute_data[group_id]["duration"] / 60} 分钟'
|
|
|
|
|
|
)
|
2021-05-20 19:27:31 +08:00
|
|
|
|
except ActionFailed:
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mute_setting.handle()
|
2022-06-07 19:57:34 +08:00
|
|
|
|
async def _(
|
|
|
|
|
|
event: GroupMessageEvent,
|
|
|
|
|
|
cmd: Tuple[str, ...] = Command(),
|
|
|
|
|
|
arg: Message = CommandArg(),
|
|
|
|
|
|
):
|
2022-05-21 15:58:29 +08:00
|
|
|
|
global mute_data
|
2021-05-20 19:27:31 +08:00
|
|
|
|
group_id = str(event.group_id)
|
|
|
|
|
|
if not mute_data.get(group_id):
|
2022-06-07 19:57:34 +08:00
|
|
|
|
mute_data[group_id] = {
|
|
|
|
|
|
"count": Config.get_config("mute", "MUTE_DEFAULT_COUNT"),
|
|
|
|
|
|
"time": Config.get_config("mute", "MUTE_DEFAULT_TIME"),
|
|
|
|
|
|
"duration": Config.get_config("mute", "MUTE_DEFAULT_DURATION"),
|
|
|
|
|
|
}
|
2022-02-19 18:20:19 +08:00
|
|
|
|
msg = arg.extract_plain_text().strip()
|
|
|
|
|
|
if cmd[0] == "刷屏检测设置":
|
2021-07-30 21:21:51 +08:00
|
|
|
|
await mute_setting.finish(
|
|
|
|
|
|
f'最大次数:{mute_data[group_id]["count"]} 次\n'
|
|
|
|
|
|
f'规定时间:{mute_data[group_id]["time"]} 秒\n'
|
2022-05-21 13:15:53 +08:00
|
|
|
|
f'禁言时长:{mute_data[group_id]["duration"]:.2f} 分钟\n'
|
2021-07-30 21:21:51 +08:00
|
|
|
|
f"【在规定时间内发送相同消息超过最大次数则禁言\n当禁言时长为0时关闭此功能】"
|
|
|
|
|
|
)
|
2021-05-20 19:27:31 +08:00
|
|
|
|
if not is_number(msg):
|
2021-07-30 21:21:51 +08:00
|
|
|
|
await mute.finish("设置的参数必须是数字啊!", at_sender=True)
|
2022-05-21 15:58:29 +08:00
|
|
|
|
if cmd[0] == "设置刷屏检测时间":
|
2021-07-30 21:21:51 +08:00
|
|
|
|
mute_data[group_id]["time"] = int(msg)
|
|
|
|
|
|
msg += "秒"
|
2022-05-21 15:58:29 +08:00
|
|
|
|
if cmd[0] == "设置刷屏检测次数":
|
2021-07-30 21:21:51 +08:00
|
|
|
|
mute_data[group_id]["count"] = int(msg)
|
|
|
|
|
|
msg += " 次"
|
2022-05-21 15:58:29 +08:00
|
|
|
|
if cmd[0] == "设置刷屏禁言时长":
|
2022-05-21 13:15:53 +08:00
|
|
|
|
mute_data[group_id]["duration"] = int(msg)
|
2021-07-30 21:21:51 +08:00
|
|
|
|
msg += " 分钟"
|
2022-06-07 19:57:34 +08:00
|
|
|
|
await mute_setting.send(f"刷屏检测:{cmd[0]}为 {msg}")
|
|
|
|
|
|
logger.info(f"USER {event.user_id} GROUP {group_id} {cmd[0]}:{msg}")
|
2021-05-20 19:27:31 +08:00
|
|
|
|
save_data()
|