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.
259 lines
7.1 KiB
259 lines
7.1 KiB
import { isObject } from "../../helpers/object"; |
|
import { DialogPeer, InputDialogPeer, InputPeer, Peer } from "../../layer"; |
|
import { MOUNT_CLASS_TO } from "../mtproto/mtproto_config"; |
|
import { RichTextProcessor } from "../richtextprocessor"; |
|
import rootScope from "../rootScope"; |
|
import appChatsManager from "./appChatsManager"; |
|
import appUsersManager from "./appUsersManager"; |
|
|
|
// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC |
|
/* |
|
HTML-color IRC-color Description |
|
#c03d33 4 red |
|
#4fad2d 3 green |
|
#d09306 7 yellow |
|
#168acd 10 blue |
|
#8544d6 6 purple |
|
#cd4073 13 pink |
|
#2996ad 11 sea |
|
#ce671b 5 orange |
|
*/ |
|
const DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f']; |
|
const DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange']; |
|
const DialogColorsMap = [0, 7, 4, 1, 6, 3, 5]; |
|
|
|
export type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved'; |
|
export class AppPeersManager { |
|
/* public savePeerInstance(peerId: number, instance: any) { |
|
if(peerId < 0) appChatsManager.saveApiChat(instance); |
|
else appUsersManager.saveApiUser(instance); |
|
} */ |
|
|
|
public canPinMessage(peerId: number) { |
|
return peerId > 0 || appChatsManager.hasRights(-peerId, 'pin'); |
|
} |
|
|
|
public getPeerPhoto(peerId: number) { |
|
return peerId > 0 |
|
? appUsersManager.getUserPhoto(peerId) |
|
: appChatsManager.getChatPhoto(-peerId); |
|
} |
|
|
|
public getPeerMigratedTo(peerId: number) { |
|
if(peerId >= 0) { |
|
return false; |
|
} |
|
|
|
let chat = appChatsManager.getChat(-peerId); |
|
if(chat && chat.migrated_to && chat.pFlags.deactivated) { |
|
return this.getPeerId(chat.migrated_to); |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public getPeerTitle(peerId: number | any, plainText = false, onlyFirstName = false) { |
|
if(!peerId) { |
|
peerId = rootScope.myId; |
|
} |
|
|
|
let peer: any = {}; |
|
if(!isObject(peerId)) { |
|
peer = this.getPeer(peerId); |
|
} else peer = peerId; |
|
|
|
let title = ''; |
|
if(peerId > 0) { |
|
if(peer.first_name) title += peer.first_name; |
|
if(peer.last_name) title += ' ' + peer.last_name; |
|
|
|
if(!title) title = peer.pFlags.deleted ? 'Deleted Account' : peer.username; |
|
else title = title.trim(); |
|
} else { |
|
title = peer.title; |
|
} |
|
|
|
if(onlyFirstName) { |
|
title = title.split(' ')[0]; |
|
} |
|
|
|
return plainText ? title : RichTextProcessor.wrapEmojiText(title); |
|
} |
|
|
|
public getOutputPeer(peerId: number): Peer { |
|
if(peerId > 0) { |
|
return {_: 'peerUser', user_id: peerId}; |
|
} |
|
|
|
let chatId = -peerId; |
|
if(appChatsManager.isChannel(chatId)) { |
|
return {_: 'peerChannel', channel_id: chatId}; |
|
} |
|
|
|
return {_: 'peerChat', chat_id: chatId}; |
|
} |
|
|
|
/* public getPeerString(peerId: number) { |
|
if(peerId > 0) { |
|
return appUsersManager.getUserString(peerId); |
|
} |
|
return appChatsManager.getChatString(-peerId); |
|
} */ |
|
|
|
public getPeerUsername(peerId: number): string { |
|
if(peerId > 0) { |
|
return appUsersManager.getUser(peerId).username || ''; |
|
} |
|
return appChatsManager.getChat(-peerId).username || ''; |
|
} |
|
|
|
public getPeer(peerId: number) { |
|
return peerId > 0 |
|
? appUsersManager.getUser(peerId) |
|
: appChatsManager.getChat(-peerId) |
|
} |
|
|
|
public getPeerId(peerString: any/* Peer | number | string */): number { |
|
if(typeof(peerString) === 'number') return peerString; |
|
else if(isObject(peerString)) return peerString.user_id ? peerString.user_id : -(peerString.channel_id || peerString.chat_id); |
|
else if(!peerString) return 0; |
|
|
|
const isUser = peerString.charAt(0) == 'u'; |
|
const peerParams = peerString.substr(1).split('_'); |
|
|
|
return isUser ? peerParams[0] : -peerParams[0] || 0; |
|
} |
|
|
|
public getDialogPeer(peerId: number): DialogPeer { |
|
return { |
|
_: 'dialogPeer', |
|
peer: this.getOutputPeer(peerId) |
|
}; |
|
} |
|
|
|
public isChannel(peerId: number): boolean { |
|
return (peerId < 0) && appChatsManager.isChannel(-peerId); |
|
} |
|
|
|
public isMegagroup(peerId: number) { |
|
return (peerId < 0) && appChatsManager.isMegagroup(-peerId); |
|
} |
|
|
|
public isAnyGroup(peerId: number): boolean { |
|
return (peerId < 0) && !appChatsManager.isBroadcast(-peerId); |
|
} |
|
|
|
public isBroadcast(id: number): boolean { |
|
return this.isChannel(id) && !this.isMegagroup(id); |
|
} |
|
|
|
public isBot(peerId: number): boolean { |
|
return (peerId > 0) && appUsersManager.isBot(peerId); |
|
} |
|
|
|
/* public getInputPeer(peerString: string): InputPeer { |
|
var firstChar = peerString.charAt(0); |
|
var peerParams = peerString.substr(1).split('_'); |
|
let id = +peerParams[0]; |
|
|
|
if(firstChar == 'u') { |
|
//appUsersManager.saveUserAccess(id, peerParams[1]); |
|
|
|
return { |
|
_: 'inputPeerUser', |
|
user_id: id, |
|
access_hash: peerParams[1] |
|
}; |
|
} else if(firstChar == 'c' || firstChar == 's') { |
|
//appChatsManager.saveChannelAccess(id, peerParams[1]); |
|
if(firstChar == 's') { |
|
appChatsManager.saveIsMegagroup(id); |
|
} |
|
|
|
return { |
|
_: 'inputPeerChannel', |
|
channel_id: id, |
|
access_hash: peerParams[1] || '0' |
|
}; |
|
} else { |
|
return { |
|
_: 'inputPeerChat', |
|
chat_id: id |
|
}; |
|
} |
|
} */ |
|
|
|
public getInputPeerById(peerId: number): InputPeer { |
|
if(!peerId) { |
|
return {_: 'inputPeerEmpty'}; |
|
} |
|
|
|
if(peerId < 0) { |
|
const chatId = -peerId; |
|
if(!appChatsManager.isChannel(chatId)) { |
|
return appChatsManager.getChatInputPeer(chatId); |
|
} else { |
|
return appChatsManager.getChannelInputPeer(chatId); |
|
} |
|
} |
|
|
|
return { |
|
_: 'inputPeerUser', |
|
user_id: peerId, |
|
access_hash: appUsersManager.getUser(peerId).access_hash |
|
}; |
|
} |
|
|
|
public getInputDialogPeerById(peerId: number): InputDialogPeer { |
|
return { |
|
_: 'inputDialogPeer', |
|
peer: this.getInputPeerById(peerId) |
|
} |
|
} |
|
|
|
public getPeerColorById(peerId: number, pic = true) { |
|
if(!peerId) return ''; |
|
|
|
const idx = DialogColorsMap[(peerId < 0 ? -peerId : peerId) % 7]; |
|
const color = (pic ? DialogColors : DialogColorsFg)[idx]; |
|
return color; |
|
} |
|
|
|
public getPeerSearchText(peerId: number) { |
|
let text; |
|
if(peerId > 0) { |
|
text = '%pu ' + appUsersManager.getUserSearchText(peerId); |
|
} else if(peerId < 0) { |
|
const chat = appChatsManager.getChat(-peerId); |
|
text = '%pg ' + (chat.title || ''); |
|
} |
|
return text; |
|
} |
|
|
|
public getDialogType(peerId: number): PeerType { |
|
if(appPeersManager.isMegagroup(peerId)) { |
|
return 'megagroup'; |
|
} else if(appPeersManager.isChannel(peerId)) { |
|
return 'channel'; |
|
} else if(peerId < 0) { |
|
return 'group'; |
|
} else { |
|
return peerId == rootScope.myId ? 'saved' : 'chat'; |
|
} |
|
} |
|
|
|
public getDeleteButtonText(peerId: number) { |
|
switch(this.getDialogType(peerId)) { |
|
case 'megagroup': |
|
case 'channel': |
|
return 'Leave'; |
|
|
|
default: |
|
return 'Delete'; |
|
} |
|
} |
|
} |
|
|
|
const appPeersManager = new AppPeersManager(); |
|
MOUNT_CLASS_TO && (MOUNT_CLASS_TO.appPeersManager = appPeersManager); |
|
export default appPeersManager;
|
|
|