Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.5 KiB
76 lines
2.5 KiB
/* |
|
* 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; |
|
} |
|
}
|
|
|