
    .iO                       d Z ddlZ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mZ ddlmZmZ  ed      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l-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z<  G d d      Z=ddddddd d!d"dd#d d$d%dd&Z>d*d(Z? G d) d'      Z@y# e$ r	 ddlZdZY w xY w)+z#Main Bot class with event handlers.    N)Path)DictListOptionalUnionAny)setup_loggerlogger
liforrabot)datetime	timedeltatimezone)defaultdict)app_commands)ConfigManager)AltsHandler)	IPHandler)LoggingHandler)
LogHandler)OAuthHandler)PhoneHandler)WordStatsHandler)MCServerHandler)UserCommands)AdminCommands)SWEAR_WORDS
SLUR_WORDSASTEROIDE_BOT_ID)split_messagecalculate_edit_percentageis_likely_typo)SteamLocationHandler)HealthCheckc                   Z    e Zd ZdZddedefdZd Zd ZdefdZ	d	e
j                  fd
Zy)PaginationViewz2Pagination view with buttons for navigating pages.embedstimeoutc                     || _         || _        d| _        d | _        || _        | j                   j
                  j                  | j                        | _        | j                          y )Nr   r'   )	discordr&   current_pagemessager'   uiViewview_create_view)selfr&   discord_moduler'   s       R/home/liforra/rclone/mounts/hetzner/services/copyparty/copyparty/LiforraBot/bot.py__init__zPaginationView.__init__3   sS    %LLOO(((>	    c                    | j                   j                  j                  d| j                   j                  j                        }| j                  d      |_        | j                  j                  |       | j                   j                  j                  d| j                   j                  j                        }| j                  | j                  dz
        |_        | j                  j                  |       | j                   j                  j                  d| j                   j                  j                        }| j                  | j                  dz         |_        | j                  j                  |       | j                   j                  j                  d| j                   j                  j                        }| j                  t        | j                        dz
        |_        | j                  j                  |       | j                   j                  j                  d| j                   j                  j                        }| j                  |_        | j                  j                  |       | j                          y	)
z)Creates the discord.ui.View with buttons.u   ⏮️)labelstyler   u   ◀️   u   ▶️u   ⏭️u   🗑️N)r*   r-   ButtonButtonStylegray_go_to_page_callbackcallbackr/   add_itemprimaryr+   lenr&   danger_delete_callback_update_buttons)r1   	first_btnprev_btnnext_btnlast_btn
delete_btns         r3   r0   zPaginationView._create_view<   s    LLOO**AYAYA^A^*_	!66q9			9%<<??))@X@X@`@`)a 55d6G6G!6KL		8$<<??))@X@X@`@`)a 55d6G6G!6KL		8$<<??))@X@X@]@])^ 55c$++6F6JK		8$\\__++)4<<C[C[CbCb+c
"33
		:&r5   c                 |   | j                  d      | j                  j                  d   _        | j                  | j                  dz
        | j                  j                  d   _        | j                  | j                  dz         | j                  j                  d   _        | j                  t        | j                        dz
        | j                  j                  d   _        | j                  dk(  | j                  j                  d   _        | j                  dk(  | j                  j                  d   _        | j                  t        | j                        dz
  k\  | j                  j                  d   _        | j                  t        | j                        dz
  k\  | j                  j                  d   _        y)z:Updates button states and callbacks based on current page.r   r9         N)r=   r/   childrenr>   r+   rA   r&   disabled)r1   s    r3   rD   zPaginationView._update_buttonsU   sW   )-)B)B1)E		1&)-)B)B4CTCTWXCX)Y		1&)-)B)B4CTCTWXCX)Y		1&)-)B)B3t{{CSVWCW)X		1&)-):):a)?		1&)-):):a)?		1&)-):):c$++>NQR>R)R		1&)-):):c$++>NQR>R)R		1&r5   page_numberc                 8     dt         j                  f fd}|S )Ninteractionc           	         K   t        dt        t        j                        dz
              _        j                          | j                  j                  j                  j                     j                         d {    y 7 w)Nr   r9   )embedr/   )	maxminrA   r&   r+   rD   responseedit_messager/   )rQ   rO   r1   s    r3   r>   z5PaginationView._go_to_page_callback.<locals>.callbackb   sl      #As;DKK8H18L'M ND  "&&33$++dFWFW:X_c_h_h3iiis   BBBB)r*   Interaction)r1   rO   r>   s   `` r3   r=   z#PaginationView._go_to_page_callbacka   s    	j(;(; 	j r5   rQ   c                 T   K   |j                   j                          d {    y 7 wN)r,   delete)r1   rQ   s     r3   rC   zPaginationView._delete_callbackh   s     !!((***s   (&(N)   )__name__
__module____qualname____doc__r   intr4   r0   rD   r=   r*   rX   rC    r5   r3   r%   r%   0   sA    <t c 2
S +'2E2E +r5   r%   zHamburg, Germanydez	google.de)locationhlglgoogle_domainzAustin, Texas, United Statesenusz
google.comzLondon, England, United Kingdomukzgoogle.co.uk)GermanyzUnited StateszUnited KingdomBotc                    ddl ddlmm ddlm j                  j                  dd      j                  j                  ddd      | j                  dd	
      j                  j                  d      ddt        j                  dt        ffd                            }j                  j                  dd      j                  j                  ddd      | j                  dd
      j                  j                  d      ddt        j                  dt        ffd                            }j                  j                  dd      j                  j                  ddd      | j                  dd
      j                  j                  ddd      j                  j                  j                  j                  dd      j                  j                  dd      gj                  j                  dd      j                  j                  d d!      g"      ddt        j                  d#t         d$t         dt        ffd%                                   }j                  j                  dd      j                  j                  ddd      | j                  d&d'
      j                  j                  d(d)d*d+d,d-      j                  j                  j                  j                  d.d/      j                  j                  d0d1      j                  j                  d2d3      j                  j                  d4d5      j                  j                  d6d7      g8      	 	 	 	 	 ddt        j                  d9t         d:t"        t        j$                     d7t"        t            d;t&        d<t        dt        ffd=                                   }j                  j                  dd      j                  j                  ddd      | j                  d>d?
      j                  j                  d@dA      	 	 ddt        j                  dBt&        dt        ffdC                            }j                  j                  dd      j                  j                  ddd      | j                  dDdE
      j                  j                  d      ddt        j                  dt        ffdF                            }j                  j                  dd      j                  j                  ddd      | j                  dGdH
      j                  j                  d      ddt        j                  dt        ffdI                            }j                  j                  dd      j                  j                  ddd      | j                  dJdK
      j                  j                  dLdM      ddt        j                  dNt         dt        ffdO                            }	j                  j                  dd      j                  j                  ddd      | j                  dPdQ
      j                  j                  dRdM      ddt        j                  dNt         dt        ffdS                            }
j                  j                  dd      j                  j                  ddd      | j                  dTdU
      j                  j                  dVdW      ddt        j                  dXt&        dt        ffdY                            }j                  j                  dd      j                  j                  ddd      | j                  dZd[
      j                  j                  d\d]      ddt        j                  d^t         dt        ffd_                            }j                  j                  dd      j                  j                  ddd      | j                  d`da
      j                  j                  d      ddt        j                  dt        ffdb                            }j                  j                  dd      j                  j                  ddd      | j                  dcdd
      j                  j                  dedfdg      j                  j                  j                  j                  dhdi      j                  j                  djdk      j                  j                  dldm      gn      	 	 ddt        j                  dot         dpt         dt        ffdq                                   }j                  j                  dd      j                  j                  ddd      | j                  drds
      j                  j                  dtdu      ddt        j                  dot         dt        ffdv                            }j                  j                  dd      j                  j                  ddd      | j                  dwdx
      j                  j                  dydzd{      ddt        j                  dot         d|t        dt        ffd}                            }j                  j                  dd      j                  j                  ddd      | j                  d~d
      j                  j                  dd      ddt        j                  dt         dt        ffd                            }j                  j                  dd      j                  j                  ddd      | j                  dd
      j                  j                  dd      ddt        j                  dJt         dt        ffd                            }j                  j                  dd      j                  j                  ddd      | j                  dd
      j                  j                  d      ddt        j                  dt        ffd                            }j                  j                  dd      j                  j                  ddd      | j                  dd
      j                  j                  d      ddt        j                  dt        ffd                            }j                  j                  dd      j                  j                  ddd      | j                  dd
      j                  j                  d      ddt        j                  dt        ffd                            }y)z)Registers all slash commands for the bot.r   N)format_alt_nameis_valid_ip)COUNTRY_FLAGST)guildsusers)rq   dmsprivate_channelstrumpzGet a random Trump quote)namedescriptionz.Show the response only to you (default: False))
_ephemeralFrQ   rx   c                 r  K   j                  | j                  j                  t        | j                        dg d       j	                  | j                  j                         d {   sS| j
                  j                  j                  j                  | j                  j                        d       d {    y | j
                  j                  |       d {    	 j                         4 d {   }|j                  dd       d {   }|j                          |j                         j                  dd	      }d d d       d {    t        j                   d
 dd      }|j#                  dd       |j%                  d       | j&                  j)                  ||       d {    y 7 W7 7 7 7 7 v# 1 d {  7  sw Y   xY w7 (# t*        $ rF}| j&                  j)                  dt-        |      j.                   |       d {  7   Y d }~y d }~ww xY ww)Nru   Tis_slash	ephemeralz7https://api.whatdoestrumpthink.com/api/v1/quotes/random
   r)   r,   zCould not retrieve a quote.z*"z"*i.. )rw   colorzDonald Trumpzhttps://i.imgur.com/GkZasg8.png)rv   icon_url!liforra.de | Liforras Utility bottextrS   r}      ❌ Error: )log_commanduseridstrcheck_authorizationrV   send_messageoauth_handlerget_authorization_messagementiondeferAsyncClientgetraise_for_statusjsonr*   Embed
set_author
set_footerfollowupsend	Exceptiontyper]   )	rQ   rx   clientrquoterS   ebothttpxs	          r3   trump_slashz,register_slash_commands.<locals>.trump_slash   s    
 	((++S1A1A-BGRZ^_,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K""((:(>>>
	d((* O Of **%^hj*kk""$Y0MNO O MM5'nHME.;\]"EF&&++%:+NNN B K>OkO O O O O 	d&&++k$q':J:J9K,LXb+ccc	ds   A&H7)G *AH7;G<$H7 G!H7&G% :G;G% >GG
4G
G% GA$G% :G#;G% ?H7H7H7G% 
GG% G GG G% %	H4.6H/$H'%H/*H7/H44H7techzGet a random tech tip or factc                 j  K   j                  | j                  j                  t        | j                        dg d       j	                  | j                  j                         d {   sS| j
                  j                  j                  j                  | j                  j                        d       d {    y | j
                  j                  |       d {    	 j                         4 d {   }|j                  dd       d {   }|j                          |j                         j                  dd	      }d d d       d {    t        j                   d
d      }|j#                  d       |j%                  d       | j&                  j)                  ||       d {    y 7 S7 7 7 7 7 r# 1 d {  7  sw Y   xY w7 (# t*        $ rF}| j&                  j)                  dt-        |      j.                   |       d {  7   Y d }~y d }~ww xY ww)Nr   Trz   r|   z%https://techy-api.vercel.app/api/jsonr~   r)   r,   zCould not retrieve a tech tip.u   💡 Tech Tipi  titlerw   r   zhttps://i.imgur.com/3Q3Q1aD.pngurlz8liforra.de | Liforras Utility bot | Powered by Techy APIr   r   r   )r   r   r   r   r   rV   r   r   r   r   r   r   r   r   r   r*   r   set_thumbnailr   r   r   r   r   r]   )	rQ   rx   r   r   r,   rS   r   r   r   s	          r3   
tech_slashz+register_slash_commands.<locals>.tech_slash   s     
 	((++S1A1A-BFBY]^,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K""((:(>>>
	d((* T Tf **%LVX*YY""$&&(,,y2RST T MMWT\]E$EF"\]&&++%:+NNN B K>TYT T T T O 	d&&++k$q':J:J9K,LXb+ccc	ds   A&H3)F<*AH3;F?<$H3 G!H3&G! :G;G! >G
G4G

G! GA G! 6G7G! ;H3?H3H3G! G
G! 
GGGG! !	H0*6H+ H#!H+&H3+H00H3factz"Get a random or daily useless factzType of factzLanguage (en or de))	fact_typelanguagerx   Randomrandomrv   valuezToday's FacttodayEnglishrh   Germanrc   )r   r   r   r   c                 l  K   j                  | j                  j                  t        | j                        d||gd       j	                  | j                  j                         d {   sS| j
                  j                  j                  j                  | j                  j                        d       d {    y | j
                  j                  |       d {    	 j                         4 d {   }|j                  d| d|id       d {   }|j                          |j                         }d d d       d {    j                  d	      r,| j                  j!                  d
|d	    |       d {    y g |j                  dg       }}t#        j$                  ddt&         dd|j                  di       j                  d            }	|	j)                  d       |j                  d      x}
r>|
j                  d      x}r+|	j+                  d|dd|
j                  dd       dd       |	j+                  dt,        d       |j                  d      x}r>|j                  d       x}r+|	j+                  d!|d d" t/        |      d"kD  rd#nd$z   d%       n|j                  d&      x}rz|j                  d'      x}rgd(| d(|j                  d)      x}rd*| d+nd$z   |j                  d,      x}rd-|d d. t/        |      d.kD  rd#nd$z    nd$z   }|	j+                  d/|d%       |r{|d0   }d1|j                  d'd2       d3|j                  d4d5       d6|j                  d7d8      d d9 t/        |j                  d7d8            d9kD  rd#nd$z    d+}|	j+                  d:|d%       |j1                  |	       |rt3        d0t/        |      d;      D ]  }|||d;z    |d;z  d<z   }}t#        j$                  d=| d>d?@      }|D ]x  }d+|j                  d7d8      d d. t/        |j                  d7d8            d.kD  rd#nd$z    dA|j                  d4d5       dB}|j+                  dC|j                  d'd2       |d%       z |j1                  |        t5        dD |D              s&| j                  j!                  dE|       d {    y t7        |      D ])  \  }}|j9                  dF|d<z    dGt/        |       H       + t/        |      d<kD  rt;        |j"                        nd }| j                  j!                  |d0   ||I       d {    y 7 7 7 7 l7 N7 !# 1 d {  7  sw Y   2xY w7 7 7 2# j<                  $ rG}| j                  j!                  d
|j
                  j>                   |       d {  7   Y d }~y d }~wt@        $ rF}| j                  j!                  dJtC        |      jD                   |       d {  7   Y d }~y d }~ww xY ww)KNr   Trz   r|   z*https://uselessfacts.jsph.pl/api/v2/facts/r   r~   paramsr'   error   ❌ API Error: organic_resultsu   🔍 Google Searchz**Query:** ``iB search_metadata
google_url)r   rw   r   r   zhttps://i.imgur.com/tEChjwx.pngr   search_informationtotal_resultsu
   📊 Stats,z
 results
(time_taken_displayedN/Azs)rv   r   inlineu   📍 Region
answer_boxansweru   💡 Quick Answeri  ... Fknowledge_graphr   **r   z __rw   
   u   📚 Knowledge Graphr   z**[zNo Titlez](link#z)**
_snippetzNo snippet available.   u   🏆 Top ResultrL   r9   zSearch Results (Page )iS4 r   r   z_
**[Read More](z)**u   📄 c              3   P   K   | ]  }|j                   xs |j                     y wrZ   )fieldsrw   ).0rS   s     r3   	<genexpr>z>register_slash_commands.<locals>.fact_slash.<locals>.<genexpr>   s"     MUu||8u'8'88Ms   $&u   ❌ No results found.z>liforra.de | Liforras Utility bot | Powered by SerpAPI | Page /r   rS   r/   r}   u"   ❌ An unexpected error occurred: )#r   r   r   r   r   rV   r   r   r   r   r   r   r   r   r   r   r   r*   r   queryr   	add_field	_languagerA   appendrangeany	enumerater   r%   HTTPStatusErrorstatus_coder   r   r]   ) rQ   r   r   rx   r   r   datar&   r   summary_embedinfor   r   r   kgkg_titlekg_typekg_desckg_texttop_hitr   ichunkpage_num
page_embedresult
value_textrS   r/   r   r   r   s                                  r3   
fact_slashz+register_slash_commands.<locals>.fact_slash   s      	((++S1A1A-BFYX`Lalpq,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K""((:(>>>4	{((*    f **'QR[Q\%]gqs{f|  GI*  J  J""$vvx   
 xx !**///$w-0Q]g/hhh&($((3Db*IOF#MM0DT`af`gghRiqy  @D  @H  @H  IZ  \^  @_  @c  @c  dp  @q  rM'',M'N!5666dhhWfNg=g]=g''\MRSCTT_`d`h`hi  BG  aH  `I  IK  BL  UY'  Z##iPT#U"hh|44
4Z^^T\E];]6;]''-@uPTbeflbmptbtY^z|H}  GL'  M!233"3bffWo:U(:Uxj+bffU[nC\7C\G9Acef  wy  w}  w}  ~K  wL  lL  ls  lLlnovw{x{o|  JM  NU  JV  Y\  J\  AF  bd  pe  of  kg  SU  V''-C7[`'a)!,gkk':>?r'++fVYBZA[[abibmbmnw  zQ  cR  SW  TW  cX  eh  ip  it  it  u~  @W  iX  eY  \_  e_  \a  eg  ch  bi  ij  k''->eTY'ZMM-(q#o"6: .A&5a!a%&@16Q,8E!(7LXJVW5X`h!iJ"' }'(I?V)WX\Y\)]jmntnxnx  zC  E\  o]  k^  ad  kdaf  jl  *m  )n  n  @F  @J  @J  KQ  SV  @W  X  X[  &\
",,E&**Wj:Y9Z2[cmv{,|} MM*-. MfMM!**//0GS]/^^^%f- |5  (fghijgjfkklmpqwmxly&z {| ;>f+/>&#++6tD&&++&)$R\+]]]g B K>  J        iB _ ^$$ 	n&&++oajj>T>T=U,Vbl+mmm 	{&&++.PQUVWQXQaQaPb,coy+zzz	{s/  A(X4+U,AX4=U">$X4"U%#X4(V <U(=V  U1U+$U1V U.;V 	V
V X4MV V
V X4BV VV X4"X4%X4(V +U1.V 1V7U:8V?	V 
V V X17WWWX4X1+6X,!X$"X,'X4,X11X4statszDisplay word usage statisticszStatistic to displayz(User to inspect (required for user mode)z(Word to inspect (required for word mode)z Number of entries to show (1-25)z&Restrict results to the current server)modetarget_userwordlimit
guild_onlyrx   zGlobal top wordsoverallzGuild top wordsguildzMost used wordmostzUser's top wordsr   z
Word usager   )r   r   r   r   r   c           	      <
  K   j                   }|r|j                  s&| j                  j                  dd       d {    y t	        dt        d|            }| j                  j                  |d       d {    g }d}	|dk(  r*|j                  |       d {   }d	t        |       d
}	n|dk(  r| j                  s&| j                  j                  d|       d {    y |j                  | j                  j                  |       d {   }d	t        |       d| j                  j                   }	n$|dk(  r|j                  d       d {   }d}	n|dk(  r|s&| j                  j                  d|       d {    y t        |d|j                        }
|r| j                  s&| j                  j                  d|       d {    y |j!                  | j                  j                  |j                  |       d {   }d	t        |       d|
 d| j                  j                   }	n&|j#                  |j                  |       d {   }d	t        |       d|
 d}	n|dk(  r|s&| j                  j                  d|       d {    y |j%                         }|rI| j                  s&| j                  j                  d|       d {    y | j                  j                  }nd }|j'                  |||       d {   }d| d|rd| j                  j                  z   nd }	n&| j                  j                  d|       d {    y |s.| j                  j                  d|	xs | d|       d {    y d|	 dg}|dk(  r|xr | j                  }t)        |d       D ]  \  }}d!|d"    d#}| j                  r,| j                  j+                  |d"         }|r|j,                  }|sJ|j/                  d$      }|sd%}n6j0                  j3                  |      }|rd&|j                   d'nd&| d'}nd}|j5                  | d(| d)|d*   d+|         n5t)        |d       D ]%  \  }}|j5                  | d,|d    d-|d*   d+       ' |j5                  d.       | j                  j                  d/j7                  |      |       d {    y 7 7 v7 W7 7 7 7 w7 /7 7 7 q7 07 7 7 7 2w)0N/   ❌ Word statistics database is not configured.Tr|   r9      r}   thinkingr   r   zTop z Words (Global)r   u+   ❌ This mode can only be used in a server.z
 Words in r   zMost Used Word (Global)r   u   ❌ Please specify a user.display_nameuC   ❌ Server-specific stats require running this command in a server.z Words for z in z	 (Global)r   u%   ❌ Please provide a word to inspect.z
Usage of `r   u   ❌ Unknown mode.u    ❌ No statistics available for .r   z:**)start<@user_id>guild_idz (DMs) (r   z. u    — countr   z. `u   ` — z$
*liforra.de | Liforras Utility bot*r   )word_stats_handler	availablerV   r   rT   rU   r   get_global_top_wordsrA   r   r   r   get_guild_top_wordsr   rv   getattrget_user_guild_top_wordsget_user_top_wordslowerget_word_usage_per_userr   
get_memberr   r   r   	get_guildr   join)rQ   r   r   r   r   r   rx   handlerentriesr   r   
word_valuer  linesguild_limitedidxrowuser_displaymembergid
guild_infor   itemr   s                          r3   stats_slashz,register_slash_commands.<locals>.stats_slash   sQ    : ((g//&&334equ3vvvAs2u~&""((:(MMM9#88??G3w<.8EW_$$!**//0]is/ttt#778I8I8L8LeTTG3w<.
;3D3D3I3I2JKEV^#88;;G-EV^!**//0LXb/ccc";@P@PQL"((%..334y  FP3  Q  Q  Q ' @ @ARARAUAUWbWeWegl mms7|nK~T+J[J[J`J`Iab ' : :;>>5 QQs7|nK~YOV^!**//0Wcm/nnnJ"((%..334y  FP3  Q  Q  Q&,,//#;;JxXXG AQYf{7H7H7M7M.M_a-bcE&&++,?:+VVV&&++.Nu}X\o]^,_ku+vvveWC!6>&<;+<+<M%gQ7 XS!#C	N#315$$(..99#i.IF'-':':$''*-C%-
 #

 4 4S 9;@r%**Q%73%qk
!#JuB|nE#g,q9I*VWX" 'wa8 O	TuCV~VDM!;LMNO 	<=""''		%(8J'OOOe w 	N @ uT < d
 Qm R o
 Q
 Y W w8 	Ps$  ;TS-;T:S0;!TS3AT#S6$.TS9ATS<0TS?	A
TT9TTATT>TTATT4TTATT/TTET'T(T0T3T6T9T<T?TTTTTTTTTTbackfillz)Backfill word statistics for this channelz,Number of days to backfill (1-30, default 7))daysrx   r#  c                 "  K   
j                   }|r|j                  s&| j                  j                  dd       d {    y t	        | j
                  j                        
j                  j                  vr&| j                  j                  dd       d {    y | j                  rt        | j                  d      s&| j                  j                  dd       d {    y d}d }||dk  rd	}n6d
| d}t        j                  t        j                        t!        |      z
  }| j                  j#                  |d       d {    d}	 | j                  j%                  d |d      2 3 d {   }|j&                  j(                  sC
j*                  r8|j&                  j                  
j*                  j
                  j                  k(  rc|j-                  | j                  j                  |j&                  j                  |j.                         d {    |dz  }|dz  dk(  st1        j2                  d       d {    7 7 7 r7 7 7 >7 6 n|# t4        $ rp}dj7                  t8        j;                  t=        |      ||j>                              }	| j@                  jC                  d|	d d  d|       d {  7   Y d }~y d }~ww xY w| j@                  jC                  d| d|xs d	 d|       d {  7   y w)Nr   Tr|   u%   ❌ Only bot admins can run backfill.historyu9   ❌ Backfill can only be used in regular server channels.r   r   zall available historyz	the last z day(s))r#  r   )r   afteroldest_firstr9   r   u   ❌ **Backfill failed:**
```py
  
```u!   ✅ Backfill complete. Processed z messages from r  )"r	  r
  rV   r   r   r   r   config	admin_idsr   hasattrchannelr   nowr   utcr   r   r%  authorr   r   record_messagecontentasynciosleepr   r  	tracebackformat_exceptionr   __traceback__r   r   )rQ   r#  rx   r  	span_textcutoff	processedr,   r   tb_strr   s             r3   backfill_slashz/register_slash_commands.<locals>.backfill_slashi  s     ((g//&&334equ3vvv{""#3::+?+??&&334[gk3lll  0C0CY(O&&334o{3  A  A  A	<419/I#D61I\\(,,/)2FFF""((:(MMM		!,!4!4!<!<4vdh!<!i + +g>>%%#**9J9JcjjooN`N`9`,,[->->-A-A7>>CTCTV]VeVefffQ	s?a'!--***= w m A 	N
+ g + "j  	WWY77QAOOTUF&&++.OPVW\X\P]^c,dpz+{{{	
 ""''/	{/)JnWnIoopq  ( 
 	
 	
s   ;LIALIAL!I"A)LILI! 1I5I6I9B#I! II! /I! II! LLLLII! I! I!  L!	K*A K
KKLK.LL	Lwebsitesz#Check status of configured websitesc                   K   
j                  | j                  j                  t        | j                        dg d       
j	                  | j                  j                         d {   sS| j
                  j                  
j                  j                  | j                  j                        d       d {    y | j
                  j                  |       d {    | j                  r| j                  j                  nd }
j                  j                  |dg | j                  j                  | j                  j                        }
j                  j                  |dg | j                  j                  | j                  j                        }t        j                   ddt#        j$                               }j'                         4 d {   }|rt)        j*                  |D cg c]  }|j-                  |d	
       c}ddi d {   }|j/                  ddj1                  t3        ||      D 	cg c]~  \  }}	t5        |	j6                        r+d|	j8                  cxk  rdk  rn nd| d|	j8                   dn7d| dt5        |	t:              rt=        |	      j>                  n|	j8                   d c}	}      d       |rt)        j*                  |D cg c]  }|j-                  |d	
       c}ddi d {   }|j/                  ddj1                  t3        ||      D 	cg c]~  \  }}	t5        |	j6                        r+d|	j8                  cxk  rdk  rn nd| d|	j8                   dn7d| dt5        |	t:              rt=        |	      j>                  n|	j8                   d c}	}      d       d d d       d {    |j@                  sd|_!        |jE                  d       | jF                  jI                  ||       d {    y 7 7 g7 E7 Sc c}w 7 c c}	}w c c}w 7 6c c}	}w 7 w# 1 d {  7  sw Y   xY w7 Dw)Nr=  Trz   r|   friend_websitesu   🌐 Website Statusۘ4 r   r   	timestampr~   r)   return_exceptionszMain Websitesr   r   i  u   🟢 `z` (r   u   🔴 `Fr   zFriends' WebsiteszNo websites configured.r   r   r   )%r   r   r   r   r   rV   r   r   r   r   r   r   r*  get_guild_configr-  r*   r   r   r.  r   r3  gatherheadr   r  zip
isinstanceResponser   r   r   r]   r   rw   r   r   r   )rQ   rx   r  sitesfriend_sitesrS   r   s	responsesr   r   r   s             r3   websites_slashz/register_slash_commands.<locals>.websites_slash  sE    
 	((++S1A1A-BJPR]ab,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K""((:(>>>&1&7&7k""T

++CRAQAQATATVaViViVlVlmzz2238I2{O_O_ObObdodwdwdzdz{$9U]UaUaUcd$$& 	| 	|&")..W\2]RS6;;q";3M2]"vqu"vv	_DII  KN  OT  V_  K`  Ga  CG  CD  FGjtuvx}  yG  yG  kH  MP  TU  Ta  Ta  Mg  dg  MgPQsRUVWVcVcUddeGf  ou  vw  ux  x{  PZ  [\  ^g  Ph  |@  AB  |C  |L  |L  no  n{  n{  {|  |}  m~  H~  Ga  =b  kp  q")..Wc2dRS6;;q";3M2d"}x|"}}	%8		  OR  S_  aj  Ok  Kl  GK  GH  JKnxyz  }B  }K  }K  oL  QT  XY  Xe  Xe  Qk  hk  QkVTUSVVYZ[ZgZgYhhiKj  sy  z{  y|  |  T^  _`  bk  Tl  @D  EF  @G  @P  @P  rs  r  r  @  @A  qB  LB  Kl  Am  v{  |	| 	| || 9EAB""''ez'JJJ- B K>	|2]v Ga2d} Kl	| 	| 	| 	| 	Ks   A&Q )P*AQ ;P"<$Q  P%!C4Q P(Q Q	/P+
	
Q	P0*Q	>BP3#Q	$P9
>
Q	P>	*Q	3BQ6Q	Q QA	Q QQ "Q %Q (Q +Q	3Q	Q	Q 	QQQQ pingszPing configured devicesc                   K   j                  | j                  j                  t        | j                        dg d       j	                  | j                  j                         d {   sS| j
                  j                  j                  j                  | j                  j                        d       d {    y | j
                  j                  |       d {    d }g d}t        j                  |D cg c]
  } ||       c}  d {   }t        j                  ddt        j                          	      }|D ]  \  }}}	|j#                  ||d
        t%        d |D              }
|j'                  d|
 dt)        |       d       | j*                  j-                  ||       d {    y 7 T7 7 c c}w 7 7 w)NrO  Trz   r|   c           
      R  K   t        j                  ddddd| t         j                  j                  t         j                  j                         d {   }|j	                          d {    | j                  dd      |j                  dk(  rd	nd
|j                  dk(  fS 7 O7 9w)Npingz-c1z-W)stdoutstderrz.liforra.der   r   u   🟢 Onlineu   🔴 Offline)r3  create_subprocess_exec
subprocessPIPEwaitreplace
returncode)hps     r3   _pingz;register_slash_commands.<locals>.pings_slash.<locals>._ping  s     44VT3cST]d]o]o]t]t  ~E  ~P  ~P  ~U  ~U  V  VA&&(NNIImR01<<STCT-Zhjkjvjvz{j{|| Vs$   AB'B#B'+B%,8B'%B')zalhena.liforra.dezsirius.liforra.dezchaosserver.liforra.dezantares.liforra.deu   🖥️ Device Statusq. rA  r   c              3   .   K   | ]  \  }}}|s
d   yw)r9   Nrb   )r   r   	is_onlines      r3   r   z?register_slash_commands.<locals>.pings_slash.<locals>.<genexpr>  s     IAyy1Is   z$liforra.de | Liforras Utility bot | r   z devices onliner   r   )r   r   r   r   r   rV   r   r   r   r   r   r3  rE  r*   r   r   r.  r   sumr   rA   r   r   )rQ   rx   r^  devicesdevresultsrS   rv   statusr   online_countr   s              r3   pings_slashz,register_slash_commands.<locals>.pings_slash  s    
 	((++S1A1A-BGRZ^_,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K""((:(>>>	}
 mw(Gs(GHH$;8W_WcWcWef& 	BOD&!OOVDOA	B IGII D\NRSTWX_T`Saapqr""''ez'JJJ' B K> )HH 	Ksh   A&G)F=*AG;G <$G G!G?GGG
B!G7G8G GGGGipz#Get information about an IP addressz(The IP address to look up (IPv4 or IPv6))addressrx   rj  c                 R  K   j                  | j                  j                  t        | j                        d|gd       j	                  | j                  j                         d {   sS| j
                  j                  j                  j                  | j                  j                        d       d {    y j                  | j                  j                  ddd      \  }}|s*| j
                  j                  d| d	d       d {    y | j
                  j                  |       d {     |      s&| j                  j                  d
|       d {    y j                  j                  |       d {   }|s*| j                  j                  d| d|       d {    y j!                  |j!                  dd      d      }t#        j$                  | dd| ddt'        j(                               }ddlm}  ||      s
d| |_        dj1                  t3        d |j!                  d      |j!                  d      |j!                  d       d|j!                  d       dg            }	|	r|j5                  d|	d        d!j1                  t3        d |j!                  d"      rd#|j!                  d"       nd |j!                  d$      rd%|j!                  d$       nd g            }
|
r|j5                  d&|
d        g }j                  j7                  |j!                  d"d      |j!                  d'd            x}r|j9                  d(|        n"|j!                  d)      r|j9                  d*       |j!                  d+      r|j9                  d,       |r#|j5                  d-d!j1                  |      d        |j;                  d./       | j                  j                  ||0       d {    y 7 7 W7 7 7 7 7 m7 w)1Nri  Trz   r|   r~   <   r   window(   ⏱️ Rate limit exceeded. Please wait 	 seconds.   ❌ Invalid IP address format.u   ❌ Failed to fetch info for ``.countryCoder      🌐z IP Information**IP Address:** `r   r@  r   rw   r   rB  r   )is_valid_ipv6z!https://whatismyipaddress.com/ip/, city
regionNamecountryr  r      📍 LocationFr   r   isp	**ISP:** asz**AS:**    🌐 Networkorgu   🔒 **VPN Provider:** proxyu   🔒 **Proxy/VPN Detected**hostingu   ☁️ **Hosting Service**u   🛡️ Securityz9liforra.de | Liforras Utility bot | Powered by ip-api.comr   r   )r   r   r   r   r   rV   r   r   r   r   check_rate_limitr   r   r   
ip_handlerfetch_ip_infor   r*   r   r   r.  utils.helpersrw  r   r  filterr   detect_vpn_providerr   r   )rQ   rj  rx   
is_allowed	wait_timeip_dataflagrS   rw  locnet	sec_flagsvpnrp   r   ro   s                r3   ip_slashz)register_slash_commands.<locals>.ip_slash  s\    
 	((++S1A1A-BD7)^bc,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K # 4 4[5E5E5H5H$VXac 4 d
I&&336^_h^iir4s  @D3  E  E  E""((:(>>>7#&&++,LXb+ccc44W==&&++.LWIUW,Xdn+ooo  ]B!?HtfO$<L]^e]ffgJhpx  EM  EQ  EQ  ES  T/W%;G9EEIiitgkk&&97;;|;TY`YdYdenYoXpprszs~s~  @M  tN  sO  OP  WQ  &R  S  TOOEOJiit'++V[J\	'++e2D1E&Fbf  KR  KV  KV  W[  K\jrszs~s~  @D  tE  sF  iG  bf  &g  h  iOOs5OI	..44W[[5KW[[Y^`bMcdd3d6se<=[[!:;;;y!9:OO!3499Y;OX]O^YZ""''ez'JJJ[ B K
 E 	? d >o8 	Ks   A'P'*P+AP'<P=AP'P$P'9P:,P'&P'#P'
P*P'5P"6IP'
P%P'P'P'P'P'P'"P'%P'ipdbinfoz0Get cached information about an IP from databasezThe IP address to look upc                   K   
j                  | j                  j                  t        | j                        d|gd       
j	                  | j                  j                         d {   sS| j
                  j                  
j                  j                  | j                  j                        d       d {    y |
j                  j                  vr*| j
                  j                  d| d|       d {    y 
j                  j                  |   }	j                  |j                  dd      d	      }t        j                  | d
d| dd      }t        t!        j"                  |j                  d            j%                               }|j'                  dd| d       dj)                  t+        d |j                  d      |j                  d      |j                  d       d|j                  d       dg            }|r|j'                  d|d       dj)                  t+        d |j                  d      rd|j                  d       nd |j                  d       rd!|j                  d        nd g            }|r|j'                  d"|d       |j-                  d#$       | j
                  j                  ||%       d {    y 7 q7 "7 7 w)&Nr  Trz   r|      ❌ No data for `z` in database.rs  r   rt  z Cached IP Informationru  r   Y r   last_updatedzLast Updated<t::R>r   rx  ry  rz  r{  r  r   r|  Fr   r   r}  r~  r  z	**Org:** r  r   r   r   )r   r   r   r   r   rV   r   r   r   r   r  ip_geo_datar   r*   r   ra   r   fromisoformatrB  r   r  r  r   )rQ   rj  rx   geor  rS   tsr  r  rp   r   s            r3   ipdbinfo_slashz/register_slash_commands.<locals>.ipdbinfo_slash  s    
 	((++S1A1A-BJQXPYdhi,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K#..444&&336GyP^4_ku3vvvnn((1  !;VDtf,B$CSdeldmmnQow  A''(?@JJLM^SC=Aiitcggfosww|7LQTQXQXYbQcPddfgjgngno|g}f~~  OA  &B  C  DOOEOJiitcggen	#''%.1A&BZ^  AD  AH  AH  IN  AObklolslstylzk{`|  UY  &Z  [  \OOs5OIAB""//ez/RRR- B K w" 	SsK   A'K&*K+AK&<K=AK&>K!?GK&K$K&K&!K&$K&ipdblistzList all cached IPs in databasezPage number (default: 1))pagerx   r  c                 J  K   j                  | j                  j                  t        | j                        dt        |      gd       j	                  | j                  j                         d {   sS| j
                  j                  j                  j                  | j                  j                        d       d {    y | j
                  j                  |       d {    t        j                  j                  j                               }|s&| j                  j!                  d|       d {    y d}t#        |      |z   dz
  |z  }g }t%        d|dz         D ]  }|dz
  |z  }t'        j(                  dd	d
      }	|	j+                  dt#        |       ddj-                  ||||z    D 
cg c]  }
j                  j/                  |
       c}
      d       |	j1                  d| d|        |j3                  |	        t#        |      dkD  rt5        |j&                        nd }d|dz
  cxk  rt#        |      k  rn n|dz
  nd}|r||_        | j                  j!                  ||   ||       d {    y 7 7 7 7 [c c}
w 7 w)Nr  Trz   r|   u   ❌ No IPs in database.   r9   u   🗄️ IP DatabasezShowing cached IP addressesr  r   zIP Addresses (z total)r   Fr   )liforra.de | Liforras Utility bot | Page r   r   r   r   )r   r   r   r   r   rV   r   r   r   r   r   sortedr  r  keysr   r   rA   r   r*   r   r   r  format_ip_with_geor   r   r%   r+   )rQ   r  rx   ipsper_pagetotal_pagesr&   r   r  rS   ri  r/   page_to_showr   s                r3   ipdblist_slashz/register_slash_commands.<locals>.ipdblist_slash,  s    
 	((++S1A1A-BJQTUYQZP[fjk,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K""((:(>>>S^^//4467&&++,EQ[+\\\3x(*Q.8;aq1 	!H\X-EMM(=MhqyzEOO>#c(7!C499  GJ  KP  QV  W_  Q_  G`  Va  ACVYVdVdVwVwxzV{  Va  Lb  kpO  q$MhZWXYdXe"fgMM% 	! 7:&kAo~fckk24#$q#>3v;#>taxA ,D""''f\.BYc'ddd1 B K> ] Va 	esj   A0J#3J4AJ#J$J#*J+AJ#>J?A=J#<"JB,J#
J!J#J#J#J#J#
ipdbsearchz#Search IPs by country, city, or ISPzSearch term)termrx   r  c                   K   j                  | j                  j                  t        | j                        d|gd       j	                  | j                  j                         d {   sS| j
                  j                  j                  j                  | j                  j                        d       d {    y | j
                  j                  |       d {    |j                         }j                  j                  j                         D cg c]P  \  }}|dj                  t!        d dD cg c]  }|j#                  |       c}            j                         v sO|R }}}}|s*| j$                  j'                  d| d|       d {    y d	}t)        |      |z   d
z
  |z  }	g }
t+        d
|	d
z         D ]  }|d
z
  |z  }t-        j.                  d| ddt)        |       dd      }|j1                  ddj                  ||||z    D cg c]  }j                  j3                  |       c}      d       |j5                  d| d|	        |
j7                  |        t)        |
      d
kD  rt9        |
j,                        nd }| j$                  j'                  |
d   ||       d {    y 7 _7 7 c c}w c c}}}w 7 Ac c}w 7 "w)Nr  Trz   r|    )r{  rz  ry  r}  r  u   ❌ No IPs found matching 'z'.r  r9   u   🔍 Search Results for ''zFound z matching IP(s)i"~ r   zMatching IPsr   Fr   r  r   r   r   r   )r   r   r   r   r   rV   r   r   r   r   r   r  r  r  itemsr  r  r   r   r   rA   r   r*   r   r   r  r   r   r%   )rQ   r  rx   search_termri  r  kre  r  r  r&   r   r  rS   r/   r   s                  r3   ipdbsearch_slashz1register_slash_commands.<locals>.ipdbsearch_slashL  s.    
 	((++S1A1A-BLSWRXcgh,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K""((:(>>>jjl%(^^%?%?%E%E%G  A  A'"c;Z]ZbZbcijn  Fu  qv  ABqtqxqxyzq{  qv  dw  [x  [~  [~  [@  L@2  A  A&&++.I$r,R^h+iii7|h.2x?aq1 	!H\X-EMM*CD6(K[abefmbnaoo~Y  HP  QEOOtyyryz  AF  GO  AO  sP  BQln#..BcBcdfBg  BQ  8R  [`O  a$MhZWXYdXe"fgMM% 	! 7:&kAo~fckk24""''fQidj'YYY/ B K> qv  A j BQ
 	Zs   A'K(*K	+AK(<K=$K(!K"<K(K<KK/K3*K(KBK("K!BK(K&K(K(K(KK(!K(	ipdbstatszShow IP database statisticsc                   K   j                  | j                  j                  t        | j                        dg d       j	                  | j                  j                         d {   sS| j
                  j                  j                  j                  | j                  j                        d       d {    y t        j                  j                        }j                  j                  j                         D ch c]%  }|j                  d      s|j                  d      ' }}t        fdj                  j                  j                         D              }t        d j                  j                  j                         D              }t!        j"                  dd	t%        j&                         
      }|j)                  dd| dd       |j)                  ddt        |       dd       |j)                  dd| dd       |j)                  dd| dd       |j+                  d       | j
                  j                  ||       d {    y 7 7 c c}w 7 w)Nr  Trz   r|   rs  c              3      K   | ]T  }j                   j                  |j                  d d      |j                  dd            s|j                  d      sQd V yw)r}  r   r  r  r9   N)r  r  r   )r   r  r   s     r3   r   zCregister_slash_commands.<locals>.ipdbstats_slash.<locals>.<genexpr>w  s       lcCNNLnLnorovovw|  A  pB  DG  DK  DK  LQ  SU  DV  MW  [^  [b  [b  cj  [k  ls   AAAc              3   D   K   | ]  }|j                  d       sd  yw)r  r9   Nr   )r   r  s     r3   r   zCregister_slash_commands.<locals>.ipdbstats_slash.<locals>.<genexpr>x  s     c#PSPWPWXaPbAcs     u   📊 IP Database Statisticsi rA  z	Total IPsr   r   zUnique Countriesz	VPN/ProxyzVPS/Hostingr   r   r   )r   r   r   r   r   rV   r   r   r   r   rA   r  r  valuesr   rb  r*   r   r   r.  r   r   )	rQ   rx   	total_ipsr  	countries	vpn_counthosting_countrS   r   s	           r3   ipdbstats_slashz0register_slash_commands.<locals>.ipdbstats_slashk  s"    
 	((++S1A1A-BKQS^bc,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K223	7:~~7Q7Q7X7X7Zu^a^e^efs^tSWW]+u	u  lS^^%?%?%F%F%H  l  l	c)C)C)J)J)Lcc$A]e]i]i]kl["YKr0B4P/C	N;K27NW[\["YKr0B4P]B}oR2HQUVAB""//ez/RRR B K v 	SsK   A&I4)I'*AI4;I*<A
I4I-I-0D1I4!I2"I4*I4-I4
playerinfoz'Get detailed information about a playerzThe username or ID to look upzThe platform/account type)usernameaccount_typerx   	Minecraft	minecraftSteamsteamXboxxbox)r  r  r  c                   K   j                  | j                  j                  t        | j                        d||gd       j	                  | j                  j                         d {   sS| j
                  j                  j                  j                  | j                  j                        d       d {    y | j
                  j                  |       d {    |j                         }	 |dk(  r7|j                         s'j                  j                  |       d {   x}r|}d| d| }j                         4 d {   }|j!                  |dd	id
       d {   }|j#                          |j%                         }|j!                  d      dk7  rK| j&                  j)                  d|j+                          d| d|       d {   cd d d       d {    S |d   d   }	|dk(  r'j                  j-                  |	j.                        }
nW|dk(  r'j                  j1                  |	j.                        }
n+|dk(  r&j                  j3                  |	j.                        }

r&| j&                  j)                  |
|       d {    n%| j&                  j)                  d|       d {    d d d       d {    y 7 p7 !7 7 7 7 |7 7 7 S7 /7 !# 1 d {  7  sw Y   y xY w# j4                  $ r}|dk(  rad|j
                  j6                  cxk  rdk  rBn n?| j&                  j)                  d|j
                  j6                   d|       d {  7   nB| j&                  j)                  d|j
                  j6                   |       d {  7   Y d }~y Y d }~y d }~wt8        $ rr}dj;                  t<        j?                  tA        |      ||jB                              }d|d d  d}| j&                  j)                  ||       d {  7   Y d }~y d }~ww xY ww) Nr  Trz   r|   r  zhttps://playerdb.co/api/player/r   z
User-Agentzhttps://liforra.der~   headersr'   codezplayer.foundu   ❌ z
 account `z` not foundr   playerr  r  r   u)   ❌ Failed to generate player info embed.i  X  u+   ❌ The Xbox lookup API returned an error (z ). It might be temporarily down.r   r   ,   ❌ **An unexpected error occurred:**
```py
r(  r)  )"r   r   r   r   r   rV   r   r   r   r   r   r  isdigituser_commands_handler_resolve_steam_vanity_urlr   r   r   r   r   r   
capitalize_format_minecraft_infor*   _format_steam_info_format_xbox_infor   r   r   r  r5  r6  r   r7  )rQ   r  r  rx   resolved_idr   r   rV   r   r  rS   r   r;  error_messager   r   s                 r3   playerinfo_slashz1register_slash_commands.<locals>.playerinfo_slash  s5    & 	((++S1A1A-BLS[]iRjuyz,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K""((:(>>>#))+,	Qw&x/?/?/A(+(A(A([([\d(e"ee;e*H3L>8*MC((* w wf!')+?@ ", " 
 ))+}}88F#~5!,!5!5!:!:|6689H:[Y", "; " w w w fh/;.55LLVUXU`U`aE!W,55HHQTQ\Q\]E!V+55GGPSP[P[\E%..33%:3VVV%..334_ku3vvv7w w w B K> #f
ww2 Wv7w w w w: $$ 	rv%#1G1G*M#*M!**//2]^_^h^h^t^t]u  vV  1W  cm/  n  n  n!**///!**BXBXAY0Zfp/qqq n  	QWWY77QAOOTUFLVTYUY]O[`aM&&++MZ+PPP	Qsm  A(Q+K,AQ=K>$Q"K!#Q83L +K$,$L K'L K9.K*/A-K9K-K9 L ,K0-L 1Q2B-K9K3 %K9K5K9
L K7L QQ!Q$L 'L *K9-K90L 3K95K97L 9L?L LL 
QL QAO
<M?==O
:N=;O
 
Q
QA"Q8P;9Q>QQQnamehistoryz*Get complete Minecraft name change historyz!The Minecraft username to look up)r  rx   c           
      X	  K   j                  | j                  j                  t        | j                        d|gd       j	                  | j                  j                         d {   sS| j
                  j                  j                  j                  | j                  j                        d       d {    y | j
                  j                  |       d {    	 j                         4 d {   }|j                  d| d       d {   }|j                          |j                         }d d d       d {    j                  d      sG| j                  j!                  d	t"        j$                  j'                  |       d
|       d {    y t"        j$                  j'                  |      }t#        j(                  d| d| d      }|j                  d      x}r|j+                  dd| dd       |j                  d      x}	rV	 t-        j.                  |	j1                  dd            }
t3        |
j5                               }|j+                  dd| d       t7        |d   d       }g }|D ]  }t"        j$                  j'                  |d         }|j                  d      x}rX	 t-        j.                  |j1                  dd            }t3        |j5                               }|j9                  d| d | d!       |j9                  d| d$        d%j;                  |      |_        |j?                  d&'       | j                  j!                  ||(       d {    y 7 7 7 7 7 t7 G# 1 d {  7  sw Y   XxY w7 	#  Y :xY w#  |j9                  d| d"|d d#         Y GxY w7 Z# j@                  $ rG}| j                  j!                  d)|j
                  jB                   |       d {  7   Y d }~y d }~wtD        $ rr}d*j;                  tF        jI                  tK        |      ||jL                              }d+|d d,  d-}| j                  j!                  ||       d {  7   Y d }~y d }~ww xY ww).Nr  Trz   r|   z,https://liforra.de/api/namehistory?username=r  r)   r%  u   ❌ No name history found for `rr  u   📜 Name History for zhttps://namemc.com/profile/r  )r   r   r   uuidu	   🆔 UUIDr   Fr   last_seen_atZ+00:00u   👁️ Last Seenr  r  r   c                 &    | j                  dd      S )Nr   r   r  )xs    r3   <lambda>zDregister_slash_commands.<locals>.namehistory_slash.<locals>.<lambda>  s    AEE$N r5   )keyrv   
changed_atu   • **z** - <t:z:D>z** - r~   z** - Original Namer   z=liforra.de | Liforras Utility bot | Powered by liforra.de APIr   r   r   r   r  r(  r)  )'r   r   r   r   r   rV   r   r   r   r   r   r   r   r   r   r   r   r*   utilsescape_markdownr   r   r   r  rZ  ra   rB  r  r   r  rw   r   r   r   r   r5  r6  r   r7  )rQ   r  rx   r   r   r   safe_usernamerS   r  last_seen_strlast_seen_dtlast_seen_tsr%  changes_textentry	safe_namets_strts_dtr  r   r;  r  r   r   s                         r3   namehistory_slashz2register_slash_commands.<locals>.namehistory_slash  sv    
 	((++S1A1A-BMT\S]hlm,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K""((:(>>>,	Q((*    f **'ST\S]%^hj*kk""$vvx   
 88I&!**//2QRYR_R_RoRopxRyQzz|0}  JT/  U  U  U#MM99(CMMM*@(PXst|s}V~  GO  PExx''t'[!D6ER $ 88}8#+#9#9-:O:OPSU]:^#_L#&|'='='?#@LOO)<c,WZD[O\ T)_2JKGL  
P#MM99%-H	"YY|4464T ( 6 6v~~c87T U !23$++fYKxt3,OP !''&;M(NO
P !%		, 7E"ab&&++%:+NNNW B K> k        U T$++fYKuVCR[M,RS O$$ 	n&&++oajj>T>T=U,Vbl+mmm 	QWWY77QAOOTUFLVTYUY]O[`aM&&++MZ+PPP	Qs@  A'R**N+AR*<N=$R*!N"R*'O ;N
<O ?NN$N>O 	N
AO  N)!O %R*&A;O "AN, 7AO AN4A O ;O<O  R*R*R*
O NO N&NN&!	O ,N1.O 4OO R''7P)P!P)$R*)R'5A"R"RR"R*"R''R*altszLook up a user's known altszThe username to look upz*[ADMIN] Show IP addresses (default: False))r  _iprx   r  c           	      
  K   j                  | j                  j                         d {   sS| j                  j	                  j
                  j                  | j                  j                        d       d {    y j                  | j                  j                  ddd      \  }}|s*| j                  j	                  d| dd       d {    y | j                  j                  |       d {    j                  | j                  j                  t        | j                        d|t        |      gd	       |}d }j                  j                  j                         D ci c]  }|j                         | }	}|d
| d| fD ])  }
|
j                         |	v s|	|
j                            } n |s*| j                   j#                  d| d|       d {    y j                  j                  |   }t%        t'        |j)                  dt+                                 }t%        t'        |j)                  dt+                                 }t        | j                  j                        j,                  j.                  v }|xr |}g }d } ||j)                  d            } ||j)                  d            }g }|j1                  |d| dnd       |j1                  |d| dnd       t3        j4                  dt2        j6                  j9                  |       ddj;                  |            }|j1                  |       |rt=        dt?        |      d      D ]q  }|||dz    }t3        j4                  dt?        |       d|dz  d z    d!      }dj;                  |D cg c]
  } |       c}      |_         |j1                  |       s |r|rt=        dt?        |      d"      D ]  }|||d"z    }t3        j4                  d#t?        |       d|d"z  d z    d!      }dj;                  |D cg c]  }jB                  jE                  |       c}      |_         |j1                  |        tG        |      D ])  \  }}|jI                  d$|d z    d%t?        |       &       + t?        |      d kD  rtK        |j2                        nd }| j                   j#                  |d   |r|jL                  nd |'       d {   }|r||_'        y y 7 7 7 V7 4c c}w 7 Nc c}w c c}w 7 -w)(NTr|   r  rK   rl  rm  ro  rp  rz   r  r   r  rr  r  c           	      &   | sy 	 t        t        j                  |       j                               S # t        t
        f$ rP 	 t        t        j                  | j                  dd            j                               cY S # t        $ r Y Y y w xY ww xY w)Nr  r  )ra   r   r  rB  
ValueError	TypeErrorrZ  r   )r  s    r3   _safe_timestampzDregister_slash_commands.<locals>.alts_slash.<locals>._safe_timestamp-  s     811&9CCEFF	*   x55fnnS(6ST^^`aa     s-   +1 B;A?<B?	BBBB
first_seenr  zFirst Seen: <t:z:F>zFirst Seen: UnknownzLast Updated: <t:r  zLast Updated: Unknownu   👥 Alt Report for <L r   )r   r   rw   r      zKnown Alts (z total) - Page r9   r   r  zKnown IPs (r  r   r   r   )(r   r   r   rV   r   r   r   r   r  r   r   r   alts_handler	alts_datar  r  r   r   r  listr   setr*  r+  r   r*   r   r  r  r  r   rA   rw   r  r  r   r   r%   r/   r,   )rQ   r  r  rx   r  r  r  
found_userr  lowercase_map	candidater   r  r  is_adminshow_ipsr&   r  first_seen_tslast_updated_ts
desc_lines
info_embedr   r  rS   altri  
paginationsent_messager   rn   s                                r3   
alts_slashz+register_slash_commands.<locals>.alts_slash  sO     ,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K # 4 4[5E5E5H5H&XYbd 4 e
I&&336^_h^iir4s  @D3  E  E  E""((:(>>>((++S1A1A-BFXWZ[^W_L`kop
/2/?/?/I/I/N/N/PQ!AQQ%;-'8C}:MN 	I M1*9??+<=
	
 &&++.?z,LXb+ccc))*5d488FCE234T$((5#%012{''**+szz/C/CC#8		  ((>?)$((>*BC
-B[OM?#>avwoFa-o->cBg~]]+?@]@]^h@i?j)ks{  JN  JS  JS  T^  J_  `
j!1c$i, %Aa"f~l3t9+_VWY[V[]^U^T_,`hpq$(IIt.Ts/C.T$U!e$	% 1c#h+ %1QV}k#c(?TUWYTY[\S\R],^fno$(II_c.dY[s~~/P/PQS/T.d$e!e$	% "&) 	cHAu$MaPQcURSTWX^T_S`"ab	c =@K!O^FCKK8QU
(1166)$.D  7 
 
 !-J [ B K
 E 	?
 R dH /U /e
s   )UT&AU>T)?AUT,$U;T/<A6U2T2
"U-<U)T7*GU8T:
A?U"T?
(B.UUU)U,U/U2U:Uphonez Look up phone number informationz5Phone number with country code (e.g., +4917674905246))numberrx   r  c           
        K   j                  | j                  j                  t        | j                        d|gd       j	                  | j                  j                         d {   sS| j
                  j                  j                  j                  | j                  j                        d       d {    y j                  | j                  j                  ddd      \  }}|s*| j
                  j                  d| d	d       d {    y | j
                  j                  |       d {    j                  j                  s&| j                  j                  d
|       d {    y |j!                  d      sd|z   n|}	 j#                         4 d {   }|j%                  d| dj                  j                  id       d {   }|j'                          |j)                         }|j%                  d      s;| j                  j                  d| d|       d {    	 d d d       d {    y j*                  j-                  t        | j                  j                        ||       j%                  |j%                  dd      d      }t/        j0                  ddt3        j4                               }	|	j7                  dd|j%                  dd       dd       |	j7                  dd|j%                  d d       dd       |	j7                  d!d|j%                  d"d       dd       |	j7                  | d#|j%                  d$d       d%|j%                  dd       d&d       |	j7                  d'|j%                  d(d      d       |	j7                  d)|j%                  d*d      j9                         d       |j%                  d+      x}
r|	j7                  d,|
d       |	j;                  d-.       | j                  j                  |	|/       d {    d d d       d {    y 7 7 7 @7 7 7 7 7 -7 7 07 "# 1 d {  7  sw Y   y xY w# j<                  $ r}|j
                  j>                  d0k(  r'| j                  j                  d1|       d {  7   n|j
                  j>                  d2k(  r'| j                  j                  d3|       d {  7   nB| j                  j                  d4|j
                  j>                   |       d {  7   Y d }~y Y d }~y Y d }~y d }~wt@        $ rr}djC                  tD        jG                  tI        |      ||jJ                              }d5|d d6  d7}| j                  j                  ||       d {  7   Y d }~y d }~ww xY ww)8Nr  Trz   r|      rl  rm  ro  rp  u(   ❌ Phone lookup API key not configured.+z)https://api.numlookupapi.com/v1/validate/apikeyr~   r  validu   ❌ Invalid phone number: `r   )discord_user_idphone_numberlookup_datacountry_coder   rt  u   📱 Phone Number Informationr@  rA  Numberr  r   Fr   zLocal Formatlocal_formatInternationalinternational_format Countrycountry_namer  r   u   📡 Carriercarrieru   📞 Line Type	line_typerd   r|  z;liforra.de | Liforras Utility bot | Powered by NumLookupAPIr   r     u   ❌ Invalid NumLookupAPI key.i  u   ⏱️ API rate limit exceeded.r   r  r(  r)  )&r   r   r   r   r   rV   r   r   r   r   r  r   r*  numlookup_api_keyr   r   
startswithr   r   r   r   phone_handlerstore_phone_lookupr*   r   r   r.  r   r   r   r   r   r   r  r5  r6  r   r7  )rQ   r  rx   r  r  r   rV   r   r  rS   rd   r   r;  r  rp   r   r   s                 r3   phone_slashz,register_slash_commands.<locals>.phone_slash]  s    
 	((++S1A1A-BGfX`de,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K # 4 4[5E5E5H5H'YZce 4 f
I&&336^_h^iir4s  @D3  E  E  E""((:(>>>zz++&&++,Vbl+mmm%+%6%6s%;v%	Q((* S Sf!'.WX^W_,`ksuxuu  vR  vR  kS  ]_  "`  `))+}}xx(%..336QRXQYYZ4[gq3rrrS S S !!44$'(8(8(;(;$<!' $ 5  %((.")EvN,KS[gogsgsguvXq(E9R8SST5U^cd^QtxxX]?^>__`;ajno_aI_af@g?hhi<jswxvX%6.Z_A`@aacdhdldlm{  ~C  eD  dE  EF  ?G  PU  V^488Iu;U^bc%5TXXkSX=Y=_=_=ajno#xx
3383OOQVOW  &c d!**//ez/RRR7S S S% B K
 E 	? nS `
 sS6 S7S S S S: $$ 	tzz%%,K4H4H4M4MNm  zD4M  5E  /E  /E''3.k6J6J6O6OPq  ~H6O  7I  1I  1I#,,11OAJJDZDZC[2\hr1sss 1I /E  	QWWY77QAOOTUFLVTYUY]O[`aM&&++MZ+PPP	Qsy  A'W*Q+AW<Q=AWQ$W9Q::W4Q5WR 'Q(R +1Q-Q AQ-6Q#7Q-<R Q&R WG+Q-8Q)9Q-=R Q+	R WWWWWR  Q-#Q-&R )Q-+R -Q?3Q64Q?;R >W?R W9U
S?U
T=UU	UWW)A"WWWWWWshodanzGet Shodan host informationzIP address to look up)ri  rx   c                   K   j                  | j                  j                  t        | j                        d|gd       j	                  | j                  j                         d {   sS| j
                  j                  j                  j                  | j                  j                        d       d {    y | j
                  j                  |       d {    j                  j                  s&| j                  j                  d|       d {    y  |      s&| j                  j                  d|       d {    y 	 j                         4 d {   }|j!                  d| dj                  j                  id	
       d {   }|j#                          |j%                         }j!                  |j!                  dd      d      }t'        j(                  d| d| dt+        j,                               }|j/                  | d|j!                  dd      d       |j/                  d|j!                  dd      d       |j/                  d|j!                  dd      d       |j/                  d|j!                  dd      d       |j!                  dg       x}r9|j/                  ddj1                  |d d       t3        |      dkD  rd ndz   d!       |j!                  d"g       x}	rT|j/                  d#t3        |	       d$dj1                  t5        t        |	d d	             t3        |	      d	kD  rd ndz   d!       |j!                  d%g       x}
rXdj1                  |
d d       t3        |
      dkD  rd&t3        |
      dz
   d'ndz   }|j/                  d(t3        |
       d$|d!       |j!                  d)g       x}r#|j/                  d*dj1                  |      d!       |j7                  d+,       | j                  j                  ||-       d {    d d d       d {    y 7 7 7 j7 27 7 7 7 *7 # 1 d {  7  sw Y   y xY w# j8                  $ r}|j
                  j:                  d.k(  r'| j                  j                  d/|       d {  7   n|j
                  j:                  d0k(  r+| j                  j                  d1| d2|       d {  7   nB| j                  j                  d3|j
                  j:                   |       d {  7   Y d }~y Y d }~y Y d }~y d }~wt<        $ rr}dj1                  t>        jA                  tC        |      ||jD                              }d4|d d5  d6}| j                  j                  ||       d {  7   Y d }~y d }~ww xY ww)7Nr%  Trz   r|   u"   ❌ Shodan API key not configured.rq  z"https://api.shodan.io/shodan/host/r  r  r   r  r   rt  u   🔍 Shodan: zhttps://www.shodan.io/host/r  )r   r   r   rB  r  r  r   r   Organizationr  ISPr}  ASNasn	hostnames	Hostnamesrx  r  z ...FportszOpen Ports (r   vulnsz (+z more)u   ⚠️ Vulnerabilities (tagsTagsz5liforra.de | Liforras Utility bot | Powered by Shodanr   r   r  u   ❌ Invalid Shodan API key.i  u"   ❌ No information available for `rr  r   r  r(  r)  )#r   r   r   r   r   rV   r   r   r   r   r   r*  shodan_api_keyr   r   r   r   r   r   r*   r   r   r.  r   r  rA   mapr   r   r   r   r5  r6  r   r7  )rQ   ri  rx   r   rV   r   r  rS   r+  r-  r.  	vuln_textr/  r   r;  r  rp   r   r   ro   s                   r3   shodan_slashz-register_slash_commands.<locals>.shodan_slash  s    
 	((++S1A1A-BHrd]ab,,[-=-=-@-@AAA&&33C4E4E4_4_`k`p`p`x`x4y  FJ3  K  K  K""((:(>>>zz((&&++,P\f+ggg2&&++,LXb+ccc"	Q((* S Sf!'.PQSPT,U_dfifpfpff  _A  KM  "N  N))+}}$((.")EvNmB4,@HcdfcgFhpx  EM  EQ  EQ  ES  TvX%6dhh~W\>]fjk^488E5;QZ^_U$((5%2HQUVU$((5%2HQUV $b 9999OODIIiPRQRm<TbefobpstbtX^z|<}  GLO  M HHWb1151OO<E
|1)ETYYWZ[^`efigi`jWkMlz}  D  {E  HJ  {Jpv  PR  NS  \aO  b HHWb1151 $		%) 4X[\aXbefXf#c%j1n=MV8Tln oIOO+CCJ<q)QYbkpOq88FB//4/OOtyyuOU  &] ^!**//ez/RRR1S S S B K 	? h dS N. S1S S S S4 $$ 	tzz%%,K4H4H4M4MNk  xB4M  5C  /C  /C''3.k6J6J6O6ORtuwtxxzP{  HR6O  7S  1S  1S#,,11OAJJDZDZC[2\hr1sss 1S /C  	QWWY77QAOOTUFLVTYUY]O[`aM&&++MZ+PPP	QsB  A'W*Q+AW<Q=$W!Q":WQ-W
QWQ3 %Q&Q3 )1QQJQ/Q0Q4Q3 ?Q Q3 WWWWWQ3 QQQ3 Q0$Q'%Q0,Q3 /W0Q3 3W9U;R><AU?T =U=U >UWWA"W WWWWWhelpzShow available commandsc                   K   j                  | j                  j                  t        | j                        dg d       t	        j
                  dddt        j                               }|j                  dd	d
       |j                  ddd
       |j                  ddd
       t        | j                  j                        j                  j                  v r|j                  ddd
       |j                  ddd
       |j                  d       | j                  j                  ||       d {    y 7 w)Nr5  Trz   u   📚 Command Helpz%Available slash commands for this botr@  rv  u   🎮 GeneralzZ`/trump`, `/tech`, `/fact`, `/search`
`/websites`, `/pings`, `/playerinfo`, `/namehistory`Fr   u   🌐 Network ToolszP`/ip`, `/ipdbinfo`, `/ipdblist`, `/ipdbsearch`, `/ipdbstats`
`/phone`, `/shodan`u   👥 Alt Lookupz`/alts` (Rate limited: 2/min)u   ⚙️ AdminzZ`/altsrefresh`, `/ipdbrefresh`, `/reloadconfig`
`/configget`, `/configset`, `/configdebug`u   💡 TipzSMost commands have an `_ephemeral` option to make the response visible only to you.r   r   r   )r   r   r   r   r*   r   r   r.  r   r*  r+  r   rV   r   )rQ   rx   rS   r   s      r3   
help_slashz+register_slash_commands.<locals>.help_slash  sM    
 	((++S1A1A-BFBY]^$7Elt|  IQ  IU  IU  IW  X^  4Q  Z_  	`1  :M  V[  	\.6U^cd{""#szz';';;OO  8U  ^cO  dZ  0E  NS  	TAB""//ez/RRRs   D4D?7D=8D?restartz[ADMIN] Restart the botc                   K   j                  | j                  j                  t        | j                        dg d       t        | j                  j                        j                  j
                  vr%| j                  j                  dd       d {   S | j                  j                  d|       d {    j                  j                          d {    y 7 L7 )7 	w)Nr8  Trz      ❌ This command is admin-only.r|   zRestarting...)
r   r   r   r   r*  r+  rV   r   r   close)rQ   rx   r   s     r3   restart_slashz.register_slash_commands.<locals>.restart_slash  s     
 	((++S1A1A-BIr\`a;##&&'3::+?+??$--::;\hl:mmm""//:/VVVjj    nV s6   BC)C#$C);C%<!C)C'C)%C)'C)reloadconfigz&[ADMIN] Reload all configuration filesc                   K   j                  | j                  j                  t        | j                        dg d       t        | j                  j                        j                  j
                  vr%| j                  j                  dd       d {   S | j                  j                  |       d {    	 j                  j                          j                          j                  j                          j                  j                          t        j                   dddt#        j$                         	      }| j&                  j)                  ||
       d {    y 7 7 7 	# t*        $ rr}dj-                  t.        j1                  t3        |      ||j4                              }d|d d  d}| j&                  j)                  ||       d {  7   Y d }~y d }~ww xY ww)Nr=  Trz   r:  r|   u   ✅ Config Reloadedz.Successfully reloaded all configuration files.r_  rv  r   r   u'   ❌ **Failed to reload config:**
```py
r(  r)  )r   r   r   r   r*  r+  rV   r   r   load_config
load_notesr  load_and_preprocess_alts_datar  load_ip_geo_datar*   r   r   r.  r   r   r   r  r5  r6  r   r7  )rQ   rx   rS   r   r;  r  r   s         r3   reloadconfig_slashz3register_slash_commands.<locals>.reloadconfig_slash  s    
 	((++S1A1A-BNTVaef;##&&'3::+?+??$--::;\hl:mmm""((:(>>>
	QJJ""$NN::<NN++-MM(=K{  DL  X`  Xd  Xd  Xf  gE&&++%:+NNN n> O 	QWWY77QAOOTUFGuPTV[\M&&++MZ+PPP	Qsn   BG3E/#G3:E1;G3 B)E5 )E3*E5 .G31G33E5 5	G0>A"G+ G#!G+&G3+G00G3)F)r   rh   F)NNr~   FF)   F)r9   F)r  F)FF)r   r  rn   ro   utils.constantsrp   r   allowed_installsallowed_contextscommanddescriber*   rX   boolchoicesChoicer   r   Userra   )treer   r   r   r   r!  r<  rN  rh  r  r  r  r  r  r  r  r  r$  r4  r7  r<  rC  rp   rn   r   ro   s    `                    @@@@r3   register_slash_commandsrO  v   s    :- 	&&d$&?&&dt&T	\\w,F\G*Z[dw':': d d \ H U @d$ 	&&d$&?&&dt&T	\\v+J\K*Z[dg&9&9 dt d \ L U @d$ 	&&d$&?&&dt&T	\\v+O\P &C  
 	XX>^7C) 	Yd;XT:  :{g&9&9 :{c :{`c :{x| :{ Q U @:{x 	&&d$&?&&dt&T	\\w,K\L#>70;C   	##);9#M##):'#J##)9#H##);6#J##V#D
   /3"  ]P((]P]P gll+]P sm	]P
 ]P ]P ]P M U @(]P~ 	&&d%&@&&dPT&U	\\z/Z\[;C    .
((.
.
 .
	 \ V A.
` 	&&d$&?&&dt&T	\\z/T\U*Z[K'*=*= K4 K \ V U @K4 	&&d$&?&&dt&T	\\w,E\F*Z[Kw':': K K \ G U @K. 	&&d$&?&&dt&T	\\t)N\O'Q  _O  P/KG$7$7 /K# /KSW /K P P U @/Kb 	&&d$&?&&dt&T	\\z/a\b'BO  AS'*=*= S SY] S A c U @S4 	&&d$&?&&dt&T	\\z/P\Q$>K{|e'*=*= eS eZ^ e } R U @e8 	&&d$&?&&dt&T	\\|1V\WM>noZG,?,? Zs ZX\ Z p X U @Z6 	&&d$&?&&dt&T	\\{0M\N*Z[S7+>+> SD S \ O U @S& 	&&d$&?&&dt&T	\\|1Z\[00C  
 	[DWG<V6:,  ( 	:Q((:Q:Q :Q 	:Q \ U @:Qx 	&&d$&?&&dt&T	\\}2^\_(K  YI  J3QW-@-@ 3QC 3Q]a 3Q J ` U @3Qj 	&&d$&?&&dt&T	\\v+H\I*8C  
O.g&9&9 O.S O.t O.im O. J U @O.b 	&&d$&?&&dt&T	\\w,N\O&]  k[  \8Qw':': 8QC 8QUY 8Q \ P U @8Qt 	&&d$&?&&dt&T	\\x-J\K"9Fvw2Q(;(; 2Q 2QRV 2Q x L U @2Qh 	&&d$&?&&dt&T	\\v+D\E*Z[
Sg&9&9 
St 
S \ F U @
S 	&&d$&?&&dt&T	\\y.G\H*Z[!)<)< !$ ! \ I U @! 	&&d$&?&&dt&T	\\~3[\\*Z[Qg.A.A Qt Q \ ] U @Qr5   c                      e Zd Zd'dededefdZdedefdZd(deded	ed
ede	eef   f
dZ
d)dededededef
dZd Zd Zd ZdefdZdefdZd*dedee   defdZd+dZd Zd Zd ZdedefdZd  Zd! Zd" Zd# Zd$ Zd% Zd& Z y),rl   tokendata_dir
token_typec                    t         j                  d       || _        || _        || _        g d| _        	 | j                  j                  dd       t         j                  d| j                          | j                  dz  | _        t        j                  | j                  d      }t        j                  d	d
      }|j                  |       |j                  t        j                         t        j                         }|j                  t        j                         |j!                  |       t         j                  d| j                          | j                  dz  | _        | j                  dz  | _        |dk(  rt*        j,                  j/                         }d|_        d|_        d|_        t+        j6                  |      | _        t;        j<                  | j8                        | _        t:        | _        t*        | _        n.ddl }	|	j7                         | _        d| _        d| _        |	| _        tC        |      | _"        tG               | _$        d| _%        tM        |      | _'        tQ        |      | _)        tU        |       | _+        d| _,        d| _-        d| _.        t_        |      | _0        tc        |       | _2        tg        |       | _4        tk        | |      | _6        d| _7        i i d| _8        i | _9        i | _:        i | _;        ty        d       | _=        i d| jd                  j|                  d| jd                  j~                  d| jd                  j                  d| jd                  j                  d| jd                  j                  d| jd                  j                  d| jd                  j                  d| jd                  j                  d | jd                  j                  d!| jd                  j                  d"| jd                  j                  d#| jd                  j                  d$| jd                  j                  d%| jd                  j                  d&| jd                  j                  d'| jd                  j                  d(| jd                  j                  d)| jd                  j                  i| _O        | jh                  j                  | jh                  j                  | jh                  j                  | jh                  j                  | jh                  j                  | jh                  j                  | jh                  j                  | jh                  j                  | jh                  j                  | jh                  j                  | jh                  j                  | jh                  j                  | jh                  j                  d*| _\        d+d,d-d.d/| _]        | j8                  j                  | j                         | j8                  j                  | j                         | j8                  j                  | j                         | j8                  j                  | j                         | j8                  j                  | j                         y# t"        $ r}t         j%                  dd        d}~ww xY w)0z1Initialize the bot with token and data directory.zInitializing bot)!?r  T)parentsexist_okzData directory ready: zbot.logutf-8encodingz4%(asctime)s - %(name)s - %(levelname)s - %(message)s%Y-%m-%d %H:%M:%S)datefmtzLogging to file: z#Failed to initialize data directory)exc_infoNz
notes.jsonzuser-tokens.jsonr   )intentsr   g      @publicprivatec                      g g g g dS )N)r  ri  searchr  rb   rb   r5   r3   r  zBot.__init__.<locals>.<lambda>T  s    "XZeg7h r5   ru   r=  rO  noter5  ri  r  r  r  r  r%  r   rd  r   playerhistoryaskmodelsz!models)zreload-configr*  resendoverrider  qrloginr"  
statsclearzset-aizunset-aizset-logz	unset-logr8  u   Usage: {0}ip <info|db> [args]
• `{0}ip info <ip>` - Live IP lookup
• `{0}ip db <info|list|search|stats>` - Database operationsu   Usage: {0}alts <username> or subcommands
• `{0}alts <username>` - Lookup alts
• `{0}alts stats` - Show statistics
• `{0}alts list [page]` - List all altszlUsage: {0}ask <question> or @mention with question
Ask Luma AI any question and get an intelligent response.z+Same as `{0}ask` - Ask Luma AI any question)ri  r  rg  z!ask)dr
   r   rQ  rR  rS  command_prefixmkdirdebuglog_fileloggingFileHandler	FormattersetFormattersetLevelDEBUG	getLogger
addHandlerr   critical
notes_fileuser_tokens_filer*   Intentsdefaultmessage_contentmembers	presencesClientr   r   CommandTreerN  selfcordr   r*  r"   steam_location_handlerr  r   r  r   logging_handlerr   log_handlerr   r"  r	  r   mc_server_handlerr   r  r   admin_commands_handlerr#   health_check_auth_check_timeout
notes_dataforward_cachemessage_cacheedit_historyr   command_rate_limitscommand_trumpcommand_websitescommand_pingscommand_notecommand_help
command_ipcommand_playerinfocommand_namehistorycommand_altscommand_phonecommand_shodancommand_statscommand_mcsearchcommand_mcrandomcommand_mcplayerscommand_askcommand_modelsuser_commandscommand_reload_configcommand_configcommand_resendcommand_overridecommand_qrlogincommand_backfillcommand_statsclearcommand_set_aicommand_unset_aicommand_set_logcommand_unset_logcommand_restartadmin_commandscommand_help_textseventon_ready
on_messageon_message_editon_message_deleteon_presence_update)
r1   rQ  rR  rS  file_handlerfile_formatterroot_loggerr   r_  r  s
             r3   r4   zBot.__init__
  s   &'
 $-	MMt<LL1$--AB !MMI5DM"..t}}wOL$..F+N %%n5!!'--0 "++-K  /""<0KK+DMM?;< --,6 $0B Boo--/G&*G#"GO $G!..9DK$00=DI ,D"DL"//+DKDI $D#DL#H-&:&<# #H--h7%d+!!"&!0!:%1$%7"&3D&9#'h7#& %'B7#./h#i 
T//==
22CC
 T//==
 D..;;	

 D..;;
 $,,77
 $44GG
 455II
 D..;;
 T//==
 d00??
 T//==
 d00AA
 d00AA
 T77II
  4--99!
" d00??#
$ t11@@%
* "88NN11@@11@@33DD//<<22BB33DD55HH11@@33DD22BB44FF22BB
" Y y CA	#
 	$--($//*$../$001$112y  	OOADOQ	s   D!Z" "	[+[[r  returnc                 |  K   | j                   dk7  s| j                  sy	 t        j                  | j                  j	                  t        |            | j                         d {   S 7 # t        j                  $ r t        j                  d|       Y yt        $ r t        j                  d|       Y yw xY ww)Nr   Tr)   zAOAuth authorization check timed out for user %s; allowing commandz,OAuth authorization check failed for user %sF)rS  r   r3  wait_foris_user_authorizedr   r  TimeoutErrorr
   warningr   	exception)r1   r  s     r3   r   zBot.check_authorization  s     ??e#4+=+=	 ))""55c'lC00    ## 	NNS  	> 		sG   B<AA- &A+'A- *B<+A- -)B9B<B96B<8B99B<rH  r   rn  c                 L   t        j                         }| j                  |   |   }|D cg c]  }||z
  j                         |k  s| c}|d d  t	        |      |k\  r0t        |d   t        |      z   |z
  j                               }d|fS |j                  |       yc c}w )Nr   )secondsF)Tr   )r   r.  r  total_secondsrA   ra   r   r   )	r1   r  rH  r   rn  r.  user_limitsr  r  s	            r3   r  zBot.check_rate_limit  s    lln..w7@'2ZsRx6N6N6PSY6Y"ZA{u$[^i.GG#M\\^_I)##3 [s   B!B!Nr  argsr{   c                    	 | j                   dz  }t        j                         j                  d      }|rdnd}|r| ddj	                  |       n|}	d| d| d| d	| d
|	 d}
t        |dd      5 }|j                  |
       ddd       y# 1 sw Y   yxY w# t        $ r/}t        d| j                  j                   d|        Y d}~yd}~ww xY w)z'Logs command usage to command.log file.zcommand.logr\  SLASHTEXTr  [z] [z] User:  (ID: z) | Command: r   arY  rZ  Nz] Error logging command: )rR  r   r.  strftimer  openwriter   printr   r   )r1   r  r  rH  r  r{   rp  rB  cmd_typefull_command	log_entryfr   s                r3   r   zBot.log_command  s    	F}}}4H //0CDI"*wH<@gYa'78gLI;c(8H:VG9TabnaooqrIhg6 #!	"# # #  	FAdkk&&''@DEE	Fs6   A2B 4BB BB B 	C$%CCc                   K   t        d| j                   d| j                          | j                  j	                          | j                  dk(  rt        | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                        | _        d }| j                  j                  | j                  j                  cxk(  rdk(  r<n n9| j                  r-t        | j                  dd       r| j                  j                  }t!        | j                  j                  | j                  j"                  | j                  j$                  | j                  j&                  |      | _        | j                  dk(  ru| j                  j                  dk(  r\t+        | j                  d| j                  j                  | j                  j                  | j                  j                        | _        nt+        | j                  d	
      | _        t/        | j                  | j                  j0                        | _        | j2                  j5                          | j7                          | j8                  j;                  | j<                         d {    y 7 w)NzStarting bot instance (z) in directory: r   )db_typedb_urldb_userdb_password	client_idclient_secretpostgrespg_pool)existing_pool)rR  r  r  r  r  r   )rR  r  )r  rS  rR  r*  r?  r   oauth_db_typeoauth_db_urloauth_db_useroauth_db_passwordoauth_client_idoauth_client_secretr   stats_db_typer  r  r   stats_db_urlstats_db_userstats_db_passwordr	  r   r"  r   default_clean_spigeyr  rA  r@  r   r  rQ  )r1   r  s     r3   runzBot.run  s    ''88HXY!??e#!-11{{//11 KK99++55"kk=="D ;;$$(A(AOZOTXTfTfkrsw  tF  tF  HQ  SW  lX ..66M"2KK%%KK$$KK%%KK))'#
 ??e#(A(AZ(O!-"{{//11 KK99"D "."D
 (t{{7W7WX779kk

+++s   KKKKc                 j   | j                   j                         r>	 t        | j                   dd      5 }t        j                  |      | _        d d d        y y i i d| _        y # 1 sw Y   xY w# t        $ r9}t        d| j                  j                   d|        i i d| _        Y d }~y d }~ww xY w)Nr   rY  rZ  r  z] Error loading notes: r`  )
rz  existsr  r   loadr  r   r  rR  rv   r1   r  r   s      r3   r@  zBot.load_notes  s    ??!!#@$//3A 3Q&*iilDO3 3 *,;DO3 3 @$--,,--DQCHI-/B"?@s.   A0 A$A0 $A-)A0 0	B29/B--B2c                    	 t        | j                  dd      5 }t        j                  | j                  |dd       d d d        y # 1 sw Y   y xY w# t
        $ r/}t        d| j                  j                   d|        Y d }~y d }~ww xY w)	NwrY  rZ  rK   F)indentensure_asciir  z] Error saving notes: )	r  rz  r   dumpr  r   r  rR  rv   r  s      r3   
save_noteszBot.save_notes  s~    	EdoosW= L		$//1QUKL L L 	EAdmm(())?sCDD	Es3   A $AA AA A 	B%BBc                    | j                   j                         si S 	 t        | j                   dd      5 }t        j                  |      cd d d        S # 1 sw Y   y xY w# t        j
                  t        f$ r i cY S w xY w)Nr   rY  rZ  )r{  r  r  r   r  JSONDecodeErrorIOError)r1   r  s     r3   load_user_tokenszBot.load_user_tokens  sf    $$++-by	:d++S7C]qQUQZQZ[\Q]]]]$$g.9r	9s.   A! A	A! AA! A! !A?>A?tokensc                     	 t        | j                  dd      5 }t        j                  ||d       d d d        y # 1 sw Y   y xY w# t        $ r}t        d|        Y d }~y d }~ww xY w)Nr  rY  rZ     )r  z*[Token Storage] Error saving user tokens: )r  r{  r   r  r  r  )r1   r  r  r   s       r3   save_user_tokenszBot.save_user_tokens  sY    	Ud++S7Chq$))TZ\]fgJhhhhTU%OPQs#STTTs1   A <A AA A 	A)A$$A)r   r  c                    |rt        |t              sy|j                  dd      j                  dd      }| j                  j	                  |d| j                  j
                        }| j                  j	                  |d| j                  j                        }|s^t        D ]U  }t        j                  t        j                  |      t        j                        j                  dt        |      z  |      }W |s^t        D ]U  }t        j                  t        j                  |      t        j                        j                  d	t        |      z  |      }W |S )
Nr   z	@everyonez@ every onez@herez@ herezallow-swearszallow-slursu   █*)rH  r   rZ  r*  rD  default_allow_swearsdefault_allow_slursr   recompileescape
IGNORECASEsubrA   r   )r1   r   r  allow_swearsallow_slursslurswears          r3   censor_textzBot.censor_text  s   :dC0 ||K7??R{{33HndkkNnNnokk228]DKKLkLkl"r2::biior}}+U+Y+YZ_befjbkZkmq+rDr$tRZZ		%8H"---X-\-\]`cfglcm]mos-tdtr5   c                 Z  K   |r@| j                  |t        |d      r"|j                  r|j                  j                  nd       nd}	 |s|s|sy ddi}|r||d<   |r||d<   |r&| j                  dk(  r||d<   |j                  dd        d }|r~t        t        |            D ]e  \  }}	|j                         }
|	|
d<   |d	kD  r$|
j                  dd        |
j                  dd         |j                  di |
 d {   }|d	k(  sd|}g |S  |j                  di | d {   S 7 *7 # t        $ rv}d
t        |      j                  v r0t        d| j                  j                   d|j                          n%t        d| j                  j                   d|        Y d }~y d }~ww xY ww)Nr   r   suppress_embedsTr2  filesr   rS   r   	Forbiddenr  z!] Missing permissions in channel z] Error sending message: rb   )r  r,  r   r   rS  popr   r   copyr   r   r   r]   r  r   r   )r1   r-  r2  r  rS   censored_contentkwargsr
  r   r   current_kwargssentr   s                r3   bot_sendzBot.bot_send  s     DK4++GQXZaIbgngtgtW]]5E5Ez~  QS	L#E%'.F$4y!"'wE1"'w

,d3L )-8H*I J 3HAu%+[[]N05N9-1u&**7D9&**7D9!-!?!??DAvd|3 $#*gll4V444	 @ 5 	Ld1g...$++:J:J9KKlmtmwmwlx6y0z!DKK,,--FqcJK	Lst   AF+D) F+B+D) :D%;	D) D) 
F+D)  D'!D) $F+%D) 'D) )	F(2A,F#F+#F((F+c                 @  K   | j                   j                          d {    | j                   j                         st        j                  d       d {    t        j                         t        d      z
  }| j                  j                         D cg c]  \  }}|d   |k  s| }}}|D ]  }| j                  |=  |r/t        d| j                   j                   dt        |       d       | j                   j                         sy y 7 7 c c}}w w)Ni     )hoursrB  r  
] Cleaned z old forward cache entries.)r   wait_until_ready	is_closedr3  r4  r   r.  r   r  r  r  r   rA   )r1   r9  r  vexpireds        r3   cleanup_forward_cachezBot.cleanup_forward_cache2  s     kk**,,,++'')--%%%\\^ib&99F%)%7%7%=%=%?[TQ1[>TZCZq[G[7$"4"4Q"77$++"2"2!3:c'l^Kfgh ++'') 	-%[sA   DD6DDADD+D/A"DDDDc                   K   | j                   j                          d {    | j                   j                         st        j                  d       d {    t        j                         }|t        d      z
  }| j                  j                         D cg c]  \  }}|d   |k  s| }}}|D ]  }| j                  |=  |r/t        d| j                   j                   dt        |       d       | j                  j                         D cg c]K  \  }}|t        j                  |j                  d|j!                                     z
  t        d      kD  sJ|M }}}|D ]  }| j                  |=  |r/t        d| j                   j                   dt        |       d       | j                   j                         sy y 7 7 xc c}}w c c}}w w)	Nr  r~   )minutesrB  r  r  z old message cache entries.z old edit history entries.)r   r  r  r3  r4  r   r.  r   r  r  r  r   rA   r  r  r   	isoformat)r1   r.  r9  r  r  msg_expirededit_expireds          r3   cleanup_message_cachezBot.cleanup_message_cache;  s    kk**,,,++'')--$$$,,.C9R00F)-););)A)A)C_Aq~X^G^1_K_ ;d&8&8&;;EAdkk&6&6%7z#kBRASSn"op*.*;*;*A*A*C  b$!QsXMcMcdedidijuwz  xE  xE  xG  eH  NI  HI  LU  ^`  La  HaA  bL  b!;t'8'8';;UQt{{'7'7&8
3|CTBUUo#pq ++'')) 	-$ ` bsU   GG7GGAGG.G2A%GAG#G'A"GGGGc                   K   | j                   j                          d {    t        j                  d       d {    | j                   j	                         s| j
                  j                  rt        d| j                   j                   d       	 | j                  j                  | j
                  j                  | j                         d {   }|s#t        d| j                   j                   d       t        j                  d       d {    | j                   j	                         sy y 7 7 7 h# t        $ r/}t        d| j                   j                   d|        Y d }~td }~ww xY w7 cw)Nrl  r  z"] Auto-refreshing alts database...z] Alts refresh failed.z] Error during auto-refresh: )r   r  r3  r4  r  r*  alts_refresh_urlr  r   r  refresh_alts_datar  r   )r1   successr   s      r3   auto_refresh_altszBot.auto_refresh_altsI  s(    kk**,,,mmB++''){{++$++**++MNOR$($5$5$G$GHdHdfjfufu$vvG"EAdkk.>.>-??U*V$W --### ++'') 	-
 w  RAdkk..//LQCPQQR#sn   E;D7E;D:AE;=D> D<)D> =E;E9E;5E;:E;<D> >	E6%E1,E;1E66E;command_namec           	      f  K   | j                   j                  |       d {    | j                  |j                  j                  t	        |j                        ||d       | j                  |j                  j                         d {   s^| j                  rQ| j                  |j                  | j                  j                  |j                  j                               d {    y 	 || j                  v r | j                  |   ||       d {    y || j                  v rUt	        |j                  j                        | j                  j                  v r | j                  |   ||       d {    y y y 7 _7 7 7 p7 # t        $ r}t!        d| j"                  j$                   d| d|        dj'                  t(        j+                  t-        |      ||j.                              }d|d d  d	}| j                  |j                  |
       d {  7   Y d }~y d }~ww xY ww)NFrz   r  z] Error in command 'z': r   r  r(  r)  r2  )r  r   r0  r   r   r   r   r  r-  r   r   r  r  r*  r+  r   r  r   r   r  r5  r6  r   r7  )r1   r,   r(  r  r   r;  r  s          r3   handle_commandzBot.handle_commandV  s    **7333NN 	 	
 --gnn.?.?@@@!!mmGOOT5G5G5a5abibpbpbxbx5yzzz		Ht1116d((6wEEE!4!44W^^=N=N9OSWS^S^ShSh9h7d)),7FFF :i4% 	4 Az
 FF 	HAdkk&&'';L>QCPQWWY77QAOOTUFLVTYUY]O[`aM---GGG		Hs   H1F A)H1FAH1(F)H1/'F FF H1AF 8F	9F =H1H1H1F 	F 	H.B
H)H!H)$H1)H..H1c                   K   t        d| j                  j                   d| j                  j                  j                   d       | j                  dk(  rd| j
                  rXt        | j
                  |        	 | j
                  j                          d{   }t        j                  dt        |             t        | d      r"| j                  j                          d{    | j                  j                   j#                  | j$                  j'                                y7 # t        $ r t        j                  d       Y w xY w7 hw)	z(Initialize components when bot is ready.zLogged in as r  r   r   Nz Synced %d application command(s)z#Failed to sync application commandsr  )r  r   r   r   rS  rN  rO  syncr
   r   rA   r   r  r,  r  update_help_textsloopcreate_taskr  
run_checks)r1   synceds     r3   r  zBot.on_readyq  s     dkk../vdkk6F6F6I6I5J!LM??e#		#DIIt4H#yy~~//6F
 401,,>>@@@$$T%6%6%A%A%CD 0  H  !FGH AsI   A6E9D( D&#D( :)E#E$AE&D( (E	EE		Ec                    K   y wrZ   rb   )r1   beforer&  s      r3   r  zBot.on_presence_update  s     s   c                 >  K   |j                   j                  | j                  j                  j                  k(  ry |j                  rg|j                  j                  |j                   j                        s8	 |j                  j                  |j                   j                         d {    |j                   j                  rt        |j                   j                        t        k(  rl| j                  j                  |j                  r|j                  j                  nd d| j                  j                        r| j!                  |       d {    y |j                  rQ|j"                  t%        j&                         d| j(                  |j                  <   t+        j,                  | j.                  j1                  || j                  j                  |j                  j                  d| j                  j2                  |j                   j                  |j4                  j                              | j.                  j7                  || j                  j9                  |j                  j                  |j                   j                  |j4                  j                              d       d {    n#| j.                  j;                  |       d {    | j=                  |       d {    | j>                  r{| j>                  j@                  re| j>                  jC                  |j                  r|j                  j                  nd |j                   j                  |j"                         d {    | jD                  dk(  r|j                  r|j                  j                  nd }| j                  j                  |d| j                  jF                  |j                   j                  |j4                  j                        r| j                  jI                  |      }|j"                  jK                  |      rX|j"                  tM        |      d  jO                         }|r0| jQ                  ||d   jS                         |d	d         d {    y | jT                  jW                         }|j4                  j                  |v }| j                  j                  |jX                  v }t[        j\                  d
|j"                  tZ        j^                        }|s|s|r=| j`                  jc                  ||j"                  jO                                d {    y y 7 # t        j                  t        j                  f$ r Y w xY w7 87 7 7 7 "7 	7 Ew)Nz
detect-ips)r2  rB  zmessage-logT)rC  r   zallow-commandsr   r9   z\bLuma[.,!?]*\b)2r0  r   r   r   r   r  fetch_memberr*   r  HTTPExceptionr   r   r   r*  rD  default_detect_ipshandle_asteroide_responser2  r   r.  r  r3  rE  r  log_guild_messagedefault_message_logr-  log_guild_attachmentsget_attachment_log_settinglog_dm_handle_sync_messager	  r
  r1  rS  default_allow_commands
get_prefixr!  rA   splitr+  r  r  _load_ai_channelsmentionsr  rd  r  r  r  )	r1   r,   r  prefixpartsai_channelsis_ai_channelis_mentionedcontains_names	            r3   r  zBot.on_message  s    >> 0 0 3 33V==!9!9'..:K:K!Lmm001B1BCCC >>7>>$$%)99dkk>Z>Zovo|o|[b[h[h[k[k  CG  IU  W[  Wb  Wb  Wu  Wu  ?v44W=====9@W_WcWcWe-fDwzz*..$$66w@\@\]d]j]j]m]mo|  C  J  J  ^  ^  `g  `n  `n  `q  `q  sz  sB  sB  sE  sE  AF  G$$::7DKKDjDjkrkxkxk{k{  ~E  ~L  ~L  ~O  ~O  QX  Q`  Q`  Qc  Qc  Ed  e"&   &&--g666''000 ##''11))88$+MM  t!!   ??f$&-mm'--""C{{++C1A4;;CeCegngugugxgx  {B  {J  {J  {M  {M  N//4??--f5#OOCKL9??AE"11'58>>;KUSTSUYWWW 11CCE**k9{{''7+;+;;		"4goor}}ULM,,88'//BWBWBYZZZ -:a D%%w'<'<=  >
 70 X [s   A4V72U )U*U .B#VV	EV/V0#VVV,V-BV3V4DVVCVVVU #VVVVVVVVVVc                 L  K   	 t        j                  d|j                        rD| j                  j	                  |j                        x}r| j                  j                  |       y y y # t        $ r/}t        d| j                  j                   d|        Y d }~y d }~ww xY ww)Nz\S+ has \d+ alts:r  z%] Error handling Asteroide response: )
r  rd  r2  r  parse_alts_responsestore_alts_datar   r  r   r   )r1   r,   parsedr   s       r3   r9  zBot.handle_asteroide_response  s     	eyy-w?!..BB7??SS6S%%55f= T @ duq)9)9(::_`a_b%cddds/   B$A"A) &B$)	B!2%BB$B!!B$c           
      @  K   |j                   j                  | j                  j                  j                  k(  s"|j                  r|j                   j
                  ry | j                  j                  |j                  j                  d| j                  j                  |j                   j                  |j                  j                        sy | j                  j                  |j                  i       j                  d|j                        }|j                  xs d}||k(  ry t        t        |      t        |      z
        dk\  st        ||      dk\  rt!        ||      ry 	 | j"                  |j                     }d|xs d gt%        |d   d d	       D cg c]  \  }}d
|dz    d|xs d  c}}z   d|xs d gz   }d|j                   j                   ddj'                  t        |      dk  r|dd |d	d  z   n|      z   }	|d   r|d   j)                  |	       d {    y | j+                  |j                  |	       d {   }
|
r|
|d<   y y c c}}w 7 97 # t,        $ r/}t/        d| j                  j                   d|        Y d }~y d }~ww xY ww)Nzprevent-editingr2  r   rL   r  z**Original:** z*empty*	all_editsz	**Edited r9   z:** z	**Now:** z**Edited by <@z>**
r   rK   r   bot_msgr*  r  z] Error in on_message_edit: )r0  r   r   r   r   r   r*  rD  default_prevent_editingr-  r  r   r2  absrA   r    r!   r  r   r  editr  r   r  )r1   r4  r&  originalnewr%  r   r   
edit_lines	edit_inforR  s              r3   r  zBot.on_message_edit  s    <<??dkk..111HXHXZ`{{++EKKNN<Mt{{OrOrty  uA  uA  uD  uD  FK  FS  FS  FV  FV  W  Y_%%))%((B7;;Iv~~Vmm!rs?FSXH-.!37PQY[^7_ce7eo}  G  IL  pM		\''1G*8+@y*ABC  zC  DK  LW  DX  Y\  Z\  D]  z^  G_quqrtuSTUVSVRWW[\]\jaj[kGl  G_  _  en  or  o  v  n@  cA  bC  CJ((9?$))qtu  rA  EF  rFJWXYZO^hikil^mLm  LV  CW  WIy!);)@)@)@)S#S#S $emmY OOGI.7 G_ $TO[uq)9)9(::VWXVY%Z[[[sm   E J#6I# I2A3I# %I&I# *J+ I# I!I# JI# !I# #	J,%JJJJc                   K   |j                   r|j                   j                  nd }|\| j                  j                  |d| j                  j                  |j
                  j                  |j                  j                        sy | j                  j                  |j                  i       j                  d|j                        }d|xs dj                  dd       d}|j                  r7dj                  |j                  D cg c]  }d|j                   d c}      nd}|s|sy 	 |j
                  j                  | j                  j                  j                  k(  r3| j!                  |j                  |xs d|rd|z   ndz          d {    nH| j!                  |j                  | d	|j
                  j                   d|rd|z   ndz          d {    |j                  | j                  v r| j                  |j                  = |j                  | j&                  v r| j&                  |j                  = y y c c}w 7 7 k# t"        $ r/}t%        d
| j                  j                   d|        Y d }~d }~ww xY w# |j                  | j                  v r| j                  |j                  = |j                  | j&                  v r| j&                  |j                  = w w xY ww)Nzprevent-deletingr2  r   z[Empty Message]r   <r  r   z
deleted by <@r  z] Error in on_message_delete: )r   r   r*  rD  default_prevent_deletingr0  r-  r  r   r2  rZ  attachmentsr  r   r   r   r  r   r  r  )r1   r,   r  rV  content_displayattr]  r   s           r3   r  zBot.on_message_delete  s    ")--gmmT?4;;#?#?EWY]YdYdY}Y}  @G  @N  @N  @Q  @Q  SZ  Sb  Sb  Se  Se  $f%%))'**b9==iYx<+<EEc3OPPQRT[TgTgdii7;N;N OC1SWWIQ OPmoV		R~~  DKK$4$4$7$77mmGOOhn"_jP[I[pr5stttmmGOO7HX_XfXfXiXiWjjk5l  GRpt  xC  qC  XZ  6[  \  \  \ zzT///T5G5G

5SzzT...D4E4Egjj4Q. !P
 u \ 	KAdkk&&''EaSIJJ	K zzT///T5G5G

5SzzT...D4E4Egjj4Q.sp   DK$H<K$*A$I IAI II A%K$I I 	I=%I83J  8I==J   A!K!!K$c           	      h  K   | j                   j                  rB|j                  r7t        |j                  j
                        | j                   j                  k(  ry |j                   }|j                  xr" | j                  j                  |j                  v }|j                  xrO |j                  j                  xr7 |j                  j                  j                  | j                  j                  k(  }t        t        j                  d|j                  t        j                               }|s|s|s|sy | j                  j#                  t%        | j                   j                              }|s#t+        d| j                  j                   d      S |j                  j,                  dk7  r/|j                  j.                   d|j                  j,                   n|j                  j.                  }d| d|rd	n.|j                  j.                   d
|j                  j.                    d}|r0| j                   j0                  rd| j                   j0                   dnd}	dd l}
dd l}g }|j6                  r|
j9                         4 d {   }|j6                  D ]  }	 |j;                  |j<                  d       d {   }|j?                          |jA                  | jB                  jE                  |jG                  |j                        |jH                                d d d       d {    | jM                  || d|j                   d|	 |       d {   }|r9|j
                  tO        jP                         d| jR                  |j
                  <   y y # t&        t(        f$ r& t+        d| j                  j                   d      cY S w xY w7 M7 # tJ        $ r0}t+        d| j                  j                   d|        Y d }~vd }~ww xY w7 # 1 d {  7  sw Y   xY w7 ѭw)Nliforrar  z&] SYNC ERROR: Invalid sync-channel ID.z*] SYNC ERROR: Could not find sync channel.0r   z**From `z`** in `DMsz / #r   r  r  r   r   rl  r)   )filenamez'] SYNC: Failed to download attachment: r   )r2  r  )forwarded_idrB  )*r*  sync_channel_idr   r   r-  r   r   r   rD  	referenceresolvedr0  rJ  r  rd  r2  r  get_channelra   r  r  r  discriminatorrv   sync_mention_idr   ior]  r   r   r   r   r   r*   FileBytesIOrd  r   r  r   r.  r  )r1   r,   is_dmis_pingis_reply
is_keywordtarget_channelauthor_nameheaderr   r   rl  r  http_clientr_  r   r   r
  s                     r3   r?  zBot._handle_sync_message  s    {{**w}}W__EWEWAX\`\g\g\w\wAw  {AMM!--HDKK$4$48H8H$H$$}):):)C)C}HYHYHbHbHiHimqmxmxm}m}H}"))JOP
H
V"kk55c$++:U:U6VW^ea0@0@/AAk,l&mmQXQ_Q_QmQmqtQt,,-Qw~~/K/K.LM  {B  {I  {I  {N  {NK=%HZHZG[[_`g`o`o`t`t_uEv0wwxy9@T[[E`E`Bt{{22315fh((* s sk".. sCs"-//#''2/"FF**,T\\%6%6rzz!))7LWZWcWc%6%de	ss s "]]>fXRPWP_P_O``bcjbkClty]zz>Joo\d\h\h\j-kDwzz* ) I&ruq9I9I8JJp5q/r(rrs G %r51T[[5E5E4FFmnomp1q+r+rrs s s s {s   D5P278N /DP2
OP2P O?O A#O#P%P20P1-P2P0A P22OP2OP2O	P&%PPPPP2P-!P$"P-)P2)r   )rl  )NFrZ   )NNN)!r]   r^   r_   r   r   r4   ra   rJ  r   tupler  r  r   r  r@  r  r   r  r  r   r  r  r  r"  r'  r+  r  r  r  r9  r  r  r?  rb   r5   r3   rl   rl   	  s8   {3c {3T {3s {3z  ( c # s \abfhkbk\l F3 F# F F4 Fbf F -,^	<E:$ :Ut U
 x}   Dir$H# HT H6E  <5[ne\,R,lr5   )r   rl   )Ar`   r3  r  r   rq  syspathlibr   typingr   r   r   r   r   utils.colored_loggerr	   r
   logr   r   r   collectionsr   r*   r   ImportErrorr  config.config_managerr   handlers.alts_handlerr   handlers.ip_handlerr   handlers.logging_handlerr   handlers.log_handlerr   handlers.oauth_handlerr   handlers.phone_handlerr   handlers.word_stats_handlerr   handlers.mc_server_handlerr   commands.user_commandsr   commands.admin_commandsr   rE  r   r   r   r  r   r    r!   utils.steam_location_handlerr"   utils.health_checkr#   r%   LANGUAGE_MAPrO  rl   rb   r5   r3   <module>r     s    )  	   
  3 3 < 
l	# 2 2 #$ 0 - ) 3 + / / 8 6 / 1 E E 
 > *9+ 9+B /d$Yde"@TXkwx#DDX\o}~MQfCl Clg  Ls   
C& &C43C4