diff --git a/telethon/utils.py b/telethon/utils.py index 485e9034..411db593 100644 --- a/telethon/utils.py +++ b/telethon/utils.py @@ -7,7 +7,7 @@ from mimetypes import add_type, guess_extension from .tl.types import ( Channel, ChannelForbidden, Chat, ChatEmpty, ChatForbidden, ChatFull, ChatPhoto, InputPeerChannel, InputPeerChat, InputPeerUser, - MessageMediaDocument, MessageMediaPhoto, PeerChannel, + MessageMediaDocument, MessageMediaPhoto, PeerChannel, InputChannel, PeerChat, PeerUser, User, UserFull, UserProfilePhoto) @@ -52,7 +52,7 @@ def get_extension(media): def get_input_peer(entity): """Gets the input peer for the given "entity" (user, chat or channel). A ValueError is raised if the given entity isn't a supported type.""" - if type(entity).subclass_of_id == 0xc91c90b6: # crc32('InputUser') + if type(entity).subclass_of_id == 0xc91c90b6: # crc32(b'InputPeer') return entity if isinstance(entity, User): @@ -80,6 +80,19 @@ def get_input_peer(entity): .format(type(entity).__name__)) +def get_input_channel(entity): + """Gets the input peer for the given "entity" (user, chat or channel). + A ValueError is raised if the given entity isn't a supported type.""" + if type(entity).subclass_of_id == 0x40f202fd: # crc32(b'InputChannel') + return entity + + if isinstance(entity, Channel) or isinstance(entity, ChannelForbidden): + return InputChannel(entity.id, entity.access_hash) + + raise ValueError('Cannot cast {} to any kind of InputChannel.' + .format(type(entity).__name__)) + + def find_user_or_chat(peer, users, chats): """Finds the corresponding user or chat given a peer. Returns None if it was not found""" diff --git a/telethon_generator/tl_generator.py b/telethon_generator/tl_generator.py index 0d55a8a3..0fffe1b8 100644 --- a/telethon_generator/tl_generator.py +++ b/telethon_generator/tl_generator.py @@ -183,12 +183,17 @@ class TLGenerator: builder.writeln('from {}.tl.mtproto_request import MTProtoRequest' .format('.' * depth)) - if tlobject.is_function and \ - any(a for a in tlobject.args if a.type == 'InputPeer'): - # We can automatically convert a normal peer to an InputPeer, - # it will make invoking a lot of requests a lot simpler. - builder.writeln('from {}.utils import get_input_peer' - .format('.' * depth)) + if tlobject.is_function: + if any(a for a in tlobject.args if a.type == 'InputPeer'): + # We can automatically convert a normal peer to an InputPeer, + # it will make invoking a lot of requests a lot simpler. + builder.writeln('from {}.utils import get_input_peer' + .format('.' * depth)) + + if any(a for a in tlobject.args if a.type == 'InputChannel'): + # Same applies to channels + builder.writeln('from {}.utils import get_input_channel' + .format('.' * depth)) if any(a for a in tlobject.args if a.can_be_inferred): # Currently only 'random_id' needs 'os' to be imported @@ -316,7 +321,12 @@ class TLGenerator: elif arg.type == 'InputPeer' and tlobject.is_function: # Well-known case, auto-cast it to the right type builder.writeln( - 'self.{0} = get_input_peer({0})'.format(arg.name)) + 'self.{0} = get_input_peer({0})'.format(arg.name) + ) + elif arg.type == 'InputChannel' and tlobject.is_function: + builder.writeln( + 'self.{0} = get_input_channel({0})'.format(arg.name) + ) else: builder.writeln('self.{0} = {0}'.format(arg.name))