UNPKG

@xalbex/telegram-bot

Version:
634 lines 28.6 kB
"use strict"; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const Https = __importStar(require("https")); /** * All official methods of the Telegram Bot API without abstraction. */ class TelegramBotRaw { /** * To use this class a token is **required** and can be obtained * by talking to [@botfather](https://telegram.me/BotFather). */ constructor(token) { // Token for the authentication this.token = token; } /** * Make an HTTPS POST multipart/form-data request to the Telegram server */ async request(method, params) { return new Promise((resolve, reject) => { // The separator used in the multipart request let boundary = 'FkEDmYLIktZjh6eaHViDpH0bbx'; // Parts the compose the body of the request let parts = []; for (let name in params) { // Print the headers of this parameter parts.push(Buffer.from('--' + boundary + '\r\nContent-Disposition: form-data; name="' + name + '"')); // If this parameter is a buffer send it as binary data if (params[name].name && params[name].data) parts.push(Buffer.from('; filename="' + params[name].name + '"\r\nContent-Type: application/octet-stream\r\n\r\n'), params[name].data); // Else it is converted into a string else parts.push(Buffer.from('\r\n\r\n' + params[name])); // Conclude the part for this parameter parts.push(Buffer.from('\r\n')); } if (parts.length) { // Add the final separator to conclude the request parts.push(Buffer.from('--' + boundary + '--\r\n')); } // Create the body concatenating the parts let body = Buffer.concat(parts); // Initialize the HTTP request using the built-in module let request = Https.request({ // All methods can be made with POST requests method: 'POST', // The path contains the authentication token // and the method of the Telegram API path: '/bot' + this.token + '/' + method, // Hostname of Telegram's servers hostname: 'api.telegram.org', // Headers that specify the type and length of the body headers: { 'Content-Type': 'multipart/form-data; boundary=' + boundary, 'Content-Length': body.byteLength }, }, (response) => { // The chunks that compose the HTTP response body let chunks = []; // Set the callbacks for error in the errors and chunks response.on('error', (error) => reject(error)); response.on('data', (chunk) => chunks.push(chunk)); // Callback called when the response is completed. // Now the concatenation of chunks is the whole response body. response.on('end', () => { try { // Produce a string from the chunks let json = Buffer.concat(chunks).toString('utf8'); // Parse the string as a JSON let parsed = JSON.parse(json); // The response contains a JSON object, which always has a Boolean field ‘ok’ // and may have an optional String field ‘description’ // with a human-readable description of the result. // If ‘ok’ equals true, the request was successful and the result of the query // can be found in the ‘result’ field. In case of an unsuccessful request, // ‘ok’ equals false and the error is explained in the ‘description’. parsed.ok ? resolve(parsed.result) : reject(new Error(parsed.description)); } catch (error) { // Catch errors in the parsing phase reject(error); } }); }); // Catch errors during the request to the server request.on('error', error => reject(error)); // Write the body of the request and close the request. request.write(body); request.end(); }); } /** * Use this method to receive incoming updates using long polling (wiki). An Array * of Update objects is returned. */ async getUpdates(params) { return this.request('getUpdates', params); } /** * Use this method to specify a url and receive incoming updates via an outgoing * webhook. Whenever there is an update for the bot, we will send an HTTPS POST * request to the specified url, containing a JSON-serialized Update. In case of an * unsuccessful request, we will give up after a reasonable amount of attempts. * Returns True on success.If you'd like to make sure that the Webhook request * comes from Telegram, we recommend using a secret path in the URL, e.g. * https://www.example.com/<token>. Since nobody else knows your bot‘s token, you * can be pretty sure it’s us. */ async setWebhook(params) { return this.request('setWebhook', params); } /** * Use this method to remove webhook integration if you decide to switch back to * getUpdates. Returns True on success. Requires no parameters. */ async deleteWebhook() { return this.request('deleteWebhook', {}); } /** * Use this method to get current webhook status. Requires no parameters. On * success, returns a WebhookInfo object. If the bot is using getUpdates, will * return an object with the url field empty. */ async getWebhookInfo() { return this.request('getWebhookInfo', {}); } /** * A simple method for testing your bot's auth token. Requires no parameters. * Returns basic information about the bot in form of a User object. */ async getMe() { return this.request('getMe', {}); } /** * Use this method to send text messages. On success, the sent Message is returned. */ async sendMessage(params) { return this.request('sendMessage', params); } /** * Use this method to forward messages of any kind. On success, the sent Message is * returned. */ async forwardMessage(params) { return this.request('forwardMessage', params); } /** * Use this method to send photos. On success, the sent Message is returned. */ async sendPhoto(params) { return this.request('sendPhoto', params); } /** * Use this method to send audio files, if you want Telegram clients to display * them in the music player. Your audio must be in the .mp3 format. On success, the * sent Message is returned. Bots can currently send audio files of up to 50 MB in * size, this limit may be changed in the future.For sending voice messages, use * the sendVoice method instead. */ async sendAudio(params) { return this.request('sendAudio', params); } /** * Use this method to send general files. On success, the sent Message is returned. * Bots can currently send files of any type of up to 50 MB in size, this limit may * be changed in the future. */ async sendDocument(params) { return this.request('sendDocument', params); } /** * Use this method to send video files, Telegram clients support mp4 videos (other * formats may be sent as Document). On success, the sent Message is returned. Bots * can currently send video files of up to 50 MB in size, this limit may be changed * in the future. */ async sendVideo(params) { return this.request('sendVideo', params); } /** * Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without * sound). On success, the sent Message is returned. Bots can currently send * animation files of up to 50 MB in size, this limit may be changed in the future. */ async sendAnimation(params) { return this.request('sendAnimation', params); } /** * Use this method to send audio files, if you want Telegram clients to display the * file as a playable voice message. For this to work, your audio must be in an * .ogg file encoded with OPUS (other formats may be sent as Audio or Document). On * success, the sent Message is returned. Bots can currently send voice messages of * up to 50 MB in size, this limit may be changed in the future. */ async sendVoice(params) { return this.request('sendVoice', params); } /** * As of v.4.0, Telegram clients support rounded square mp4 videos of up to 1 * minute long. Use this method to send video messages. On success, the sent * Message is returned. */ async sendVideoNote(params) { return this.request('sendVideoNote', params); } /** * Use this method to send a group of photos or videos as an album. On success, an * array of the sent Messages is returned. */ async sendMediaGroup(params) { return this.request('sendMediaGroup', params); } /** * Use this method to send point on the map. On success, the sent Message is * returned. */ async sendLocation(params) { return this.request('sendLocation', params); } /** * Use this method to edit live location messages sent by the bot or via the bot * (for inline bots). A location can be edited until its live_period expires or * editing is explicitly disabled by a call to stopMessageLiveLocation. On success, * if the edited message was sent by the bot, the edited Message is returned, * otherwise True is returned. */ async editMessageLiveLocation(params) { return this.request('editMessageLiveLocation', params); } /** * Use this method to stop updating a live location message sent by the bot or via * the bot (for inline bots) before live_period expires. On success, if the message * was sent by the bot, the sent Message is returned, otherwise True is returned. */ async stopMessageLiveLocation(params) { return this.request('stopMessageLiveLocation', params); } /** * Use this method to send information about a venue. On success, the sent Message * is returned. */ async sendVenue(params) { return this.request('sendVenue', params); } /** * Use this method to send phone contacts. On success, the sent Message is * returned. */ async sendContact(params) { return this.request('sendContact', params); } /** * Use this method when you need to tell the user that something is happening on * the bot's side. The status is set for 5 seconds or less (when a message arrives * from your bot, Telegram clients clear its typing status). Returns True on * success.Example: The ImageBot needs some time to process a request and upload * the image. Instead of sending a text message along the lines of “Retrieving * image, please wait…”, the bot may use sendChatAction with action = upload_photo. * The user will see a “sending photo” status for the bot. We only recommend using * this method when a response from the bot will take a noticeable amount of time * to arrive. */ async sendChatAction(params) { return this.request('sendChatAction', params); } /** * Use this method to get a list of profile pictures for a user. Returns a * UserProfilePhotos object. */ async getUserProfilePhotos(params) { return this.request('getUserProfilePhotos', params); } /** * Use this method to get basic info about a file and prepare it for downloading. * For the moment, bots can download files of up to 20MB in size. On success, a * File object is returned. The file can then be downloaded via the link * https://api.telegram.org/file/bot<token>/<file_path>, where <file_path> is taken * from the response. It is guaranteed that the link will be valid for at least 1 * hour. When the link expires, a new one can be requested by calling getFile * again. */ async getFile(params) { return this.request('getFile', params); } /** * Use this method to kick a user from a group, a supergroup or a channel. In the * case of supergroups and channels, the user will not be able to return to the * group on their own using invite links, etc., unless unbanned first. The bot must * be an administrator in the chat for this to work and must have the appropriate * admin rights. Returns True on success.Note: In regular groups (non-supergroups), * this method will only work if the ‘All Members Are Admins’ setting is off in the * target group. Otherwise members may only be removed by the group's creator or by * the member that added them. */ async kickChatMember(params) { return this.request('kickChatMember', params); } /** * Use this method to unban a previously kicked user in a supergroup or channel. * The user will not return to the group or channel automatically, but will be able * to join via link, etc. The bot must be an administrator for this to work. * Returns True on success. */ async unbanChatMember(params) { return this.request('unbanChatMember', params); } /** * Use this method to restrict a user in a supergroup. The bot must be an * administrator in the supergroup for this to work and must have the appropriate * admin rights. Pass True for all boolean parameters to lift restrictions from a * user. Returns True on success. */ async restrictChatMember(params) { return this.request('restrictChatMember', params); } /** * Use this method to promote or demote a user in a supergroup or a channel. The * bot must be an administrator in the chat for this to work and must have the * appropriate admin rights. Pass False for all boolean parameters to demote a * user. Returns True on success. */ async promoteChatMember(params) { return this.request('promoteChatMember', params); } /** * Use this method to generate a new invite link for a chat; any previously * generated link is revoked. The bot must be an administrator in the chat for this * to work and must have the appropriate admin rights. Returns the new invite link * as String on success. */ async exportChatInviteLink(params) { return this.request('exportChatInviteLink', params); } /** * Use this method to set a new profile photo for the chat. Photos can't be changed * for private chats. The bot must be an administrator in the chat for this to work * and must have the appropriate admin rights. Returns True on success.Note: In * regular groups (non-supergroups), this method will only work if the ‘All Members * Are Admins’ setting is off in the target group. */ async setChatPhoto(params) { return this.request('setChatPhoto', params); } /** * Use this method to delete a chat photo. Photos can't be changed for private * chats. The bot must be an administrator in the chat for this to work and must * have the appropriate admin rights. Returns True on success.Note: In regular * groups (non-supergroups), this method will only work if the ‘All Members Are * Admins’ setting is off in the target group. */ async deleteChatPhoto(params) { return this.request('deleteChatPhoto', params); } /** * Use this method to change the title of a chat. Titles can't be changed for * private chats. The bot must be an administrator in the chat for this to work and * must have the appropriate admin rights. Returns True on success.Note: In regular * groups (non-supergroups), this method will only work if the ‘All Members Are * Admins’ setting is off in the target group. */ async setChatTitle(params) { return this.request('setChatTitle', params); } /** * Use this method to change the description of a supergroup or a channel. The bot * must be an administrator in the chat for this to work and must have the * appropriate admin rights. Returns True on success. */ async setChatDescription(params) { return this.request('setChatDescription', params); } /** * Use this method to pin a message in a supergroup or a channel. The bot must be * an administrator in the chat for this to work and must have the * ‘can_pin_messages’ admin right in the supergroup or ‘can_edit_messages’ admin * right in the channel. Returns True on success. */ async pinChatMessage(params) { return this.request('pinChatMessage', params); } /** * Use this method to unpin a message in a supergroup or a channel. The bot must be * an administrator in the chat for this to work and must have the * ‘can_pin_messages’ admin right in the supergroup or ‘can_edit_messages’ admin * right in the channel. Returns True on success. */ async unpinChatMessage(params) { return this.request('unpinChatMessage', params); } /** * Use this method for your bot to leave a group, supergroup or channel. Returns * True on success. */ async leaveChat(params) { return this.request('leaveChat', params); } /** * Use this method to get up to date information about the chat (current name of * the user for one-on-one conversations, current username of a user, group or * channel, etc.). Returns a Chat object on success. */ async getChat(params) { return this.request('getChat', params); } /** * Use this method to get a list of administrators in a chat. On success, returns * an Array of ChatMember objects that contains information about all chat * administrators except other bots. If the chat is a group or a supergroup and no * administrators were appointed, only the creator will be returned. */ async getChatAdministrators(params) { return this.request('getChatAdministrators', params); } /** * Use this method to get the number of members in a chat. Returns Int on success. */ async getChatMembersCount(params) { return this.request('getChatMembersCount', params); } /** * Use this method to get information about a member of a chat. Returns a * ChatMember object on success. */ async getChatMember(params) { return this.request('getChatMember', params); } /** * Use this method to set a new group sticker set for a supergroup. The bot must be * an administrator in the chat for this to work and must have the appropriate * admin rights. Use the field can_set_sticker_set optionally returned in getChat * requests to check if the bot can use this method. Returns True on success. */ async setChatStickerSet(params) { return this.request('setChatStickerSet', params); } /** * Use this method to delete a group sticker set from a supergroup. The bot must be * an administrator in the chat for this to work and must have the appropriate * admin rights. Use the field can_set_sticker_set optionally returned in getChat * requests to check if the bot can use this method. Returns True on success. */ async deleteChatStickerSet(params) { return this.request('deleteChatStickerSet', params); } /** * Use this method to send answers to callback queries sent from inline keyboards. * The answer will be displayed to the user as a notification at the top of the * chat screen or as an alert. On success, True is returned.Alternatively, the user * can be redirected to the specified Game URL. For this option to work, you must * first create a game for your bot via @Botfather and accept the terms. Otherwise, * you may use links like t.me/your_bot?start=XXXX that open your bot with a * parameter. */ async answerCallbackQuery(params) { return this.request('answerCallbackQuery', params); } /** * Use this method to edit text and game messages sent by the bot or via the bot * (for inline bots). On success, if edited message is sent by the bot, the edited * Message is returned, otherwise True is returned. */ async editMessageText(params) { return this.request('editMessageText', params); } /** * Use this method to edit captions of messages sent by the bot or via the bot (for * inline bots). On success, if edited message is sent by the bot, the edited * Message is returned, otherwise True is returned. */ async editMessageCaption(params) { return this.request('editMessageCaption', params); } /** * Use this method to edit audio, document, photo, or video messages. If a message * is a part of a message album, then it can be edited only to a photo or a video. * Otherwise, message type can be changed arbitrarily. When inline message is * edited, new file can't be uploaded. Use previously uploaded file via its file_id * or specify a URL. On success, if the edited message was sent by the bot, the * edited Message is returned, otherwise True is returned. */ async editMessageMedia(params) { return this.request('editMessageMedia', params); } /** * Use this method to edit only the reply markup of messages sent by the bot or via * the bot (for inline bots). On success, if edited message is sent by the bot, the * edited Message is returned, otherwise True is returned. */ async editMessageReplyMarkup(params) { return this.request('editMessageReplyMarkup', params); } /** * Use this method to delete a message, including service messages, with the * following limitations: - A message can only be deleted if it was sent less than * 48 hours ago. - Bots can delete outgoing messages in groups and supergroups. - * Bots granted can_post_messages permissions can delete outgoing messages in * channels. - If the bot is an administrator of a group, it can delete any message * there. - If the bot has can_delete_messages permission in a supergroup or a * channel, it can delete any message there. Returns True on success. */ async deleteMessage(params) { return this.request('deleteMessage', params); } /** * Use this method to send .webp stickers. On success, the sent Message is * returned. */ async sendSticker(params) { return this.request('sendSticker', params); } /** * Use this method to get a sticker set. On success, a StickerSet object is * returned. */ async getStickerSet(params) { return this.request('getStickerSet', params); } /** * Use this method to upload a .png file with a sticker for later use in * createNewStickerSet and addStickerToSet methods (can be used multiple times). * Returns the uploaded File on success. */ async uploadStickerFile(params) { return this.request('uploadStickerFile', params); } /** * Use this method to create new sticker set owned by a user. The bot will be able * to edit the created sticker set. Returns True on success. */ async createNewStickerSet(params) { return this.request('createNewStickerSet', params); } /** * Use this method to add a new sticker to a set created by the bot. Returns True * on success. */ async addStickerToSet(params) { return this.request('addStickerToSet', params); } /** * Use this method to move a sticker in a set created by the bot to a specific * position . Returns True on success. */ async setStickerPositionInSet(params) { return this.request('setStickerPositionInSet', params); } /** * Use this method to delete a sticker from a set created by the bot. Returns True * on success. */ async deleteStickerFromSet(params) { return this.request('deleteStickerFromSet', params); } /** * Use this method to send answers to an inline query. On success, True is * returned. No more than 50 results per query are allowed. */ async answerInlineQuery(params) { return this.request('answerInlineQuery', params); } /** * Use this method to send invoices. On success, the sent Message is returned. */ async sendInvoice(params) { return this.request('sendInvoice', params); } /** * If you sent an invoice requesting a shipping address and the parameter * is_flexible was specified, the Bot API will send an Update with a shipping_query * field to the bot. Use this method to reply to shipping queries. On success, True * is returned. */ async answerShippingQuery(params) { return this.request('answerShippingQuery', params); } /** * Once the user has confirmed their payment and shipping details, the Bot API * sends the final confirmation in the form of an Update with the field * pre_checkout_query. Use this method to respond to such pre-checkout queries. On * success, True is returned. Note: The Bot API must receive an answer within 10 * seconds after the pre-checkout query was sent. */ async answerPreCheckoutQuery(params) { return this.request('answerPreCheckoutQuery', params); } /** * Informs a user that some of the Telegram Passport elements they provided * contains errors. The user will not be able to re-submit their Passport to you * until the errors are fixed (the contents of the field for which you returned the * error must change). Returns True on success.Use this if the data submitted by * the user doesn't satisfy the standards your service requires for any reason. For * example, if a birthday date seems invalid, a submitted document is blurry, a * scan shows evidence of tampering, etc. Supply some details in the error message * to make sure the user knows how to correct the issues. */ async setPassportDataErrors(params) { return this.request('setPassportDataErrors', params); } /** * Use this method to send a game. On success, the sent Message is returned. */ async sendGame(params) { return this.request('sendGame', params); } /** * Use this method to set the score of the specified user in a game. On success, if * the message was sent by the bot, returns the edited Message, otherwise returns * True. Returns an error, if the new score is not greater than the user's current * score in the chat and force is False. */ async setGameScore(params) { return this.request('setGameScore', params); } /** * Use this method to get data for high score tables. Will return the score of the * specified user and several of his neighbors in a game. On success, returns an * Array of GameHighScore objects.This method will currently return scores for the * target user, plus two of his closest neighbors on each side. Will also return * the top three users if the user and his neighbors are not among them. Please * note that this behavior is subject to change. */ async getGameHighScores(params) { return this.request('getGameHighScores', params); } } exports.TelegramBotRaw = TelegramBotRaw; //# sourceMappingURL=api.js.map