Story: Fix handling forwards from deleted channels (#6972)

This commit is contained in:
zubiden 2026-06-01 01:16:09 +02:00 committed by Alexander Zinchuk
parent 328943d254
commit 1162804e9d

View File

@ -1,4 +1,5 @@
import { Api as GramJs } from '../../../lib/gramjs'; import { Api as GramJs } from '../../../lib/gramjs';
import { RPCError } from '../../../lib/gramjs/errors';
import type { import type {
ApiError, ApiError,
@ -32,7 +33,7 @@ import {
} from '../gramjsBuilders'; } from '../gramjsBuilders';
import { addStoryToLocalDb } from '../helpers/localDb'; import { addStoryToLocalDb } from '../helpers/localDb';
import { deserializeBytes } from '../helpers/misc'; import { deserializeBytes } from '../helpers/misc';
import { invokeRequest } from './client'; import { dispatchErrorUpdate, invokeRequest } from './client';
export async function fetchAllStories({ export async function fetchAllStories({
stateHash, stateHash,
@ -181,16 +182,30 @@ export function fetchStoriesArchive({
} }
export async function fetchPeerStoriesByIds({ peer, ids }: { peer: ApiPeer; ids: number[] }) { export async function fetchPeerStoriesByIds({ peer, ids }: { peer: ApiPeer; ids: number[] }) {
const result = await invokeRequest(new GramJs.stories.GetStoriesByID({ const request = new GramJs.stories.GetStoriesByID({
peer: buildInputPeer(peer.id, peer.accessHash), peer: buildInputPeer(peer.id, peer.accessHash),
id: ids, id: ids,
})); });
let result;
try {
result = await invokeRequest(request, { shouldThrow: true });
} catch (err) {
if (err instanceof RPCError && err.errorMessage === 'CHANNEL_PRIVATE') {
return {
stories: buildDeletedStories(peer.id, ids),
};
}
dispatchErrorUpdate(err as Error, request);
return undefined;
}
if (!result) { if (!result) {
return undefined; return undefined;
} }
const stories = ids.reduce<Record<string, ApiTypeStory>>((acc, id) => { const stories = ids.reduce<Record<number, ApiTypeStory>>((acc, id) => {
const story = result.stories.find(({ id: currentId }) => currentId === id); const story = result.stories.find(({ id: currentId }) => currentId === id);
if (story) { if (story) {
acc[id] = buildApiStory(peer.id, story); acc[id] = buildApiStory(peer.id, story);
@ -214,6 +229,18 @@ export async function fetchPeerStoriesByIds({ peer, ids }: { peer: ApiPeer; ids:
}; };
} }
function buildDeletedStories(peerId: string, ids: number[]): Record<number, ApiTypeStory> {
return ids.reduce<Record<number, ApiTypeStory>>((acc, id) => {
acc[id] = {
id,
peerId,
isDeleted: true,
};
return acc;
}, {});
}
export function viewStory({ peer, storyId }: { peer: ApiPeer; storyId: number }) { export function viewStory({ peer, storyId }: { peer: ApiPeer; storyId: number }) {
return invokeRequest(new GramJs.stories.IncrementStoryViews({ return invokeRequest(new GramJs.stories.IncrementStoryViews({
peer: buildInputPeer(peer.id, peer.accessHash), peer: buildInputPeer(peer.id, peer.accessHash),