feature:加入了群成员变化监控功能,提醒群成员,有人退出了群聊
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
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)
|
||||
|
||||
|
||||
def main():
|
||||
group_id = "room123"
|
||||
xml_data_current = """
|
||||
<msgsource>
|
||||
<pua>1</pua>
|
||||
<eggIncluded>1</eggIncluded>
|
||||
<silence>1</silence>
|
||||
<membercount>118</membercount>
|
||||
<members>
|
||||
<member>
|
||||
<wxid>wxid1</wxid>
|
||||
<nickname>昵称1</nickname>
|
||||
</member>
|
||||
<member>
|
||||
<wxid>wxid2</wxid>
|
||||
<nickname>昵称2</nickname>
|
||||
</member>
|
||||
<member>
|
||||
<wxid>wxid3</wxid>
|
||||
<nickname>昵称3</nickname>
|
||||
</member>
|
||||
</members>
|
||||
<signature>V1_5V25+oDw|v1_5V25+oDw</signature>
|
||||
<tmp_node>
|
||||
<publisher-id />
|
||||
</tmp_node>
|
||||
<sec_msg_node>
|
||||
<alnode>
|
||||
<fr>1</fr>
|
||||
</alnode>
|
||||
</sec_msg_node>
|
||||
</msgsource>
|
||||
"""
|
||||
|
||||
# 创建 YourClass 实例
|
||||
your_instance = YourClass()
|
||||
|
||||
# 调用 process_message 方法来处理当前数据并获取变化文案
|
||||
result = your_instance.process_message(group_id, xml_data_current)
|
||||
|
||||
# 判断是否没有变化
|
||||
if "NO_CHANGE" in result:
|
||||
print("没有变化,跳过处理")
|
||||
else:
|
||||
print("检测到变化,进行相关处理")
|
||||
print(result) # 输出具体的变化文案
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user