mirror of
https://github.com/keanuplayz/TravBot-v3.git
synced 2024-08-15 02:33:12 +00:00
Ported events and welcome event
This commit is contained in:
parent
6a4107c01e
commit
ee9c88996e
8 changed files with 1074 additions and 48 deletions
944
package-lock.json
generated
944
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -5,6 +5,7 @@
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"canvas": "^2.7.0",
|
||||||
"chalk": "^4.1.0",
|
"chalk": "^4.1.0",
|
||||||
"discord.js": "^12.5.1",
|
"discord.js": "^12.5.1",
|
||||||
"discord.js-lavalink-lib": "^0.1.8",
|
"discord.js-lavalink-lib": "^0.1.8",
|
||||||
|
|
|
@ -55,6 +55,79 @@ export default new Command({
|
||||||
$.channel.send(`The custom prefix for this guild is now \`${$.args[0]}\`.`);
|
$.channel.send(`The custom prefix for this guild is now \`${$.args[0]}\`.`);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
}),
|
||||||
|
welcome: new Command({
|
||||||
|
description: "Configure your server's welcome settings for the bot.",
|
||||||
|
usage: "type/channel <...>",
|
||||||
|
run: "You need to specify which part to modify, `type`/`channel`.",
|
||||||
|
subcommands: {
|
||||||
|
type: new Command({
|
||||||
|
description:
|
||||||
|
"Sets how welcome messages are displayed for your server. Removes welcome messages if unspecified.",
|
||||||
|
usage: "`none`/`text`/`graphical`",
|
||||||
|
async run($) {
|
||||||
|
if ($.guild) {
|
||||||
|
Storage.getGuild($.guild.id).welcomeType = "none";
|
||||||
|
Storage.save();
|
||||||
|
$.channel.send("Set this server's welcome type to `none`.");
|
||||||
|
} else {
|
||||||
|
$.channel.send("You must use this command in a server.");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// I should probably make this a bit more dynamic... Oh well.
|
||||||
|
subcommands: {
|
||||||
|
text: new Command({
|
||||||
|
async run($) {
|
||||||
|
if ($.guild) {
|
||||||
|
Storage.getGuild($.guild.id).welcomeType = "text";
|
||||||
|
Storage.save();
|
||||||
|
$.channel.send("Set this server's welcome type to `text`.");
|
||||||
|
} else {
|
||||||
|
$.channel.send("You must use this command in a server.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
graphical: new Command({
|
||||||
|
async run($) {
|
||||||
|
if ($.guild) {
|
||||||
|
Storage.getGuild($.guild.id).welcomeType = "graphical";
|
||||||
|
Storage.save();
|
||||||
|
$.channel.send("Set this server's welcome type to `graphical`.");
|
||||||
|
} else {
|
||||||
|
$.channel.send("You must use this command in a server.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
channel: new Command({
|
||||||
|
description: "Sets the welcome channel for your server. Type `#` to reference the channel.",
|
||||||
|
usage: "<channel mention>",
|
||||||
|
run: "You need to specify a channel.",
|
||||||
|
// If/when channel types come out, this will be the perfect candidate to test it.
|
||||||
|
any: new Command({
|
||||||
|
async run($) {
|
||||||
|
if ($.guild) {
|
||||||
|
const match = $.args[0].match(/^<#(\d{17,19})>$/);
|
||||||
|
|
||||||
|
if (match) {
|
||||||
|
Storage.getGuild($.guild.id).welcomeChannel = match[1];
|
||||||
|
Storage.save();
|
||||||
|
$.channel.send(
|
||||||
|
`Successfully set this server's welcome channel to ${match[0]}.`
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$.channel.send(
|
||||||
|
"You must provide a reference channel. You can do this by typing `#` then searching for the proper channel."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$.channel.send("You must use this command in a server.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -51,9 +51,24 @@ class User {
|
||||||
|
|
||||||
class Guild {
|
class Guild {
|
||||||
public prefix: string | null;
|
public prefix: string | null;
|
||||||
|
public welcomeType: "none" | "text" | "graphical";
|
||||||
|
public welcomeChannel: string | null;
|
||||||
|
|
||||||
constructor(data?: GenericJSON) {
|
constructor(data?: GenericJSON) {
|
||||||
this.prefix = select(data?.prefix, null, String);
|
this.prefix = select(data?.prefix, null, String);
|
||||||
|
this.welcomeChannel = select(data?.welcomeChannel, null, String);
|
||||||
|
|
||||||
|
switch (data?.welcomeType) {
|
||||||
|
case "text":
|
||||||
|
this.welcomeType = "text";
|
||||||
|
break;
|
||||||
|
case "graphical":
|
||||||
|
this.welcomeType = "graphical";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
this.welcomeType = "none";
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,12 @@ import $ from "../core/lib";
|
||||||
import {updateGlobalEmoteRegistry} from "../core/lib";
|
import {updateGlobalEmoteRegistry} from "../core/lib";
|
||||||
|
|
||||||
export default new Event<"guildCreate">({
|
export default new Event<"guildCreate">({
|
||||||
on() {
|
on(guild) {
|
||||||
$.log("Updated emote registry.");
|
$.log(
|
||||||
|
`[GUILD JOIN] ${guild.name} (${guild.id}) added the bot. Owner: ${guild.owner!.user.tag} (${
|
||||||
|
guild.owner!.user.id
|
||||||
|
}). Updated emote registry.`
|
||||||
|
);
|
||||||
updateGlobalEmoteRegistry();
|
updateGlobalEmoteRegistry();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -3,8 +3,8 @@ import $ from "../core/lib";
|
||||||
import {updateGlobalEmoteRegistry} from "../core/lib";
|
import {updateGlobalEmoteRegistry} from "../core/lib";
|
||||||
|
|
||||||
export default new Event<"guildDelete">({
|
export default new Event<"guildDelete">({
|
||||||
on() {
|
on(guild) {
|
||||||
$.log("Updated emote registry.");
|
$.log(`[GUILD LEAVE] ${guild.name} (${guild.id}) removed the bot. Updated emote registry.`);
|
||||||
updateGlobalEmoteRegistry();
|
updateGlobalEmoteRegistry();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
73
src/events/guildMemberAdd.ts
Normal file
73
src/events/guildMemberAdd.ts
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
import Event from "../core/event";
|
||||||
|
import $, {parseVars} from "../core/lib";
|
||||||
|
import {createCanvas, loadImage, Canvas} from "canvas";
|
||||||
|
import {Storage} from "../core/structures";
|
||||||
|
import {TextChannel, MessageAttachment} from "discord.js";
|
||||||
|
|
||||||
|
function applyText(canvas: Canvas, text: string) {
|
||||||
|
const ctx = canvas.getContext("2d");
|
||||||
|
let fontSize = 70;
|
||||||
|
|
||||||
|
do {
|
||||||
|
ctx.font = `${(fontSize -= 10)}px sans-serif`;
|
||||||
|
} while (ctx.measureText(text).width > canvas.width - 300);
|
||||||
|
|
||||||
|
return ctx.font;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new Event<"guildMemberAdd">({
|
||||||
|
async on(member) {
|
||||||
|
const {welcomeType, welcomeChannel} = Storage.getGuild(member.guild.id);
|
||||||
|
|
||||||
|
if (welcomeChannel) {
|
||||||
|
const channel = member.guild.channels.cache.get(welcomeChannel);
|
||||||
|
|
||||||
|
if (channel && channel.type === "text") {
|
||||||
|
if (welcomeType === "graphical") {
|
||||||
|
const canvas = createCanvas(700, 250);
|
||||||
|
const ctx = canvas.getContext("2d");
|
||||||
|
const background = await loadImage(
|
||||||
|
"https://raw.githubusercontent.com/keanuplayz/TravBot/dev/assets/wallpaper.png"
|
||||||
|
);
|
||||||
|
ctx.drawImage(background, 0, 0, canvas.width, canvas.height);
|
||||||
|
|
||||||
|
ctx.strokeStyle = "#74037b";
|
||||||
|
ctx.strokeRect(0, 0, canvas.width, canvas.height);
|
||||||
|
|
||||||
|
ctx.font = "28px sans-serif";
|
||||||
|
ctx.fillStyle = "#ffffff";
|
||||||
|
ctx.fillText("Welcome to the server,", canvas.width / 2.5, canvas.height / 3.5);
|
||||||
|
|
||||||
|
ctx.font = applyText(canvas, member.displayName);
|
||||||
|
ctx.fillStyle = "#ffffff";
|
||||||
|
ctx.fillText(`${member.displayName}!`, canvas.width / 2.5, canvas.height / 1.5);
|
||||||
|
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(125, 125, 100, 0, Math.PI * 2, true);
|
||||||
|
ctx.closePath();
|
||||||
|
ctx.clip();
|
||||||
|
|
||||||
|
const avatarURL =
|
||||||
|
member.user.avatarURL({
|
||||||
|
dynamic: true,
|
||||||
|
size: 2048,
|
||||||
|
format: "png"
|
||||||
|
}) ?? member.user.defaultAvatarURL;
|
||||||
|
const avatar = await loadImage(avatarURL);
|
||||||
|
ctx.drawImage(avatar, 25, 25, 200, 200);
|
||||||
|
|
||||||
|
const attachment = new MessageAttachment(canvas.toBuffer("image/png"), "welcome-image.png");
|
||||||
|
(channel as TextChannel).send(`Welcome \`${member.user.tag}\`!`, attachment);
|
||||||
|
} else if (welcomeType === "text") {
|
||||||
|
(channel as TextChannel).send(
|
||||||
|
parseVars("Say hello to `%user%`, everyone! We all need a warm welcome sometimes :D", {
|
||||||
|
user: member.user.tag
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$.error(`"${welcomeChannel}" is not a valid text channel ID!`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
|
@ -7,7 +7,9 @@ import {updateGlobalEmoteRegistry} from "../core/lib";
|
||||||
export default new Event<"ready">({
|
export default new Event<"ready">({
|
||||||
once() {
|
once() {
|
||||||
if (client.user) {
|
if (client.user) {
|
||||||
$.ready(`Logged in as ${client.user.username}#${client.user.discriminator}.`);
|
$.ready(
|
||||||
|
`Logged in as ${client.user.tag}, ready to serve ${client.users.cache.size} users in ${client.guilds.cache.size} servers..`
|
||||||
|
);
|
||||||
client.user.setActivity({
|
client.user.setActivity({
|
||||||
type: "LISTENING",
|
type: "LISTENING",
|
||||||
name: `${Config.prefix}help`
|
name: `${Config.prefix}help`
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue