1.加入了撤回指令

This commit is contained in:
liuwei
2025-02-17 14:16:10 +08:00
parent af2ef96c3e
commit 8f820761ba
3 changed files with 67 additions and 12 deletions

View File

@@ -29,7 +29,7 @@ def archive_message(group_id, timestamp_str, sender, content, message_type, atta
# 提交事务
connection.commit()
print("Message archived successfully.")
print(f"Message archived successfully: {content}")
except Exception as e:
print(f"Error archiving message: {e}")
@@ -79,7 +79,7 @@ def get_messages(group_id, all_contacts: dict):
# 将列表中的字符串连接成一个最终的结果
result_str = "\n".join(result)
print(result_str) # 输出带逗号的字符串
# print(result_str) # 输出带逗号的字符串
return result_str
finally:

View File

@@ -23,9 +23,9 @@ from base.func_xinghuo_web import XinghuoWeb
from base.func_claude import Claude
from configuration import Config
from constants import ChatType
from group_auto.robot_command import GroupBotManager
from robot_cmd.robot_command import GroupBotManager
from job_mgmt import Job
from group_auto.robot_command import Feature
from robot_cmd.robot_command import Feature
__version__ = "39.2.4.0"
@@ -46,6 +46,7 @@ class Robot(Job):
self.LOG = logging.getLogger("Robot")
self.wxid = self.wcf.get_self_wxid()
self.allContacts = self.getAllContacts()
self.groups = {} # 存储按group_id分组的消息列表每个group_id最多保留10条消息
GroupBotManager.load_local_cache()
self.gbm = GroupBotManager()
if ChatType.is_in_chat_types(chat_type):
@@ -130,16 +131,22 @@ class Robot(Job):
def toChitchat(self, msg: WxMsg) -> bool:
"""闲聊,接入 ChatGPT
"""
# 去除@的人和空格等字符
q = re.sub(r"@.*?[\u2005|\s]", "", msg.content).replace(" ", "")
# 所有人员都可以要求他撤回刚刚的信息
if msg.from_group():
if q == '撤回':
self.revoke_messages(msg.roomid)
return True
# 如果聊天内容来自自己,则进行指令判断
if msg.from_self() and msg.from_group():
command_str = re.sub(r"@.*?[\u2005|\s]", "", msg.content).replace(" ", "")
rsp = GroupBotManager.handle_command(msg.roomid, command_str)
rsp = GroupBotManager.handle_command(msg.roomid, q)
self.sendTextMsg(rsp, msg.roomid, msg.sender)
return True
if not self.chat: # 没接 ChatGPT固定回复
rsp = "你@我干嘛?"
else: # 接了 ChatGPT智能回复
q = re.sub(r"@.*?[\u2005|\s]", "", msg.content).replace(" ", "")
if q == "今日百度新闻":
self.newsBaiduReport((msg.roomid if msg.from_group() else msg.sender))
return True
@@ -175,7 +182,6 @@ class Robot(Job):
# 群聊消息
if msg.from_group():
# 调用统计逻辑进行聊天数据统计:
try:
process_message(msg)
@@ -189,6 +195,10 @@ class Robot(Job):
except Exception as e:
self.LOG.error(f"archive_message error: {e}")
# 记录在群里发的最新消息,可以通过撤回指令撤回
if msg.from_self():
self.revoke_receive_message(msg)
# 如果在群里被 @
if msg.roomid not in self.config.GROUPS: # 不在配置的响应的群列表里,忽略
return
@@ -213,6 +223,7 @@ class Robot(Job):
if msg.from_self():
if msg.content == "^更新$":
self.config.reload()
self.gbm.load_local_cache()
self.LOG.info("已更新")
if msg.content == "今日百度新闻":
self.newsBaiduReport()
@@ -222,12 +233,15 @@ class Robot(Job):
self.messageCountToDB()
if msg.content == 'PDF':
self.generateSehuatangPdf()
if msg.content == 'GROUP_LIST':
self.sendTextMsg(self.gbm.get_group_list(), msg.sender)
self.sendTextMsg(f"指令:{msg.content} 已执行", msg.sender)
else:
self.toChitchat(msg) # 闲聊
def onMsg(self, msg: WxMsg) -> int:
try:
self.LOG.info(msg) # 打印信息
self.LOG.debug(msg) # 打印信息
self.processMsg(msg)
except Exception as e:
self.LOG.error(e)
@@ -242,7 +256,7 @@ class Robot(Job):
while wcf.is_receiving_msg():
try:
msg = wcf.get_msg()
self.LOG.info(msg)
self.LOG.debug(msg)
self.processMsg(msg)
except Empty:
continue # Empty message
@@ -333,6 +347,40 @@ class Robot(Job):
except Exception as e:
self.LOG.error(f"send_group_file_message:{feature.description} error{e}")
# 自动撤回功能块
def revoke_receive_message(self, msg: WxMsg):
try:
group_id = msg.roomid
# 如果该group_id没有记录过初始化一个列表
if group_id not in self.groups:
self.groups[group_id] = []
# 将消息ID添加到对应group_id的消息列表中最多保留10条消息
if len(self.groups[group_id]) >= 10:
self.groups[group_id].pop(0) # 超过10条时移除最早的消息
self.groups[group_id].append(msg.id)
self.LOG.debug(f"Message revoke received for group {group_id}: {msg.id}")
except Exception as e:
self.LOG.error(f"Revoke_receive_message error{e}")
def revoke_messages(self, group_id):
try:
# 如果没有该group_id直接返回
if group_id not in self.groups:
self.LOG.debug(f"No messages found for group {group_id}.")
return
# 按照逆序撤回该组的消息
for msg_id in reversed(self.groups[group_id]):
self.wcf.revoke_msg(msg_id) # 假设调用撤回方法
self.LOG.debug(f"Message {msg_id} recalled from group {group_id}.")
self.groups[group_id].remove(msg_id) # 撤回后移除该消息ID
self.LOG.debug(f"Message {msg_id} removed from group {group_id}.")
except Exception as e:
self.LOG.error(f"revoke_messages error{e}")
# ============================================== 业务内容==========================================================
def newsBaiduReportAuto(self) -> None:

View File

@@ -28,7 +28,7 @@ class Feature(Enum):
AI_CAPABILITY = 4, "群AI能力"
SUMMARY_CAPABILITY = 5, "群总结能力"
PDF_CAPABILITY = 6, "sehuatang PDF能力"
EPIC = 7, "EPIC自动播报"
EPIC = 7, "EPIC自动播报" # 新增的功能
def __new__(cls, value, description):
obj = object.__new__(cls)
@@ -43,7 +43,7 @@ class Feature(Enum):
class GroupBotManager:
"""群机器人管理,支持本地缓存"""
# 本地缓存
# 本地缓存作为类级别静态属性
local_cache = {
"group_permissions": {}, # 用于缓存群组功能权限
"group_list": set() # 用于缓存 group:list
@@ -212,12 +212,16 @@ def simulate_commands():
# 关闭Sehuatang PDF能力
print(GroupBotManager.handle_command(group_id, "6-关闭")) # 使用序号关闭Sehuatang PDF能力
# 启用EPIC自动播报
print(GroupBotManager.handle_command(group_id, "7-启用")) # 使用序号启用EPIC自动播报
# 查看当前群组的功能权限
print(GroupBotManager.get_group_permission(group_id, Feature.ROBOT))
print(GroupBotManager.get_group_permission(group_id, Feature.DAILY_NEWS))
print(GroupBotManager.get_group_permission(group_id, Feature.AI_CAPABILITY))
print(GroupBotManager.get_group_permission(group_id, Feature.SUMMARY_CAPABILITY))
print(GroupBotManager.get_group_permission(group_id, Feature.PDF_CAPABILITY))
print(GroupBotManager.get_group_permission(group_id, Feature.EPIC))
# 查看群组所有功能和状态
permissions = GroupBotManager.list_group_permissions(group_id)
@@ -235,6 +239,9 @@ def simulate_commands():
print("群组清单:")
print(GroupBotManager.handle_command(group_id, "GROUP_LIST"))
# 更新缓存
print(GroupBotManager.handle_command(group_id, "UPDATE"))
# 保存到 Redis
GroupBotManager.save_to_redis()