Files
abot/group_auto/group_member_change.py

107 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import redis
import xml.etree.ElementTree as ET
from wcferry import Wcf
class GroupMemberChange:
def __init__(self, wcf: Wcf):
self.wcf = wcf # 假设 wcf 对象在此类中初始化
self.r = redis.Redis(host='192.168.2.32', port=6379, db=0, decode_responses=True)
# 初始化本地缓存
self.local_membercount = None
self.local_members = {}
def get_current_members(self, group_id):
""" 获取当前群成员信息 """
print(f"Fetching current members for group_id: {group_id}")
members = self.wcf.get_chatroom_members(group_id) # 假设返回的数据格式是 {wxid1: 昵称1, wxid2: 昵称2, ...}
print(f"Current members: {members}")
return members
def get_previous_data_from_redis(self, group_id):
""" 从 Redis 获取上次的数据 """
membercount_key = f"group:group_member_count:{group_id}"
members_key = f"group:group_members:{group_id}"
# 读取 Redis 中的数据
print(f"Fetching previous data from Redis for group_id: {group_id}")
membercount_previous = self.r.get(membercount_key)
members_previous = self.r.hgetall(members_key) # 获取上次的成员信息
print(f"Previous membercount: {membercount_previous}, Previous members: {members_previous}")
return membercount_previous, members_previous
def process_message(self, group_id, xml_data_current):
""" 处理消息并更新 Redis """
print(f"Processing message for group_id: {group_id}")
root_current = ET.fromstring(xml_data_current)
membercount_current = root_current.find('membercount').text
print(f"Current membercount: {membercount_current}")
result = [] # 初始化文案列表
# 如果本地没有缓存数据,则从 Redis 获取
if self.local_membercount is None or not self.local_members:
print("No local data, fetching from Redis")
membercount_previous, members_previous = self.get_previous_data_from_redis(group_id)
# 如果没有上次的数据,说明是第一次处理,直接存储本次数据
if membercount_previous is None or not members_previous:
print("First time processing, saving current data to Redis")
members_current = self.get_current_members(group_id)
self.r.set(f"group:group_member_count:{group_id}", membercount_current)
self.r.hmset(f"group:group_members:{group_id}", members_current) # 存储当前成员信息
# 更新本地缓存
self.local_membercount = membercount_current
self.local_members = members_current
result.append("$NO_CHANGE$")
return "\n".join(result)
else:
# 使用本地缓存的数据进行比较
print("Using local data for comparison")
membercount_previous = self.local_membercount
members_previous = self.local_members
# 比较 membercount 是否发生变化
if membercount_current != membercount_previous:
print(f"Membercount changed: {membercount_previous} -> {membercount_current}")
result.append(f"membercount has changed: {membercount_previous} -> {membercount_current}")
members_current = self.get_current_members(group_id)
# 比较成员,仅使用 wxid 进行比较
members_current_set = set(members_current.keys())
members_previous_set = set(members_previous.keys())
added_members = members_current_set - members_previous_set
removed_members = members_previous_set - members_current_set
# 添加变化成员的文案
for wxid in added_members:
nickname = members_current[wxid]
print(f"Detected member added: {nickname} ({wxid})")
result.append(f"检测到 {nickname}{wxid})加入群聊")
for wxid in removed_members:
nickname = members_previous[wxid]
print(f"Detected member removed: {nickname} ({wxid})")
result.append(f"检测到 {nickname}{wxid})退出群聊")
# 更新本地缓存
print(f"Updating local cache with current membercount and members")
self.local_membercount = membercount_current
self.local_members = members_current
# 更新 Redis 数据
print(f"Updating Redis with current membercount and members")
self.r.set(f"group:group_member_count:{group_id}", membercount_current)
self.r.hmset(f"group:group_members:{group_id}", members_current)
else:
print("No change detected in membercount")
result.append("$NO_CHANGE$")
# 返回拼接后的结果
return "\n".join(result)