Skip to content

Commit fa83787

Browse files
committed
CollectUsersChats update user/chat fields from min info (improved)
1 parent 1d00dc2 commit fa83787

File tree

2 files changed

+47
-29
lines changed

2 files changed

+47
-29
lines changed

src/Client.cs

+1
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,7 @@ public async Task<User> LoginBotIfNeeded(string bot_token = null)
10411041
if (self.id == long.Parse(botToken.Split(':')[0]))
10421042
{
10431043
_session.UserId = _dcSession.UserId = self.id;
1044+
RaiseUpdate(self);
10441045
return User = self;
10451046
}
10461047
Helpers.Log(3, $"Current logged user {self.id} mismatched bot_token. Logging out and in...");

src/TL.Extensions.cs

+46-29
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,35 @@ protected internal override IPeerInfo UserOrChat(Dictionary<long, User> users, D
2525
if (!user.flags.HasFlag(User.Flags.min) || !_users.TryGetValue(user.id, out var prevUser) || prevUser.flags.HasFlag(User.Flags.min))
2626
_users[user.id] = user;
2727
else
28-
{
29-
const User.Flags good_min_flags = (User.Flags)0x55A2201E;
30-
const User.Flags2 good_min_flags2 = (User.Flags2)0x701;
31-
prevUser.flags = (prevUser.flags & ~good_min_flags) | (user.flags & good_min_flags);
32-
prevUser.flags2 = (prevUser.flags2 & ~good_min_flags2) | (user.flags2 & good_min_flags2);
33-
prevUser.first_name = user.first_name;
34-
prevUser.last_name = user.last_name;
35-
prevUser.username = user.username;
36-
prevUser.phone = user.phone;
37-
if (prevUser.flags.HasFlag(User.Flags.apply_min_photo) && user.phone != null)
28+
{ // update previously full user from min user:
29+
const User.Flags updated_flags = (User.Flags)0x5DAFE000;
30+
const User.Flags2 updated_flags2 = (User.Flags2)0x711;
31+
// tdlib updated flags: deleted | bot | bot_chat_history | bot_nochats | verified | bot_inline_geo
32+
// | support | scam | fake | bot_attach_menu | premium
33+
// tdesktop non-updated flags: bot | bot_chat_history | bot_nochats | bot_attach_menu
34+
// updated flags2: stories_unavailable (tdlib) | contact_require_premium (tdesktop)
35+
prevUser.flags = (prevUser.flags & ~updated_flags) | (user.flags & updated_flags);
36+
prevUser.flags2 = (prevUser.flags2 & ~updated_flags2) | (user.flags2 & updated_flags2);
37+
prevUser.first_name ??= user.first_name; // tdlib: not updated ; tdesktop: updated only if unknown
38+
prevUser.last_name ??= user.last_name; // tdlib: not updated ; tdesktop: updated only if unknown
39+
//prevUser.username ??= user.username; // tdlib/tdesktop: not updated
40+
prevUser.phone ??= user.phone; // tdlib: updated only if unknown ; tdesktop: not updated
41+
if (prevUser.flags.HasFlag(User.Flags.apply_min_photo) && user.photo != null)
3842
{
39-
prevUser.photo = user.photo;
43+
prevUser.photo = user.photo; // tdlib/tdesktop: updated on apply_min_photo
4044
prevUser.flags |= User.Flags.has_photo;
4145
}
42-
prevUser.emoji_status = user.emoji_status;
43-
prevUser.usernames = user.usernames;
44-
prevUser.color = user.color;
45-
prevUser.profile_color = user.profile_color;
46+
prevUser.bot_info_version = user.bot_info_version; // tdlib: updated ; tdesktop: not updated
47+
prevUser.restriction_reason = user.restriction_reason; // tdlib: updated ; tdesktop: not updated
48+
prevUser.bot_inline_placeholder = user.bot_inline_placeholder;// tdlib: updated ; tdesktop: ignored
49+
if (user.lang_code != null)
50+
prevUser.lang_code = user.lang_code; // tdlib: updated if present ; tdesktop: ignored
51+
prevUser.emoji_status = user.emoji_status; // tdlib/tdesktop: updated
52+
prevUser.usernames = user.usernames; // tdlib: not updated ; tdesktop: updated
53+
if (user.stories_max_id > 0)
54+
prevUser.stories_max_id = user.stories_max_id; // tdlib: updated if > 0 ; tdesktop: not updated
55+
prevUser.color = user.color; // tdlib/tdesktop: updated
56+
prevUser.profile_color = user.profile_color; // tdlib/tdesktop: unimplemented yet
4657
_users[user.id] = prevUser;
4758
}
4859
if (_chats != null)
@@ -53,20 +64,26 @@ protected internal override IPeerInfo UserOrChat(Dictionary<long, User> users, D
5364
else if (!channel.flags.HasFlag(Channel.Flags.min) || !_chats.TryGetValue(kvp.Key, out var prevChat) || prevChat is not Channel prevChannel || prevChannel.flags.HasFlag(Channel.Flags.min))
5465
_chats[kvp.Key] = channel;
5566
else
56-
{
57-
const Channel.Flags good_min_flags = (Channel.Flags)0x7FDC09E0;
58-
const Channel.Flags2 good_min_flags2 = (Channel.Flags2)0x781;
59-
prevChannel.flags = (prevChannel.flags & ~good_min_flags) | (channel.flags & good_min_flags);
60-
prevChannel.flags2 = (prevChannel.flags2 & ~good_min_flags2) | (channel.flags2 & good_min_flags2);
61-
prevChannel.title = channel.title;
62-
prevChannel.username = channel.username;
63-
prevChannel.photo = channel.photo;
64-
prevChannel.default_banned_rights = channel.default_banned_rights;
65-
prevChannel.usernames = channel.usernames;
66-
prevChannel.color = channel.color;
67-
prevChannel.profile_color = channel.profile_color;
68-
prevChannel.emoji_status = channel.emoji_status;
69-
prevChannel.level = channel.level;
67+
{ // update previously full channel from min channel:
68+
const Channel.Flags updated_flags = (Channel.Flags)0x7FDC0BE0;
69+
const Channel.Flags2 updated_flags2 = (Channel.Flags2)0x781;
70+
// tdesktop updated flags: broadcast | verified | megagroup | signatures | scam | has_link | slowmode_enabled
71+
// | call_active | call_not_empty | fake | gigagroup | noforwards | join_to_send | join_request | forum
72+
// tdlib nonupdated flags: broadcast | signatures | call_active | call_not_empty | noforwards
73+
prevChannel.flags = (prevChannel.flags & ~updated_flags) | (channel.flags & updated_flags);
74+
prevChannel.flags2 = (prevChannel.flags2 & ~updated_flags2) | (channel.flags2 & updated_flags2);
75+
prevChannel.title = channel.title; // tdlib/tdesktop: updated
76+
prevChannel.username = channel.username; // tdlib/tdesktop: updated
77+
prevChannel.photo = channel.photo; // tdlib: updated if not banned ; tdesktop: updated
78+
prevChannel.restriction_reason = channel.restriction_reason; // tdlib: updated ; tdesktop: not updated
79+
prevChannel.default_banned_rights = channel.default_banned_rights; // tdlib/tdesktop: updated
80+
if (channel.participants_count > 0)
81+
prevChannel.participants_count = channel.participants_count; // tdlib/tdesktop: updated if present
82+
prevChannel.usernames = channel.usernames; // tdlib/tdesktop: updated
83+
prevChannel.color = channel.color; // tdlib: not updated ; tdesktop: updated
84+
prevChannel.profile_color = channel.profile_color; // tdlib/tdesktop: ignored
85+
prevChannel.emoji_status = channel.emoji_status; // tdlib: not updated ; tdesktop: updated
86+
prevChannel.level = channel.level; // tdlib: not updated ; tdesktop: updated
7087
_chats[kvp.Key] = prevChannel;
7188
}
7289
return null;

0 commit comments

Comments
 (0)