Clone the repo and cd to Telegram
directory
yarn
yarn dev
variable | default | use |
---|---|---|
API_URI | localhost:3000 | api url |
TOKEN | 485892696:AAHOHg3Sk2CNUt_ArGuv09qxGv9eqJuiY78 | telegram bot token |
API_TELEGRAM_SECRET | apitelegramsecret | secret key shared between api and telegram |
In order to add a new command to the telegram bot 3 steps must be completed
- Define the command key, summary and description
- Create a handler for the command
- Link the command with it's handler
- Update bot in-chat command list Optional
How to do so?
Open up constants and define your new command. You must edit COMMAND
and COMMAND_DESCRIPTION
.
On COMMAND
you have to define a key: value pair where key
is how the command will be referenced on the project's code (Ej: COMMAND.help
), value
is the string that users will have to type to invoke this command (Ej: /help
).
On COMMAND_DESCRIPTION
you define the summary and description of the command. In order to do so you have to use the same key you defined on COMMAND
(Ej: [COMMAND.help]: { summary: '', description: ''}
). summary
is the command definition that will be shown on chat when a user types /
. description
will be shown when the /help
command is invoked (or /help yourCommand
).
Go to commands and create a new file for your command. Use the same key you defined on COMMAND
for this file's name (Ej: help.js
). This is just convention. Go ahead and copy and paste this code:
const invoke = async ctx => {
return ctx.sendMarkdown(`The command ${ctx.command.name} was invoked`)
}
const answer = async ctx => {
return ctx.sendMarkdown(`The command ${ctx.command.name} was answered`)
}
module.exports = async bot => bot.invoke(invoke).answer(answer)
invoke
will be called when the command is invoked (Ej: /help
). answer
will be called when a user types after invoking a command (Ej: /products
and then typing 1 2 3
will show products 1, 2 and 3). Both functions must return a Promise. sendMarkdown
is a function that renders whatever string you pass it to markdown (created by the markdown middleware). You can use axios
here to communicate with the api
. It's already configured with the baseUrl
and Secret
header. You can just:
const axios = require('axios')
axios.get('/products') // Will fetch all products from api
Open configCommands and link your newly created command handler with it's command key. Edit the configCommand
Object adding your command key (Ej: COMMAND.help
) and it's handler (Ej: require('./commands/help')
) defining their connection (Ej: [COMMAND.help]: require('./commands/help')
).
And you're done! You should be able to use your new command talking to the bots
Beware that currently we're working with only one bot (one token) so the production bot may answer your commands. You can check if a response comes from the dev bot if it's message starts with DEV.
Optional
In order for the bot to show all available commands when writing /
on a telegram chat we must update the command list with botfather. In order to do so @negebauer must talk to botfather. Run yarn botfather
on this folder and send the output to http://telegram.me/negebauer.