
    ?UPi^                         d dl Z d dl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 d dl	m
Z
mZmZ d dlmZ  G d d      Zy)    N)datetime)*)COMMANDSMOD_COMMANDSAUTO_MESSAGES)Databasec                       e Zd ZddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)	TwitchBotNc                    || _         || _        t        j                         | _        d| _        d| _        d| _        i | _        t        j                         | _
        d| _        t               | _        d| _        d| _        g | _        d | _        d| _        d| _        d| _        i | _        g | _        d | _        d| _        d| _        d| _        d| _        d| _        d | _        d| _        d| _        y )NF r   ) dbtelegram_botsocketsock	connectedbroadcasteris_stream_onlineuser_messagesr   nowstream_start_timetotal_messagessetactive_usersgiveaway_activegiveaway_itemeligible_userscurrent_winnerwinner_deadlinewaiting_for_trade_linkactive_drop_enabledactive_drop_usersdrop_winnerscurrent_drop_winnerdrop_winner_deadlinewaiting_for_drop_trade_linknumber_game_activesecret_numbernumber_game_maxnumber_game_winnernumber_game_deadlinewaiting_for_number_game_link)selfdatabaser   s      /root/twitch_bot/twitch_bot.py__init__zTwitchBot.__init__   s    (MMO	 !&  !)E  % " &+# $) !##' $%!+0( #( "&$%!,1)    c                    	 d| j                    }t        j                  |d      }|j                  dk(  r\|j                  j                         }|| j                    dk7  }|| j                  k7  rt        |rdnd d|rd	nd
        || _        |S | j                  S # t        $ r$}t        d|        | j                  cY d}~S d}~ww xY w)uN   Проверить статус стрима через публичное APIz https://decapi.me/twitch/uptime/   )timeout   z is offlineu   🟢u   🔴u    [TWITCH] Стрим u   ОНЛАЙНu   ОФЛАЙНu/   ⚠️ [TWITCH] Ошибка проверки: N)	r   requestsgetstatus_codetextstripr   print	Exception)r,   urlresponser8   	is_onlinees         r.   check_stream_statuszTwitchBot.check_stream_status;   s    	)4T5E5E4FGC||C3H##s*}}**, t'7'7&8$DD	 5 55yVf==RenSa  uC  SD  E  F(1%  ((( 	)CA3GH(((	)s$   BB B 	C(CCCc                     | j                   r7| j                          t        j                  t               | j                   r6yy)uA   Постоянная проверка статуса стримаN)r   r@   timesleepCHECK_STREAM_INTERVALr,   s    r.   stream_status_checkerzTwitchBot.stream_status_checkerP   s+    nn$$&JJ,- nnr0   c                    	 | j                   j                  t        t        f       | j                   j	                  dt
         dj                                | j                   j	                  dt         dj                                | j                   j	                  dt         dj                                | j                   j	                  dj                                | j                   j	                  dj                                d| _	        t        dd	 | _
        t        d
t                y	# t        $ r}t        d|        Y d	}~y	d	}~ww xY w)u$   Подключение к Twitch IRCzPASS 
zNICK zJOIN zCAP REQ :twitch.tv/tags
zCAP REQ :twitch.tv/commands
T   Nu%   ✅ [TWITCH] Подключено к u2   ❌ [TWITCH] Ошибка подключения: )r   connect
TWITCH_IRCTWITCH_PORTsendOAUTH_TOKENencodeBOT_USERNAMECHANNELr   r   r:   r;   )r,   r?   s     r.   rJ   zTwitchBot.connectX   s   	LIIz;78IINNU;-t4;;=>IINNU<.5<<>?IINNU7)40779:IINN8??ABIINN<CCEF!DN&qr{D9'CD 	LFqcJKK	Ls   D1D4 4	E=EEc                 :   | j                   st        d|dd  d       y	 | j                  j                  dt         d| dj                                t        d|        t        j                  d	       y# t        $ r}t        d
|        Y d}~yd}~ww xY w)u-   Отправка сообщения в чатu:   ⏸️ [TWITCH] Не отправлено (офлайн): N2   z...zPRIVMSG  :rH   u   📤 [TWITCH] rI   u,   ❌ [TWITCH] Ошибка отправки: )	r   r:   r   rM   rQ   rO   rB   rC   r;   )r,   messager?   s      r.   send_messagezTwitchBot.send_messageg   s    $$NwWZXZ|n\_`a	FIINNXgYb	>EEGHN7),-JJqM 	F@DEE	Fs   AA9 9	BBBc                    	 d|vry|j                  d      r|j                  d      }|dkD  r|d| nd}t        j                  d|      }|sy|j	                  d	      }t        j                  d
|      }|r$|j	                  d	      j                         }|||fS d}t        j                  ||      }	|	r5|	j	                  d	      }|	j	                  d      j                         }d||fS 	 y#  Y yxY w)u%   Парсинг IRC сообщенияPRIVMSG)r   NN@rT   r   Nr   z:(\w+)!\w+@\w+\.tmi\.twitch\.tvrI   zPRIVMSG #\w+ :(.+)z2:(\w+)!\w+@\w+\.tmi\.twitch\.tv PRIVMSG #\w+ :(.+)   )
startswithfindresearchgroupr9   )
r,   datatags_endtagsusername_matchusername	msg_matchrU   patternmatchs
             r.   parse_messagezTwitchBot.parse_messagev   s    	$%s#99T?*2Q,tIXB!#+Mt!T%))//2II&;TB	'ooa0668G722KGIIgt,E ;;q>++a...08W,,  	s   C, AC, AC, AC, ,C0c                     |j                         | j                  j                         k(  ryd|v r2t        j                  d|      }|r|j	                  d      }d|v sd|v ryy)u.   Проверка прав модератораTzbadges=zbadges=([^;]+)rI   zbroadcaster/z
moderator/F)lowerr   r]   r^   r_   )r,   rb   rd   badges_matchbadgess        r.   is_mod_or_broadcasterzTwitchBot.is_mod_or_broadcaster   sd    >>t//557799%6=L%++A.!V+|v/Er0   c                 d   |j                         t        j                         k7  r| j                  j                  |d      dz   | j                  |<   | xj                  dz  c_        | j
                  j                  |       | j                  r"t        j                         | j                  |<   yyy)uH   Отслеживание активности пользователейr   rI   N)
rj   rP   r   r6   r   r   addr    rB   r!   r,   rd   s     r.   track_user_activityzTwitchBot.track_user_activity   s    >>|1133+/+=+=+A+A(A+NQR+RDx(1$!!(+''3799;&&x0 ( 4r0   c                     |j                         j                         }|t        v r| j                  t        |          yy)u.   Обработка обычных командTF)rj   r9   r   rV   )r,   rU   message_lowers      r.   handle_regular_commandsz!TwitchBot.handle_regular_commands   s7    --/H$h}56r0   c                    | j                  ||      sy|j                         j                         }|t        v r| j	                  t        |          y|dk(  rt        j                         | j                  z
  }t        |j                         dz        }t        |j                         dz  dz        }| j	                  d| d| d| j                   d	t        | j                                y|d
k(  r| j                  j                  | j                  | j                  | j                        rL| j	                  d       t        j                         | _        d| _
        | j                  j                          y| j	                  d       yy)uE   Обработка базовых команд модераторовFTz!statsi  <   u   📊 Стрим: u   ч u   м | Сообщений: u    | Юзеров: z
!savestatsu,   ✅ Статистика сохранена!r   u%   ❌ Ошибка сохранения)rm   rj   r9   r   rV   r   r   r   inttotal_secondsr   lenr   r   save_stream_statsclear)r,   rb   rd   rU   rs   durationhoursminutess           r.   handle_mod_basic_commandsz#TwitchBot.handle_mod_basic_commands   s{   ))$9--/L(l=9: H$||~(>(>>H..0D89E8113d:rABG#E7#gY6OPTPcPcOdduvyz~  {L  {L  wM  vN  OP L(ww(()?)?ATATVZVgVgh!!"PQ)1&&'#!!'')  !!"IJr0   c                     t        j                          }g }t        | j                  j                               D ]0  \  }}||z
  t        k  r|j                  |       $| j                  |= 2 |S )uc   Получить активных пользователей за последние 3 минуты)rB   listr!   itemsACTIVE_DROP_ACTIVITY_WINDOWappend)r,   current_timer   rd   	last_times        r.   get_active_drop_userszTwitchBot.get_active_drop_users   sl    yy{#'(>(>(D(D(F#G 	5Hii'+FF##H-**84		5
 r0   c                     | j                   rmt        j                  t               | j                   r:| j                  r.t        | j                               }| j                  d| d       | j                   rlyy)u?   Автоматические объявления о дропеuF  🎁 АКТИВНЫЙ ДРОП НА СТРИМЕ! За просмотр турнира и активность в чате вы участвуете в дропе 🔥 💬 Пишите в чат, оставайтесь на стриме — в любой момент можно получить скин! (Активных: )N)r    rB   rC   ACTIVE_DROP_ANNOUNCE_INTERVALr   ry   r   rV   )r,   active_counts     r.   active_drop_announcerzTwitchBot.active_drop_announcer   sw    &&JJ45''D,A,A"4#=#=#?@!! ]  ^j  ]k  kl  mn	 &&r0   c                 L   | j                   r| j                  d       yd| _         | j                  j                          | j                  j                          | j                  d       t        j                  | j                  d      j                          t        d       y)u*   Запуск активного дропаu7   ⚠️ Активный дроп уже запущен!NTuw   🎁 АКТИВНЫЙ ДРОП ЗАПУЩЕН! 🔥 Пишите в чат и оставайтесь на стриме!targetdaemonu5   ✅ [TWITCH] Активный дроп запущен)
r    rV   r!   r{   r"   	threadingThreadr   startr:   rE   s    r.   start_active_dropzTwitchBot.start_active_drop   s    ##WX#' $$&!  T  	U : :4HNNPEFr0   c                      j                   s j                  d       y j                         }|s j                  d       yt        |      }t	        j
                  |       _        t        j                         t        z    _	        d _
         j                  d j                   d        j                  d|d}t        dd	d
      5 }t        j                  ||       ddd       t        d j                   d       t        j                    j"                        j%                           fd}t        j                   |d      j%                          y# 1 sw Y   {xY w)u.   Выбрать победителя дропаu5   ⚠️ Активный дроп не запущен!Nu2   😢 Нет активных участников!Tu&   🎉 ДРОП! Победитель: @uH   ! ⏰ У тебя 3 минуты! Отправь трейд-ссылку)winneractive
user_countzwinner_data.jsonwutf-8)encodingu   DEBUG: Победитель u%    отправлен в оверлей)r   c                      t        j                  t                j                  r. j	                  d j
                   d       d _        d  _        y y )N   ⏰ @    не успел!F)rB   rC   DROP_RESPONSE_TIMEr%   rV   r#   rE   s   r.   timeout_checkz-TwitchBot.execute_drop.<locals>.timeout_check  sM    JJ)*//!!E$*B*B)CCT"UV380+/( 0r0   r   )r    rV   r   ry   randomchoicer#   rB   r   r$   r%   openjsondumpr:   r   r   delayed_clearr   )r,   r   r   r`   fr   s   `     r.   execute_dropzTwitchBot.execute_drop   sK   ''UV113RS &
#)==#> $(IIK2D$D!+/(B4C[C[B\  ]e  f  	g ..$

 $cG< 	IIdA	 	,T-E-E,FFklm 	 2 2399;	0 	d;AAC	 	s   EE'c                    | j                  ||      sy|j                         j                         }|dk(  r| j                          y|dk(  r/d| _        | j                  dt        | j                                y|dk(  r| j                          y|dk(  rDt        | j                               }| j                  d| d	t        | j                                yy)
u=   Обработка команд активного дропаFz!activedropTz!stopactivedropu8   🛑 Дроп завершён! Победителей: z!dropz
!dropstatsu   📊 Активных: u    | Победителей: )
rm   rj   r9   r   r    rV   ry   r"   r   r   )r,   rb   rd   rU   rs   r   s         r.   handle_active_drop_commandsz%TwitchBot.handle_active_drop_commands&  s    ))$9--/M)""$--',D$ XY\]a]n]nYoXpqrG#L(3356F 7x?Z[^_c_p_p[qZrstr0   c                 V   | j                   r| j                  d       yd| _         t        j                  d|      | _        || _        | j                  d| d       | j                  d       t        d       t        d	|        t        d
| j                          t        d       y)u:   Запуск игры с угадыванием числаu    ⚠️ Игра уже идёт!NTrI   uH   🎲 ИГРА НАЧАЛАСЬ! Угадайте число от 1 до !ut   💬 Пишите свои варианты в чат! Первый кто угадает - получит приз!uE   🎲 [TWITCH] ===== ИГРА С ЧИСЛАМИ ЗАПУЩЕНА =====u$   🎲 [TWITCH] Диапазон: 1 - u/   🎲 [TWITCH] Загаданное число: u9   🎲 [TWITCH] ===========================================)r&   rV   r   randintr'   r(   r:   )r,   
max_numbers     r.   start_number_gamezTwitchBot.start_number_gameC  s    ""@A"&#^^Az:)deodppqrs  Q  	SUW4ZLAB?@R@R?STUIKr0   c           	           j                   sy	 t        j                  d|      }|syt        |d         }|dk  s| j                  kD  ry| j
                  k(  rd _          _        t        j                         t        z    _	        d _
         j                  d d j
                   d	        j                  d
       t        d       t        d        t        d j
                          t        d        fd}t        j                  |d      j                          y| j
                  k  rd}nd}t        d d| d| d       y# t         $ r Y yw xY w)u9   Проверка попытки угадать числоNz\b\d+\br   rI   FTu   🎉 ПОБЕДА! @u    угадал число r   uQ   ⏰ У тебя 3 минуты! Отправь трейд-ссылку в чат!u;   🎉 [TWITCH] ===== ПОБЕДИТЕЛЬ НАЙДЕН =====u$   🎉 [TWITCH] Победитель: u-   🎉 [TWITCH] Угаданное число: u.   🎉 [TWITCH] ================================c                      t        j                  t                j                  r= j	                  d j
                   d       d _        d  _        t        d d       y y )Nr   r   Fu   ⏰ [TWITCH] u=    не отправил трейд-ссылку вовремя)rB   rC   r   r+   rV   r)   r:   rp   s   r.   r   z3TwitchBot.check_number_guess.<locals>.timeout_checkw  s_    JJ1288))E$2I2I1JJ[*\]<A926/hZ7tuv	 9r0   r   u   большеu   меньшеu   🎲 [TWITCH] z: u    (число r   )r&   r]   findallrw   r(   r'   r)   rB   r   r*   r+   rV   r:   r   r   r   
ValueError)r,   rd   rU   numbersguessr   hints   ``     r.   check_number_guesszTwitchBot.check_number_guessU  sf   &&.	jjW5G
OE qyED$8$88 ****/'*2',0IIK:L,L)481!!$8
B[\`\n\n[oop"qr!!$uwSU<XJGHEdFXFXEYZ[FHw   dCIIK 4---)D)Dxj5'tfANO 		s#   E "E CE ,)E 	E"!E"c                    | j                  ||      sy|j                         j                         }t        d| d       |j	                  d      r|j                         }t        |      dk\  ra|d   j                         rNt        |d         }|dk  r| j                  d       y|d	kD  r| j                  d
       y| j                  |       y| j                  d       y|dk(  rvt        d       t        d| j                          | j                  r5d| _        | j                  d| j                          t        d| d       y| j                  d       yy)u:   Обработка команд игры с числамиFu8   🔍 [DEBUG] Проверяю команду игры: ''z
!randomnumrZ   rI   
   u7   ❌ Число должно быть минимум 10!i u;   ❌ Число не должно превышать 100000!u/   ❌ Используй: !randomnum <число>Tz!stopnumberu8   🔍 [DEBUG] Команда !stopnumber полученаu&   🔍 [DEBUG] Игра активна: uP   🛑 Игра остановлена! Загаданное число было: uF   🛑 [TWITCH] Игра остановлена модератором (r   u#   ❌ Игра не запущена!)rm   rj   r9   r:   r[   splitry   isdigitrw   rV   r   r&   r'   )r,   rb   rd   rU   rs   partsmax_nums          r.   handle_number_game_commandsz%TwitchBot.handle_number_game_commands  s|   ))$9--/HWXYZ ##L1MMOE5zQ58#3#3#5eAh-R<%%&_`  v%%%&cd
  **73  !!"ST M)LN:4;R;R:STU&&*/'!!$tuy  vH  vH  uI  #J  K^_g^hhijk  !!"GHr0   c                      j                   r|j                          j                  j                         k(  rt        j                  t
        |      }|r|j                  d      }t        j                          j                  k  rW j                  d| d        j                  j                  ||      r j                  d       d _        d _         d _         j                  r|j                          j                  j                         k(  rt        j                  t
        |      }|r|j                  d      }t        j                          j                  k  r j                  d| d        j                  j                  ||      r j                  d        j                   j#                  |       d _        d _         fd	}t%        j&                  |d
      j)                           j*                  r|j                          j,                  j                         k(  rt        j                  t
        |      }|r|j                  d      }t        j                          j.                  k  r` j                  d| d        j                  j                  ||      r  j                  d       t1        d| d       d _        d _        yyyyy)uB   Проверка трейд-ссылки от победителяr   u   ✅ @u    прошёл проверку!u%   💾 Данные сохранены!FNu    дроп получен!u+   💾 Победитель сохранён!c                  P    t        j                  d        j                          y )Nr2   )rB   rC   clear_overlayrE   s   r.   r   z1TwitchBot.check_trade_link.<locals>.delayed_clear  s     JJqM ..0r0   Tr   u    приз получен!u+   💾 [TWITCH] Трейд-ссылка от u    сохранена в БД)r   rj   r   r]   r^   TRADE_LINK_PATTERNr_   rB   r   rV   r   save_winnerr   r%   r#   r$   r"   r   r   r   r   r+   r)   r*   r:   )r,   rd   rU   rg   
trade_linkr   s   `     r.   check_trade_linkzTwitchBot.check_trade_link  sd    &&~~4#6#6#<#<#>>		"4g>!&QJyy{d&:&::))E(;Z*[\77..xD --0UW/4,6;3.2+ ++~~4#;#;#A#A#CC		"4g>!&QJyy{d&?&??))E(;T*UV77..xD --0[]))00:;@83701 "((dKQQS ,,~~4#:#:#@#@#BB		"4g>!&QJyy{d&?&??))E(;T*UV77..xD --0[]!$OPXzYt"uv<A926/ @  C -r0   c                     | j                   rOt        j                  |dz         | j                   r| j                  r| j	                  |       | j                   rNyy)u@   Автоматическая отправка сообщенийrv   N)r   rB   rC   r   rV   )r,   rU   intervals      r.   auto_message_senderzTwitchBot.auto_message_sender  s?    nnJJx"}%~~$"7"7!!'* nnr0   c                     t         D ]:  }t        j                  | j                  |d   |d   fd      j	                          < y)u'   Запуск автосообщенийrU   r   T)r   argsr   N)r   r   r   r   r   )r,   auto_msgs     r.   start_auto_messageszTwitchBot.start_auto_messages  sF    % 	H//y)8J+?@ eg	r0   c                 \   | j                   s| j                          t        d       | j                          t	        j
                  | j                  d      j                          | j                          t        d       	 	 | j                  j                  d      j                  dd      }|j                  d	      r*| j                  j                  d
j                                i| j                  |      \  }}}|r|r| j!                  |       | j#                  ||       | j%                  ||       | j'                  |      r| j)                  |||      r| j+                  |||      r| j-                  |||      r# t.        $ rI t        d       | j0                  j3                  | j4                  | j6                  | j8                         Y n8t:        $ r-}t        d|        t=        j>                  d       Y d}~d}~ww xY w| j                  jA                          y)u   Запуск ботаuP   🔍 [TWITCH] Запуск мониторинга статуса стрима...Tr   u#   ✅ [TWITCH] Бот запущен!i   r   ignore)errorsPINGzPONG :tmi.twitch.tv
u$   
👋 [TWITCH] Остановка...u   ⚠️ [TWITCH] Ошибка: r2   N)!r   rJ   r:   r@   r   r   rF   r   r   r   recvdecoder[   rM   rO   rh   rq   r   r   rt   r   r   r   KeyboardInterruptr   rz   r   r   r   r;   rB   rC   close)r,   r`   rb   rd   rU   r?   s         r.   runzTwitchBot.run  s   ~~LLN 	`a  " : :4HNNP  "34yy~~d+22782L??6*IINN#<#C#C#EF*.*<*<T*B'h,,X6))(G< ++Hg>33G< 55dHgN 77hP 77hP / 2 % =>))$*@*@$BUBUW[WhWhi 6qc:;

1 			s9   A&F
 +AF
 F
 F
 3F
 
AHH##HH)N)__name__
__module____qualname__r/   r@   rF   rJ   rV   rh   rm   rq   rt   r   r   r   r   r   r   r   r   r   r   r   r   r    r0   r.   r
   r
      s|    &2T)*.LF<?D	nG)DV:L$4l$P17j+.r0   r
   )r   r]   rB   r   r   r5   r   r   configcommandsr   r   r   r-   r   r
   r   r0   r.   <module>r      s7     	        : : X Xr0   