tweb-i2p/src/lib/appManagers/appPrivacyManager.ts
2021-08-03 04:44:13 +03:00

128 lines
3.9 KiB
TypeScript

/*
* https://github.com/morethanwords/tweb
* Copyright (C) 2019-2021 Eduard Kuzmenko
* https://github.com/morethanwords/tweb/blob/master/LICENSE
*/
import { MOUNT_CLASS_TO } from "../../config/debug";
import { InputPrivacyKey, InputPrivacyRule, PrivacyRule, Update, PrivacyKey } from "../../layer";
import apiManager from "../mtproto/mtprotoworker";
import appChatsManager from "./appChatsManager";
import appUsersManager from "./appUsersManager";
import apiUpdatesManager from "./apiUpdatesManager";
import rootScope from "../rootScope";
import { convertInputKeyToKey } from "../../helpers/string";
export enum PrivacyType {
Everybody = 2,
Contacts = 1,
Nobody = 0
}
export class AppPrivacyManager {
private privacy: Partial<{
[key in PrivacyKey['_']]: PrivacyRule[] | Promise<PrivacyRule[]>
}> = {};
constructor() {
rootScope.addMultipleEventsListeners({
updatePrivacy: (update) => {
const key = update.key._;
this.privacy[key] = update.rules;
rootScope.dispatchEvent('privacy_update', update);
}
});
}
public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {
return apiManager.invokeApi('account.setPrivacy', {
key: {
_: inputKey
},
rules
}).then(privacyRules => {
appUsersManager.saveApiUsers(privacyRules.users);
appChatsManager.saveApiChats(privacyRules.chats);
apiUpdatesManager.processLocalUpdate({
_: 'updatePrivacy',
key: {
_: convertInputKeyToKey(inputKey)
},
rules: rules.map(inputRule => {
const rule: PrivacyRule = {} as any;
Object.assign(rule, inputRule);
rule._ = convertInputKeyToKey(rule._) as any;
return rule;
})
});
//console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);
return privacyRules.rules;
});
}
public getPrivacy(inputKey: InputPrivacyKey['_']) {
const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;
const rules = this.privacy[privacyKey];
if(rules) {
return Promise.resolve(rules);
}
return this.privacy[privacyKey] = apiManager.invokeApi('account.getPrivacy', {
key: {
_: inputKey
}
}).then(privacyRules => {
appUsersManager.saveApiUsers(privacyRules.users);
appChatsManager.saveApiChats(privacyRules.chats);
//console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);
return this.privacy[privacyKey] = privacyRules.rules;
});
}
public getPrivacyRulesDetails(rules: PrivacyRule[]) {
const types: PrivacyType[] = [];
type peers = {users: number[], chats: number[]};
let allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};
rules.forEach(rule => {
switch(rule._) {
case 'privacyValueAllowAll':
types.push(2);
break;
case 'privacyValueDisallowAll':
types.push(0);
break;
case 'privacyValueAllowContacts':
types.push(1);
break;
/* case 'privacyValueDisallowContacts':
types.push('Except My Contacts');
break; */
case 'privacyValueAllowChatParticipants':
allowPeers.chats.push(...rule.chats);
break;
case 'privacyValueAllowUsers':
allowPeers.users.push(...rule.users);
break;
case 'privacyValueDisallowChatParticipants':
disallowPeers.chats.push(...rule.chats);
break;
case 'privacyValueDisallowUsers':
disallowPeers.users.push(...rule.users);
break;
}
});
return {type: types[0], disallowPeers, allowPeers};
}
}
const appPrivacyManager = new AppPrivacyManager();
MOUNT_CLASS_TO.appPrivacyManager = appPrivacyManager;
export default appPrivacyManager;