UNPKG

node-bale-api

Version:

Asynchronous Bale Messenger Module

1,025 lines (968 loc) 106 kB
import { existsSync } from 'fs'; import { EventEmitter } from 'events'; import { Connection } from "./Network/connection"; import { Promotion, MaskText, User, Chat, ChatPhoto, PhotoSizeInterface, reWrite, editMessageTextOptions, SendMessageOptions, ConstructorOptions, ForwardOptions, MediaUpload, newInviteLink, AnimationInterface, AudioInterface, DocumentLikeInterface, VideoInterface, CopyMessage, Media, VoiceInterface, FileInterface, StickerInterface, CallbackQuery, MessageForm, WebhookReturner, Webhook, SendMediaGroupOptions, MediaOutput, CallbackQueryOptions, CallbackQueryAnswer, inputMedias, InputMediaVideo, InputMediaAnimation, InputMediaAudio, InputMediaDocument, InputMediaPhoto } from "./Objects/interfaces"; interface events { message: (message: MessageForm) => void, callback_query: (callbacking: CallbackQuery) => void, photo: (message: MessageForm) => void, video: (message: MessageForm) => void, audio: (message: MessageForm) => void, voice: (message: MessageForm) => void, sticker: (message: MessageForm) => void, document: (message: MessageForm) => void, fumble: (error_message: string, error_code: number) => void, close: () => void } export class BaleBot extends EventEmitter { bot_token: string; request: Connection; private time: number; private intervalId: NodeJS.Timeout | number; private file_id_regex: RegExp; private link_url_regex: RegExp constructor(BotToken: string, options: ConstructorOptions = { polling_interval: 999, polling: false }){ super(); this.bot_token = BotToken; this.request = new Connection(this.bot_token); this.intervalId = -1; this.file_id_regex = /^\d+:-?\d+:\d+:[a-f0-9]+$/; this.link_url_regex = /^(https?:\/\/)?([a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z]{2,})(\/[^\s]*)?$/ this.time = 999; if (options.polling){ this.poll(options.polling_interval ?? 999); } process.on("uncaughtException", async (err) => { this.emit("fumble", err.message, 404); }); } emit<K extends keyof events>(event: K, ...args: Parameters<events[K]>): boolean { return super.emit(event, ...args); } on<K extends keyof events>(event: K, listener: events[K]): this { return super.on(event, listener); } async getMe(callback: (user: User) => void = () => {}) { await this.request.makeConnection("getMe", {}, async (res) => { if (res.ok){ callback({ id: res.result['id'], is_bot: res.result['is_bot'], first_name: res.result['first_name'], last_name: res.result['last_name'], username: res.result['username'], language_code: res.result['language_code'] }); } else { callback({}); this.emit("fumble", res.description, res.error_code); } }); } async logout(callback: (loggingOut: any) => void = () => {}){ await this.request.makeConnection("logout", {}, async (res) => { if (res.ok){ callback(res); } else { callback({}); this.emit("fumble", res.description, res.error_code); } }); } async close(callback: (closing: any) => void = () => {}){ await this.request.makeConnection("close", {}, async (res) => { if (res.ok){ callback(res); } else { callback({}); this.emit("fumble", res.description, res.error_code); } }); } async sendMessage( chatId: number, text: string, options: SendMessageOptions = {}, callback: (message: MessageForm) => void = () => {} ){ var _ = options.keyboard_mode; var __ = {}; __[_] = options.reply_markup; await this.request.makeConnection("sendMessage", { chat_id: chatId, text: text, reply_to_message_id: options.reply_to_message_id, reply_markup: JSON.stringify(__) }, async (res) => { if (res.ok){ callback({ text: text, from: { id: res.result.from['id'], is_bot: res.result.from['is_bot'], first_name: res.result.from['first_name'], last_name: res.result.from['last_name'], username: res.result.from['username'], language_code: res.result.from['language_code'] }, id: res.result['message_id'], date: res.result['date'], chat: { id: res.result.chat['id'], type: res.result.chat['type'], photo: { big_file_id: res['result']?.['chat']?.['photo']?.['big_file_id'], big_file_unique_id: res['result']?.['chat']?.['photo']?.['big_file_unique_id'], small_file_id: res['result']?.['chat']?.['photo']?.['small_file_id'], small_file_unique_id: res['result']?.['chat']?.['photo']?.['small_file_unique_id'], } } }); } else { callback({text: undefined}); this.emit("fumble", res.description, res.error_code); } }); } async forwardMessage( chatId: number, options: ForwardOptions, callback: (message: MessageForm) => void = () => {} ){ await this.request.makeConnection("forwardMessage", { from_chat_id: chatId, chat_id: options.to_chat, message_id: options.message_id }, async (res) => { if (res.ok){ callback({ id: res['result']?.['message_id'], from: { id: res['result']?.['from']?.['id'], is_bot: res['result']?.['from']?.['is_bot'], first_name: res['result']?.['from']?.['first_name'], last_name: res['result']?.['from']?.['last_name'], username: res['result']?.['from']?.['username'], language_code: res['result']?.['from']?.['language_code'], }, date: res['result']?.['date'], chat: { id: res['result']?.['chat']?.['id'], first_name: res['result']?.['chat']?.['first_name'], last_name: res['result']?.['chat']?.['last_name'], title: res['result']?.['chat']?.['title'], type: res['result']?.['chat']?.['type'], invite_link: res['result']?.['chat']?.['invite_link'], photo: { big_file_id: res['result']?.['chat']?.['photo']?.['big_file_id'], big_file_unique_id: res['result']?.['chat']?.['photo']?.['big_file_unique_id'], small_file_id: res['result']?.['chat']?.['photo']?.['small_file_id'], small_file_unique_id: res['result']?.['chat']?.['photo']?.['small_file_unique_id'], } }, forward_from: { id: res['result']?.['from']?.['id'], is_bot: res['result']?.['from']?.['is_bot'], first_name: res['result']?.['from']?.['first_name'], last_name: res['result']?.['from']?.['last_name'], username: res['result']?.['from']?.['username'], language_code: res['result']?.['from']?.['language_code'], }, forward_date: res['result']?.['forward_date'], text: undefined }); } else { callback({text: undefined}); this.emit("fumble", res.description, res.error_code); } }) } async sendMedia( mediaOptions : MediaUpload, callback : (call: MessageForm ) => void = (call: any) => {} ){ if (existsSync(mediaOptions.path !== undefined ? mediaOptions.path : "")){ await this.request.uploadSomething( { path: mediaOptions.path, chat_id: mediaOptions.chat_id, media: mediaOptions.media, reply_to_message_id: mediaOptions.reply_to_message_id, reply_markup: mediaOptions.reply_markup }, async (res) => { if (res.ok){ const f: User = { id: res['result']?.['from']?.['id'], is_bot: res['result']?.['from']?.['is_bot'], first_name: res['result']?.['from']?.['first_name'], last_name: res['result']?.['from']?.['last_name'], username: res['result']?.['from']?.['username'], language_code: res['result']?.['from']?.['language_code'], }; const phc: ChatPhoto = { big_file_id: res['result']?.['chat']?.['photo']?.['big_file_id'], big_file_unique_id: res['result']?.['chat']?.['photo']?.['big_file_unique_id'], small_file_id: res['result']?.['chat']?.['photo']?.['small_file_id'], small_file_unique_id: res['result']?.['chat']?.['photo']?.['small_file_unique_id'], }; const c: Chat = { id: res['result']?.['chat']?.['id'], first_name: res['result']?.['chat']?.['first_name'], last_name: res['result']?.['chat']?.['last_name'], title: res['result']?.['chat']?.['title'], type: res['result']?.['chat']?.['type'], invite_link: res['result']?.['chat']?.['invite_link'], photo: phc }; if (mediaOptions.media === "photo"){ const photos = res['result']?.['photo']; const phs: PhotoSizeInterface[] = []; photos.forEach(photo => { const { file_id, file_unique_id, file_size, width, height } = photo; phs.push({ file_id: file_id, file_unique_id: file_unique_id, file_size: file_size, width: width, height: height }); }) const pcb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], photo: phs, text: undefined, caption: res['result']?.['caption'] }; callback(pcb); } else if (mediaOptions.media === "video"){ const thumb: PhotoSizeInterface = { file_id: res['result']?.['video']?.['thumb']?.['file_id'], file_unique_id: res['result']?.['video']?.['thumb']?.['file_unique_id'], file_size: res['result']?.['video']?.['thumb']?.['file_size'], width: res['result']?.['video']?.['thumb']?.['width'], height: res['result']?.['video']?.['thumb']?.['height'] }; const video: VideoInterface = { file_id: res['result']?.['video']?.['file_id'], file_unique_id: res['result']?.['video']?.['file_unique_id'], file_size: res['result']?.['video']?.['file_size'], width: res['result']?.['video']?.['width'], height: res['result']?.['video']?.['height'], thumbnail: thumb, mime_type: res['result']?.['video']?.['mime_type'], duration: res['result']?.['video']?.['duration'] }; const vcb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], video: video, text: undefined, caption: res['result']?.['caption'] }; callback(vcb); } else if (mediaOptions.media === "document"){ const dcmnt: DocumentLikeInterface = { file_id: res['result']?.['document']?.['file_id'], file_unique_id: res['result']?.['document']?.['file_unique_id'], file_name: res['result']?.['document']?.['file_name'], file_size: res['result']?.['document']?.['file_size'], mime_type: res['result']?.['document']?.['mime_type'] }; const dcb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], document: dcmnt, text: undefined, caption: res['result']?.['caption'] }; callback(dcb); } else if (mediaOptions.media === "audio"){ const aud: AudioInterface = { file_id: res['result']?.['audio']?.['file_id'], file_unique_id: res['result']?.['audio']?.['file_unique_id'], duration: res['result']?.['audio']?.['duration'], file_size: res['result']?.['audio']?.['file_size'], mime_type: res['result']?.['audio']?.['mime_type'] }; const acb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], audio: aud, text: undefined, caption: res['result']?.['caption'] }; callback(acb); } else if (mediaOptions.media === "voice"){ const voice: VoiceInterface = { file_id: res['result']?.['voice']?.['file_id'], file_unique_id: res['result']?.['voice']?.['file_unique_id'], duration: res['result']?.['voice']?.['duration'], file_size: res['result']?.['voice']?.['file_size'], mime_type: res['result']?.['voice']?.['mime_type'] }; const acb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], voice: voice, text: undefined, caption: res['result']?.['caption'] }; callback(acb); } else if (mediaOptions.media === "animation"){ const thumb: PhotoSizeInterface = { file_id: res['result']?.['video']?.['thumb']?.['file_id'], file_unique_id: res['result']?.['video']?.['thumb']?.['file_unique_id'], file_size: res['result']?.['video']?.['thumb']?.['file_size'], width: res['result']?.['video']?.['thumb']?.['width'], height: res['result']?.['video']?.['thumb']?.['height'] }; const animation: AnimationInterface = { file_id: res['result']?.['animation']?.['file_id'], file_unique_id: res['result']?.['animation']?.['file_unique_id'], file_size: res['result']?.['animation']?.['file_size'], width: res['result']?.['animation']?.['width'], height: res['result']?.['animation']?.['height'], thumbnail: thumb, mime_type: res['result']?.['animation']?.['mime_type'], duration: res['result']?.['animation']?.['duration'] }; const ancb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], animation: animation, text: undefined, caption: res['result']?.['caption'] }; callback(ancb); } } else { callback({text: undefined}); this.emit("fumble", res.description, res.error_code); } } ) } else if (mediaOptions.path !== undefined && this.link_url_regex.test(mediaOptions.path)) { const absData = {} Object.defineProperty(absData, "chat_id", { value: mediaOptions.chat_id, writable: true, enumerable: true, configurable: true }); Object.defineProperty(absData, "caption", { value: mediaOptions.caption, writable: true, enumerable: true, configurable: true }); Object.defineProperty(absData, "reply_to_message_id", { value: mediaOptions.reply_to_message_id, writable: true, enumerable: true, configurable: true }); Object.defineProperty(absData, "reply_markup", { value: JSON.stringify({keyboard: mediaOptions.reply_markup}), writable: true, enumerable: true, configurable: true }); Object.defineProperty(absData, mediaOptions.media, { value: mediaOptions.path, writable: true, enumerable: true, configurable: true }); await this.request.makeConnection(`send${this.request.toTitleCase(mediaOptions.media)}`, absData, async (res) => { if (res.ok){ const f: User = { id: res['result']?.['from']?.['id'], is_bot: res['result']?.['from']?.['is_bot'], first_name: res['result']?.['from']?.['first_name'], last_name: res['result']?.['from']?.['last_name'], username: res['result']?.['from']?.['username'], language_code: res['result']?.['from']?.['language_code'], }; const phc: ChatPhoto = { big_file_id: res['result']?.['chat']?.['photo']?.['big_file_id'], big_file_unique_id: res['result']?.['chat']?.['photo']?.['big_file_unique_id'], small_file_id: res['result']?.['chat']?.['photo']?.['small_file_id'], small_file_unique_id: res['result']?.['chat']?.['photo']?.['small_file_unique_id'], }; const c: Chat = { id: res['result']?.['chat']?.['id'], first_name: res['result']?.['chat']?.['first_name'], last_name: res['result']?.['chat']?.['last_name'], title: res['result']?.['chat']?.['title'], type: res['result']?.['chat']?.['type'], invite_link: res['result']?.['chat']?.['invite_link'], photo: phc }; if (mediaOptions.media === "photo"){ const photos = res['result']?.['photo']; const phs: PhotoSizeInterface[] = []; photos.forEach(photo => { const { file_id, file_unique_id, file_size, width, height } = photo; phs.push({ file_id: file_id, file_unique_id: file_unique_id, file_size: file_size, width: width, height: height }); }) const pcb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], photo: phs, text: undefined, caption: res['result']?.['caption'] }; callback(pcb); } else if (mediaOptions.media === "video"){ const thumb: PhotoSizeInterface = { file_id: res['result']?.['video']?.['thumb']?.['file_id'], file_unique_id: res['result']?.['video']?.['thumb']?.['file_unique_id'], file_size: res['result']?.['video']?.['thumb']?.['file_size'], width: res['result']?.['video']?.['thumb']?.['width'], height: res['result']?.['video']?.['thumb']?.['height'] }; const video: VideoInterface = { file_id: res['result']?.['video']?.['file_id'], file_unique_id: res['result']?.['video']?.['file_unique_id'], file_size: res['result']?.['video']?.['file_size'], width: res['result']?.['video']?.['width'], height: res['result']?.['video']?.['height'], thumbnail: thumb, mime_type: res['result']?.['video']?.['mime_type'], duration: res['result']?.['video']?.['duration'] }; const vcb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], video: video, text: undefined, caption: res['result']?.['caption'] }; callback(vcb); } else if (mediaOptions.media === "document"){ const dcmnt: DocumentLikeInterface = { file_id: res['result']?.['document']?.['file_id'], file_unique_id: res['result']?.['document']?.['file_unique_id'], file_name: res['result']?.['document']?.['file_name'], file_size: res['result']?.['document']?.['file_size'], mime_type: res['result']?.['document']?.['mime_type'] }; const dcb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], document: dcmnt, text: undefined, caption: res['result']?.['caption'] }; callback(dcb); } else if (mediaOptions.media === "audio"){ const aud: AudioInterface = { file_id: res['result']?.['audio']?.['file_id'], file_unique_id: res['result']?.['audio']?.['file_unique_id'], duration: res['result']?.['audio']?.['duration'], file_size: res['result']?.['audio']?.['file_size'], mime_type: res['result']?.['audio']?.['mime_type'] }; const acb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], audio: aud, text: undefined, caption: res['result']?.['caption'] }; callback(acb); } else if (mediaOptions.media === "voice"){ const voice: VoiceInterface = { file_id: res['result']?.['voice']?.['file_id'], file_unique_id: res['result']?.['voice']?.['file_unique_id'], duration: res['result']?.['voice']?.['duration'], file_size: res['result']?.['voice']?.['file_size'], mime_type: res['result']?.['voice']?.['mime_type'] }; const acb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], voice: voice, text: undefined, caption: res['result']?.['caption'] }; callback(acb); } else if (mediaOptions.media === "animation"){ const thumb: PhotoSizeInterface = { file_id: res['result']?.['video']?.['thumb']?.['file_id'], file_unique_id: res['result']?.['video']?.['thumb']?.['file_unique_id'], file_size: res['result']?.['video']?.['thumb']?.['file_size'], width: res['result']?.['video']?.['thumb']?.['width'], height: res['result']?.['video']?.['thumb']?.['height'] }; const animation: AnimationInterface = { file_id: res['result']?.['animation']?.['file_id'], file_unique_id: res['result']?.['animation']?.['file_unique_id'], file_size: res['result']?.['animation']?.['file_size'], width: res['result']?.['animation']?.['width'], height: res['result']?.['animation']?.['height'], thumbnail: thumb, mime_type: res['result']?.['animation']?.['mime_type'], duration: res['result']?.['animation']?.['duration'] }; const ancb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], animation: animation, text: undefined, caption: res['result']?.['caption'] }; callback(ancb); } } else { callback({text: undefined}); this.emit("fumble", res.description, res.error_code); } }); } else if (mediaOptions.file_id !== undefined && this.file_id_regex.test(mediaOptions.file_id)) { const absData = {} Object.defineProperty(absData, "chat_id", { value: mediaOptions.chat_id, writable: true, enumerable: true, configurable: true }); Object.defineProperty(absData, "caption", { value: mediaOptions.caption, writable: true, enumerable: true, configurable: true }); Object.defineProperty(absData, "reply_to_message_id", { value: mediaOptions.reply_to_message_id, writable: true, enumerable: true, configurable: true }); Object.defineProperty(absData, "reply_markup", { value: JSON.stringify({keyboard: mediaOptions.reply_markup}), writable: true, enumerable: true, configurable: true }); Object.defineProperty(absData, mediaOptions.media, { value: mediaOptions.file_id, writable: true, enumerable: true, configurable: true }); await this.request.makeConnection(`send${this.request.toTitleCase(mediaOptions.media)}`, absData, async (res) => { if (res.ok){ const f: User = { id: res['result']?.['from']?.['id'], is_bot: res['result']?.['from']?.['is_bot'], first_name: res['result']?.['from']?.['first_name'], last_name: res['result']?.['from']?.['last_name'], username: res['result']?.['from']?.['username'], language_code: res['result']?.['from']?.['language_code'], }; const phc: ChatPhoto = { big_file_id: res['result']?.['chat']?.['photo']?.['big_file_id'], big_file_unique_id: res['result']?.['chat']?.['photo']?.['big_file_unique_id'], small_file_id: res['result']?.['chat']?.['photo']?.['small_file_id'], small_file_unique_id: res['result']?.['chat']?.['photo']?.['small_file_unique_id'], }; const c: Chat = { id: res['result']?.['chat']?.['id'], first_name: res['result']?.['chat']?.['first_name'], last_name: res['result']?.['chat']?.['last_name'], title: res['result']?.['chat']?.['title'], type: res['result']?.['chat']?.['type'], invite_link: res['result']?.['chat']?.['invite_link'], photo: phc }; if (mediaOptions.media === "photo"){ const photos = res['result']?.['photo']; const phs: PhotoSizeInterface[] = []; photos.forEach(photo => { const { file_id, file_unique_id, file_size, width, height } = photo; phs.push({ file_id: file_id, file_unique_id: file_unique_id, file_size: file_size, width: width, height: height }); }) const pcb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], photo: phs, text: undefined, caption: res['result']?.['caption'] }; callback(pcb); } else if (mediaOptions.media === "video"){ const thumb: PhotoSizeInterface = { file_id: res['result']?.['video']?.['thumb']?.['file_id'], file_unique_id: res['result']?.['video']?.['thumb']?.['file_unique_id'], file_size: res['result']?.['video']?.['thumb']?.['file_size'], width: res['result']?.['video']?.['thumb']?.['width'], height: res['result']?.['video']?.['thumb']?.['height'] }; const video: VideoInterface = { file_id: res['result']?.['video']?.['file_id'], file_unique_id: res['result']?.['video']?.['file_unique_id'], file_size: res['result']?.['video']?.['file_size'], width: res['result']?.['video']?.['width'], height: res['result']?.['video']?.['height'], thumbnail: thumb, mime_type: res['result']?.['video']?.['mime_type'], duration: res['result']?.['video']?.['duration'] }; const vcb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], video: video, text: undefined, caption: res['result']?.['caption'] }; callback(vcb); } else if (mediaOptions.media === "document"){ const dcmnt: DocumentLikeInterface = { file_id: res['result']?.['document']?.['file_id'], file_unique_id: res['result']?.['document']?.['file_unique_id'], file_name: res['result']?.['document']?.['file_name'], file_size: res['result']?.['document']?.['file_size'], mime_type: res['result']?.['document']?.['mime_type'] }; const dcb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], document: dcmnt, text: undefined, caption: res['result']?.['caption'] }; callback(dcb); } else if (mediaOptions.media === "audio"){ const aud: AudioInterface = { file_id: res['result']?.['audio']?.['file_id'], file_unique_id: res['result']?.['audio']?.['file_unique_id'], duration: res['result']?.['audio']?.['duration'], file_size: res['result']?.['audio']?.['file_size'], mime_type: res['result']?.['audio']?.['mime_type'] }; const acb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], audio: aud, text: undefined, caption: res['result']?.['caption'] }; callback(acb); } else if (mediaOptions.media === "voice"){ const voice: VoiceInterface = { file_id: res['result']?.['voice']?.['file_id'], file_unique_id: res['result']?.['voice']?.['file_unique_id'], duration: res['result']?.['voice']?.['duration'], file_size: res['result']?.['voice']?.['file_size'], mime_type: res['result']?.['voice']?.['mime_type'] }; const acb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], voice: voice, text: undefined, caption: res['result']?.['caption'] }; callback(acb); } else if (mediaOptions.media === "animation"){ const thumb: PhotoSizeInterface = { file_id: res['result']?.['video']?.['thumb']?.['file_id'], file_unique_id: res['result']?.['video']?.['thumb']?.['file_unique_id'], file_size: res['result']?.['video']?.['thumb']?.['file_size'], width: res['result']?.['video']?.['thumb']?.['width'], height: res['result']?.['video']?.['thumb']?.['height'] }; const animation: AnimationInterface = { file_id: res['result']?.['animation']?.['file_id'], file_unique_id: res['result']?.['animation']?.['file_unique_id'], file_size: res['result']?.['animation']?.['file_size'], width: res['result']?.['animation']?.['width'], height: res['result']?.['animation']?.['height'], thumbnail: thumb, mime_type: res['result']?.['animation']?.['mime_type'], duration: res['result']?.['animation']?.['duration'] }; const ancb: MessageForm = { id: res['result']?.['message_id'], from: f, chat: c, date: res['result']?.['date'], animation: animation, text: undefined, caption: res['result']?.['caption'] }; callback(ancb); } } else { callback({text: undefined}); this.emit("fumble", res.description, res.error_code); } }); } } async sendLocation( chatId: number, latitude: number, longitude: number, options: SendMessageOptions = {}, horizontalAccuracy: boolean = null, callback: (location: MessageForm ) => void = () => {} ){ await this.request.makeConnection("sendLocation", { chat_id: chatId, latitude: latitude, longitude: longitude, horizontal_accuracy: horizontalAccuracy, reply_to_message_id: options.reply_to_message_id, reply_markup: JSON.stringify({}[options.keyboard_mode] = options.reply_markup) }, async (res) => { if (res.ok){ callback({ id: res['result']?.['message_id'], chat: { id: res['result']?.['chat']?.['id'], first_name: res['result']?.['chat']?.['first_name'], last_name: res['result']?.['chat']?.['last_name'], title: res['result']?.['chat']?.['title'], type: res['result']?.['chat']?.['type'], invite_link: res['result']?.['chat']?.['invite_link'], photo: { big_file_id: res['result']?.['chat']?.['photo']?.['big_file_id'], big_file_unique_id: res['result']?.['chat']?.['photo']?.['big_file_unique_id'], small_file_id: res['result']?.['chat']?.['photo']?.['small_file_id'], small_file_unique_id: res['result']?.['chat']?.['photo']?.['small_file_unique_id'], } }, from: { id: res['result']?.['from']?.['id'], is_bot: res['result']?.['from']?.['is_bot'], first_name: res['result']?.['from']?.['first_name'], last_name: res['result']?.['from']?.['last_name'], username: res['result']?.['from']?.['username'], language_code: res['result']?.['from']?.['language_code'], }, location: { longitude: res['result']?.['location']?.['longitude'], latitude: res['result']?.['location']?.['latitude'] }, text: undefined }); } else { callback({text: undefined}); this.emit("fumble", res.description, res.error_code); } }) } async sendContact( chatId: number, phoneNumber: string, firstName: string, lastName: string = null, options: SendMessageOptions = {}, callback: (clback: MessageForm) => void = () => {} ){ await this.request.makeConnection("sendContact", { chat_id: chatId, phone_number: phoneNumber, first_name: firstName, last_name: lastName, reply_to_message_id: options.reply_to_message_id, reply_markup: JSON.stringify({}[options.keyboard_mode] = options.reply_markup) }, async (res) => { if (res.ok){ callback({ id: res['result']?.['message_id'], chat: { id: res['result']?.['chat']?.['id'], first_name: res['result']?.['chat']?.['first_name'], last_name: res['result']?.['chat']?.['last_name'], title: res['result']?.['chat']?.['title'], type: res['result']?.['chat']?.['type'], invite_link: res['result']?.['chat']?.['invite_link'], photo: { big_file_id: res['result']?.['chat']?.['photo']?.['big_file_id'], big_file_unique_id: res['result']?.['chat']?.['photo']?.['big_file_unique_id'], small_file_id: res['result']?.['chat']?.['photo']?.['small_file_id'], small_file_unique_id: res['result']?.['chat']?.['photo']?.['small_file_unique_id'], } }, from: { id: res['result']?.['from']?.['id'], is_bot: res['result']?.['from']?.['is_bot'], first_name: res['result']?.['from']?.['first_name'], last_name: res['result']?.['from']?.['last_name'], username: res['result']?.['from']?.['username'], language_code: res['result']?.['from']?.['language_code'], }, contact: { first_name: res['result']?.['contact']?.['first_name'], last_name: res['result']?.['contact']?.['last_name'], phone_number: res['result']?.['contact']?.['phone_number'], user_id: res['result']?.['contact']?.['user_id'] }, text: undefined }); } else { callback({text: undefined}); this.emit("fumble", res.description, res.error_code); } }) } async getFile( fileId: string, callback: (file: FileInterface) => void = () => {} ){ await this.request.makeConnection("getFile", { file_id: fileId }, async (res) => { if (res.ok){; callback({ id: res['result']?.['file_id'], unique_id: res['result']?.['file_unique_id'], size: res['result']?.['file_size'], path: res['result']?.['file_path'] }); } else { callback({}); this.emit("fumble", res.description, res.error_code); } } ) } async getFileContent( filePath: string, callback: (rewrite: reWrite) => void = () => {} ){ await this.request.fileConnection(filePath, (s) => { if (typeof s === 'object' && s !== null && !Array.isArray(s)) { callback({ ok: false, error_message: s['message'] }); } else { callback({ ok: true, data: s }); } }) } async getChat( chatId: number, callback: (chat: Chat) => void = () => {} ){ await this.request.makeConnection( "getChat", { chat_id: chatId }, async (res) => { if (res.ok){ callback({ first_name: res['result']?.['first_name'], last_name: res['result']?.['last_name'], id: res['result']?.['id'], title: res['result']?.['title'], invite_link: res['result']?.['invite_link'], username: res['result']?.['username'], type: res['result']?.['type'], photo: { big_file_id: res['result']?.['photo']?.['big_file_id'], big_file_unique_id: res['result']?.['photo']?.['big_file_unique_id'], small_file_id: res['result']?.['photo']?.['small_file_id'], small_file_unique_id: res['result']?.['photo']?.['big_file_id'], } }); } else { callback({}); this.emit("fumble", res.description, res.error_code); } } ) } async pinMessage( chatId: number, messageId: number, callback: (clback: boolean) => void = () => {} ){ await this.request.makeConnection("pinChatMessage", { chat_id: chatId, message_id: messageId }, async (res) => { if (res.ok){ callback(res.result) } else { callback(false); this.emit("fumble", res.description, res.error_code); } }) } async unpinMessage( chatId: number, messageId: number, callback: (clback: boolean) => void = () => {} ){ await this.request.makeConnection("unpinChatMessage", { chat_id: chatId, message_id: messageId }, async (res) => { if (res.ok){ callback(res.result) } else { callback(false); this.emit("fumble", res.description, res.error_code);