
    sojy*                     6   d dl Z d dlmZ d dlmZmZ d dlmZmZm	Z	m
Z
mZmZ d dlmZmZ d dlmZ d dlmZmZmZ d dlmZ d dl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) d dl*m+Z+ d dl,m-Z- 	 d%dedede.dz  fdZ/d%dede de%dz  fdZ0dede1fdZ2d%dede de1fdZ3dede de1fdZ4	 	 	 d&dede dedej5        de.dedz  fdZ6	 	 	 	 d'dededej5        de de.de1fdZ7	 	 	 	 d'dededej5        de de.de1fd Z8d!ed"ede.fd#Z9d(d$Z:dS ))    N)Path)SequenceOptional)Update	PhotoSizeUserProfilePhotosFile
ChatMemberMessage)UserChatMemberAdministrator)ChatMemberStatus)
BadRequestChatMigratedTimedOut)ContextTypes)Group)	GroupChat)UnmutedUser)r   )BossType)PIRATE_KING)AnonymousAdminException)get_current_leaderboard_rank)generate_temp_file_pathupdatetelegram_userreturnc                 X  K   || j         j        dS | j        }|dS d}	 |                    d           d{V }|j        d         }|d         }|                                 d{V }	 |                    t          t          j	                             d{V }nr# t          $ re 	 |                    t          t          j	                             d{V }n.# t          $ r!}t          j        d|            Y d}~nd}~ww xY wY nw xY wn# t          t          f$ r Y nw xY w|S )z
    Gets the user's profile photo
    :param update: Telegram update
    :param telegram_user: Optional Telegram user to fetch the photo for
    :return: The path of the user's profile photo
    N   )limitr   z1Failed to download profile photo after retrying: )effective_messagesender_chateffective_userget_profile_photosphotosget_filedownload_to_driver   cTG_PROFILE_PHOTO_EXTENSIONr   loggingwarningAttributeError
IndexError)r   r   
photo_pathuser_profile_photoslast_set_photoslast_set_photofiletes            /app/src/service/user_service.pyget_user_profile_photor6      s      #/;4-t "&J7D7W7W 8X 8
 8
 2
 2
 2
 2
 2
 2
 0C/I!/L$3B$7)2244444444	Z%)%;%;'(DEE& &            JJ  	Z 	Z 	ZZ)-)?)?+A,HII* * $ $ $ $ $ $

  Z Z Z XTV X XYYYYYYYYZ	Z J'    s`   AD -2B  D  
D+2CD
D	(D?DD		DD DD D'&D'user
group_chatc                 B   | j         rt          j        S |                                 rt          j        S t          | |          t          k    rt          j        S |                                 rt          j        S |$t          |           t          k    rt          j        S dS )z
    Get the boss type of the user
    :param user: The user
    :param group_chat: The group chat
    :return: The boss type
    N)	is_adminr   ADMINis_legendary_pirateLEGENDARY_PIRATEr   r   
is_warlordWARLORDr7   r8   s     r5   get_boss_typerA   H   s     } ~!! )((#D*55DD##  '--<<''4    c                 *    |                                  S )z
    Returns True if the user is immune from combat-related losses
    :param user: The user
    :return: True if the user is immune from combat-related losses
    )r<   )r7   s    r5   user_has_combat_loss_immunityrD   d   s     ##%%%rB   c                 &    t          | |          duS )z
    Returns True if the user is a boss
    :param user: The user
    :param group_chat: The group chat
    :return: True if the user is a boss
    N)rA   r@   s     r5   user_is_bossrF   n   s     z**$66rB   c                     |dS t          |           rdS |j        sdS t          j        t          j        | k    t          j        |k              du S )z
    Returns True if the user is muted
    :param user: The user
    :param group_chat: The group chat
    :return: True if the user is muted
    NF)rF   is_mutedr   get_or_noner7   r8   r@   s     r5   user_is_mutedrJ   y   sd     uD u u 	 0D 8+:PT^:^__	rB   contexttg_group_idc                   K   |||t          d          ||t          d          ddlm} 	 |2|j                            t          | j                             d{V S |?|j        }|j        	                    |j
        t          | j                             d{V S |3|j        	                    |t          | j                             d{V S t          d          # t          $ r}|'|j        }|j        |_
        |                                 |=|j        	                    |j        t          | j                             d{V cY d}~S |J|                                	                    |j        t          | j                             d{V cY d}~S Y d}~dS d}~w|t           f$ r Y dS t"          $ r Y dS w xY w)z
    Returns the chat member of the user
    :param user: The user
    :param group_chat: The group chat
    :param update: The update
    :param context: The context
    :param tg_group_id: The chat id
    :return: The chat member
    Nz5update or group_chat or tg_group_id must be specifiedz4context must be specified if group_chat is specifiedr   )	Forbiddenz&update or group_chat must be specified)
ValueErrorsrc.tg_compat.errorrN   effective_chat
get_memberint
tg_user_idgroupbotget_chat_memberrL   strr   new_chat_idsaveget_botr   r   )r7   r8   r   rK   rL   rN   rU   es           r5   rW   rW      sC     " ~*,1DPQQQ'/OPPP------.99#do:N:NOOOOOOOOO#%+E 44U5FDOH\H\]]]]]]]]]$ 44[#doBVBVWWWWWWWWWEFFF   !%+E !EJJLLL 44Q]CDXDXYYYYYYYYYYYYYY))99!-T_I]I]^^^^^^^^^^^^^^tttttz"   tt   ttsJ   3C+ &A C+ '4C+ C+ +
G5A"F/GAF/#G/G	GGc                 ~   K   t          | ||||           d{V }|duo|j        t          j        t          j        fvS )a  
    Returns True if the user is a member of the chat
    :param user: The user
    :param update: The update
    :param context: The context
    :param group_chat: The group chat
    :param tg_group_id: The chat id
    :return: True if the user is a member of the chat
    N)rW   statusr   LEFTBANNEDr7   r   rK   r8   rL   chat_members         r5   user_is_chat_memberrc      s^      " %4D*fgWb$c$cccccccKd" {'9B ( rB   c                 ~   K   t          | ||||           d{V }|duo|j        t          j        t          j        fv S )a  
    Returns True if the user is an admin of the chat
    :param user: The user
    :param update: The update
    :param context: The context
    :param group_chat: The group chat
    :param tg_group_id: The chat id
    :return: True if the user is an admin of the chat
    N)rW   r^   r   OWNERADMINISTRATORra   s         r5   user_is_chat_adminrg      s]      " %4D*fgWb$c$cccccccKd" {'9&> ( rB   r$   r"   c                 j  K   t          | j                  S j        t          | j                  S j                                         d{V }t          |          dk    rt                      t          |          dk    rt          |d         j        j                  S j        t                      fd|D             }t          |          dk    rt          dj         d          t          |          dk    rt                      t          |d         j        j                  S )z
    Get the effective Telegram user ID, even if anonymous admin
    :param effective_user: The effective user
    :param effective_message: The effective message
    :return: The effective Telegram user ID
    Nr   r   c                 4    g | ]}|j         j        k    |S  )custom_titleauthor_signature).0ar"   s     r5   
<listcomp>z,get_effective_tg_user_id.<locals>.<listcomp>  s0       !.4E4V"V"V"V"V"VrB   zAdmin with title z
 not found)
rX   idr#   chatget_administratorslenr   r7   rl   rO   )r$   r"   chat_adminsadmins_with_same_titles    `  r5   get_effective_tg_user_idrv      s_       >$%%%$,>$%%%
 8I7M7`7`7b7b1b1b1b1b1b1bK
;1%''' ;1;q>&)*** )1%'''     
 !""a''[->-O[[[\\\ !""Q&&%'''%a(-0111rB   c                     t                      } t          j                                                                        D ]Y}	 |                     t          t          |                               3# t          $ r t          j
        d|            Y Vw xY wt          |           dk    rht          j        d                              t          j                            |           t          j        dk    z                                             t          |           dk    rjt          j        d                              t          j        dk    t          j                            |           z                                             dS t          j        d                              t          j        dk                                               dS )a`  
    Syncs each user's Admin (Veteran) status with the ADMIN_USER_IDS env var.
    Telegram user ids listed there (space separated) are granted Admin status; any user
    currently marked as Admin whose id is no longer listed has it revoked. To appoint someone,
    add their Telegram user id to the env var. To revoke, remove it
    :return: None
    z4Invalid Telegram user id in ADMIN_USER_IDS env var: r   T)r:   FN)setEnvADMIN_USER_IDSgetsplitaddrX   rS   rO   r+   r,   rs   r   r   whererT   in_r:   executenot_in)admin_user_idsraw_ids     r5   sync_admin_usersr   %  s     #uuN$((**0022 ] ]	]s3v;;//0000 	] 	] 	]O[SY[[\\\\\	] >QT"""((_  00T]e5KL	
 	

'))) >QU###))]d"t'='=n'M'MN	
 	

'))))) 	U###))$-4*?@@HHJJJJJs   /A22!BB)N)NNN)NNNN)r   N);r+   pathlibr   typingr   r   src.tg_compatr   r   r   r	   r
   r   r   TelegramUserr   src.tg_compat.constantsr   rP   r   r   r   src.tg_compat.extr   	constantsr)   resources.EnvironmentEnvironmentry   src.model.Groupr   src.model.GroupChatr   src.model.UnmutedUserr   src.model.Usersrc.model.enums.BossTyper   src.model.enums.LeaderboardRankr   src.model.error.CustomExceptionr   src.service.leaderboard_servicer   src.utils.download_utilsr   rX   r6   rA   boolrD   rF   rJ   DEFAULT_TYPErW   rc   rg   rv   r   rj   rB   r5   <module>r      s          % % % % % % % % Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y G G G G G G G G 4 4 4 4 4 4 B B B B B B B B B B * * * * * *     # # # # # # ! ! ! ! ! ! ) ) ) ) ) ) - - - - - -       - - - - - - 7 7 7 7 7 7 C C C C C C H H H H H H < < < < < < 37- --#/-4Z- - - -`  ) x$    8& & & & & &7 7t 7 7d 7 7 7 7 )     4 )-2 2
22 2 &	2
 2 $2 2 2 2n )-  
 & 	
  
   4 )-  
 & 	
  
   0-2 -25<-2-2 -2 -2 -2`K K K K K KrB   