/* * https://github.com/morethanwords/tweb * Copyright (C) 2019-2021 Eduard Kuzmenko * https://github.com/morethanwords/tweb/blob/master/LICENSE */ import {MESSAGE_ID_OFFSET} from '../mtproto/mtproto_config'; import getServerMessageId from './utils/messageId/getServerMessageId'; export class AppMessagesIdsManager { // private channelLocals: {[channelId: ChatId]: number} = {}; // private channelsByLocals: {[local: number]: ChatId} = {}; // private channelCurLocal = 0; public generateTempMessageId(messageId: number, channelId: ChatId) { return +(this.generateMessageId(messageId, channelId) + 0.0001).toFixed(4); } public generateMessageId(messageId: number, channelId: ChatId) { if( !channelId || !Number.isInteger(messageId) || messageId <= 0 ) { return messageId; } messageId = getServerMessageId(messageId); // let localStart = this.channelLocals[channelId]; const localStart = MESSAGE_ID_OFFSET; // if(!localStart) { // localStart = ++this.channelCurLocal * MESSAGE_ID_OFFSET; // this.channelsByLocals[localStart] = channelId; // this.channelLocals[channelId] = localStart; // } return localStart + messageId; } public isLegacyMessageId(messageId: number) { return typeof(messageId) === 'number' && messageId < MESSAGE_ID_OFFSET; } public incrementMessageId(messageId: number, increment: number) { return this.generateMessageId(getServerMessageId(messageId) + increment, this.isLegacyMessageId(messageId) ? 1 : 0); } public getMessageIdInfo(mid: number, channelId?: ChatId) { const messageId = getServerMessageId(mid); return {messageId, channelId: mid === messageId ? undefined : channelId}; // if(mid === messageId) { // return {messageId, channelId: undefined as number}; // } // const channelId = this.channelsByLocals[mid - messageId]; // return {messageId, channelId}; } public splitMessageIdsByChannels(mids: number[], _channelId?: ChatId) { const out: Array<[ChatId, {mids: number[], messageIds: number[]}]> = []; let prevItem: typeof out[0]; for(let i = 0, length = mids.length; i < length; ++i) { const mid = mids[i]; const {messageId, channelId} = this.getMessageIdInfo(mid, _channelId); if(!prevItem || prevItem[0] !== channelId) { prevItem = [channelId, {mids: [], messageIds: []}]; out.push(prevItem); } prevItem[1].mids.push(mid); prevItem[1].messageIds.push(messageId); } return out; } }