Skip to content

Commit 5116a77

Browse files
authored
Class methods (python-telegram-bot#362)
* bot.py: add create_references method * create bot reference in webhook handler, use create_references on new updates * message.py: implement reply_text * echobot2.py: use Message.reply_text * fix create_references in webhook handler * add some more instance methods * Chat.kick_member and unban_member * bot.py: Create bot references in outgoing messages * add tests for everything testable * test_updater.py: add create_references method to MockBot * remove Bot.create_references and refactor TelegramObject.de_json to take the additional parameter bot * List bot as named kwarg where used * file.py: Use Bot.request property instead of Bot._request attr
1 parent 1f597c6 commit 5116a77

File tree

106 files changed

+691
-380
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+691
-380
lines changed

examples/echobot2.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@
2929
# Define a few command handlers. These usually take the two arguments bot and
3030
# update. Error handlers also receive the raised TelegramError object in error.
3131
def start(bot, update):
32-
bot.sendMessage(update.message.chat_id, text='Hi!')
32+
update.message.reply_text('Hi!')
3333

3434

3535
def help(bot, update):
36-
bot.sendMessage(update.message.chat_id, text='Help!')
36+
update.message.reply_text('Help!')
3737

3838

3939
def echo(bot, update):
40-
bot.sendMessage(update.message.chat_id, text=update.message.text)
40+
update.message.reply_text(update.message.text)
4141

4242

4343
def error(bot, update, error):

telegram/audio.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,11 @@ def __init__(self, file_id, duration, **kwargs):
5555
self.file_size = int(kwargs.get('file_size', 0))
5656

5757
@staticmethod
58-
def de_json(data):
58+
def de_json(data, bot):
5959
"""
6060
Args:
61-
data (str):
61+
data (dict):
62+
bot (telegram.Bot):
6263
6364
Returns:
6465
telegram.Audio:

telegram/base.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,14 @@ def __getitem__(self, item):
3838
return self.__dict__[item]
3939

4040
@staticmethod
41-
def de_json(data):
41+
def de_json(data, bot):
4242
"""
4343
Args:
44-
data (str):
44+
data (dict):
45+
bot (telegram.Bot):
4546
4647
Returns:
47-
telegram.TelegramObject:
48+
dict:
4849
"""
4950
if not data:
5051
return None
@@ -68,6 +69,9 @@ def to_dict(self):
6869
data = dict()
6970

7071
for key in iter(self.__dict__):
72+
if key == 'bot':
73+
continue
74+
7175
value = self.__dict__[key]
7276
if value is not None:
7377
if hasattr(value, 'to_dict'):

telegram/bot.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ def decorator(self, *args, **kwargs):
154154
if result is True:
155155
return result
156156

157-
return Message.de_json(result)
157+
return Message.de_json(result, self)
158158

159159
return decorator
160160

@@ -176,7 +176,7 @@ def getMe(self, **kwargs):
176176

177177
result = self._request.get(url)
178178

179-
self.bot = User.de_json(result)
179+
self.bot = User.de_json(result, self)
180180

181181
return self.bot
182182

@@ -860,7 +860,7 @@ def getUserProfilePhotos(self, user_id, offset=None, limit=100, **kwargs):
860860

861861
result = self._request.post(url, data, timeout=kwargs.get('timeout'))
862862

863-
return UserProfilePhotos.de_json(result)
863+
return UserProfilePhotos.de_json(result, self)
864864

865865
@log
866866
def getFile(self, file_id, **kwargs):
@@ -894,7 +894,7 @@ def getFile(self, file_id, **kwargs):
894894
if result.get('file_path'):
895895
result['file_path'] = '%s/%s' % (self.base_file_url, result['file_path'])
896896

897-
return File.de_json(result, self._request)
897+
return File.de_json(result, self)
898898

899899
@log
900900
def kickChatMember(self, chat_id, user_id, **kwargs):
@@ -1225,7 +1225,7 @@ def getUpdates(self, offset=None, limit=100, timeout=0, network_delay=5., **kwar
12251225
else:
12261226
self.logger.debug('No new updates found.')
12271227

1228-
return [Update.de_json(x) for x in result]
1228+
return [Update.de_json(u, self) for u in result]
12291229

12301230
@log
12311231
def setWebhook(self, webhook_url=None, certificate=None, **kwargs):
@@ -1325,7 +1325,7 @@ def getChat(self, chat_id, **kwargs):
13251325

13261326
result = self._request.post(url, data, timeout=kwargs.get('timeout'))
13271327

1328-
return Chat.de_json(result)
1328+
return Chat.de_json(result, self)
13291329

13301330
@log
13311331
def getChatAdministrators(self, chat_id, **kwargs):
@@ -1360,7 +1360,7 @@ def getChatAdministrators(self, chat_id, **kwargs):
13601360

13611361
result = self._request.post(url, data, timeout=kwargs.get('timeout'))
13621362

1363-
return [ChatMember.de_json(x) for x in result]
1363+
return [ChatMember.de_json(x, self) for x in result]
13641364

13651365
@log
13661366
def getChatMembersCount(self, chat_id, **kwargs):
@@ -1423,11 +1423,11 @@ def getChatMember(self, chat_id, user_id, **kwargs):
14231423

14241424
result = self._request.post(url, data, timeout=kwargs.get('timeout'))
14251425

1426-
return ChatMember.de_json(result)
1426+
return ChatMember.de_json(result, self)
14271427

14281428
@staticmethod
1429-
def de_json(data):
1430-
data = super(Bot, Bot).de_json(data)
1429+
def de_json(data, bot):
1430+
data = super(Bot, Bot).de_json(data, bot)
14311431

14321432
return Bot(**data)
14331433

telegram/callbackquery.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
class CallbackQuery(TelegramObject):
2626
"""This object represents a Telegram CallbackQuery."""
2727

28-
def __init__(self, id, from_user, data, **kwargs):
28+
def __init__(self, id, from_user, data, bot=None, **kwargs):
2929
# Required
3030
self.id = id
3131
self.from_user = from_user
@@ -34,15 +34,26 @@ def __init__(self, id, from_user, data, **kwargs):
3434
self.message = kwargs.get('message')
3535
self.inline_message_id = kwargs.get('inline_message_id', '')
3636

37+
self.bot = bot
38+
3739
@staticmethod
38-
def de_json(data):
40+
def de_json(data, bot):
41+
"""
42+
Args:
43+
data (dict):
44+
bot (telegram.Bot):
45+
46+
Returns:
47+
telegram.CallbackQuery:
48+
"""
49+
3950
if not data:
4051
return None
4152

42-
data['from_user'] = User.de_json(data.get('from'))
43-
data['message'] = Message.de_json(data.get('message'))
53+
data['from_user'] = User.de_json(data.get('from'), bot)
54+
data['message'] = Message.de_json(data.get('message'), bot)
4455

45-
return CallbackQuery(**data)
56+
return CallbackQuery(bot=bot, **data)
4657

4758
def to_dict(self):
4859
"""
@@ -54,3 +65,7 @@ def to_dict(self):
5465
# Required
5566
data['from'] = data.pop('from_user', None)
5667
return data
68+
69+
def answer(self, *args, **kwargs):
70+
"""Shortcut for ``bot.answerCallbackQuery(update.callback_query.id, *args, **kwargs)``"""
71+
return self.bot.answerCallbackQuery(self.id, *args, **kwargs)

telegram/chat.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,15 @@ class Chat(TelegramObject):
4040
4141
Keyword Args:
4242
type (Optional[str]):
43+
bot (Optional[Bot]): The Bot to use for instance methods
4344
"""
4445

4546
PRIVATE = 'private'
4647
GROUP = 'group'
4748
SUPERGROUP = 'supergroup'
4849
CHANNEL = 'channel'
4950

50-
def __init__(self, id, type, **kwargs):
51+
def __init__(self, id, type, bot=None, **kwargs):
5152
# Required
5253
self.id = int(id)
5354
self.type = type
@@ -57,16 +58,47 @@ def __init__(self, id, type, **kwargs):
5758
self.first_name = kwargs.get('first_name', '')
5859
self.last_name = kwargs.get('last_name', '')
5960

61+
self.bot = bot
62+
6063
@staticmethod
61-
def de_json(data):
64+
def de_json(data, bot):
6265
"""
6366
Args:
6467
data (dict):
68+
bot (telegram.Bot):
6569
6670
Returns:
6771
telegram.Chat:
6872
"""
6973
if not data:
7074
return None
7175

72-
return Chat(**data)
76+
return Chat(bot=bot, **data)
77+
78+
def send_action(self, *args, **kwargs):
79+
"""Shortcut for ``bot.sendChatAction(update.message.chat.id, *args, **kwargs)``"""
80+
return self.bot.sendChatAction(self.id, *args, **kwargs)
81+
82+
def leave(self, *args, **kwargs):
83+
"""Shortcut for ``bot.leaveChat(update.message.chat.id, *args, **kwargs)``"""
84+
return self.bot.leaveChat(self.id, *args, **kwargs)
85+
86+
def get_administrators(self, *args, **kwargs):
87+
"""Shortcut for ``bot.getChatAdministrators(update.message.chat.id, *args, **kwargs)``"""
88+
return self.bot.getChatAdministrators(self.id, *args, **kwargs)
89+
90+
def get_members_count(self, *args, **kwargs):
91+
"""Shortcut for ``bot.getChatMembersCount(update.message.chat.id, *args, **kwargs)``"""
92+
return self.bot.getChatMembersCount(self.id, *args, **kwargs)
93+
94+
def get_member(self, *args, **kwargs):
95+
"""Shortcut for ``bot.getChatMember(update.message.chat.id, *args, **kwargs)``"""
96+
return self.bot.getChatMember(self.id, *args, **kwargs)
97+
98+
def kick_member(self, *args, **kwargs):
99+
"""Shortcut for ``bot.kickChatMember(update.message.chat.id, *args, **kwargs)``"""
100+
return self.bot.kickChatMember(self.id, *args, **kwargs)
101+
102+
def unban_member(self, *args, **kwargs):
103+
"""Shortcut for ``bot.unbanChatMember(update.message.chat.id, *args, **kwargs)``"""
104+
return self.bot.unbanChatMember(self.id, *args, **kwargs)

telegram/chatmember.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,18 @@ def __init__(self, user, status, **kwargs):
4646
self.status = status
4747

4848
@staticmethod
49-
def de_json(data):
49+
def de_json(data, bot):
5050
"""
5151
Args:
5252
data (dict):
53+
bot (telegram.Bot):
5354
5455
Returns:
5556
telegram.ChatMember:
5657
"""
5758
if not data:
5859
return None
5960

60-
data['user'] = User.de_json(data.get('user'))
61+
data['user'] = User.de_json(data.get('user'), bot)
6162

6263
return ChatMember(**data)

telegram/choseninlineresult.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,11 @@ def __init__(self,
5757
self.inline_message_id = inline_message_id
5858

5959
@staticmethod
60-
def de_json(data):
60+
def de_json(data, bot):
6161
"""
6262
Args:
6363
data (dict):
64+
bot (telegram.Bot):
6465
6566
Returns:
6667
telegram.ChosenInlineResult:
@@ -69,9 +70,9 @@ def de_json(data):
6970
return None
7071

7172
# Required
72-
data['from_user'] = User.de_json(data.pop('from'))
73+
data['from_user'] = User.de_json(data.pop('from'), bot)
7374
# Optionals
74-
data['location'] = Location.de_json(data.get('location'))
75+
data['location'] = Location.de_json(data.get('location'), bot)
7576

7677
return ChosenInlineResult(**data)
7778

telegram/contact.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,11 @@ def __init__(self, phone_number, first_name, **kwargs):
4949
self.user_id = int(kwargs.get('user_id', 0))
5050

5151
@staticmethod
52-
def de_json(data):
52+
def de_json(data, bot):
5353
"""
5454
Args:
55-
data (str):
55+
data (dict):
56+
bot (telegram.Bot):
5657
5758
Returns:
5859
telegram.Contact:

telegram/document.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,18 @@ def __init__(self, file_id, **kwargs):
5252
self.file_size = int(kwargs.get('file_size', 0))
5353

5454
@staticmethod
55-
def de_json(data):
55+
def de_json(data, bot):
5656
"""
5757
Args:
58-
data (str):
58+
data (dict):
59+
bot (telegram.Bot):
5960
6061
Returns:
6162
telegram.Document:
6263
"""
6364
if not data:
6465
return None
6566

66-
data['thumb'] = PhotoSize.de_json(data.get('thumb'))
67+
data['thumb'] = PhotoSize.de_json(data.get('thumb'), bot)
6768

6869
return Document(**data)

0 commit comments

Comments
 (0)