2
0
mirror of https://github.com/thedevs-network/the-guard-bot synced 2025-08-24 02:47:48 +00:00

100 lines
2.6 KiB
JavaScript
Raw Normal View History

2020-05-08 21:30:49 +02:00
// @ts-check
'use strict';
// Utils
2020-05-08 21:30:49 +02:00
const { displayUser, scheduleDeletion } = require('../../utils/tg');
2020-05-12 18:03:07 +02:00
const { html, TgHtml } = require('../../utils/html');
2020-05-08 21:30:49 +02:00
const { isMaster, isWarnNotExpired } = require('../../utils/config');
const { parse, strip } = require('../../utils/cmd');
// DB
2017-11-02 16:54:17 +01:00
const { getUser } = require('../../stores/user');
const formatDate = date =>
date && date.toISOString().slice(0, -5).replace('T', ' ');
2019-05-02 21:42:13 +02:00
2020-05-13 15:11:43 +02:00
/**
* @param {string} defaultVal
*/
2019-05-02 21:42:13 +02:00
const formatEntry = async (entry, defaultVal) => {
2020-05-13 15:11:43 +02:00
if (!entry || !entry.by_id) return html`${defaultVal}`;
2019-05-02 21:42:13 +02:00
const { first_name } = await getUser({ id: entry.by_id }) || {};
2019-05-04 14:06:24 +02:00
if (!first_name) return html`${entry.reason} (${formatDate(entry.date)})`;
2019-05-02 21:42:13 +02:00
return html`${entry.reason} (${first_name}, ${formatDate(entry.date)})`;
};
const formatWarn = async (warn, i) =>
2020-05-08 21:30:49 +02:00
isWarnNotExpired(new Date())(warn)
? html`${i + 1}. ${await formatEntry(warn, warn)}`
: html`<del>${i + 1}. ${await formatEntry(warn, warn)}</del>`;
2019-05-02 21:42:13 +02:00
2020-05-13 15:11:43 +02:00
/**
* @param {TgHtml} content
*/
const isNotEmpty = content => !!content.toJSON();
/**
* @param {TgHtml} content
*/
const optional = (header, sep, content) =>
isNotEmpty(content)
? html`${header}${sep}${content}`
: html``;
2019-05-02 21:42:13 +02:00
2020-05-08 21:30:49 +02:00
const title = user => {
if (isMaster(user)) {
return html`🕴️ <b>Bot master</b>`;
} else if (user.status === 'admin') {
return html`⭐️ <b>Admin</b>`;
}
return html`👤 <b>User</b>`;
};
2020-03-10 22:10:48 +01:00
/** @param { import('../../typings/context').ExtendedContext } ctx */
2020-05-12 18:03:07 +02:00
const getWarnsHandler = async ({ from, message, replyWithHTML }) => {
if (!from) {
2020-05-12 18:03:07 +02:00
return replyWithHTML(
' <b>This command is not available in channels.</b>',
).then(scheduleDeletion());
}
const { targets } = parse(message);
if (targets.length > 1) {
2020-05-12 18:03:07 +02:00
return replyWithHTML(
2019-05-02 21:42:13 +02:00
' <b>Specify one user.</b>',
).then(scheduleDeletion());
}
const theUser = targets.length && from.status === 'admin'
? await getUser(strip(targets[0]))
: from;
if (!theUser) {
2020-05-12 18:03:07 +02:00
return replyWithHTML(
'❓ <b>User unknown.</b>',
).then(scheduleDeletion());
}
2020-05-12 18:03:07 +02:00
const header = html`${title(theUser)} ${displayUser(theUser)}`;
2019-05-02 21:42:13 +02:00
const banReason = optional(
2020-05-13 15:11:43 +02:00
html`🚫 <b>Ban reason:</b>`,
' ',
await formatEntry(theUser.ban_details, theUser.ban_reason || ''),
2019-05-02 21:42:13 +02:00
);
2020-05-08 21:30:49 +02:00
const { warns = [] } = theUser;
2019-05-02 21:42:13 +02:00
const userWarns = optional(
2020-05-13 15:11:43 +02:00
html`<b>⚠️ Warns:</b>`,
'\n',
2020-05-12 18:03:07 +02:00
TgHtml.join('\n', await Promise.all(warns.map(formatWarn))),
2019-05-02 21:42:13 +02:00
);
2020-05-12 18:03:07 +02:00
return replyWithHTML(TgHtml.join('\n\n', [
header,
userWarns,
2017-11-05 20:41:31 +03:30
banReason,
2020-05-13 15:11:43 +02:00
].filter(isNotEmpty))).then(scheduleDeletion());
};
module.exports = getWarnsHandler;