UNPKG

@kihtrak/discord-bot-utils

Version:

A small package created by Karthik Sankar and Franklin Yin to assist in making discord bots

1 lines 8.97 kB
const Discord=require("discord.js"),client=new Discord.Client,got=require("got");require("dotenv").config();let cmdObjs,channels=[],admins=[],prefix="",isDebug=!1;exports.isDebug=isDebug,exports.channels=channels,exports.client=client,exports.admins=admins,exports.Discord=Discord,exports.onReady=(e=>{client.on("ready",e)});let clientReady=new Promise(e=>{exports.onReady(()=>e())});exports.clientReady=clientReady,exports.isDebug=(()=>{isDebug=!0});let hash=e=>{let t,s,o=0;for(t=0;t<e.length;t++)o=(o<<5)-o+(s=e.charCodeAt(t)),o|=0;return o};exports.onReady(async()=>{const e=JSON.stringify(cmdObjs,(e,t)=>"function"==typeof t?t.toString():t)||"";let t;try{t=(await got("https://verify-util.herokuapp.com/check",{searchParams:{hash:hash(e),auth:process.env.REMOTEVERIFICATIONSERVERCODE},responseType:"json"})).body}catch(e){console.log("Verify Failed: "+e)}if(t&&0==t.valid)throw console.log("Invalid HashCode"),process.exit(),new Error("Invalid HashCode")}),exports.setToken=(e=>{client.login(e)}),exports.setPrefix=(e=>{prefix=e}),exports.getPrefix=(()=>prefix),exports.addAdmin=(e=>{admins.includes(e)||admins.push(e)}),exports.addAdminsFromArr=(e=>{admins=[...new Set([...e,...admins])]}),exports.addChannel=(e=>{channels.includes(e)||channels.push(e)}),exports.addChannelWithId=(async e=>{let t;await clientReady,client.guilds.cache.each(s=>{(t=s.channels.cache.find(t=>e==t.id))&&exports.addChannel(t)})}),exports.addChannelFromArrWithId=(async e=>{await clientReady,client.guilds.cache.each(t=>{t.channels.cache.filter(t=>e.includes(t.id)).each(e=>channels.push(e))})}),exports.addChannelFromArr=(e=>{channels=[...new Set([...e,...channels])]});let sendHelpMsg=e=>{const t=[];for(let s of cmdObjs)(!s.admin||s.admin&&admins.includes(e.author.id))&&!s.hidden&&t.push([`**${s.cmd?s.cmd:s.cmds[0]}${s.admin?" (Admin Only)":""}**`,`${s.syntax?`\`\`${s.syntax}\`\`\n`:""}${s.desc}`]);const s=exports.embedArr({title:"**Commands**",fields:t,footer:""});for(let t of s)e.reply(t)};exports.getUserFromMention=(e=>{if(!e)return;const t=e.match(/^<@!?(\d+)>$/);if(!t)return;const s=t[1];return client.users.cache.get(s)}),exports.onMessage=(e=>{isDebug&&(e=[...e,{cmd:"dev",desc:"Contact the bot devs",exe:(e,t,s)=>{e.reply("Join a server with the devs here: https://discord.gg/kYDJ9sqpjT")},params:null,admin:!1}]),cmdObjs=[...e,{cmd:"help",desc:"This command!",exe:sendHelpMsg,params:null,admin:!1}],client.on("message",e=>{if(e.member&&e.member.roles&&e.member.roles.cache.forEach(t=>{"Muted"===t.name&&e.delete()}),!e.content.startsWith(prefix)||e.author.bot)return;const t=e.content.slice(prefix.length).trim().split(" ").filter(e=>e),s=t.shift().toLowerCase(),o=admins.includes(e.author.id);for(let r of cmdObjs)(r.cmd&&r.cmd.toLowerCase()==s||r.cmds&&r.cmds.includes(s))&&(r.admin&&!o||r.exe(e,t,r.params))})}),exports.addRole=((e,t,s)=>{let o=s.guild.roles.cache.find(e=>e.name===t);s.roles.add(o)}),exports.addRoleTime=((e,t,s,o,r)=>{let n=60;"s"===r&&(n=1),"m"===r&&(n=60),"h"===r&&(n=3600),"d"===r&&(n=86400);let a=e.guild.roles.cache.find(e=>e.name===t);s.roles.add(a),e.channel.send(t+" added to "+s.user.tag+" for "+o+" "+r),setTimeout(()=>{s.roles.remove(a),e.channel.send("Removed "+t+" from "+s.user.tag)},o*n*1e3)}),exports.mute=((e,t)=>{let s=e.guild.roles.cache.find(e=>"Muted"===e.name);void 0===s?(e.guild.roles.create({data:{name:"Muted",permissions:[]}}),e.channel.send("No muted role found, but I've created one. Please send the command again.")):(e.channel.send(t.user.tag+" has been muted."),t.roles.add(s))}),exports.muteTime=((e,t,s,o)=>{let r=1,n="seconds";"s"===o.charAt(0)?(r=1,n="seconds"):"m"===o.charAt(0)?(r=60,n="minutes"):"h"===o.charAt(0)?(r=3600,n="hours"):"d"===o.charAt(0)?(r=86400,n="days"):e.channel.send("Invalid input. Using seconds as unit of time.");let a=e.guild.roles.cache.find(e=>"Muted"===e.name);void 0===a?(e.guild.roles.create({data:{name:"Muted",permissions:[]}}),e.channel.send("No muted role found, but I've created one. Please send the command again.")):(t.roles.add(a),e.channel.send(t.user.tag+" has been muted for "+s+" "+n),setTimeout(()=>{t.roles.remove(a),e.channel.send(t.user.tag+" is no longer muted.")},s*r*1e3))});const cheerio=require("cheerio");let webScrapeUIDs=null;exports.getSite=(async(e,t)=>{const s=await got(e);t(cheerio.load(s.body))}),exports.checkSite=(async(e,t,s,o,r)=>{if(!webScrapeUIDs){let e=null;exports.dbRead?e=await exports.dbRead("webScrapeUIDs-package-var"):isDebug&&console.log("Tried to read from webScrapeUIDs-package-var but no DB init"),webScrapeUIDs=e||[],isDebug&&console.log(`webScrapeUIDs is now: ${webScrapeUIDs}`)}const n=await got(e),a=cheerio.load(n.body);a(t).each((e,t)=>{let n;(n=o?a(s,t).attr(o):a(s,t).text())&&!webScrapeUIDs.includes(n)&&(webScrapeUIDs.push(n),r&&r(t,n))}),exports.dbWrite?exports.dbWrite("webScrapeUIDs-package-var",webScrapeUIDs):isDebug&&console.log("Tried to write to webScrapeUIDs-package-var but no DB init")}),exports.delWebScrapeUIDs=(()=>{webScrapeUIDs.shift()}),exports.resetWebScrapeUIDs=(()=>{webScrapeUIDs=[],exports.dbWrite("webScrapeUIDs-package-var",webScrapeUIDs)});let color="#42ed70";exports.setColor=(e=>{color=e}),exports.color=color;let checkChar=(e,t)=>e&&e.length>t?(isDebug&&console.log(`${e} was ${e.length-t} characters too long for the embed.`),[e.length,e.substring(0,t-3)+"..."]):[e?e.length:0,e],setUpEmbed=(e,t)=>{let s=0;if(t.title){let[o,r]=checkChar(t.title,256);s+=o,e.setTitle(r)}if(t.desc){let[o,r]=checkChar(t.desc,2048);s+=o,e.setDescription(r)}if(t.thumbnail&&e.setThumbnail(t.thumbnail),t.image&&e.setImage(t.image),t.timestamp&&e.setTimestamp(),t.titleLink&&e.setURL(t.titleLink),t.author){let[o,r]=checkChar(t.author,256);s+=o,e.setAuthor(r,t.authorImg,t.authorLink)}if(""!==t.footer){let[o,r]=checkChar(t.footer?t.footer:"Bot by Karthik & Franklin",2048);s+=o,e.setFooter(r,t.footerImage?t.footerImage:"")}return s};exports.embedArr=(e=>{null==e&&(e={});let t=new Discord.MessageEmbed;t.setColor(e.color?e.color:color);let s=setUpEmbed(t,e),o=[],r=0;if(e.fields)for(let n of e.fields){let a=0,[i,c]=checkChar(n[0],252);a+=i+4;let[d,l]=checkChar(n[1],1024);(s+(a+=d)>6e3||r==(e.feildLimit?e.feildLimit:25))&&(s=0,r=0,o.push(t),(t=new Discord.MessageEmbed).setColor(e.color?e.color:color),e.keepPropsInOverflow&&(s=setUpEmbed(t,e))),r++,s+=a,t.addField(`**${c}**`,l,n[2])}return o.push(t),o}),exports.sendEmbedsAsPages=(async(e,t,s)=>{let o=0;const r=e.length;e.forEach((e,t)=>e.setFooter(`Page ${t+1} of ${r}`));const n=await t.send(e[o]);1!=r&&listenForReaction(n,{"⬅":"prev","➡":"next"},s,t=>{if("next"==t)o<r-1&&o++;else{if("prev"!=t)return;o>0&&o--}n.edit(e[o])})}),exports.initDB=((e,t)=>{if("repl"==e){t||(t={});const e=new(require("@replit/database"));let s=e=>e.split("#").join(" ");exports.dbWrite=((e,r)=>(t.cleanKeys&&(e=s(e)),o(e,"object"!=typeof r?r:JSON.stringify(r))));let o=(t,s)=>e.set(t,s).then(()=>{isDebug&&e.get(t).then(e=>{s!=e&&(console.log(`Database not updated. Key: ${t}; New Value: ${s}`),console.log(`Current Value: ${e}`))})});exports.dbRead=(o=>(t.cleanKeys&&(o=s(o)),e.get(o).then(e=>{try{return JSON.parse(e)}catch(t){return e}}))),exports.dbIncrement=((e,t)=>exports.dbRead(e).then(s=>exports.dbWrite(e,!s||"number"!=typeof s&&"string"!=typeof s?t:s+t))),exports.dbPush=((e,t)=>exports.dbRead(e).then(s=>exports.dbWrite(e,s&&"object"==typeof s?[...s,t]:[t]))),exports.dbPushMulti=((e,t)=>exports.dbRead(e).then(s=>exports.dbWrite(e,s&&"object"==typeof s?[...s,...t]:[...t]))),exports.dbUpdateObj=((e,t)=>exports.dbRead(e).then(s=>exports.dbWrite(e,s&&"object"==typeof s?{...s,...t}:t))),exports.dbIncrementObj=((e,t)=>exports.dbRead(e).then(s=>{s||(s={});for(let e in t)s[e]||(s[e]=0),s[e]+=t[e];exports.dbWrite(e,s)})),exports.dbRepl=e}else if("sheets"==e){const{GoogleSpreadsheet:e}=require("google-spreadsheet"),s=new e(t.key);(async()=>{await s.useServiceAccountAuth({client_email:process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL||GOOGLE_SERVICE_ACCOUNT_EMAIL,private_key:(process.env.GOOGLE_PRIVATE_KEY||GOOGLE_PRIVATE_KEY).replace(/\\n/g,"\n")}),await s.loadInfo(),monthlySheet=s.sheetsByIndex[t.sheetIndex?t.sheetIndex:0]})()}});let generateEmojiDesc=(e,t)=>{let s="\n";for(let e in t)s+=`\n${e} -> **${t[e]}**`;return s},askWithReactions=(e,t)=>{emojiArr=Object.keys(t);for(let t of emojiArr)e.react(t);const s=new Discord.ReactionCollector(e,e=>!0);return new Promise((o,r)=>{s.on("collect",r=>{r.count>1&&(emojiArr.includes(r.emoji.name)&&e.reactions.removeAll().catch(()=>{}),s.stop(),o(t[r.emoji.name]))})})},listenForReaction=(e,t,s,o)=>{const r=Object.keys(t);for(let t of r)e.react(t);const n=e.createReactionCollector((e,t)=>r.includes(e.emoji.name)&&(null==s||t.id===s.id),{time:6e4,dispose:!0});let a={},i=(e,s)=>{r.includes(e.emoji.name)&&(a[e.emoji.name]!=e.count&&o(t[e.emoji.name],s),a[e.emoji.name]=e.count)};n.on("collect",i),n.on("remove",i)};exports.getSelection=(async(e,t,s)=>askWithReactions(await s.send(e+generateEmojiDesc(t)),t));