From a1f91d6eb8eaf06b5d823852310ce86b1ad4aa6b Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Tue, 9 Mar 2021 20:10:31 +0100 Subject: [PATCH] (De)serialize user_id as u32 https://t.me/BotNews/57. --- telethon_generator/generators/tlobject.py | 40 ++++++++++++++--------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/telethon_generator/generators/tlobject.py b/telethon_generator/generators/tlobject.py index 88dd98f9..88664d8c 100644 --- a/telethon_generator/generators/tlobject.py +++ b/telethon_generator/generators/tlobject.py @@ -350,7 +350,7 @@ def _write_to_bytes(tlobject, builder): builder.writeln('{},', repr(struct.pack(' @@ -448,7 +447,7 @@ def _write_arg_to_bytes(builder, arg, args, name=None): # Also disable .is_flag since it's not needed per element old_flag = arg.is_flag arg.is_vector = arg.is_flag = False - _write_arg_to_bytes(builder, arg, args, name='x') + _write_arg_to_bytes(builder, arg, tlobject, name='x') arg.is_vector = True arg.is_flag = old_flag @@ -456,7 +455,7 @@ def _write_arg_to_bytes(builder, arg, args, name=None): elif arg.flag_indicator: # Calculate the flags with those items which are not None - if not any(f.is_flag for f in args): + if not any(f.is_flag for f in tlobject.args): # There's a flag indicator, but no flag arguments so it's 0 builder.write(r"b'\0\0\0\0'") else: @@ -465,13 +464,19 @@ def _write_arg_to_bytes(builder, arg, args, name=None): ' | '.join('(0 if {0} is None or {0} is False else {1})' .format('self.{}'.format(flag.name), 1 << flag.flag_index) - for flag in args if flag.is_flag) + for flag in tlobject.args if flag.is_flag) ) builder.write(')') elif 'int' == arg.type: - # struct.pack is around 4 times faster than int.to_bytes - builder.write("struct.pack(' @@ -561,7 +565,7 @@ def _write_arg_read_code(builder, arg, args, name): builder.writeln('for _ in range(reader.read_int()):') # Temporary disable .is_vector, not to enter this if again arg.is_vector = False - _write_arg_read_code(builder, arg, args, name='_x') + _write_arg_read_code(builder, arg, tlobject, name='_x') builder.writeln('{}.append(_x)', name) arg.is_vector = True @@ -571,7 +575,13 @@ def _write_arg_read_code(builder, arg, args, name): builder.writeln() elif 'int' == arg.type: - builder.writeln('{} = reader.read_int()', name) + # User IDs are becoming larger than 2³¹ - 1, which would translate + # into reading a negative ID, which we would treat as a chat. So + # special case them to read unsigned. See https://t.me/BotNews/57. + if arg.name == 'user_id' or (arg.name == 'id' and tlobject.result == 'User'): + builder.writeln('{} = reader.read_int(signed=False)', name) + else: + builder.writeln('{} = reader.read_int()', name) elif 'long' == arg.type: builder.writeln('{} = reader.read_long()', name)