Composer: Support scheduling forwarded messages

This commit is contained in:
Alexander Zinchuk 2021-11-17 17:49:55 +03:00
parent becfab6fe7
commit f17277aad9
5 changed files with 32 additions and 10 deletions

View File

@ -849,10 +849,11 @@ export function buildLocalMessage(
}; };
} }
export function buildForwardedMessage( export function buildLocalForwardedMessage(
toChat: ApiChat, toChat: ApiChat,
message: ApiMessage, message: ApiMessage,
serverTimeOffset: number, serverTimeOffset: number,
scheduledAt?: number,
): ApiMessage { ): ApiMessage {
const localId = localMessageCounter++; const localId = localMessageCounter++;
const { const {
@ -873,10 +874,12 @@ export function buildForwardedMessage(
id: localId, id: localId,
chatId: toChat.id, chatId: toChat.id,
content, content,
date: Math.round(Date.now() / 1000) + serverTimeOffset, date: scheduledAt || Math.round(Date.now() / 1000) + serverTimeOffset,
isOutgoing: !asIncomingInChatWithSelf && toChat.type !== 'chatTypeChannel', isOutgoing: !asIncomingInChatWithSelf && toChat.type !== 'chatTypeChannel',
senderId: currentUserId, senderId: currentUserId,
sendingState: 'messageSendingStatePending', sendingState: 'messageSendingStatePending',
groupedId,
isInAlbum,
// Forward info doesn't get added when users forwards his own messages, also when forwarding audio // Forward info doesn't get added when users forwards his own messages, also when forwarding audio
...(senderId !== currentUserId && !isAudio && { ...(senderId !== currentUserId && !isAudio && {
forwardInfo: { forwardInfo: {
@ -886,8 +889,7 @@ export function buildForwardedMessage(
senderUserId: senderId, senderUserId: senderId,
}, },
}), }),
groupedId, ...(scheduledAt && { isScheduled: true }),
isInAlbum,
}; };
} }

View File

@ -30,7 +30,7 @@ import {
buildApiMessage, buildApiMessage,
buildLocalMessage, buildLocalMessage,
buildWebPage, buildWebPage,
buildForwardedMessage, buildLocalForwardedMessage,
} from '../apiBuilders/messages'; } from '../apiBuilders/messages';
import { buildApiUser } from '../apiBuilders/users'; import { buildApiUser } from '../apiBuilders/users';
import { import {
@ -1024,21 +1024,25 @@ export async function forwardMessages({
toChat, toChat,
messages, messages,
serverTimeOffset, serverTimeOffset,
isSilent,
scheduledAt,
}: { }: {
fromChat: ApiChat; fromChat: ApiChat;
toChat: ApiChat; toChat: ApiChat;
messages: ApiMessage[]; messages: ApiMessage[];
serverTimeOffset: number; serverTimeOffset: number;
isSilent?: boolean;
scheduledAt?: number;
}) { }) {
const messageIds = messages.map(({ id }) => id); const messageIds = messages.map(({ id }) => id);
const randomIds = messages.map(generateRandomBigInt); const randomIds = messages.map(generateRandomBigInt);
messages.forEach((message, index) => { messages.forEach((message, index) => {
const localMessage = buildForwardedMessage(toChat, message, serverTimeOffset); const localMessage = buildLocalForwardedMessage(toChat, message, serverTimeOffset, scheduledAt);
localDb.localMessages[String(randomIds[index])] = localMessage; localDb.localMessages[String(randomIds[index])] = localMessage;
onUpdate({ onUpdate({
'@type': 'newMessage', '@type': localMessage.isScheduled ? 'newScheduledMessage' : 'newMessage',
id: localMessage.id, id: localMessage.id,
chatId: toChat.id, chatId: toChat.id,
message: localMessage, message: localMessage,
@ -1050,6 +1054,8 @@ export async function forwardMessages({
toPeer: buildInputPeer(toChat.id, toChat.accessHash), toPeer: buildInputPeer(toChat.id, toChat.accessHash),
randomId: randomIds, randomId: randomIds,
id: messageIds, id: messageIds,
...(isSilent && { sil2ent: isSilent }),
...(scheduledAt && { scheduleDate: scheduledAt }),
}), true); }), true);
} }

View File

@ -526,8 +526,12 @@ const Composer: FC<OwnProps & StateProps & DispatchProps> = ({
isSilent, isSilent,
}); });
} }
if (isForwarding) { if (isForwarding) {
forwardMessages(); forwardMessages({
scheduledAt,
isSilent,
});
} }
lastMessageSendTimeSeconds.current = getServerTime(serverTimeOffset); lastMessageSendTimeSeconds.current = getServerTime(serverTimeOffset);

View File

@ -270,7 +270,9 @@ const Message: FC<OwnProps & StateProps & DispatchProps> = ({
const hasReply = isReplyMessage(message) && !shouldHideReply; const hasReply = isReplyMessage(message) && !shouldHideReply;
const hasThread = Boolean(threadInfo) && messageListType === 'thread'; const hasThread = Boolean(threadInfo) && messageListType === 'thread';
const { forwardInfo, viaBotId } = message; const { forwardInfo, viaBotId } = message;
const asForwarded = forwardInfo && !isChatWithSelf && !isRepliesChat && !forwardInfo.isLinkedChannelPost; const asForwarded = (
forwardInfo && (!isChatWithSelf || isScheduled) && !isRepliesChat && !forwardInfo.isLinkedChannelPost
);
const isInDocumentGroup = Boolean(message.groupedId) && !message.isInAlbum; const isInDocumentGroup = Boolean(message.groupedId) && !message.isInAlbum;
const isAlbum = Boolean(album) && album!.messages.length > 1; const isAlbum = Boolean(album) && album!.messages.length > 1;
const { const {

View File

@ -555,7 +555,7 @@ addReducer('loadPollOptionResults', (global, actions, payload) => {
void loadPollOptionResults(chat, messageId, option, offset, limit, shouldResetVoters); void loadPollOptionResults(chat, messageId, option, offset, limit, shouldResetVoters);
}); });
addReducer('forwardMessages', (global) => { addReducer('forwardMessages', (global, action, payload) => {
const { fromChatId, messageIds, toChatId } = global.forwardMessages; const { fromChatId, messageIds, toChatId } = global.forwardMessages;
const fromChat = fromChatId ? selectChat(global, fromChatId) : undefined; const fromChat = fromChatId ? selectChat(global, fromChatId) : undefined;
const toChat = toChatId ? selectChat(global, toChatId) : undefined; const toChat = toChatId ? selectChat(global, toChatId) : undefined;
@ -569,6 +569,8 @@ addReducer('forwardMessages', (global) => {
return; return;
} }
const { isSilent, scheduledAt } = payload;
const realMessages = messages.filter((m) => !isServiceNotificationMessage(m)); const realMessages = messages.filter((m) => !isServiceNotificationMessage(m));
if (realMessages.length) { if (realMessages.length) {
void callApi('forwardMessages', { void callApi('forwardMessages', {
@ -576,6 +578,8 @@ addReducer('forwardMessages', (global) => {
toChat, toChat,
messages: realMessages, messages: realMessages,
serverTimeOffset: getGlobal().serverTimeOffset, serverTimeOffset: getGlobal().serverTimeOffset,
isSilent,
scheduledAt,
}); });
} }
@ -591,6 +595,8 @@ addReducer('forwardMessages', (global) => {
entities, entities,
sticker, sticker,
poll, poll,
isSilent,
scheduledAt,
}); });
}); });
@ -829,6 +835,8 @@ async function sendMessage(params: {
gif?: ApiVideo; gif?: ApiVideo;
poll?: ApiNewPoll; poll?: ApiNewPoll;
serverTimeOffset?: number; serverTimeOffset?: number;
isSilent?: boolean;
scheduledAt?: number;
}) { }) {
let localId: number | undefined; let localId: number | undefined;
const progressCallback = params.attachment ? (progress: number, messageLocalId: number) => { const progressCallback = params.attachment ? (progress: number, messageLocalId: number) => {