AutoPercenty3/titleManager/sp_ForbiddenM.py

80 lines
3.6 KiB
Python

from typing import List, Dict
import logging
class SupabaseForbiddenWordManager:
def __init__(self, logger, supabase_manager, user_id: str):
self.logger = logger
self.supabase_manager = supabase_manager
self.user_id = user_id
# 최초 로딩 후 캐시 저장
self._forbidden_words_cache = self._load_forbidden_words_from_supabase()
def _load_forbidden_words_from_supabase(self) -> Dict[str, Dict]:
"""
Supabase의 user_banned_words 테이블에서 사용자 금지어 목록을 조회하여,
{금지어: {등급, 키프리스 데이터}} 형태의 딕셔너리로 반환합니다.
"""
words = self.supabase_manager.fetch_banned_words(self.user_id)
# 딕셔너리 컴프리헨션 사용
forbidden_dict = {
record.get("banned_word"): {
"grade": record.get("grade"),
"kipris_data": record.get("kipris_data", {})
}
for record in words
if record.get("banned_word") and record.get("grade")
}
# self.logger.log(f"Loaded forbidden words: {forbidden_dict}", level=logging.DEBUG)
return forbidden_dict
def refresh_forbidden_words(self) -> None:
"""
Supabase에서 금지어 목록을 다시 불러와 캐시를 갱신합니다.
사용자가 금지어 관리 테이블에서 작업한 후, 이 메서드를 호출하면 최신
금지어 데이터를 반영할 수 있습니다.
"""
self._forbidden_words_cache = self._load_forbidden_words_from_supabase()
self.logger.log("Forbidden words cache refreshed.", level=logging.DEBUG)
def is_word_forbidden(self, word: str) -> bool:
"""
단어가 금지어 목록에 존재하며, 등급이 "비허용"이면 True를 반환합니다.
(해당 단어는 최종 상품명에서 제외되어야 합니다.)
"""
word_data = self._forbidden_words_cache.get(word)
if word_data and word_data.get("grade") == "비허용":
self.logger.log(f"Word '{word}' is forbidden with grade 비허용.", level=logging.DEBUG)
return True
return False
def check_forbidden_grade(self, words: List[str]) -> bool:
"""
전달받은 단어 리스트 중 하나라도 등급이 "금지"인 단어가 있으면 True를 반환합니다.
(최종 상품명에 [금지상품] 접두어를 붙이는 용도)
"""
for word in words:
word_data = self._forbidden_words_cache.get(word)
if word_data and word_data.get("grade") == "금지":
self.logger.log(f"Word '{word}' is forbidden with grade 금지.", level=logging.DEBUG)
return True
return False
def get_forbidden_grade_words(self, words: List[str]) -> List[str]:
"""
전달받은 단어 리스트 중에서 등급이 "금지"인 단어들을 리스트로 반환합니다.
"""
forbidden = []
for word in words:
word_data = self._forbidden_words_cache.get(word)
if word_data and word_data.get("grade") == "금지":
self.logger.log(f"Word '{word}' is forbidden with grade 금지.", level=logging.DEBUG)
forbidden.append(word)
return forbidden
def get_kipris_data(self, word: str) -> Dict:
"""
단어의 키프리스 검증 데이터를 반환합니다.
"""
word_data = self._forbidden_words_cache.get(word)
return word_data.get("kipris_data", {}) if word_data else {}