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.
 
 
 
 
 

276 lines
8.8 KiB

/*
* https://github.com/morethanwords/tweb
* Copyright (C) 2019-2021 Eduard Kuzmenko
* https://github.com/morethanwords/tweb/blob/master/LICENSE
*
* Originally from:
* https://github.com/zhukov/webogram
* Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>
* https://github.com/zhukov/webogram/blob/master/LICENSE
*/
import type {Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto} from '../../layer';
import type {LangPackKey} from '../langPack';
import {getRestrictionReason} from '../../helpers/restrictions';
import isObject from '../../helpers/object/isObject';
import {AppManager} from './manager';
import getPeerId from './utils/peers/getPeerId';
import isUser from './utils/peers/isUser';
import isAnyChat from './utils/peers/isAnyChat';
import {NULL_PEER_ID} from '../mtproto/mtproto_config';
export type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';
export class AppPeersManager extends AppManager {
public get peerId() {
return this.appUsersManager.userId.toPeerId();
}
/* public savePeerInstance(peerId: PeerId, instance: any) {
if(peerId < 0) appChatsManager.saveApiChat(instance);
else appUsersManager.saveApiUser(instance);
} */
public canPinMessage(peerId: PeerId) {
return peerId.isUser() || this.appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');
}
public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {
if(this.isRestricted(peerId)) {
return;
}
const photo = peerId.isUser() ?
this.appUsersManager.getUserPhoto(peerId.toUserId()) :
this.appChatsManager.getChatPhoto(peerId.toChatId());
return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : undefined;
}
public getPeerMigratedTo(peerId: PeerId) {
if(peerId.isUser()) {
return false;
}
const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());
if(chat && chat.migrated_to && chat.pFlags.deactivated) {
return getPeerId(chat.migrated_to as InputChannel.inputChannel);
}
return false;
}
public getOutputPeer(peerId: PeerId): Peer {
if(peerId.isUser()) {
return {_: 'peerUser', user_id: peerId.toUserId()};
}
const chatId = peerId.toChatId();
if(this.appChatsManager.isChannel(chatId)) {
return {_: 'peerChannel', channel_id: chatId};
}
return {_: 'peerChat', chat_id: chatId};
}
public getPeerString(peerId: PeerId) {
if(peerId.isUser()) {
return this.appUsersManager.getUserString(peerId.toUserId());
}
return this.appChatsManager.getChatString(peerId.toChatId());
}
public getPeerUsername(peerId: PeerId): string {
return this.getPeer(peerId).username || '';
}
public getPeer(peerId: PeerId) {
return peerId.isUser() ?
this.appUsersManager.getUser(peerId.toUserId()) :
this.appChatsManager.getChat(peerId.toChatId());
}
public getPeerId(peerId: Parameters<typeof getPeerId>[0]) {
return getPeerId(peerId) || (isObject<InputPeer>(peerId) && peerId._ === 'inputPeerSelf' && this.peerId) || NULL_PEER_ID;
}
public getDialogPeer(peerId: PeerId): DialogPeer {
return {
_: 'dialogPeer',
peer: this.getOutputPeer(peerId)
};
}
public isChannel(peerId: PeerId): boolean {
return !peerId.isUser() && this.appChatsManager.isChannel(peerId.toChatId());
}
public isMegagroup(peerId: PeerId) {
return !peerId.isUser() && this.appChatsManager.isMegagroup(peerId.toChatId());
}
public isAnyGroup(peerId: PeerId): boolean {
return !peerId.isUser() && !this.appChatsManager.isBroadcast(peerId.toChatId());
}
public isBroadcast(peerId: PeerId): boolean {
return this.isChannel(peerId) && !this.isMegagroup(peerId);
}
public isBot(peerId: PeerId): boolean {
return peerId.isUser() && this.appUsersManager.isBot(peerId.toUserId());
}
public isContact(peerId: PeerId): boolean {
return peerId.isUser() && this.appUsersManager.isContact(peerId.toUserId());
}
public isUser(peerId: PeerId)/* : peerId is UserId */ {
return isUser(peerId);
}
public isAnyChat(peerId: PeerId) {
return isAnyChat(peerId);
}
public isRestricted(peerId: PeerId) {
return peerId.isUser() ? this.appUsersManager.isRestricted(peerId.toUserId()) : this.appChatsManager.isRestricted(peerId.toChatId());
}
public getRestrictionReasonText(peerId: PeerId) {
const peer: Chat.channel | User.user = this.getPeer(peerId);
const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;
if(reason) {
return reason.text;
} else {
return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';
}
}
/* 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 getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude<InputNotifyPeer, InputNotifyPeer.inputNotifyPeer>;
public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;
public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {
if(ignorePeerId) {
if(peerId.isUser()) {
return {_: 'inputNotifyUsers'};
} else {
if(this.isBroadcast(peerId)) {
return {_: 'inputNotifyBroadcasts'};
} else {
return {_: 'inputNotifyChats'};
}
}
} else {
return {
_: 'inputNotifyPeer',
peer: this.getInputPeerById(peerId)
};
}
}
public getInputPeerById(peerId: PeerId): InputPeer {
if(!peerId) {
return {_: 'inputPeerEmpty'};
}
if(!peerId.isUser()) {
const chatId = peerId.toChatId();
return this.appChatsManager.getInputPeer(chatId);
}
const userId = peerId.toUserId();
return this.appUsersManager.getUserInputPeer(userId);
}
/**
* ! use it only in safe places like requests
*/
public getInputPeerSelf(): InputPeer.inputPeerSelf {
return {_: 'inputPeerSelf'};
}
public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {
return {
_: 'inputDialogPeer',
peer: isObject<InputPeer>(peerId) ? peerId : this.getInputPeerById(peerId)
};
}
public getPeerSearchText(peerId: PeerId) {
let text: string;
if(this.isUser(peerId)) {
text = '%pu ' + this.appUsersManager.getUserSearchText(peerId.toUserId());
} else {
const chat = this.appChatsManager.getChat(peerId.toChatId());
text = '%pg ' + (chat.title || '');
}
return text;
}
public getDialogType(peerId: PeerId): PeerType {
if(this.isMegagroup(peerId)) {
return 'megagroup';
} else if(this.isChannel(peerId)) {
return 'channel';
} else if(!this.isUser(peerId)) {
return 'group';
} else {
return peerId === this.peerId ? 'saved' : 'chat';
}
}
public getDeleteButtonText(peerId: PeerId): Extract<LangPackKey, 'ChannelDelete' | 'ChatList.Context.LeaveChannel' | 'DeleteMega' | 'ChatList.Context.LeaveGroup' | 'ChatList.Context.DeleteChat'> {
switch(this.getDialogType(peerId)) {
case 'channel':
return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';
case 'megagroup':
case 'group':
return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';
default:
return 'ChatList.Context.DeleteChat';
}
}
public noForwards(peerId: PeerId) {
if(peerId.isUser()) return false;
else {
const chat = this.appChatsManager.getChatTyped(peerId.toChatId());
return !!(chat as Chat.chat).pFlags?.noforwards;
}
}
}
export type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';