
    BiH                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZmZm	Z	 d dl
mZ e G d d                      Z G d d          Ze G d	 d
                      Z G d d          ZdadefdZdede	eef         fdZdS )    N)datetime)ListDictSetTuple)	dataclassc                   @    e Zd ZU dZeed<   eed<   eed<   dZeed<   dS )SmalltalkPatternu'   스몰토크 패턴 데이터 클래스patterncategorydescriptionTenabledN__name__
__module____qualname____doc__str__annotations__r   bool     U/var/www/html/web/mlink/mlink_AI_Server/mlink-backend/src/routes/smalltalk_manager.pyr
   r
   	   sF         11LLLMMMGTr   r
   c            	           e Zd ZdZddefdZd Zd Zd Zdd	ed
edede	fdZ
d	efdZd	ede	fdZd
edee         fdZdee         fdZdedee	ef         fdZdefdZdS )SmalltalkPatternManageru=   스몰토크 패턴을 효과적으로 관리하는 클래스Nconfig_filec                 v    g | _         |pd| _        |                                  |                                  d S )Nz ./config/smalltalk_patterns.jsonpatternsr   _load_default_patterns_load_from_configselfr   s     r   __init__z SmalltalkPatternManager.__init__   sA    02&L*L##%%%     r   c                    g t          dddd          t          dddd          t          dddd          t          d	dd
d          t          dddd          t          dddd          t          dddd          t          dddd          t          dddd          t          dddd          t          dddd          t          dddd          t          dddd          t          dddd          t          ddd d          t          d!dd"d          t          d#dd$d          t          d%dd&d          t          d'd(d)d          t          d*d(d+d          t          d,d(d-d          t          d.d/d0d          t          d1d/d2d          t          d3d/d4d          t          d5d/d4d          t          d6d7d8d          t          d9d7d:d          t          d;d7d<d          t          d=d7d>d          t          d?d@dAd          t          dBd@dCd          t          dDd@dEd          t          dFd@dGd          t          ddHdId          t          dJdHdId          t          dKdHdLd          }| j                            |           t          j        dMt          |           dN           dOS )Pu!   기본 스몰토크 패턴 로드u   ^감사합니다.?$thanksu   감사 인사Tu   ^고맙습니다.?$u   고마움 표현z^thank(s| you)?$u   영어 감사u   ^고마워.?$u   친근한 감사u   ^감사해.?$u   감사 표현u   ^네$	agreementu   긍정 응답u   ^넵$u   긍정 응답 (줄임말)u   ^예$u   ^ㅇㅋ$u   긍정 응답 (이모티콘)z^ok$u   영어 긍정z^okay$u   ^알겠습니다.?$u   이해 표시u   ^알겠어.?$u   이해 표시 (친근)u   ^안녕하세요.?$greetingu   기본 인사u
   ^안녕.?$u   친근한 인사z^hello$u   영어 인사z^hi$u   영어 인사 (간단)u
   ^하이.?$u   영어 인사 (한글)z^bye$farewellu   영어 작별u   ^안녕히.?$u   작별 인사u   ^다음에.?$u   다음 만남 언급u
   ^수고.*$encouragementu   수고 표현u
   ^고생.*$u   고생 표현u   ^화이팅.?$u   응원u   ^파이팅.?$u   ^아니요.?$disagreementu   부정 응답u
   ^아니.?$u   부정 응답 (친근)z^no$u   영어 부정u   ^아닙니다.?$u   정중한 부정u   ^죄송합니다.?$apologyu   정중한 사과u   ^미안합니다.?$u   사과u
   ^미안.?$u   친근한 사과z^sorry$u   영어 사과confirmationu   이해 확인u   ^이해했습니다.?$u   ^네, 알겠습니다.?$u   긍정적 이해u   기본 스몰토크 패턴    개 로드 완료N)r
   r   extendlogginginfolenr#   default_patternss     r   r    z.SmalltalkPatternManager._load_default_patterns   s   4
3XPTUU4
 3X?QSWXX4
 0(OTRR	4

 -x9KTRR4
 -x$OO4
 X{OTJJ4
 X{4OQUVV4
 X{OTJJ4
 [+7UW[\\4
 Wk?DII4
 Y_dKK4
 3[/SWXX4
  -{<TVZ[[!4
& 3ZRVWW'4
( ]J8JDQQ)4
* Z_dKK+4
, Wj2JDQQ-4
. ]J8PRVWW/4
4 Xz?DII54
6 -z?DQQ74
8 -z;QSWXX94
> ]O_dSS?4
@ ]O_dSSA4
B -$OOC4
D -$OOE4
J -~PTUUK4
L ]N<TVZ[[M4
N WnotLLO4
P 0.BTVZ[[Q4
V 3Y@RTXYYW4
X 3Y$OOY4
Z ]I7I4PP[4
\ ZOTJJ]4
b 3^_VZ[[c4
d 6Y]^^e4
f 8.J\^bccg4
l 	-...[37G3H3H[[[\\\\\r   c                 J   t           j                            | j                  s|                                  dS 	 t          | j        dd          5 }t          j        |          }ddd           n# 1 swxY w Y   d | j        D             }|	                    dg           D ]M}t          d	i |}|j        |vr6| j                            |           t          j        d|j                    NdS # t           $ r"}t          j        d|            Y d}~dS d}~ww xY w)
!   설정 파일에서 패턴 로드Nrutf-8encodingc                     i | ]
}|j         |S r   r   .0ps     r   
<dictcomp>z=SmalltalkPatternManager._load_from_config.<locals>.<dictcomp>_        E E E!A E E Er   r   u#   설정 파일에서 패턴 로드: u   설정 파일 로드 실패: r   )ospathexistsr   _save_to_configopenjsonloadr   getr
   r   appendr0   r1   r   	Exceptionwarningr#   fconfig_dataexisting_patternspattern_datar   es          r   r!   z)SmalltalkPatternManager._load_from_configU   s   w~~d.// 	  """F	Ad&g>>> +!"ill+ + + + + + + + + + + + + + + !F Et} E E E +
B ? ? ^ ^*::\::?*;;;M((111L!\wGZ!\!\]]]	^ ^  	A 	A 	AO?A??@@@@@@@@@	A<   C6 A4(C6 4A88C6 ;A8<A8C6 6
D" DD"c                 
   	 t          j        t           j                            | j                  d           d | j        D             t          j                                                    d}t          | j        dd          5 }t          j        ||dd	
           ddd           n# 1 swxY w Y   t          j        d| j                    dS # t          $ r"}t          j        d|            Y d}~dS d}~ww xY w)(   현재 패턴을 설정 파일에 저장Texist_okc                 D    g | ]}|j         |j        |j        |j        d S )r   r   r   r   rY   r=   s     r   
<listcomp>z;SmalltalkPatternManager._save_to_config.<locals>.<listcomp>p   sE         $%9$%J'(}#$9	   r   r   last_updatedwr8   r9   F   ensure_asciiindentNu*   스몰토크 패턴 설정 저장 완료: u   설정 파일 저장 실패: rB   makedirsrC   dirnamer   r   r   now	isoformatrF   rG   dumpr0   r1   rK   errorr#   rO   rN   rR   s       r   rE   z'SmalltalkPatternManager._save_to_configj   ss   	?K(899DIIII  "]   !) 8 8 : : K d&g>>> H!	+quQGGGGH H H H H H H H H H H H H H H LXdFVXXYYYYY 	? 	? 	?M=!==>>>>>>>>>	?<   BC B-!C -B11C 4B15C 
D C==DTr   r   r   r   c                     t          ||||          }| j                            |           |                                  t	          j        d| d| d           dS )u   새 패턴 추가u   새 패턴 추가:  ()N)r
   r   rJ   rE   r0   r1   )r#   r   r   r   r   new_patterns         r   add_patternz#SmalltalkPatternManager.add_pattern   sg    &w+wOO[)))D;DD'DDDEEEEEr   c                     fd| j         D             | _         |                                  t          j        d            dS )u   패턴 제거c                 *    g | ]}|j         k    |S r   r<   )r>   r?   r   s     r   rZ   z:SmalltalkPatternManager.remove_pattern.<locals>.<listcomp>   s%    JJJqQY'5I5I5I5I5Ir   u   패턴 제거: N)r   rE   r0   r1   )r#   r   s    `r   remove_patternz&SmalltalkPatternManager.remove_pattern   sQ    JJJJDMJJJ0w0011111r   c                     | j         D ]I}|j        |k    r<||_        |                                  t	          j        d|rdnd d|             dS JdS )u   패턴 활성화/비활성화u   패턴 u	   활성화u   비활성화z: TF)r   r   r   rE   r0   r1   )r#   r   r   r?   s       r   toggle_patternz&SmalltalkPatternManager.toggle_pattern   sw     	 	AyG###	$$&&&^g'Q{{>^^U\^^___tt	 $
 ur   returnc                 *    fd| j         D             S )u   카테고리별 패턴 조회c                 8    g | ]}|j         k    |j        |S r   )r   r   )r>   r?   r   s     r   rZ   zDSmalltalkPatternManager.get_patterns_by_category.<locals>.<listcomp>   s,    QQQaAJ(,B,Bqy,B,B,B,Br   )r   )r#   r   s    `r   get_patterns_by_categoryz0SmalltalkPatternManager.get_patterns_by_category   s    QQQQ4=QQQQr   c                 >    t          d | j        D                       S )u   모든 카테고리 조회c              3   $   K   | ]}|j         V  d S N)r   r=   s     r   	<genexpr>z=SmalltalkPatternManager.get_all_categories.<locals>.<genexpr>   s$      55!1:555555r   )setr   )r#   s    r   get_all_categoriesz*SmalltalkPatternManager.get_all_categories   s!    55t}555555r   
user_queryc           
         |                                                                 }| j        D ]}|j        s
	 t	          j        |j        |          r3t          j        d| d|j	         d|j
         d           d|j	        fc S Y# t          j        $ r)}t          j        d|j         d|            Y d}~d}~ww xY wd	S )
u2   스몰토크 여부 판별 및 카테고리 반환u   스몰토크 감지: '' -> rl   rm   T   잘못된 정규식 패턴:  - N)F )striplowerr   r   rematchr   r0   debugr   r   rh   rL   r#   r   queryr   rR   s        r   is_smalltalkz$SmalltalkPatternManager.is_smalltalk   s      ""((**} 
	 
	G? 8GOU33 2M"v:"v"vGL\"v"v`g`s"v"v"vwww!111112 8    Vw V VST V VWWW ys   A
BB?B::B?c                 8   t          | j                  }t          d | j        D                       }||z
  }i }| j        D ]/}|j        r&|                    |j        d          dz   ||j        <   0||||t          j                                                    dS )u   패턴 통계 정보 반환c                      g | ]}|j         	|S r   )r   r=   s     r   rZ   z:SmalltalkPatternManager.get_statistics.<locals>.<listcomp>   s    FFFaAIFFFFr   r      )total_patternsenabled_patternsdisabled_patterns
categoriesr\   )r2   r   r   rI   r   r   re   rf   )r#   r   r   r   category_statsr   s         r   get_statisticsz&SmalltalkPatternManager.get_statistics   s    T]++FF4=FFFGG*-==} 	_ 	_G _3A3E3EgFVXY3Z3Z]^3^w/0 - 0!2($LNN4466
 
 	
r   r{   )T)r   r   r   r   r   r$   r    r!   rE   r   ro   rr   rt   r   r
   rx   r   r~   r   r   r   r   r   r   r   r   r      s}       GG! !C ! ! ! !9] 9] 9]vA A A*? ? ?4F F3 F# FC FRV F F F F2c 2 2 2 2c D    R R>N9O R R R R6CH 6 6 6 6s uT3Y/?    $
 
 
 
 
 
 
r   r   c                   J    e Zd ZU dZeed<   eed<   eed<   eed<   dZeed<   dS )	InappropriatePatternu.   부적절한 질문 패턴 데이터 클래스r   r   r   severityTr   Nr   r   r   r   r   r      sO         88LLLMMMMMMGTr   r   c                   h    e Zd ZdZddefdZd Zd Zd Zded	e	e
eef         fd
Zdeded	efdZdS )InappropriateQuestionFilteru0   부적절한 질문을 필터링하는 클래스Nr   c                 v    g | _         |pd| _        |                                  |                                  d S )Nz$./config/inappropriate_patterns.jsonr   r"   s     r   r$   z$InappropriateQuestionFilter.__init__   sA    46&P*P##%%%     r   c           $         t          ddddd          t          ddddd          t          d	dd
dd          t          ddddd          t          ddddd          t          ddddd          t          ddddd          t          ddddd          t          ddddd          t          ddddd          t          ddddd          t          ddddd          t          d dd!dd          t          d"dd#dd          t          d$dd%dd          t          d&d'd(dd          t          d)d'd*dd          t          d+d'd,dd          t          d-d.d/dd          t          d0d.d1dd          t          d2d.d3dd          t          d4d5d6dd          t          d7d5d8dd          t          d9d5d:dd          t          d;d5d<dd          t          d=d>d?d@d          t          dAd>dBd@d          t          dCd>dDd@d          t          dEd>dFd@d          t          dGd>dHd@d          g}| j                            |           t          j        dIt          |           dJ           dKS )Lu(   기본 부적절한 질문 패턴 로드u   .*미국.*잡아가.*	politicalu!   미국 관련 부적절한 표현highTu
   .*정치.*u   정치 관련 질문mediumu   .*대통령.*u   대통령 관련 질문u   .*정부.*비판.*u   정부 비판u
   .*선거.*u   선거 관련u   .*왜.*잡아가.*
historicalu   역사 왜곡 표현u   .*일본.*침략.*u   일본 관련 민감 표현u   .*전쟁.*범죄.*u   전쟁 범죄 관련u   .*개인정보.*privacyu   개인정보 관련u   .*사생활.*u   사생활 관련u   .*주민등록번호.*u   주민등록번호u
   .*폭력.*violenceu   폭력 관련u
   .*살인.*u   살인 관련u
   .*자살.*u   자살 관련u
   .*테러.*u   테러 관련u   .*성.*adultu
   성 관련u
   .*야동.*u   야동 관련u   .*포르노.*u   포르노 관련u   .*종교.*비판.*discriminationu   종교 비판u   .*민족.*차별.*u   민족 차별u   .*인종.*차별.*u   인종 차별u
   .*해킹.*illegalu   해킹 관련u
   .*불법.*u   불법 관련u
   .*도박.*u   도박 관련u
   .*마약.*u   마약 관련u
   .*게임.*	unrelatedu   게임 관련lowu   .*연예인.*u   연예인 관련u   .*스포츠.*u   스포츠 관련u
   .*요리.*u   요리 관련u
   .*여행.*u   여행 관련u"   기본 부적절한 질문 패턴 r.   N)r   r   r/   r0   r1   r2   r3   s     r   r    z2InappropriateQuestionFilter._load_default_patterns   s    !!9;Hkmsuyzz =SU]_cdd !1;@Y[ceijj !6_V\^bcc _hX\]] !!6F\^dfjkk !6Fcemostt !6F\^dfjkk !!4iAVX^`dee !19>PRZ\`aa !:IG[]ceijj !
OVUYZZ 
OVUYZZ 
OVUYZZ 
OVUYZZ !WlFDQQ &RVWW !17<NPVX\]] !!68H/[ceijj !68H/[acghh !68H/[acghh !	?FTXYY 	?FTXYY 	?HVZ[[ 	?FTXYY !_eUYZZ !1;@RTY[_`` !1;@RTY[_`` _eUYZZ _eUYZZ[.
` 	-...b#>N:O:Obbbcccccr   c                 J   t           j                            | j                  s|                                  dS 	 t          | j        dd          5 }t          j        |          }ddd           n# 1 swxY w Y   d | j        D             }|	                    dg           D ]M}t          d	i |}|j        |vr6| j                            |           t          j        d|j                    NdS # t           $ r"}t          j        d|            Y d}~dS d}~ww xY w)
r6   Nr7   r8   r9   c                     i | ]
}|j         |S r   r<   r=   s     r   r@   zAInappropriateQuestionFilter._load_from_config.<locals>.<dictcomp>  rA   r   r   u0   설정 파일에서 부적절한 패턴 로드: u1   부적절한 패턴 설정 파일 로드 실패: r   )rB   rC   rD   r   rE   rF   rG   rH   r   rI   r   r   rJ   r0   r1   r   rK   rL   rM   s          r   r!   z-InappropriateQuestionFilter._load_from_config  s   w~~d.// 	  """F	Ud&g>>> +!"ill+ + + + + + + + + + + + + + + !F Et} E E E +
B ? ? k k.>>>>?*;;;M((111L!iT[Tg!i!ijjj	k k  	U 	U 	UOSPQSSTTTTTTTTT	UrS   c                 
   	 t          j        t           j                            | j                  d           d | j        D             t          j                                                    d}t          | j        dd          5 }t          j        ||dd	
           ddd           n# 1 swxY w Y   t          j        d| j                    dS # t          $ r"}t          j        d|            Y d}~dS d}~ww xY w)rU   TrV   c                 P    g | ]#}|j         |j        |j        |j        |j        d $S )r   r   r   r   r   r   r=   s     r   rZ   z?InappropriateQuestionFilter._save_to_config.<locals>.<listcomp>-  sJ     	 	 	  $%9$%J'(}$%J#$9 	 	 	r   r[   r]   r8   r9   Fr^   r_   Nu1   부적절한 질문 패턴 설정 저장 완료: u1   부적절한 패턴 설정 파일 저장 실패: rb   ri   s       r   rE   z+InappropriateQuestionFilter._save_to_config'  sx   	SK(899DIIII	 	 "]	 	 	 !) 8 8 : : K d&g>>> H!	+quQGGGGH H H H H H H H H H H H H H H L_TM]__````` 	S 	S 	SMQaQQRRRRRRRRR	Srj   r   ru   c           
         |                                                                 }| j        D ]}|j        s
	 t	          j        |j        |          r9t          j        d| d|j	         d|j
         d           d|j	        |j
        fc S _# t          j        $ r)}t          j        d|j         d|            Y d}~d}~ww xY wd	S )
uD   부적절한 질문 여부 판별 및 카테고리, 심각도 반환u   부적절한 질문 감지: 'r   rl   rm   Tr   r   N)Fr   r   )r   r   r   r   r   searchr   r0   rL   r   r   rh   r   s        r   is_inappropriatez,InappropriateQuestionFilter.is_inappropriateB  s     ""((**} 
	 
	G? 9W_e44 DO$|J$|$|U\Ue$|$|ipiy$|$|$|}}}!173CCCCCD 8    Vw V VST V VWWW }s   ABCC  Cr   r   c           	      ^    ddddddddd	}|                     |d
          }|dk    r|dz   S |S )u5   부적절한 질문에 대한 적절한 응답 생성u   죄송합니다. 정치적 주제에 대해서는 답변을 드리기 어렵습니다. MLink 서비스와 관련된 질문을 해주시면 도움을 드릴 수 있습니다.u   죄송합니다. 역사적 주제에 대해서는 정확한 답변을 드리기 어렵습니다. MLink 사용법이나 기능에 대해 질문해주시면 도움을 드릴 수 있습니다.u   개인정보 보호를 위해 해당 주제에 대해서는 답변을 드리지 않습니다. MLink 서비스 관련 질문을 해주세요.u   폭력이나 위험한 내용에 대해서는 답변을 드리지 않습니다. MLink 사용에 도움이 되는 질문을 해주세요.uz   부적절한 내용에 대해서는 답변을 드리지 않습니다. MLink 서비스와 관련된 질문을 해주세요.u   차별이나 편견을 조장하는 내용에 대해서는 답변을 드리지 않습니다. MLink 사용법에 대해 질문해주세요.u   불법적인 행위에 대해서는 답변을 드리지 않습니다. MLink 서비스 이용에 도움이 되는 질문을 해주세요.u   죄송합니다. MLink 서비스와 관련 없는 주제에 대해서는 답변을 드리기 어렵습니다. MLink 사용법이나 기능에 대해 질문해주시면 도움을 드릴 수 있습니다.)r   r   r   r   r   r   r   r   u   죄송합니다. 해당 주제에 대해서는 답변을 드리기 어렵습니다. MLink 서비스와 관련된 질문을 해주세요.r   uO    더 이상 유사한 질문을 하시면 대화를 종료할 수 있습니다.)rI   )r#   r   r   	responsesbase_responses        r   get_appropriate_responsez4InappropriateQuestionFilter.get_appropriate_responseT  sz     I Z f c R k b f	
 	
	 "h  1{  |  |v #tttr   r{   )r   r   r   r   r   r$   r    r!   rE   r   r   r   r   r   r   r   r   r      s        ::! !C ! ! ! !3d 3d 3djU U U*S S S63 5sC3H    $        r   r   ru   c                  :    t           t                      a t           S r{   )_smalltalk_instancer   r   r   r   _get_smalltalk_instancer   m  s    "577r   r   c                 D    t                                          |           S )u*   스몰토크 여부 판별 (편의 함수))r   r   )r   s    r   is_smalltalk_questionr   s  s    "$$11*===r   )rB   rG   r   r0   r   typingr   r   r   r   dataclassesr   r
   r   r   r   r   r   r   r   r   r   r   r   <module>r      s   				  				        ) ) ) ) ) ) ) ) ) ) ) ) ! ! ! ! ! !
       u
 u
 u
 u
 u
 u
 u
 u
t        R R R R R R R Rn  !8    >c >eD#I.> > > > > > >r   