feat:初版
This commit is contained in:
1
plugins/Repeater/__init__.py
Normal file
1
plugins/Repeater/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
# 复读姬插件
|
||||
92
plugins/Repeater/main.py
Normal file
92
plugins/Repeater/main.py
Normal file
@@ -0,0 +1,92 @@
|
||||
"""
|
||||
复读姬插件
|
||||
|
||||
检测群聊中连续相同的消息,达到指定次数后自动复读
|
||||
"""
|
||||
|
||||
import tomllib
|
||||
from pathlib import Path
|
||||
from loguru import logger
|
||||
from typing import Dict
|
||||
from utils.plugin_base import PluginBase
|
||||
from utils.decorators import on_text_message
|
||||
|
||||
|
||||
class Repeater(PluginBase):
|
||||
"""复读姬插件"""
|
||||
|
||||
description = "检测群聊连续相同消息并自动复读"
|
||||
author = "Assistant"
|
||||
version = "1.0.0"
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.config = None
|
||||
self.group_messages: Dict[str, Dict] = {} # {group_id: {"content": str, "count": int}}
|
||||
|
||||
async def async_init(self):
|
||||
"""异步初始化"""
|
||||
config_path = Path(__file__).parent / "config.toml"
|
||||
with open(config_path, "rb") as f:
|
||||
self.config = tomllib.load(f)
|
||||
logger.success("复读姬插件已加载")
|
||||
|
||||
@on_text_message(priority=40)
|
||||
async def handle_text(self, bot, message: dict):
|
||||
"""处理文本消息"""
|
||||
content = message.get("Content", "").strip()
|
||||
from_wxid = message.get("FromWxid", "")
|
||||
sender_wxid = message.get("SenderWxid", "")
|
||||
is_group = message.get("IsGroup", False)
|
||||
|
||||
# 只处理群聊消息
|
||||
if not is_group:
|
||||
return True
|
||||
|
||||
# 检查是否启用
|
||||
if not self.config["behavior"]["enabled"]:
|
||||
return True
|
||||
|
||||
# 检查群聊过滤
|
||||
enabled_groups = self.config["behavior"]["enabled_groups"]
|
||||
disabled_groups = self.config["behavior"]["disabled_groups"]
|
||||
|
||||
if from_wxid in disabled_groups:
|
||||
return True
|
||||
if enabled_groups and from_wxid not in enabled_groups:
|
||||
return True
|
||||
|
||||
# 忽略空消息
|
||||
if not content:
|
||||
return True
|
||||
|
||||
# 获取触发次数
|
||||
repeat_count = self.config["behavior"]["repeat_count"]
|
||||
|
||||
# 检查是否是机器人自己的消息(避免无限循环)
|
||||
bot_wxid = getattr(bot, 'wxid', None)
|
||||
if sender_wxid == bot_wxid:
|
||||
return True
|
||||
|
||||
# 获取该群的消息记录
|
||||
if from_wxid not in self.group_messages:
|
||||
self.group_messages[from_wxid] = {"content": content, "count": 1}
|
||||
return True
|
||||
|
||||
group_data = self.group_messages[from_wxid]
|
||||
|
||||
# 如果消息相同,计数+1
|
||||
if group_data["content"] == content:
|
||||
group_data["count"] += 1
|
||||
|
||||
# 达到触发次数,复读
|
||||
if group_data["count"] == repeat_count:
|
||||
await bot.send_text(from_wxid, content)
|
||||
logger.info(f"复读消息: {from_wxid} - {content[:20]}...")
|
||||
# 重置计数,避免重复复读
|
||||
group_data["count"] = 0
|
||||
else:
|
||||
# 消息不同,重置记录
|
||||
self.group_messages[from_wxid] = {"content": content, "count": 1}
|
||||
|
||||
return True
|
||||
Reference in New Issue
Block a user