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