Browse Source
Connect to different DC's on sign in Media viewer fixes Auto focus field on sign pages Reference expired fix for streammaster
morethanwords
4 years ago
66 changed files with 1359 additions and 1194 deletions
@ -0,0 +1,243 @@
@@ -0,0 +1,243 @@
|
||||
import appChatsManager from "../lib/appManagers/appChatsManager"; |
||||
import appDialogsManager from "../lib/appManagers/appDialogsManager"; |
||||
import appImManager from "../lib/appManagers/appImManager"; |
||||
import appMessagesManager from "../lib/appManagers/appMessagesManager"; |
||||
import appPeersManager from "../lib/appManagers/appPeersManager"; |
||||
import $rootScope from "../lib/rootScope"; |
||||
import { findUpTag } from "../lib/utils"; |
||||
import { parseMenuButtonsTo, positionMenu, openBtnMenu } from "./misc"; |
||||
import { PopupButton, PopupPeer } from "./popup"; |
||||
|
||||
export default class DialogsContextMenu { |
||||
private element = document.getElementById('dialogs-contextmenu') as HTMLDivElement; |
||||
private buttons: { |
||||
archive: HTMLButtonElement, |
||||
pin: HTMLButtonElement, |
||||
mute: HTMLButtonElement, |
||||
unread: HTMLButtonElement, |
||||
delete: HTMLButtonElement, |
||||
//clear: HTMLButtonElement,
|
||||
} = {} as any; |
||||
private selectedID: number; |
||||
private peerType: 'channel' | 'chat' | 'megagroup' | 'group' | 'saved'; |
||||
private filterID: number; |
||||
|
||||
constructor() { |
||||
parseMenuButtonsTo(this.buttons, this.element.children); |
||||
|
||||
this.buttons.archive.addEventListener('click', () => { |
||||
let dialog = appMessagesManager.getDialogByPeerID(this.selectedID)[0]; |
||||
if(dialog) { |
||||
appMessagesManager.editPeerFolders([dialog.peerID], +!dialog.folder_id); |
||||
} |
||||
}); |
||||
|
||||
this.buttons.pin.addEventListener('click', () => { |
||||
appMessagesManager.toggleDialogPin(this.selectedID, this.filterID); |
||||
}); |
||||
|
||||
this.buttons.mute.addEventListener('click', () => { |
||||
appImManager.mutePeer(this.selectedID); |
||||
}); |
||||
|
||||
this.buttons.unread.addEventListener('click', () => { |
||||
const dialog = appMessagesManager.getDialogByPeerID(this.selectedID)[0]; |
||||
if(!dialog) return; |
||||
|
||||
if(dialog.unread_count) { |
||||
appMessagesManager.readHistory(this.selectedID, dialog.top_message); |
||||
appMessagesManager.markDialogUnread(this.selectedID, true); |
||||
} else { |
||||
appMessagesManager.markDialogUnread(this.selectedID); |
||||
} |
||||
}); |
||||
|
||||
this.buttons.delete.addEventListener('click', () => { |
||||
let firstName = appPeersManager.getPeerTitle(this.selectedID, false, true); |
||||
|
||||
let callbackFlush = (justClear: boolean) => { |
||||
appMessagesManager.flushHistory(this.selectedID, justClear); |
||||
}; |
||||
|
||||
let callbackLeave = () => { |
||||
appChatsManager.leaveChannel(-this.selectedID); |
||||
}; |
||||
|
||||
let title: string, description: string, buttons: PopupButton[]; |
||||
switch(this.peerType) { |
||||
case 'channel': { |
||||
title = 'Leave Channel?'; |
||||
description = `Are you sure you want to leave this channel?`; |
||||
buttons = [{ |
||||
text: 'LEAVE ' + firstName, |
||||
isDanger: true, |
||||
callback: callbackLeave |
||||
}]; |
||||
|
||||
break; |
||||
} |
||||
|
||||
case 'megagroup': { |
||||
title = 'Leave Group?'; |
||||
description = `Are you sure you want to leave this group?`; |
||||
buttons = [{ |
||||
text: 'LEAVE ' + firstName, |
||||
isDanger: true, |
||||
callback: callbackLeave |
||||
}]; |
||||
|
||||
break; |
||||
} |
||||
|
||||
case 'chat': { |
||||
title = 'Delete Chat?'; |
||||
description = `Are you sure you want to delete chat with <b>${firstName}</b>?`; |
||||
buttons = [{ |
||||
text: 'DELETE FOR ME AND ' + firstName, |
||||
isDanger: true, |
||||
callback: () => callbackFlush(false) |
||||
}, { |
||||
text: 'DELETE JUST FOR ME', |
||||
isDanger: true, |
||||
callback: () => callbackFlush(true) |
||||
}]; |
||||
|
||||
break; |
||||
} |
||||
|
||||
case 'saved': { |
||||
title = 'Delete Saved Messages?'; |
||||
description = `Are you sure you want to delete all your saved messages?`; |
||||
buttons = [{ |
||||
text: 'DELETE SAVED MESSAGES', |
||||
isDanger: true, |
||||
callback: () => callbackFlush(false) |
||||
}]; |
||||
|
||||
break; |
||||
} |
||||
|
||||
case 'group': { |
||||
title = 'Delete and leave Group?'; |
||||
description = `Are you sure you want to delete all message history and leave <b>${firstName}</b>?`; |
||||
buttons = [{ |
||||
text: 'DELETE AND LEAVE ' + firstName, |
||||
isDanger: true, |
||||
callback: () => callbackFlush(true) |
||||
}]; |
||||
|
||||
break; |
||||
} |
||||
} |
||||
|
||||
buttons.push({ |
||||
text: 'CANCEL', |
||||
isCancel: true |
||||
}); |
||||
|
||||
let popup = new PopupPeer('popup-delete-chat', { |
||||
peerID: this.selectedID, |
||||
title: title, |
||||
description: description, |
||||
buttons: buttons |
||||
}); |
||||
|
||||
popup.show(); |
||||
}); |
||||
} |
||||
|
||||
onContextMenu = (e: MouseEvent | Touch) => { |
||||
let li: HTMLElement = null; |
||||
|
||||
try { |
||||
li = findUpTag(e.target, 'LI'); |
||||
} catch(e) {} |
||||
|
||||
if(!li) return; |
||||
|
||||
if(e instanceof MouseEvent) e.preventDefault(); |
||||
if(this.element.classList.contains('active')) { |
||||
return false; |
||||
} |
||||
if(e instanceof MouseEvent) e.cancelBubble = true; |
||||
|
||||
this.filterID = appDialogsManager.filterID; |
||||
|
||||
this.selectedID = +li.getAttribute('data-peerID'); |
||||
const dialog = appMessagesManager.getDialogByPeerID(this.selectedID)[0]; |
||||
const notOurDialog = dialog.peerID != $rootScope.myID; |
||||
|
||||
// archive button
|
||||
if(notOurDialog) { |
||||
const button = this.buttons.archive; |
||||
const condition = dialog.folder_id == 1; |
||||
button.classList.toggle('flip-icon', condition); |
||||
(button.firstElementChild as HTMLElement).innerText = condition ? 'Unarchive' : 'Archive'; |
||||
this.buttons.archive.style.display = ''; |
||||
} else { |
||||
this.buttons.archive.style.display = 'none'; |
||||
} |
||||
|
||||
// pin button
|
||||
{ |
||||
const button = this.buttons.pin; |
||||
//const condition = !!dialog.pFlags?.pinned;
|
||||
const condition = this.filterID > 1 ? appMessagesManager.filtersStorage.filters[this.filterID].pinned_peers.includes(dialog.peerID) : !!dialog.pFlags?.pinned; |
||||
button.classList.toggle('flip-icon', condition); |
||||
(button.firstElementChild as HTMLElement).innerText = condition ? 'Unpin' : 'Pin'; |
||||
} |
||||
|
||||
// mute button
|
||||
if(notOurDialog) { |
||||
const button = this.buttons.mute; |
||||
const condition = dialog.notify_settings && dialog.notify_settings.mute_until > (Date.now() / 1000 | 0); |
||||
button.classList.toggle('flip-icon', condition); |
||||
(button.firstElementChild as HTMLElement).innerText = condition ? 'Unmute' : 'Mute'; |
||||
this.buttons.mute.style.display = ''; |
||||
} else { |
||||
this.buttons.mute.style.display = 'none'; |
||||
} |
||||
|
||||
// unread button
|
||||
{ |
||||
const button = this.buttons.unread; |
||||
const condition = !!(dialog.pFlags?.unread_mark || dialog.unread_count); |
||||
button.classList.toggle('flip-icon', condition); |
||||
(button.firstElementChild as HTMLElement).innerText = condition ? 'Mark as Read' : 'Mark as Unread'; |
||||
} |
||||
|
||||
/* // clear history button |
||||
if(appPeersManager.isChannel(this.selectedID)) { |
||||
this.buttons.clear.style.display = 'none'; |
||||
} else { |
||||
this.buttons.clear.style.display = ''; |
||||
} */ |
||||
|
||||
// delete button
|
||||
let deleteButtonText = ''; |
||||
if(appPeersManager.isMegagroup(this.selectedID)) { |
||||
deleteButtonText = 'Leave'; |
||||
//deleteButtonText = 'Leave group';
|
||||
this.peerType = 'megagroup'; |
||||
} else if(appPeersManager.isChannel(this.selectedID)) { |
||||
deleteButtonText = 'Leave'; |
||||
//deleteButtonText = 'Leave channel';
|
||||
this.peerType = 'channel'; |
||||
} else if(this.selectedID < 0) { |
||||
deleteButtonText = 'Delete'; |
||||
//deleteButtonText = 'Delete and leave';
|
||||
this.peerType = 'group'; |
||||
} else { |
||||
deleteButtonText = 'Delete'; |
||||
//deleteButtonText = 'Delete chat';
|
||||
this.peerType = this.selectedID == $rootScope.myID ? 'saved' : 'chat'; |
||||
} |
||||
(this.buttons.delete.firstElementChild as HTMLElement).innerText = deleteButtonText; |
||||
|
||||
li.classList.add('menu-open'); |
||||
positionMenu(e, this.element); |
||||
openBtnMenu(this.element, () => { |
||||
li.classList.remove('menu-open'); |
||||
}); |
||||
}; |
||||
} |
@ -1,8 +1,8 @@
@@ -1,8 +1,8 @@
|
||||
import { SliderTab } from "../slider"; |
||||
import { AppSelectPeers } from "../appSelectPeers"; |
||||
import { putPreloader } from "../misc"; |
||||
import appChatsManager from "../../lib/appManagers/appChatsManager"; |
||||
import appSidebarLeft, { AppSidebarLeft } from "../../lib/appManagers/appSidebarLeft"; |
||||
import { SliderTab } from "../../slider"; |
||||
import { AppSelectPeers } from "../../appSelectPeers"; |
||||
import { putPreloader } from "../../misc"; |
||||
import appChatsManager from "../../../lib/appManagers/appChatsManager"; |
||||
import appSidebarLeft, { AppSidebarLeft } from ".."; |
||||
|
||||
export default class AppAddMembersTab implements SliderTab { |
||||
private container = document.querySelector('.addmembers-container') as HTMLDivElement; |
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
import appDialogsManager from "../../../lib/appManagers/appDialogsManager"; |
||||
import Scrollable from "../../scrollable"; |
||||
import { SliderTab } from "../../slider"; |
||||
|
||||
export default class AppArchivedTab implements SliderTab { |
||||
public container = document.getElementById('chats-archived-container') as HTMLDivElement; |
||||
public chatList = document.getElementById('dialogs-archived') as HTMLUListElement; |
||||
public scroll: Scrollable = null; |
||||
public loadedAll: boolean; |
||||
public loadDialogsPromise: Promise<any>; |
||||
public wasFilterID: number; |
||||
|
||||
init() { |
||||
this.scroll = new Scrollable(this.container, 'CLA', this.chatList, 500); |
||||
this.scroll.setVirtualContainer(this.chatList); |
||||
this.scroll.onScrolledBottom = appDialogsManager.onChatsScroll; |
||||
///this.scroll.attachSentinels();
|
||||
|
||||
appDialogsManager.setListClickListener(this.chatList, null, true); |
||||
|
||||
window.addEventListener('resize', () => { |
||||
setTimeout(appDialogsManager.onChatsScroll, 0); |
||||
}); |
||||
} |
||||
|
||||
onOpen() { |
||||
if(this.init) { |
||||
this.init(); |
||||
this.init = null; |
||||
} |
||||
|
||||
this.wasFilterID = appDialogsManager.filterID; |
||||
appDialogsManager.scroll = this.scroll; |
||||
appDialogsManager.filterID = 1; |
||||
appDialogsManager.onTabChange(); |
||||
} |
||||
|
||||
// вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...
|
||||
onOpenAfterTimeout() { |
||||
appDialogsManager.chatLists[this.wasFilterID].innerHTML = ''; |
||||
} |
||||
|
||||
onClose() { |
||||
appDialogsManager.scroll = appDialogsManager._scroll; |
||||
appDialogsManager.filterID = this.wasFilterID; |
||||
appDialogsManager.onTabChange(); |
||||
} |
||||
|
||||
onCloseAfterTimeout() { |
||||
this.chatList.innerHTML = ''; |
||||
} |
||||
} |
@ -1,15 +1,15 @@
@@ -1,15 +1,15 @@
|
||||
import { SliderTab } from "../slider"; |
||||
import lottieLoader, { RLottiePlayer } from "../../lib/lottieLoader"; |
||||
import apiManager from "../../lib/mtproto/mtprotoworker"; |
||||
import appMessagesManager, { MyDialogFilter } from "../../lib/appManagers/appMessagesManager"; |
||||
import { RichTextProcessor } from "../../lib/richtextprocessor"; |
||||
import appPeersManager from "../../lib/appManagers/appPeersManager"; |
||||
import { cancelEvent } from "../../lib/utils"; |
||||
import appSidebarLeft from "../../lib/appManagers/appSidebarLeft"; |
||||
import { ripple } from "../ripple"; |
||||
import { toast } from "../toast"; |
||||
import { DialogFilterSuggested, DialogFilter } from "../../layer"; |
||||
import $rootScope from "../../lib/rootScope"; |
||||
import { SliderTab } from "../../slider"; |
||||
import lottieLoader, { RLottiePlayer } from "../../../lib/lottieLoader"; |
||||
import apiManager from "../../../lib/mtproto/mtprotoworker"; |
||||
import appMessagesManager, { MyDialogFilter } from "../../../lib/appManagers/appMessagesManager"; |
||||
import { RichTextProcessor } from "../../../lib/richtextprocessor"; |
||||
import appPeersManager from "../../../lib/appManagers/appPeersManager"; |
||||
import { cancelEvent } from "../../../lib/utils"; |
||||
import appSidebarLeft from ".."; |
||||
import { ripple } from "../../ripple"; |
||||
import { toast } from "../../toast"; |
||||
import { DialogFilterSuggested, DialogFilter } from "../../../layer"; |
||||
import $rootScope from "../../../lib/rootScope"; |
||||
|
||||
export default class AppChatFoldersTab implements SliderTab { |
||||
public container: HTMLElement; |
@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
|
||||
import { SliderTab } from "../slider"; |
||||
import appSidebarLeft, { AppSidebarLeft } from "../../lib/appManagers/appSidebarLeft"; |
||||
import lottieLoader, { RLottiePlayer } from "../../lib/lottieLoader"; |
||||
import appMessagesManager, { MyDialogFilter as DialogFilter } from "../../lib/appManagers/appMessagesManager"; |
||||
import { parseMenuButtonsTo } from "../misc"; |
||||
import appDialogsManager from "../../lib/appManagers/appDialogsManager"; |
||||
import { copy, deepEqual } from "../../lib/utils"; |
||||
import { toast } from "../toast"; |
||||
import { ripple } from "../ripple"; |
||||
import { SliderTab } from "../../slider"; |
||||
import appSidebarLeft, { AppSidebarLeft } from ".."; |
||||
import lottieLoader, { RLottiePlayer } from "../../../lib/lottieLoader"; |
||||
import appMessagesManager, { MyDialogFilter as DialogFilter } from "../../../lib/appManagers/appMessagesManager"; |
||||
import { parseMenuButtonsTo } from "../../misc"; |
||||
import appDialogsManager from "../../../lib/appManagers/appDialogsManager"; |
||||
import { copy, deepEqual } from "../../../lib/utils"; |
||||
import { toast } from "../../toast"; |
||||
import { ripple } from "../../ripple"; |
||||
|
||||
const MAX_FOLDER_NAME_LENGTH = 12; |
||||
|
@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
|
||||
import { SliderTab } from "../slider"; |
||||
import popupAvatar from "../popupAvatar"; |
||||
import apiManager from "../../lib/mtproto/mtprotoworker"; |
||||
import appProfileManager from "../../lib/appManagers/appProfileManager"; |
||||
import appSidebarLeft from "../../lib/appManagers/appSidebarLeft"; |
||||
import Scrollable from "../scrollable_new"; |
||||
import appUsersManager from "../../lib/appManagers/appUsersManager"; |
||||
import $rootScope from "../../lib/rootScope"; |
||||
import { InputFile } from "../../layer"; |
||||
import { SliderTab } from "../../slider"; |
||||
import popupAvatar from "../../popupAvatar"; |
||||
import apiManager from "../../../lib/mtproto/mtprotoworker"; |
||||
import appProfileManager from "../../../lib/appManagers/appProfileManager"; |
||||
import appSidebarLeft from ".."; |
||||
import Scrollable from "../../scrollable"; |
||||
import appUsersManager from "../../../lib/appManagers/appUsersManager"; |
||||
import $rootScope from "../../../lib/rootScope"; |
||||
import { InputFile } from "../../../layer"; |
||||
|
||||
// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)
|
||||
|
@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
|
||||
import { SliderTab } from "../slider"; |
||||
import { AppSelectPeers } from "../appSelectPeers"; |
||||
import appSidebarLeft, { AppSidebarLeft } from "../../lib/appManagers/appSidebarLeft"; |
||||
import appDialogsManager from "../../lib/appManagers/appDialogsManager"; |
||||
import appPeersManager from "../../lib/appManagers/appPeersManager"; |
||||
import appUsersManager from "../../lib/appManagers/appUsersManager"; |
||||
import { copy } from "../../lib/utils"; |
||||
import { MyDialogFilter as DialogFilter } from "../../lib/appManagers/appMessagesManager"; |
||||
import $rootScope from "../../lib/rootScope"; |
||||
import { SliderTab } from "../../slider"; |
||||
import { AppSelectPeers } from "../../appSelectPeers"; |
||||
import appSidebarLeft, { AppSidebarLeft } from ".."; |
||||
import appDialogsManager from "../../../lib/appManagers/appDialogsManager"; |
||||
import appPeersManager from "../../../lib/appManagers/appPeersManager"; |
||||
import appUsersManager from "../../../lib/appManagers/appUsersManager"; |
||||
import { copy } from "../../../lib/utils"; |
||||
import { MyDialogFilter as DialogFilter } from "../../../lib/appManagers/appMessagesManager"; |
||||
import $rootScope from "../../../lib/rootScope"; |
||||
|
||||
export default class AppIncludedChatsTab implements SliderTab { |
||||
public container: HTMLElement; |
@ -1,7 +1,7 @@
@@ -1,7 +1,7 @@
|
||||
import { SliderTab } from "../slider"; |
||||
import popupAvatar from "../popupAvatar"; |
||||
import appChatsManager from "../../lib/appManagers/appChatsManager"; |
||||
import appSidebarLeft, { AppSidebarLeft } from "../../lib/appManagers/appSidebarLeft"; |
||||
import { SliderTab } from "../../slider"; |
||||
import popupAvatar from "../../popupAvatar"; |
||||
import appChatsManager from "../../../lib/appManagers/appChatsManager"; |
||||
import appSidebarLeft, { AppSidebarLeft } from ".."; |
||||
|
||||
export default class AppNewChannelTab implements SliderTab { |
||||
private container = document.querySelector('.new-channel-container') as HTMLDivElement; |
@ -1,11 +1,11 @@
@@ -1,11 +1,11 @@
|
||||
import { SliderTab } from "../slider"; |
||||
import { SearchGroup } from "../appSearch"; |
||||
import popupAvatar from "../popupAvatar"; |
||||
import appChatsManager from "../../lib/appManagers/appChatsManager"; |
||||
import appSidebarLeft, { AppSidebarLeft } from "../../lib/appManagers/appSidebarLeft"; |
||||
import Scrollable from "../scrollable_new"; |
||||
import appDialogsManager from "../../lib/appManagers/appDialogsManager"; |
||||
import appUsersManager from "../../lib/appManagers/appUsersManager"; |
||||
import { SliderTab } from "../../slider"; |
||||
import { SearchGroup } from "../../appSearch"; |
||||
import popupAvatar from "../../popupAvatar"; |
||||
import appChatsManager from "../../../lib/appManagers/appChatsManager"; |
||||
import appSidebarLeft, { AppSidebarLeft } from ".."; |
||||
import Scrollable from "../../scrollable"; |
||||
import appDialogsManager from "../../../lib/appManagers/appDialogsManager"; |
||||
import appUsersManager from "../../../lib/appManagers/appUsersManager"; |
||||
|
||||
export default class AppNewGroupTab implements SliderTab { |
||||
private container = document.querySelector('.new-group-container') as HTMLDivElement; |
@ -1,10 +1,10 @@
@@ -1,10 +1,10 @@
|
||||
import { SliderTab } from "../slider"; |
||||
import AvatarElement from "../avatar"; |
||||
import { parseMenuButtonsTo } from "../misc"; |
||||
import { SliderTab } from "../../slider"; |
||||
import AvatarElement from "../../avatar"; |
||||
import { parseMenuButtonsTo } from "../../misc"; |
||||
//import $rootScope from "../../lib/rootScope";
|
||||
import apiManager from "../../lib/mtproto/mtprotoworker"; |
||||
import appSidebarLeft, { AppSidebarLeft } from "../../lib/appManagers/appSidebarLeft"; |
||||
import appUsersManager from "../../lib/appManagers/appUsersManager"; |
||||
import apiManager from "../../../lib/mtproto/mtprotoworker"; |
||||
import appSidebarLeft, { AppSidebarLeft } from ".."; |
||||
import appUsersManager from "../../../lib/appManagers/appUsersManager"; |
||||
|
||||
export default class AppSettingsTab implements SliderTab { |
||||
private container = document.querySelector('.settings-container') as HTMLDivElement; |
@ -1,13 +1,13 @@
@@ -1,13 +1,13 @@
|
||||
import appImManager from "./appImManager"; |
||||
import SidebarSlider from "../../components/slider"; |
||||
import AppStickersTab from "../../components/sidebarRight/stickers"; |
||||
import AppPollResultsTab from "../../components/sidebarRight/pollResults"; |
||||
import AppGifsTab from "../../components/sidebarRight/gifs"; |
||||
import appImManager from "../../lib/appManagers/appImManager"; |
||||
import SidebarSlider from "../slider"; |
||||
import AppStickersTab from "./tabs/stickers"; |
||||
import AppPollResultsTab from "./tabs/pollResults"; |
||||
import AppGifsTab from "./tabs/gifs"; |
||||
import mediaSizes, { ScreenSize } from "../../helpers/mediaSizes"; |
||||
import AppPrivateSearchTab from "../../components/sidebarRight/search"; |
||||
import AppSharedMediaTab from "../../components/sidebarRight/sharedMedia"; |
||||
import AppForwardTab from "../../components/sidebarRight/forward"; |
||||
import { MOUNT_CLASS_TO } from "../mtproto/mtproto_config"; |
||||
import AppPrivateSearchTab from "./tabs/search"; |
||||
import AppSharedMediaTab from "./tabs/sharedMedia"; |
||||
import AppForwardTab from "./tabs/forward"; |
||||
import { MOUNT_CLASS_TO } from "../../lib/mtproto/mtproto_config"; |
||||
|
||||
export const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown'; |
||||
|
@ -1,8 +1,8 @@
@@ -1,8 +1,8 @@
|
||||
import appSidebarRight, { AppSidebarRight } from "../../lib/appManagers/appSidebarRight"; |
||||
import appMessagesManager from "../../lib/appManagers/appMessagesManager"; |
||||
import { putPreloader } from "../misc"; |
||||
import { AppSelectPeers } from "../appSelectPeers"; |
||||
import { SliderTab } from "../slider"; |
||||
import appSidebarRight, { AppSidebarRight } from ".."; |
||||
import appMessagesManager from "../../../lib/appManagers/appMessagesManager"; |
||||
import { putPreloader } from "../../misc"; |
||||
import { AppSelectPeers } from "../../appSelectPeers"; |
||||
import { SliderTab } from "../../slider"; |
||||
|
||||
export default class AppForwardTab implements SliderTab { |
||||
public container: HTMLElement; |
@ -1,11 +1,11 @@
@@ -1,11 +1,11 @@
|
||||
import { SliderTab } from "../slider"; |
||||
import Scrollable from "../scrollable_new"; |
||||
import appSidebarRight, { AppSidebarRight } from "../../lib/appManagers/appSidebarRight"; |
||||
import appPollsManager from "../../lib/appManagers/appPollsManager"; |
||||
import { roundPercents } from "../poll"; |
||||
import { RichTextProcessor } from "../../lib/richtextprocessor"; |
||||
import appDialogsManager from "../../lib/appManagers/appDialogsManager"; |
||||
import { ripple } from "../ripple"; |
||||
import { SliderTab } from "../../slider"; |
||||
import Scrollable from "../../scrollable"; |
||||
import appSidebarRight, { AppSidebarRight } from ".."; |
||||
import appPollsManager from "../../../lib/appManagers/appPollsManager"; |
||||
import { roundPercents } from "../../poll"; |
||||
import { RichTextProcessor } from "../../../lib/richtextprocessor"; |
||||
import appDialogsManager from "../../../lib/appManagers/appDialogsManager"; |
||||
import { ripple } from "../../ripple"; |
||||
|
||||
export default class AppPollResultsTab implements SliderTab { |
||||
private container = document.getElementById('poll-results-container') as HTMLDivElement; |
@ -1,7 +1,7 @@
@@ -1,7 +1,7 @@
|
||||
import appSidebarRight, { AppSidebarRight } from "../../lib/appManagers/appSidebarRight"; |
||||
import AppSearch, { SearchGroup } from "../appSearch"; |
||||
import SearchInput from "../searchInput"; |
||||
import { SliderTab } from "../slider"; |
||||
import appSidebarRight, { AppSidebarRight } from ".."; |
||||
import AppSearch, { SearchGroup } from "../../appSearch"; |
||||
import SearchInput from "../../searchInput"; |
||||
import { SliderTab } from "../../slider"; |
||||
|
||||
export default class AppPrivateSearchTab implements SliderTab { |
||||
public container: HTMLElement; |
@ -1,21 +1,21 @@
@@ -1,21 +1,21 @@
|
||||
import appImManager from "../../lib/appManagers/appImManager"; |
||||
import appMediaViewer from "../../lib/appManagers/appMediaViewer"; |
||||
import appMessagesManager from "../../lib/appManagers/appMessagesManager"; |
||||
import appPeersManager from "../../lib/appManagers/appPeersManager"; |
||||
import appPhotosManager from "../../lib/appManagers/appPhotosManager"; |
||||
import appProfileManager from "../../lib/appManagers/appProfileManager"; |
||||
import appUsersManager from "../../lib/appManagers/appUsersManager"; |
||||
import { logger, LogLevels } from "../../lib/logger"; |
||||
import { RichTextProcessor } from "../../lib/richtextprocessor"; |
||||
import $rootScope from "../../lib/rootScope"; |
||||
import { getAbbreviation, limitSymbols } from "../../lib/utils"; |
||||
import AvatarElement from "../avatar"; |
||||
import { horizontalMenu } from "../horizontalMenu"; |
||||
import LazyLoadQueue from "../lazyLoadQueue"; |
||||
import { renderImageFromUrl, putPreloader } from "../misc"; |
||||
import Scrollable from "../scrollable_new"; |
||||
import { SliderTab } from "../slider"; |
||||
import { wrapDocument, wrapAudio } from "../wrappers"; |
||||
import appImManager from "../../../lib/appManagers/appImManager"; |
||||
import appMediaViewer from "../../../lib/appManagers/appMediaViewer"; |
||||
import appMessagesManager from "../../../lib/appManagers/appMessagesManager"; |
||||
import appPeersManager from "../../../lib/appManagers/appPeersManager"; |
||||
import appPhotosManager from "../../../lib/appManagers/appPhotosManager"; |
||||
import appProfileManager from "../../../lib/appManagers/appProfileManager"; |
||||
import appUsersManager from "../../../lib/appManagers/appUsersManager"; |
||||
import { logger, LogLevels } from "../../../lib/logger"; |
||||
import { RichTextProcessor } from "../../../lib/richtextprocessor"; |
||||
import $rootScope from "../../../lib/rootScope"; |
||||
import { getAbbreviation, limitSymbols } from "../../../lib/utils"; |
||||
import AvatarElement from "../../avatar"; |
||||
import { horizontalMenu } from "../../horizontalMenu"; |
||||
import LazyLoadQueue from "../../lazyLoadQueue"; |
||||
import { renderImageFromUrl, putPreloader } from "../../misc"; |
||||
import Scrollable from "../../scrollable"; |
||||
import { SliderTab } from "../../slider"; |
||||
import { wrapDocument, wrapAudio } from "../../wrappers"; |
||||
|
||||
const testScroll = false; |
||||
|
@ -1,16 +1,16 @@
@@ -1,16 +1,16 @@
|
||||
import { SliderTab } from "../slider"; |
||||
import SearchInput from "../searchInput"; |
||||
import Scrollable from "../scrollable_new"; |
||||
import LazyLoadQueue from "../lazyLoadQueue"; |
||||
import { findUpClassName } from "../../lib/utils"; |
||||
import appImManager from "../../lib/appManagers/appImManager"; |
||||
import appStickersManager from "../../lib/appManagers/appStickersManager"; |
||||
import PopupStickers from "../popupStickers"; |
||||
import animationIntersector from "../animationIntersector"; |
||||
import { RichTextProcessor } from "../../lib/richtextprocessor"; |
||||
import { wrapSticker } from "../wrappers"; |
||||
import appSidebarRight, { AppSidebarRight } from "../../lib/appManagers/appSidebarRight"; |
||||
import { StickerSet, StickerSetCovered } from "../../layer"; |
||||
import { SliderTab } from "../../slider"; |
||||
import SearchInput from "../../searchInput"; |
||||
import Scrollable from "../../scrollable"; |
||||
import LazyLoadQueue from "../../lazyLoadQueue"; |
||||
import { findUpClassName } from "../../../lib/utils"; |
||||
import appImManager from "../../../lib/appManagers/appImManager"; |
||||
import appStickersManager from "../../../lib/appManagers/appStickersManager"; |
||||
import PopupStickers from "../../popupStickers"; |
||||
import animationIntersector from "../../animationIntersector"; |
||||
import { RichTextProcessor } from "../../../lib/richtextprocessor"; |
||||
import { wrapSticker } from "../../wrappers"; |
||||
import appSidebarRight, { AppSidebarRight } from ".."; |
||||
import { StickerSet, StickerSetCovered } from "../../../layer"; |
||||
|
||||
export default class AppStickersTab implements SliderTab { |
||||
private container = document.getElementById('stickers-container') as HTMLDivElement; |
@ -0,0 +1,106 @@
@@ -0,0 +1,106 @@
|
||||
//import aesjs from 'aes-js';
|
||||
import { CTR } from "@cryptography/aes"; |
||||
import { bytesFromWordss } from "../../bin_utils"; |
||||
import { Codec } from "./codec"; |
||||
|
||||
/* |
||||
@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged |
||||
*/ |
||||
export default class Obfuscation { |
||||
/* public enc: aesjs.ModeOfOperation.ModeOfOperationCTR; |
||||
public dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */ |
||||
|
||||
public encNew: CTR; |
||||
public decNew: CTR; |
||||
|
||||
public init(codec: Codec) { |
||||
const initPayload = new Uint8Array(64); |
||||
initPayload.randomize(); |
||||
|
||||
while(true) { |
||||
let val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | (initPayload[0]); |
||||
let val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | (initPayload[4]); |
||||
if(initPayload[0] != 0xef && |
||||
val != 0x44414548 && |
||||
val != 0x54534f50 && |
||||
val != 0x20544547 && |
||||
val != 0x4954504f && |
||||
val != 0xeeeeeeee && |
||||
val != 0xdddddddd && |
||||
val2 != 0x00000000) { |
||||
//initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;
|
||||
break; |
||||
} |
||||
initPayload.randomize(); |
||||
} |
||||
|
||||
////////////////////////initPayload.subarray(60, 62).hex = dcID;
|
||||
|
||||
const reversedPayload = initPayload.slice().reverse(); |
||||
|
||||
let encKey = initPayload.slice(8, 40); |
||||
let encIv = initPayload.slice(40, 56); |
||||
let decKey = reversedPayload.slice(8, 40); |
||||
let decIv = reversedPayload.slice(40, 56); |
||||
|
||||
/* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any)); |
||||
this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */ |
||||
|
||||
this.encNew = new CTR(encKey, encIv); |
||||
this.decNew = new CTR(decKey, decIv); |
||||
|
||||
initPayload.set(codec.obfuscateTag, 56); |
||||
const encrypted = this.encode(initPayload); |
||||
|
||||
initPayload.set(encrypted.slice(56, 64), 56); |
||||
|
||||
return initPayload; |
||||
} |
||||
|
||||
/* public encode(payload: Uint8Array) { |
||||
let startTime = performance.now(); |
||||
let res = this.enc.encrypt(payload); |
||||
let time = performance.now() - startTime; |
||||
|
||||
try { |
||||
startTime = performance.now(); |
||||
let arr = this.encNew.encrypt(payload); |
||||
//let resNew = bytesFromWords({words: arr, sigBytes: arr.length});
|
||||
let resNew = new Uint8Array(bytesFromWordss(arr)); |
||||
let time2 = performance.now() - startTime; |
||||
console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex == resNew.hex, time2 < time); |
||||
} catch(err) { |
||||
console.error('Obfuscation: error:', err); |
||||
} |
||||
|
||||
return res; |
||||
} |
||||
|
||||
public decode(payload: Uint8Array) { |
||||
let res = this.dec.encrypt(payload); |
||||
|
||||
try { |
||||
let arr = this.decNew.decrypt(payload); |
||||
//let resNew = bytesFromWords({words: arr, sigBytes: arr.length});
|
||||
let resNew = new Uint8Array(bytesFromWordss(arr)); |
||||
console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex == resNew.hex); |
||||
} catch(err) { |
||||
console.error('Obfuscation: error:', err); |
||||
} |
||||
|
||||
return res; |
||||
} */ |
||||
public encode(payload: Uint8Array) { |
||||
let res = this.encNew.encrypt(payload); |
||||
let bytes = new Uint8Array(bytesFromWordss(res)); |
||||
|
||||
return bytes; |
||||
} |
||||
|
||||
public decode(payload: Uint8Array) { |
||||
let res = this.decNew.decrypt(payload); |
||||
let bytes = new Uint8Array(bytesFromWordss(res)); |
||||
|
||||
return bytes; |
||||
} |
||||
} |
@ -0,0 +1,29 @@
@@ -0,0 +1,29 @@
|
||||
import { nextRandomInt } from "../../bin_utils"; |
||||
import { IntermediatePacketCodec } from "./intermediate"; |
||||
/* Data packets are aligned to 4bytes. This codec adds random bytes of size |
||||
from 0 to 3 bytes, which are ignored by decoder. */ |
||||
class PaddedIntermediatePacketCodec extends IntermediatePacketCodec { |
||||
public tag = 0xdd; |
||||
public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]); |
||||
|
||||
public encodePacket(data: Uint8Array) { |
||||
let padding = new Uint8Array(nextRandomInt(3)).randomize(); |
||||
let len = data.byteLength + padding.byteLength; |
||||
|
||||
let header = new Uint8Array(new Uint32Array([len]).buffer); |
||||
console.log('encodePacket', padding, len, data, header); |
||||
|
||||
return header.concat(data, padding); |
||||
} |
||||
|
||||
public readPacket(data: Uint8Array) { |
||||
let padLength = data.byteLength % 4; |
||||
if(padLength > 0) { |
||||
return data.slice(4, -padLength); |
||||
} |
||||
|
||||
return data.slice(4); |
||||
} |
||||
} |
||||
|
||||
export default new PaddedIntermediatePacketCodec(); |
Loading…
Reference in new issue