export class AppMessagesIDsManager { public channelLocals = {} as any; public channelsByLocals = {} as any; public channelCurLocal = 0; public fullMsgIDModulus = 4294967296; public getFullMessageID(msgID: number, channelID: number): number { if(!channelID || msgID <= 0) { return msgID; } msgID = this.getMessageLocalID(msgID); var 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]; } var msgID = fullMsgID % this.fullMsgIDModulus; var channelID = this.channelsByLocals[fullMsgID - msgID]; return [msgID, channelID]; } public getMessageLocalID(fullMsgID: number) { if (!fullMsgID) { return 0; } return fullMsgID % this.fullMsgIDModulus; } public splitMessageIDsByChannels (mids: any[]) { var msgIDsByChannels: any = {}; var midsByChannels: any = {}; var i; var mid, msgChannel; var channelID; for(i = 0; i < mids.length; i++) { mid = mids[i]; msgChannel = this.getMessageIDInfo(mid); 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 }; } } export default new AppMessagesIDsManager();