import invariant from 'invariant'; import { Confirm } from 'enquirer'; import { TelegramClient } from 'sibdigital-messaging-apis/packages/messaging-api-telegram'; import getChannelConfig from '../../../shared/getChannelConfig'; import getSubArgs from '../sh/utils/getSubArgs'; import getWebhookFromNgrok from '../../../shared/getWebhookFromNgrok'; import { Channel } from '../../../types'; import { CliContext } from '../..'; import { bold, error, print, warn } from '../../../shared/log'; import help from './help'; export async function getWebhook(_: CliContext): Promise { try { const config = getChannelConfig(Channel.Telegram); const { accessToken } = config; invariant( accessToken, '`accessToken` is not found in the `bottender.config.js` file' ); const client = new TelegramClient({ accessToken, }); const result = await client.getWebhookInfo(); Object.entries(result).forEach(([key, value]) => print(`${key}: ${value}`)); } catch (err) { error('Failed to get Telegram webhook'); if (err.response) { error(`status: ${bold(err.response.status)}`); if (err.response.data) { error(`data: ${bold(JSON.stringify(err.response.data, null, 2))}`); } } else { error(err.message); } return process.exit(1); } } export async function setWebhook(ctx: CliContext): Promise { const argv = getSubArgs(ctx.argv, { '--webhook': String, '-w': '--webhook', '--ngrok-port': String, }); const ngrokPort = argv['--ngrok-port'] || '4040'; let webhook = argv['--webhook']; try { const config = getChannelConfig(Channel.Telegram); const { accessToken, path = '/webhooks/telegram' } = config; invariant( accessToken, '`accessToken` is not found in the `bottender.config.js` file' ); const client = new TelegramClient({ accessToken, }); if (!webhook) { warn('We can not find the webhook callback URL you provided.'); const prompt = new Confirm({ name: 'question', message: `Are you using ngrok (get URL from ngrok server on http://127.0.0.1:${ngrokPort})?`, }); const result = await prompt.run(); if (result) { webhook = `${await getWebhookFromNgrok(ngrokPort)}${path}`; } } invariant( webhook, '`webhook` is required but not found. Use -w to set up or make sure you are running ngrok server.' ); await client.setWebhook(webhook as string); print('Successfully set Telegram webhook callback URL'); } catch (err) { error('Failed to set Telegram webhook'); if (err.response) { error(`status: ${bold(err.response.status)}`); if (err.response.data) { error(`data: ${bold(JSON.stringify(err.response.data, null, 2))}`); } } else { error(err.message); } return process.exit(1); } } export async function deleteWebhook(_: CliContext): Promise { try { const config = getChannelConfig(Channel.Telegram); const { accessToken } = config; invariant( accessToken, '`accessToken` is not found in the `bottender.config.js` file' ); const client = new TelegramClient({ accessToken, }); await client.deleteWebhook(); print('Successfully delete Telegram webhook'); } catch (err) { error('Failed to delete Telegram webhook'); if (err.response) { error(`status: ${bold(err.response.status)}`); if (err.response.data) { error(`data: ${bold(JSON.stringify(err.response.data, null, 2))}`); } } else { error(err.message); } return process.exit(1); } } export default async function main(ctx: CliContext): Promise { const subcommand = ctx.argv._[2]; switch (subcommand) { case 'get': await getWebhook(ctx); break; case 'set': await setWebhook(ctx); break; case 'delete': case 'del': await deleteWebhook(ctx); break; default: error(`Please specify a valid subcommand: get, set, delete`); help(); } }