feat: member screening types update

This commit is contained in:
DjDeveloperr 2020-12-22 15:40:19 +05:30
parent a9338ad88a
commit 94a447921d
7 changed files with 115 additions and 34 deletions

View File

@ -410,6 +410,7 @@ export class RESTManager {
const query =
method === 'get' && body !== undefined
? Object.entries(body as any)
.filter(([k, v]) => v !== undefined)
.map(
([key, value]) =>
`${encodeURIComponent(key)}=${encodeURIComponent(

View File

@ -46,6 +46,10 @@ export class Message extends Base {
flags?: number
stickers?: MessageSticker[]
get createdAt(): Date {
return new Date(this.timestamp)
}
constructor(
client: Client,
data: MessagePayload,

View File

@ -3,6 +3,7 @@ import { Client } from '../models/client.ts'
import {
GuildTextChannelPayload,
MessageOption,
MessagePayload,
MessageReference,
ModifyGuildTextChannelOption,
ModifyGuildTextChannelPayload,
@ -14,6 +15,7 @@ import {
CHANNEL_MESSAGE,
CHANNEL_MESSAGES
} from '../types/endpoint.ts'
import { Collection } from '../utils/collection.ts'
import { Channel } from './channel.ts'
import { Embed } from './embed.ts'
import { Guild } from './guild.ts'
@ -124,6 +126,48 @@ export class TextChannel extends Channel {
await res.mentions.fromPayload(newMsg)
return res
}
/**
* Fetch Messages of a Channel
* @param options Options to configure fetching Messages
*/
async fetchMessages(options?: {
limit?: number
around?: Message | string
before?: Message | string
after?: Message | string
}): Promise<Collection<string, Message>> {
const res = new Collection<string, Message>()
const raws = (await this.client.rest.api.channels[this.id].messages.get({
limit: options?.limit ?? 50,
around:
options?.around === undefined
? undefined
: typeof options.around === 'string'
? options.around
: options.around.id,
before:
options?.before === undefined
? undefined
: typeof options.before === 'string'
? options.before
: options.before.id,
after:
options?.after === undefined
? undefined
: typeof options.after === 'string'
? options.after
: options.after.id
})) as MessagePayload[]
for (const raw of raws) {
await this.messages.set(raw.id, raw)
const msg = ((await this.messages.get(raw.id)) as unknown) as Message
res.set(msg.id, msg)
}
return res
}
}
export class GuildTextChannel extends TextChannel {
@ -185,4 +229,40 @@ export class GuildTextChannel extends TextChannel {
return new GuildTextChannel(this.client, resp, this.guild)
}
/**
* Bulk Delete Messages in a Guild Text Channel
* @param messages Messages to delete. Can be a number, or Array of Message or IDs
*/
async bulkDelete(
messages: Array<Message | string> | number
): Promise<GuildTextChannel> {
let ids: string[] = []
if (Array.isArray(messages))
ids = messages.map((e) => (typeof e === 'string' ? e : e.id))
else {
let list = await this.messages.array()
if (list.length < messages) list = (await this.fetchMessages()).array()
ids = list
.sort((b, a) => a.createdAt.getTime() - b.createdAt.getTime())
.filter((e, i) => i < messages)
.filter(
(e) =>
new Date().getTime() - e.createdAt.getTime() <=
1000 * 60 * 60 * 24 * 14
)
.map((e) => e.id)
}
ids = [...new Set(ids)]
if (ids.length < 2 || ids.length > 100)
throw new Error('bulkDelete can only delete messages in range 2-100')
await this.client.rest.api.channels[this.id].messages['bulk-delete'].post({
messages: ids
})
return this
}
}

View File

@ -7,7 +7,8 @@ import {
groupslash,
CommandContext,
Extension,
Collection
Collection,
GuildTextChannel
} from '../../mod.ts'
import { LL_IP, LL_PASS, LL_PORT, TOKEN } from './config.ts'
import {
@ -69,6 +70,17 @@ class MyClient extends CommandClient {
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)

View File

@ -1,36 +1,16 @@
import { SlashClient, SlashBuilder } from '../models/slashClient.ts'
import { SlashClient } from '../models/slashClient.ts'
import { SlashCommandPartial } from '../types/slash.ts'
import { TOKEN } from './config.ts'
const slash = new SlashClient({ token: TOKEN })
export const slash = new SlashClient({ token: TOKEN })
slash.commands.all().then(console.log)
// Cmd objects come here
const commands: SlashCommandPartial[] = []
const cmd = new SlashBuilder()
.name('searchmusic')
.description('Search for music.')
.option((o) =>
o.string({ name: 'query', description: 'Query to search with.' })
)
.option((o) =>
o.string({
name: 'engine',
description: 'Search engine to use.',
choices: [{ name: 'YouTube', value: 'youtube' }, 'Spotify']
})
)
.options({
query: {
description: 'Query UWU',
type: 3
},
engine: {
description: 'Engine UWU',
type: 3,
choices: [
{ name: 'YouTube', value: 'youtube' },
{ name: 'Spotify', value: 'spotify' }
]
}
})
console.log(JSON.stringify(cmd.export()))
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}`)
})

View File

@ -62,6 +62,7 @@ export interface MemberPayload {
premium_since?: string
deaf: boolean
mute: boolean
pending?: boolean
}
export enum MessageNotification {
@ -113,6 +114,9 @@ export type GuildFeatures =
| 'FEATURABLE'
| 'ANIMATED_ICON'
| 'BANNER'
| 'WELCOME_SCREEN_ENABLED'
| 'MEMBER_VERIFICATION_GATE_ENABLED'
| 'PREVIEW_ENABLED'
export enum IntegrationExpireBehavior {
REMOVE_ROLE = 0,

View File

@ -50,7 +50,7 @@ export interface SlashCommandChoice {
/** (Display) name of the Choice */
name: string
/** Actual value to be sent in Interaction */
value: string
value: any
}
export enum SlashCommandOptionType {