Message List: Fix missing avatars in big channel messages

This commit is contained in:
Alexander Zinchuk 2021-12-14 22:40:42 +04:00
parent 1285499e96
commit d4d6166ede
6 changed files with 73 additions and 52 deletions

View File

@ -42,12 +42,26 @@ export function addPhotoToLocalDb(photo: GramJs.TypePhoto) {
} }
} }
export function addChatToLocalDb(chat: GramJs.TypeChat) { function addChatToLocalDb(chat: GramJs.Chat | GramJs.Channel, noOverwrite = false) {
if (chat instanceof GramJs.Chat || chat instanceof GramJs.Channel) { const id = buildApiPeerId(chat.id, chat instanceof GramJs.Chat ? 'chat' : 'channel');
localDb.chats[buildApiPeerId(chat.id, chat instanceof GramJs.Chat ? 'chat' : 'channel')] = chat; if (!noOverwrite || !localDb.chats[id]) {
localDb.chats[id] = chat;
} }
} }
export function addUserToLocalDb(user: GramJs.User) { export function addUserToLocalDb(user: GramJs.User, shouldOverwrite = false) {
localDb.users[buildApiPeerId(user.id, 'user')] = user; const id = buildApiPeerId(user.id, 'user');
if (shouldOverwrite || !localDb.users[id]) {
localDb.users[id] = user;
}
}
export function addEntitiesWithPhotosToLocalDb(entities: (GramJs.TypeUser | GramJs.TypeChat)[]) {
entities.forEach((entity) => {
if (entity instanceof GramJs.User && entity.photo) {
addUserToLocalDb(entity);
} else if ((entity instanceof GramJs.Chat || entity instanceof GramJs.Channel) && entity.photo) {
addChatToLocalDb(entity);
}
});
} }

View File

@ -9,7 +9,7 @@ import { buildInputPeer, generateRandomBigInt } from '../gramjsBuilders';
import { buildApiUser } from '../apiBuilders/users'; import { buildApiUser } from '../apiBuilders/users';
import { buildApiBotInlineMediaResult, buildApiBotInlineResult, buildBotSwitchPm } from '../apiBuilders/bots'; import { buildApiBotInlineMediaResult, buildApiBotInlineResult, buildBotSwitchPm } from '../apiBuilders/bots';
import { buildApiChatFromPreview } from '../apiBuilders/chats'; import { buildApiChatFromPreview } from '../apiBuilders/chats';
import { addUserToLocalDb } from '../helpers'; import { addEntitiesWithPhotosToLocalDb, addUserToLocalDb } from '../helpers';
export function init() { export function init() {
} }
@ -84,7 +84,7 @@ export async function fetchInlineBotResults({
return undefined; return undefined;
} }
result.users.map(addUserToLocalDb); addEntitiesWithPhotosToLocalDb(result.users);
return { return {
isGallery: Boolean(result.gallery), isGallery: Boolean(result.gallery),

View File

@ -13,7 +13,7 @@ import {
} from '../apiBuilders/calls'; } from '../apiBuilders/calls';
import { buildApiUser } from '../apiBuilders/users'; import { buildApiUser } from '../apiBuilders/users';
import { buildApiChatFromPreview } from '../apiBuilders/chats'; import { buildApiChatFromPreview } from '../apiBuilders/chats';
import { addChatToLocalDb, addUserToLocalDb } from '../helpers'; import { addEntitiesWithPhotosToLocalDb } from '../helpers';
import { GROUP_CALL_PARTICIPANTS_LIMIT } from '../../../config'; import { GROUP_CALL_PARTICIPANTS_LIMIT } from '../../../config';
let onUpdate: OnApiUpdate; let onUpdate: OnApiUpdate;
@ -35,8 +35,8 @@ export async function getGroupCall({
return undefined; return undefined;
} }
result.users.map(addUserToLocalDb); addEntitiesWithPhotosToLocalDb(result.users);
result.chats.map(addChatToLocalDb); addEntitiesWithPhotosToLocalDb(result.chats);
const users = result.users.map(buildApiUser).filter<ApiUser>(Boolean as any); const users = result.users.map(buildApiUser).filter<ApiUser>(Boolean as any);
const chats = result.chats.map((c) => buildApiChatFromPreview(c)).filter<ApiChat>(Boolean as any); const chats = result.chats.map((c) => buildApiChatFromPreview(c)).filter<ApiChat>(Boolean as any);
@ -122,8 +122,8 @@ export async function fetchGroupCallParticipants({
return undefined; return undefined;
} }
result.users.map(addUserToLocalDb); addEntitiesWithPhotosToLocalDb(result.users);
result.chats.map(addChatToLocalDb); addEntitiesWithPhotosToLocalDb(result.chats);
const users = result.users.map(buildApiUser).filter<ApiUser>(Boolean as any); const users = result.users.map(buildApiUser).filter<ApiUser>(Boolean as any);
const chats = result.chats.map((c) => buildApiChatFromPreview(c)).filter<ApiChat>(Boolean as any); const chats = result.chats.map((c) => buildApiChatFromPreview(c)).filter<ApiChat>(Boolean as any);

View File

@ -30,7 +30,6 @@ import {
import { buildApiMessage, buildMessageDraft } from '../apiBuilders/messages'; import { buildApiMessage, buildMessageDraft } from '../apiBuilders/messages';
import { buildApiUser, buildApiUsersAndStatuses } from '../apiBuilders/users'; import { buildApiUser, buildApiUsersAndStatuses } from '../apiBuilders/users';
import { buildCollectionByKey } from '../../../util/iteratees'; import { buildCollectionByKey } from '../../../util/iteratees';
import localDb from '../localDb';
import { import {
buildInputEntity, buildInputEntity,
buildInputPeer, buildInputPeer,
@ -40,7 +39,7 @@ import {
buildChatBannedRights, buildChatBannedRights,
buildChatAdminRights, buildChatAdminRights,
} from '../gramjsBuilders'; } from '../gramjsBuilders';
import { addChatToLocalDb, addMessageToLocalDb } from '../helpers'; import { addEntitiesWithPhotosToLocalDb, addMessageToLocalDb } from '../helpers';
import { buildApiPeerId, getApiChatIdFromMtpPeer } from '../apiBuilders/peers'; import { buildApiPeerId, getApiChatIdFromMtpPeer } from '../apiBuilders/peers';
const MAX_INT_32 = 2 ** 31 - 1; const MAX_INT_32 = 2 ** 31 - 1;
@ -1105,15 +1104,11 @@ function updateLocalDb(result: (
GramJs.messages.Chats | GramJs.messages.ChatsSlice | GramJs.TypeUpdates GramJs.messages.Chats | GramJs.messages.ChatsSlice | GramJs.TypeUpdates
)) { )) {
if ('users' in result) { if ('users' in result) {
result.users.forEach((user) => { addEntitiesWithPhotosToLocalDb(result.users);
if (user instanceof GramJs.User) {
localDb.users[buildApiPeerId(user.id, 'user')] = user;
}
});
} }
if ('chats' in result) { if ('chats' in result) {
result.chats.forEach(addChatToLocalDb); addEntitiesWithPhotosToLocalDb(result.chats);
} }
if ('messages' in result) { if ('messages' in result) {

View File

@ -18,7 +18,7 @@ import { buildApiUser, buildApiUserFromFull, buildApiUsersAndStatuses } from '..
import { buildApiChatFromPreview } from '../apiBuilders/chats'; import { buildApiChatFromPreview } from '../apiBuilders/chats';
import { buildApiPhoto } from '../apiBuilders/common'; import { buildApiPhoto } from '../apiBuilders/common';
import localDb from '../localDb'; import localDb from '../localDb';
import { addChatToLocalDb, addPhotoToLocalDb } from '../helpers'; import { addEntitiesWithPhotosToLocalDb, addPhotoToLocalDb } from '../helpers';
import { buildApiPeerId } from '../apiBuilders/peers'; import { buildApiPeerId } from '../apiBuilders/peers';
let onUpdate: OnApiUpdate; let onUpdate: OnApiUpdate;
@ -249,7 +249,7 @@ export async function fetchProfilePhotos(user?: ApiUser, chat?: ApiChat) {
function updateLocalDb(result: (GramJs.photos.Photos | GramJs.photos.PhotosSlice | GramJs.messages.Chats)) { function updateLocalDb(result: (GramJs.photos.Photos | GramJs.photos.PhotosSlice | GramJs.messages.Chats)) {
if ('chats' in result) { if ('chats' in result) {
result.chats.forEach(addChatToLocalDb); addEntitiesWithPhotosToLocalDb(result.chats);
} }
if ('photos' in result) { if ('photos' in result) {

View File

@ -31,7 +31,12 @@ import {
import localDb from './localDb'; import localDb from './localDb';
import { omitVirtualClassFields } from './apiBuilders/helpers'; import { omitVirtualClassFields } from './apiBuilders/helpers';
import { DEBUG } from '../../config'; import { DEBUG } from '../../config';
import { addMessageToLocalDb, addPhotoToLocalDb, resolveMessageApiChatId } from './helpers'; import {
addMessageToLocalDb,
addEntitiesWithPhotosToLocalDb,
addPhotoToLocalDb,
resolveMessageApiChatId,
} from './helpers';
import { buildApiNotifyException, buildPrivacyKey, buildPrivacyRules } from './apiBuilders/misc'; import { buildApiNotifyException, buildPrivacyKey, buildPrivacyRules } from './apiBuilders/misc';
import { buildApiPhoto } from './apiBuilders/common'; import { buildApiPhoto } from './apiBuilders/common';
import { import {
@ -56,37 +61,36 @@ export function init(_onUpdate: OnApiUpdate) {
const sentMessageIds = new Set(); const sentMessageIds = new Set();
let serverTimeOffset = 0; let serverTimeOffset = 0;
function addEntities(entities: (GramJs.TypeUser | GramJs.TypeChat)[] | undefined) { function dispatchUserAndChatUpdates(entities: (GramJs.TypeUser | GramJs.TypeChat)[]) {
if (entities?.length) { entities
entities .filter((e) => e instanceof GramJs.User)
.filter((e) => e instanceof GramJs.User) .map(buildApiUser)
.map(buildApiUser) .forEach((user) => {
.forEach((user) => { if (!user) {
if (!user) { return;
return; }
}
onUpdate({ onUpdate({
'@type': 'updateUser', '@type': 'updateUser',
id: user.id, id: user.id,
user, user,
});
}); });
entities });
.filter((e) => e instanceof GramJs.Chat || e instanceof GramJs.Channel)
.map((e) => buildApiChatFromPreview(e))
.forEach((chat) => {
if (!chat) {
return;
}
onUpdate({ entities
'@type': 'updateChat', .filter((e) => e instanceof GramJs.Chat || e instanceof GramJs.Channel)
id: chat.id, .map((e) => buildApiChatFromPreview(e))
chat, .forEach((chat) => {
}); if (!chat) {
return;
}
onUpdate({
'@type': 'updateChat',
id: chat.id,
chat,
}); });
} });
} }
export function updater(update: Update, originRequest?: GramJs.AnyRequest) { export function updater(update: Update, originRequest?: GramJs.AnyRequest) {
@ -150,7 +154,11 @@ export function updater(update: Update, originRequest?: GramJs.AnyRequest) {
} }
// eslint-disable-next-line no-underscore-dangle // eslint-disable-next-line no-underscore-dangle
addEntities(update._entities); const entities = update._entities;
if (entities) {
addEntitiesWithPhotosToLocalDb(entities);
dispatchUserAndChatUpdates(entities);
}
if (update instanceof GramJs.UpdateNewScheduledMessage) { if (update instanceof GramJs.UpdateNewScheduledMessage) {
onUpdate({ onUpdate({
@ -818,7 +826,11 @@ export function updater(update: Update, originRequest?: GramJs.AnyRequest) {
}); });
} else if (update instanceof GramJs.UpdateGroupCallParticipants) { } else if (update instanceof GramJs.UpdateGroupCallParticipants) {
// eslint-disable-next-line no-underscore-dangle // eslint-disable-next-line no-underscore-dangle
addEntities(update._entities); const entities = update._entities;
if (entities) {
addEntitiesWithPhotosToLocalDb(entities);
dispatchUserAndChatUpdates(entities);
}
onUpdate({ onUpdate({
'@type': 'updateGroupCallParticipants', '@type': 'updateGroupCallParticipants',