feat(client): contacts related methods
This commit is contained in:
parent
2fc8a90edf
commit
39236c94c2
6 changed files with 255 additions and 0 deletions
|
@ -40,6 +40,10 @@ import { setChatTitle } from './methods/chats/set-chat-title'
|
||||||
import { setChatUsername } from './methods/chats/set-chat-username'
|
import { setChatUsername } from './methods/chats/set-chat-username'
|
||||||
import { setSlowMode } from './methods/chats/set-slow-mode'
|
import { setSlowMode } from './methods/chats/set-slow-mode'
|
||||||
import { unarchiveChats } from './methods/chats/unarchive-chats'
|
import { unarchiveChats } from './methods/chats/unarchive-chats'
|
||||||
|
import { addContact } from './methods/contacts/add-contact'
|
||||||
|
import { deleteContacts } from './methods/contacts/delete-contacts'
|
||||||
|
import { getContacts } from './methods/contacts/get-contacts'
|
||||||
|
import { importContacts } from './methods/contacts/import-contacts'
|
||||||
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'
|
||||||
|
@ -707,6 +711,67 @@ export interface TelegramClient extends BaseTelegramClient {
|
||||||
* @param chats Chat ID(s), username(s), phone number(s), `"me"` or `"self"`
|
* @param chats Chat ID(s), username(s), phone number(s), `"me"` or `"self"`
|
||||||
*/
|
*/
|
||||||
unarchiveChats(chats: MaybeArray<InputPeerLike>): Promise<void>
|
unarchiveChats(chats: MaybeArray<InputPeerLike>): Promise<void>
|
||||||
|
/**
|
||||||
|
* Add an existing Telegram user as a contact
|
||||||
|
*
|
||||||
|
* @param userId User ID, username or phone number
|
||||||
|
* @param params Contact details
|
||||||
|
*/
|
||||||
|
addContact(
|
||||||
|
userId: InputPeerLike,
|
||||||
|
params: {
|
||||||
|
/**
|
||||||
|
* First name of the contact
|
||||||
|
*/
|
||||||
|
firstName: string
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Last name of the contact
|
||||||
|
*/
|
||||||
|
lastName?: string
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phone number of the contact, if available
|
||||||
|
*/
|
||||||
|
phone?: string
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether to share your own phone number
|
||||||
|
* with the newly created contact (defaults to `false`)
|
||||||
|
*/
|
||||||
|
sharePhone?: boolean
|
||||||
|
}
|
||||||
|
): Promise<User>
|
||||||
|
/**
|
||||||
|
* Delete a single contact from your Telegram contacts list
|
||||||
|
*
|
||||||
|
* Returns deleted contact's profile or `null` in case
|
||||||
|
* that user was not in your contacts list
|
||||||
|
*
|
||||||
|
* @param userId User ID, username or phone number
|
||||||
|
*/
|
||||||
|
deleteContacts(userId: InputPeerLike): Promise<User | null>
|
||||||
|
/**
|
||||||
|
* Delete one or more contacts from your Telegram contacts list
|
||||||
|
*
|
||||||
|
* Returns deleted contact's profiles. Does not return
|
||||||
|
* profiles of users that were not in your contacts list
|
||||||
|
*
|
||||||
|
* @param userIds User IDs, usernames or phone numbers
|
||||||
|
*/
|
||||||
|
deleteContacts(userIds: InputPeerLike[]): Promise<User[]>
|
||||||
|
/**
|
||||||
|
* Get list of contacts from your Telegram contacts list.
|
||||||
|
*/
|
||||||
|
getContacts(): Promise<User[]>
|
||||||
|
/**
|
||||||
|
* Import contacts to your Telegram contacts list.
|
||||||
|
*
|
||||||
|
* @param contacts List of contacts
|
||||||
|
*/
|
||||||
|
importContacts(
|
||||||
|
contacts: PartialOnly<Omit<tl.RawInputPhoneContact, '_'>, 'clientId'>[]
|
||||||
|
): Promise<tl.contacts.RawImportedContacts>
|
||||||
/**
|
/**
|
||||||
* Create a folder from given parameters
|
* Create a folder from given parameters
|
||||||
*
|
*
|
||||||
|
@ -1834,6 +1899,10 @@ export class TelegramClient extends BaseTelegramClient {
|
||||||
setChatUsername = setChatUsername
|
setChatUsername = setChatUsername
|
||||||
setSlowMode = setSlowMode
|
setSlowMode = setSlowMode
|
||||||
unarchiveChats = unarchiveChats
|
unarchiveChats = unarchiveChats
|
||||||
|
addContact = addContact
|
||||||
|
deleteContacts = deleteContacts
|
||||||
|
getContacts = getContacts
|
||||||
|
importContacts = importContacts
|
||||||
createFolder = createFolder
|
createFolder = createFolder
|
||||||
deleteFolder = deleteFolder
|
deleteFolder = deleteFolder
|
||||||
editFolder = editFolder
|
editFolder = editFolder
|
||||||
|
|
61
packages/client/src/methods/contacts/add-contact.ts
Normal file
61
packages/client/src/methods/contacts/add-contact.ts
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
import { TelegramClient } from '../../client'
|
||||||
|
import { InputPeerLike, MtCuteInvalidPeerTypeError, MtCuteTypeAssertionError, User } from '../../types'
|
||||||
|
import { normalizeToInputUser } from '../../utils/peer-utils'
|
||||||
|
import { tl } from '@mtcute/tl'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an existing Telegram user as a contact
|
||||||
|
*
|
||||||
|
* @param userId User ID, username or phone number
|
||||||
|
* @param params Contact details
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
export async function addContact(
|
||||||
|
this: TelegramClient,
|
||||||
|
userId: InputPeerLike,
|
||||||
|
params: {
|
||||||
|
/**
|
||||||
|
* First name of the contact
|
||||||
|
*/
|
||||||
|
firstName: string
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Last name of the contact
|
||||||
|
*/
|
||||||
|
lastName?: string
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phone number of the contact, if available
|
||||||
|
*/
|
||||||
|
phone?: string
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether to share your own phone number
|
||||||
|
* with the newly created contact (defaults to `false`)
|
||||||
|
*/
|
||||||
|
sharePhone?: boolean
|
||||||
|
}
|
||||||
|
): Promise<User> {
|
||||||
|
const peer = normalizeToInputUser(await this.resolvePeer(userId))
|
||||||
|
if (!peer) throw new MtCuteInvalidPeerTypeError(userId, 'user')
|
||||||
|
|
||||||
|
const res = await this.call({
|
||||||
|
_: 'contacts.addContact',
|
||||||
|
id: peer,
|
||||||
|
firstName: params.firstName,
|
||||||
|
lastName: params.lastName ?? '',
|
||||||
|
phone: params.phone ?? '',
|
||||||
|
addPhonePrivacyException: !!params.sharePhone
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!(res._ === 'updates' || res._ === 'updatesCombined'))
|
||||||
|
throw new MtCuteTypeAssertionError(
|
||||||
|
'addContact',
|
||||||
|
'updates | updatesCombined',
|
||||||
|
res._
|
||||||
|
)
|
||||||
|
|
||||||
|
this._handleUpdate(res)
|
||||||
|
|
||||||
|
return new User(this, res.users[0] as tl.RawUser)
|
||||||
|
}
|
76
packages/client/src/methods/contacts/delete-contacts.ts
Normal file
76
packages/client/src/methods/contacts/delete-contacts.ts
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
import { TelegramClient } from '../../client'
|
||||||
|
import { MaybeArray } from '@mtcute/core'
|
||||||
|
import { InputPeerLike, MtCuteInvalidPeerTypeError, MtCuteTypeAssertionError, User } from '../../types'
|
||||||
|
import { normalizeToInputUser } from '../../utils/peer-utils'
|
||||||
|
import { tl } from '@mtcute/tl'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a single contact from your Telegram contacts list
|
||||||
|
*
|
||||||
|
* Returns deleted contact's profile or `null` in case
|
||||||
|
* that user was not in your contacts list
|
||||||
|
*
|
||||||
|
* @param userId User ID, username or phone number
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
export async function deleteContacts(
|
||||||
|
this: TelegramClient,
|
||||||
|
userId: InputPeerLike
|
||||||
|
): Promise<User | null>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete one or more contacts from your Telegram contacts list
|
||||||
|
*
|
||||||
|
* Returns deleted contact's profiles. Does not return
|
||||||
|
* profiles of users that were not in your contacts list
|
||||||
|
*
|
||||||
|
* @param userIds User IDs, usernames or phone numbers
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
export async function deleteContacts(
|
||||||
|
this: TelegramClient,
|
||||||
|
userIds: InputPeerLike[]
|
||||||
|
): Promise<User[]>
|
||||||
|
|
||||||
|
/** @internal */
|
||||||
|
export async function deleteContacts(
|
||||||
|
this: TelegramClient,
|
||||||
|
userIds: MaybeArray<InputPeerLike>
|
||||||
|
): Promise<MaybeArray<User> | null> {
|
||||||
|
const single = !Array.isArray(userIds)
|
||||||
|
if (single) userIds = [userIds as InputPeerLike]
|
||||||
|
|
||||||
|
const inputPeers = ((
|
||||||
|
await Promise.all(
|
||||||
|
(userIds as InputPeerLike[]).map((it) =>
|
||||||
|
this.resolvePeer(it).then(normalizeToInputUser)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
).filter(Boolean) as unknown) as tl.TypeInputUser[]
|
||||||
|
|
||||||
|
if (single && !inputPeers.length)
|
||||||
|
throw new MtCuteInvalidPeerTypeError(
|
||||||
|
(userIds as InputPeerLike[])[0],
|
||||||
|
'user'
|
||||||
|
)
|
||||||
|
|
||||||
|
const res = await this.call({
|
||||||
|
_: 'contacts.deleteContacts',
|
||||||
|
id: inputPeers
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!(res._ === 'updates' || res._ === 'updatesCombined'))
|
||||||
|
throw new MtCuteTypeAssertionError(
|
||||||
|
'addContact',
|
||||||
|
'updates | updatesCombined',
|
||||||
|
res._
|
||||||
|
)
|
||||||
|
|
||||||
|
if (single && !res.updates.length) return null
|
||||||
|
|
||||||
|
this._handleUpdate(res)
|
||||||
|
|
||||||
|
const users = res.users.map(user => new User(this, user as tl.RawUser))
|
||||||
|
|
||||||
|
return single ? users[0] : users
|
||||||
|
}
|
20
packages/client/src/methods/contacts/get-contacts.ts
Normal file
20
packages/client/src/methods/contacts/get-contacts.ts
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import { TelegramClient } from '../../client'
|
||||||
|
import { User } from '../../types'
|
||||||
|
import { assertTypeIs } from '../../utils/type-assertion'
|
||||||
|
import { tl } from '@mtcute/tl'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get list of contacts from your Telegram contacts list.
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
export async function getContacts(
|
||||||
|
this: TelegramClient
|
||||||
|
): Promise<User[]> {
|
||||||
|
const res = await this.call({
|
||||||
|
_: 'contacts.getContacts',
|
||||||
|
hash: 0
|
||||||
|
})
|
||||||
|
assertTypeIs('getContacts', res, 'contacts.contacts')
|
||||||
|
|
||||||
|
return res.users.map((user) => new User(this, user as tl.RawUser))
|
||||||
|
}
|
28
packages/client/src/methods/contacts/import-contacts.ts
Normal file
28
packages/client/src/methods/contacts/import-contacts.ts
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
import { TelegramClient } from '../../client'
|
||||||
|
import { tl } from '@mtcute/tl'
|
||||||
|
import { PartialOnly } from '@mtcute/core'
|
||||||
|
import bigInt from 'big-integer'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Import contacts to your Telegram contacts list.
|
||||||
|
*
|
||||||
|
* @param contacts List of contacts
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
export async function importContacts(
|
||||||
|
this: TelegramClient,
|
||||||
|
contacts: PartialOnly<Omit<tl.RawInputPhoneContact, '_'>, 'clientId'>[]
|
||||||
|
): Promise<tl.contacts.RawImportedContacts> {
|
||||||
|
let seq = bigInt.zero
|
||||||
|
|
||||||
|
const contactsNorm: tl.RawInputPhoneContact[] = contacts.map((input) => ({
|
||||||
|
_: 'inputPhoneContact',
|
||||||
|
clientId: (seq = seq.plus(1)),
|
||||||
|
...input,
|
||||||
|
}))
|
||||||
|
|
||||||
|
return await this.call({
|
||||||
|
_: 'contacts.importContacts',
|
||||||
|
contacts: contactsNorm,
|
||||||
|
})
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
export type MaybeAsync<T> = T | Promise<T>
|
export type MaybeAsync<T> = T | Promise<T>
|
||||||
export type PartialExcept<T, K extends keyof T> = Partial<Omit<T, K>> &
|
export type PartialExcept<T, K extends keyof T> = Partial<Omit<T, K>> &
|
||||||
Pick<T, K>
|
Pick<T, K>
|
||||||
|
export type PartialOnly<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K>
|
||||||
|
|
||||||
export type MaybeArray<T> = T | T[]
|
export type MaybeArray<T> = T | T[]
|
||||||
|
|
Loading…
Reference in a new issue