// @ts-check 'use strict'; // Utils const { html, lrm } = require('../../utils/html'); const { link, scheduleDeletion } = require('../../utils/tg'); const { parse, strip } = require('../../utils/cmd'); const { pMap } = require('../../utils/promise'); // DB const { getUser, nowarns } = require('../../stores/user'); const { listGroups } = require('../../stores/group'); // This handler is very similiar to commands/unban. // When adding a feature here, please consider adding it there too. /** @param { import('../../typings/context').ExtendedContext } ctx */ const nowarnsHandler = async (ctx) => { if (ctx.from?.status !== 'admin') return null; const { targets } = parse(ctx.message); if (targets.length !== 1) { return ctx.replyWithHTML( 'ℹ️ Specify one user to pardon.', ).then(scheduleDeletion()); } const userToUnwarn = await getUser(strip(targets[0])); if (!userToUnwarn) { return ctx.replyWithHTML( '❓ User unknown.', ).then(scheduleDeletion()); } const { warns } = userToUnwarn; if (warns.length === 0) { return ctx.replyWithHTML( html`ℹ️ ${link(userToUnwarn)} already has no warnings.`, ); } if (userToUnwarn.status === 'banned') { await pMap(await listGroups({ type: 'supergroup' }), (group) => ctx.telegram.unbanChatMember(group.id, userToUnwarn.id)); } await nowarns(userToUnwarn); if (userToUnwarn.status === 'banned') { ctx.telegram.sendMessage( userToUnwarn.id, '♻️ You were unbanned from all of the /groups!', ).catch(() => null); // it's likely that the banned person haven't PMed the bot, // which will cause the sendMessage to fail, // hance .catch(noop) // (it's an expected, non-critical failure) } return ctx.loggedReply(html` ♻️ ${lrm}${ctx.from.first_name} pardoned ${link(userToUnwarn)} for all of their warnings. `); }; module.exports = nowarnsHandler;