feature:1.加群功能插件化;2.成员变更不监听消息,使用定时检查策略;

This commit is contained in:
liuwei
2025-03-20 14:26:52 +08:00
parent a7d0d400f9
commit cf78facbad

View File

@@ -1,9 +1,9 @@
import logging
import re
from datetime import datetime
from typing import Dict, Any, List, Optional
from typing import Dict, Any, List, Optional, Tuple
from wcferry import WxMsg
from wcferry import Wcf, WxMsg
from plugin_common.message_plugin_interface import MessagePluginInterface
from plugin_common.plugin_interface import PluginStatus
@@ -13,20 +13,40 @@ from robot_cmd.robot_command import Feature, PermissionStatus, GroupBotManager
class GroupAddPlugin(MessagePluginInterface):
"""群成员加入欢迎插件"""
@property
def name(self) -> str:
return "群成员加入欢迎"
@property
def version(self) -> str:
return "1.0.0"
@property
def description(self) -> str:
return "当有新成员加入群聊时,自动发送欢迎消息"
@property
def author(self) -> str:
return "Trae AI"
@property
def command_prefix(self) -> Optional[str]:
return None # 不需要命令前缀,因为只处理系统消息
@property
def commands(self) -> List[str]:
return [] # 不支持命令
def __init__(self):
super().__init__()
self.name = "群成员加入欢迎"
self.description = "当有新成员加入群聊时,自动发送欢迎消息"
self.version = "1.0.0"
self.author = "Trae AI"
self.wcf = None
self.gbm = None
self.LOG = logging.getLogger(f"Plugin.{self.name}")
self.LOG = None
self.enable = True
def initialize(self, context: Dict[str, Any]) -> bool:
"""初始化插件"""
self.LOG = logging.getLogger(f"Plugin.{self.name}")
self.LOG.info(f"正在初始化 {self.name} 插件...")
# 保存上下文对象
@@ -45,55 +65,76 @@ class GroupAddPlugin(MessagePluginInterface):
plugin_config = self._config.get("GroupAdd", {})
self.enable = plugin_config.get("enable", True)
self.LOG.info(f"{self.name} 插件初始化完成,启用状态: {self.enable}")
self.LOG.info(f"[{self.name}] 插件初始化完成,启用状态: {self.enable}")
return True
def on_receive_message(self, msg: WxMsg) -> bool:
"""处理接收到的消息"""
def start(self) -> bool:
"""启动插件"""
self.LOG.info(f"[{self.name}] 插件已启动")
self.status = PluginStatus.RUNNING
return True
def stop(self) -> bool:
"""停止插件"""
self.LOG.info(f"[{self.name}] 插件已停止")
self.status = PluginStatus.STOPPED
return True
def can_process(self, message: Dict[str, Any]) -> bool:
"""检查是否可以处理该消息"""
if not self.enable:
return False
# 获取消息类型和群ID
msg_type = message.get("type")
roomid = message.get("roomid", "")
content = message.get("content", "")
# 只处理群系统消息
if msg.type != 10000 or not msg.from_group():
if msg_type != 10000 or not roomid:
return False
# 检查群权限
if self.gbm.get_group_permission(msg.roomid, Feature.GROUP_ADD) == PermissionStatus.DISABLED:
gbm = message.get("gbm")
if gbm and gbm.get_group_permission(roomid, Feature.GROUP_ADD) == PermissionStatus.DISABLED:
return False
# 使用正则表达式提取双引号中的内容,判断是否为加入群聊消息
match = re.search(r'"(.*?)"', msg.content)
match = re.search(r'"(.*?)".*?加入群聊', content)
if not match:
return False
return True
def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]:
"""处理消息"""
content = message.get("content", "")
roomid = message.get("roomid", "")
wcf: Wcf = message.get("wcf")
self.LOG.info(f"插件执行: {self.name}{content}")
# 提取昵称
match = re.search(r'"(.*?)"', content)
if not match:
return False, "无法提取昵称"
# 获取当前时间
now_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# 提取昵称并发送欢迎消息
nickname = match.group(1)
welcome_message = f"🎉 欢迎 【{nickname}】 加入群聊👋 \n 🕒 {now_time} 🕒 "
self.wcf.send_text(welcome_message, msg.roomid)
self.LOG.info(f"已发送欢迎消息给新成员 {nickname} 在群 {msg.roomid}")
return True
@property
def commands(self) -> List[str]:
"""插件支持的命令列表"""
return []
# 发送欢迎消息
wcf.send_text(welcome_message, roomid)
self.LOG.info(f"已发送欢迎消息给新成员 {nickname} 在群 {roomid}")
return True, f"已欢迎 {nickname}"
def get_help(self) -> str:
"""获取插件帮助信息"""
return "群成员加入欢迎插件:当有新成员加入群聊时,自动发送欢迎消息。"
def start(self) -> bool:
"""启动插件"""
self.enable = True
self.LOG.info(f"{self.name} 插件已启动")
return True
def stop(self) -> bool:
"""停止插件"""
self.enable = False
self.LOG.info(f"{self.name} 插件已停止")
return True
return """群成员加入欢迎插件:
功能:当有新成员加入群聊时,自动发送欢迎消息。
无需手动触发,系统自动运行。
可在群管理中启用或禁用此功能。"""