
    soj                        d dl Z d dlZd dlZd dlmZmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZmZ d dlmZ d dlZd dlmZmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZC d dlDmEZE d d lFmGZG d d!lHmIZI d d"lJmKZK d d#lLmMZM d d$lNmOZOmPZP d d%lQmRZRmSZSmTZTmUZU d d&lVmWZW d d'lXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_ d d(l`maZa d d)lbmcZcmdZdmeZe d d*lfmgZg d d+lhmiZi d dljZjd dlkZkd d,lmlZl d dl
mZm d d-lmnZnmoZompZp d dlqmrc msc mtZt d d.lumvZv d d/lwmxZy d d/lzmxZ{ d d/l|mxZ} d d/l~mxZ d d0lmZ d d1lmZ d d2lmZ d d3lmZ d d4lmZ d d5lmZ d d6lmZ d d7lmZmZmZ d d8lmZ d d9lmZ d d:lmZmZmZ d d;lXmZmZmZmZ d d<lmZmZmZ d d=lbmZmZmZmZmZ d>elfd?Zd@eld>dfdAZdBedCej        d>dfdDZdBedCej        d>dfdEZdBedCej        dFed>dfdGZxdBedCej        dFed>dfdHZdBedCej        dIetjt        dJedKeGdLedFedMedNed>efdOZdIetjt        d>efdPZdJed>efdQZ	 d_dSedTemdUed>efdVZdJed>efdWZdXed>efdYZdBedCej        dJedNedFed>dfdZZdBedCej        dMedIetdJed>efd[ZdCej        d>efd\ZdCej        d]ed>dfd^ZdS )`    N)datetime	timedelta)TupleCallable)DoesNotExist)Update)
RetryAfter	Forbidden)ContextTypes)phrasesEnvironment)set_current_language)Game)	GroupChat)User)ContextDataKey)Emoji)
GameStatus)GameTurnNotificationGameOutcomeNotification)ReservedKeyboardKeys)
SavedMedia)SavedMediaType)Screen)DevilFruitAbilityType)IncomeTaxEventType)CommonChatException)	GameBoard)GameOutcome)GameTurn)GameType)PunkRecords)Shambles)WhosWho)ContextDataValue)Keyboard)	Character)SupabaseRest)Terminology)add_or_remove_bountyvalidate_amount)convert_seconds_to_durationget_remaining_durationget_elapsed_durationget_datetime_in_future_seconds)get_ability_adjusted_datetime)mention_markdown_userdelete_messagefull_media_sendget_message_urlfull_message_send"full_message_or_media_send_or_editget_deeplink)send_notification)get_bot_context_dataset_bot_context_data'get_random_user_context_inner_query_key)get_outcome_text)get_belly_formatted)MySQLDatabase)
BadRequestTimedOutNetworkError)Database)manage)Group)	GroupUser)CommandName)ContextDataType)Feature)MessageSource)ChatWarning)CommandValidationExceptionNavigationLimitReachedExceptionAnonymousAdminException)GroupChatException)PrivateChatException)feature_is_enabledget_group_or_topic_textis_main_group)
is_commandget_message_sourcemessage_is_replyescape_valid_markdown_chars)user_is_bossuser_is_mutedget_effective_tg_user_id)get_context_dataset_context_dataget_user_context_dataset_user_context_dataremove_user_context_datareturnc                  J    t                      } |                                 }|S )zg
    Initializes the group chat manager
    :return: Database connection
    :rtype: MySQLDatabase
    )rB   get_db)db_objdbs     /app/src/chat/manage_message.pyinitre   n   s     ZZF	BI    rc   c                 .    |                                   dS )zZ
    Ends the group chat manager
    :param db: Database connection
    :return: None
    N)close)rc   s    rd   endri   z   s     HHJJJJJrf   updatecontextc                 \   K   |j                             t          | |d                     dS )zr
    Manage a regular message
    :param update: The update
    :param context: The context
    :return: None
    FNapplicationcreate_taskrC   rj   rk   s     rd   manage_regularrq      s1       ##F67E$B$BCCCCCrf   c                 \   K   |j                             t          | |d                     dS )zs
    Manage a callback message
    :param update: The update
    :param context: The context
    :return: None
    TNrm   rp   s     rd   manage_callbackrs      s1       ##F67D$A$ABBBBBrf   is_callbackc                 `  K   t          j                    }| j        t          | j        j                  nd}|dk    rdS |2t          |           d{V sdS t          |t          j        |           t                      }	 t          | ||           d{V  n# t          $ r Y nt          $ r}t          j        |            t          j        |d           t          j        t          j                               |j                            d|  dt          j                                d{V  Y d}~nd}~ww xY wt)          |           n# t)          |           w xY w|r1	 | j                                         d{V  n# t.          $ r Y nw xY w|t1          ||           dS dS )z
    Manage a regular message
    :param update: The update
    :param context: The context
    :param is_callback: True if the message is a callback
    :return: None
    N777000Texc_infozError handling update:
z

)r   noweffective_userstridcheck_current_requestsr]   r   LAST_REQUESTre   manage_after_dbrM   	Exceptionloggingerror	tracebackformat_stackbotreport_error
format_excri   callback_queryanswerr?   remove_current_request)rj   rk   rt   ry   current_tg_user_idrc   es          rd   rC   rC      s%      ,..C)/)>)JF!$%%%PT 
 X%%%+G44444444 	Fg~'BCHHH	Bfg{;;;;;;;;;;"    h h hfa$''''i,..///k&&'f&'f'fiNbNdNd'f'fggggggggggggggh 	BB 	'..0000000000 	 	 	D	 %w,,,,, &%sO   B E 
E %E '	E 0BD;6E ;E  E E$*F
 

FFc                   K   t          t          |                     }t                      }| j        	 t	          | j        | j                   d{V }n# t          $ r Y dS w xY wt          || j        d           d{V }t          |	                                           t          j                                        r'|j        t          j                                        vrdS t          j                                        rt          j                                        }|t           j        u r^t'          | j        j                  |vrCt-          j        d| j        j         d           | j                                         d{V  dS |t           j        u r|                    |           d{V sdS |j        |_        |                                 |t           j        u r|t'          | j        j                  t          j                                         k    rAt-          j        d| j        j         d           | j                                         d{V  dS d}|t           j        u ritC          | | j        |nd           d{V }t          |	                                           tE          | |          }tG          | ||||           d{V  tH          j        }	d}
| j%        | j%        j&        tO          | j%        j&                  r|t           j        u r| j%        j&        (                    d          rht          j)                                         }d| d	}tU          tV          j,        |
          gg}t[          |tV          j.        | |d|           d{V  dS 	 	 tO          | j%        j&                  rd| j%        j&        v r| j%        j&        /                    dd          }	 ta          j1        |          2                                }tU          j3        ||t'          |          d          }
tI          j4        |
j5                  }	|	j6        }n# tn          tp          f$ r |}Y nw xY w| j%        j&        9                    d          d         dd         :                                }|/                    dt          j)                                         :                                z   d          }|
k|;                                dk    rtI          j<        ||          }		 | j%        j&        9                    d          dd         |	_=        n# t|          $ r Y nw xY wn# t~          tp          f$ rv |rqtU          j3        ||| j@                  }
|
jA        sY dS |
j5        E	 tI          j4        |
j5                  }	n*# tp          $ r tI          j$        d|
j5                  }	Y nw xY wY nw xY wd}|
	 t          |           rTt	          | j        jC        jD        | j        jC                   d{V }t          || j        jC        jD                   d{V }n# t~          $ r Y nt          $ r Y nw xY w|	tH          jE        u rd|_F        |G                                 t          |	          rt          |          sdS |	tH          j        k    s|t           j        u r=t          | |||	|           d{V r$t-          jK        d| j        j         d           dS |	tH          j        k    s|rt          | ||	||
||||	  	         d{V sdS |	tH          j        k    r||	_M        |xt           j        k    r t          | ||	||
           d{V  nxt           j        k    r t          | ||	||
|||           d{V  n^xt           jP        k    r t          | |           d{V  n6t           jR        k    rt          | |           d{V  n	 tq          d          n.# t          $ rU}t          |tV          jV        |            d{V  t-          jK        |            t-          jW        |           Y d}~nd}~wt          t          f$ r3}t-          jK        d           t-          jW        |           Y d}~nd}~wt          t          t          f$ r}d|_]        |t           j        u r|^                                dd         nd}	 t[          |t'          |          | |d           d{V  n}# t          $ rp 	 t          |t'          |          | |d           d{V  nD# t          $ r7 t          |t          t'          |                    | |d           d{V  Y nw xY wY nw xY wY d}~nd}~wt          $ rq}t'          |          :                                }d|v r"t-          j        d| j        j                    nd|v sd|v rt-          jK        d           n|Y d}~n d}~wt          $ r' t[          |tV          jb        | dd            d{V  Y nt          $ r?}t          |t          t'          |                    | |
dd!           d{V  Y d}~nd}~wt          $ r9}| j        | j        j        nd}t-          jK        d"| d#|            Y d}~nid}~wt          $ rY}t-          j        |            t-          j        |d$           t-          j        t          jg                               Y d}~nd}~ww xY w|j]        r|j        |                                 dS dS dS )%z
    Manage a regular message after the database is initialized
    :param update: The update
    :param context: The context
    :param is_callback: True if the message is a callback
    :return: None
    NF)should_savezUnauthorized group z: Leaving chatzUnknown message source for z/startzhttps://t.me/z?start=start)urlT)rj   keyboardforce_auto_delete
group_chatz/start  )info_strfrom_deeplink r      @zSpam detected for chat z: Ignoring messagezInvalid message source)rj   zNetwork error)rj   previous_screensfrom_exceptionzmessage is not modifiedz)Updated message same as previous in chat zquery is too oldzquery id is invalidz0Ignored stale callback query (Query is too old).)rj   answer_callback
show_alert)rj   inbound_keyboardr   r   zForbidden in chat z: rw   )hrI   rT   r   rz   rY   effective_messagerM   get_userr   get_languageEnvLIMIT_TO_AUTHORIZED_USERSget_bool
tg_user_idAUTHORIZED_USERSget_listLIMIT_TO_AUTHORIZED_GROUPSAUTHORIZED_GROUPSGROUPr{   effective_chatr|   r   r   leavePRIVATEin_authorized_groupsprivate_screen_stepprivate_screen_previous_stepsaveNDUPDATES_CHAT_IDgetadd_or_update_groupadd_or_update_group_chatadd_text_message_bountyCommandmessagetextrS   
startswithBOT_USERNAMEr&   r   COMMAND_START_IN_GROUP_BUTTONr5   COMMAND_START_IN_GROUP_ERRORreplacebase64	b64decodedecodeget_from_callback_query_or_infoget_by_screenscreennameUnicodeDecodeError
ValueErrorsplitlowerstripget_by_name
parameters
IndexErrorAttributeErrorr   inforU   reply_to_message	from_user	PVT_STARTprivate_screen_listreset_private_screenis_owner_only_commanduser_is_owneris_spamwarningvalidatemessage_sourcemanage_private_chatmanage_group_chatTG_RESTmanage_tgrest_chatINLINE_QUERYmanage_inline_queryr   r6   ITEM_NOT_FOUND	exceptionr@   rA   rO   rN   r   should_update_modelget_private_screen_listr?   rV   rL   NAVIGATION_LIMIT_REACHEDrJ   r
   r   r   r   )rj   rk   rt   r   userr   	group_idsr   groupcommandr   bot_username	start_urlinline_keyboardstart_parameterparameter_decodedcommand_nametarget_userdnenecer   bre	error_strcwfechat_idr   s                               rd   r   r      s      %22DV2L2L$M$MN66D(	7%v'?         JJ ' 	 	 	FF	 $J0ESXYYYYYYYYYT..00111 )2244	s';'D'D'F'FFFF )2244 	-6688I -"555-011BB \F4I4L\\\]]]+11333333333 !666TE^E^F F @ @ @ @ @ @6 ,0,D)		 )))v$'((C,?,C,C,E,EEEM`8M8P```aaa'--///////// J,,,0V2>TTD
 
 
 
 
 
 
 
 	U//11222 8 G G
%fgtZUUUUUUUUU&zGH 	"N+v~*++ ,m111N**844 2 '++-->L>>>	 9!  
  0$"!
 
 
 	
 	
 	
 	
 	
 	
 	
 	A04	I&.-.. " 333&,n&9&A&A)R&P&PO7,2,<_,M,M,T,T,V,V)#+#K#*%():%;%;*.	$ $ $ #*"7"H"H'.|.
; 7 7 7'67 %+N$7$=$=c$B$B1$Eqrr#J#P#P#R#RL $0#7#7c>N>R>R>T>T>Z>Z>\>\8\^`#a#aL##))++r11")"5lN"S"S-3^-@-F-Fs-K-KABB-O**%    
+ 	I 	I 	I I#C^V-B   } FF?.I")"7"H"H% I I I")/$"H"HI	I" $(#F++ '?0AK0A( ( " " " " " "J /7"F$<$M$W/ / ) ) ) ) ) )K "   *    g''''+D$%%''' !)) 	-2E2E 	F gj  Nm6K$K$KVWngtLLLLLLLL Zf.C.FZZZ   gj  K !
 
 
 
 
 
 
 
  gj  %3G"&&&&&)&'7D(SSSSSSSSSS$$$$$'GWdHk;Xb          '&&&&(9999999999+++)&':::::::::: !9:::   0':PY_``````````#l#   (((" "46IJ      #(  !666 ((**3B3// 	
	#B!1#            	 	 	8GG!%5#'              8/B88!%5#'           	"    HHNN$$	$	11M`fF[F^``aaaa9,,0E0R0RONOOOOI* 
 
 
, 
 
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
  
 
 
0'B00%
 
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
  > > > /5.C.O&'**UY<W<<<<======== 0 0 0fa$''''i,..////////	0  DO$?		 $?$?s   A 
A%$A%2AU4 ;A+Q' &U4 'Q=:U4 <Q==B8U4 6,U# "U4 #
U0-U4 /U00U4 3`( 45W;)`( ,W;4WW;$W52W;4W55W;8`( :W;;`( A#Y' &`( '
Y?1`( 3	Y?<`( >Y??A
`( A`( &/`( C`( (
m2A
bm(cm3f='d:9f=:
f4'e-,f4->f.+f4-f..f41f=3f44f==m
A&h661m)	m25j,,m9/k--m:Ammr   r   r   r   r   r   c	                   K   |rt           j        |j        v r{t          |j                  |j        t           j                 vr&t          |t          j        | dd           d{V  dS t           j        |j        v rt          |            d{V  dS |r8|t          j        u r*t           j        |j        v rt          |            d{V  dS t          |           }	|duot          |          }
d}g }	 |dS |j        s^|j        >t!          t          j                            |                                                    t!          t          j                  |j        \|t          j        u rNt/          ||j                  s9t!          t          j                            t3          |                              |j        sQ|                                r=|j        r|                                s"|j        r|st!          t          j                  |j         |j!        |j         j"        k     r||j         #                                rt!          t          j$                  t          j%                            tM          |j         j'                  tM          |(                                                    }|j)        |j         j*        k     rl|t          j+                            tY          |j)                  tY          |j         j*                  tY          |j         j*        |j)        z
                      z  }|-                                sP|j.        rI|t          j/        z  }|0                    tc          t          j2        tf          j4        d          g           t!          |          |j5        r;|s9	 |	r| j6        j7        t!          t          j8                  n# tr          $ r Y nw xY w|j:        sV	 |	rB| j6        j7        j;        j        | j6        j;        j        k    rt!          t          j<                  n# tr          $ r Y nw xY w|j=        sG|sE	 |	r1| j>        j7        j;        j?        r|t!          t          j@                  n# tr          $ r Y nw xY w|j        s?	 |                                rt!          t          jA                  n# tr          $ r Y nw xY w|jB        r-|C                                st!          t          jD                  |jE        r6|r|jF        r-|G                                st!          t          jH                  |jI        r(t          |          st!          t          jK                  |jL        r4|M                    |            d{V st!          t          jN                  |s4|jO        r-|-                                st!          t          jP                  |j        <|t          j        u r.|j        }|Q                                r|
sd}t!          d          |'|jR        r |jS        st!          t          jT                  n# t           $ r}|rY d}~dS |jU        s&t          ||          rt          |            d{V  nF|jU        r|s|jW        r6t          |t          |          | |du |jU        |jZ        ||           d{V  Y d}~dS d}~ww xY wdS )a  
    Validate the command
    :param update: Telegram update
    :param context: Telegram context
    :param command: The command
    :param user: The user
    :param inbound_keyboard: The keyboard
    :param target_user: The target user in case of a reply
    :param is_callback: True if the message is a callback
    :param message_source: The message source
    :param group_chat: The group chat
    :return: True if the command is valid
    T)r   r   NF)r   is_deeplinkr   )rj   add_delete_buttonr   r   r   r   )[r   r   r   intr|   r5   r   KEYBOARD_USE_UNAUTHORIZEDDELETEr2   rI   r   rU   rR   activereplaced_byrK   )COMMAND_NOT_ACTIVE_WITH_REPLACEMENT_ERRORformatget_replaced_by_formattedCOMMAND_NOT_ACTIVE_ERRORfeaturer   rP   COMMAND_FEATURE_DISABLED_ERRORrQ   allow_while_arrestedis_arrestedallow_while_arrested_temporaryis_arrested_temporaryallow_reply_to_arrestedCOMMAND_WHILE_ARRESTED_ERRORrequired_locationlocation_levellevelis_first_new_world!COMMAND_FOR_NEW_WORLD_USERS_ERROR&COMMAND_FOR_USERS_AFTER_LOCATION_ERRORrV   r   get_location_namebountyrequired_bounty-COMMAND_FOR_USERS_AFTER_LOCATION_BOUNTY_ERRORr=   is_crew_membercan_join_crew0COMMAND_FOR_USERS_AFTER_LOCATION_ERROR_JOIN_CREWappendr&   KEY_JOIN_A_CREWr   PVT_CREW_SEARCHonly_in_replyr   r   COMMAND_NOT_IN_REPLY_ERRORr   allow_self_replyr   COMMAND_IN_REPLY_TO_ERRORallow_reply_to_botr   is_botCOMMAND_IN_REPLY_TO_BOT_ERROR"COMMAND_IN_REPLY_TO_ARRESTED_ERRORonly_by_crew_captainis_crew_captain"COMMAND_ONLY_BY_CREW_CAPTAIN_ERROR"only_by_crew_captain_or_first_mate+only_by_crew_captain_or_first_mate_keyboardis_crew_captain_or_first_mate0COMMAND_ONLY_BY_CREW_CAPTAIN_OR_FIRST_MATE_ERRORonly_by_bossrW   COMMAND_ONLY_BY_BOSS_ERRORonly_by_chat_adminis_chat_admin COMMAND_ONLY_BY_CHAT_ADMIN_ERRORonly_in_reply_to_crew_member)COMMAND_NOT_IN_REPLY_TO_CREW_MEMBER_ERRORis_restrictedr   allow_deeplink'COMMAND_NOT_ALLOWED_FROM_DEEPLINK_ERRORr   rX   send_message_if_errorr6   r{   r   )rj   rk   r   r   r   r   rt   r   r   _message_is_reply_is_main_groupis_restricted_feature_errorr   r   r  cves                   rd   r   r     sP     4  +<@P@UUULL 0 56J6[ \\\#1 $          5  &*:*??? (((((((((5 	m333 '+;+@@@V$$$$$$$$$u(00t+Ij0I0IN"',.Ot?4~ 	O".0ELL99;;    -W-MNNN ?&>]=P+P+P%j'/BB 0:AA/
;;    + 	W  ""W ?WDHD^D^D`D`W !8W >IW
 11UVVV $0"W%>%DDD,??AA `4W5^___ELL/0I0NOO/0F0F0H0HII  ;!:!JJJGQXX+DK88+G,E,UVV+#5ES   D **,, 1C GTTD $**$ ' 7'-'=,0     1666   	 	)Y-3^-L-T4W5WXXX .U "    ' 	%X7ADH`Hccc4W5VWWW!    ) 
	+ 
		 &\0AKR\ $+4W5Z[[[!    . 	**,, a4W5_```a!    ' 	]'')) ]01[\\\ 5 	 ([ 99;; 4P  
  	U%% U01STTT % 	[++F33333333 [01YZZZ 	3 "1133 4I  
 ?&>]=P+P+P&G$$&& 5~ 5.2+0444 ',<,J') b01`aaa%   & 	55555& 	=z+J+J 	 ((((((((((' 
K 
G<Y 
8HH!'74'?$+$;&1%5,	 	 	 	 	 	 	 	 	 	 uuuuu#& 4s   4Y# 8KY# <'O$ #Y# $
O1.Y# 0O11
Y# <AQ  Y# 
QY# QY# 3R Y# 
RY# R
Y# '-S Y# 
S"Y# !S""F Y# #
[3-[.5A3[..[3c                     | duoJ| j         t          j        t          j        t          j        t          j        t          j        t          j        fv S )z
    Check if the command is an owner-only maintenance/broadcast command.
    :param command: The command
    :return: True if owner-only command
    N)r   rF   
ADD_BOUNTYTAKE_BOUNTYREVERT_PENDING_BOUNTYREVERT_PENDING_BOUNTY_ALLGCASTPCAST)r   s    rd   r   r     sH     $ 7<)-4 $ rf   c                     t           j                                        }|duo$t          | j                  t          |          k    S )zb
    Check if the user matches OWNER_ID.
    :param user: The user
    :return: True if owner
    N)r   OWNER_IDget_or_noner{   r   )r   owner_ids     rd   r   r     s<     |''))H4IC$8$8CMM$IIrf   Tr   rz   r   c                 f  K   t          j        t           j        | k              }|t                      }| |_        |j        t	          |           k    r(|j        |_        |j        pd|_        |j	        pd|_
        t          j                    |_        d|_        |r|                                 |S )z
    Create or update the user
    :param tg_user_id: The Telegram user ID
    :param effective_user: The Telegram user
    :param should_save: True if the user should be saved
    :return: The user
    Nr   T)r   rE  r   r|   r   
first_nametg_first_name	last_nametg_last_nameusernametg_usernamer   ry   last_message_date	is_activer   )r   rz   r   r   s       rd   r   r     s       DOz9::D|vv$ C
OO+++6*4:)28b%\^^DDN 		Krf   c                 6  K   t          j        t           j        | j        j        k              }|t                      }| j        j        |_        	 | j        j        | j        j        |_        n# t          $ r Y nw xY w| j        j        |_	        | j        j
        |_        | j        j        duo| j        j        |_        t          j                    |_        d|_        |                                 |t%          j        t$          j        |k    t$          j        |k    z            }|t%                      }||_        ||_        t          j                    |_        d|_        |                    |            d{V |_        |                                 |S )z
    Adds or updates a group_chat
    :param update: Telegram update
    :param user: User object
    :return: Group object
    NT)rD   rE  tg_group_idr   r|   r   migrate_to_chat_idr   titletg_group_namerL  tg_group_usernameis_forumr   ry   rN  rO  r   rE   r   r   r0  is_admin)rj   r   r   
group_users       rd   r   r   (  sz      e/63H3KKLLE}"14>,8 & AE    !/5E$3<E*34?bFDYDbEN&lnnEEO	JJLLL *IOu,D[_I_+`aa
"J$J"JO'/|~~
$#
$($6$6v$>$>>>>>>>
Ls   A/ /
A<;A<r   c                    d}| j         j        r| j        j        r| j        j        }t          j        t
          j        |k    t
          j        |k    z            }|t                      }||_        ||_        	 | j	        j
        j        j        |_        n# t          $ r Y nw xY wt          j                    |_        d|_        |                                 |S )z
    Adds or updates a group_chat
    :param update: Telegram update
    :param group: Group object
    :return: GroupChat object
    NT)r   rV  r   is_topic_messagemessage_thread_idr   rE  r   tg_topic_idr   r   forum_topic_createdr   tg_topic_namer   r   ry   rN  rO  r   )rj   r   r\  r   s       rd   r   r   S  s     K% A&*B*S A.@&	E	!i&;{&JK J [[
 
!,
#)>#B#V#[
      $,<>>J JOOs   9B 
B"!B"c                   K   |s	||j         dS | j        | j        j        dS | j        j                            d          rdS | j        j        dS t          | j        j                                                  dk    rdS | j        | j        j        rdS t          |          r|
                                rdS t          |t          j                                        ||            d{V  dS )z[
    Award taxable bounty for regular text messages sent by players in the main group.
    N)/.!   )rk   rj   )r   r   r   r   forward_originlenr   rz   r#  rR   r	  r*   r   %MAIN_GROUP_TEXT_MESSAGE_BOUNTY_REWARDget_int)rj   rk   r   r   rt   s        rd   r   r   t  s+       dldo&=~!4!<~%%o66 ~$0
6>$$&&''1,,(V-B-I($$ (8(8(:(: 
199;;	           rf   c                   	K   |t           j        u rt          j        }d}n6|t           j        u r&t          j        }t          | j        j                  }ndS |"|	                                t          j        u rdS ||j        t          j        u rdS 	 t          ||t          j        |          }n# t"          $ r g }Y nw xY wt%          j                    		fd|D             }|t           j        u rt(          j                                        nt(          j                                        }t1          |          |k    rzt1          |          |k    re|t           j        u rW|                    	           t5          ||t          j        ||           t7          |t8          j        | dd           d{V  dS |                    	           t5          ||t          j        ||           dS )a  
    Check if the message is spam, which would cause flooding
    :param update: Telegram update
    :param context: Telegram context
    :param message_source: The message source
    :param command: The command
    :param user: The user
    :return: True if the message is spam
    NF)	inner_keyc                 v    g | ]5}t          t          j                                        |           k     3|6S ))
start_time)r/   r   ANTI_SPAM_TIME_INTERVAL_SECONDSrg  ).0xry   s     rd   
<listcomp>zis_spam.<locals>.<listcomp>  s\       
(/7799a
 
 

 
 	

 
 
rf   T)rj   quote_if_groupnew_message)rI   r   rG   USERr   BOTr{   r   r|   get_current_private_screenr   PVT_GAME_GUESS_INPUTr   GRP_RUSSIAN_ROULETTE_GAMErZ   r   PAST_MESSAGES_DATEr   r   ry   r   $ANTI_SPAM_PRIVATE_CHAT_MESSAGE_LIMITrg  "ANTI_SPAM_GROUP_CHAT_MESSAGE_LIMITre  r  r[   r5   r   ANTI_SPAM_WARNING)
rj   rk   r   r   r   context_data_typeri  past_messages_date_list
spam_limitry   s
            @rd   r   r     sl     " ...+0			=.	.	.+/-011		u D;;==A\\\u w~1QQQu%2B&(IU^3
 3
 3
  % % %"$% ,..C   (   ]222 	088:::3;;==  "##z11&'':55.MLa:a:a#**3///!1'#    $)$           t ""3''')    5s   B1 1C ?C c                    K   	 t          j                    t          | t          j        d          z
                                  dk    rdS dS # t          $ r Y dS w xY w)a  
    Make sure that there are no request currently being processed for a user before processing
    the next one
    If there is, and it is being processed for less than 10 seconds, drop the incoming request
    :param context: The context
    :return: None
    Ftolerate_key_exception
   T)r   ry   r\   r   r~   total_secondsKeyError)rk   s    rd   r}   r}     s~       LNN#4U   -//B  4 u   tts   AA 
AAinserted_timec                     	 t          | t          j        d          }||k    rt          | t          j                   dS dS # t          $ r Y dS w xY w)z
    Remove a request from the dictionary, if it's of the given datetime
    :param context: The context
    :param inserted_time: The datetime
    :return: None
    Fr  N)r\   r   r~   r^   r  )rk   r  values      rd   r   r     su    %^0
 
 
 M!!$Wn.IJJJJJ "!   s   <A 
AA)T)asynciojsonr   r   r   typingr   r   peeweer   src.tg_compatr   src.tg_compat.errorr	   r
   src.tg_compat.extr   	constantsc	resourcesr   r   r   src.service.language_servicer   src.model.Gamer   src.model.GroupChatr   src.model.Userr   src.model.enums.ContextDataKeyr   src.model.enums.Emojir   src.model.enums.GameStatusr   src.model.enums.Notificationr   r   $src.model.enums.ReservedKeyboardKeysr   src.model.enums.SavedMediar   src.model.enums.SavedMediaTyper   src.model.enums.Screenr   1src.model.enums.devil_fruit.DevilFruitAbilityTyper   -src.model.enums.income_tax.IncomeTaxEventTyper   src.model.error.CommonChatErrorr   src.model.game.GameBoardr   src.model.game.GameOutcomer   src.model.game.GameTurnr    src.model.game.GameTyper!   &src.model.game.punkrecords.PunkRecordsr"    src.model.game.shambles.Shamblesr#   src.model.game.whoswho.WhosWhor$   src.model.pojo.ContextDataValuer%   src.model.pojo.Keyboardr&   src.model.wiki.Characterr'   src.model.wiki.SupabaseRestr(   src.model.wiki.Terminologyr)   src.service.bounty_servicer*   r+   src.service.date_servicer,   r-   r.   r/   src.service.devil_fruit_servicer0   src.service.message_servicer1   r2   r3   r4   r5   r6   r7    src.service.notification_servicer8   src.utils.context_utilsr9   r:   r;   src.utils.phrase_utilsr<   src.utils.string_utilsr=   r   r   r>   TelegramUserr?   r@   rA   src.model.enums.Commandmodelenumsr   resources.DatabaserB   !src.chat.group.group_chat_managerrC   r   *src.chat.inline_query.inline_query_managerr   %src.chat.private.private_chat_managerr   #src.chat.tgrest.tgrest_chat_managerr   src.model.GrouprD   src.model.GroupUserrE   src.model.enums.CommandNamerF   rG   src.model.enums.FeaturerH   src.model.enums.MessageSourcerI   src.model.error.ChatWarningrJ   src.model.error.CustomExceptionrK   rL   rM   src.model.error.GroupChatErrorrN    src.model.error.PrivateChatErrorrO   src.service.group_servicerP   rQ   rR   rS   rT   rU   rV   src.service.user_servicerW   rX   rY   rZ   r[   r\   r]   r^   re   ri   DEFAULT_TYPErq   rs   boolr   r   r   r   r{   r   r   r   r   r   r}   r    rf   rd   <module>r     s	      ( ( ( ( ( ( ( ( " " " " " " " "                   5 5 5 5 5 5 5 5 * * * * * *     < < < < < < < < = = = = = =       ) ) ) ) ) )       9 9 9 9 9 9 ' ' ' ' ' ' 1 1 1 1 1 1 V V V V V V V V E E E E E E 1 1 1 1 1 1 9 9 9 9 9 9 ) ) ) ) ) ) S S S S S S L L L L L L ? ? ? ? ? ? . . . . . . 2 2 2 2 2 2 , , , , , , , , , , , , > > > > > > 5 5 5 5 5 5 2 2 2 2 2 2 < < < < < < , , , , , , . . . . . . 4 4 4 4 4 4 2 2 2 2 2 2 L L L L L L L L            J I I I I I                  ? > > > > >         
 4 3 3 3 3 3 6 6 6 6 6 6                  . . . . . . B B B B B B B B B B ) ) ) ) ) ) ) ) ) ) ) ) ' ' ' ' ' ' I I I I I I T T T T T T O O O O O O L L L L L L ! ! ! ! ! ! ) ) ) ) ) ) 3 3 3 3 3 3 : : : : : : + + + + + + 7 7 7 7 7 7 3 3 3 3 3 3         
 > = = = = = A A A A A A ` ` ` ` ` ` ` ` ` `            [ Z Z Z Z Z Z Z Z Z             	m 	 	 	 	M d    D D,2K DPT D D D DC& C<3L CQU C C C C,- ,-,*C ,-RV ,-[_ ,- ,- ,- ,-^nn)6nEIn	n n n nb	pp&p _p 	p
 p p p "p p 
p p p pf7? t    "J J J J J J HL %1@D	   @(D (U ( ( ( (VE i    B%%&% % 	%
 % 
% % % %PZZ&Z "Z 	Z
 Z 
Z Z Z Zz,*C     2L$= h [_      rf   