2022-10-25 18:04:12 +00:00
import time
2023-02-13 12:41:06 +00:00
import traceback
2022-10-25 18:04:12 +00:00
from decouple import config
2022-10-20 20:53:51 +00:00
from django . core . management . base import BaseCommand
2023-02-13 12:41:06 +00:00
from django . db import transaction
2022-02-21 23:41:36 +00:00
from api . messages import Telegram
2022-10-25 18:04:12 +00:00
from api . models import Profile
2022-08-08 15:58:06 +00:00
from api . utils import get_session
2022-02-21 23:41:36 +00:00
2022-10-20 09:56:10 +00:00
2022-02-21 23:41:36 +00:00
class Command ( BaseCommand ) :
help = " Polls telegram /getUpdates method "
2022-10-20 09:56:10 +00:00
rest = 3 # seconds between consecutive polls
2022-02-21 23:41:36 +00:00
2022-10-20 09:56:10 +00:00
bot_token = config ( " TELEGRAM_TOKEN " )
updates_url = f " https://api.telegram.org/bot { bot_token } /getUpdates "
2022-08-08 15:58:06 +00:00
session = get_session ( )
2022-02-22 02:12:42 +00:00
telegram = Telegram ( )
2022-10-20 09:56:10 +00:00
2022-02-21 23:41:36 +00:00
def handle ( self , * args , * * options ) :
offset = 0
while True :
time . sleep ( self . rest )
2022-10-20 09:56:10 +00:00
params = { " offset " : offset + 1 , " timeout " : 5 }
2023-02-13 12:41:06 +00:00
try :
response = self . session . get ( self . updates_url , params = params )
if response . status_code != 200 :
with open ( " error.log " , " a " ) as f :
f . write (
f " Error getting updates, status code: { response . status_code } \n "
)
continue
response = response . json ( )
response = self . session . get ( self . updates_url , params = params ) . json ( )
except Exception as e :
with open ( " error.log " , " a " ) as f :
f . write ( f " Error getting updates: { e } \n { traceback . format_exc ( ) } \n " )
2022-02-21 23:41:36 +00:00
continue
2022-03-01 13:56:37 +00:00
2023-02-13 12:41:06 +00:00
if not response [ " result " ] :
continue
for result in response [ " result " ] :
if not result . get ( " message " ) or not result . get ( " message " ) . get ( " text " ) :
continue
message = result [ " message " ] [ " text " ]
if not message or not message . startswith ( " /start " ) :
continue
parts = message . split ( " " )
if len ( parts ) < 2 :
self . telegram . send_message (
chat_id = result [ " message " ] [ " from " ] [ " id " ] ,
text = ' You must enable the notifications bot using the RoboSats client. Click on your " Robot profile " -> " Enable Telegram " and follow the link or scan the QR code. ' ,
)
continue
token = parts [ - 1 ]
profile = Profile . objects . filter ( telegram_token = token ) . first ( )
if not profile :
self . telegram . send_message (
chat_id = result [ " message " ] [ " from " ] [ " id " ] ,
text = f ' Wops, invalid token! There is no Robot with telegram chat token " { token } " ' ,
)
2022-03-01 13:56:37 +00:00
continue
2022-10-20 09:56:10 +00:00
2023-02-13 12:41:06 +00:00
attempts = 5
while attempts > = 0 :
2022-10-20 09:56:10 +00:00
try :
2023-02-13 12:41:06 +00:00
with transaction . atomic ( ) :
2022-10-20 09:56:10 +00:00
profile . telegram_chat_id = result [ " message " ] [ " from " ] [ " id " ]
profile . telegram_lang_code = result [ " message " ] [ " from " ] [
" language_code "
]
2022-03-18 21:21:13 +00:00
self . telegram . welcome ( profile . user )
profile . telegram_enabled = True
profile . save ( )
2022-03-26 15:23:34 +00:00
break
2023-02-13 12:41:06 +00:00
except Exception :
time . sleep ( 5 )
attempts - = 1
2022-10-20 09:56:10 +00:00
offset = response [ " result " ] [ - 1 ] [ " update_id " ]