feat(client): findFolder method, also ability to pass folder name in editFolder

This commit is contained in:
teidesu 2021-04-24 19:27:14 +03:00
parent a51c1ae48c
commit cf29ffe31d
3 changed files with 66 additions and 7 deletions

View file

@ -43,6 +43,7 @@ import { unarchiveChats } from './methods/chats/unarchive-chats'
import { createFolder } from './methods/dialogs/create-folder' import { createFolder } from './methods/dialogs/create-folder'
import { deleteFolder } from './methods/dialogs/delete-folder' import { deleteFolder } from './methods/dialogs/delete-folder'
import { editFolder } from './methods/dialogs/edit-folder' import { editFolder } from './methods/dialogs/edit-folder'
import { findFolder } from './methods/dialogs/find-folder'
import { getDialogs } from './methods/dialogs/get-dialogs' import { getDialogs } from './methods/dialogs/get-dialogs'
import { getFolders } from './methods/dialogs/get-folders' import { getFolders } from './methods/dialogs/get-folders'
import { downloadAsBuffer } from './methods/files/download-buffer' import { downloadAsBuffer } from './methods/files/download-buffer'
@ -722,14 +723,32 @@ export interface TelegramClient extends BaseTelegramClient {
/** /**
* Edit a folder with given modification * Edit a folder with given modification
* *
* @param folder Folder or folder ID. Note that passing an ID will require re-fetching all folders * @param folder
* Folder, folder ID or name.
* Note that passing an ID or name will require re-fetching all folders,
* and passing name might affect not the right folder if you have multiple
* with the same name.
* @param modification Modification that will be applied to this folder * @param modification Modification that will be applied to this folder
* @returns Modified folder * @returns Modified folder
*/ */
editFolder( editFolder(
folder: tl.RawDialogFilter | number, folder: tl.RawDialogFilter | number | string,
modification: Partial<Omit<tl.RawDialogFilter, 'id' | '_'>> modification: Partial<Omit<tl.RawDialogFilter, 'id' | '_'>>
): Promise<tl.RawDialogFilter> ): Promise<tl.RawDialogFilter>
/**
* Find a folder by its parameter.
*
* > **Note**: Searching by title and/or emoji might not be
* > accurate since you can set the same title and/or emoji
* > to multiple folders.
*
* @param params Search parameters. At least one must be set.
*/
findFolder(params: {
title?: string
emoji?: string
id?: number
}): Promise<tl.RawDialogFilter | null>
/** /**
* Iterate over dialogs. * Iterate over dialogs.
* *
@ -1786,6 +1805,7 @@ export class TelegramClient extends BaseTelegramClient {
createFolder = createFolder createFolder = createFolder
deleteFolder = deleteFolder deleteFolder = deleteFolder
editFolder = editFolder editFolder = editFolder
findFolder = findFolder
getDialogs = getDialogs getDialogs = getDialogs
getFolders = getFolders getFolders = getFolders
downloadAsBuffer = downloadAsBuffer downloadAsBuffer = downloadAsBuffer

View file

@ -5,20 +5,24 @@ import { MtCuteArgumentError } from '../../types'
/** /**
* Edit a folder with given modification * Edit a folder with given modification
* *
* @param folder Folder or folder ID. Note that passing an ID will require re-fetching all folders * @param folder
* Folder, folder ID or name.
* Note that passing an ID or name will require re-fetching all folders,
* and passing name might affect not the right folder if you have multiple
* with the same name.
* @param modification Modification that will be applied to this folder * @param modification Modification that will be applied to this folder
* @returns Modified folder * @returns Modified folder
* @internal * @internal
*/ */
export async function editFolder( export async function editFolder(
this: TelegramClient, this: TelegramClient,
folder: tl.RawDialogFilter | number, folder: tl.RawDialogFilter | number | string,
modification: Partial<Omit<tl.RawDialogFilter, 'id' | '_'>> modification: Partial<Omit<tl.RawDialogFilter, 'id' | '_'>>
): Promise<tl.RawDialogFilter> { ): Promise<tl.RawDialogFilter> {
if (typeof folder === 'number') { if (typeof folder === 'number' || typeof folder === 'string') {
const old = await this.getFolders() const old = await this.getFolders()
const found = old.find(it => it.id === folder) const found = old.find(it => it.id === folder || it.title === folder)
if (!found) throw new MtCuteArgumentError(`Could not find a folder with ID ${folder}`) if (!found) throw new MtCuteArgumentError(`Could not find a folder ${folder}`)
folder = found folder = found
} }

View file

@ -0,0 +1,35 @@
import { TelegramClient } from '../../client'
import { tl } from '@mtcute/tl'
import { MtCuteArgumentError } from '../../types'
/**
* Find a folder by its parameter.
*
* > **Note**: Searching by title and/or emoji might not be
* > accurate since you can set the same title and/or emoji
* > to multiple folders.
*
* @param params Search parameters. At least one must be set.
* @internal
*/
export async function findFolder(
this: TelegramClient,
params: {
title?: string
emoji?: string
id?: number
}
): Promise<tl.RawDialogFilter | null> {
if (!params.title && !params.emoji && !params.id)
throw new MtCuteArgumentError('One of search parameters must be passed')
const folders = await this.getFolders()
return folders.find((it) => {
if (params.id && it.id !== params.id) return false
if (params.title && it.title !== params.title) return false
if (params.emoji && it.emoticon !== params.emoji) return false
return true
}) ?? null
}