ToBytes TL.Serialization helper.

Warning: do not use for long-term storage because TL structures can change in future layers and may not be deserializable
This commit is contained in:
Wizou 2025-11-05 15:00:48 +01:00
parent 9ec2f31f72
commit d6fdcab440
4 changed files with 14 additions and 7 deletions

View file

@ -181,11 +181,11 @@ public class MTProtoGenerator : IIncrementalGenerator
break; break;
case "System.Collections.Generic.Dictionary<long, TL.User>": case "System.Collections.Generic.Dictionary<long, TL.User>":
readTL.AppendLine($"r.{member.Name} = reader.ReadTLDictionary<User>();"); readTL.AppendLine($"r.{member.Name} = reader.ReadTLDictionary<User>();");
writeTl.AppendLine($"writer.WriteTLVector({member.Name}.Values.ToArray());"); writeTl.AppendLine($"writer.WriteTLVector({member.Name}?.Values.ToArray());");
break; break;
case "System.Collections.Generic.Dictionary<long, TL.ChatBase>": case "System.Collections.Generic.Dictionary<long, TL.ChatBase>":
readTL.AppendLine($"r.{member.Name} = reader.ReadTLDictionary<ChatBase>();"); readTL.AppendLine($"r.{member.Name} = reader.ReadTLDictionary<ChatBase>();");
writeTl.AppendLine($"writer.WriteTLVector({member.Name}.Values.ToArray());"); writeTl.AppendLine($"writer.WriteTLVector({member.Name}?.Values.ToArray());");
break; break;
case "object": case "object":
readTL.AppendLine($"r.{member.Name} = reader.ReadTLObject();"); readTL.AppendLine($"r.{member.Name} = reader.ReadTLObject();");

View file

@ -1125,7 +1125,7 @@ namespace WTelegram
{ {
try try
{ {
var users = await this.Users_GetUsers(InputUser.Self); // this calls also reenable incoming Updates var users = await this.Users_GetUsers(InputUser.Self); // this call also reenable incoming Updates
var self = users[0] as User; var self = users[0] as User;
if (self.id == long.Parse(botToken.Split(':')[0])) if (self.id == long.Parse(botToken.Split(':')[0]))
{ {

View file

@ -247,10 +247,7 @@ namespace WTelegram
var rsaParam = rsa.ExportParameters(false); var rsaParam = rsa.ExportParameters(false);
if (rsaParam.Modulus[0] == 0) rsaParam.Modulus = rsaParam.Modulus[1..]; if (rsaParam.Modulus[0] == 0) rsaParam.Modulus = rsaParam.Modulus[1..];
var publicKey = new RSAPublicKey { n = rsaParam.Modulus, e = rsaParam.Exponent }; var publicKey = new RSAPublicKey { n = rsaParam.Modulus, e = rsaParam.Exponent };
using var memStream = new MemoryStream(280); var bareData = publicKey.ToBytes();
using (var writer = new BinaryWriter(memStream))
writer.WriteTLObject(publicKey);
var bareData = memStream.ToArray();
var fingerprint = BinaryPrimitives.ReadInt64LittleEndian(sha1.ComputeHash(bareData, 4, bareData.Length - 4).AsSpan(12)); // 64 lower-order bits of SHA1 var fingerprint = BinaryPrimitives.ReadInt64LittleEndian(sha1.ComputeHash(bareData, 4, bareData.Length - 4).AsSpan(12)); // 64 lower-order bits of SHA1
PublicKeys[fingerprint] = publicKey; PublicKeys[fingerprint] = publicKey;
Helpers.Log(1, $"Loaded a public key with fingerprint {fingerprint:X}"); Helpers.Log(1, $"Loaded a public key with fingerprint {fingerprint:X}");

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.IO; using System.IO;
using System.IO.Compression; using System.IO.Compression;
using System.Linq; using System.Linq;
@ -48,6 +49,15 @@ namespace TL
public static class Serialization public static class Serialization
{ {
[EditorBrowsable(EditorBrowsableState.Never)]
public static byte[] ToBytes<T>(this T obj) where T : IObject
{
using var ms = new MemoryStream(384);
using var writer = new BinaryWriter(ms);
writer.WriteTLObject(obj);
return ms.ToArray();
}
public static void WriteTLObject<T>(this BinaryWriter writer, T obj) where T : IObject public static void WriteTLObject<T>(this BinaryWriter writer, T obj) where T : IObject
{ {
if (obj == null) { writer.WriteTLNull(typeof(T)); return; } if (obj == null) { writer.WriteTLNull(typeof(T)); return; }