1313 from urllib2 import urlopen , Request
1414 from urllib2 import HTTPError , URLError
1515import functools
16+ import logging
1617
1718from telegram import (User , Message , Update , UserProfilePhotos , TelegramError ,
18- ReplyMarkup , InputFile )
19+ ReplyMarkup , InputFile , TelegramObject )
1920
21+ logging .basicConfig (format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' )
2022
21- class Bot (object ):
23+
24+ class Bot (TelegramObject ):
2225
2326 def __init__ (self ,
2427 token ,
25- base_url = None ):
28+ base_url = None ,
29+ debug = True ):
30+ self .log = logging .getLogger (__name__ )
31+ if debug :
32+ self .log .setLevel (logging .DEBUG )
33+ else :
34+ self .log .setLevel (logging .INFO )
2635
2736 self .token = token
2837
@@ -45,39 +54,27 @@ def __init__(self,
4554
4655 @property
4756 def name (self ):
48- if self .username :
49- return '@%s' % self .username
50- if self .last_name :
51- return '%s %s' % (self .first_name , self .last_name )
52- return self .first_name
57+ return '@%s' % self .username
5358
54- def clearCredentials (self ):
55- """Clear any credentials for this instance.
56- """
57- self .__auth = False
59+ def log (func ):
60+ logger = logging .getLogger (func .__module__ )
5861
59- def getMe (self ):
60- """A simple method for testing your bot's auth token.
61-
62- Returns:
63- A telegram.User instance representing that bot if the
64- credentials are valid, None otherwise.
65- """
66- url = '%s/getMe' % self .base_url
67-
68- json_data = self ._requestUrl (url , 'GET' )
69- data = self ._parseAndCheckTelegram (json_data )
70-
71- return User .de_json (data )
62+ @functools .wraps (func )
63+ def decorator (self , * args , ** kwargs ):
64+ logger .debug ('Entering %s' % func .__name__ )
65+ result = func (self , * args , ** kwargs )
66+ logger .debug (result )
67+ logger .debug ('Exiting %s' % func .__name__ )
68+ return result
69+ return decorator
7270
7371 def message (func ):
7472 """
7573 Returns:
7674 A telegram.Message instance representing the message posted.
7775 """
78- functools .wraps (func )
79-
80- def wrap (self , * args , ** kwargs ):
76+ @functools .wraps (func )
77+ def decorator (self , * args , ** kwargs ):
8178 url , data = func (self , * args , ** kwargs )
8279
8380 if kwargs .get ('reply_to_message_id' ):
@@ -98,18 +95,41 @@ def wrap(self, *args, **kwargs):
9895 return data
9996
10097 return Message .de_json (data )
101- return wrap
98+ return decorator
10299
103100 def require_authentication (func ):
104- functools .wraps (func )
105-
106- def wrap (self , * args , ** kwargs ):
101+ @functools .wraps (func )
102+ def decorator (self , * args , ** kwargs ):
107103 if not self .__auth :
108104 raise TelegramError ({'message' : "API must be authenticated." })
109105
110106 return func (self , * args , ** kwargs )
111- return wrap
107+ return decorator
108+
112109
110+ @log
111+ @require_authentication
112+ def clearCredentials (self ):
113+ """Clear any credentials for this instance.
114+ """
115+ self .__auth = False
116+
117+ @log
118+ def getMe (self ):
119+ """A simple method for testing your bot's auth token.
120+
121+ Returns:
122+ A telegram.User instance representing that bot if the
123+ credentials are valid, None otherwise.
124+ """
125+ url = '%s/getMe' % self .base_url
126+
127+ json_data = self ._requestUrl (url , 'GET' )
128+ data = self ._parseAndCheckTelegram (json_data )
129+
130+ return User .de_json (data )
131+
132+ @log
113133 @message
114134 @require_authentication
115135 def sendMessage (self ,
@@ -149,6 +169,7 @@ def sendMessage(self,
149169
150170 return url , data
151171
172+ @log
152173 @message
153174 @require_authentication
154175 def forwardMessage (self ,
@@ -182,6 +203,7 @@ def forwardMessage(self,
182203
183204 return url , data
184205
206+ @log
185207 @message
186208 @require_authentication
187209 def sendPhoto (self ,
@@ -223,6 +245,7 @@ def sendPhoto(self,
223245
224246 return url , data
225247
248+ @log
226249 @message
227250 @require_authentication
228251 def sendAudio (self ,
@@ -260,6 +283,7 @@ def sendAudio(self,
260283
261284 return url , data
262285
286+ @log
263287 @message
264288 @require_authentication
265289 def sendDocument (self ,
@@ -294,6 +318,7 @@ def sendDocument(self,
294318
295319 return url , data
296320
321+ @log
297322 @message
298323 @require_authentication
299324 def sendSticker (self ,
@@ -328,6 +353,7 @@ def sendSticker(self,
328353
329354 return url , data
330355
356+ @log
331357 @message
332358 @require_authentication
333359 def sendVideo (self ,
@@ -363,6 +389,7 @@ def sendVideo(self,
363389
364390 return url , data
365391
392+ @log
366393 @message
367394 @require_authentication
368395 def sendLocation (self ,
@@ -399,6 +426,7 @@ def sendLocation(self,
399426
400427 return url , data
401428
429+ @log
402430 @message
403431 @require_authentication
404432 def sendChatAction (self ,
@@ -430,6 +458,7 @@ def sendChatAction(self,
430458
431459 return url , data
432460
461+ @log
433462 @require_authentication
434463 def getUserProfilePhotos (self ,
435464 user_id ,
@@ -465,6 +494,7 @@ def getUserProfilePhotos(self,
465494
466495 return UserProfilePhotos .de_json (data )
467496
497+ @log
468498 @require_authentication
469499 def getUpdates (self ,
470500 offset = None ,
@@ -505,6 +535,7 @@ def getUpdates(self,
505535
506536 return [Update .de_json (x ) for x in data ]
507537
538+ @log
508539 @require_authentication
509540 def setWebhook (self ,
510541 webhook_url ):
@@ -531,6 +562,7 @@ def setWebhook(self,
531562
532563 return True
533564
565+ @log
534566 def _requestUrl (self ,
535567 url ,
536568 method ,
@@ -581,6 +613,7 @@ def _requestUrl(self,
581613
582614 return 0 # if not a POST or GET request
583615
616+ @log
584617 def _parseAndCheckTelegram (self ,
585618 json_data ):
586619 """Try and parse the JSON returned from Telegram and return an empty
@@ -604,3 +637,11 @@ def _parseAndCheckTelegram(self,
604637 raise TelegramError ({'message' : 'JSON decoding' })
605638
606639 return data ['result' ]
640+
641+ def to_data (self ):
642+ data = {'id' : self .id ,
643+ 'username' : self .username ,
644+ 'first_name' : self .username }
645+ if self .last_name :
646+ data ['last_name' ] = self .last_name
647+ return data
0 commit comments