Initial commit

This commit is contained in:
TheEssem 2019-09-13 15:02:41 -05:00
commit c33a86eb4c
132 changed files with 5860 additions and 0 deletions

61
.eslintrc.json Normal file
View File

@ -0,0 +1,61 @@
{
"env": {
"es6": true,
"node": true
},
"extends": ["eslint:recommended", "plugin:promise/recommended"],
"parserOptions": {
"sourceType": "module",
"ecmaVersion": 2017
},
"plugins": ["promise"],
"rules": {
"no-console": "off",
"indent": [
"error",
2,
{
"SwitchCase": 1
}
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"warn",
"double"
],
"semi": [
"warn",
"always"
],
"keyword-spacing": [
"error", {
"before": true,
"after": true
}
],
"space-before-blocks": [
"error", {
"functions": "always",
"keywords": "always",
"classes": "always"
}
],
"space-before-function-paren": [
"error", {
"anonymous": "never",
"named": "never",
"asyncArrow": "always"
}
],
"prefer-const": [
"error", {
"destructuring": "any",
"ignoreReadBeforeAssign": false
}
],
"prefer-template": "error"
}
}

38
.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
cache/
data/
appold.js
migrate.js
config.json
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pids
*.pid
*.seed
*.pid.lock
lib-cov
coverage
.nyc_output
.grunt
bower_components
.lock-wscript
build/Release
node_modules/
jspm_packages/
typings/
.npm
.eslintcache
.node_repl_history
*.tgz
.yarn-integrity
.env
.next
.ftpconfig
coverage.lcov
bannedusers.json
*.code-workspace
todo.txt
tweets.json
.vscode/

47
app.js Normal file
View File

@ -0,0 +1,47 @@
// check if using node 10 or higher
if (process.version.slice(1).split(".")[0] < 10) throw new Error("Node 10.0.0 or higher is required. Update Node on your system.");
// turn fs.readdir into a promise
const { promisify } = require("util");
const fs = require("fs");
const readdir = promisify(fs.readdir);
// fancy loggings
const logger = require("./utils/logger.js");
// start the client
const client = require("./utils/client.js");
// initialize command loader
const handler = require("./utils/handler.js");
// registers stuff and logs in the bot
async function init() {
// register commands
const commands = await readdir("./commands/");
logger.log("info", `Attempting to load ${commands.length} commands...`);
commands.forEach(commandFile => {
logger.log("info", `Loading command ${commandFile}...`);
try {
handler.load(commandFile);
} catch (e) {
logger.error(`Failed to register command ${commandFile.split(".")[0]}: ${e}`);
}
});
// register events
const events = await readdir("./events/");
logger.log("info", `Attempting to load ${events.length} events...`);
events.forEach(file => {
logger.log("info", `Loading event ${file}...`);
const eventName = file.split(".")[0];
const event = require(`./events/${file}`);
client.on(eventName, event);
});
// login
client.connect();
// post to DBL
// require("./utils/dbl.js");
}
// launch the bot
init();

BIN
assets/ImpactMix.ttf Normal file

Binary file not shown.

BIN
assets/audio/boat.opus Normal file

Binary file not shown.

BIN
assets/audio/boi.opus Normal file

Binary file not shown.

BIN
assets/audio/bruh.opus Normal file

Binary file not shown.

BIN
assets/audio/bus.opus Normal file

Binary file not shown.

BIN
assets/audio/explosion.opus Normal file

Binary file not shown.

BIN
assets/audio/fart.opus Normal file

Binary file not shown.

BIN
assets/audio/fbi.opus Normal file

Binary file not shown.

BIN
assets/audio/fortnite.opus Normal file

Binary file not shown.

BIN
assets/audio/gethelp.opus Normal file

Binary file not shown.

BIN
assets/audio/johnwick.opus Normal file

Binary file not shown.

Binary file not shown.

BIN
assets/audio/mail.opus Normal file

Binary file not shown.

BIN
assets/audio/oof.opus Normal file

Binary file not shown.

BIN
assets/audio/ping.opus Normal file

Binary file not shown.

Binary file not shown.

BIN
assets/audio/upermario.opus Normal file

Binary file not shown.

BIN
assets/audio/winxp.opus Normal file

Binary file not shown.

BIN
assets/images/9gag.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
assets/images/bandicam.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
assets/images/brazzers.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
assets/images/funky.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

BIN
assets/images/hypercam.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
assets/images/ifunny.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
assets/images/scott.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
assets/images/sonic.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

29
commands/8ball.js Normal file
View File

@ -0,0 +1,29 @@
const { random } = require("../utils/misc.js");
exports.run = async () => {
const responses = [
"It is certain",
"It is decidedly so",
"Without a doubt",
"Yes, definitely",
"You may rely on it",
"As I see it, yes",
"Most likely",
"Outlook good",
"Yes",
"Signs point to yes",
"Reply hazy, try again",
"Ask again later",
"Better not tell you now",
"Cannot predict now",
"Concentrate and ask again",
"Don't count on it",
"My reply is no",
"My sources say no",
"Outlook not so good",
"Very doubtful"
];
return `🎱 ${random(responses)}`;
};
exports.aliases = ["magicball", "magikball", "magic8ball", "magik8ball", "eightball"];

22
commands/9gag.js Normal file
View File

@ -0,0 +1,22 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to add a 9GAG watermark!`;
message.channel.sendTyping();
const watermark = "./assets/images/9gag.png";
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const data = gm(imageBuffer).composite(watermark).gravity("East");
const resultBuffer = await gmToBuffer(data);
return message.channel.createMessage("", {
file: resultBuffer,
name: `9gag.${image.type}`
});
};
exports.aliases = ["ninegag", "gag"];

13
commands/avatar.js Normal file
View File

@ -0,0 +1,13 @@
const client = require("../utils/client.js");
exports.run = async (message, args) => {
if (message.mentions[0] !== undefined) {
return message.mentions[0].avatarURL;
} else if (client.users.get(args[0]) !== undefined) {
return client.users.get(args[0]).avatarURL;
} else {
return message.author.avatarURL;
}
};
exports.aliases = ["pfp", "ava"];

18
commands/ban.js Normal file
View File

@ -0,0 +1,18 @@
const client = require("../utils/client.js");
exports.run = async (message) => {
if (!message.member.permission.has("banMembers")) return `${message.author.mention}, you need to have the \`Ban Members\` permission on this server to ban people!`;
if (!message.channel.guild.members.get(client.user.id).permission.has("banMembers") && !message.channel.permissionsOf(client.user.id).has("banMembers")) return `${message.author.mention}, I don't have the \`Ban Members\` permission!`;
const member = message.mentions[0];
if (member) {
try {
await message.channel.guild.banMember(member.id);
return `Successfully banned ${member.mention}.`;
} catch (error) {
console.error(error);
return `${message.author.mention}, I was unable to ban the member. Have you given me permissions?`;
}
} else {
return `${message.author.mention}, you need to provide a member to ban!`;
}
};

25
commands/bandicam.js Normal file
View File

@ -0,0 +1,25 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to add a Bandicam watermark!`;
message.channel.sendTyping();
const watermark = "./assets/images/bandicam.png";
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
gm(imageBuffer).size(async (error, size) => {
if (error) console.error;
const data = gm(imageBuffer).composite(watermark).gravity("North").resize(null, size.height);
const resultBuffer = await gmToBuffer(data);
return message.channel.createMessage("", {
file: resultBuffer,
name: `bandicam.${image.type}`
});
});
};
exports.aliases = ["bandi"];

17
commands/bird.js Normal file
View File

@ -0,0 +1,17 @@
const fetch = require("node-fetch");
exports.run = async (message) => {
message.channel.sendTyping();
const imageData = await fetch("http://shibe.online/api/birds");
const json = await imageData.json();
return message.channel.createMessage({
embed: {
color: 16711680,
image: {
url: json[0]
}
}
});
};
exports.aliases = ["birb", "birds", "birbs"];

15
commands/blur.js Normal file
View File

@ -0,0 +1,15 @@
const sharp = require("sharp");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to blur!`;
message.channel.sendTyping();
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const resultBuffer = await sharp(imageBuffer).blur(5).toBuffer();
return message.channel.createMessage("", {
file: resultBuffer,
name: `blur.${image.type}`
});
};

21
commands/blurple.js Normal file
View File

@ -0,0 +1,21 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to make blurple!`;
message.channel.sendTyping();
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const data = gm(imageBuffer).threshold(75, true).out("+level-colors").out("\"#7289DA\",white");
const resultBuffer = await gmToBuffer(data);
return message.channel.createMessage("", {
file: resultBuffer,
name: `blurple.${image.type}`
});
};
exports.aliases = ["blurp"];

7
commands/boat.js Normal file
View File

@ -0,0 +1,7 @@
const playSound = require("../utils/soundplayer.js");
exports.run = async (message) => {
return playSound("./assets/audio/boat.opus", message);
};
exports.aliases = ["tape", "flextape", "phil", "philswift"];

7
commands/boi.js Normal file
View File

@ -0,0 +1,7 @@
const playSound = require("../utils/soundplayer.js");
exports.run = async (message) => {
return playSound("./assets/audio/boi.opus", message);
};
exports.aliases = ["boy", "neutron", "hugh"];

25
commands/brazzers.js Normal file
View File

@ -0,0 +1,25 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to add a Brazzers watermark!`;
message.channel.sendTyping();
const watermark = "./assets/images/brazzers.png";
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
gm(imageBuffer).size(async (error, size) => {
if (error) console.error;
const data = gm(imageBuffer).composite(watermark).gravity("SouthEast").resize(size.width, null);
const resultBuffer = await gmToBuffer(data);
return message.channel.createMessage("", {
file: resultBuffer,
name: `brazzers.${image.type}`
});
});
};
exports.aliases = ["brazzer", "br"];

7
commands/bruh.js Normal file
View File

@ -0,0 +1,7 @@
const playSound = require("../utils/soundplayer.js");
exports.run = async (message) => {
return playSound("./assets/audio/bruh.opus", message);
};
exports.aliases = ["bro"];

7
commands/bus.js Normal file
View File

@ -0,0 +1,7 @@
const playSound = require("../utils/soundplayer.js");
exports.run = async (message) => {
return playSound("./assets/audio/bus.opus", message);
};
exports.aliases = ["noyelling", "busyell"];

22
commands/cat.js Normal file
View File

@ -0,0 +1,22 @@
const fetch = require("node-fetch");
const config = require("../config.json");
exports.run = async (message) => {
message.channel.sendTyping();
const data = await fetch("https://api.thecatapi.com/v1/images/search?format=json", {
headers: {
"x-api-key": config.catToken
}
});
const json = await data.json();
return message.channel.createMessage({
embed: {
color: 16711680,
image: {
url: json[0].url
}
}
});
};
exports.aliases = ["kitters", "kitties", "kitty", "cattos", "catto", "cats"];

10
commands/catfact.js Normal file
View File

@ -0,0 +1,10 @@
const fetch = require("node-fetch");
exports.run = async (message) => {
message.channel.sendTyping();
const imageData = await fetch("https://catfact.ninja/fact");
const json = await imageData.json();
return `🐱 **Did you know?** ${json.fact}`;
};
exports.aliases = ["kittyfact"];

21
commands/circle.js Normal file
View File

@ -0,0 +1,21 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to add radial blur!`;
message.channel.sendTyping();
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const data = gm(imageBuffer).out("-radial-blur", 10);
const resultBuffer = await gmToBuffer(data);
return message.channel.createMessage("", {
file: resultBuffer,
name: `circle.${image.type}`
});
};
exports.aliases = ["cblur", "radial", "radialblur"];

66
commands/cowsay.js Normal file
View File

@ -0,0 +1,66 @@
const cowsay = require("cowsay");
exports.run = async (message, args) => {
const cowList = ["beavis.zen",
"bong",
"bud-frogs",
"bunny",
"cheese",
"cower",
"daemon",
"default",
"doge",
"dragon-and-cow",
"dragon",
"elephant-in-snake",
"elephant",
"eyes",
"flaming-sheep",
"ghostbusters",
"goat",
"hedgehog",
"hellokitty",
"kiss",
"kitty",
"koala",
"kosh",
"luke-koala",
"mech-and-cow",
"meow",
"milk",
"moofasa",
"moose",
"mutilated",
"ren",
"satanic",
"sheep",
"skeleton",
"small",
"squirrel",
"stegosaurus",
"stimpy",
"supermilker",
"surgery",
"telebears",
"turkey",
"turtle",
"tux",
"vader-koala",
"vader",
"whale",
"www"
];
if (args.length === 0) {
return `${message.author.mention}, you need to provide some text for the cow to say!`;
} else if (cowList.indexOf(args[0].toLowerCase()) > -1) {
const cow = args.shift().toLowerCase();
return `\`\`\`\n${cowsay.say({
text: args.join(" "),
f: cow
})}\n\`\`\``;
} else {
return `\`\`\`\n${cowsay.say({ text: args.join(" ") })}\n\`\`\``;
}
};
exports.aliases = ["cow"];

5
commands/dbl.js Normal file
View File

@ -0,0 +1,5 @@
exports.run = async (message) => {
return `${message.author.mention}, my DBL page can be found here: <https://discordbots.org/bot/429305856241172480>`;
};
exports.aliases = ["discordbotlist", "botlist", "discordbots"];

6
commands/decode.js Normal file
View File

@ -0,0 +1,6 @@
exports.run = async (message, args) => {
const b64Decoded = Buffer.from(args.join(" "), "base64").toString("utf-8");
return `\`\`\`\n${b64Decoded}\`\`\``;
};
exports.aliases = ["b64decode", "base64decode"];

25
commands/deviantart.js Normal file
View File

@ -0,0 +1,25 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to add a DeviantArt watermark!`;
message.channel.sendTyping();
const watermark = "./assets/images/deviantart.png";
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
gm(imageBuffer).size(async (error, size) => {
if (error) console.error;
const data = gm(imageBuffer).composite(watermark).gravity("Center").resize(null, size.height);
const resultBuffer = await gmToBuffer(data);
return message.channel.createMessage("", {
file: resultBuffer,
name: `deviantart.${image.type}`
});
});
};
exports.aliases = ["da", "deviant"];

15
commands/dice.js Normal file
View File

@ -0,0 +1,15 @@
const misc = require("../utils/misc.js");
exports.run = async (message, args) => {
if (args.length === 0) {
return `🎲 The dice landed on ${misc.random(Array.from(Array(6).keys())) + 1}.`;
} else {
if (args[0].match(/^\d+$/)) {
return `🎲 The dice landed on ${misc.random(Array.from(Array(parseInt(args[0])).keys())) + 1}.`;
} else {
return `🎲 The dice landed on ${misc.random(Array.from(Array(6).keys())) + 1}.`;
}
}
};
exports.aliases = ["roll", "die", "rng", "random"];

17
commands/dog.js Normal file
View File

@ -0,0 +1,17 @@
const fetch = require("node-fetch");
exports.run = async (message) => {
message.channel.sendTyping();
const imageData = await fetch("https://dog.ceo/api/breeds/image/random");
const json = await imageData.json();
return message.channel.createMessage({
embed: {
color: 16711680,
image: {
url: json.message
}
}
});
};
exports.aliases = ["doggos", "doggo", "pupper", "puppers", "dogs", "puppy", "puppies", "pups", "pup"];

10
commands/dogfact.js Normal file
View File

@ -0,0 +1,10 @@
const fetch = require("node-fetch");
exports.run = async (message) => {
message.channel.sendTyping();
const imageData = await fetch("https://dog-api.kinduff.com/api/facts");
const json = await imageData.json();
return `🐶 **Did you know?** ${json.facts[0]}`;
};
exports.aliases = ["pupfact"];

6
commands/encode.js Normal file
View File

@ -0,0 +1,6 @@
exports.run = async (message, args) => {
const b64Encoded = Buffer.from(args.join(" ")).toString("base64");
return `\`\`\`\n${b64Encoded}\`\`\``;
};
exports.aliases = ["b64encode", "base64encode"];

15
commands/eval.js Normal file
View File

@ -0,0 +1,15 @@
const { clean } = require("../utils/misc.js");
exports.run = async (message, args) => {
if (message.author.id !== "198198681982205953") return `${message.author.mention}, only the bot owner can use eval!`;
const code = args.join(" ");
try {
const evaled = eval(code);
const cleaned = await clean(evaled);
return `\`\`\`js\n${cleaned}\n\`\`\``;
} catch (err) {
return `\`ERROR\` \`\`\`xl\n${await clean(err)}\n\`\`\``;
}
};
exports.aliases = ["run"];

21
commands/explode.js Normal file
View File

@ -0,0 +1,21 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to explode!`;
message.channel.sendTyping();
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const data = gm(imageBuffer).implode([-2]);
const resultBuffer = await gmToBuffer(data);
return message.channel.createMessage("", {
file: resultBuffer,
name: `explode.${image.type}`
});
};
exports.aliases = ["exp"];

5
commands/explosion.js Normal file
View File

@ -0,0 +1,5 @@
const playSound = require("../utils/soundplayer.js");
exports.run = async (message) => {
return playSound("./assets/audio/explosion.opus", message);
};

7
commands/fakeping.js Normal file
View File

@ -0,0 +1,7 @@
const playSound = require("../utils/soundplayer.js");
exports.run = async (message) => {
return playSound("./assets/audio/ping.opus", message);
};
exports.aliases = ["notification", "notif"];

7
commands/fart.js Normal file
View File

@ -0,0 +1,7 @@
const playSound = require("../utils/soundplayer.js");
exports.run = async (message) => {
return playSound("./assets/audio/fart.opus", message);
};
exports.aliases = ["toot"];

7
commands/fbi.js Normal file
View File

@ -0,0 +1,7 @@
const playSound = require("../utils/soundplayer.js");
exports.run = async (message) => {
return playSound("./assets/audio/fbi.opus", message);
};
exports.aliases = ["openup"];

35
commands/feedback.js Normal file
View File

@ -0,0 +1,35 @@
const client = require("../utils/client.js");
exports.run = async (message, args) => {
if (args.length !== 0) {
const feedbackChannel = client.guilds.get("592399417676529688").channels.get("592429860769497098");
feedbackChannel.createMessage({
embed: {
color: 16711680,
timestamp: new Date(),
thumbnail: {
url: message.author.avatarURL
},
author: {
name: "esmBot Feedback",
icon_url: client.user.avatarURL
},
fields: [{
name: "👥 Author:",
value: `${message.author.username}#${message.author.discriminator}`
}, {
name: "👪 Server:",
value: message.channel.guild.name
}, {
name: "💬 Message:",
value: args.join(" ")
}]
}
});
return `${message.author.mention}, your feedback has been sent!`;
} else {
return `${message.author.mention}, you need to provide some feedback to send!`;
}
};
exports.aliases = ["request", "report", "complain", "compliment"];

15
commands/flip.js Normal file
View File

@ -0,0 +1,15 @@
const sharp = require("sharp");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to flip!`;
message.channel.sendTyping();
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const resultBuffer = await sharp(imageBuffer).flip().toBuffer();
return message.channel.createMessage("", {
file: resultBuffer,
name: `flip.${image.type}`
});
};

17
commands/flop.js Normal file
View File

@ -0,0 +1,17 @@
const sharp = require("sharp");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to flop!`;
message.channel.sendTyping();
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const resultBuffer = await sharp(imageBuffer).flop().toBuffer();
return message.channel.createMessage("", {
file: resultBuffer,
name: `flop.${image.type}`
});
};
exports.aliases = ["flip2"];

7
commands/fortnite.js Normal file
View File

@ -0,0 +1,7 @@
const playSound = require("../utils/soundplayer.js");
exports.run = async (message) => {
return playSound("./assets/audio/fortnite.opus", message);
};
exports.aliases = ["dance", "defaultdance"];

6
commands/fullwidth.js Normal file
View File

@ -0,0 +1,6 @@
exports.run = async (message, args) => {
if (args.length === 0) return `${message.author.mention}, you need to provide some text to convert to fullwidth!`;
return args.join("").replace(/[A-Za-z0-9]/g, (s) => { return String.fromCharCode(s.charCodeAt(0) + 0xFEE0); });
};
exports.aliases = ["aesthetic", "aesthetics", "aes"];

25
commands/funky.js Normal file
View File

@ -0,0 +1,25 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to add New Funky Mode!`;
message.channel.sendTyping();
const watermark = "./assets/images/funky.png";
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
gm(imageBuffer).size(async (error, size) => {
if (error) console.error;
const data = gm(imageBuffer).composite(watermark).gravity("NorthEast").resize(null, size.height);
const resultBuffer = await gmToBuffer(data);
return message.channel.createMessage("", {
file: resultBuffer,
name: `funky.${image.type}`
});
});
};
exports.aliases = ["funkymode", "newfunkymode", "funkykong"];

32
commands/haah.js Normal file
View File

@ -0,0 +1,32 @@
// really don't like this file
const gm = require("gm").subClass({
imageMagick: true
});
const tempy = require("tempy");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to mirror!`;
message.channel.sendTyping();
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const data = tempy.file({ extension: image.type });
const data2 = tempy.file({ extension: image.type });
gm(imageBuffer).gravity("West").crop("50%", 0).strip().write(data2, (error) => {
if (error) console.error;
gm(data2).flop().strip().write(data, async (error) => {
if (error) console.error;
gm(data2).append(data, true).toBuffer(image.type, (error, resultBuffer) => {
if (error) console.error;
return message.channel.createMessage("", {
file: resultBuffer,
name: `haah.${image.type}`
});
});
});
});
};
exports.aliases = ["magik4", "mirror2"];

6
commands/help.js Normal file
View File

@ -0,0 +1,6 @@
const database = require("../utils/database.js");
exports.run = async (message) => {
const guildConf = database.settings.get(message.channel.guild.id);
return `${message.author.mention}, my command list can be found here: https://essem.space/esmBot/commands.html?dev=true\nThis server's prefix is \`${guildConf.prefix[0]}\`.`;
};

32
commands/hooh.js Normal file
View File

@ -0,0 +1,32 @@
// really don't like this file
const gm = require("gm").subClass({
imageMagick: true
});
const tempy = require("tempy");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to mirror!`;
message.channel.sendTyping();
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const data = tempy.file({ extension: image.type });
const data2 = tempy.file({ extension: image.type });
gm(imageBuffer).gravity("South").crop(0, "50%").strip().write(data2, (error) => {
if (error) console.error;
gm(data2).flip().strip().write(data, async (error) => {
if (error) console.error;
gm(data).append(data2).toBuffer(image.type, (error, resultBuffer) => {
if (error) console.error;
return message.channel.createMessage("", {
file: resultBuffer,
name: `hooh.${image.type}`
});
});
});
});
};
exports.aliases = ["magik6", "mirror4"];

25
commands/hypercam.js Normal file
View File

@ -0,0 +1,25 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to add a Hypercam watermark!`;
message.channel.sendTyping();
const watermark = "./assets/images/hypercam.png";
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
gm(imageBuffer).size(async (error, size) => {
if (error) console.error;
const data = gm(imageBuffer).composite(watermark).gravity("NorthWest").resize(null, size.height);
const resultBuffer = await gmToBuffer(data);
return message.channel.createMessage("", {
file: resultBuffer,
name: `hypercam.${image.type}`
});
});
};
exports.aliases = ["hcam"];

23
commands/ifunny.js Normal file
View File

@ -0,0 +1,23 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to add a iFunny watermark!`;
message.channel.sendTyping();
const watermark = "./assets/images/ifunny.png";
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
gm(imageBuffer).size(async (error, size) => {
if (error) console.error;
const data = gm(imageBuffer).append(watermark).gravity("South").resize(size.width, null);
const resultBuffer = await gmToBuffer(data);
return message.channel.createMessage("", {
file: resultBuffer,
name: `ifunny.${image.type}`
});
});
};

35
commands/image.js Normal file
View File

@ -0,0 +1,35 @@
const GoogleImages = require("google-images");
const client = require("../utils/client.js");
const paginator = require("../utils/pagination/pagination");
const config = require("../config.json");
exports.run = async (message, args) => {
if (!message.channel.guild.members.get(client.user.id).permission.has("addReactions") && !message.channel.permissionsOf(client.user.id).has("addReactions")) return `${message.author.mention}, I don't have the \`Add Reactions\` permission!`;
if (!message.channel.guild.members.get(client.user.id).permission.has("embedLinks") && !message.channel.permissionsOf(client.user.id).has("embedLinks")) return `${message.author.mention}, I don't have the \`Embed Links\` permission!`;
if (args.length === 0) return `${message.author.mention}, you need to provide something to search for!`;
const embeds = [];
const imageSearch = new GoogleImages(config.cseID, config.googleKey);
const images = await imageSearch.search(args.join(" "), { safe: "high" });
for (const [i, value] of images.entries()) {
embeds.push({
"embed": {
"title": "Search Results",
"color": 16711680,
"footer": {
"text": `Page ${i + 1} of ${images.length}`
},
"image": {
"url": value.url
},
"author": {
"name": message.author.username,
"icon_url": message.author.avatarURL
}
}
});
}
if (embeds.length === 0) return `${message.author.mention}, I couldn't find any results!`;
return paginator(message, embeds);
};
exports.aliases = ["im", "photo", "img"];

21
commands/implode.js Normal file
View File

@ -0,0 +1,21 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to implode!`;
message.channel.sendTyping();
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const data = gm(imageBuffer).implode([1]);
const resultBuffer = await gmToBuffer(data);
return message.channel.createMessage("", {
file: resultBuffer,
name: `implode.${image.type}`
});
};
exports.aliases = ["imp"];

41
commands/info.js Normal file
View File

@ -0,0 +1,41 @@
const client = require("../utils/client.js");
const config = require("../config.json");
exports.run = async (message) => {
const dev = client.users.get(config.botOwner);
const artist = client.users.get("401980971517214723");
const infoEmbed = {
"embed": {
"description": "**You are currently using esmBot Dev! Things may change at any time without warning and there will be bugs. Many bugs.**",
"color": 16711680,
"author": {
"name": "esmBot Info/Credits",
"icon_url": client.user.avatarURL
},
"fields": [{
"name": "📝 Credits:",
"value": `Bot by **${dev.username}#${dev.discriminator}**\nIcon by **${artist.username}#${artist.discriminator}**`
},
{
"name": "👪 Total Users:",
"value": client.users.size
},
{
"name": "💬 Total Servers:",
"value": client.guilds.size
},
{
"name": "✅ Official Server:",
"value": "[Click here!](https://discord.gg/vfFM7YT)"
},
{
"name": "💻 Source Code:",
"value": "[Click here!](https://github.com/TheEssem/esmBot-rewrite)"
}
]
}
};
return message.channel.createMessage(infoEmbed);
};
exports.aliases = ["botinfo", "credits"];

21
commands/invert.js Normal file
View File

@ -0,0 +1,21 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to invert!`;
message.channel.sendTyping();
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const data = gm(imageBuffer).negative();
const resultBuffer = await gmToBuffer(data);
return message.channel.createMessage("", {
file: resultBuffer,
name: `invert.${image.type}`
});
};
exports.aliases = ["inverse", "negate", "negative"];

3
commands/invite.js Normal file
View File

@ -0,0 +1,3 @@
exports.run = async (message) => {
return `${message.author.mention}, you can invite me to your server here: <https://discordapp.com/oauth2/authorize?client_id=515571942418546689&scope=bot&permissions=70642766>`;
};

21
commands/jpeg.js Normal file
View File

@ -0,0 +1,21 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to add more JPEG!`;
message.channel.sendTyping();
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const data = gm(imageBuffer).setFormat("jpg").quality(1);
const resultBuffer = await gmToBuffer(data);
return message.channel.createMessage("", {
file: resultBuffer,
name: "jpeg.jpg"
});
};
exports.aliases = ["needsmorejpeg", "jpegify", "magik2", "morejpeg", "jpg"];

18
commands/kick.js Normal file
View File

@ -0,0 +1,18 @@
const client = require("../utils/client.js");
exports.run = async (message) => {
if (!message.member.permission.has("kickMembers")) return `${message.author.mention}, you need to have the \`Kick Members\` permission on this server to kick people!`;
if (!message.channel.guild.members.get(client.user.id).permission.has("kickMembers") && !message.channel.permissionsOf(client.user.id).has("kickMembers")) return `${message.author.mention}, I don't have the \`Kick Members\` permission!`;
const member = message.mentions[0];
if (member) {
try {
await message.channel.guild.kickMember(member.id);
return `Successfully kicked ${member.mention}.`;
} catch (error) {
console.error(error);
return `${message.author.mention}, I was unable to kick the member. Have you given me permissions?`;
}
} else {
return `${message.author.mention}, you need to provide a member to kick!`;
}
};

12
commands/lengthen.js Normal file
View File

@ -0,0 +1,12 @@
const urlCheck = require("../utils/urlcheck.js");
exports.run = async (message, args) => {
message.channel.sendTyping();
if (args.length === 0 || !urlCheck(args[0])) return `${message.author.mention}, you need to provide a short URL to lengthen!`;
if (urlCheck(args[0])) {
const url = await require("url-unshort")().expand(args[0]);
return url;
}
};
exports.aliases = ["longurl", "lengthenurl", "longuri", "lengthenuri", "unshorten"];

28
commands/magik.js Normal file
View File

@ -0,0 +1,28 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to add some magik!`;
const processMessage = await message.channel.createMessage("<a:processing:479351417102925854> Processing... This might take a while");
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
gm(imageBuffer).resize(800, 800).stream((error, stream) => {
if (error) console.error;
gm(stream).out("-liquid-rescale", "400x400").stream(async (error, stream2) => {
if (error) console.error;
const data = gm(stream2).out("-liquid-rescale", "1200x1200");
const resultBuffer = await gmToBuffer(data);
await processMessage.delete();
return message.channel.createMessage("", {
file: resultBuffer,
name: `magik.${image.type}`
});
});
});
};
exports.aliases = ["imagemagic", "imagemagick", "imagemagik", "magic", "magick", "cas", "liquid"];

7
commands/mail.js Normal file
View File

@ -0,0 +1,7 @@
const playSound = require("../utils/soundplayer.js");
exports.run = async (message) => {
return playSound("./assets/audio/mail.opus", message);
};
exports.aliases = ["yougotmail", "youvegotmail", "aol"];

14
commands/mc.js Normal file
View File

@ -0,0 +1,14 @@
const fetch = require("node-fetch");
exports.run = async (message, args) => {
if (args.length === 0) return `${message.author.mention}, you need to provide some text to generate a Minecraft achievement!`;
message.channel.sendTyping();
const request = await fetch(`https://www.minecraftskinstealer.com/achievement/a.php?i=13&h=Achievement+get%21&t=${args.join("+")}`);
const buffer = await request.buffer();
return message.channel.createMessage("", {
file: buffer,
name: "mc.png"
});
};
exports.aliases = ["ach", "achievement", "minecraft"];

32
commands/meme.js Normal file
View File

@ -0,0 +1,32 @@
const { spawn } = require("child_process");
const fetch = require("node-fetch");
exports.run = async (message, args) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to generate a meme!`;
if (args.length === 0) return `${message.author.mention}, you need to provide some text to generate a meme!`;
message.channel.sendTyping();
const request = await fetch(image.url);
const buffer = await request.buffer();
const [topText, bottomText] = args.join(" ").split(",").map(elem => elem.trim());
const child = spawn("./utils/meme.sh", [topText.toUpperCase().replace(/\\/g, "\\\\"), bottomText ? bottomText.toUpperCase().replace(/\\/g, "\\\\") : ""]);
child.stdin.write(buffer);
child.stdin.end();
const chunks = [];
child.stdout.on("data", (data) => {
chunks.push(data);
});
child.once("error", (error) => {
if (error) console.error;
});
child.stderr.once("data", (error) => {
if (error) console.error;
});
child.stdout.once("close", () => {
const data = Buffer.concat(chunks);
return message.channel.createMessage("", {
file: data,
name: "meme.png"
});
});
};

34
commands/memecenter.js Normal file
View File

@ -0,0 +1,34 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to add a MemeCenter watermark!`;
message.channel.sendTyping();
const watermark = "./assets/images/memecenter.png";
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
let resultBuffer;
gm(imageBuffer).size(async (error, size) => {
if (error) console.error;
const command = gm(imageBuffer).out(watermark).background("#FFFFFF").gravity("East").out("-smush").out("-9");
const output = await gmToBuffer(command);
gm(output).size(async (error, size2) => {
if (error) console.error;
resultBuffer = output;
if (size.width !== size2.width) {
const command2 = gm(output).gravity("West").chop(size2.width - size.width, 0);
resultBuffer = await gmToBuffer(command2);
}
return message.channel.createMessage("", {
file: resultBuffer,
name: "memecenter.png"
});
});
});
};
exports.aliases = ["memec", "mcenter"];

7
commands/oof.js Normal file
View File

@ -0,0 +1,7 @@
const playSound = require("../utils/soundplayer.js");
exports.run = async (message) => {
return playSound("./assets/audio/oof.opus", message);
};
exports.aliases = ["roblox", "commitdie"];

8
commands/ping.js Normal file
View File

@ -0,0 +1,8 @@
const client = require("../utils/client.js");
exports.run = async (message) => {
const pingMessage = await client.createMessage(message.channel.id, "🏓 Ping?");
return pingMessage.edit(`🏓 Pong! Latency is ${pingMessage.timestamp - message.timestamp}ms. API Latency is ${Math.round(client.shards.get(client.guildShardMap[message.channel.guild.id]).latency)}ms.`);
};
exports.aliases = ["pong"];

25
commands/play.js Normal file
View File

@ -0,0 +1,25 @@
const client = require("../utils/client.js");
exports.run = async (message) => {
if (message.member.voiceState.channelID) {
if (!message.channel.guild.members.get(client.user.id).permission.has("voiceConnect") || !message.channel.permissionsOf(client.user.id).has("voiceConnect")) return `${message.author.mention}, I can't join this voice channel!`;
if (message.author.id !== "198198681982205953") return "this command is for testing and is restricted to owners lol";
const voiceChannel = message.channel.guild.channels.get(message.member.voiceState.channelID);
client.createMessage(message.channel.id, "🔊 Playing music...");
const connection = await voiceChannel.join();
connection.play(message.attachments[0].url, {
inlineVolume: true
});
connection.setVolume(0.5);
connection.on("error", () => {
voiceChannel.leave();
console.error;
});
connection.on("end", () => {
voiceChannel.leave();
return "This music session has now ended.";
});
} else {
return `${message.author.mention}, you need to be in a voice channel first!`;
}
};

13
commands/prefix.js Normal file
View File

@ -0,0 +1,13 @@
const database = require("../utils/database.js");
exports.run = async (message, args) => {
if (args.length !== 0) {
if (!message.member.permission.has("administrator") && message.member.id !== "198198681982205953") return `${message.author.mention}, you need to be an administrator to change the bot prefix!`;
database.settings.set(message.channel.guild.id, args[0], "prefix");
return `The prefix has been changed to ${args[0]}.`;
} else {
return `${message.author.mention}, the current prefix is \`${database.settings.get(message.channel.guild.id, "prefix")}\`.`;
}
};
exports.aliases = ["setprefix", "changeprefix", "checkprefix"];

7
commands/prunejuice.js Normal file
View File

@ -0,0 +1,7 @@
const playSound = require("../utils/soundplayer.js");
exports.run = async (message) => {
return playSound("./assets/audio/prunejuice.opus", message);
};
exports.aliases = ["juice", "grandma"];

20
commands/purge.js Normal file
View File

@ -0,0 +1,20 @@
const client = require("../utils/client.js");
exports.run = async (message, args) => {
if (!message.member.permission.has("manageMessages")) return `${message.author.mention}, you need to have the \`Manage Messages\` permission on this server to ban people!`;
if (!message.channel.guild.members.get(client.user.id).permission.has("manageMessages") && !message.channel.permissionsOf(client.user.id).has("manageMessages")) return `${message.author.mention}, I don't have the \`Manage Messages\` permission!`;
if (args.length === 0 || !args[0].match(/^\d+$/)) return `${message.author.mention}, you need to provide the number of messages to purge!`;
const numberOfMessages = parseInt(args[0]) + 1;
const messageCollection = await message.channel.getMessages(numberOfMessages);
const messages = [];
for (const messageObject of messageCollection) {
messages.push(messageObject.id);
}
await message.channel.deleteMessages(messages);
const purgeMessage = await message.channel.createMessage(`Successfully purged ${args[0]} messages.`);
await require("util").promisify(setTimeout)(10000);
await purgeMessage.delete();
return;
};
exports.aliases = ["prune"];

23
commands/qrcreate.js Normal file
View File

@ -0,0 +1,23 @@
const qrcode = require("qrcode");
const stream = require("stream");
exports.run = async (message, args) => {
if (args.length === 0) return `${message.author.mention}, you need to provide some text to generate a QR code!`;
message.channel.sendTyping();
const writable = new stream.PassThrough();
qrcode.toFileStream(writable, args.join(" "), { margin: 1 });
const chunks = [];
writable.on("data", (chunk) => {
chunks.push(chunk);
});
writable.once("error", (error) => {
if (error) console.error;
});
writable.once("end", () => {
const imageBuffer = Buffer.concat(chunks);
return message.channel.createMessage("", {
file: imageBuffer,
name: "qr.png"
});
});
};

14
commands/qrread.js Normal file
View File

@ -0,0 +1,14 @@
const fetch = require("node-fetch");
const jsqr = require("jsqr");
const sharp = require("sharp");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image with a QR code to read it!`;
message.channel.sendTyping();
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const rawData = await sharp(imageBuffer).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
const qrBuffer = jsqr(rawData.data, rawData.info.width, rawData.info.height);
return `\`\`\`\n${qrBuffer.data}\n\`\`\``;
};

13
commands/reload.js Normal file
View File

@ -0,0 +1,13 @@
const handler = require("../utils/handler.js");
exports.run = async (message, args) => {
if (message.author.id !== require("../config.json").botOwner) return `${message.author.mention}, only the bot owner can reload commands!`;
if (args.length === 0) return `${message.author.mention}, you need to provide a command to reload!`;
try {
await handler.unload(args[0]);
await handler.load(args[0]);
return `${message.author.mention}, the command \`${args[0]}\` has been reloaded.`;
} catch (error) {
if (error) console.error;
}
};

13
commands/restart.js Normal file
View File

@ -0,0 +1,13 @@
const handler = require("../utils/handler.js");
const collections = require("../utils/collections.js");
exports.run = async (message) => {
if (message.author.id !== require("../config.json").botOwner) return `${message.author.mention}, only the bot owner can restart me!`;
await message.channel.createMessage(`${message.author.mention}, esmBot is restarting.`);
collections.commands.forEach(async (command) => {
await handler.unload(command);
});
process.exit(1);
};
exports.aliases = ["reboot"];

21
commands/retro.js Normal file
View File

@ -0,0 +1,21 @@
const RetroText = require("retrotext");
exports.run = async (message, args) => {
if (args.length === 0) return `${message.author.mention}, you need to provide some text to generate some retro text!`;
const [line1, line2, line3] = args.join(" ").split(",").map(elem => elem.trim());
if (/^[\w ]+$/i.test(line1) === false || /^[\w ]+$/i.test(line2) === false || /^[\w ]+$/i.test(line3) === false) return `${message.author.mention}, only alphanumeric characters, spaces, and underscores are allowed!`;
message.channel.sendTyping();
let text;
if (line3) {
text = new RetroText().setLine(1, line1).setLine(2, line2).setLine(3, line3).setBackgroundStyle("outlineTri").setTextStyle("chrome");
} else if (line2) {
text = new RetroText().setLine(1, line1).setLine(2, line2).setBackgroundStyle("outlineTri").setTextStyle("chrome");
} else {
text = new RetroText().setLine(2, line1).setBackgroundStyle("outlineTri").setTextStyle("chrome");
}
const textImage = await text.fetchBuffer();
return message.channel.createMessage("", {
file: textImage,
name: "retro.png"
});
};

25
commands/rps.js Normal file
View File

@ -0,0 +1,25 @@
exports.run = async (message, args) => {
if (args.length === 0 || (args[0] !== "rock" && args[0] !== "paper" && args[0] !== "scissors")) return `${message.author.mention}, you need to choose whether you want to be rock, paper, or scissors!`;
let emoji;
let winOrLose;
const result = require("../utils/misc.js").random(["rock", "paper", "scissors"]);
switch (result) {
case "rock":
emoji = "✊";
if (args[0].toLowerCase() === "paper") winOrLose = 1;
break;
case "paper":
emoji = "✋";
if (args[0].toLowerCase() === "scissors") winOrLose = 1;
break;
case "scissors":
emoji = "✌";
if (args[0].toLowerCase() === "rock") winOrLose = 1;
break;
default:
break;
}
return args[0].toLowerCase() === result ? `${emoji} I chose ${result}. It's a tie!` : `${emoji} I chose ${result}. ${winOrLose ? "You win!" : "You lose!"}`;
};
exports.aliases = ["rockpaperscissors"];

25
commands/scott.js Normal file
View File

@ -0,0 +1,25 @@
const gm = require("gm").subClass({
imageMagick: true
});
const gmToBuffer = require("../utils/gmbuffer.js");
const fetch = require("node-fetch");
const fs = require("fs");
exports.run = async (message) => {
const image = await require("../utils/imagedetect.js")(message);
if (image === undefined) return `${message.author.mention}, you need to provide an image to make a Scott the Woz TV meme!`;
message.channel.sendTyping();
const template = "./assets/images/scott.png";
const imageData = await fetch(image.url);
const imageBuffer = await imageData.buffer();
const path = require("tempy").file({ extension: image.type });
require("util").promisify(fs.writeFile)(path, imageBuffer);
const command = gm(template).out("-gravity").out("Center").out("(").out(path).out("-virtual-pixel").out("transparent").out("-resize").out("415x234!").out("+distort").out("Perspective").out("0,0 129,187 415,0 517,182 415,234 517,465 0,234 132,418").out("-geometry").out("-110+83").out(")").out("-composite");
const resultBuffer = await gmToBuffer(command);
return message.channel.createMessage("", {
file: resultBuffer,
name: "scott.png"
});
};
exports.aliases = ["woz", "tv", "porn"];

Some files were not shown because too many files have changed in this diff Show More