From 36b8a9026fa020fa4cf562d9f5fae5242cd78090 Mon Sep 17 00:00:00 2001 From: Lonami Date: Mon, 26 Sep 2016 13:13:11 +0200 Subject: [PATCH] Fixed revert by hand (I hope) --- telethon/network/mtproto_sender.py | 10 +++++ telethon/telegram_client.py | 14 +++++-- telethon/utils/binary_reader.py | 10 ++++- telethon_generator/tl_generator.py | 59 ------------------------------ 4 files changed, 28 insertions(+), 65 deletions(-) diff --git a/telethon/network/mtproto_sender.py b/telethon/network/mtproto_sender.py index 023a7734..bf79910f 100755 --- a/telethon/network/mtproto_sender.py +++ b/telethon/network/mtproto_sender.py @@ -192,6 +192,16 @@ class MtProtoSender: if code == 0xa7eff811: # bad_msg_notification return self.handle_bad_msg_notification(msg_id, sequence, reader) + if code == 0x62d6b459: # msgs_ack, it may handle the request we wanted + ack = reader.tgread_object() + for message_id in ack.msg_ids: + if message_id in self.need_confirmation: + self.need_confirmation.remove(message_id) + + if request and request.msg_id in ack.msg_ids: + request.confirm_received = True + return False + # If the code is not parsed manually, then it was parsed by the code generator! # In this case, we will simply treat the incoming TLObject as an Update, # if we can first find a matching TLObject diff --git a/telethon/telegram_client.py b/telethon/telegram_client.py index 022c3003..162bf39f 100644 --- a/telethon/telegram_client.py +++ b/telethon/telegram_client.py @@ -1,7 +1,7 @@ import platform from datetime import datetime from hashlib import md5 -from os import path +from os import path, listdir from mimetypes import guess_extension, guess_type # For sending and receiving requests @@ -35,7 +35,7 @@ from telethon.tl.all_tlobjects import layer class TelegramClient: # Current TelegramClient version - __version__ = '0.5' + __version__ = '0.6' # region Initialization @@ -182,8 +182,7 @@ class TelegramClient: def log_out(self): """Logs out and deletes the current session. Returns True if everything went OK""" try: - # This request is a bit special. Nothing is received after - self.sender.send(LogOutRequest()) + self.invoke(LogOutRequest()) if not self.session.delete(): return False @@ -191,6 +190,13 @@ class TelegramClient: except: return False + @staticmethod + def list_sessions(): + """Lists all the sessions of the users who have ever connected + using this client and never logged out""" + return [path.splitext(path.basename(f))[0] # splitext = split ext (not spli text!) + for f in listdir('.') if f.endswith('.session')] + # endregion # region Dialogs ("chats") requests diff --git a/telethon/utils/binary_reader.py b/telethon/utils/binary_reader.py index ff9a884d..50fd2359 100755 --- a/telethon/utils/binary_reader.py +++ b/telethon/utils/binary_reader.py @@ -117,8 +117,14 @@ class BinaryReader: # If there was still no luck, give up raise TypeNotFoundError(constructor_id) - # Create an empty instance of the class, and read its values - result = clazz.empty() + # Now we need to determine the number of parameters of the class, so we can + # instantiate it with all of them set to None, and still, no need to write + # the default =None in all the classes, thus forcing the user to provide a real value + sig = inspect.signature(clazz.__init__) + params = [None] * (len(sig.parameters) - 1) # Subtract 1 (self) + result = clazz(*params) # https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists + + # Finally, read the object and return the result result.on_response(self) return result diff --git a/telethon_generator/tl_generator.py b/telethon_generator/tl_generator.py index 71061875..c6bdc0e0 100755 --- a/telethon_generator/tl_generator.py +++ b/telethon_generator/tl_generator.py @@ -62,7 +62,6 @@ class TLGenerator: with SourceBuilder(file) as builder: # Both types and functions inherit from MTProtoRequest so they all can be sent builder.writeln('from telethon.tl.mtproto_request import MTProtoRequest') - builder.writeln('import json') builder.writeln() builder.writeln() builder.writeln('class {}(MTProtoRequest):'.format(TLGenerator.get_class_name(tlobject))) @@ -133,17 +132,6 @@ class TLGenerator: TLGenerator.write_onsend_code(builder, arg, tlobject.args) builder.end_block() - # Generate the empty() function, which returns an "empty" - # instance, in which all attributes are set to None - builder.writeln('@staticmethod') - builder.writeln('def empty():') - builder.writeln('"""Returns an "empty" instance (all attributes are None)"""') - builder.writeln('return {}({})'.format( - TLGenerator.get_class_name(tlobject), - ', '.join('None' for _ in range(len(args))) - )) - builder.end_block() - # Write the on_response(self, reader) function builder.writeln('def on_response(self, reader):') # Do not read constructor's ID, since that's already been read somewhere else @@ -165,47 +153,6 @@ class TLGenerator: builder.writeln('def __str__(self):') builder.writeln("return {}".format(str(tlobject))) - builder.end_block() - - # Write JSON encoding - builder.writeln('def json_encode(self):') - builder.writeln('return json.dumps({') - builder.current_indent += 1 - - for arg in args: - if TLGenerator.is_tlobject(arg.type): - if arg.is_vector: - builder.writeln("'{0}': [{0}_item.json_encode() " - "for {0}_item in self.{0}],".format(arg.name)) - else: - builder.writeln("'{0}': self.{0}.json_encode(),".format(arg.name)) - else: - builder.writeln("'{0}': self.{0},".format(arg.name)) - - builder.current_indent -= 1 - builder.writeln('})') - builder.end_block() - - # Write JSON decoding - builder.writeln('@staticmethod') - builder.writeln('def json_decode(json_string):') - builder.writeln('# Create an empty instance which will be filled with the JSON values') - builder.writeln('instance = {}.empty()'.format(TLGenerator.get_class_name(tlobject))) - builder.writeln('dictionary = json.loads(json_string)') - builder.writeln() - for arg in args: - if TLGenerator.is_tlobject(arg.type): - if arg.is_vector: - builder.writeln("instance.{0} = [{0}_item.json_decode() " - "for {0}_item in dictionary['{0}']]".format(arg.name)) - else: - builder.writeln("instance.{0} = dictionary['{0}'].json_decode() if '{0}' in dictionary " - "and dictionary['{0}'] is not None else None".format(arg.name)) - else: - builder.writeln("instance.{0} = dictionary.get('{0}', None)".format(arg.name)) - - builder.writeln() - builder.writeln('return instance') # builder.end_block() # There is no need to end the last block # Once all the objects have been generated, we can now group them in a single file @@ -276,12 +223,6 @@ class TLGenerator: else: return result - @staticmethod - def is_tlobject(type): - """Determines whether the type is a "basic" type or another TLObject""" - return type not in ['int', 'long', 'int128', 'int256', 'double', - 'string', 'Bool', 'true', 'bytes', 'date'] - @staticmethod def write_onsend_code(builder, arg, args, name=None): """