From f28ac0166536a2a4b68cac685a41ea667f60f7e9 Mon Sep 17 00:00:00 2001
From: yj <2077506045@qq.com>
Date: 星期三, 03 九月 2025 14:43:03 +0800
Subject: [PATCH] 兼容企业微信

---
 app/services/friend_ignore_service.py |   51 ++++++++++++++++++++++++++++++++-------------------
 1 files changed, 32 insertions(+), 19 deletions(-)

diff --git a/app/services/friend_ignore_service.py b/app/services/friend_ignore_service.py
index 061c771..9752dde 100644
--- a/app/services/friend_ignore_service.py
+++ b/app/services/friend_ignore_service.py
@@ -8,6 +8,7 @@
 from app.services.redis_queue import redis_queue
 from app.models.database import get_db
 from app.models.contact import Contact
+from app.services.silence_service import silence_service
 from config import settings
 
 
@@ -29,9 +30,14 @@
         """
         try:
             with next(get_db()) as db:
-                contact = db.query(Contact).filter(Contact.nick_name == nickname).first()
+                contact = (
+                    db.query(Contact).filter(Contact.nick_name == nickname).first()
+                )
                 if contact:
-                    return contact.wc_id
+                    wc_id = contact.wc_id
+                    if contact.work_wc_id:
+                        wc_id += f",{contact.work_wc_id}"
+                    return wc_id
                 else:
                     logger.warning(f"鏈壘鍒版樀绉颁负 '{nickname}' 鐨勮仈绯讳汉")
                     return None
@@ -71,12 +77,9 @@
                 logger.info("濂藉弸鍒楄〃涓虹┖锛屾棤闇�娣诲姞鍒板拷鐣ュ垪琛�")
                 return True
 
-            # 娓呯┖鐜版湁鐨勫拷鐣ュ垪琛�
-            redis_queue.redis_client.delete(self.ignore_list_key)
-            
-            # 鎵归噺娣诲姞濂藉弸w_id鍒板拷鐣ュ垪琛�
+            # 鎵归噺娣诲姞濂藉弸w_id鍒板拷鐣ュ垪琛紙涓嶆竻绌虹幇鏈夊垪琛級
             redis_queue.redis_client.sadd(self.ignore_list_key, *friends)
-            
+
             logger.info(f"宸插皢 {len(friends)} 涓ソ鍙嬫坊鍔犲埌蹇界暐鍒楄〃")
             return True
 
@@ -84,18 +87,20 @@
             logger.error(f"娣诲姞濂藉弸鍒板拷鐣ュ垪琛ㄥ紓甯�: error={str(e)}")
             return False
 
-    def is_friend_ignored(self, w_id: str) -> bool:
+    def is_friend_ignored(self, w_id: str, group_id: Optional[str] = None) -> bool:
         """
         妫�鏌ユ寚瀹歸_id鏄惁搴旇琚拷鐣�
 
         閫昏緫锛�
         1. 濡傛灉濂藉弸蹇界暐鍔熻兘鏈惎鐢紝杩斿洖False锛堜笉蹇界暐锛�
         2. 濡傛灉w_id鍦ㄧ櫧鍚嶅崟涓紝杩斿洖False锛堜笉蹇界暐锛�
-        3. 濡傛灉w_id鍦ㄥ拷鐣ュ垪琛ㄤ腑锛岃繑鍥濼rue锛堝拷鐣ワ級
-        4. 濡傛灉w_id涓嶅湪蹇界暐鍒楄〃涓紝杩斿洖False锛堜笉蹇界暐锛�
+        3. 濡傛灉w_id鍦ㄥ拷鐣ュ垪琛ㄤ腑锛屼絾鎵�鍦ㄧ兢缁勪负娴嬭瘯缇ょ粍锛岃繑鍥濬alse锛堜笉蹇界暐锛�
+        4. 濡傛灉w_id鍦ㄥ拷鐣ュ垪琛ㄤ腑锛岃繑鍥濼rue锛堝拷鐣ワ級
+        5. 濡傛灉w_id涓嶅湪蹇界暐鍒楄〃涓紝杩斿洖False锛堜笉蹇界暐锛�
 
         Args:
             w_id: 鐢ㄦ埛w_id
+            group_id: 缇ょ粍ID锛堝彲閫夛級锛岀敤浜庢鏌ユ槸鍚︿负娴嬭瘯缇ょ粍
 
         Returns:
             濡傛灉搴旇琚拷鐣ヨ繑鍥濼rue锛屽惁鍒欒繑鍥濬alse
@@ -108,14 +113,24 @@
 
             # 妫�鏌ユ槸鍚﹀湪鐧藉悕鍗曚腑锛堥�氳繃鏄电О锛�
             whitelist_wids = self._get_whitelist_wids()
-            if w_id in whitelist_wids:
+
+            if any(w_id in wids for wids in whitelist_wids):
                 logger.info(f"w_id鍦ㄧ櫧鍚嶅崟涓紝涓嶅拷鐣ユ秷鎭�: w_id={w_id}")
                 return False
 
             # 妫�鏌ユ槸鍚﹀湪蹇界暐鍒楄〃涓�
-            is_in_ignore_list = redis_queue.redis_client.sismember(self.ignore_list_key, w_id)
+            is_in_ignore_list = redis_queue.redis_client.sismember(
+                self.ignore_list_key, w_id
+            )
 
             if is_in_ignore_list:
+                # 濡傛灉鍦ㄥ拷鐣ュ垪琛ㄤ腑锛屾鏌ユ槸鍚﹀湪娴嬭瘯缇ょ粍涓�
+                if group_id and silence_service.is_test_group(group_id):
+                    logger.info(
+                        f"娴嬭瘯缇ょ粍涓殑濂藉弸娑堟伅涓嶈蹇界暐: w_id={w_id}, group_id={group_id}"
+                    )
+                    return False
+
                 logger.info(f"w_id鍦ㄥ拷鐣ュ垪琛ㄤ腑锛屽拷鐣ユ秷鎭�: w_id={w_id}")
 
             return is_in_ignore_list
@@ -225,7 +240,7 @@
                 "in_ignore_list": False,
                 "final_ignored": False,
                 "reason": "",
-                "whitelist_nicknames": settings.friend_ignore_whitelist
+                "whitelist_nicknames": settings.friend_ignore_whitelist,
             }
 
             if not settings.friend_ignore_enabled:
@@ -236,7 +251,9 @@
                 info["reason"] = "鍦ㄧ櫧鍚嶅崟涓紝涓嶄細琚拷鐣�"
                 return info
 
-            info["in_ignore_list"] = redis_queue.redis_client.sismember(self.ignore_list_key, w_id)
+            info["in_ignore_list"] = redis_queue.redis_client.sismember(
+                self.ignore_list_key, w_id
+            )
 
             if info["in_ignore_list"]:
                 info["final_ignored"] = True
@@ -248,11 +265,7 @@
 
         except Exception as e:
             logger.error(f"鑾峰彇蹇界暐鐘舵�佷俊鎭紓甯�: w_id={w_id}, error={str(e)}")
-            return {
-                "w_id": w_id,
-                "error": str(e),
-                "final_ignored": False
-            }
+            return {"w_id": w_id, "error": str(e), "final_ignored": False}
 
 
 # 鍏ㄥ眬濂藉弸蹇界暐鏈嶅姟瀹炰緥

--
Gitblit v1.9.1