90 lines
2.7 KiB
JavaScript
90 lines
2.7 KiB
JavaScript
const config = require('../config');
|
|
const Eris = require('eris');
|
|
const threadUtils = require('../threadUtils');
|
|
const transliterate = require("transliteration");
|
|
const erisEndpoints = require('eris/lib/rest/Endpoints');
|
|
|
|
module.exports = bot => {
|
|
const addInboxServerCommand = (...args) => threadUtils.addInboxServerCommand(bot, ...args);
|
|
|
|
addInboxServerCommand('move', async (msg, args, thread) => {
|
|
if (! config.allowMove) return;
|
|
|
|
if (! thread) return;
|
|
|
|
const searchStr = args[0];
|
|
if (! searchStr || searchStr.trim() === '') return;
|
|
|
|
const normalizedSearchStr = transliterate.slugify(searchStr);
|
|
|
|
const categories = msg.channel.guild.channels.filter(c => {
|
|
// Filter to categories that are not the thread's current parent category
|
|
return (c instanceof Eris.CategoryChannel) && (c.id !== msg.channel.parentID);
|
|
});
|
|
|
|
if (categories.length === 0) return;
|
|
|
|
// See if any category name contains a part of the search string
|
|
const containsRankings = categories.map(cat => {
|
|
const normalizedCatName = transliterate.slugify(cat.name);
|
|
|
|
let i = 0;
|
|
do {
|
|
if (! normalizedCatName.includes(normalizedSearchStr.slice(0, i + 1))) break;
|
|
i++;
|
|
} while (i < normalizedSearchStr.length);
|
|
|
|
if (i > 0 && normalizedCatName.startsWith(normalizedSearchStr.slice(0, i))) {
|
|
// Slightly prioritize categories that *start* with the search string
|
|
i += 0.5;
|
|
}
|
|
|
|
return [cat, i];
|
|
});
|
|
|
|
// Sort by best match
|
|
containsRankings.sort((a, b) => {
|
|
return a[1] > b[1] ? -1 : 1;
|
|
});
|
|
|
|
if (containsRankings[0][1] === 0) {
|
|
thread.postSystemMessage('No matching category');
|
|
return;
|
|
}
|
|
|
|
const targetCategory = containsRankings[0][0];
|
|
|
|
try {
|
|
await bot.editChannel(thread.channel_id, {
|
|
parentID: targetCategory.id
|
|
});
|
|
} catch (e) {
|
|
thread.postSystemMessage(`Failed to move thread: ${e.message}`);
|
|
return;
|
|
}
|
|
|
|
// If enabled, sync thread channel permissions with the category it's moved to
|
|
if (config.syncPermissionsOnMove) {
|
|
const newPerms = Array.from(targetCategory.permissionOverwrites.map(ow => {
|
|
return {
|
|
id: ow.id,
|
|
type: ow.type,
|
|
allow: ow.allow,
|
|
deny: ow.deny
|
|
};
|
|
}));
|
|
|
|
try {
|
|
await bot.requestHandler.request("PATCH", erisEndpoints.CHANNEL(thread.channel_id), true, {
|
|
permission_overwrites: newPerms
|
|
});
|
|
} catch (e) {
|
|
thread.postSystemMessage(`Thread moved to ${targetCategory.name.toUpperCase()}, but failed to sync permissions: ${e.message}`);
|
|
return;
|
|
}
|
|
}
|
|
|
|
thread.postSystemMessage(`Thread moved to ${targetCategory.name.toUpperCase()}`);
|
|
});
|
|
};
|