
    HE^jO                     p   d dl Z d dlmZmZ d dlmZ d dlmZ d dlm	Z	 d dl
Zd dlmZ d dlmZmZ d#ded	ed
efdZded
efdZd$dedee   dee   d
eee   ee   f   fdZded
dfdZdeded
dfdZ	 	 	 	 d%dededee   dee   dee   d
dfdZd&dededee   d
dfdZdedefd Zd!ee   ded
dfd"Zy)'    N)OptionalList)settings)_log)_get_session)get_db_connection)clean_modelget_product_cpu_gpunamemax_lenreturnc                 2    t        |       |k  r| S | d | dz   S )Nu   …)len)r   r   s     ,/home/container/backend/notifier/telegram.py_truncate_namer   
   s$    
4yG>E!!    textc                 f    | j                  dd      j                  dd      j                  dd      S )z<Escape HTML special characters for Telegram HTML parse mode.&z&amp;<z&lt;>z&gt;)replace)r   s    r   _escape_htmlr      s-    <<W%--c6:BB3OOr   chat_id	photo_urlc                    t         j                  sy|xs t         j                  }|sy|r|j                  d      rd|z   }|rt	        |       dk  r	 t               }ddi}|j                  ||d      }|j                  d	k(  rS|j                  }d
t         j                   d}|j                  j                  dd      j                  d      d   j                         }	d}
d|	j                         v sd|	j                         v rd}
d}	n-d|	j                         v rd}
d}	nd|	j                         v rd}
d}	d|
||	fi}|| dd}t        j                  |||d      }|j                  d	k(  rC	 |j                         }|j                  d i       j                  d!      }|rt!        |      dfS 	 yt%        d"|j                   d#|j&                   d$       nt%        d%|j                   d$       d
t         j                   d'}g }t	        |       d(kD  rP| j)                  d)dd(      }|d*k(  rd(}|j+                  | d |        | |d  j-                         } t	        |       d(kD  rP| r|j+                  |        d }|D ]  }||dd+d,}	 t               }|j                  ||d-      }|j                  d	k(  r@	 |j                         }|j                  d i       j                  d!      }|rt!        |      }n%t%        d.|j                   d#|j&                           |r|d0fS y# t"        $ r Y yw xY w# t"        $ r}t%        d&| d$       Y d }~^d }~ww xY w# t"        $ r Y Iw xY w# t"        $ r}t%        d/|        Y d }~d }~ww xY w)1NNN//https:i   acceptzimage/png,image/jpeg,image/webp   )headerstimeout   https://api.telegram.org/botz
/sendPhotozcontent-typez	image/png;r   zthumbnail.pngjpegjpgzthumbnail.jpgz
image/jpegwebpzthumbnail.webpz
image/webpgifzthumbnail.gifz	image/gifphotoHTML)r   caption
parse_mode   )datafilesr#   result
message_idz([Telegram] Failed to upload photo: HTTP  - z. Falling back to text.z3[Telegram] Failed to download photo from CDN: HTTP z [Telegram] Error sending photo: z/sendMessagei  
T)r   r   r.   disable_web_page_previewjsonr#   z([Telegram] Failed to send message: HTTP z"[Telegram] Error sending message: r   )r   TELEGRAM_BOT_TOKENTELEGRAM_CHANNEL_ID
startswithr   r   getstatus_codecontentr"   splitstriplowerstandard_requestspostr9   str	Exceptionr   r   rfindappendlstrip)r   r   r   target_chatsessiondownload_headersimg_respimg_dataphoto_url_apimimefilenamer1   photo_payloadrespres_jsonmsg_ideurlchunks	split_idxlast_msg_idchunkpayloads                          r   _send_telegram_textr]      s   &&9X99KY))$/y(	 SY$&-	P"nG (*KL{{96FPR{SH##s*#++">x?Z?Z>[[e f''++NKHNNsSTUV\\^*TZZ\)Udjjl-B.H'Dtzz|+/H'Ddjjl*.H&D h$7  +#"(! )--m-W\fhi##s*#'99;!)h!;!?!?!M!#&v;#77 " &CDDTDTCUUXY]YbYbXccz{|J8K_K_J``wxy
 ))D)D(E\
RC F
d)d
JJtQ-	?Id:I&'IJ&&( d)d
 dK" (,	
	;"nG<<'2<>D3&#yy{H%\\(B7;;LIF&)&k ?@P@P?QQTUYU^U^T_`a' . F""e % %  	P3A36MNOO	PD !   	;5aS9::	;sz   DL2 0?L# 2A L2 -M'6>M4&M'#	L/,L2 .L//L2 2	M;MM	M$!M'#M$$M''	N	0NN	db_countc                 h    t         j                  sy d|  d}t        |t         j                         y )NzO<b>TrackFurb India Tracker Online</b>

Monitoring active.
Database loaded with z
 products.r   r   TELEGRAM_OWNER_IDr]   )r^   r   s     r   send_telegram_startup_alertrc   y   s6    %%  (z	5 	
 h&@&@Ar   active_countremoved_countc                 l    t         j                  sy d|  d| }t        |t         j                         y )Nz[<b>TrackFurb India: Scan Complete</b>

Manual scan finished successfully.
Active products: z
Removed products: r`   ra   )rd   re   r   s      r   !send_telegram_once_complete_alertrg      s>    %%(> **O	- 	 h&@&@Ar   product
event_type	old_pricelisting_durationrestock_durationc                 	   t         j                  sy || j                  d      }|| j                  d      }t        | j                  dd            }| j                  dd      }| j                  dd      }t        | j                  dt         j                              }t        | j                  d	d
            }	t        |      }
| j                  d      xs d|	 }|j                  d      r|}n=|r+|j                  d      sd| }t         j                   | }nt         j                  }t        |       \  }}t        |      }t        |      }|dk(  r#d| d|
 d}d|	 d| d| d| d| d| d| d}n>|dk(  r2d| d|
 d}d|	 d| d| d| d| d| }|r|d| z  }|d| dz  }n|dk(  r"d| d|
 d}d|	 d | d!| d"| d#| d| d| d}n|d$k(  r"d%| d|
 d}d|	 d | d!| d"| d#| d| d| d}n|d&k(  rd'| d|
 d}d|	 g}|dk7  r|j                  d(| d| d)       |r|j                  d*|        |j                  d+|        |j                  d,|        |r|j                  d-|        |j                  d.       d/j                  |      }nd0| d|
 d}d|	 d1| }| j                  d2      }|s| j                  d3i       }|j                  d4      xs i }|j                  d5      xs i }|j                  d6g       }t        |t              r#|j                  d7      r|j                  d7      }nyt        |t              r#|j                  d7      r|j                  d7      }nF|rDt        |t              r4t        |      d8kD  r&|d8   }t        |t              r|j                  d7      }|r|j                  d9      rd:|z   }d;| d<| }t!        ||=      \  }}|rt         j"                  r	 t%               }	 |j'                         }t)        j*                  d>      }|j-                  d?|	t/        t         j"                        t/        |      |||f       |j1                          |j3                          y y y # |j3                          w xY w# t4        $ r}t7        d@|        Y d }~y d }~ww xY w)AN_listing_duration_restock_durationproductNameUnknown Product
finalPriceN/AsavePercentproductConditionproductCode?rW   /p/http/addedzProduct Added: <a href=""></a>Model: 
Price:  INR (-%)
Condition:    
⚙️ CPU:    
🎮 GPU:    

🔗 <a href="">Buy on Lenovo Store</a>restockzProduct Restocked: <a href="z
Restocked after: 
price_dropzPrice Drop: <a href="z
New Price: z
 INR (Was z INR)
Savings: -u   %
⚙️ CPU: 
price_hikezPrice Hike: <a href="removedzProduct Removed: <a href="zLast Price: z%)zCondition: u   ⚙️ CPU: u
   🎮 GPU: zListed for: z0This item is temporarily unavailable or removed.r5   zTracker Alert: <a href="z
Unknown event type: thumbnail_urlmedia	heroImage	thumbnailgalleryimageAddressr   r   r   <b></b>

)r   z%Y-%m-%d %H:%M:%Sz
                    INSERT OR REPLACE INTO sent_messages
                    (platform, product_code, target_id, message_id, event_type, message_type, sent_at)
                    VALUES ('telegram', ?, ?, ?, ?, ?, ?)
                z0[Telegram] Database error logging sent message: )r   TELEGRAM_ENABLEDr=   r   DEFAULT_CONDITIONr   r<   LENOVO_BASE_URLLENOVO_LAPTOPS_URLr
   rH   join
isinstancedictlistr   r]   r;   r   cursortimestrftimeexecuterE   commitcloserF   r   )rh   ri   rj   rk   rl   r   pricesaving	conditioncodedisplay_nameurl_pathrW   cpugputitlebodylinesr   r   herothumbr   itemr   rU   msg_typeconnr   now_strrV   s                                  r   send_telegram_notificationr      s    $$";;':;";;':;M3DEFDKKe,E[[.FW[[);X=W=WXYIM378D!$'L {{5!1s4&\H6"	""3'8*~H))*8*5))"7+HC
s
C
s
CW+C5L>FiwgfX_YKWefiejjvwzv{  |O  PS  OT  Tn  o	y	 /uC~TJiwgfX_YKWefiejjvwzv{|)*:);<<D%cU*DEE	|	#(SdCmE7*YKGXY_X``opsot  uA  BE  AF  FY  Z]  Y^  ^x  y	|	#(SdCmE7*YKGXY_X``opsot  uA  BE  AF  FY  Z]  Y^  ^x  y	y	 -cU#l^4H4&!"E>LL<wgfXR@ALL;yk23|C5)*z#'(LL<(8'9:;GHyy+C5L>F4ZLAO,IGR(yy%+		+&,"))Ir*dD!dhh~&>0It$>)B		.1IGT2s7|a7G1:D$% HH^4	Y))$/y(	xv&D*49EFH(..	I$&D
--(;<   C < <=s6{JX`bij	l
 

 /v 

 	ICA3GHH	Is1   	
R) A-R R) R&&R) )	S
2SS
product_codestatusexpire_timec                      t         j                  rt         j                  syddl} fd}|j	                  |d      j                          y)zBTrigger non-blocking Telegram message edits for state transitions.Nr   c                     	 t               } 	 | j                         }|j                  df       |j                         }| j	                          |D ]  }|d   }|d   }|d   }|d   }d }t               } 	 | j                         }|j                  df       |j                         }	|	rt        |	      }| j	                          |sxt        |j                  dd            }
|j                  d	d
      }|j                  dd
      }t        |j                  dt        j                              }t        t        |
            }t        j                   d }t        di      \  }}t        |      }t        |      }dk(  rd| d| d}d d| d| d| d| d| d}ndk(  r7d| d| d}t        j                   d      }d d| d| d| d| d| d| d}nPd k(  rI|d!k(  r"d"| d| d}d d| d| d| d| d| d#| d$}n$d%| d| d}d d| d| d| d| d| d#| d$}nd&| d'| }|d(k(  rd)t        j"                   d*}|||d+d,}nd)t        j"                   d-}|||d+d.d/}	 t%        j&                  ||d01      }|j(                  d2k(  rd3|j*                  v rt-        |       n7|j(                  d4k7  r(t/        d5| d6|j(                   d7|j*                           y # | j	                          w xY w# | j	                          w xY w# t0        $ r}t/        d8|        Y d }~d }~ww xY w# t0        $ r}t/        d9|        Y d }~y d }~ww xY w):Nz
                    SELECT target_id as chat_id, message_id, event_type, message_type
                    FROM sent_messages
                    WHERE platform = 'telegram' AND product_code = ?
                r   r3   ri   message_typez
                        SELECT product_name, condition, current_price, save_percent 
                        FROM products WHERE product_code = ?
                    product_namerq   current_pricers   save_percentr   rx   r   	cart_holdu9   ⚠️ [Temporarily Reserved] Product Reserved: <a href="r|   r}   r~   r   r   r   r   r   u   

🛒 Temporarily Reserved.sold_outu9   🔴 [Temporarily Unavailable] Product Removed: <a href="z%I:%M %pz
Last Price: z

Temporarily unavailable at z IST.	restockedr   u   📉 Price Drop: <a href="r   r   u!   🆕 Product Restocked: <a href="r   r   r+   r%   z/editMessageCaptionr,   )r   r3   r-   r.   z/editMessageTextT)r   r3   r   r.   r7   r!   r8   i  zmessage to edit not foundr$   z'[Telegram Edit] Failed to edit message z: HTTP r4   z'[Telegram Edit] Error editing message: z[Telegram Edit] Error: )r   r   r   fetchallr   fetchoner   r   r=   r   r   r   r	   r   r
   r   r   r:   rC   rD   r>   r   _purge_telegram_messager   rF   )r   r   rowsrowr   r3   original_event_typer   product_datap_rowr   r   r   r   r   rW   r   r   r   r   	sold_timenew_texturl_apir\   rS   rV   exr   r   s                              r   do_editz'dispatch_telegram_edit.<locals>.do_edit  s   ]	1$&D	   #_	&
 (

i. .
&),&7#">2#(*
!![[]FNN $ '* #OO-E'+E{JJL##L$4$4^EV$WX$((%@%)).%@()9)9+xGaGa)bc	-k$.?@!112#l^D./MNS"3'"3'[(XY\X]]`am`nnrsE$\N)E7'&Q`aj`kkyz}y~  K  LO  KP  Pn  oDz)XY\X]]`am`nnrsE $j 9I$\N.wvhVefoepp~  @C  D  DP  QT  PU  Ut  u~  t  D  ED{**l:"=cU#l^SW X!(iwgfXUdendoo}  B  ~C  CO  PS  OT  Tg  hk  gl  lF   G"DSE\NZ^ _!(iwgfXUdendoo}  B  ~C  CO  PS  OT  Tg  hk  gl  lF   G xv67* <X=X=X<YYlmG#*&0#+&,	G !=X=X=X<YYijG#*&0 (&,48GH,11'QSTD''3.3NRVR[R[3[/gF))S0FzlRYZ^ZjZjYkknosoxoxnyz{Y  

( JJLv ! HB1#FGGH 	1*2$/00	1ss   
M 3K5 6M 8A L
8F?M 8A9L1M 5LM 
LM 	M(L<6M <MM 	M%M  M%T)targetdaemon)r   r   r:   	threadingThreadstart)r   r   r   r   r   s   ``   r   dispatch_telegram_editr      s?    $$H,G,G^1@ GD1779r   c                 J   	 t               }	 |j                         }|j                  d| t        |      f       |j	                          t        d|  d|        |j                          y # |j                          w xY w# t        $ r}t        d|        Y d }~y d }~ww xY w)Nz\DELETE FROM sent_messages WHERE platform = 'telegram' AND product_code = ? AND target_id = ?z2[Telegram Edit] Purged deleted message record for z	 in chat z.[Telegram Edit] Error purging message record: )r   r   r   rE   r   r   r   rF   )r   r   r   r   rV   s        r   r   r   d  s    
C "	[[]FNNy  }I  KN  OV  KW  |X  YKKMEl^S\]d\efgJJLDJJL C=aSABBCs/   
B AA, B ,A>>B 	B"
BB"batchc                 
   t         j                  r| sy t        |       }|dk(  r/| d}d| d| d}g }| D ]  }t        |j	                  dd            }t        t        |j	                  dd	      d
            }|j	                  dd      }	|j	                  d      xs d| }
|
j                  d      r|
}n=|
r+|
j                  d      sd|
 }
t         j                   |
 }nt         j                  }t        |      \  }}t        |      }t        |      }|j                  d| d| d|	 d| d| d| d       	 dj                  |      }n|dk(  rM| d}d| d| d}g }| D ]$  }t        |j	                  dd            }t        t        |j	                  dd	      d
            }|j	                  dd      }	|j	                  d      xs d| }
|
j                  d      r|
}n=|
r+|
j                  d      sd|
 }
t         j                   |
 }nt         j                  }|j	                  d      }|rd| dnd}t        |      \  }}t        |      }t        |      }|j                  d| d| d|	 d| d| d| d| d       ' dj                  |      }nM|d k(  r7| d!}d| d| d"}g }| D ]  }t        |j	                  dd            }t        t        |j	                  dd	      d
            }|j	                  d      xs d| }
|
j                  d      r|
}n=|
r+|
j                  d      sd|
 }
t         j                   |
 }nt         j                  }|j	                  d#      }|rd$| dnd}t        |      \  }}t        |      }t        |      }|j                  d| d| d%| d| d| d| d        dj                  |      }n| d&}d| d}| d'}||z   }t        |       y )(Nr{   z Products Addedr   r   z new products detected:
rv   rw   rp   Unknown   rr   rW   rx   ry   rz   u   • <a href="r|   u	   </a> — z INR (u	   ) — <i>z | z</i>r5   r   z Products Restockedz restocked products detected:
ro   z (Restocked after: ) u    — <i>r   z Products Removedz. products temporarily unavailable or removed:
rn   z (Listed for: z</a> (z Tracker Eventsz events occurred.)r   r   r   r   r=   r   r<   r   r   r
   rH   r   r]   )r   ri   countr   header
item_linespr   r   r   r   rW   r   r   r   durationduration_strr   s                     r   send_telegram_batchr   q  s   $$EJEW')ugXeW,EF
AmS 9:Dquu]I/NPR STDEE,,E uuU|3TF|H""6***3/!"8*~H!1128*=11*1-HCs#Cs#Cse3tfIeWFSWRXXabeaffijminnrst' ( yy$	y	 ',-ugXeW,KL
AmS 9:Dquu]I/NPR STDEE,,E uuU|3TF|H""6***3/!"8*~H!1128*=11uu01H@H0
!<bL*1-HCs#Cs#Cse3tfIeWFSWRXXYZfYggopsottwx{w|  }A  B  C+ , yy$	y	 '*+ugXeW,[\
AmS 9:Dquu]I/NPR STD uuU|3TF|H""6***3/!"8*~H!1128*=11uu01H;C^H:Q7L*1-HCs#Cs#Cse3tfF4&,W_`c_ddghkgllpqr) * yy$')ugX&)*D=Dr   )(   r   )r{   NNN)N)r   typingr   r   backend.configr   backend.logging_configr   backend.scraper.apir   requestsrC   backend.db.connectionr   backend.scraper.enrichmentr	   r
   rE   intr   r   tupler]   rc   rg   r   floatr   r   r   r    r   r   <module>r      s    ! # ' , $ 3 G" "s "C "
Ps Ps Pdc dHSM dXVY] dfkltuxly  |D  EH  |I  mI  gJ dLB# B$ B	BC 	B 	BPT 	B !%&*&*lIlIlI lI sm	lI
 smlI 
lI\f: f:c f:QT f:ae f:PC# C CZtDz Zs Zt Zr   