66import telegram
77from dotenv import load_dotenv
88from telegram import InlineKeyboardButton , InlineKeyboardMarkup
9- from telegram .ext import Updater , CommandHandler , Filters , CallbackQueryHandler
9+ from telegram .ext import CallbackQueryHandler , CommandHandler , Filters , Updater
1010
11+ from telegramtaskbot .Tasks .Task import Task
1112from telegramtaskbot .Tasks .UrlTask import UrlTask
1213
1314
1415class TelegramTaskBot (object ):
16+ """
17+ A bot that can handle implementations of the different tasks.
18+
19+ Attributes
20+ ----------
21+ jobs : List[telegram.ext.Job]
22+ list of the jobs registered
23+
24+ default_button_list : List[InlineKeyboardButton]
25+ list of the default buttons
26+
27+ cmd_fun : dict
28+ dictionary to map a command to a function
29+
30+ logger : Logger
31+ the logger for the button
32+
33+ Methods
34+ ----------
35+
36+ get_default_filter() -> telegram.ext.Filters.user
37+ returns a user filter
38+
39+ start(self, update, context) -> None
40+ gives the buttons to start or get tasks
41+
42+ run(self) -> None
43+ Start the bot
44+
45+ handle_button(self, update, context) -> None
46+ Function to handle button clicks
47+ """
48+
1549 jobs : List [telegram .ext .Job ] = []
1650 default_button_list : List [InlineKeyboardButton ] = []
1751 cmd_fun = {}
18- job_names = {}
1952 logger = logging .getLogger (__name__ )
2053
21- def __init__ (self , tasks : []) :
54+ def __init__ (self , tasks : List [ Task ]) -> None :
2255 load_dotenv ()
2356 self .updater = Updater (token = os .getenv ('BOT_TOKEN' ), use_context = True )
2457 self .dispatcher = self .updater .dispatcher
2558 default_filter = self .get_default_filter ()
26- self .dispatcher .add_handler (CommandHandler ('start' , self .start , default_filter ))
27- self .dispatcher .add_handler (CallbackQueryHandler (self .handle_button , default_filter ))
59+ self .dispatcher .add_handler (CommandHandler (
60+ 'start' , self .start , default_filter ))
61+ self .dispatcher .add_handler (CallbackQueryHandler (
62+ self .handle_button , default_filter ))
2863
2964 self .TASKS = [task (self .updater .job_queue ) for task in tasks ]
3065
@@ -38,13 +73,15 @@ def __init__(self, tasks: []):
3873 self .dispatcher .add_handler (
3974 CommandHandler (task .job_actual_value , task .get_actual_value_cmd , default_filter ))
4075
41- self .dispatcher .add_handler (CommandHandler (task .job_start_name , task .start_command , default_filter ))
42- self .dispatcher .add_handler (CommandHandler (task .job_stop_name , task .stop_command , default_filter ))
76+ self .dispatcher .add_handler (CommandHandler (
77+ task .job_start_name , task .start_command , default_filter ))
78+ self .dispatcher .add_handler (CommandHandler (
79+ task .job_stop_name , task .stop_command , default_filter ))
4380
44- self .load_from_json ()
81+ self ._load_from_json ()
4582
4683 @staticmethod
47- def get_default_filter ():
84+ def get_default_filter () -> telegram . ext . Filters . user :
4885 str_value = os .getenv ('ALLOWED_USERS' )
4986 if 'any' in str_value or 'ANY' in str_value :
5087 default_filter = None
@@ -53,44 +90,46 @@ def get_default_filter():
5390 default_filter = Filters .user (user_id = allowed_users )
5491 return default_filter
5592
56- def start (self , update , context ):
57- reply_markup = InlineKeyboardMarkup (self .build_menu (self .default_button_list , n_cols = 1 ))
93+ def start (self , update , context ) -> None :
94+ reply_markup = InlineKeyboardMarkup (
95+ self ._build_menu (self .default_button_list , n_cols = 1 ))
5896 context .bot .send_message (chat_id = update .effective_chat .id , text = os .getenv ('START_MESSAGE' ),
5997 reply_markup = reply_markup )
6098
61- def run (self ):
99+ def run (self ) -> None :
62100 self .updater .start_polling (clean = True )
63101
64- def handle_button (self , update , context ):
102+ def handle_button (self , update , context ) -> None :
65103 query = update .callback_query
66104 self .cmd_fun .get (query .data )(self .jobs , update , context )
67- self .save_to_json ()
105+ self ._save_to_json ()
68106 self .logger .info ('after save' )
69107
70- def load_from_json (self ):
108+ def _load_from_json (self ) -> None :
71109 try :
72110 with open ('saved_jobs.json' ) as json_file :
73111 data = json .load (json_file )
74112 for job in data ['jobs' ]:
75113 for task in self .TASKS :
76114 if task .job_name == job ['name' ]:
77- task ._start (self .jobs , self .updater .job_queue , job ['context' ])
115+ task ._start (
116+ self .jobs , self .updater .job_queue , job ['context' ])
78117 self .logger .info (f'Loaded { len (data ["jobs" ])} from JSON' )
79118 except IOError :
80119 self .logger .info ("File not accessible" )
81120
82- def save_to_json (self ):
121+ def _save_to_json (self ) -> None :
83122 data = {'jobs' : []}
84123 for job in self .jobs :
85124 data ['jobs' ].append ({
86125 'context' : job .context ,
87126 'name' : job .name ,
88127 })
89- with open ('saved_jobs.json' , 'w' ) as outfile :
128+ with open ('saved_jobs.json' , 'w+ ' ) as outfile :
90129 json .dump (data , outfile )
91130
92131 @staticmethod
93- def build_menu (buttons , n_cols , header_buttons = None , footer_buttons = None ):
132+ def _build_menu (buttons , n_cols , header_buttons = None , footer_buttons = None ) -> List [ InlineKeyboardButton ] :
94133 menu = [buttons [i :i + n_cols ] for i in range (0 , len (buttons ), n_cols )]
95134 if header_buttons :
96135 menu .insert (0 , header_buttons )
0 commit comments