const humanizeDuration = require("humanize-duration"); const moment = require("moment"); const blocked = require("../data/blocked"); const utils = require("../utils"); module.exports = ({ bot, knex, config, commands }) => { async function removeExpiredBlocks() { const expiredBlocks = await blocked.getExpiredBlocks(); const logChannel = utils.getLogChannel(); for (const userId of expiredBlocks) { await blocked.unblock(userId); logChannel.createMessage(`Block of <@!${userId}> (id \`${userId}\`) expired`); } } async function expiredBlockLoop() { try { removeExpiredBlocks(); } catch (e) { console.error(e); } setTimeout(expiredBlockLoop, 2000); } bot.on("ready", expiredBlockLoop); const blockCmd = async (msg, args, thread) => { const userIdToBlock = args.userId || (thread && thread.user_id); if (! userIdToBlock) return; const isBlocked = await blocked.isBlocked(userIdToBlock); if (isBlocked) { msg.channel.createMessage("User is already blocked"); return; } const expiresAt = args.blockTime ? moment.utc().add(args.blockTime, "ms").format("YYYY-MM-DD HH:mm:ss") : null; const user = bot.users.get(userIdToBlock); await blocked.block(userIdToBlock, (user ? `${user.username}#${user.discriminator}` : ""), msg.author.id, expiresAt); if (expiresAt) { const humanized = humanizeDuration(args.blockTime, { largest: 2, round: true }); msg.channel.createMessage(`Blocked <@${userIdToBlock}> (id \`${userIdToBlock}\`) from modmail for ${humanized}`); } else { msg.channel.createMessage(`Blocked <@${userIdToBlock}> (id \`${userIdToBlock}\`) from modmail indefinitely`); } }; commands.addInboxServerCommand("block", " [blockTime:delay]", blockCmd); commands.addInboxServerCommand("block", "[blockTime:delay]", blockCmd); const unblockCmd = async (msg, args, thread) => { const userIdToUnblock = args.userId || (thread && thread.user_id); if (! userIdToUnblock) return; const isBlocked = await blocked.isBlocked(userIdToUnblock); if (! isBlocked) { msg.channel.createMessage("User is not blocked"); return; } const unblockAt = args.unblockDelay ? moment.utc().add(args.unblockDelay, "ms").format("YYYY-MM-DD HH:mm:ss") : null; const user = bot.users.get(userIdToUnblock); if (unblockAt) { const humanized = humanizeDuration(args.unblockDelay, { largest: 2, round: true }); await blocked.updateExpiryTime(userIdToUnblock, unblockAt); msg.channel.createMessage(`Scheduled <@${userIdToUnblock}> (id \`${userIdToUnblock}\`) to be unblocked in ${humanized}`); } else { await blocked.unblock(userIdToUnblock); msg.channel.createMessage(`Unblocked <@${userIdToUnblock}> (id ${userIdToUnblock}) from modmail`); } }; commands.addInboxServerCommand("unblock", " [unblockDelay:delay]", unblockCmd); commands.addInboxServerCommand("unblock", "[unblockDelay:delay]", unblockCmd); commands.addInboxServerCommand("is_blocked", "[userId:userId]",async (msg, args, thread) => { const userIdToCheck = args.userId || (thread && thread.user_id); if (! userIdToCheck) return; const blockStatus = await blocked.getBlockStatus(userIdToCheck); if (blockStatus.isBlocked) { if (blockStatus.expiresAt) { msg.channel.createMessage(`<@!${userIdToCheck}> (id \`${userIdToCheck}\`) is blocked until ${blockStatus.expiresAt} (UTC)`); } else { msg.channel.createMessage(`<@!${userIdToCheck}> (id \`${userIdToCheck}\`) is blocked indefinitely`); } } else { msg.channel.createMessage(`<@!${userIdToCheck}> (id \`${userIdToCheck}\`) is NOT blocked`); } }); };