TelegramPWA/src/api/gramjs/methods/management.ts

235 lines
6.3 KiB
TypeScript

import { Api as GramJs } from '../../../lib/gramjs';
import { invokeRequest } from './client';
import { buildInputEntity, buildInputPeer } from '../gramjsBuilders';
import { ApiChat, ApiUser, OnApiUpdate } from '../../types';
import { addEntitiesWithPhotosToLocalDb } from '../helpers';
import { buildApiExportedInvite, buildChatInviteImporter } from '../apiBuilders/chats';
import { buildApiUser } from '../apiBuilders/users';
import { buildCollectionByKey } from '../../../util/iteratees';
let onUpdate: OnApiUpdate;
export function init(_onUpdate: OnApiUpdate) {
onUpdate = _onUpdate;
}
export function checkChatUsername({ username }: { username: string }) {
return invokeRequest(new GramJs.channels.CheckUsername({
channel: new GramJs.InputChannelEmpty(),
username,
}));
}
export async function setChatUsername(
{ chat, username }: { chat: ApiChat; username: string },
) {
const result = await invokeRequest(new GramJs.channels.UpdateUsername({
channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel,
username,
}));
if (result) {
onUpdate({
'@type': 'updateChat',
id: chat.id,
chat: { username },
});
}
}
export async function updatePrivateLink({
chat, usageLimit, expireDate,
}: {
chat: ApiChat; usageLimit?: number; expireDate?: number;
}) {
const result = await invokeRequest(new GramJs.messages.ExportChatInvite({
peer: buildInputPeer(chat.id, chat.accessHash),
usageLimit,
expireDate,
}));
if (!result) {
return undefined;
}
onUpdate({
'@type': 'updateChatFullInfo',
id: chat.id,
fullInfo: {
inviteLink: result.link,
},
});
return result.link;
}
export async function fetchExportedChatInvites({
peer, admin, limit = 0, isRevoked,
}: { peer: ApiChat; admin: ApiUser; limit: number; isRevoked?: boolean }) {
const exportedInvites = await invokeRequest(new GramJs.messages.GetExportedChatInvites({
peer: buildInputPeer(peer.id, peer.accessHash),
adminId: buildInputEntity(admin.id, admin.accessHash) as GramJs.InputUser,
limit,
revoked: isRevoked || undefined,
}));
if (!exportedInvites) return undefined;
addEntitiesWithPhotosToLocalDb(exportedInvites.users);
return exportedInvites.invites.map(buildApiExportedInvite);
}
export async function editExportedChatInvite({
peer, isRevoked, link, expireDate, usageLimit, isRequestNeeded, title,
}: {
peer: ApiChat;
isRevoked?: boolean;
link: string;
expireDate?: number;
usageLimit?: number;
isRequestNeeded?: boolean;
title?: string;
}) {
const invite = await invokeRequest(new GramJs.messages.EditExportedChatInvite({
link,
peer: buildInputPeer(peer.id, peer.accessHash),
expireDate,
usageLimit: !isRequestNeeded ? usageLimit : undefined,
requestNeeded: isRequestNeeded,
title,
revoked: isRevoked || undefined,
}));
if (!invite) return undefined;
addEntitiesWithPhotosToLocalDb(invite.users);
if (invite instanceof GramJs.messages.ExportedChatInvite) {
const replaceInvite = buildApiExportedInvite(invite.invite);
return {
oldInvite: replaceInvite,
newInvite: replaceInvite,
};
}
if (invite instanceof GramJs.messages.ExportedChatInviteReplaced) {
const oldInvite = buildApiExportedInvite(invite.invite);
const newInvite = buildApiExportedInvite(invite.newInvite);
return {
oldInvite,
newInvite,
};
}
return undefined;
}
export async function exportChatInvite({
peer, expireDate, usageLimit, isRequestNeeded, title,
}: {
peer: ApiChat;
expireDate?: number;
usageLimit?: number;
isRequestNeeded?: boolean;
title?: string;
}) {
const invite = await invokeRequest(new GramJs.messages.ExportChatInvite({
peer: buildInputPeer(peer.id, peer.accessHash),
expireDate,
usageLimit: !isRequestNeeded ? usageLimit : undefined,
requestNeeded: isRequestNeeded || undefined,
title,
}));
if (!invite) return undefined;
return buildApiExportedInvite(invite);
}
export async function deleteExportedChatInvite({
peer, link,
}: {
peer: ApiChat; link: string;
}) {
const result = await invokeRequest(new GramJs.messages.DeleteExportedChatInvite({
peer: buildInputPeer(peer.id, peer.accessHash),
link,
}));
return result;
}
export async function deleteRevokedExportedChatInvites({
peer, admin,
}: {
peer: ApiChat; admin: ApiUser;
}) {
const result = await invokeRequest(new GramJs.messages.DeleteRevokedExportedChatInvites({
peer: buildInputPeer(peer.id, peer.accessHash),
adminId: buildInputEntity(admin.id, admin.accessHash) as GramJs.InputUser,
}));
return result;
}
export async function fetchChatInviteImporters({
peer, link, offsetDate = 0, offsetUser, limit = 0, isRequested,
}: {
peer: ApiChat; link?: string; offsetDate: number; offsetUser?: ApiUser; limit: number; isRequested?: boolean;
}) {
const result = await invokeRequest(new GramJs.messages.GetChatInviteImporters({
peer: buildInputPeer(peer.id, peer.accessHash),
link,
offsetDate,
offsetUser: offsetUser
? buildInputEntity(offsetUser.id, offsetUser.accessHash) as GramJs.InputUser : new GramJs.InputUserEmpty(),
limit,
requested: isRequested || undefined,
}));
if (!result) return undefined;
const users = result.users.map((user) => buildApiUser(user)).filter(Boolean);
addEntitiesWithPhotosToLocalDb(result.users);
return {
importers: result.importers.map((importer) => buildChatInviteImporter(importer)),
users: buildCollectionByKey(users, 'id'),
};
}
export function hideChatJoinRequest({
peer,
user,
isApproved,
}: {
peer: ApiChat;
user: ApiUser;
isApproved: boolean;
}) {
return invokeRequest(new GramJs.messages.HideChatJoinRequest({
peer: buildInputPeer(peer.id, peer.accessHash),
userId: buildInputEntity(user.id, user.accessHash) as GramJs.InputUser,
approved: isApproved || undefined,
}), true);
}
export function hideAllChatJoinRequests({
peer,
isApproved,
link,
}: {
peer: ApiChat;
isApproved: boolean;
link?: string;
}) {
return invokeRequest(new GramJs.messages.HideAllChatJoinRequests({
peer: buildInputPeer(peer.id, peer.accessHash),
approved: isApproved || undefined,
link,
}), true);
}
export function hideChatReportPanel(chat: ApiChat) {
const { id, accessHash } = chat;
return invokeRequest(new GramJs.messages.HidePeerSettingsBar({
peer: buildInputPeer(id, accessHash),
}));
}