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.
 
 
 
 
 

202 lines
7.3 KiB

/*
* https://github.com/morethanwords/tweb
* Copyright (C) 2019-2021 Eduard Kuzmenko
* https://github.com/morethanwords/tweb/blob/master/LICENSE
*/
import type { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall } from "../layer";
import type { AppMessagesManager, Dialog, MessagesStorageKey, MyMessage } from "./appManagers/appMessagesManager";
import type { MyDialogFilter } from "./storages/filters";
import type { Folder } from "./storages/dialogs";
import type { UserTyping } from "./appManagers/appProfileManager";
import type { MyDraftMessage } from "./appManagers/appDraftsManager";
import type { PushSubscriptionNotify } from "./mtproto/webPushApiManager";
import type { PushNotificationObject } from "./serviceWorker/push";
import type { ConnectionStatusChange } from "./mtproto/connectionStatus";
import type { GroupCallId } from "./appManagers/appGroupCallsManager";
import type { AppManagers } from "./appManagers/managers";
import type { State } from "../config/state";
import type { Progress } from "./appManagers/appDownloadManager";
import { NULL_PEER_ID, UserAuth } from "./mtproto/mtproto_config";
import EventListenerBase from "../helpers/eventListenerBase";
import { MOUNT_CLASS_TO } from "../config/debug";
import MTProtoMessagePort from "./mtproto/mtprotoMessagePort";
import { IS_WORKER } from "../helpers/context";
import { CallId } from "./appManagers/appCallsManager";
export type BroadcastEvents = {
'chat_full_update': ChatId,
'chat_update': ChatId,
'channel_update': ChatId,
'user_update': UserId,
'user_auth': UserAuth,
'user_full_update': UserId,
'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},
'peer_pinned_hidden': {peerId: PeerId, maxId: number},
'peer_typings': {peerId: PeerId, typings: UserTyping[]},
'peer_block': {peerId: PeerId, blocked: boolean},
'peer_title_edit': PeerId,
'peer_bio_edit': PeerId,
'peer_deleted': PeerId, // left chat, deleted user dialog, left channel
'peer_full_update': PeerId,
'filter_delete': MyDialogFilter,
'filter_update': MyDialogFilter,
'filter_new': MyDialogFilter,
'filter_order': number[],
'folder_unread': Omit<Folder, 'dialogs' | 'dispatchUnreadTimeout'>,
'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined},
'dialog_unread': {peerId: PeerId, dialog: Dialog},
'dialog_flush': {peerId: PeerId, dialog: Dialog},
'dialog_drop': {peerId: PeerId, dialog?: Dialog},
'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},
//'dialog_top': Dialog,
'dialog_notify_settings': Dialog,
// 'dialog_order': {dialog: Dialog, pos: number},
'dialogs_multiupdate': {[peerId: PeerId]: Dialog},
'history_append': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number},
'history_update': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage, sequential?: boolean},
'history_reply_markup': {peerId: PeerId},
'history_multiappend': AppMessagesManager['newMessagesToHandle'],
'history_delete': {peerId: PeerId, msgs: Set<number>},
'history_forbidden': PeerId,
'history_reload': PeerId,
'history_focus': {peerId: PeerId, threadId?: number, mid?: number, startParam?: string},
//'history_request': void,
'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},
'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},
'messages_views': {peerId: PeerId, mid: number, views: number}[],
'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],
'messages_pending': void,
'messages_read': void,
'messages_downloaded': {peerId: PeerId, mids: number[]},
'messages_media_read': {peerId: PeerId, mids: number[]},
'replies_updated': Message.message,
'scheduled_new': {peerId: PeerId, mid: number},
'scheduled_delete': {peerId: PeerId, mids: number[]},
'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},
'stickers_installed': StickerSet.stickerSet,
'stickers_deleted': StickerSet.stickerSet,
'state_cleared': void,
'state_synchronized': ChatId | void,
'state_synchronizing': ChatId | void,
'contacts_update': UserId,
'avatar_update': PeerId,
'poll_update': {poll: Poll, results: PollResults},
'invalidate_participants': ChatId,
//'channel_settings': {channelId: number},
'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},
'connection_status_change': ConnectionStatusChange,
'settings_updated': {key: string, value: any, settings: State['settings']},
'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},
'im_tab_change': number,
'background_change': void,
'privacy_update': Update.updatePrivacy,
'notify_settings': Update.updateNotifySettings,
'notify_peer_type_settings': {key: Exclude<NotifyPeer['_'], 'notifyPeer'>, settings: PeerNotifySettings},
'notification_reset': string,
'notification_cancel': string,
'notification_build': {
message: Message.message | Message.messageService,
fwdCount?: number,
peerReaction?: MessagePeerReaction,
peerTypeNotifySettings?: PeerNotifySettings
},
'language_change': string,
'theme_change': void,
'push_notification_click': PushNotificationObject,
'push_init': PushSubscriptionNotify,
'push_subscribe': PushSubscriptionNotify,
'push_unsubscribe': PushSubscriptionNotify,
'emoji_recent': string,
'download_progress': Progress,
'document_downloading': DocId,
'document_downloaded': DocId,
'choosing_sticker': boolean
'group_call_update': GroupCall,
'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},
// 'group_call_video_track_added': {instance: GroupCallInstance}
'call_update': PhoneCall,
'call_signaling': {callId: CallId, data: Uint8Array},
'quick_reaction': string,
'service_notification': Update.updateServiceNotification,
'logging_out': void
};
export class RootScope extends EventListenerBase<{
[name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void
}> {
public myId: PeerId = NULL_PEER_ID;
private connectionStatus: {[name: string]: ConnectionStatusChange} = {};
public settings: State['settings'];
public managers: AppManagers;
public premium: boolean;
constructor() {
super();
this.premium = false;
this.addEventListener('user_auth', ({id}) => {
this.myId = id.toPeerId();
});
this.addEventListener('connection_status_change', (status) => {
this.connectionStatus[status.name] = status;
});
this.dispatchEvent = (e, ...args) => {
super.dispatchEvent(e, ...args);
MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});
};
if(!IS_WORKER) {
this.addEventListener('settings_updated', ({settings}) => {
this.settings = settings;
});
}
}
public getConnectionStatus() {
return this.connectionStatus;
}
public dispatchEventSingle(...args: any[]) {
// @ts-ignore
super.dispatchEvent(...args);
}
}
const rootScope = new RootScope();
MOUNT_CLASS_TO.rootScope = rootScope;
export default rootScope;