@xalbex/telegram-bot
Version:
Telegram Bot API for Node.js
634 lines • 28.6 kB
JavaScript
"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