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.
85 lines
2.5 KiB
85 lines
2.5 KiB
import { MOUNT_CLASS_TO } from "../mtproto/mtproto_config"; |
|
import appStateManager from "./appStateManager"; |
|
|
|
export class AppMessagesIDsManager { |
|
public channelLocals: {[channelID: string]: number} = {}; |
|
public channelsByLocals: {[localStart: string]: number} = {}; |
|
public channelCurLocal = 0; |
|
public fullMsgIDModulus = 4294967296; |
|
|
|
constructor() { |
|
appStateManager.getState().then(state => { |
|
const cached = state.messagesIDsLocals; |
|
if(cached) { |
|
this.channelLocals = cached.channelLocals; |
|
this.channelsByLocals = cached.channelsByLocals; |
|
this.channelCurLocal = cached.channelCurLocal; |
|
} |
|
}); |
|
|
|
appStateManager.addListener('save', () => { |
|
appStateManager.pushToState('messagesIDsLocals', { |
|
channelLocals: this.channelLocals, |
|
channelsByLocals: this.channelsByLocals, |
|
channelCurLocal: this.channelCurLocal |
|
}); |
|
}); |
|
} |
|
|
|
public getFullMessageID(msgID: number, channelID: number): number { |
|
if(!channelID || msgID <= 0) { |
|
return msgID; |
|
} |
|
|
|
msgID = this.getMessageLocalID(msgID); |
|
let localStart = this.channelLocals[channelID]; |
|
if(!localStart) { |
|
localStart = (++this.channelCurLocal) * this.fullMsgIDModulus; |
|
this.channelsByLocals[localStart] = channelID; |
|
this.channelLocals[channelID] = localStart; |
|
} |
|
|
|
return localStart + msgID; |
|
} |
|
|
|
public getMessageIDInfo(fullMsgID: number) { |
|
if(fullMsgID < this.fullMsgIDModulus) { |
|
return [fullMsgID, 0]; |
|
} |
|
|
|
const msgID = fullMsgID % this.fullMsgIDModulus; |
|
const channelID = this.channelsByLocals[fullMsgID - msgID]; |
|
|
|
return [msgID, channelID]; |
|
} |
|
|
|
public getMessageLocalID(fullMsgID: number) { |
|
return fullMsgID ? fullMsgID % this.fullMsgIDModulus : 0; |
|
} |
|
|
|
public splitMessageIDsByChannels(mids: number[]) { |
|
const msgIDsByChannels: {[channelID: number]: number[]} = {}; |
|
const midsByChannels: {[channelID: number]: number[]} = {}; |
|
for(const mid of mids) { |
|
const msgChannel = this.getMessageIDInfo(mid); |
|
const channelID = msgChannel[1]; |
|
|
|
if(msgIDsByChannels[channelID] === undefined) { |
|
msgIDsByChannels[channelID] = []; |
|
midsByChannels[channelID] = []; |
|
} |
|
|
|
msgIDsByChannels[channelID].push(msgChannel[0]); |
|
midsByChannels[channelID].push(mid); |
|
} |
|
|
|
return { |
|
msgIDs: msgIDsByChannels, |
|
mids: midsByChannels |
|
}; |
|
} |
|
} |
|
|
|
const appMessagesIDsManager = new AppMessagesIDsManager(); |
|
MOUNT_CLASS_TO && (MOUNT_CLASS_TO.appMessagesIDsManager = appMessagesIDsManager); |
|
export default appMessagesIDsManager;
|
|
|