// @ts-check
'use strict';
// Utils
const { displayUser, scheduleDeletion } = require('../../utils/tg');
const { html, lrm } = require('../../utils/html');
const { parse, strip } = require('../../utils/cmd');
const { pMap } = require('../../utils/promise');
// DB
const { listGroups } = require('../../stores/group');
const { getUser, unban } = require('../../stores/user');
/** @param { import('../../typings/context').ExtendedContext } ctx */
const unbanHandler = 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 unban.',
).then(scheduleDeletion());
}
const userToUnban = await getUser(strip(targets[0]));
if (!userToUnban) {
return ctx.replyWithHTML(
'❓ User unknown.',
).then(scheduleDeletion());
}
if (userToUnban.status !== 'banned') {
return ctx.replyWithHTML('ℹ️ User is not banned.');
}
await pMap(await listGroups({ type: 'supergroup' }), (group) =>
ctx.telegram.unbanChatMember(group.id, userToUnban.id));
await unban(userToUnban);
ctx.telegram.sendMessage(
userToUnban.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} unbanned ${displayUser(userToUnban)}.
`);
};
module.exports = unbanHandler;