mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2025-03-21 10:24:25 +03:00
Reuse .on_response/.__str__/.stringify, override iff necessary
This commit is contained in:
parent
f6d98a61cf
commit
33e50aaee1
|
@ -133,6 +133,8 @@ class BinaryReader:
|
||||||
return True
|
return True
|
||||||
elif value == 0xbc799737: # boolFalse
|
elif value == 0xbc799737: # boolFalse
|
||||||
return False
|
return False
|
||||||
|
elif value == 0x1cb5c415: # Vector
|
||||||
|
return [self.tgread_object() for _ in range(self.read_int())]
|
||||||
|
|
||||||
# If there was still no luck, give up
|
# If there was still no luck, give up
|
||||||
self.seek(-4) # Go back
|
self.seek(-4) # Go back
|
||||||
|
|
|
@ -7,6 +7,7 @@ class TLObject:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.confirm_received = Event()
|
self.confirm_received = Event()
|
||||||
self.rpc_error = None
|
self.rpc_error = None
|
||||||
|
self.result = None
|
||||||
|
|
||||||
# These should be overrode
|
# These should be overrode
|
||||||
self.content_related = False # Only requests/functions/queries are
|
self.content_related = False # Only requests/functions/queries are
|
||||||
|
@ -143,6 +144,16 @@ class TLObject:
|
||||||
|
|
||||||
raise TypeError('Cannot interpret "{}" as a date.'.format(dt))
|
raise TypeError('Cannot interpret "{}" as a date.'.format(dt))
|
||||||
|
|
||||||
|
# These are nearly always the same for all subclasses
|
||||||
|
def on_response(self, reader):
|
||||||
|
self.result = reader.tgread_object()
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return TLObject.pretty_format(self)
|
||||||
|
|
||||||
|
def stringify(self):
|
||||||
|
return TLObject.pretty_format(self, indent=0)
|
||||||
|
|
||||||
# These should be overrode
|
# These should be overrode
|
||||||
def resolve(self, client, utils):
|
def resolve(self, client, utils):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -395,23 +395,30 @@ class TLGenerator:
|
||||||
if not a.flag_indicator and not a.generic_definition
|
if not a.flag_indicator and not a.generic_definition
|
||||||
)
|
)
|
||||||
))
|
))
|
||||||
builder.end_block()
|
|
||||||
|
|
||||||
# Only requests can have a different response that's not their
|
# Only requests can have a different response that's not their
|
||||||
# serialized body, that is, we'll be setting their .result.
|
# serialized body, that is, we'll be setting their .result.
|
||||||
if tlobject.is_function:
|
#
|
||||||
|
# The default behaviour is reading a TLObject too, so no need
|
||||||
|
# to override it unless necessary.
|
||||||
|
if tlobject.is_function and not TLGenerator._is_boxed(tlobject.result):
|
||||||
|
builder.end_block()
|
||||||
builder.writeln('def on_response(self, reader):')
|
builder.writeln('def on_response(self, reader):')
|
||||||
TLGenerator.write_request_result_code(builder, tlobject)
|
TLGenerator.write_request_result_code(builder, tlobject)
|
||||||
builder.end_block()
|
|
||||||
|
|
||||||
# Write the __str__(self) and stringify(self) functions
|
@staticmethod
|
||||||
builder.writeln('def __str__(self):')
|
def _is_boxed(type_):
|
||||||
builder.writeln('return TLObject.pretty_format(self)')
|
# https://core.telegram.org/mtproto/serialize#boxed-and-bare-types
|
||||||
builder.end_block()
|
# TL;DR; boxed types start with uppercase always, so we can use
|
||||||
|
# this to check whether everything in it is boxed or not.
|
||||||
builder.writeln('def stringify(self):')
|
#
|
||||||
builder.writeln('return TLObject.pretty_format(self, indent=0)')
|
# The API always returns a boxed type, but it may inside a Vector<>
|
||||||
# builder.end_block() # No need to end the last block
|
# or a namespace, and the Vector may have a not-boxed type. For this
|
||||||
|
# reason we find whatever index, '<' or '.'. If neither are present
|
||||||
|
# we will get -1, and the 0th char is always upper case thus works.
|
||||||
|
# For Vector types and namespaces, it will check in the right place.
|
||||||
|
check_after = max(type_.find('<'), type_.find('.'))
|
||||||
|
return type_[check_after + 1].isupper()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _write_self_assign(builder, arg, get_input_code):
|
def _write_self_assign(builder, arg, get_input_code):
|
||||||
|
@ -697,13 +704,13 @@ class TLGenerator:
|
||||||
# not parsed as arguments are and it's a bit harder to tell which
|
# not parsed as arguments are and it's a bit harder to tell which
|
||||||
# is which.
|
# is which.
|
||||||
if tlobject.result == 'Vector<int>':
|
if tlobject.result == 'Vector<int>':
|
||||||
builder.writeln('reader.read_int() # Vector id')
|
builder.writeln('reader.read_int() # Vector ID')
|
||||||
builder.writeln('count = reader.read_int()')
|
builder.writeln('count = reader.read_int()')
|
||||||
builder.writeln(
|
builder.writeln(
|
||||||
'self.result = [reader.read_int() for _ in range(count)]'
|
'self.result = [reader.read_int() for _ in range(count)]'
|
||||||
)
|
)
|
||||||
elif tlobject.result == 'Vector<long>':
|
elif tlobject.result == 'Vector<long>':
|
||||||
builder.writeln('reader.read_int() # Vector id')
|
builder.writeln('reader.read_int() # Vector ID')
|
||||||
builder.writeln('count = reader.read_long()')
|
builder.writeln('count = reader.read_long()')
|
||||||
builder.writeln(
|
builder.writeln(
|
||||||
'self.result = [reader.read_long() for _ in range(count)]'
|
'self.result = [reader.read_long() for _ in range(count)]'
|
||||||
|
|
Loading…
Reference in New Issue
Block a user