
    iH                         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y)    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<   y)SmalltalkPatternu'   스몰토크 패턴 데이터 클래스patterncategorydescriptionTenabledN__name__
__module____qualname____doc__str__annotations__r   bool     Q/home/kdj-ubuntu1/mlink_AI_Server/mlink-backend/./src/routes/smalltalk_manager.pyr
   r
   	   s    1LM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y)SmalltalkPatternManageru=   스몰토크 패턴을 효과적으로 관리하는 클래스Nconfig_filec                 h    g | _         |xs d| _        | j                          | j                          y )Nz ./config/smalltalk_patterns.jsonpatternsr   _load_default_patterns_load_from_configselfr   s     r   __init__z SmalltalkPatternManager.__init__   s/    02&L*L##% r   c                 r   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                  j                  |       t        j                  dMt        |       dN       yO)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4
 3X?QSWX4
 0(OTR	4

 -x9KTR4
 -x$O4
 X{OTJ4
 X{4OQUV4
 X{OTJ4
 [+7UW[\4
 Wk?DI4
 Y_dK4
 3[/SWX4
  -{<TVZ[!4
& 3ZRVW'4
( ]J8JDQ)4
* Z_dK+4
, Wj2JDQ-4
. ]J8PRVW/4
4 Xz?DI54
6 -z?DQ74
8 -z;QSWX94
> ]O_dS?4
@ ]O_dSA4
B -$OC4
D -$OE4
J -~PTUK4
L ]N<TVZ[M4
N WnotLO4
P 0.BTVZ[Q4
V 3Y@RTXYW4
X 3Y$OY4
Z ]I7I4P[4
\ ZOTJ]4
b 3^_VZ[c4
d 6Y]^e4
f 8.J\^bcg4
l 	-.237G3H2IIZ[\r   c                    t         j                  j                  | j                        s| j	                          y	 t        | j                  dd      5 }t        j                  |      }ddd       | j                  D ci c]  }|j                  | }}j                  dg       D ]Y  }t        di |}|j                  |vs| j                  j                  |       t        j                  d|j                          [ y# 1 sw Y   xY wc c}w # t         $ r"}t        j"                  d|        Y d}~yd}~ww xY w)	!   설정 파일에서 패턴 로드Nrutf-8encodingr   u#   설정 파일에서 패턴 로드: u   설정 파일 로드 실패: r   )ospathexistsr   _save_to_configopenjsonloadr   r   getr
   appendr0   r1   r   	Exceptionwarningr#   fconfig_datapexisting_patternspattern_datar   es           r   r!   z)SmalltalkPatternManager._load_from_configU   s   ww~~d../  "	Ad&&g>!"iil ? 8<}} E}!A} E +
B ?*:\:??*;;MM((1LL#FwGZGZF[!\]	 !@ ?> !F  	AOO;A3?@@	AA   D D*D  D0D ?D D
D 	ED<<Ec                    	 t        j                  t         j                  j                  | j                        d       | j
                  D cg c]1  }|j                  |j                  |j                  |j                  d3 c}t        j                         j                         d}t        | j                  dd      5 }t        j                  ||dd	
       ddd       t!        j"                  d| j                          yc c}w # 1 sw Y   1xY w# t$        $ r"}t!        j&                  d|        Y d}~yd}~ww xY w)(   현재 패턴을 설정 파일에 저장Texist_ok)r   r   r   r   r   last_updatedwr8   r9   F   ensure_asciiindentNu*   스몰토크 패턴 설정 저장 완료: u   설정 파일 저장 실패: )r;   makedirsr<   dirnamer   r   r   r   r   r   r   now	isoformatr?   r@   dumpr0   r1   rD   errorr#   rI   rH   rG   rL   s        r   r>   z'SmalltalkPatternManager._save_to_configj   s   	?KK(8(89DI "]] + $%99$%JJ'(}}#$99	 + !) 8 8 :K d&&g>!		+quQG ? LLEdFVFVEWXY ?>
  	?MM9!=>>	?sB   AD 6D>D D*D D DD 	E!D>>Er   r   r   r   c                     t        ||||      }| j                  j                  |       | j                          t	        j
                  d| d| d       y)u   새 패턴 추가u   새 패턴 추가:  ()N)r
   r   rC   r>   r0   r1   )r#   r   r   r   r   new_patterns         r   add_patternz#SmalltalkPatternManager.add_pattern   sL    &w+wO[)*;-r'!DEr   c                     | j                   D cg c]  }|j                  |k7  s| c}| _         | j                          t        j                  d|        yc c}w )u   패턴 제거u   패턴 제거: N)r   r   r>   r0   r1   )r#   r   rI   s      r   remove_patternz&SmalltalkPatternManager.remove_pattern   sL    $(MMJMqQYY'5IMJwi01 Ks
   AAc                     | j                   D ]I  }|j                  |k(  s||_        | j                          t	        j
                  d|rdnd d|         y y)u   패턴 활성화/비활성화u   패턴 u	   활성화u   비활성화z: TF)r   r   r   r>   r0   r1   )r#   r   r   rI   s       r   toggle_patternz&SmalltalkPatternManager.toggle_pattern   sX    AyyG##	$$&wg{>&RRTU\T]^_  r   returnc                 z    | j                   D cg c]!  }|j                  |k(  s|j                  s |# c}S c c}w )u   카테고리별 패턴 조회)r   r   r   )r#   r   rI   s      r   get_patterns_by_categoryz0SmalltalkPatternManager.get_patterns_by_category   s/    ==Q=aAJJ(,Bqyy=QQQs   888c                 :    t        d | j                  D              S )u   모든 카테고리 조회c              3   4   K   | ]  }|j                     y wN)r   ).0rI   s     r   	<genexpr>z=SmalltalkPatternManager.get_all_categories.<locals>.<genexpr>   s     5}!1::}s   )setr   )r#   s    r   get_all_categoriesz*SmalltalkPatternManager.get_all_categories   s    5t}}555r   
user_queryc           
         |j                         j                         }| j                  D ]s  }|j                  s	 t	        j
                  |j                  |      rCt        j                  d| d|j                   d|j                   d       d|j                  fc S u y	# t        j                  $ r/}t        j                  d|j                   d|        Y d}~d}~ww xY w)
u2   스몰토크 여부 판별 및 카테고리 반환u   스몰토크 감지: '' -> ra   rb   T   잘못된 정규식 패턴:  - N)F )striplowerr   r   rematchr   r0   debugr   r   r^   rE   r#   rs   queryr   rL   s        r   is_smalltalkz$SmalltalkPatternManager.is_smalltalk   s      "((*}}G??88GOOU3MM$::,eGL\L\K]]_`g`s`s_ttu"vw!1!111 4 % 	 88 ">w>OsSTRU VWs   A B""C$5%CC$c                    t        | j                        }t        | j                  D cg c]  }|j                  s| c}      }||z
  }i }| j                  D ];  }|j                  s|j                  |j                  d      dz   ||j                  <   = ||||t        j                         j                         dS c c}w )u   패턴 통계 정보 반환r      )total_patternsenabled_patternsdisabled_patterns
categoriesrS   )r2   r   r   rB   r   r   r[   r\   )r#   r   rI   r   r   category_statsr   s          r   get_statisticsz&SmalltalkPatternManager.get_statistics   s    T]]+4==F=aAII=FG*-==}}G3A3E3EgFVFVXY3Z]^3^w//0 %
 - 0!2($LLN446
 	
  Gs
   B?B?rn   )T)r   r   r   r   r   r$   r    r!   r>   r   rd   rf   rh   r   r
   rk   r   rr   r   r   r   r   r   r   r   r   r      s    G!C !9]vA*?4F3 F# FC FRV F2c 2c D R R>N9O R6CH 6s uT3Y/? $
 
r   r   c                   H    e Zd ZU dZeed<   eed<   eed<   eed<   dZeed<   y)	InappropriatePatternu.   부적절한 질문 패턴 데이터 클래스r   r   r   severityTr   Nr   r   r   r   r   r      s$    8LMMGTr   r   c                   `    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y)InappropriateQuestionFilteru0   부적절한 질문을 필터링하는 클래스Nr   c                 h    g | _         |xs d| _        | j                          | j                          y )Nz$./config/inappropriate_patterns.jsonr   r"   s     r   r$   z$InappropriateQuestionFilter.__init__   s/    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                  j                  |       t        j                  dIt        |       dJ       yK)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   sz    !!9;Hkmsuyz =SU]_cd !1;@Y[ceij !6_V\^bc _hX\] !!6F\^dfjk !6Fcemost !6F\^dfjk !!4iAVX^`de !19>PRZ\`a !:IG[]ceij !
OVUYZ 
OVUYZ 
OVUYZ 
OVUYZ !WlFDQ &RVW !17<NPVX\] !!68H/[ceij !68H/[acgh !68H/[acgh !	?FTXY 	?FTXY 	?HVZ[ 	?FTXY !_eUYZ !1;@RTY[_` !1;@RTY[_` _eUYZ _eUYZ[.
` 	-.9#>N:O9PPabcr   c                    t         j                  j                  | j                        s| j	                          y	 t        | j                  dd      5 }t        j                  |      }ddd       | j                  D ci c]  }|j                  | }}j                  dg       D ]Y  }t        di |}|j                  |vs| j                  j                  |       t        j                  d|j                          [ y# 1 sw Y   xY wc c}w # t         $ r"}t        j"                  d|        Y d}~yd}~ww xY w)	r6   Nr7   r8   r9   r   u0   설정 파일에서 부적절한 패턴 로드: u1   부적절한 패턴 설정 파일 로드 실패: r   )r;   r<   r=   r   r>   r?   r@   rA   r   r   rB   r   rC   r0   r1   r   rD   rE   rF   s           r   r!   z-InappropriateQuestionFilter._load_from_config  s   ww~~d../  "	Ud&&g>!"iil ? 8<}} E}!A} E +
B ?.>>??*;;MM((1LL#ST[TgTgSh!ij	 !@ ?> !F  	UOOOPQsSTT	UrM   c           	         	 t        j                  t         j                  j                  | j                        d       | j
                  D cg c]<  }|j                  |j                  |j                  |j                  |j                  d> c}t        j                         j                         d}t        | j                  dd      5 }t        j                   ||dd	
       ddd       t#        j$                  d| j                          yc c}w # 1 sw Y   1xY w# t&        $ r"}t#        j(                  d|        Y d}~yd}~ww xY w)rO   TrP   )r   r   r   r   r   rR   rT   r8   r9   FrU   rV   Nu1   부적절한 질문 패턴 설정 저장 완료: u1   부적절한 패턴 설정 파일 저장 실패: )r;   rY   r<   rZ   r   r   r   r   r   r   r   r   r[   r\   r?   r@   r]   r0   r1   rD   r^   r_   s        r   r>   z+InappropriateQuestionFilter._save_to_config'  s   	SKK(8(89DI "]]	 + $%99$%JJ'(}}$%JJ#$99 +	 !) 8 8 :K d&&g>!		+quQG ? LLLTM]M]L^_`!	 ?>
  	SMMMaSQRR	SsC   AD# AD>D# D'*D# D# D D# #	E,E		Ers   ri   c           
         |j                         j                         }| j                  D ]~  }|j                  s	 t	        j
                  |j                  |      rNt        j                  d| d|j                   d|j                   d       d|j                  |j                  fc S  y	# t        j                  $ r/}t        j                  d|j                   d|        Y d}~d}~ww xY w)
uD   부적절한 질문 여부 판별 및 카테고리, 심각도 반환u   부적절한 질문 감지: 'ru   ra   rb   Trv   rw   N)Frx   rx   )ry   rz   r   r   r{   searchr   r0   rE   r   r   r^   r~   s        r   is_inappropriatez,InappropriateQuestionFilter.is_inappropriateB  s      "((*}}G??99W__e4OO&CJ<uU\UeUeTffhipiyiyhzz{$|}!1!173C3CCC 5 % 	 88 ">w>OsSTRU VWs   A+B--C/ %C**C/r   r   c           	      T    ddddddddd	}|j                  |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    더 이상 유사한 질문을 하시면 대화를 종료할 수 있습니다.)rB   )r#   r   r   	responsesbase_responses        r   get_appropriate_responsez4InappropriateQuestionFilter.get_appropriate_responseT  sl     I Z f c R k b f	
	 "h  1{  |v #tttr   rn   )r   r   r   r   r   r$   r    r!   r>   r   r   r   r   r   r   r   r   r      s\    :!C !3djU*S63 5sC3H $   r   r   ri   c                  .    t         
t               a t         S rn   )_smalltalk_instancer   r   r   r   _get_smalltalk_instancer   m  s    "57r   rs   c                 4    t               j                  |       S )u*   스몰토크 여부 판별 (편의 함수))r   r   )rs   s    r   is_smalltalk_questionr   s  s    "$11*==r   )r;   r@   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
t   R Rn  !8 >c >eD#I.> >r   