diff --git a/cmds/moderation/mute.js b/cmds/moderation/mute.js index 501bd87..e5eb08d 100644 --- a/cmds/moderation/mute.js +++ b/cmds/moderation/mute.js @@ -1,7 +1,7 @@ 'use strict'; const commando = require("@iceprod/discord.js-commando"); -const { trySend, findMemberRegEx, cleanMentionID, findChannelRegEx, findRoleRegEx, defaultImageEmbed, parseDoubleDash, parseComa } = require("../../resources/functions"); +const { trySend, findMemberRegEx, cleanMentionID, findChannelRegEx, findRoleRegEx, defaultImageEmbed, parseDoubleDash, parseComa, getRole } = require("../../resources/functions"); const { database } = require("../../database/mongo"); const col = database.collection("Guild"); const schedule = database.collection("Schedule"); @@ -47,7 +47,7 @@ module.exports = class mute extends commando.Command { group: "moderation", description: "Mute.", guildOnly: true, - userPermissions:['MANAGE_ROLES'] + userPermissions: ['MANAGE_ROLES'] }); } /** @@ -56,42 +56,37 @@ module.exports = class mute extends commando.Command { * @returns */ async run(msg, arg) { - const doc = await col.findOne({document: msg.guild.id}), - modDoc = doc?.["moderation"], - muteSettingsDoc = modDoc?.["settings"]?.mute, - defaultDurationDoc = muteSettingsDoc?.defaultDuration, - infractionsDoc = modDoc?.infractions, - args = parseDoubleDash(arg), - mentions = parseComa(args.shift()), - durationRegExp = /\d+(?![^ymwdhs])[ymwdhs]?o?/gi, - invokedAt = msg.createdAt, - duration = { - year: invokedAt.getFullYear(), - month: invokedAt.getMonth(), - date: invokedAt.getDate(), - hour: invokedAt.getHours(), - minute: invokedAt.getMinutes(), - second: invokedAt.getSeconds() - }; + if (!msg.guild.dbLoaded) msg.guild.dbLoad(); + const muteSettingsDoc = msg.guild.moderation.mute, + defaultDurationDoc = muteSettingsDoc.defaultDuration, + args = parseDoubleDash(arg), + mentions = parseComa(args.shift()), + durationRegExp = /\d+(?![^ymwdhs])[ymwdhs]?o?/gi, + invokedAt = msg.createdAt, + duration = { + year: invokedAt.getFullYear(), + month: invokedAt.getMonth(), + date: invokedAt.getDate(), + hour: invokedAt.getHours(), + minute: invokedAt.getMinutes(), + second: invokedAt.getSeconds() + }; let theSettingUp = { role: undefined, defaultDuration: { date: undefined, string: undefined - }, - logChannel: undefined + } }, - durationHasSet = false, - settingUp = false, - settingRole = false, - settingRoleHasSet = false, - settingDuration = false, - settingDurationHasSet = false, - settingLogChannel = false, - settingLogChannelHasSet = false, - [timeForMessage, targetUser] = [["Indefinite"], []], - reason = "No reason provided.", - resultMsg = ""; + durationHasSet = false, + settingUp = false, + settingRole = false, + settingRoleHasSet = false, + settingDuration = false, + settingDurationHasSet = false, + [timeForMessage, targetUser] = [["Indefinite"], []], + reason = "No reason provided.", + resultMsg = ""; for (const argument of args) { const setArg = argument.toLowerCase().trim(); if (/^settings?$/i.test(setArg)) { @@ -100,9 +95,6 @@ module.exports = class mute extends commando.Command { if (settingUp && /^durations?$/i.test(setArg)) { settingDuration = true; } - if (settingUp && /^log$/i.test(setArg)) { - settingLogChannel = true; - } if (settingUp && /^role$/i.test(setArg)) { settingRole = true; } @@ -141,41 +133,13 @@ module.exports = class mute extends commando.Command { } durationHasSet = true; } else { - if (!settingRole && !settingLogChannel && argument.length > 0 && argument !== "--") { + if (!settingRole && argument.length > 0 && argument !== "--") { reason = argument.trim(); } else { - if (settingLogChannel && !settingLogChannelHasSet && argument.length > 0 && argument !== "--" && setArg !== "log") { - settingLogChannelHasSet = true; - const key = cleanMentionID(argument); - let logChannel; - if (/^\d{17,19}$/.test(key)) { - logChannel = msg.guild.channels.cache.get(argument); - } else { - const found = findChannelRegEx(msg, key); - logChannel = found[0]; - } - if (/^none$/i.test(key)) { - logChannel = undefined; - } - if (logChannel || /^none$/i.test(key)) { - theSettingUp.logChannel = logChannel?.id; - } else { - resultMsg += `No channel found for: **${argument}**\n`; - } - } if (settingRole && !settingRoleHasSet && argument.length > 0 && argument !== "--" && setArg !== "role") { settingRoleHasSet = true; const key = cleanMentionID(argument); - let role; - if (/^\d{17,19}$/.test(key)) { - role = msg.guild.roles.cache.get(argument); - } else { - const found = findRoleRegEx(msg, key); - role = found[0]?.id; - } - if (/^none$/i.test(key)) { - role = undefined; - } + let role = getRole(msg.guild, key)?.id; if (role || /^none$/i.test(key)) { theSettingUp.role = role; } else { @@ -187,7 +151,7 @@ module.exports = class mute extends commando.Command { } const roleConfCheck = msg.guild.roles.cache.get(muteSettingsDoc?.role); if (!roleConfCheck && !settingUp) { - return trySend(this.clientPermissions, msg, `No mute role configured! Run \`${msg.guild.commandPrefix}${this.name} --settings <--role --> [--duration -- | --log --]\` to set it up.`); + resultMsg += `No mute role configured! Run \`${msg.guild.commandPrefix}${this.name} --settings <--role --> [--duration --\` to set it up.`; } let untilDate = new Date(String(duration.year), String(duration.month), String(duration.date), String(duration.hour), String(duration.minute), String(duration.second)); if (untilDate.toString() === "Invalid Date") untilDate = "Indefinite"; @@ -201,31 +165,31 @@ module.exports = class mute extends commando.Command { if (untilDate instanceof Date) { timeForMessage = []; const elapsedTime = new Date(untilDate.valueOf() - invokedAt.valueOf() + 1000), - elapsed = [ - elapsedTime.getFullYear() - 1970, - elapsedTime.getMonth(), - elapsedTime.getDate() - 1, - elapsedTime.getHours(), - elapsedTime.getMinutes(), - elapsedTime.getSeconds() - ], - elapsedName = [ - "year", - "month", - "day", - "hour", - "minute", - "second" - ]; + elapsed = [ + elapsedTime.getFullYear() - 1970, + elapsedTime.getMonth(), + elapsedTime.getDate() - 1, + elapsedTime.getHours(), + elapsedTime.getMinutes(), + elapsedTime.getSeconds() + ], + elapsedName = [ + "year", + "month", + "day", + "hour", + "minute", + "second" + ]; for (let index = 0; index < elapsed.length; index++) { if (elapsed[index] > 0) { let mes = `${elapsed[index]} ${elapsedName[index]}`; if (elapsed[index] > 1) { mes += "s"; - } else {} + } else { } timeForMessage.push(mes); - } else {} + } else { } } if (timeForMessage.length > 1) { timeForMessage[timeForMessage.length - 2] += " and"; @@ -233,43 +197,35 @@ module.exports = class mute extends commando.Command { if (settingDuration && !settingDurationHasSet && timeForMessage.length > 0) { settingDurationHasSet = true; theSettingUp.defaultDuration.date = elapsedTime, - theSettingUp.defaultDuration.string = timeForMessage.join(" "); + theSettingUp.defaultDuration.string = timeForMessage.join(" "); } } - if (settingUp) { - if(settingRoleHasSet) { - await col.updateOne({document:msg.guild.id}, {$set:{"moderation.settings.mute.role":theSettingUp.role}}, {upsert:true}).catch(e => {return trySend(this.client, msg, "```js\n"+e.stack+"```")}); + if (settingUp || !roleConfCheck && !settingUp) { + if (settingRoleHasSet) { + await col.updateOne({ document: msg.guild.id }, { $set: { "moderation.settings.mute.role": theSettingUp.role } }, { upsert: true }).catch(e => { return trySend(this.client, msg, "```js\n" + e.stack + "```") }); } if (durationHasSet) { - await col.updateOne({document:msg.guild.id}, {$set:{"moderation.settings.mute.defaultDuration":theSettingUp.defaultDuration}}, {upsert:true}).catch(e => {return trySend(this.client, msg, "```js\n"+e.stack+"```")}); + await col.updateOne({ document: msg.guild.id }, { $set: { "moderation.settings.mute.defaultDuration": theSettingUp.defaultDuration } }, { upsert: true }).catch(e => { return trySend(this.client, msg, "```js\n" + e.stack + "```") }); } - if (settingLogChannelHasSet) { - await col.updateOne({document:msg.guild.id}, {$set:{"moderation.settings.mute.logChannel":theSettingUp.logChannel}}, {upsert:true}).catch(e => {return trySend(this.client, msg, "```js\n"+e.stack+"```")}); - } - const doc = await col.findOne({document: msg.guild.id}), - modDoc = doc?.["moderation"], - muteSettingsDoc = modDoc?.["settings"]?.mute, - defaultDurationDoc = muteSettingsDoc?.defaultDuration, - logChannelDoc = muteSettingsDoc?.logChannel, - roleDoc = muteSettingsDoc?.role; + const defaultDurationDoc = muteSettingsDoc?.defaultDuration, + roleDoc = muteSettingsDoc?.role; let settings = defaultImageEmbed(msg); settings - .setTitle("Mute Configuration") - .addField("Role", roleDoc ? "<@&"+roleDoc+">" : "Not set") - .addField("Duration", defaultDurationDoc?.string ?? "Not set") - .addField("Log", logChannelDoc ? "<#"+logChannelDoc+">" : "Not set"); - return trySend(this.client, msg, {content:resultMsg, embed:settings}); + .setTitle("Mute Configuration") + .addField("Role", roleDoc ? "<@&" + roleDoc + ">" : "Not set") + .addField("Duration", defaultDurationDoc?.string ?? "Not set"); + return trySend(this.client, msg, { content: resultMsg, embed: settings }); } for (const usermention of mentions) { if (usermention.length > 0) { let found = [], - nameid = cleanMentionID(usermention); + nameid = cleanMentionID(usermention); if (/^\d{17,19}$/.test(nameid)) { const findmem = msg.guild.member(nameid); if (findmem) { found.push(findmem.user); } else { - await this.client.users.fetch(nameid).then(fetchUser => found.push(fetchUser)).catch(() => {}); + await this.client.users.fetch(nameid).then(fetchUser => found.push(fetchUser)).catch(() => { }); } } else { found = findMemberRegEx(msg, nameid).map(r => r.user); @@ -289,26 +245,26 @@ module.exports = class mute extends commando.Command { } } else { if (!settingUp && mentions[0].length === 0) { - return trySend(this.client, msg, "Who do you wanna mute? Provide as first argument `<[RegExp | user_[mention | ID]]>`. Use `,` to provide more than one user. Use `--` to split arguments.\nExample:```js\n" + `${msg.guild.commandPrefix}${this.name} 832423842785623423, @Shasha#1234, retard wanna get muted, #6969, ^fuck\\s(ur)?\\s.{5}#\\d+69$--69y69mo69w420d420h420m420s--Saying "joe"\`\`\``); + return trySend(this.client, msg, "Args: `<[user_[mention|ID|name]]> -- [reason] -- [duration]`. Use `,` to provide multiple user.\nExample:```js\n" + `${msg.guild.commandPrefix}${this.name} 580703409934696449, @Shasha#1234, ur mom,#6969,^fuck\\s(ur)?\\s.{5}#\\d+69$--69y69mo69w420d420h420m420s -- Saying "joe"\`\`\``); } } } let infractionToDoc; if (targetUser.length > 0) { let targetMember = [], - notInServer = []; + notInServer = []; for (const user of targetUser) { const member = msg.guild.member(user); if (member) { const pushIt = member.toJSON(); - pushIt.roles = member.roles.cache.map(r => r.id); + pushIt.rolesID = member.roles.cache.map(r => r.id); targetMember.push(pushIt); } else { const pushIt = user.toJSON(); notInServer.push(pushIt); } } - const infractionCase = infractionsDoc?.map(r => r.infraction)?.length; + const infractionCase = msg.guild.infractions?.length; infractionToDoc = { infraction: infractionCase ? infractionCase + 1 : 1, by: targetUser, @@ -318,47 +274,47 @@ module.exports = class mute extends commando.Command { for: timeForMessage, until: untilDate, reason: reason, - scene: msg.url, + msg: msg.toJSON(), members: targetMember, users: notInServer } - await col.updateOne({document: msg.guild.id}, { $push:{"moderation.infractions": infractionToDoc}}, {upsert:true}); - const newUnmuteSchedule = { - name: "unmute", - path: "./scheduler/unmute.js", - worker: { - argv: [msg, infractionToDoc.infraction] - }, - date: untilDate - } + await col.updateOne({ document: msg.guild.id }, { $push: { "moderation.infractions": infractionToDoc } }, { upsert: true }); + const NAME = msg.guild.id + "/" + infractionToDoc.infraction, + newUnmuteSchedule = { + name: NAME, + path: "./scheduler/unmute.js", + worker: { + argv: [NAME] + }, + date: untilDate + }; } resultMsg += `Result:\`\`\`js\nUsers: ${targetUser.map(r => r?.tag).join(", ")}\nReason: ${reason}\nAt: ${invokedAt.toUTCString()}\nFor: ${timeForMessage.join(" ")}\nUntil: ${typeof untilDate !== "string" ? untilDate.toUTCString() : untilDate}\`\`\``; - trySend(this.client, msg, {content:resultMsg+"```js\n" + JSON.stringify(infractionToDoc, null, 2) + "```",split:{maxLength: 2000,append:",```",prepend:"```js\n",char:","}}); - return + return trySend(this.client, msg, { content: resultMsg + "```js\n" + JSON.stringify(infractionToDoc, null, 2) + "```", split: { maxLength: 2000, append: ",```", prepend: "```js\n", char: "," } }); } }; - /* if (config.mute.role.length === 0) { - return msg.channel.send(`Mute role isn't set! Run \`${this.client.commandPrefix}mute --role \`. If you insist i will just give them admin perms <:purifyLife:774102054046007298>`) - } - if (setArgs) { - for(let set of setArgs) { - set = set.toLowerCase(); - switch(set) { - case startsWith('role'): { - let role = set.slice('role'.length).trim(); - if (role.startsWith('<&')) { - role = role.slice(2,-1); - } - //const foundRole = - } - } +/* if (config.mute.role.length === 0) { + return msg.channel.send(`Mute role isn't set! Run \`${this.client.commandPrefix}mute --role \`. If you insist i will just give them admin perms <:purifyLife:774102054046007298>`) +} +if (setArgs) { + for(let set of setArgs) { + set = set.toLowerCase(); + switch(set) { + case startsWith('role'): { + let role = set.slice('role'.length).trim(); + if (role.startsWith('<&')) { + role = role.slice(2,-1); } - }*/ + //const foundRole = + } + } + } +}*/ //scheduler.add() - /*const yearDate = dateDur.getFullYear(); - const monthDate = dateDur.getMonth(); - const dayDate = dateDur.getDay(); - const hourDate = dateDur.getHours(); - const minuteDate = dateDur.getMinutes(); - const secondDate = dateDur.getSeconds();*/ \ No newline at end of file +/*const yearDate = dateDur.getFullYear(); +const monthDate = dateDur.getMonth(); +const dayDate = dateDur.getDay(); +const hourDate = dateDur.getHours(); +const minuteDate = dateDur.getMinutes(); +const secondDate = dateDur.getSeconds();*/ \ No newline at end of file diff --git a/cmds/profile/profile.js b/cmds/profile/profile.js index a67a47c..ab3a1ce 100644 --- a/cmds/profile/profile.js +++ b/cmds/profile/profile.js @@ -23,7 +23,7 @@ module.exports = class profile extends commando.Command { */ async run(msg, arg) { let TM; - if (!arg) TM = msg.author; else TM = getUser(msg, arg); + if (!arg) TM = msg.author; else TM = getUser(msg, arg, true); if (!TM) return trySend(msg.client, msg, "Bro stop lookin for yo imaginary gf"); const MEM = msg.guild.member(TM), emb = defaultImageEmbed(msg, null, `\`${TM.tag}\`'s Profile`); diff --git a/cmds/utility/embmaker.js b/cmds/utility/embmaker.js index ee4156d..4e3db03 100644 --- a/cmds/utility/embmaker.js +++ b/cmds/utility/embmaker.js @@ -1,10 +1,27 @@ "use strict"; const commando = require("@iceprod/discord.js-commando"); -const { MessageEmbed, GuildChannel } = require("discord.js"); +const { MessageEmbed, GuildChannel, Message } = require("discord.js"); const { ranLog, errLog, getChannelMessage, noPerm, tryReact, trySend, cleanMentionID, getChannel, adCheck, parseDash, reValidURL, parseDoubleDash, defaultImageEmbed } = require("../../resources/functions"); const getColor = require("../../resources/getColor"); const emoteMessage = require("../../resources/emoteMessage"); +const HELP = { + desc: `**Embed creator:** You can just copy this template and remove unneeded argument. Every argument are optional.` + + `\n\`--j\` JSON: \`[MessageEmbed JSON Object]\`,\n\`--t\` Title: \`[text]\`,\n\`--d\` Description: \`[text]\`,\n\`--a\` Author:\n\` -n\` Name: \`[text]\`,\n\` -i\` Icon: \`[url]\`,\n` + + `\` -u\` URL: \`[url]\`,\n\`--c\` Color: \`[hex|number|name]\`,\n\`--i\` Image: \`[url]\`,\n\`--th\` Thumbnail: \`[url]\`,\n` + + `\`--u\` URL: \`[url]\`,\n\`--f\` Add Field:\n\` -n\` Name: \`[text]\`,\n\` -d\` Description: \`[text]\`,\n\` -i\` Inline: True if provided,\n` + + `\`--fo\` Footer:\n\` -t\` Text: \`[text]\`,\n\` -i\` Icon: \`[url]\`,\n\`--co\` Content: \`[text]\`,\n\`--ch\` Channel: \`[mention|ID|name]\`,\n` + + `\`--ti\` Timestamp: \`[ISO 8601|UNIX (Milliseconds)]\` - Use https://time.lol ,\n` + + `\`--at\` Attachments: \`[url]\` - You can put \`-c\` when editing to copy all existing message attachments ` + + `(Cannot remove existing attachment unless \`--ch\` provided).\n\n**Embed editor:** ` + + `You can put\n\`--e\` Edit: \`<[message_[ID|link]|channel_[mention|ID] message_ID]>\`` + + `\nas first argument to edit the embed in provided message. All existing property will be replaced ` + + `with provided argument. Put\n\`--r\` Remove [Author, Fields, Footer]: \`[a, f, fo]\`\nto remove all existing property ` + + `of the provided argument in the embed.\n\nOther arguments:\n\`--q\` Quote: \`<[message_[ID|link]|channel_[mention|ID] message_ID]>\`` + + ` - Quote a message.`, + fields: [ + ] +}; module.exports = class embmaker extends commando.Command { constructor(client) { @@ -14,26 +31,12 @@ module.exports = class embmaker extends commando.Command { aliases: ["embed-maker", "creat-emb", "creat-embed", "embed"], group: "utility", description: "Embed creator.", - details: - `**Embed creator:** You can just copy this template and remove unneeded argument. Every argument are optional.` + - `,\n\`--j\` JSON: \`[MessageEmbed JSON Object]\`,\n\`--t\` Title: \`[text]\`,\n\`--d\` Description: \`[text]\`,\n\`--a\` Author:\n\` -n\` Name: \`[text]\`,\n\` -i\` Icon: \`[url]\`,\n` + - `\` -u\` URL: \`[url]\`,\n\`--c\` Color: \`[hex|number|name]\`,\n\`--i\` Image: \`[url]\`,\n\`--th\` Thumbnail: \`[url]\`,\n` + - `\`--u\` URL: \`[url]\`,\n\`--f\` Add Field:\n\` -n\` Name: \`[text]\`,\n\` -d\` Description: \`[text]\`,\n\` -i\` Inline: True if provided,\n` + - `\`--fo\` Footer:\n\` -t\` Text: \`[text]\`,\n\` -i\` Icon: \`[url]\`,\n\`--co\` Content: \`[text]\`,\n\`--ch\` Channel: \`[mention|ID|name]\`,\n` + - `\`--ti\` Timestamp: \`[ISO 8601|UNIX (Milliseconds)]\` - Use https://time.lol ,\n` + - `\`--at\` Attachments: \`[url]\` - You can put \`-c\` when editing to copy all existing message attachments ` + - `(Cannot remove existing attachment unless \`--ch\` provided).\n\n**Embed editor:** ` + - `You can put\n\`--e\` Edit: \`<[message_[ID|link]|channel_[mention|ID] message_ID]>\`` + - `\nas first argument to edit the embed in provided message. All existing property will be replaced ` + - `with provided argument. Put\n\`--r\` Remove [Author, Fields, Footer]: \`[a, f, fo]\`\nto remove all existing property ` + - `of the provided argument in the embed.\n\nOther arguments:\n\`--q\` Quote: \`<[message_[ID|link]|channel_[mention|ID] message_ID]>\`` + - ` - Quote a message.` + details: "Run the command without argument to see details." }); } async run(msg, arg) { let isAdmin = true; if (msg.guild && !this.client.owners.includes(msg.author)) { - if (!msg.member.hasPermission("EMBED_LINKS")) return trySend(this.client, msg, "No "); if (!msg.member.hasPermission("ADMINISTRATOR")) isAdmin = false; } const args = parseDoubleDash(arg); @@ -46,13 +49,14 @@ module.exports = class embmaker extends commando.Command { continue; } if (value.startsWith("e ")) { - if (msg.guild && !msg.member.hasPermission("MANAGE_MESSAGES")) { - reportMessage += "**[EDIT]** Requires Manage Messages.\n"; - continue; - } const editArg = value.slice("e ".length).trim().split(/ +/); if (editArg[0].length > 0) { editSrc = await getChannelMessage(msg, editArg[0], editArg[1]); + if (editSrc && editSrc.invoker !== msg.author && !isAdmin) { + editSrc = undefined; + reportMessage += "**[EDIT]** Require Administrator.\n"; + continue; + } if (editSrc) { const editEmb = editSrc.embeds[0]; if (editSrc.content) { @@ -149,7 +153,8 @@ module.exports = class embmaker extends commando.Command { continue; } if (value.startsWith("d ")) { - const use = emoteMessage(this.client, value.slice("d ".length).trim().replace(/\\(?!\\)/g, "")); + let DD = value.slice("d ".length).trim(); + let use = emoteMessage(this.client, DD.replace(/\\(?!\\)/g, "")); embed.setDescription(isAdmin ? use : adCheck(use)); continue; } @@ -335,6 +340,11 @@ module.exports = class embmaker extends commando.Command { continue; } } + const PC = channel?.permissionsFor?.(msg.author).serialize(); + const PM = msg.channel.permissionsFor?.(msg.author).serialize(); + const CC = channel?.permissionsFor?.(this.client.user).serialize(); + const CM = msg.channel.permissionsFor?.(this.client.user).serialize(); + if (!(PC || PM).EMBED_LINKS) return trySend(this.client, msg, "No "); if (autIcon === false && embed.author.name) delete embed.author.name; if (!autName && autIcon) autName = "​"; if (autName || autIcon && embed.author !== null) embed.setAuthor(autName, autIcon, autUrl); @@ -342,8 +352,10 @@ module.exports = class embmaker extends commando.Command { if (footertext || footericon && embed.footer !== null) embed.setFooter(footertext, footericon); if (embed.length === 0 && (embed.thumbnail === null || embed.thumbnail.url === null) && embed.author === null && (embed.image === null || embed.image.url === null) && !footericon) { if (embed.timestamp) embed.setFooter("​"); else { + content = `<@${msg.author.id}>`; embed = defaultImageEmbed(msg, null, "Usage"); - embed.setDescription(this.details); + embed.setDescription(HELP.desc); + if (HELP.fields.length > 0) for (const u of HELP.fields) embed.addField(u.name, u.value, u.inline); } } if (embed.color === 16777215) embed.setColor(16777214); @@ -354,7 +366,7 @@ module.exports = class embmaker extends commando.Command { if (editSrc) { if (channel) { if (msg.guild && !this.client.owners.includes(msg.author)) { - if (channel.permissionsFor(msg.author).serialize().ATTACH_FILES && channel.permissionsFor(this.client.user).serialize().ATTACH_FILES && newAttach.length > 0) { + if (PC?.ATTACH_FILES && CC?.ATTACH_FILES && newAttach.length > 0) { reportMessage += "**[ATTACHMENT]** Uploading attachments....\n"; } else { if (newAttach.length > 0) { @@ -366,9 +378,7 @@ module.exports = class embmaker extends commando.Command { sent.push(trySend(this.client, channel, { content: content, embed: embed, files: newAttach })); } else { if (msg.guild) { - const c = msg.channel.permissionsFor(msg.author).serialize(), - f = msg.channel.permissionsFor(this.client.user).serialize(); - if (!c.ATTACH_FILES && !f.ATTACH_FILES) { + if (PM.ATTACH_FILES === undefined && CM.ATTACH_FILES === undefined) { if (newAttach.length > 0) { newAttach = []; reportMessage += "**[ATTACHMENT]** Missing permission.\n"; @@ -387,7 +397,7 @@ module.exports = class embmaker extends commando.Command { } } else { if (msg.guild && !this.client.owners.includes(msg.author)) { - if ((channel ?? msg.channel).permissionsFor(msg.author).serialize().ATTACH_FILES && (channel ?? msg.channel).permissionsFor(this.client.user).serialize().ATTACH_FILES && newAttach.length > 0) { + if ((PC || PM).ATTACH_FILES && (CC || CM).ATTACH_FILES && newAttach.length > 0) { reportMessage += "**[ATTACHMENT]** Uploading attachments....\n"; } else { if (newAttach.length > 0) { @@ -404,6 +414,9 @@ module.exports = class embmaker extends commando.Command { } else { noPerm(msg); } + for (const m of sent) m.then(r => { + if (r instanceof Message) r.setInvoker(msg.author); + }); return sent; } catch (e) { return errLog(e, msg, this.client, true, "", true); diff --git a/cmds/utility/translate.js b/cmds/utility/translate.js index 3664f65..3f50d5e 100644 --- a/cmds/utility/translate.js +++ b/cmds/utility/translate.js @@ -3,7 +3,7 @@ const commando = require("@iceprod/discord.js-commando"); const { default: axios } = require("axios"); const { Message } = require("discord.js"); -const { trySend, getChannelMessage, defaultImageEmbed } = require("../../resources/functions"); +const { trySend, getChannelMessage, defaultImageEmbed, wait } = require("../../resources/functions"); const SPLG = [ "en", "ar", @@ -24,6 +24,10 @@ const SPLG = [ "vi" ], REG = /(? { + if (rl > 0) rl--; +}, 100); module.exports = class translate extends commando.Command { constructor(client) { @@ -32,7 +36,7 @@ module.exports = class translate extends commando.Command { aliases: ["t", "trans"], memberName: "translate", group: "utility", - description: "Translate some alien languages.", + description: "Translate some alien languages. `--h` for help.", details: "**Supported languages:**\n" + `\`en\` English\n` + `\`ar\` Arabic\n` + @@ -50,8 +54,7 @@ module.exports = class translate extends commando.Command { `\`ru\` Russian\n` + `\`es\` Spanish\n` + `\`tr\` Turkish\n` + - `\`vi\` Vietnamese\n\n` + - `\`--h\` for help` + `\`vi\` Vietnamese` }); } /** @@ -79,7 +82,6 @@ module.exports = class translate extends commando.Command { const A = MA[0].slice(4).trim().split(/ +/); console.log(A); const C = await getChannelMessage(msg, A[0], A[1]); - console.log(C); if (C) tmes = C; }; arg = arg.replace(REG, "").trim(); @@ -95,6 +97,10 @@ module.exports = class translate extends commando.Command { if (!trans || trans.length === 0) { return trySend(msg.client, msg, "Nothing to translate. `--h` for help <:nekohmLife:846371737644957786>"); } + ex++; + if (ex > 1) rl += 6; + const t = rl * 100; + await wait(t); const res = await axios.post("https://translate.mentality.rip/translate", { q: trans.replace(/\./g, ","), source: "auto", @@ -102,7 +108,8 @@ module.exports = class translate extends commando.Command { }).then(r => { console.log(r.data); return r.data.translatedText; - }).catch(console.error); + }).catch(console.error) + .finally(() => ex--); return trySend(msg.client, msg, res); } }; \ No newline at end of file diff --git a/resources/debug.js b/resources/debug.js index 3bb7375..3956b6c 100644 --- a/resources/debug.js +++ b/resources/debug.js @@ -2,11 +2,20 @@ function timestampAt(client) { const date = new Date(new Date().valueOf() + (client?.matchTimestamp ? client.matchTimestamp : 0)), - string = date.toLocaleTimeString("UTC", {"day": "numeric", "month": "2-digit", "year": "2-digit", "hour12": true}), - ampm = string.slice(string.length - 3), - miliseconds = date.getUTCMilliseconds(), - result = string.slice(0, -3) + "." + miliseconds + ampm; + string = date.toLocaleTimeString("UTC", { "day": "numeric", "month": "2-digit", "year": "2-digit", "hour12": true }), + ampm = string.slice(string.length - 3), + miliseconds = date.getUTCMilliseconds(), + result = string.slice(0, -3) + "." + miliseconds + ampm; return "At: " + result; }; -module.exports = { timestampAt } \ No newline at end of file +/** + * + * @param {String} string + * @returns {import("discord.js").MessageOptions} + */ +function makeJSONMessage(string) { + return { content: '```js\n' + JSON.stringify(string, (k, v) => v ?? undefined, 2) + '```', split: { maxLength: 2000, char: ",", append: ',```', prepend: '```js\n' } }; +} + +module.exports = { timestampAt, makeJSONMessage } \ No newline at end of file diff --git a/resources/eventsLogger/guildBanAdd.js b/resources/eventsLogger/guildBanAdd.js index 221c975..83c4011 100644 --- a/resources/eventsLogger/guildBanAdd.js +++ b/resources/eventsLogger/guildBanAdd.js @@ -11,7 +11,7 @@ module.exports = async (GUILD, USER) => { const emb = defaultEventLogEmbed(GUILD); const rea = (await GUILD.fetchBan(USER)).reason; emb.setDescription(rea ?? "No reason provided.") - .setTitle(`User \`${USER.tag}\` banned`) + .setTitle(`\`${USER.tag}\` banned`) .setColor(getColor("red")) .setThumbnail(USER.displayAvatarURL({ size: 4096, format: "png", dynamic: true })) .addField("User", `<@${USER.id}>\n(${USER.id})`); diff --git a/resources/eventsLogger/guildMemberAdd.js b/resources/eventsLogger/guildMemberAdd.js index 05fa8d8..a3bc074 100644 --- a/resources/eventsLogger/guildMemberAdd.js +++ b/resources/eventsLogger/guildMemberAdd.js @@ -15,11 +15,11 @@ module.exports = (member) => { if (!log) return; const emb = defaultEventLogEmbed(member.guild); emb - .setTitle("User `" + member.user.tag + "` joined") - .setThumbnail(member.user.displayAvatarURL({format: "png", size: 4096, dynamic: true})) - .setColor(getColor("cyan")) - .addField("Registered", "**" + member.user.createdAt.toUTCString().slice(0, -4) + "**", true) - .setDescription(`<@!${member.id}> (${member.id}) just joined.\nWe have ${member.guild.memberCount} total members now.`); + .setTitle("`" + member.user.tag + "` joined") + .setThumbnail(member.user.displayAvatarURL({ format: "png", size: 4096, dynamic: true })) + .setColor(getColor("cyan")) + .addField("Registered", "**" + member.user.createdAt.toUTCString().slice(0, -4) + "**", true) + .setDescription(`<@!${member.id}> (${member.id}) just joined.\nWe have ${member.guild.memberCount} total members now.`); return trySend(member.client, log, emb); } } \ No newline at end of file diff --git a/resources/eventsLogger/guildMemberRemove.js b/resources/eventsLogger/guildMemberRemove.js index 985efaa..c4c2d44 100644 --- a/resources/eventsLogger/guildMemberRemove.js +++ b/resources/eventsLogger/guildMemberRemove.js @@ -18,7 +18,7 @@ module.exports = (member) => { const RO = member.roles.cache.sort((a, b) => b.position - a.position).map(r => r.id).slice(0, -1), RU = splitOnLength(RO, 1010, ">, <@&"); emb - .setTitle("Member `" + member.user.tag + "` left") + .setTitle("`" + member.user.tag + "` left") .setThumbnail(member.user.displayAvatarURL({ format: "png", size: 4096, dynamic: true })) .setColor(getColor("yellow")) .addField("Registered", "**" + member.user.createdAt.toUTCString().slice(0, -4) + "**", true) diff --git a/resources/eventsLogger/guildMemberUpdate.js b/resources/eventsLogger/guildMemberUpdate.js index 39e8143..c426cfe 100644 --- a/resources/eventsLogger/guildMemberUpdate.js +++ b/resources/eventsLogger/guildMemberUpdate.js @@ -12,25 +12,25 @@ const getColor = require("../getColor"); */ module.exports = (memberold, membernew) => { if (!membernew.guild.eventChannels?.memberRole && !membernew.guild.eventChannels?.member) { - if (membernew.user.cachedAvatarURL != membernew.user.displayAvatarURL({format: "png", size: 4096, dynamic: true})) { - membernew.user.cachedAvatarURL = membernew.user.displayAvatarURL({format: "png", size: 4096, dynamic: true}); + if (membernew.user.cachedAvatarURL != membernew.user.displayAvatarURL({ format: "png", size: 4096, dynamic: true })) { + membernew.user.cachedAvatarURL = membernew.user.displayAvatarURL({ format: "png", size: 4096, dynamic: true }); }; return; } let log; const emb = defaultEventLogEmbed(membernew.guild); emb.setTitle("Profile `" + memberold.user.tag + "` updated") - .setThumbnail(membernew.user.cachedAvatarURL ?? memberold.toJSON().displayAvatarURL) - .setColor(getColor("blue")); + .setThumbnail(membernew.user.cachedAvatarURL ?? memberold.toJSON().displayAvatarURL) + .setColor(getColor("blue")); if (membernew.guild.eventChannels?.memberRole) { log = getChannel(membernew, membernew.guild.eventChannels.memberRole); if (membernew.roles.cache.size > memberold.roles.cache.size) { emb.addField("Role added", ("<@&" + membernew.roles.cache.difference(memberold.roles.cache).sort((a, b) => b.position - a.position).map(r => r.id).join(">, <@&") + ">").slice(0, 2048)) - .setDescription("**Old roles**\n" + (memberold.roles.cache.size > 1 ? "<@&" + memberold.roles.cache.sort((a, b) => b.position - a.position).map(r => r.id).slice(0, -1).join(">, <@&") + ">" : "`[NONE]`")); + .setDescription("**Old roles**\n" + (memberold.roles.cache.size > 1 ? "<@&" + memberold.roles.cache.sort((a, b) => b.position - a.position).map(r => r.id).slice(0, -1).join(">, <@&") + ">" : "`[NONE]`")); } if (membernew.roles.cache.size < memberold.roles.cache.size) { emb.addField("Role removed", ("<@&" + memberold.roles.cache.difference(membernew.roles.cache).sort((a, b) => b.position - a.position).map(r => r.id).join(">, <@&") + ">").slice(0, 2048)) - .setDescription("**Current roles**\n" + (membernew.roles.cache.size > 1 ? "<@&" + membernew.roles.cache.sort((a, b) => b.position - a.position).map(r => r.id).slice(0, -1).join(">, <@&") + ">" : "`[NONE]`")); + .setDescription("**Current roles**\n" + (membernew.roles.cache.size > 1 ? "<@&" + membernew.roles.cache.sort((a, b) => b.position - a.position).map(r => r.id).slice(0, -1).join(">, <@&") + ">" : "`[NONE]`")); } } if (membernew.guild.eventChannels?.member && membernew.roles.cache.size === memberold.roles.cache.size) { @@ -38,14 +38,14 @@ module.exports = (memberold, membernew) => { if (membernew.displayName != memberold.displayName) { emb.addField("Nickname", "Changed from `" + memberold.displayName + "` to `" + membernew.displayName + "`"); } - if (membernew.user.cachedAvatarURL != membernew.user.displayAvatarURL({format: "png", size: 4096, dynamic: true})) { + if (membernew.user.cachedAvatarURL != membernew.user.displayAvatarURL({ format: "png", size: 4096, dynamic: true })) { emb - .setImage(membernew.user.displayAvatarURL({format: "png", size: 4096, dynamic: true})) - .addField("Avatar", (emb.thumbnail ? "This embed's thumbnail is the user's old avatar.\n" : "") + "The image below is the user's new avatar."); + .setImage(membernew.user.displayAvatarURL({ format: "png", size: 4096, dynamic: true })) + .addField("Avatar", (emb.thumbnail ? "This embed's thumbnail is the user's old avatar.\n" : "") + "The image below is the user's new avatar."); } } - if (membernew.user.cachedAvatarURL != membernew.user.displayAvatarURL({format: "png", size: 4096, dynamic: true})) { - membernew.user.cachedAvatarURL = membernew.user.displayAvatarURL({format: "png", size: 4096, dynamic: true}); + if (membernew.user.cachedAvatarURL != membernew.user.displayAvatarURL({ format: "png", size: 4096, dynamic: true })) { + membernew.user.cachedAvatarURL = membernew.user.displayAvatarURL({ format: "png", size: 4096, dynamic: true }); }; if (!emb.fields || emb.fields.length === 0) return; return trySend(membernew.client, log, emb); diff --git a/resources/eventsLogger/message.js b/resources/eventsLogger/message.js index b188a5f..3fb2413 100644 --- a/resources/eventsLogger/message.js +++ b/resources/eventsLogger/message.js @@ -17,7 +17,7 @@ function giveNickHeart(msg) { .then(r => { if (r) return trySend(msg.client, msg, "okay <3"); }) - .catch(e => noPerm(msg)); + .catch(() => noPerm(msg)); } } diff --git a/resources/functions.js b/resources/functions.js index 0ad3ff5..2c03ad4 100644 --- a/resources/functions.js +++ b/resources/functions.js @@ -62,12 +62,12 @@ async function getChannelMessage(msg, MainID, SecondID) { if (SecondID && !/\D/.test(SecondID)) { try { const meschannel = (msg.client.owners.includes(msg.author) ? msg.client : msg.guild).channels.cache.get(MainID); - return meschannel.messages.fetch(SecondID); + return meschannel.messages.fetch(SecondID, true); } catch { return; } } else { - return msg.channel.messages.fetch(MainID).catch(() => { }); + return msg.channel.messages.fetch(MainID, true).catch(() => { }); } } @@ -81,17 +81,18 @@ function execCB(error, stdout, stderr) { /** * Command usage logger - * @param {CommandoMessage} msg + * @param {CommandoMessage} msg * @param {String} addition */ async function ranLog(msg, addition) { + if (typeof addition != "string") return console.log(`[RANLOG] Not a string:`, addition); const channel = msg.client.channels.cache.get(ranLogger), - ifCode = addition.startsWith("```") && addition.endsWith("```"); - const addSplit = splitOnLength((addition.substr(ifCode ? 2045 : 2049)).split(","), 1010, ","); + ifCode = addition?.startsWith("```") && addition.endsWith("```"); + const addSplit = splitOnLength((addition?.substr(ifCode ? 2045 : 2049)).split(","), 1010, ","); const embed = defaultImageEmbed(msg, null, msg.command.name.toLocaleUpperCase() + ` ${msg.id}`); embed.setAuthor(msg.author.tag + ` (${msg.author.id})`, msg.author.displayAvatarURL({ format: "png", size: 128, dynamic: true })) - .setURL(msg.url) - .setDescription(addition.slice(0, ifCode && addSplit[0]?.[0].length > 0 ? 2044 : 2048) + (ifCode && addSplit[0]?.[0].length > 0 ? "```" : "")); + .setURL(msg.url); + if (addition && addition.length > 0) embed.setDescription(addition.slice(0, ifCode && addSplit[0]?.[0].length > 0 ? 2044 : 2048) + (ifCode && addSplit[0]?.[0].length > 0 ? "```" : "")); if (addSplit[0]?.[0].length > 0) for (const add of addSplit) embed.addField("​", "```js\n" + add.join(",") + (embed.fields.length < (addSplit.length - 1) ? ",```" : "")); embed.setFooter(timestampAt(msg.client), msg.guild?.iconURL({ format: "png", size: 128, dynamic: true })); if (msg.guild) embed.addField("Guild", `\`${msg.guild?.name}\`\n(${msg.guild?.id})`, true); @@ -283,14 +284,14 @@ function findChannelRegEx(msg, name, exclude) { /** * Get role object with RegExp - * @param {Message | GuildMember} msg Object of the guild being searched + * @param {Message | GuildMember | Guild} msg Object of the guild being searched * @param {String} name Keyword * @returns {Role[]} Roles object found */ function findRoleRegEx(msg, name) { - if (!msg.guild || !name) return; + if (!msg || !name) return; const re = new RegExp(name, "i"); - return msg.guild.roles.cache.map(r => r).filter(r => re.test(r.name)); + return (msg.guild || msg).roles.cache.map(r => r).filter(r => re.test(r.name)); } /** @@ -454,7 +455,7 @@ function parseComa(content) { * @returns {String[]} */ function parseDoubleDash(content) { - return content.trim().split(/(? setTimeout(() => r(), ms)) } + module.exports = { cleanMentionID, defaultEventLogEmbed, multipleMembersFound, multipleRolesFound, multipleChannelsFound, @@ -492,5 +501,5 @@ module.exports = { trySend, tryDelete, tryReact, adCheck, defaultImageEmbed, getChannel, splitOnLength, parseComa, parseDoubleDash, getMember, - parseDash, reValidURL, getUser + parseDash, reValidURL, getUser, getRole, wait } \ No newline at end of file diff --git a/resources/shaChat.js b/resources/shaChat.js index 7e907ff..7c611b1 100644 --- a/resources/shaChat.js +++ b/resources/shaChat.js @@ -1,5 +1,7 @@ 'use strict'; +const { wait } = require("./functions"); + const axios = require("axios").default, U = ["Yo", "Yyo", "Hello my friend", "Hey cutie <3", "What", "Wat", "Watchu want", "Hewwo", "UwU hwee", "OwO whats this", "Yoooooooooo", "Supp", "Whats good mein frien", "Iyo", "Hows doin", "Wassup", "Whats good", "Wanna chat?"]; @@ -21,16 +23,25 @@ const URL = [ 'https://rebot.me/just-monika-56' ]; */ +let rl = 0, ex = 0; +setInterval(() => { + if (rl > 0) rl--; +}, 1000); async function chatAnswer(message) { // return axios.post("https://rebot.me/ask", { username: "simsimi", question: message }).then(r => r.data).catch(() => { }); + ex++; + if (ex > 1) rl += 1; + const t = rl * 1000; + await wait(t); const u = message.slice(0, 1000); return axios.get(`https://api.simsimi.net/v1/`, { params: { text: u, lang: "en" } - }).then(r => r.data.success.replace(/Sim doesn't know what you are talking about. Please teach me/, "Sorry but i don't speak gibberish").replace(/kemon acho babu/, U[Math.floor(Math.random() * U.length)])).catch(() => { }); + }).then(r => r.data.success.replace(/Sim doesn't know what you are talking about. Please teach me/, "Sorry but i don't speak gibberish").replace(/kemon acho babu/, U[Math.floor(Math.random() * U.length)])).catch(console.error) + .finally(() => ex--); } -module.exports = { chatAnswer } +module.exports = { chatAnswer } \ No newline at end of file diff --git a/resources/structures.js b/resources/structures.js index 4427c1d..e6cef10 100644 --- a/resources/structures.js +++ b/resources/structures.js @@ -12,8 +12,8 @@ Structures.extend("Guild", g => { } async dbLoad() { - return database.collection("Guild").findOne({ document: this.id }).then((r, j) => { - if (j) return errLog(j, null, this.client); + return database.collection("Guild").findOne({ document: this.id }).then((r, e) => { + if (e) return errLog(e, null, this.client); this.infractions = r?.moderation?.infractions || []; this.moderation = r?.moderation?.settings || {}; this.defaultEmbed = r?.settings?.defaultEmbed || {}; @@ -48,14 +48,6 @@ Structures.extend("Guild", g => { } catch (e) { } } - async setDescription(set) { - return database.collection("Guild").updateOne({ document: this.id }, { $set: { description: set }, $setOnInsert: { document: this.id } }, { upsert: true }, (e, r) => { - if (e) return errLog(e, null, this.client); - this.description = set; - return true; - }); - } - async addInfraction(add) { try { const r = await database.collection("Guild").findOne({ document: this.id }); @@ -195,7 +187,11 @@ Structures.extend("Message", e => { super(client, data, channel); this.previousMessageID = channel.lastMessageID; }; - } + + setInvoker(user) { + return this.invoker = user; + }; + }; }); Structures.extend("GuildMember", e => { @@ -204,8 +200,8 @@ Structures.extend("GuildMember", e => { super(client, data, guild); } - async getInfractions() { + async infractions() { return this.guild.getInfractions(this.id); } } -}) \ No newline at end of file +}); \ No newline at end of file diff --git a/resources/tCmds/convo.js b/resources/tCmds/convo.js index fa99754..f8ac12c 100644 --- a/resources/tCmds/convo.js +++ b/resources/tCmds/convo.js @@ -3,7 +3,7 @@ const emoteMessage = require("../emoteMessage"); const { getChannel, parseDash, cleanMentionID, trySend } = require("../functions"); const { getGuild } = require("./resources/functions"); -let a, G, C = [], last = 0, nO = "Args: [`-g` Guild: `[name|ID]`] `-c` Channel: `[name|ID]` [`-q` End current session | `-r` Resume previous session]"; +let a, G, C = [], last = 0, nO = "Args: [`-g` Guild: `[name|ID]` | `-u` Remove channel: `[index]`] `-c` Channel: `[name|ID]` [`-q` End current session | `-r` Resume previous session]"; //const p = require("child_process"); module.exports = { @@ -98,7 +98,7 @@ module.exports = { } console.log("Session:"); for (let i = 0; i < C.length; i++) console.log(C[i].guild.name, C[i].guild.id, i + ":", C[i].name, C[i].id); - } else if (C[num]) return C[num].send(emoteMessage(client, sl ? arg.slice(num?.toString().length).trim() : arg)).catch(console.error); else { + } else if (C[num]) return C[num].send(emoteMessage(client, sl ? arg.slice(num?.toString().length).trim() ?? "hi" : arg)).catch(console.error); else { console.log('No session. Available sessions:'); for (let i = 0; i < C.length; i++) console.log(C[i].guild.name, C[i].guild.id, i + ":", C[i].name, C[i].id); return;