Attach reply footer right after sending post
This commit is contained in:
parent
4cbcaccc83
commit
9fcebc204c
@ -2816,7 +2816,7 @@ export default class ChatBubbles {
|
|||||||
|
|
||||||
let targetMid: number;
|
let targetMid: number;
|
||||||
if(backLimit) {
|
if(backLimit) {
|
||||||
targetMid = maxId;
|
targetMid = maxId || Math.max(...sortedMids); // * on discussion enter
|
||||||
} else {
|
} else {
|
||||||
if(additionMsgId) {
|
if(additionMsgId) {
|
||||||
targetMid = additionMsgId;
|
targetMid = additionMsgId;
|
||||||
|
@ -6,7 +6,7 @@ import { createPosterForVideo } from "../../helpers/files";
|
|||||||
import { copy, defineNotNumerableProperties, getObjectKeysAndSort } from "../../helpers/object";
|
import { copy, defineNotNumerableProperties, getObjectKeysAndSort } from "../../helpers/object";
|
||||||
import { randomLong } from "../../helpers/random";
|
import { randomLong } from "../../helpers/random";
|
||||||
import { splitStringByLength, limitSymbols } from "../../helpers/string";
|
import { splitStringByLength, limitSymbols } from "../../helpers/string";
|
||||||
import { Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputNotifyPeer, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MessagesPeerDialogs, MethodDeclMap, NotifyPeer, PhotoSize, SendMessageAction, Update } from "../../layer";
|
import { ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputNotifyPeer, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MessagesPeerDialogs, MethodDeclMap, NotifyPeer, PhotoSize, SendMessageAction, Update } from "../../layer";
|
||||||
import { InvokeApiOptions } from "../../types";
|
import { InvokeApiOptions } from "../../types";
|
||||||
import { langPack } from "../langPack";
|
import { langPack } from "../langPack";
|
||||||
import { logger, LogLevels } from "../logger";
|
import { logger, LogLevels } from "../logger";
|
||||||
@ -35,6 +35,7 @@ import appWebPagesManager from "./appWebPagesManager";
|
|||||||
import appDraftsManager from "./appDraftsManager";
|
import appDraftsManager from "./appDraftsManager";
|
||||||
import pushHeavyTask from "../../helpers/heavyQueue";
|
import pushHeavyTask from "../../helpers/heavyQueue";
|
||||||
import { getFileNameByLocation } from "../../helpers/fileName";
|
import { getFileNameByLocation } from "../../helpers/fileName";
|
||||||
|
import appProfileManager from "./appProfileManager";
|
||||||
|
|
||||||
//console.trace('include');
|
//console.trace('include');
|
||||||
// TODO: если удалить сообщение в непрогруженном диалоге, то при обновлении, из-за стейта, последнего сообщения в чатлисте не будет
|
// TODO: если удалить сообщение в непрогруженном диалоге, то при обновлении, из-за стейта, последнего сообщения в чатлисте не будет
|
||||||
@ -454,29 +455,13 @@ export class AppMessagesManager {
|
|||||||
if(!sendEntites.length) {
|
if(!sendEntites.length) {
|
||||||
sendEntites = undefined;
|
sendEntites = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
const messageId = this.generateTempMessageId(peerId);
|
const message = this.generateOutgoingMessage(peerId, options);
|
||||||
const randomIdS = randomLong();
|
message.entities = entities;
|
||||||
|
message.message = text;
|
||||||
|
|
||||||
const replyToMsgId = options.replyToMsgId ? this.getServerMessageId(options.replyToMsgId) : undefined;
|
const replyToMsgId = options.replyToMsgId ? this.getServerMessageId(options.replyToMsgId) : undefined;
|
||||||
const isChannel = appPeersManager.isChannel(peerId);
|
const isChannel = appPeersManager.isChannel(peerId);
|
||||||
const isBroadcast = appPeersManager.isBroadcast(peerId);
|
|
||||||
|
|
||||||
const message: any = {
|
|
||||||
_: 'message',
|
|
||||||
id: messageId,
|
|
||||||
from_id: this.generateFromId(peerId),
|
|
||||||
peer_id: appPeersManager.getOutputPeer(peerId),
|
|
||||||
pFlags: this.generateFlags(peerId),
|
|
||||||
date: options.scheduleDate || (tsNow(true) + serverTimeManager.serverTimeOffset),
|
|
||||||
message: text,
|
|
||||||
random_id: randomIdS,
|
|
||||||
reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),
|
|
||||||
via_bot_id: options.viaBotId,
|
|
||||||
reply_markup: options.reply_markup,
|
|
||||||
entities,
|
|
||||||
views: isBroadcast && 1,
|
|
||||||
pending: true
|
|
||||||
};
|
|
||||||
|
|
||||||
if(options.webPage) {
|
if(options.webPage) {
|
||||||
message.media = {
|
message.media = {
|
||||||
@ -505,7 +490,7 @@ export class AppMessagesManager {
|
|||||||
if(options.viaBotId) {
|
if(options.viaBotId) {
|
||||||
apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {
|
apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {
|
||||||
peer: appPeersManager.getInputPeerById(peerId),
|
peer: appPeersManager.getInputPeerById(peerId),
|
||||||
random_id: randomIdS,
|
random_id: message.random_id,
|
||||||
reply_to_msg_id: replyToMsgId || undefined,
|
reply_to_msg_id: replyToMsgId || undefined,
|
||||||
query_id: options.queryId,
|
query_id: options.queryId,
|
||||||
id: options.resultId,
|
id: options.resultId,
|
||||||
@ -516,7 +501,7 @@ export class AppMessagesManager {
|
|||||||
no_webpage: options.noWebPage,
|
no_webpage: options.noWebPage,
|
||||||
peer: appPeersManager.getInputPeerById(peerId),
|
peer: appPeersManager.getInputPeerById(peerId),
|
||||||
message: text,
|
message: text,
|
||||||
random_id: randomIdS,
|
random_id: message.random_id,
|
||||||
reply_to_msg_id: replyToMsgId || undefined,
|
reply_to_msg_id: replyToMsgId || undefined,
|
||||||
entities: sendEntites,
|
entities: sendEntites,
|
||||||
clear_draft: options.clearDraft,
|
clear_draft: options.clearDraft,
|
||||||
@ -542,7 +527,7 @@ export class AppMessagesManager {
|
|||||||
seq: 0,
|
seq: 0,
|
||||||
updates: [{
|
updates: [{
|
||||||
_: 'updateMessageID',
|
_: 'updateMessageID',
|
||||||
random_id: randomIdS,
|
random_id: message.random_id,
|
||||||
id: updates.id
|
id: updates.id
|
||||||
}, {
|
}, {
|
||||||
_: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),
|
_: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),
|
||||||
@ -610,18 +595,11 @@ export class AppMessagesManager {
|
|||||||
}> = {}) {
|
}> = {}) {
|
||||||
peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;
|
peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;
|
||||||
|
|
||||||
if(options.threadId && !options.replyToMsgId) {
|
|
||||||
options.replyToMsgId = options.threadId;
|
|
||||||
}
|
|
||||||
|
|
||||||
//this.checkSendOptions(options);
|
//this.checkSendOptions(options);
|
||||||
const messageId = this.generateTempMessageId(peerId);
|
|
||||||
const randomIdS = randomLong();
|
const message = this.generateOutgoingMessage(peerId, options);
|
||||||
const pFlags = this.generateFlags(peerId);
|
|
||||||
const replyToMsgId = options.replyToMsgId ? this.getServerMessageId(options.replyToMsgId) : undefined;
|
const replyToMsgId = options.replyToMsgId ? this.getServerMessageId(options.replyToMsgId) : undefined;
|
||||||
const isChannel = appPeersManager.isChannel(peerId);
|
|
||||||
const isMegagroup = isChannel && appPeersManager.isMegagroup(peerId);
|
|
||||||
const asChannel = !!(isChannel && !isMegagroup);
|
|
||||||
let attachType: string, apiFileName: string;
|
let attachType: string, apiFileName: string;
|
||||||
|
|
||||||
const fileType = 'mime_type' in file ? file.mime_type : file.type;
|
const fileType = 'mime_type' in file ? file.mime_type : file.type;
|
||||||
@ -629,8 +607,6 @@ export class AppMessagesManager {
|
|||||||
const isDocument = !(file instanceof File) && !(file instanceof Blob);
|
const isDocument = !(file instanceof File) && !(file instanceof Blob);
|
||||||
let caption = options.caption || '';
|
let caption = options.caption || '';
|
||||||
|
|
||||||
const date = options.scheduleDate || (tsNow(true) + serverTimeManager.serverTimeOffset);
|
|
||||||
|
|
||||||
this.log('sendFile', file, fileType);
|
this.log('sendFile', file, fileType);
|
||||||
|
|
||||||
const entities = options.entities || [];
|
const entities = options.entities || [];
|
||||||
@ -655,7 +631,7 @@ export class AppMessagesManager {
|
|||||||
|
|
||||||
if(options.isVoiceMessage) {
|
if(options.isVoiceMessage) {
|
||||||
attachType = 'voice';
|
attachType = 'voice';
|
||||||
pFlags.media_unread = true;
|
message.pFlags.media_unread = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
let attribute: DocumentAttribute.documentAttributeAudio = {
|
let attribute: DocumentAttribute.documentAttributeAudio = {
|
||||||
@ -679,7 +655,7 @@ export class AppMessagesManager {
|
|||||||
|
|
||||||
photo = {
|
photo = {
|
||||||
_: 'photo',
|
_: 'photo',
|
||||||
id: '' + messageId,
|
id: '' + message.id,
|
||||||
sizes: [{
|
sizes: [{
|
||||||
_: 'photoSize',
|
_: 'photoSize',
|
||||||
w: options.width,
|
w: options.width,
|
||||||
@ -725,7 +701,7 @@ export class AppMessagesManager {
|
|||||||
const thumbs: PhotoSize[] = [];
|
const thumbs: PhotoSize[] = [];
|
||||||
document = {
|
document = {
|
||||||
_: 'document',
|
_: 'document',
|
||||||
id: '' + messageId,
|
id: '' + message.id,
|
||||||
duration: options.duration,
|
duration: options.duration,
|
||||||
attributes,
|
attributes,
|
||||||
w: options.width,
|
w: options.width,
|
||||||
@ -804,25 +780,13 @@ export class AppMessagesManager {
|
|||||||
promise: sentDeferred
|
promise: sentDeferred
|
||||||
};
|
};
|
||||||
|
|
||||||
const message: any = {
|
message.entities = entities;
|
||||||
_: 'message',
|
message.message = caption;
|
||||||
id: messageId,
|
message.media = isDocument ? {
|
||||||
from_id: this.generateFromId(peerId),
|
_: 'messageMediaDocument',
|
||||||
peer_id: appPeersManager.getOutputPeer(peerId),
|
pFlags: {},
|
||||||
entities,
|
document: file
|
||||||
pFlags,
|
} : media;
|
||||||
date,
|
|
||||||
message: caption,
|
|
||||||
media: isDocument ? {
|
|
||||||
_: 'messageMediaDocument',
|
|
||||||
pFlags: {},
|
|
||||||
document: file
|
|
||||||
} : media,
|
|
||||||
random_id: randomIdS,
|
|
||||||
reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),
|
|
||||||
views: asChannel && 1,
|
|
||||||
pending: true
|
|
||||||
};
|
|
||||||
|
|
||||||
const toggleError = (on: boolean) => {
|
const toggleError = (on: boolean) => {
|
||||||
if(on) {
|
if(on) {
|
||||||
@ -929,7 +893,7 @@ export class AppMessagesManager {
|
|||||||
this.log('cancelling upload', media);
|
this.log('cancelling upload', media);
|
||||||
|
|
||||||
sentDeferred.reject(err);
|
sentDeferred.reject(err);
|
||||||
this.cancelPendingMessage(randomIdS);
|
this.cancelPendingMessage(message.random_id);
|
||||||
this.setTyping(peerId, 'sendMessageCancelAction');
|
this.setTyping(peerId, 'sendMessageCancelAction');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -965,7 +929,7 @@ export class AppMessagesManager {
|
|||||||
peer: appPeersManager.getInputPeerById(peerId),
|
peer: appPeersManager.getInputPeerById(peerId),
|
||||||
media: inputMedia,
|
media: inputMedia,
|
||||||
message: caption,
|
message: caption,
|
||||||
random_id: randomIdS,
|
random_id: message.random_id,
|
||||||
reply_to_msg_id: replyToMsgId,
|
reply_to_msg_id: replyToMsgId,
|
||||||
schedule_date: options.scheduleDate,
|
schedule_date: options.scheduleDate,
|
||||||
silent: options.silent,
|
silent: options.silent,
|
||||||
@ -1169,22 +1133,14 @@ export class AppMessagesManager {
|
|||||||
}> = {}) {
|
}> = {}) {
|
||||||
peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;
|
peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;
|
||||||
|
|
||||||
if(options.threadId && !options.replyToMsgId) {
|
|
||||||
options.replyToMsgId = options.threadId;
|
|
||||||
}
|
|
||||||
|
|
||||||
//this.checkSendOptions(options);
|
//this.checkSendOptions(options);
|
||||||
const messageId = this.generateTempMessageId(peerId);
|
const message = this.generateOutgoingMessage(peerId, options);
|
||||||
const randomIdS = randomLong();
|
|
||||||
const replyToMsgId = options.replyToMsgId ? this.getServerMessageId(options.replyToMsgId) : undefined;
|
const replyToMsgId = options.replyToMsgId ? this.getServerMessageId(options.replyToMsgId) : undefined;
|
||||||
const isChannel = appPeersManager.isChannel(peerId);
|
|
||||||
const isMegagroup = isChannel && appPeersManager.isMegagroup(peerId);
|
|
||||||
const asChannel = isChannel && !isMegagroup ? true : false;
|
|
||||||
|
|
||||||
let media;
|
let media;
|
||||||
switch(inputMedia._) {
|
switch(inputMedia._) {
|
||||||
case 'inputMediaPoll': {
|
case 'inputMediaPoll': {
|
||||||
inputMedia.poll.id = messageId;
|
inputMedia.poll.id = message.id;
|
||||||
appPollsManager.savePoll(inputMedia.poll, {
|
appPollsManager.savePoll(inputMedia.poll, {
|
||||||
_: 'pollResults',
|
_: 'pollResults',
|
||||||
flags: 4,
|
flags: 4,
|
||||||
@ -1192,7 +1148,7 @@ export class AppMessagesManager {
|
|||||||
pFlags: {},
|
pFlags: {},
|
||||||
});
|
});
|
||||||
|
|
||||||
const {poll, results} = appPollsManager.getPoll('' + messageId);
|
const {poll, results} = appPollsManager.getPoll('' + message.id);
|
||||||
media = {
|
media = {
|
||||||
_: 'messageMediaPoll',
|
_: 'messageMediaPoll',
|
||||||
poll,
|
poll,
|
||||||
@ -1262,22 +1218,7 @@ export class AppMessagesManager {
|
|||||||
break; */
|
break; */
|
||||||
}
|
}
|
||||||
|
|
||||||
const message: any = {
|
message.media = media;
|
||||||
_: 'message',
|
|
||||||
id: messageId,
|
|
||||||
from_id: this.generateFromId(peerId),
|
|
||||||
peer_id: appPeersManager.getOutputPeer(peerId),
|
|
||||||
pFlags: this.generateFlags(peerId),
|
|
||||||
date: options.scheduleDate || (tsNow(true) + serverTimeManager.serverTimeOffset),
|
|
||||||
message: '',
|
|
||||||
media,
|
|
||||||
random_id: randomIdS,
|
|
||||||
reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),
|
|
||||||
via_bot_id: options.viaBotId,
|
|
||||||
reply_markup: options.reply_markup,
|
|
||||||
views: asChannel && 1,
|
|
||||||
pending: true,
|
|
||||||
};
|
|
||||||
|
|
||||||
let toggleError = (on: boolean) => {
|
let toggleError = (on: boolean) => {
|
||||||
/* const historyMessage = this.messagesForHistory[messageId];
|
/* const historyMessage = this.messagesForHistory[messageId];
|
||||||
@ -1305,7 +1246,7 @@ export class AppMessagesManager {
|
|||||||
if(options.viaBotId) {
|
if(options.viaBotId) {
|
||||||
apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {
|
apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {
|
||||||
peer: appPeersManager.getInputPeerById(peerId),
|
peer: appPeersManager.getInputPeerById(peerId),
|
||||||
random_id: randomIdS,
|
random_id: message.random_id,
|
||||||
reply_to_msg_id: replyToMsgId || undefined,
|
reply_to_msg_id: replyToMsgId || undefined,
|
||||||
query_id: options.queryId,
|
query_id: options.queryId,
|
||||||
id: options.resultId,
|
id: options.resultId,
|
||||||
@ -1315,7 +1256,7 @@ export class AppMessagesManager {
|
|||||||
apiPromise = apiManager.invokeApiAfter('messages.sendMedia', {
|
apiPromise = apiManager.invokeApiAfter('messages.sendMedia', {
|
||||||
peer: appPeersManager.getInputPeerById(peerId),
|
peer: appPeersManager.getInputPeerById(peerId),
|
||||||
media: inputMedia,
|
media: inputMedia,
|
||||||
random_id: randomIdS,
|
random_id: message.random_id,
|
||||||
reply_to_msg_id: replyToMsgId || undefined,
|
reply_to_msg_id: replyToMsgId || undefined,
|
||||||
message: '',
|
message: '',
|
||||||
clear_draft: options.clearDraft,
|
clear_draft: options.clearDraft,
|
||||||
@ -1410,6 +1351,37 @@ export class AppMessagesManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private generateOutgoingMessage(peerId: number, options: Partial<{
|
||||||
|
scheduleDate: number,
|
||||||
|
replyToMsgId: number,
|
||||||
|
threadId: number,
|
||||||
|
viaBotId: number,
|
||||||
|
reply_markup: any
|
||||||
|
}>) {
|
||||||
|
if(options.threadId && !options.replyToMsgId) {
|
||||||
|
options.replyToMsgId = options.threadId;
|
||||||
|
}
|
||||||
|
|
||||||
|
const message: any = {
|
||||||
|
_: 'message',
|
||||||
|
id: this.generateTempMessageId(peerId),
|
||||||
|
from_id: this.generateFromId(peerId),
|
||||||
|
peer_id: appPeersManager.getOutputPeer(peerId),
|
||||||
|
pFlags: this.generateFlags(peerId),
|
||||||
|
date: options.scheduleDate || (tsNow(true) + serverTimeManager.serverTimeOffset),
|
||||||
|
message: '',
|
||||||
|
random_id: randomLong(),
|
||||||
|
reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),
|
||||||
|
via_bot_id: options.viaBotId,
|
||||||
|
reply_markup: options.reply_markup,
|
||||||
|
replies: this.generateReplies(peerId),
|
||||||
|
views: appPeersManager.isBroadcast(peerId) && 1,
|
||||||
|
pending: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
private generateReplyHeader(replyToMsgId: number, replyToTopId?: number) {
|
private generateReplyHeader(replyToMsgId: number, replyToTopId?: number) {
|
||||||
const header = {
|
const header = {
|
||||||
_: 'messageReplyHeader',
|
_: 'messageReplyHeader',
|
||||||
@ -1423,10 +1395,31 @@ export class AppMessagesManager {
|
|||||||
return header;
|
return header;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private generateReplies(peerId: number) {
|
||||||
|
let replies: MessageReplies.messageReplies;
|
||||||
|
if(appPeersManager.isBroadcast(peerId)) {
|
||||||
|
const channelFull = appProfileManager.chatsFull[-peerId] as ChatFull.channelFull;
|
||||||
|
if(channelFull.linked_chat_id) {
|
||||||
|
replies = {
|
||||||
|
_: 'messageReplies',
|
||||||
|
flags: 1,
|
||||||
|
pFlags: {
|
||||||
|
comments: true
|
||||||
|
},
|
||||||
|
channel_id: channelFull.linked_chat_id,
|
||||||
|
replies: 0,
|
||||||
|
replies_pts: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return replies;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate correct from_id according to anonymous or broadcast
|
* Generate correct from_id according to anonymous or broadcast
|
||||||
*/
|
*/
|
||||||
public generateFromId(peerId: number) {
|
private generateFromId(peerId: number) {
|
||||||
if(peerId < 0 && (appPeersManager.isBroadcast(peerId) || appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous)) {
|
if(peerId < 0 && (appPeersManager.isBroadcast(peerId) || appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous)) {
|
||||||
return undefined;
|
return undefined;
|
||||||
} else {
|
} else {
|
||||||
@ -1434,7 +1427,7 @@ export class AppMessagesManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public generateFlags(peerId: number) {
|
private generateFlags(peerId: number) {
|
||||||
const pFlags: any = {};
|
const pFlags: any = {};
|
||||||
const fromId = appUsersManager.getSelf().id;
|
const fromId = appUsersManager.getSelf().id;
|
||||||
if(peerId !== fromId) {
|
if(peerId !== fromId) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user