Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions examples/echobot2.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,15 @@
# Define a few command handlers. These usually take the two arguments bot and
# update. Error handlers also receive the raised TelegramError object in error.
def start(bot, update):
bot.sendMessage(update.message.chat_id, text='Hi!')
update.message.reply_text('Hi!')


def help(bot, update):
bot.sendMessage(update.message.chat_id, text='Help!')
update.message.reply_text('Help!')


def echo(bot, update):
bot.sendMessage(update.message.chat_id, text=update.message.text)
update.message.reply_text(update.message.text)


def error(bot, update, error):
Expand Down
5 changes: 3 additions & 2 deletions telegram/audio.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,11 @@ def __init__(self, file_id, duration, **kwargs):
self.file_size = int(kwargs.get('file_size', 0))

@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):

Returns:
telegram.Audio:
Expand Down
10 changes: 7 additions & 3 deletions telegram/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,14 @@ def __getitem__(self, item):
return self.__dict__[item]

@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):

Returns:
telegram.TelegramObject:
dict:
"""
if not data:
return None
Expand All @@ -68,6 +69,9 @@ def to_dict(self):
data = dict()

for key in iter(self.__dict__):
if key == 'bot':
continue

value = self.__dict__[key]
if value is not None:
if hasattr(value, 'to_dict'):
Expand Down
20 changes: 10 additions & 10 deletions telegram/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ def decorator(self, *args, **kwargs):
if result is True:
return result

return Message.de_json(result)
return Message.de_json(result, self)

return decorator

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

result = self._request.get(url)

self.bot = User.de_json(result)
self.bot = User.de_json(result, self)

return self.bot

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

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

return UserProfilePhotos.de_json(result)
return UserProfilePhotos.de_json(result, self)

@log
def getFile(self, file_id, **kwargs):
Expand Down Expand Up @@ -894,7 +894,7 @@ def getFile(self, file_id, **kwargs):
if result.get('file_path'):
result['file_path'] = '%s/%s' % (self.base_file_url, result['file_path'])

return File.de_json(result, self._request)
return File.de_json(result, self)

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

return [Update.de_json(x) for x in result]
return [Update.de_json(u, self) for u in result]

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jh0ker
I'm conflicted here.
I know it's pretty the way you currently implemented it (explicit and self explanatory). However, on busy bots, you actually run twice on 100 updates each time this code is called. so it can actually have performance impact.

Suggestion for discussion:
Instead of having create_references method, the various de_json methods will accept bot as a second parameter (similar to what I've done with File.de_json for the request object)

then you can do:
return [Update.de_json(u, self) for u in result]

A similar comment goes for the Webhook below

@log
def setWebhook(self, webhook_url=None, certificate=None, **kwargs):
Expand Down Expand Up @@ -1325,7 +1325,7 @@ def getChat(self, chat_id, **kwargs):

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

return Chat.de_json(result)
return Chat.de_json(result, self)

@log
def getChatAdministrators(self, chat_id, **kwargs):
Expand Down Expand Up @@ -1360,7 +1360,7 @@ def getChatAdministrators(self, chat_id, **kwargs):

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

return [ChatMember.de_json(x) for x in result]
return [ChatMember.de_json(x, self) for x in result]

@log
def getChatMembersCount(self, chat_id, **kwargs):
Expand Down Expand Up @@ -1423,11 +1423,11 @@ def getChatMember(self, chat_id, user_id, **kwargs):

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

return ChatMember.de_json(result)
return ChatMember.de_json(result, self)

@staticmethod
def de_json(data):
data = super(Bot, Bot).de_json(data)
def de_json(data, bot):
data = super(Bot, Bot).de_json(data, bot)

return Bot(**data)

Expand Down
25 changes: 20 additions & 5 deletions telegram/callbackquery.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
class CallbackQuery(TelegramObject):
"""This object represents a Telegram CallbackQuery."""

def __init__(self, id, from_user, data, **kwargs):
def __init__(self, id, from_user, data, bot=None, **kwargs):
# Required
self.id = id
self.from_user = from_user
Expand All @@ -34,15 +34,26 @@ def __init__(self, id, from_user, data, **kwargs):
self.message = kwargs.get('message')
self.inline_message_id = kwargs.get('inline_message_id', '')

self.bot = bot

@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (dict):
bot (telegram.Bot):

Returns:
telegram.CallbackQuery:
"""

if not data:
return None

data['from_user'] = User.de_json(data.get('from'))
data['message'] = Message.de_json(data.get('message'))
data['from_user'] = User.de_json(data.get('from'), bot)
data['message'] = Message.de_json(data.get('message'), bot)

return CallbackQuery(**data)
return CallbackQuery(bot=bot, **data)

def to_dict(self):
"""
Expand All @@ -54,3 +65,7 @@ def to_dict(self):
# Required
data['from'] = data.pop('from_user', None)
return data

def answer(self, *args, **kwargs):
"""Shortcut for ``bot.answerCallbackQuery(update.callback_query.id, *args, **kwargs)``"""
return self.bot.answerCallbackQuery(self.id, *args, **kwargs)
38 changes: 35 additions & 3 deletions telegram/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,15 @@ class Chat(TelegramObject):

Keyword Args:
type (Optional[str]):
bot (Optional[Bot]): The Bot to use for instance methods
"""

PRIVATE = 'private'
GROUP = 'group'
SUPERGROUP = 'supergroup'
CHANNEL = 'channel'

def __init__(self, id, type, **kwargs):
def __init__(self, id, type, bot=None, **kwargs):
# Required
self.id = int(id)
self.type = type
Expand All @@ -57,16 +58,47 @@ def __init__(self, id, type, **kwargs):
self.first_name = kwargs.get('first_name', '')
self.last_name = kwargs.get('last_name', '')

self.bot = bot

@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (dict):
bot (telegram.Bot):

Returns:
telegram.Chat:
"""
if not data:
return None

return Chat(**data)
return Chat(bot=bot, **data)

def send_action(self, *args, **kwargs):
"""Shortcut for ``bot.sendChatAction(update.message.chat.id, *args, **kwargs)``"""
return self.bot.sendChatAction(self.id, *args, **kwargs)

def leave(self, *args, **kwargs):
"""Shortcut for ``bot.leaveChat(update.message.chat.id, *args, **kwargs)``"""
return self.bot.leaveChat(self.id, *args, **kwargs)

def get_administrators(self, *args, **kwargs):
"""Shortcut for ``bot.getChatAdministrators(update.message.chat.id, *args, **kwargs)``"""
return self.bot.getChatAdministrators(self.id, *args, **kwargs)

def get_members_count(self, *args, **kwargs):
"""Shortcut for ``bot.getChatMembersCount(update.message.chat.id, *args, **kwargs)``"""
return self.bot.getChatMembersCount(self.id, *args, **kwargs)

def get_member(self, *args, **kwargs):
"""Shortcut for ``bot.getChatMember(update.message.chat.id, *args, **kwargs)``"""
return self.bot.getChatMember(self.id, *args, **kwargs)

def kick_member(self, *args, **kwargs):
"""Shortcut for ``bot.kickChatMember(update.message.chat.id, *args, **kwargs)``"""
return self.bot.kickChatMember(self.id, *args, **kwargs)

def unban_member(self, *args, **kwargs):
"""Shortcut for ``bot.unbanChatMember(update.message.chat.id, *args, **kwargs)``"""
return self.bot.unbanChatMember(self.id, *args, **kwargs)
5 changes: 3 additions & 2 deletions telegram/chatmember.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,18 @@ def __init__(self, user, status, **kwargs):
self.status = status

@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (dict):
bot (telegram.Bot):

Returns:
telegram.ChatMember:
"""
if not data:
return None

data['user'] = User.de_json(data.get('user'))
data['user'] = User.de_json(data.get('user'), bot)

return ChatMember(**data)
7 changes: 4 additions & 3 deletions telegram/choseninlineresult.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,11 @@ def __init__(self,
self.inline_message_id = inline_message_id

@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (dict):
bot (telegram.Bot):

Returns:
telegram.ChosenInlineResult:
Expand All @@ -69,9 +70,9 @@ def de_json(data):
return None

# Required
data['from_user'] = User.de_json(data.pop('from'))
data['from_user'] = User.de_json(data.pop('from'), bot)
# Optionals
data['location'] = Location.de_json(data.get('location'))
data['location'] = Location.de_json(data.get('location'), bot)

return ChosenInlineResult(**data)

Expand Down
5 changes: 3 additions & 2 deletions telegram/contact.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,11 @@ def __init__(self, phone_number, first_name, **kwargs):
self.user_id = int(kwargs.get('user_id', 0))

@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):

Returns:
telegram.Contact:
Expand Down
7 changes: 4 additions & 3 deletions telegram/document.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,17 +52,18 @@ def __init__(self, file_id, **kwargs):
self.file_size = int(kwargs.get('file_size', 0))

@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):

Returns:
telegram.Document:
"""
if not data:
return None

data['thumb'] = PhotoSize.de_json(data.get('thumb'))
data['thumb'] = PhotoSize.de_json(data.get('thumb'), bot)

return Document(**data)
3 changes: 2 additions & 1 deletion telegram/ext/updater.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,8 @@ def _start_webhook(self, listen, port, url_path, cert, key, bootstrap_retries, c
url_path = '/{0}'.format(url_path)

# Create and start server
self.httpd = WebhookServer((listen, port), WebhookHandler, self.update_queue, url_path)
self.httpd = WebhookServer((listen, port), WebhookHandler, self.update_queue, url_path,
self.bot)

if use_ssl:
self._check_ssl_cert(cert, key)
Expand Down
17 changes: 9 additions & 8 deletions telegram/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class File(TelegramObject):

Args:
file_id (str):
request (telegram.utils.request.Request):
bot (telegram.Bot):
**kwargs: Arbitrary keyword arguments.

Keyword Args:
Expand All @@ -42,29 +42,30 @@ class File(TelegramObject):

"""

def __init__(self, file_id, request, **kwargs):
def __init__(self, file_id, bot, **kwargs):
# Required
self.file_id = str(file_id)
self._request = request

# Optionals
self.file_size = int(kwargs.get('file_size', 0))
self.file_path = str(kwargs.get('file_path', ''))

self.bot = bot

@staticmethod
def de_json(data, request):
def de_json(data, bot):
"""
Args:
data (dict):
request (telegram.utils.request.Request):
bot (telegram.Bot):

Returns:
telegram.File:

"""
if not data:
return None

return File(request=request, **data)
return File(bot=bot, **data)

def download(self, custom_path=None):
"""
Expand All @@ -79,4 +80,4 @@ def download(self, custom_path=None):
else:
filename = basename(url)

self._request.download(url, filename)
self.bot.request.download(url, filename)
Loading