move out src/test to test
This commit is contained in:
		
							parent
							
								
									f812e06d17
								
							
						
					
					
						commit
						46cbd66166
					
				
					 26 changed files with 51 additions and 45 deletions
				
			
		
							
								
								
									
										27
									
								
								test/chunk.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								test/chunk.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,27 @@ | |||
| import { Client, Intents } from '../mod.ts' | ||||
| import { TOKEN } from './config.ts' | ||||
| 
 | ||||
| const client = new Client() | ||||
| 
 | ||||
| client.on('debug', console.log) | ||||
| 
 | ||||
| client.on('ready', () => { | ||||
|   console.log(`Logged in as ${client.user?.tag}!`) | ||||
| }) | ||||
| 
 | ||||
| client.on('guildLoaded', async (guild) => { | ||||
|   if (guild.id !== '783319033205751809') return | ||||
|   const arr = await guild.channels.array() | ||||
|   console.log(arr.length) | ||||
|   guild | ||||
|     .chunk({ presences: true }, true) | ||||
|     .then((guild) => { | ||||
|       console.log(`Chunked guild:`, guild.id) | ||||
|     }) | ||||
|     .catch((e) => { | ||||
|       console.log(`Failed to Chunk: ${guild.id} - ${e}`) | ||||
|     }) | ||||
| }) | ||||
| 
 | ||||
| console.log('Connecting...') | ||||
| client.connect(TOKEN, Intents.All) | ||||
							
								
								
									
										70
									
								
								test/class.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								test/class.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,70 @@ | |||
| import { | ||||
|   CommandClient, | ||||
|   event, | ||||
|   Intents, | ||||
|   command, | ||||
|   CommandContext, | ||||
|   Extension, | ||||
|   CommandBuilder | ||||
| } from '../mod.ts' | ||||
| import { TOKEN } from './config.ts' | ||||
| 
 | ||||
| class MyClient extends CommandClient { | ||||
|   constructor() { | ||||
|     super({ | ||||
|       prefix: ['!', '!!'], | ||||
|       caseSensitive: false | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   @event() | ||||
|   ready(): void { | ||||
|     console.log(`Logged in as ${this.user?.tag}!`) | ||||
|   } | ||||
| 
 | ||||
|   @command({ aliases: 'pong' }) | ||||
|   Ping(ctx: CommandContext): void { | ||||
|     ctx.message.reply('Pong!') | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class VCExtension extends Extension { | ||||
|   name = 'VC' | ||||
|   subPrefix = 'vc' | ||||
| 
 | ||||
|   @command() | ||||
|   async join(ctx: CommandContext): Promise<void> { | ||||
|     const userVS = await ctx.guild?.voiceStates.get(ctx.author.id) | ||||
|     if (userVS === undefined) { | ||||
|       ctx.message.reply("You're not in VC.") | ||||
|       return | ||||
|     } | ||||
|     await userVS.channel?.join() | ||||
|     ctx.message.reply(`Joined VC channel - ${userVS.channel?.name}!`) | ||||
|   } | ||||
| 
 | ||||
|   @command() | ||||
|   async leave(ctx: CommandContext): Promise<void> { | ||||
|     const userVS = await ctx.guild?.voiceStates.get( | ||||
|       (ctx.client.user?.id as unknown) as string | ||||
|     ) | ||||
|     if (userVS === undefined) { | ||||
|       ctx.message.reply("I'm not in VC.") | ||||
|       return | ||||
|     } | ||||
|     userVS.channel?.leave() | ||||
|     ctx.message.reply(`Left VC channel - ${userVS.channel?.name}!`) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const client = new MyClient() | ||||
| 
 | ||||
| client.extensions.load(VCExtension) | ||||
| 
 | ||||
| client.commands.add( | ||||
|   new CommandBuilder() | ||||
|     .setName('join') | ||||
|     .onExecute((ctx) => ctx.message.reply('haha')) | ||||
| ) | ||||
| 
 | ||||
| client.connect(TOKEN, Intents.All) | ||||
							
								
								
									
										154
									
								
								test/cmd.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								test/cmd.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,154 @@ | |||
| import { | ||||
|   Command, | ||||
|   CommandClient, | ||||
|   Intents, | ||||
|   CommandContext, | ||||
|   Extension, | ||||
|   GuildChannels, | ||||
|   Invite | ||||
| } from '../mod.ts' | ||||
| import { TOKEN } from './config.ts' | ||||
| 
 | ||||
| const client = new CommandClient({ | ||||
|   prefix: ['pls', '!'], | ||||
|   spacesAfterPrefix: true, | ||||
|   mentionPrefix: true, | ||||
|   owners: ['422957901716652033'] | ||||
| }) | ||||
| 
 | ||||
| client.on('debug', console.log) | ||||
| 
 | ||||
| client.on('ready', () => { | ||||
|   console.log(`[Login] Logged in as ${client.user?.tag}!`) | ||||
| }) | ||||
| 
 | ||||
| client.on('messageDelete', (msg) => { | ||||
|   console.log(`Message Deleted: ${msg.id}, ${msg.author.tag}, ${msg.content}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('messageUpdate', (before, after) => { | ||||
|   console.log('Message Update') | ||||
|   console.log(`Before: ${before.author.tag}: ${before.content}`) | ||||
|   console.log(`After: ${after.author.tag}: ${after.content}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('guildMemberAdd', (member) => { | ||||
|   console.log(`Member Join: ${member.user.tag}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('guildMemberRemove', (member) => { | ||||
|   console.log(`Member Leave: ${member.user.tag}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('guildRoleCreate', (role) => { | ||||
|   console.log(`Role Create: ${role.name}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('guildRoleDelete', (role) => { | ||||
|   console.log(`Role Delete: ${role.name}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('guildRoleUpdate', (role, after) => { | ||||
|   console.log(`Role Update: ${role.name}, ${after.name}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('guildIntegrationsUpdate', (guild) => { | ||||
|   console.log(`Guild Integrations Update: ${guild.name}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('webhooksUpdate', (guild, channel) => { | ||||
|   console.log(`Webhooks Updated in #${channel.name} from ${guild.name}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('commandError', console.error) | ||||
| client.on('inviteCreate', (invite: Invite) => { | ||||
|   console.log(`Invite Create: ${invite.code}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('inviteDelete', (invite: Invite) => { | ||||
|   console.log(`Invite Delete: ${invite.code}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('inviteDeleteUncached', (invite) => { | ||||
|   console.log(invite) | ||||
| }) | ||||
| 
 | ||||
| client.on('commandError', console.error) | ||||
| 
 | ||||
| class ChannelLog extends Extension { | ||||
|   onChannelCreate(ext: Extension, channel: GuildChannels): void { | ||||
|     console.log(`Channel Created: ${channel.name}`) | ||||
|   } | ||||
| 
 | ||||
|   load(): void { | ||||
|     this.listen('channelCreate', this.onChannelCreate) | ||||
| 
 | ||||
|     class Pong extends Command { | ||||
|       name = 'Pong' | ||||
| 
 | ||||
|       execute(ctx: CommandContext): any { | ||||
|         ctx.message.reply('Ping!') | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     this.commands.add(Pong) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| client.extensions.load(ChannelLog) | ||||
| 
 | ||||
| client.on('messageDeleteBulk', (channel, messages, uncached) => { | ||||
|   console.log( | ||||
|     `=== Message Delete Bulk ===\nMessages: ${messages | ||||
|       .map((m) => m.id) | ||||
|       .join(', ')}\nUncached: ${[...uncached.values()].join(', ')}` | ||||
|   ) | ||||
| }) | ||||
| 
 | ||||
| client.on('channelUpdate', (before, after) => { | ||||
|   console.log( | ||||
|     `Channel Update: ${(before as GuildChannels).name}, ${ | ||||
|       (after as GuildChannels).name | ||||
|     }` | ||||
|   ) | ||||
| }) | ||||
| 
 | ||||
| client.on('voiceStateAdd', (state) => { | ||||
|   console.log('VC Join', state.user.tag) | ||||
| }) | ||||
| 
 | ||||
| client.on('voiceStateRemove', (state) => { | ||||
|   console.log('VC Leave', state.user.tag) | ||||
| }) | ||||
| 
 | ||||
| client.on('messageReactionAdd', (reaction, user) => { | ||||
|   console.log(`${user.tag} reacted with ${reaction.emoji.name}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('messageReactionRemove', (reaction, user) => { | ||||
|   console.log(`${user.tag} removed reaction ${reaction.emoji.name}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('messageReactionRemoveEmoji', (message, emoji) => { | ||||
|   console.log(`All ${emoji.name} emoji reactions removed from ${message.id}`) | ||||
| }) | ||||
| 
 | ||||
| client.on('messageReactionRemoveAll', (message) => { | ||||
|   console.log(`All reactions remove from Message: ${message.id}`) | ||||
| }) | ||||
| 
 | ||||
| // client.on('raw', (evt: string) => console.log(`EVENT: ${evt}`))
 | ||||
| 
 | ||||
| const files = Deno.readDirSync('cmds') | ||||
| 
 | ||||
| for (const file of files) { | ||||
|   const module = await import(`./cmds/${file.name}`) | ||||
|   // eslint-disable-next-line new-cap
 | ||||
|   const cmd = new module.default() | ||||
|   client.commands.add(cmd) | ||||
|   console.log(`Loaded command ${cmd.name}!`) | ||||
| } | ||||
| 
 | ||||
| console.log(`Loaded ${client.commands.count} commands!`) | ||||
| 
 | ||||
| client.connect(TOKEN, Intents.create(['GUILD_MEMBERS', 'GUILD_PRESENCES'])) | ||||
							
								
								
									
										26
									
								
								test/cmds/addemoji.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								test/cmds/addemoji.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | |||
| import { Command, CommandContext } from '../../mod.ts' | ||||
| 
 | ||||
| export default class AddEmojiCommand extends Command { | ||||
|   name = 'addemoji' | ||||
|   aliases = ['ae', 'emojiadd'] | ||||
|   args = 2 | ||||
|   guildOnly = true | ||||
| 
 | ||||
|   execute(ctx: CommandContext): any { | ||||
|     const name = ctx.args[0] | ||||
|     if (name === undefined) return ctx.message.reply('No name was given!') | ||||
|     const url = ctx.argString.slice(name.length).trim() | ||||
|     if (url === '') return ctx.message.reply('No URL was given!') | ||||
|     ctx.message.guild?.emojis | ||||
|       .create(name, url) | ||||
|       .then((emoji) => { | ||||
|         if (emoji === undefined) throw new Error('Unknown') | ||||
|         ctx.message.reply( | ||||
|           `Successfully added emoji ${emoji.toString()} ${emoji.name}!` | ||||
|         ) | ||||
|       }) | ||||
|       .catch((e) => { | ||||
|         ctx.message.reply(`Failed to add emoji. Reason: ${e.message}`) | ||||
|       }) | ||||
|   } | ||||
| } | ||||
							
								
								
									
										20
									
								
								test/cmds/eval.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								test/cmds/eval.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | |||
| import { Command, CommandContext } from '../../mod.ts' | ||||
| 
 | ||||
| export default class EvalCommand extends Command { | ||||
|   name = 'eval' | ||||
|   ownerOnly = true | ||||
| 
 | ||||
|   async execute(ctx: CommandContext): Promise<void> { | ||||
|     try { | ||||
|       // eslint-disable-next-line no-eval
 | ||||
|       let evaled = eval(ctx.argString) | ||||
|       if (evaled instanceof Promise) evaled = await evaled | ||||
|       if (typeof evaled === 'object') evaled = Deno.inspect(evaled) | ||||
|       await ctx.message.reply( | ||||
|         `\`\`\`js\n${`${evaled}`.substring(0, 1990)}\n\`\`\`` | ||||
|       ) | ||||
|     } catch (e) { | ||||
|       ctx.message.reply(`\`\`\`js\n${e.stack}\n\`\`\``) | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										16
									
								
								test/cmds/join.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								test/cmds/join.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | |||
| import { Command, CommandContext } from '../../mod.ts' | ||||
| 
 | ||||
| export default class JoinCommand extends Command { | ||||
|   name = 'join' | ||||
|   guildOnly = true | ||||
| 
 | ||||
|   async execute(ctx: CommandContext): Promise<void> { | ||||
|     const userVS = await ctx.guild?.voiceStates.get(ctx.author.id) | ||||
|     if (userVS === undefined) { | ||||
|       ctx.message.reply("You're not in VC.") | ||||
|       return | ||||
|     } | ||||
|     await userVS.channel?.join() | ||||
|     ctx.message.reply(`Joined VC channel - ${userVS.channel?.name}!`) | ||||
|   } | ||||
| } | ||||
							
								
								
									
										26
									
								
								test/cmds/kickFromSpecificVoice.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								test/cmds/kickFromSpecificVoice.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | |||
| import { | ||||
|   Command, | ||||
|   CommandContext, | ||||
|   ChannelTypes, | ||||
|   VoiceChannel | ||||
| } from '../../mod.ts' | ||||
| 
 | ||||
| export default class KickFromSpecificVoiceCommand extends Command { | ||||
|   name = 'kickFromSpecificVoice' | ||||
| 
 | ||||
|   async execute(ctx: CommandContext): Promise<void> { | ||||
|     if (ctx.guild !== undefined) { | ||||
|       const channel = await ctx.guild.channels.get('YOUR VOICE CHANNEL ID') | ||||
|       if (channel === undefined || channel.type !== ChannelTypes.GUILD_VOICE) { | ||||
|         ctx.channel.send('The channel is either not a voice or not available.') | ||||
|         return | ||||
|       } | ||||
| 
 | ||||
|       // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
 | ||||
|       const members = await (channel as VoiceChannel).disconnectAll() | ||||
|       members.forEach((member) => { | ||||
|         ctx.channel.send(`Kicked member ${member.id}`) | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										19
									
								
								test/cmds/kickFromVoice.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								test/cmds/kickFromVoice.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| import { Command, CommandContext } from '../../mod.ts' | ||||
| 
 | ||||
| export default class KickFromVoiceCommand extends Command { | ||||
|   name = 'kickFromVoice' | ||||
| 
 | ||||
|   async execute(ctx: CommandContext): Promise<void> { | ||||
|     if (ctx.guild !== undefined) { | ||||
|       const voiceStates = await ctx.guild.voiceStates.array() | ||||
|       if (voiceStates !== undefined) { | ||||
|         voiceStates.forEach(async (voiceState) => { | ||||
|           const member = await voiceState.disconnect() | ||||
|           if (member !== undefined) { | ||||
|             ctx.channel.send(`Kicked member ${member.id}`) | ||||
|           } | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										18
									
								
								test/cmds/leave.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								test/cmds/leave.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | |||
| import { Command, CommandContext } from '../../mod.ts' | ||||
| 
 | ||||
| export default class LeaveCommand extends Command { | ||||
|   name = 'leave' | ||||
|   guildOnly = true | ||||
| 
 | ||||
|   async execute(ctx: CommandContext): Promise<void> { | ||||
|     const userVS = await ctx.guild?.voiceStates.get( | ||||
|       (ctx.client.user?.id as unknown) as string | ||||
|     ) | ||||
|     if (userVS === undefined) { | ||||
|       ctx.message.reply("I'm not in VC.") | ||||
|       return | ||||
|     } | ||||
|     userVS.channel?.leave() | ||||
|     ctx.message.reply(`Left VC channel - ${userVS.channel?.name}!`) | ||||
|   } | ||||
| } | ||||
							
								
								
									
										35
									
								
								test/cmds/mentions.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								test/cmds/mentions.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | |||
| import { Command, CommandContext, Embed } from '../../mod.ts' | ||||
| 
 | ||||
| export default class PingCommand extends Command { | ||||
|   name = 'mentions' | ||||
|   aliases = ['m'] | ||||
| 
 | ||||
|   execute(ctx: CommandContext): void { | ||||
|     const embed = new Embed() | ||||
|       .setTitle('Mentions') | ||||
|       .addField( | ||||
|         'Users', | ||||
|         `${ | ||||
|           ctx.message.mentions.users.size === 0 ? `None` : '' | ||||
|         }${ctx.message.mentions.users.map((u) => u.toString()).join(', ')}` | ||||
|       ) | ||||
|       .addField( | ||||
|         'Channels', | ||||
|         `${ | ||||
|           ctx.message.mentions.channels.size === 0 ? `None` : '' | ||||
|         }${ctx.message.mentions.channels.map((u) => u.toString()).join(', ')}` | ||||
|       ) | ||||
|       .addField( | ||||
|         'Roles', | ||||
|         `${ | ||||
|           ctx.message.mentions.roles.size === 0 ? `None` : '' | ||||
|         }${ctx.message.mentions.roles.map((u) => u.toString()).join(', ')}` | ||||
|       ) | ||||
|       .addField( | ||||
|         'Everyone?', | ||||
|         ctx.message.mentions.everyone === true ? 'Yes' : 'No' | ||||
|       ) | ||||
|       .setColor(0xff0000) | ||||
|     ctx.message.channel.send(embed) | ||||
|   } | ||||
| } | ||||
							
								
								
									
										10
									
								
								test/cmds/ping.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								test/cmds/ping.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | |||
| import { Command, CommandContext } from '../../mod.ts' | ||||
| 
 | ||||
| export default class PingCommand extends Command { | ||||
|   name = 'ping' | ||||
| 
 | ||||
|   execute(ctx: CommandContext): void { | ||||
|     console.log(ctx.args, ctx.argString) | ||||
|     ctx.message.reply(`Pong! Latency: ${ctx.client.ping}ms`) | ||||
|   } | ||||
| } | ||||
							
								
								
									
										23
									
								
								test/cmds/userinfo.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								test/cmds/userinfo.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | |||
| import { Command, Member, CommandContext, Embed } from '../../mod.ts' | ||||
| 
 | ||||
| export default class UserinfoCommand extends Command { | ||||
|   name = 'userinfo' | ||||
|   guildOnly = true | ||||
|   aliases = ['u', 'user'] | ||||
| 
 | ||||
|   async execute(ctx: CommandContext): Promise<void> { | ||||
|     const member: Member = ctx.message.member as any | ||||
|     const roles = await member.roles.array() | ||||
|     const embed = new Embed() | ||||
|       .setTitle(`User Info`) | ||||
|       .setAuthor({ name: member.user.tag }) | ||||
|       .addField('ID', member.id) | ||||
|       .addField('Roles', roles.map((r) => r.name).join(', ')) | ||||
|       .addField( | ||||
|         'Permissions', | ||||
|         JSON.stringify(member.permissions.has('ADMINISTRATOR')) | ||||
|       ) | ||||
|       .setColor(0xff00ff) | ||||
|     ctx.channel.send(embed) | ||||
|   } | ||||
| } | ||||
							
								
								
									
										2
									
								
								test/config.ts.sample
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								test/config.ts.sample
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | |||
| export const TOKEN = '' | ||||
| export const WEBHOOK = '' | ||||
							
								
								
									
										30
									
								
								test/debug.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								test/debug.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | |||
| import { Client, event } from '../mod.ts' | ||||
| import { TOKEN } from './config.ts' | ||||
| 
 | ||||
| class MyClient extends Client { | ||||
|   constructor() { | ||||
|     super({ | ||||
|       token: TOKEN, | ||||
|       intents: [] | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   @event() | ||||
|   ready(): void { | ||||
|     console.log('Connected!') | ||||
|   } | ||||
| 
 | ||||
|   debug(title: string, msg: string): void { | ||||
|     console.log(`[${title}] ${msg}`) | ||||
|     if (title === 'Gateway' && msg === 'Initializing WebSocket...') { | ||||
|       try { | ||||
|         throw new Error('Stack') | ||||
|       } catch (e) { | ||||
|         console.log(e.stack) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const client = new MyClient() | ||||
| client.connect() | ||||
							
								
								
									
										137
									
								
								test/guild.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								test/guild.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,137 @@ | |||
| import { | ||||
|   Client, | ||||
|   Intents | ||||
|   // Verification
 | ||||
|   // PermissionFlags,
 | ||||
|   // ChannelTypes,
 | ||||
|   // GuildCreateOptions
 | ||||
| } from '../mod.ts' | ||||
| import { TOKEN } from './config.ts' | ||||
| 
 | ||||
| const client = new Client() | ||||
| 
 | ||||
| // client.on('guildLoaded', async (guild) => {
 | ||||
| //   if (guild.name === 'OH WOW') {
 | ||||
| //     guild.delete()
 | ||||
| //   }
 | ||||
| // })
 | ||||
| 
 | ||||
| // client.on('ready', async () => {
 | ||||
| //   await new Promise((resolve, reject) => setTimeout(resolve, 1000))
 | ||||
| //   const body: GuildCreateOptions = {
 | ||||
| //     name: 'OH WOW',
 | ||||
| //     icon: 'https://helloyunho.xyz/_dist_/images/avatar.png',
 | ||||
| //     verificationLevel: Verification.NONE,
 | ||||
| //     roles: [
 | ||||
| //       {
 | ||||
| //         id: '1',
 | ||||
| //         name: 'a role',
 | ||||
| //         color: 0x103021,
 | ||||
| //         hoist: false,
 | ||||
| //         permissions: PermissionFlags.ADMINISTRATOR.toString(),
 | ||||
| //         mentionable: true
 | ||||
| //       }
 | ||||
| //     ],
 | ||||
| //     channels: [
 | ||||
| //       {
 | ||||
| //         name: 'fucking-awesome',
 | ||||
| //         type: ChannelTypes.GUILD_TEXT,
 | ||||
| //         id: '1'
 | ||||
| //       }
 | ||||
| //     ],
 | ||||
| //     systemChannelID: '1'
 | ||||
| //   }
 | ||||
| //   const guild = await client.guilds.create(body)
 | ||||
| 
 | ||||
| //   const channels = await guild.channels.array()
 | ||||
| //   console.log(channels.length)
 | ||||
| //   const invite = await guild.invites.create(channels[0].id)
 | ||||
| //   console.log(invite.link)
 | ||||
| // })
 | ||||
| 
 | ||||
| // client.on('guildLoaded', async (guild) => {
 | ||||
| //   if (guild.id === 'GUILD_ID') {
 | ||||
| //     // const roles = await guild.roles.array()
 | ||||
| //     // if (roles.length > 0) {
 | ||||
| //     //   roles.forEach(async (role) => {
 | ||||
| //     //     if (role.name !== '@everyone') {
 | ||||
| //     //       role.addTo('USER_ID')
 | ||||
| //     //     }
 | ||||
| //     //   })
 | ||||
| //     // }
 | ||||
| 
 | ||||
| //     // guild.edit({
 | ||||
| //     //   name: 'OH BOI',
 | ||||
| //     //   verificationLevel: Verification.MEDIUM
 | ||||
| //     // })
 | ||||
| 
 | ||||
| //     // const role1 = await guild.roles.create({
 | ||||
| //     //   name: 'IDK1'
 | ||||
| //     // })
 | ||||
| //     // const role2 = await guild.roles.create({
 | ||||
| //     //   name: 'IDK2'
 | ||||
| //     // })
 | ||||
| 
 | ||||
| //     // alert()
 | ||||
| 
 | ||||
| //     // await guild.roles.editPositions(
 | ||||
| //     //   {
 | ||||
| //     //     id: role1.id,
 | ||||
| //     //     position: 1
 | ||||
| //     //   },
 | ||||
| //     //   {
 | ||||
| //     //     id: role2.id,
 | ||||
| //     //     position: 2
 | ||||
| //     //   }
 | ||||
| //     // )
 | ||||
| 
 | ||||
| //     // alert()
 | ||||
| 
 | ||||
| //     // role1.delete()
 | ||||
| //     // role2.delete()
 | ||||
| 
 | ||||
| //     // const role = await guild.roles.create({
 | ||||
| //     //   name: 'IDK'
 | ||||
| //     // })
 | ||||
| 
 | ||||
| //     // alert()
 | ||||
| 
 | ||||
| //     // await role.edit({
 | ||||
| //     //   name: 'DUMB'
 | ||||
| //     // })
 | ||||
| 
 | ||||
| //     // alert()
 | ||||
| 
 | ||||
| //     // console.log(
 | ||||
| //     //   await guild.getPruneCount({
 | ||||
| //     //     days: 7,
 | ||||
| //     //     includeRoles: ['ROLE_ID']
 | ||||
| //     //   })
 | ||||
| //     // )
 | ||||
| 
 | ||||
| //     // console.log(
 | ||||
| //     //   await guild.prune({
 | ||||
| //     //     days: 7,
 | ||||
| //     //     includeRoles: ['ROLE_ID']
 | ||||
| //     //   })
 | ||||
| //     // )
 | ||||
| //     // console.log(
 | ||||
| //     //   await guild.prune({
 | ||||
| //     //     days: 7,
 | ||||
| //     //     computePruneCount: false,
 | ||||
| //     //     includeRoles: ['ROLE_ID']
 | ||||
| //     //   })
 | ||||
| //     // )
 | ||||
| 
 | ||||
| //     // await guild.editWidget({
 | ||||
| //     //   enabled: true,
 | ||||
| //     //   channel: 'CHANNEL_ID'
 | ||||
| //     // })
 | ||||
| 
 | ||||
| //     // console.log(await guild.getWidget())
 | ||||
| //     // console.log(await guild.getVanity())
 | ||||
| //     // console.log(await guild.getWidgetImageURL())
 | ||||
| //   }
 | ||||
| // })
 | ||||
| 
 | ||||
| client.connect(TOKEN, Intents.All) | ||||
							
								
								
									
										11
									
								
								test/hook.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								test/hook.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | |||
| import { Webhook } from '../mod.ts' | ||||
| import { WEBHOOK } from './config.ts' | ||||
| 
 | ||||
| const webhook = await Webhook.fromURL(WEBHOOK) | ||||
| console.log('Fetched webhook!') | ||||
| 
 | ||||
| webhook | ||||
|   .send('Hello World', { | ||||
|     name: 'OwO' | ||||
|   }) | ||||
|   .then(() => 'Sent message!') | ||||
							
								
								
									
										299
									
								
								test/index.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										299
									
								
								test/index.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,299 @@ | |||
| import { | ||||
|   Client, | ||||
|   Intents, | ||||
|   Message, | ||||
|   Member, | ||||
|   Role, | ||||
|   GuildChannels, | ||||
|   Embed, | ||||
|   Guild, | ||||
|   EveryChannelTypes, | ||||
|   ChannelTypes, | ||||
|   GuildTextChannel, | ||||
|   checkGuildTextBasedChannel, | ||||
|   Permissions, | ||||
|   Collector, | ||||
|   MessageAttachment, | ||||
|   OverrideType | ||||
| } from '../mod.ts' | ||||
| import { TOKEN } from './config.ts' | ||||
| 
 | ||||
| const client = new Client({ | ||||
|   // clientProperties: {
 | ||||
|   //   browser: 'Discord iOS'
 | ||||
|   // }
 | ||||
|   // bot: false,
 | ||||
|   // cache: new RedisCacheAdapter({
 | ||||
|   //   hostname: '127.0.0.1',
 | ||||
|   //   port: 6379
 | ||||
|   // }), // Defaults to in-memory Caching
 | ||||
|   // shardCount: 2
 | ||||
| }) | ||||
| 
 | ||||
| client.on('ready', () => { | ||||
|   console.log(`[Login] Logged in as ${client.user?.tag}!`) | ||||
| }) | ||||
| 
 | ||||
| client.on('debug', console.log) | ||||
| 
 | ||||
| client.on('channelUpdate', (b: EveryChannelTypes, a: EveryChannelTypes) => { | ||||
|   if (b.type === ChannelTypes.GUILD_TEXT) { | ||||
|     const before = (b as unknown) as GuildTextChannel | ||||
|     const after = (a as unknown) as GuildTextChannel | ||||
|     before.send('', { | ||||
|       embed: new Embed({ | ||||
|         title: 'Channel Update', | ||||
|         description: `Name Before: ${before.name}\nName After: ${after.name}` | ||||
|       }) | ||||
|     }) | ||||
|   } | ||||
| }) | ||||
| 
 | ||||
| client.on('messageCreate', async (msg: Message) => { | ||||
|   if (msg.author.bot === true) return | ||||
|   if (msg.stickers !== undefined) { | ||||
|     console.log( | ||||
|       `${msg.author.tag}: (Sticker)${msg.stickers.map( | ||||
|         (sticker) => `Name: ${sticker.name}, Tags: ${sticker.tags}` | ||||
|       )}` | ||||
|     ) | ||||
|   } else { | ||||
|     console.log(`${msg.author.tag}: ${msg.content}`) | ||||
|   } | ||||
|   if (msg.content === '!ping') { | ||||
|     msg.reply(`Pong! Ping: ${client.ping}ms`) | ||||
|   } else if (msg.content === '!members') { | ||||
|     const col = await msg.guild?.members.array() | ||||
|     const data = col | ||||
|       ?.map((c: Member, i: number) => { | ||||
|         return `${i + 1}. ${c.user.tag}` | ||||
|       }) | ||||
|       .join('\n') as string | ||||
|     msg.channel.send('Member List:\n' + data) | ||||
|   } else if (msg.content === '!guilds') { | ||||
|     const guilds = await msg.client.guilds.collection() | ||||
|     msg.channel.send( | ||||
|       'Guild List:\n' + | ||||
|         (guilds | ||||
|           .array() | ||||
|           .map((c: Guild, i: number) => { | ||||
|             return `${i + 1}. ${c.name} - ${c.memberCount} members` | ||||
|           }) | ||||
|           .join('\n') as string) | ||||
|     ) | ||||
|   } else if (msg.content === '!roles') { | ||||
|     const col = await msg.guild?.roles.collection() | ||||
|     const data = col | ||||
|       ?.array() | ||||
|       .map((c: Role, i: number) => { | ||||
|         return `${i + 1}. ${c.name}` | ||||
|       }) | ||||
|       .join('\n') as string | ||||
|     msg.channel.send('Roles List:\n' + data) | ||||
|   } else if (msg.content === '!channels') { | ||||
|     const col = await msg.guild?.channels.array() | ||||
|     const data = col | ||||
|       ?.map((c: GuildChannels, i: number) => { | ||||
|         return `${i + 1}. ${c.name}` | ||||
|       }) | ||||
|       .join('\n') as string | ||||
|     msg.channel.send('Channels List:\n' + data) | ||||
|   } else if (msg.content === '!messages') { | ||||
|     const col = await msg.channel.messages.array() | ||||
|     const data = col | ||||
|       ?.slice(-5) | ||||
|       .map((c: Message, i: number) => { | ||||
|         return `${i + 1}. ${c.content}` | ||||
|       }) | ||||
|       .join('\n') as string | ||||
|     msg.channel.send('Top 5 Message List:\n' + data) | ||||
|   } else if (msg.content === '!editChannel') { | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
 | ||||
|     const channel = msg.channel as GuildTextChannel | ||||
|     const newChannel = await channel.edit({ | ||||
|       name: 'gggg' | ||||
|     }) | ||||
|     if (newChannel.name === 'gggg') { | ||||
|       msg.channel.send('Done!') | ||||
|     } else { | ||||
|       msg.channel.send('Failed...') | ||||
|     } | ||||
|   } else if (msg.content === '!react') { | ||||
|     msg.addReaction('a:programming:785013658257195008') | ||||
|   } else if (msg.content === '!wait_for') { | ||||
|     msg.channel.send('Send anything!') | ||||
|     const [receivedMsg] = await client.waitFor( | ||||
|       'messageCreate', | ||||
|       (message) => message.author.id === msg.author.id | ||||
|     ) | ||||
| 
 | ||||
|     msg.channel.send(`Received: ${receivedMsg?.content}`) | ||||
|   } else if (msg.content.startsWith('!collect') === true) { | ||||
|     let count = parseInt(msg.content.replace(/\D/g, '')) | ||||
|     if (isNaN(count)) count = 5 | ||||
|     await msg.channel.send(`Collecting ${count} messages for 5s`) | ||||
|     const coll = new Collector({ | ||||
|       event: 'messageCreate', | ||||
|       filter: (m) => m.author.id === msg.author.id, | ||||
|       deinitOnEnd: true, | ||||
|       max: count, | ||||
|       timeout: 5000 | ||||
|     }) | ||||
|     coll.init(client) | ||||
|     coll.collect() | ||||
|     coll.on('start', () => msg.channel.send('[COL] Started')) | ||||
|     coll.on('end', () => | ||||
|       msg.channel.send(`[COL] Ended. Collected Size: ${coll.collected.size}`) | ||||
|     ) | ||||
|     coll.on('collect', (msg) => | ||||
|       msg.channel.send(`[COL] Collect: ${msg.content}`) | ||||
|     ) | ||||
|   } else if (msg.content === '!attach') { | ||||
|     msg.channel.send({ | ||||
|       file: await MessageAttachment.load( | ||||
|         'https://cdn.discordapp.com/emojis/626139395623354403.png?v=1' | ||||
|       ) | ||||
|     }) | ||||
|   } else if (msg.content === '!emattach') { | ||||
|     msg.channel.send( | ||||
|       new Embed() | ||||
|         .attach( | ||||
|           await MessageAttachment.load( | ||||
|             'https://cdn.discordapp.com/emojis/626139395623354403.png?v=1', | ||||
|             'file1.png' | ||||
|           ), | ||||
|           await MessageAttachment.load( | ||||
|             'https://cdn.discordapp.com/emojis/626139395623354403.png?v=1', | ||||
|             'file2.png' | ||||
|           ) | ||||
|         ) | ||||
|         .setImage('attachment://file1.png') | ||||
|         .setThumbnail('attachment://file2.png') | ||||
|     ) | ||||
|   } else if (msg.content === '!textfile') { | ||||
|     msg.channel.send({ | ||||
|       files: [ | ||||
|         new MessageAttachment('hello.txt', 'world'), | ||||
|         new MessageAttachment('world.txt', 'hello') | ||||
|       ] | ||||
|     }) | ||||
|   } else if (msg.content === '!join') { | ||||
|     if (msg.member === undefined) return | ||||
|     const vs = await msg.guild?.voiceStates.get(msg.member.id) | ||||
|     if (typeof vs !== 'object') return | ||||
|     vs.channel?.join() | ||||
|   } else if (msg.content === '!getOverwrites') { | ||||
|     // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
 | ||||
|     if (!checkGuildTextBasedChannel(msg.channel)) { | ||||
|       return msg.channel.send("This isn't a guild text channel!") | ||||
|     } | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
 | ||||
|     const overwrites = await (msg.channel as GuildTextChannel).overwritesFor( | ||||
|       // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
 | ||||
|       msg.member as Member | ||||
|     ) | ||||
|     msg.channel.send( | ||||
|       `Your permission overwrites:\n${overwrites | ||||
|         .map( | ||||
|           (over) => | ||||
|             `ID: ${over.id}\nAllowed:\n${over.allow | ||||
|               .toArray() | ||||
|               .join('\n')}\nDenied:\n${over.deny.toArray().join('\n')}` | ||||
|         ) | ||||
|         .join('\n\n')}` | ||||
|     ) | ||||
|   } else if (msg.content === '!perms') { | ||||
|     if (msg.channel.type !== ChannelTypes.GUILD_TEXT) { | ||||
|       return msg.channel.send("This isn't a guild text channel!") | ||||
|     } | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
 | ||||
|     const permissions = await ((msg.channel as unknown) as GuildTextChannel).permissionsFor( | ||||
|       // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
 | ||||
|       msg.member as Member | ||||
|     ) | ||||
|     msg.channel.send(`Your permissions:\n${permissions.toArray().join('\n')}`) | ||||
|   } else if (msg.content === '!addBasicOverwrites') { | ||||
|     // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
 | ||||
|     if (!checkGuildTextBasedChannel(msg.channel)) { | ||||
|       return msg.channel.send("This isn't a guild text channel!") | ||||
|     } | ||||
|     if (msg.member !== undefined) { | ||||
|       await msg.channel.addOverwrite({ | ||||
|         id: msg.member, | ||||
|         allow: Permissions.DEFAULT.toString() | ||||
|       }) | ||||
|       msg.channel.send(`Done!`) | ||||
|     } | ||||
|   } else if (msg.content === '!updateBasicOverwrites') { | ||||
|     // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
 | ||||
|     if (!checkGuildTextBasedChannel(msg.channel)) { | ||||
|       return msg.channel.send("This isn't a guild text channel!") | ||||
|     } | ||||
|     if (msg.member !== undefined) { | ||||
|       await msg.channel.editOverwrite( | ||||
|         { | ||||
|           id: msg.member, | ||||
|           allow: Permissions.DEFAULT.toString() | ||||
|         }, | ||||
|         { | ||||
|           allow: OverrideType.REMOVE | ||||
|         } | ||||
|       ) | ||||
|       msg.channel.send(`Done!`) | ||||
|     } | ||||
|   } else if (msg.content === '!addAllRoles') { | ||||
|     const roles = await msg.guild?.roles.array() | ||||
|     if (roles !== undefined) { | ||||
|       roles.forEach(async (role) => { | ||||
|         await msg.member?.roles.add(role) | ||||
|         console.log(role) | ||||
|       }) | ||||
|     } | ||||
|   } else if (msg.content === '!createAndAddRole') { | ||||
|     if (msg.guild !== undefined) { | ||||
|       const role = await msg.guild.roles.create({ | ||||
|         name: 'asdf', | ||||
|         permissions: 0 | ||||
|       }) | ||||
|       await msg.member?.roles.add(role) | ||||
|     } | ||||
|   } else if (msg.content === '!roles') { | ||||
|     let buf = 'Roles:' | ||||
|     if (msg.member === undefined) return | ||||
|     for await (const role of msg.member.roles) { | ||||
|       buf += `\n${role.name}` | ||||
|     } | ||||
|     msg.reply(buf) | ||||
|   } else if (msg.content === '!timer') { | ||||
|     msg.channel.send('3...').then((msg) => { | ||||
|       setTimeout(() => { | ||||
|         msg.edit('2...').then((msg) => { | ||||
|           setTimeout(() => { | ||||
|             msg.edit('1...').then((msg) => { | ||||
|               setTimeout(() => { | ||||
|                 msg.edit('ok wut') | ||||
|               }, 1000) | ||||
|             }) | ||||
|           }, 1000) | ||||
|         }) | ||||
|       }, 1000) | ||||
|     }) | ||||
|   } | ||||
| }) | ||||
| 
 | ||||
| client.on('messageReactionRemove', (reaction, user) => { | ||||
|   const msg = reaction.message | ||||
| 
 | ||||
|   // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
 | ||||
|   if (reaction.me && reaction.emoji.getEmojiString === '🤔') { | ||||
|     msg.removeReaction(reaction.emoji) | ||||
|   } | ||||
| }) | ||||
| 
 | ||||
| client.connect(TOKEN, Intents.None) | ||||
| 
 | ||||
| // OLD: Was a way to reproduce reconnect infinite loop
 | ||||
| // setTimeout(() => {
 | ||||
| //   console.log('[DEBUG] Reconnect')
 | ||||
| //   client.gateway?.reconnect()
 | ||||
| // }, 1000 * 4)
 | ||||
							
								
								
									
										223
									
								
								test/music.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								test/music.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,223 @@ | |||
| import { | ||||
|   CommandClient, | ||||
|   event, | ||||
|   Intents, | ||||
|   command, | ||||
|   subslash, | ||||
|   groupslash, | ||||
|   CommandContext, | ||||
|   Extension, | ||||
|   Collection, | ||||
|   GuildTextChannel | ||||
| } from '../../mod.ts' | ||||
| import { LL_IP, LL_PASS, LL_PORT, TOKEN } from './config.ts' | ||||
| import { Manager, Player } from 'https://deno.land/x/lavadeno/mod.ts' | ||||
| import { Interaction } from '../structures/slash.ts' | ||||
| import { slash } from '../client/mod.ts' | ||||
| // import { SlashCommandOptionType } from '../types/slash.ts'
 | ||||
| 
 | ||||
| export const nodes = [ | ||||
|   { | ||||
|     id: 'main', | ||||
|     host: LL_IP, | ||||
|     port: LL_PORT, | ||||
|     password: LL_PASS | ||||
|   } | ||||
| ] | ||||
| 
 | ||||
| class MyClient extends CommandClient { | ||||
|   manager: Manager | ||||
| 
 | ||||
|   constructor() { | ||||
|     super({ | ||||
|       prefix: ['.'], | ||||
|       caseSensitive: false | ||||
|     }) | ||||
| 
 | ||||
|     // eslint-disable-next-line @typescript-eslint/no-this-alias
 | ||||
|     const client = this | ||||
| 
 | ||||
|     this.manager = new Manager(nodes, { | ||||
|       send(id, payload) { | ||||
|         // Sharding not added yet
 | ||||
|         client.gateway?.send(payload) | ||||
|       } | ||||
|     }) | ||||
| 
 | ||||
|     this.manager.on('socketError', ({ id }, error) => | ||||
|       console.error(`${id} ran into an error`, error) | ||||
|     ) | ||||
|     this.manager.on('socketReady', (node) => | ||||
|       console.log(`${node.id} connected.`) | ||||
|     ) | ||||
| 
 | ||||
|     this.on('raw', (evt: string, d: any) => { | ||||
|       if (evt === 'VOICE_SERVER_UPDATE') this.manager.serverUpdate(d) | ||||
|       else if (evt === 'VOICE_STATE_UPDATE') this.manager.stateUpdate(d) | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   @subslash('cmd', 'sub-cmd-no-grp') | ||||
|   subCmdNoGroup(d: Interaction): void { | ||||
|     d.respond({ content: 'sub-cmd-no-group worked' }) | ||||
|   } | ||||
| 
 | ||||
|   @groupslash('cmd', 'sub-cmd-group', 'sub-cmd') | ||||
|   subCmdGroup(d: Interaction): void { | ||||
|     d.respond({ content: 'sub-cmd-group worked' }) | ||||
|   } | ||||
| 
 | ||||
|   @command() | ||||
|   rmrf(ctx: CommandContext): any { | ||||
|     if (ctx.author.id !== '422957901716652033') return | ||||
|     ;((ctx.channel as any) as GuildTextChannel) | ||||
|       .bulkDelete(3) | ||||
|       .then((chan) => { | ||||
|         ctx.channel.send(`Bulk deleted 2 in ${chan}`) | ||||
|       }) | ||||
|       .catch((e) => ctx.channel.send(`${e.message}`)) | ||||
|   } | ||||
| 
 | ||||
|   @slash() | ||||
|   run(d: Interaction): void { | ||||
|     console.log(d.name) | ||||
|   } | ||||
| 
 | ||||
|   @event() | ||||
|   raw(evt: string, d: any): void { | ||||
|     if (!evt.startsWith('APPLICATION')) return | ||||
|     console.log(evt, d) | ||||
|   } | ||||
| 
 | ||||
|   @event() | ||||
|   ready(): void { | ||||
|     console.log(`Logged in as ${this.user?.tag}!`) | ||||
|     this.manager.init(this.user?.id as string) | ||||
|     this.slash.commands.all().then(console.log) | ||||
| 
 | ||||
|     // this.rest.api.users['422957901716652033'].get().then(console.log)
 | ||||
|     // client.slash.commands.create(
 | ||||
|     //   {
 | ||||
|     //     name: 'cmd',
 | ||||
|     //     description: 'Parent command!',
 | ||||
|     //     options: [
 | ||||
|     //       {
 | ||||
|     //         name: 'sub-cmd-group',
 | ||||
|     //         type: SlashCommandOptionType.SUB_COMMAND_GROUP,
 | ||||
|     //         description: 'Sub Cmd Group',
 | ||||
|     //         options: [
 | ||||
|     //           {
 | ||||
|     //             name: 'sub-cmd',
 | ||||
|     //             type: SlashCommandOptionType.SUB_COMMAND,
 | ||||
|     //             description: 'Sub Cmd'
 | ||||
|     //           }
 | ||||
|     //         ]
 | ||||
|     //       },
 | ||||
|     //       {
 | ||||
|     //         name: 'sub-cmd-no-grp',
 | ||||
|     //         type: SlashCommandOptionType.SUB_COMMAND,
 | ||||
|     //         description: 'Sub Cmd'
 | ||||
|     //       },
 | ||||
|     //       {
 | ||||
|     //         name: 'sub-cmd-grp-2',
 | ||||
|     //         type: SlashCommandOptionType.SUB_COMMAND_GROUP,
 | ||||
|     //         description: 'Sub Cmd Group 2',
 | ||||
|     //         options: [
 | ||||
|     //           {
 | ||||
|     //             name: 'sub-cmd-1',
 | ||||
|     //             type: SlashCommandOptionType.SUB_COMMAND,
 | ||||
|     //             description: 'Sub Cmd 1'
 | ||||
|     //           },
 | ||||
|     //           {
 | ||||
|     //             name: 'sub-cmd-2',
 | ||||
|     //             type: SlashCommandOptionType.SUB_COMMAND,
 | ||||
|     //             description: 'Sub Cmd 2'
 | ||||
|     //           }
 | ||||
|     //         ]
 | ||||
|     //       }
 | ||||
|     //     ]
 | ||||
|     //   },
 | ||||
|     //   '783319033205751809'
 | ||||
|     // )
 | ||||
|     // client.slash.commands.delete('788719077329207296', '783319033205751809')
 | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const players = new Collection<string, Player>() | ||||
| 
 | ||||
| class VCExtension extends Extension { | ||||
|   name = 'VC' | ||||
|   subPrefix = 'vc' | ||||
| 
 | ||||
|   @command() | ||||
|   async join(ctx: CommandContext): Promise<any> { | ||||
|     if (players.has(ctx.guild?.id as string) === true) | ||||
|       return ctx.message.reply(`Already playing in this server!`) | ||||
| 
 | ||||
|     ctx.argString = ctx.argString.slice(4).trim() | ||||
| 
 | ||||
|     if (ctx.argString === '') | ||||
|       return ctx.message.reply('You gave nothing to search.') | ||||
| 
 | ||||
|     const userVS = await ctx.guild?.voiceStates.get(ctx.author.id) | ||||
|     if (userVS === undefined) { | ||||
|       ctx.message.reply("You're not in VC.") | ||||
|       return | ||||
|     } | ||||
| 
 | ||||
|     const player = (ctx.client as MyClient).manager.create( | ||||
|       ctx.guild?.id as string | ||||
|     ) | ||||
| 
 | ||||
|     await player.connect(userVS.channel?.id as string, { selfDeaf: true }) | ||||
| 
 | ||||
|     ctx.message.reply(`Joined VC channel - ${userVS.channel?.name}!`) | ||||
| 
 | ||||
|     players.set(ctx.guild?.id as string, player) | ||||
| 
 | ||||
|     ctx.channel.send(`Loading...`) | ||||
| 
 | ||||
|     ctx.channel.send(`Searching for ${ctx.argString}...`) | ||||
| 
 | ||||
|     const { track, info } = await player.manager | ||||
|       .search(`ytsearch:${ctx.argString}`) | ||||
|       .then((e) => e.tracks[0]) | ||||
| 
 | ||||
|     await player.play(track) | ||||
| 
 | ||||
|     ctx.channel.send(`Now playing ${info.title}!\nDebug Track: ${track}`) | ||||
|   } | ||||
| 
 | ||||
|   @command() | ||||
|   async leave(ctx: CommandContext): Promise<any> { | ||||
|     const userVS = await ctx.guild?.voiceStates.get( | ||||
|       (ctx.client.user?.id as unknown) as string | ||||
|     ) | ||||
|     if (userVS === undefined) { | ||||
|       ctx.message.reply("I'm not in VC.") | ||||
|       return | ||||
|     } | ||||
|     userVS.channel?.leave() | ||||
|     ctx.message.reply(`Left VC channel - ${userVS.channel?.name}!`) | ||||
| 
 | ||||
|     if (players.has(ctx.guild?.id as string) !== true) | ||||
|       return ctx.message.reply('Not playing anything in this server.') | ||||
| 
 | ||||
|     const player = (players.get(ctx.guild?.id as string) as unknown) as Player | ||||
|     await player.stop() | ||||
|     await player.destroy() | ||||
| 
 | ||||
|     players.delete(ctx.guild?.id as string) | ||||
|     ctx.message.reply('Stopped player') | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const client = new MyClient() | ||||
| 
 | ||||
| client.on('raw', (e, d) => { | ||||
|   if (e === 'GUILD_MEMBER_ADD' || e === 'GUILD_MEMBER_UPDATE') console.log(e, d) | ||||
| }) | ||||
| 
 | ||||
| client.extensions.load(VCExtension) | ||||
| 
 | ||||
| client.connect(TOKEN, Intents.All) | ||||
							
								
								
									
										27
									
								
								test/slash-http.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								test/slash-http.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,27 @@ | |||
| import { SlashClient } from '../../mod.ts' | ||||
| import { SLASH_ID, SLASH_PUB_KEY, SLASH_TOKEN } from './config.ts' | ||||
| import { listenAndServe } from 'https://deno.land/std@0.90.0/http/server.ts' | ||||
| 
 | ||||
| const slash = new SlashClient({ | ||||
|   id: SLASH_ID, | ||||
|   token: SLASH_TOKEN, | ||||
|   publicKey: SLASH_PUB_KEY | ||||
| }) | ||||
| 
 | ||||
| await slash.commands.bulkEdit([ | ||||
|   { | ||||
|     name: 'ping', | ||||
|     description: 'Just ping!' | ||||
|   } | ||||
| ]) | ||||
| 
 | ||||
| const options = { port: 8000 } | ||||
| console.log('Listen on port: ' + options.port.toString()) | ||||
| listenAndServe(options, async (req) => { | ||||
|   const d = await slash.verifyServerRequest(req) | ||||
|   if (d === false) return req.respond({ status: 401, body: 'not authorized' }) | ||||
| 
 | ||||
|   console.log(d) | ||||
|   if (d.type === 1) return d.respond({ type: 1 }) | ||||
|   d.reply('Pong!') | ||||
| }) | ||||
							
								
								
									
										18
									
								
								test/slash-only.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								test/slash-only.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | |||
| import { SlashClient } from '../models/slashClient.ts' | ||||
| import { SlashCommandPartial } from '../types/slash.ts' | ||||
| import { TOKEN } from './config.ts' | ||||
| 
 | ||||
| export const slash = new SlashClient({ token: TOKEN }) | ||||
| 
 | ||||
| console.log(slash.modules) | ||||
| 
 | ||||
| // Cmd objects come here
 | ||||
| const commands: SlashCommandPartial[] = [] | ||||
| 
 | ||||
| console.log('Creating...') | ||||
| commands.forEach((cmd) => { | ||||
|   slash.commands | ||||
|     .create(cmd, '!! Your testing guild ID comes here !!') | ||||
|     .then((c) => console.log(`Created command ${c.name}!`)) | ||||
|     .catch((e) => `Failed to create ${cmd.name} - ${e.message}`) | ||||
| }) | ||||
							
								
								
									
										64
									
								
								test/slash.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								test/slash.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,64 @@ | |||
| import { | ||||
|   Client, | ||||
|   Intents, | ||||
|   event, | ||||
|   slash, | ||||
|   SlashCommandOptionType as Type | ||||
| } from '../../mod.ts' | ||||
| import { Interaction } from '../structures/slash.ts' | ||||
| import { TOKEN } from './config.ts' | ||||
| 
 | ||||
| export class MyClient extends Client { | ||||
|   @event() ready(): void { | ||||
|     console.log(`Logged in as ${this.user?.tag}!`) | ||||
|     this.slash.commands.bulkEdit( | ||||
|       [ | ||||
|         { | ||||
|           name: 'test', | ||||
|           description: 'Test command.', | ||||
|           options: [ | ||||
|             { | ||||
|               name: 'user', | ||||
|               type: Type.USER, | ||||
|               description: 'User' | ||||
|             }, | ||||
|             { | ||||
|               name: 'role', | ||||
|               type: Type.ROLE, | ||||
|               description: 'Role' | ||||
|             }, | ||||
|             { | ||||
|               name: 'channel', | ||||
|               type: Type.CHANNEL, | ||||
|               description: 'Channel' | ||||
|             }, | ||||
|             { | ||||
|               name: 'string', | ||||
|               type: Type.STRING, | ||||
|               description: 'String' | ||||
|             } | ||||
|           ] | ||||
|         } | ||||
|       ], | ||||
|       '807935370556866560' | ||||
|     ) | ||||
|     this.slash.commands.bulkEdit([]) | ||||
|   } | ||||
| 
 | ||||
|   @slash() test(d: Interaction): void { | ||||
|     console.log(d.resolved) | ||||
|   } | ||||
| 
 | ||||
|   @event() raw(evt: string, d: any): void { | ||||
|     if (evt === 'INTERACTION_CREATE') console.log(evt, d?.data?.resolved) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const client = new MyClient({ | ||||
|   presence: { | ||||
|     status: 'dnd', | ||||
|     activity: { name: 'Slash Commands', type: 'LISTENING' } | ||||
|   } | ||||
| }) | ||||
| 
 | ||||
| client.connect(TOKEN, Intents.None) | ||||
							
								
								
									
										21
									
								
								test/template.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								test/template.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| import { Client, Intents } from '../../mod.ts' | ||||
| import { TOKEN } from './config.ts' | ||||
| 
 | ||||
| const client = new Client() | ||||
| 
 | ||||
| client.on('guildLoaded', async (guild) => { | ||||
|   if (guild.id === 'GUILD_ID') { | ||||
|     console.log((await guild.syncTemplate('TEMPLATE_ID')).code) | ||||
|     console.log( | ||||
|       ( | ||||
|         await guild.editTemplate('TEMPLATE_ID', { | ||||
|           name: 'asdf', | ||||
|           description: 'asdfasdfasdf' | ||||
|         }) | ||||
|       ).code | ||||
|     ) | ||||
|     console.log((await guild.deleteTemplate('TEMPLATE_ID')).id) | ||||
|   } | ||||
| }) | ||||
| 
 | ||||
| client.connect(TOKEN, Intents.All) | ||||
							
								
								
									
										14
									
								
								test/user.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								test/user.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | |||
| import { Client, Intents } from '../mod.ts' | ||||
| import { TOKEN } from './config.ts' | ||||
| 
 | ||||
| const client = new Client() | ||||
| 
 | ||||
| client.on('ready', async () => { | ||||
|   client.editUser({ | ||||
|     username: 'Learning' | ||||
|   }) | ||||
|   const channel = await client.createDM('USER_ID') | ||||
|   channel.send('nice') | ||||
| }) | ||||
| 
 | ||||
| client.connect(TOKEN, Intents.All) | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue