From 307236190c98c13395b114df990eec50a9160251 Mon Sep 17 00:00:00 2001 From: yj <2077506045@qq.com> Date: 星期三, 27 八月 2025 16:59:48 +0800 Subject: [PATCH] 更新 --- app/services/friend_ignore_service.py | 40 ++++++++++++-------- app/api/friend_ignore.py | 64 ++++++++++++++----------------- app/models/contact.py | 16 +++++-- 3 files changed, 64 insertions(+), 56 deletions(-) diff --git a/app/api/friend_ignore.py b/app/api/friend_ignore.py index 4f8c68a..dc7043c 100644 --- a/app/api/friend_ignore.py +++ b/app/api/friend_ignore.py @@ -17,16 +17,19 @@ class AddFriendsRequest(BaseModel): """娣诲姞濂藉弸鍒板拷鐣ュ垪琛ㄨ姹傛ā鍨�""" + friends: List[str] class RemoveFriendRequest(BaseModel): """浠庡拷鐣ュ垪琛ㄧЩ闄ゅソ鍙嬭姹傛ā鍨�""" + w_id: str class IgnoreListResponse(BaseModel): """蹇界暐鍒楄〃鍝嶅簲妯″瀷""" + success: bool message: str data: Set[str] = None @@ -37,19 +40,16 @@ async def get_ignore_list(): """ 鑾峰彇褰撳墠鐨勫ソ鍙嬪拷鐣ュ垪琛� - + Returns: 蹇界暐鍒楄〃鍝嶅簲 """ try: ignore_list = friend_ignore_service.get_ignore_list() count = friend_ignore_service.get_ignore_list_count() - + return IgnoreListResponse( - success=True, - message="鑾峰彇蹇界暐鍒楄〃鎴愬姛", - data=ignore_list, - count=count + success=True, message="鑾峰彇蹇界暐鍒楄〃鎴愬姛", data=ignore_list, count=count ) except Exception as e: logger.error(f"鑾峰彇蹇界暐鍒楄〃澶辫触: {str(e)}") @@ -60,26 +60,26 @@ async def add_friends_to_ignore_list(request: AddFriendsRequest): """ 娣诲姞濂藉弸鍒板拷鐣ュ垪琛� - + Args: request: 娣诲姞濂藉弸璇锋眰 - + Returns: 鎿嶄綔缁撴灉 """ try: success = friend_ignore_service.add_friends_to_ignore_list(request.friends) - + if success: count = friend_ignore_service.get_ignore_list_count() return IgnoreListResponse( success=True, message=f"鎴愬姛娣诲姞 {len(request.friends)} 涓ソ鍙嬪埌蹇界暐鍒楄〃", - count=count + count=count, ) else: raise HTTPException(status_code=400, detail="娣诲姞濂藉弸鍒板拷鐣ュ垪琛ㄥけ璐�") - + except Exception as e: logger.error(f"娣诲姞濂藉弸鍒板拷鐣ュ垪琛ㄥけ璐�: {str(e)}") raise HTTPException(status_code=500, detail=f"娣诲姞濂藉弸鍒板拷鐣ュ垪琛ㄥけ璐�: {str(e)}") @@ -89,26 +89,26 @@ async def remove_friend_from_ignore_list(request: RemoveFriendRequest): """ 浠庡拷鐣ュ垪琛ㄤ腑绉婚櫎濂藉弸 - + Args: request: 绉婚櫎濂藉弸璇锋眰 - + Returns: 鎿嶄綔缁撴灉 """ try: success = friend_ignore_service.remove_friend_from_ignore_list(request.w_id) - + if success: count = friend_ignore_service.get_ignore_list_count() return IgnoreListResponse( success=True, message=f"鎴愬姛浠庡拷鐣ュ垪琛ㄤ腑绉婚櫎濂藉弸: {request.w_id}", - count=count + count=count, ) else: raise HTTPException(status_code=400, detail="浠庡拷鐣ュ垪琛ㄧЩ闄ゅソ鍙嬪け璐�") - + except Exception as e: logger.error(f"浠庡拷鐣ュ垪琛ㄧЩ闄ゅソ鍙嬪け璐�: {str(e)}") raise HTTPException(status_code=500, detail=f"浠庡拷鐣ュ垪琛ㄧЩ闄ゅソ鍙嬪け璐�: {str(e)}") @@ -118,22 +118,18 @@ async def clear_ignore_list(): """ 娓呯┖蹇界暐鍒楄〃 - + Returns: 鎿嶄綔缁撴灉 """ try: success = friend_ignore_service.clear_ignore_list() - + if success: - return IgnoreListResponse( - success=True, - message="鎴愬姛娓呯┖蹇界暐鍒楄〃", - count=0 - ) + return IgnoreListResponse(success=True, message="鎴愬姛娓呯┖蹇界暐鍒楄〃", count=0) else: raise HTTPException(status_code=400, detail="娓呯┖蹇界暐鍒楄〃澶辫触") - + except Exception as e: logger.error(f"娓呯┖蹇界暐鍒楄〃澶辫触: {str(e)}") raise HTTPException(status_code=500, detail=f"娓呯┖蹇界暐鍒楄〃澶辫触: {str(e)}") @@ -143,26 +139,24 @@ async def sync_contacts_and_rebuild_ignore_list(): """ 閲嶆柊鍚屾鑱旂郴浜哄苟閲嶅缓蹇界暐鍒楄〃 - + Returns: 鎿嶄綔缁撴灉 """ try: if not settings.ecloud_w_id: raise HTTPException(status_code=400, detail="鏈厤缃甧cloud_w_id") - + success = contact_sync_service.sync_contacts_on_startup(settings.ecloud_w_id) - + if success: count = friend_ignore_service.get_ignore_list_count() return IgnoreListResponse( - success=True, - message="鑱旂郴浜哄悓姝ュ畬鎴愶紝蹇界暐鍒楄〃宸查噸寤�", - count=count + success=True, message="鑱旂郴浜哄悓姝ュ畬鎴愶紝蹇界暐鍒楄〃宸查噸寤�", count=count ) else: raise HTTPException(status_code=400, detail="鑱旂郴浜哄悓姝ュけ璐�") - + except Exception as e: logger.error(f"鑱旂郴浜哄悓姝ュけ璐�: {str(e)}") raise HTTPException(status_code=500, detail=f"鑱旂郴浜哄悓姝ュけ璐�: {str(e)}") @@ -185,7 +179,7 @@ return { "success": True, "data": status_info, - "message": f"w_id {w_id} 鐘舵�佹鏌ュ畬鎴�" + "message": f"w_id {w_id} 鐘舵�佹鏌ュ畬鎴�", } except Exception as e: @@ -208,7 +202,7 @@ "success": True, "data": whitelist, "count": len(whitelist), - "message": "鑾峰彇鐧藉悕鍗曟垚鍔�" + "message": "鑾峰彇鐧藉悕鍗曟垚鍔�", } except Exception as e: @@ -231,9 +225,9 @@ "ignore_enabled": settings.friend_ignore_enabled, "whitelist": settings.friend_ignore_whitelist, "whitelist_count": len(settings.friend_ignore_whitelist), - "ignore_list_count": friend_ignore_service.get_ignore_list_count() + "ignore_list_count": friend_ignore_service.get_ignore_list_count(), }, - "message": "鑾峰彇閰嶇疆淇℃伅鎴愬姛" + "message": "鑾峰彇閰嶇疆淇℃伅鎴愬姛", } except Exception as e: diff --git a/app/models/contact.py b/app/models/contact.py index b6b3491..0eb3c0d 100644 --- a/app/models/contact.py +++ b/app/models/contact.py @@ -1,6 +1,7 @@ """ 鑱旂郴浜轰俊鎭ā鍨� """ + from sqlalchemy import Column, String, Integer, DateTime, Text from sqlalchemy.sql import func from .database import Base @@ -8,10 +9,13 @@ class Contact(Base): """鑱旂郴浜轰俊鎭〃""" + __tablename__ = "contacts" - + id = Column(Integer, primary_key=True, index=True, autoincrement=True) - wc_id = Column(String(100), unique=True, index=True, nullable=False, comment="寰俊ID/缇D") + wc_id = Column( + String(100), unique=True, index=True, nullable=False, comment="寰俊ID/缇D" + ) user_name = Column(String(100), nullable=True, comment="寰俊鐢ㄦ埛鍚�") nick_name = Column(String(100), nullable=True, comment="鏄电О") remark = Column(String(100), nullable=True, comment="澶囨敞") @@ -23,9 +27,11 @@ small_head = Column(String(500), nullable=True, comment="灏忓ご鍍廢RL") label_list = Column(Text, nullable=True, comment="鏍囩鍒楄〃") v1 = Column(String(200), nullable=True, comment="v1鏁版嵁") - + work_wc_id = Column(String(100), nullable=True, comment="浼佷笟寰俊id") created_at = Column(DateTime, default=func.now(), comment="鍒涘缓鏃堕棿") - updated_at = Column(DateTime, default=func.now(), onupdate=func.now(), comment="鏇存柊鏃堕棿") - + updated_at = Column( + DateTime, default=func.now(), onupdate=func.now(), comment="鏇存柊鏃堕棿" + ) + def __repr__(self): return f"<Contact(wc_id='{self.wc_id}', nick_name='{self.nick_name}')>" diff --git a/app/services/friend_ignore_service.py b/app/services/friend_ignore_service.py index 2b0123f..2a8f71d 100644 --- a/app/services/friend_ignore_service.py +++ b/app/services/friend_ignore_service.py @@ -30,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 @@ -74,10 +79,10 @@ # 娓呯┖鐜版湁鐨勫拷鐣ュ垪琛� redis_queue.redis_client.delete(self.ignore_list_key) - + # 鎵归噺娣诲姞濂藉弸w_id鍒板拷鐣ュ垪琛� redis_queue.redis_client.sadd(self.ignore_list_key, *friends) - + logger.info(f"宸插皢 {len(friends)} 涓ソ鍙嬫坊鍔犲埌蹇界暐鍒楄〃") return True @@ -111,21 +116,26 @@ # 妫�鏌ユ槸鍚﹀湪鐧藉悕鍗曚腑锛堥�氳繃鏄电О锛� 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}") + 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 except Exception as e: @@ -233,7 +243,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: @@ -244,7 +254,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 @@ -256,11 +268,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