Merge pull request #92 from DjDeveloperr/slash
Add support for Message Attachment and add SlashCommandsManager#editBulk
This commit is contained in:
commit
71ded8ea2e
11 changed files with 86 additions and 16 deletions
|
@ -139,7 +139,7 @@ Documentation is available for `main` (branch) and `stable` (release).
|
||||||
|
|
||||||
- [Main](https://doc.deno.land/https/raw.githubusercontent.com/harmonyland/harmony/main/mod.ts)
|
- [Main](https://doc.deno.land/https/raw.githubusercontent.com/harmonyland/harmony/main/mod.ts)
|
||||||
- [Stable](https://doc.deno.land/https/deno.land/x/harmony/mod.ts)
|
- [Stable](https://doc.deno.land/https/deno.land/x/harmony/mod.ts)
|
||||||
- [Guide](https://harmonyland.github.io)
|
- [Guide](https://harmony.mod.land)
|
||||||
|
|
||||||
## Found a bug or want support? Join our discord server!
|
## Found a bug or want support? Join our discord server!
|
||||||
|
|
||||||
|
|
6
mod.ts
6
mod.ts
|
@ -59,7 +59,7 @@ export { NewsChannel } from './src/structures/guildNewsChannel.ts'
|
||||||
export { VoiceChannel } from './src/structures/guildVoiceChannel.ts'
|
export { VoiceChannel } from './src/structures/guildVoiceChannel.ts'
|
||||||
export { Invite } from './src/structures/invite.ts'
|
export { Invite } from './src/structures/invite.ts'
|
||||||
export * from './src/structures/member.ts'
|
export * from './src/structures/member.ts'
|
||||||
export { Message } from './src/structures/message.ts'
|
export { Message, MessageAttachment } from './src/structures/message.ts'
|
||||||
export { MessageMentions } from './src/structures/messageMentions.ts'
|
export { MessageMentions } from './src/structures/messageMentions.ts'
|
||||||
export {
|
export {
|
||||||
Presence,
|
Presence,
|
||||||
|
@ -69,6 +69,7 @@ export {
|
||||||
export { Role } from './src/structures/role.ts'
|
export { Role } from './src/structures/role.ts'
|
||||||
export { Snowflake } from './src/utils/snowflake.ts'
|
export { Snowflake } from './src/utils/snowflake.ts'
|
||||||
export { TextChannel, GuildTextChannel } from './src/structures/textChannel.ts'
|
export { TextChannel, GuildTextChannel } from './src/structures/textChannel.ts'
|
||||||
|
export type { AllMessageOptions } from './src/structures/textChannel.ts'
|
||||||
export { MessageReaction } from './src/structures/messageReaction.ts'
|
export { MessageReaction } from './src/structures/messageReaction.ts'
|
||||||
export { User } from './src/structures/user.ts'
|
export { User } from './src/structures/user.ts'
|
||||||
export { Webhook } from './src/structures/webhook.ts'
|
export { Webhook } from './src/structures/webhook.ts'
|
||||||
|
@ -97,7 +98,8 @@ export type {
|
||||||
GuildChannelPayload,
|
GuildChannelPayload,
|
||||||
GuildTextChannelPayload,
|
GuildTextChannelPayload,
|
||||||
GuildVoiceChannelPayload,
|
GuildVoiceChannelPayload,
|
||||||
GroupDMChannelPayload
|
GroupDMChannelPayload,
|
||||||
|
MessageOptions
|
||||||
} from './src/types/channel.ts'
|
} from './src/types/channel.ts'
|
||||||
export type { EmojiPayload } from './src/types/emoji.ts'
|
export type { EmojiPayload } from './src/types/emoji.ts'
|
||||||
export type {
|
export type {
|
||||||
|
|
|
@ -198,7 +198,7 @@ export class Client extends HarmonyEventEmitter<ClientEvents> {
|
||||||
enabled: options.enableSlash
|
enabled: options.enableSlash
|
||||||
})
|
})
|
||||||
|
|
||||||
this.fetchGatewayInfo = options.fetchGatewayInfo ?? false
|
this.fetchGatewayInfo = options.fetchGatewayInfo ?? true
|
||||||
|
|
||||||
if (this.token === undefined) {
|
if (this.token === undefined) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -271,7 +271,8 @@ export class RESTManager {
|
||||||
if (body?.file !== undefined) {
|
if (body?.file !== undefined) {
|
||||||
const form = new FormData()
|
const form = new FormData()
|
||||||
form.append('file', body.file.blob, body.file.name)
|
form.append('file', body.file.blob, body.file.name)
|
||||||
form.append('payload_json', JSON.stringify({ ...body, file: undefined }))
|
const json = JSON.stringify(body)
|
||||||
|
form.append('payload_json', json)
|
||||||
body.file = form
|
body.file = form
|
||||||
} else if (
|
} else if (
|
||||||
body !== undefined &&
|
body !== undefined &&
|
||||||
|
|
|
@ -314,6 +314,23 @@ export class SlashCommandsManager {
|
||||||
|
|
||||||
return new SlashCommand(this, data)
|
return new SlashCommand(this, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Bulk Edit Global or Guild Slash Commands */
|
||||||
|
async bulkEdit(
|
||||||
|
cmds: Array<SlashCommandPartial | SlashCommandPayload>,
|
||||||
|
guild?: Guild | string
|
||||||
|
): Promise<SlashCommandsManager> {
|
||||||
|
const route =
|
||||||
|
guild === undefined
|
||||||
|
? this.rest.api.applications[this.slash.getID()].commands
|
||||||
|
: this.rest.api.applications[this.slash.getID()].guilds[
|
||||||
|
typeof guild === 'string' ? guild : guild.id
|
||||||
|
].commands
|
||||||
|
|
||||||
|
await route.put(cmds)
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export type SlashCommandHandlerCallback = (interaction: Interaction) => any
|
export type SlashCommandHandlerCallback = (interaction: Interaction) => any
|
||||||
|
|
|
@ -3,7 +3,7 @@ import {
|
||||||
Attachment,
|
Attachment,
|
||||||
MessageActivity,
|
MessageActivity,
|
||||||
MessageApplication,
|
MessageApplication,
|
||||||
MessageOption,
|
MessageOptions,
|
||||||
MessagePayload,
|
MessagePayload,
|
||||||
MessageReference
|
MessageReference
|
||||||
} from '../types/channel.ts'
|
} from '../types/channel.ts'
|
||||||
|
@ -19,7 +19,7 @@ import { MessageReactionsManager } from '../managers/messageReactions.ts'
|
||||||
import { MessageSticker } from './messageSticker.ts'
|
import { MessageSticker } from './messageSticker.ts'
|
||||||
import { Emoji } from './emoji.ts'
|
import { Emoji } from './emoji.ts'
|
||||||
|
|
||||||
type AllMessageOptions = MessageOption | Embed
|
type AllMessageOptions = MessageOptions | Embed
|
||||||
|
|
||||||
export class Message extends Base {
|
export class Message extends Base {
|
||||||
id: string
|
id: string
|
||||||
|
@ -171,3 +171,39 @@ export class Message extends Base {
|
||||||
return this.channel.removeReaction(this, emoji, user)
|
return this.channel.removeReaction(this, emoji, user)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const encoder = new TextEncoder()
|
||||||
|
|
||||||
|
/** Message Attachment that can be sent while Creating Message */
|
||||||
|
export class MessageAttachment {
|
||||||
|
name: string
|
||||||
|
blob: Blob
|
||||||
|
|
||||||
|
constructor(name: string, blob: Blob | Uint8Array | string) {
|
||||||
|
this.name = name
|
||||||
|
this.blob =
|
||||||
|
typeof blob === 'string'
|
||||||
|
? new Blob([encoder.encode(blob)])
|
||||||
|
: blob instanceof Uint8Array
|
||||||
|
? new Blob([blob])
|
||||||
|
: blob
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Load an Message Attachment from local file or URL */
|
||||||
|
static async load(
|
||||||
|
path: string,
|
||||||
|
filename?: string
|
||||||
|
): Promise<MessageAttachment> {
|
||||||
|
const blob = path.startsWith('http')
|
||||||
|
? await fetch(path).then((res) => res.blob())
|
||||||
|
: await Deno.readFile(path)
|
||||||
|
|
||||||
|
if (filename === undefined) {
|
||||||
|
const split = path.replaceAll('\\', '/').split('/').pop()
|
||||||
|
if (split !== undefined) filename = split.split('?')[0].split('#')[0]
|
||||||
|
else filename = 'unnamed_attachment'
|
||||||
|
}
|
||||||
|
|
||||||
|
return new MessageAttachment(filename, blob)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
import { MessageOption } from '../types/channel.ts'
|
import { MessageOptions } from '../types/channel.ts'
|
||||||
import { INTERACTION_CALLBACK, WEBHOOK_MESSAGE } from '../types/endpoint.ts'
|
import { INTERACTION_CALLBACK, WEBHOOK_MESSAGE } from '../types/endpoint.ts'
|
||||||
import {
|
import {
|
||||||
InteractionData,
|
InteractionData,
|
||||||
|
@ -16,7 +16,7 @@ import { GuildTextChannel, TextChannel } from './textChannel.ts'
|
||||||
import { User } from './user.ts'
|
import { User } from './user.ts'
|
||||||
import { Webhook } from './webhook.ts'
|
import { Webhook } from './webhook.ts'
|
||||||
|
|
||||||
interface WebhookMessageOptions extends MessageOption {
|
interface WebhookMessageOptions extends MessageOptions {
|
||||||
embeds?: Embed[]
|
embeds?: Embed[]
|
||||||
name?: string
|
name?: string
|
||||||
avatar?: string
|
avatar?: string
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { MessagesManager } from '../managers/messages.ts'
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
import {
|
import {
|
||||||
GuildTextChannelPayload,
|
GuildTextChannelPayload,
|
||||||
MessageOption,
|
MessageOptions,
|
||||||
MessagePayload,
|
MessagePayload,
|
||||||
MessageReference,
|
MessageReference,
|
||||||
ModifyGuildTextChannelOption,
|
ModifyGuildTextChannelOption,
|
||||||
|
@ -28,7 +28,7 @@ import { Member } from './member.ts'
|
||||||
import { Message } from './message.ts'
|
import { Message } from './message.ts'
|
||||||
import { User } from './user.ts'
|
import { User } from './user.ts'
|
||||||
|
|
||||||
export type AllMessageOptions = MessageOption | Embed
|
export type AllMessageOptions = MessageOptions | Embed
|
||||||
|
|
||||||
export class TextChannel extends Channel {
|
export class TextChannel extends Channel {
|
||||||
lastMessageID?: string
|
lastMessageID?: string
|
||||||
|
@ -105,7 +105,7 @@ export class TextChannel extends Channel {
|
||||||
async editMessage(
|
async editMessage(
|
||||||
message: Message | string,
|
message: Message | string,
|
||||||
text?: string,
|
text?: string,
|
||||||
option?: MessageOption
|
option?: MessageOptions
|
||||||
): Promise<Message> {
|
): Promise<Message> {
|
||||||
if (text === undefined && option === undefined) {
|
if (text === undefined && option === undefined) {
|
||||||
throw new Error('Either text or option is necessary.')
|
throw new Error('Either text or option is necessary.')
|
||||||
|
@ -135,6 +135,7 @@ export class TextChannel extends Channel {
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Add a reaction to a Message in this Channel */
|
||||||
async addReaction(
|
async addReaction(
|
||||||
message: Message | string,
|
message: Message | string,
|
||||||
emoji: Emoji | string
|
emoji: Emoji | string
|
||||||
|
@ -153,6 +154,7 @@ export class TextChannel extends Channel {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Remove Reaction from a Message in this Channel */
|
||||||
async removeReaction(
|
async removeReaction(
|
||||||
message: Message | string,
|
message: Message | string,
|
||||||
emoji: Emoji | string,
|
emoji: Emoji | string,
|
||||||
|
|
|
@ -4,7 +4,7 @@ import {
|
||||||
} from '../consts/urlsAndVersions.ts'
|
} from '../consts/urlsAndVersions.ts'
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
import { RESTManager } from '../models/rest.ts'
|
import { RESTManager } from '../models/rest.ts'
|
||||||
import { MessageOption } from '../types/channel.ts'
|
import { MessageOptions } from '../types/channel.ts'
|
||||||
import { UserPayload } from '../types/user.ts'
|
import { UserPayload } from '../types/user.ts'
|
||||||
import { WebhookPayload } from '../types/webhook.ts'
|
import { WebhookPayload } from '../types/webhook.ts'
|
||||||
import { Embed } from './embed.ts'
|
import { Embed } from './embed.ts'
|
||||||
|
@ -14,7 +14,7 @@ import { User } from './user.ts'
|
||||||
import { fetchAuto } from '../../deps.ts'
|
import { fetchAuto } from '../../deps.ts'
|
||||||
import { WEBHOOK_MESSAGE } from '../types/endpoint.ts'
|
import { WEBHOOK_MESSAGE } from '../types/endpoint.ts'
|
||||||
|
|
||||||
export interface WebhookMessageOptions extends MessageOption {
|
export interface WebhookMessageOptions extends MessageOptions {
|
||||||
embeds?: Embed[]
|
embeds?: Embed[]
|
||||||
name?: string
|
name?: string
|
||||||
avatar?: string
|
avatar?: string
|
||||||
|
|
|
@ -12,6 +12,7 @@ import {
|
||||||
GuildTextChannel
|
GuildTextChannel
|
||||||
} from '../../mod.ts'
|
} from '../../mod.ts'
|
||||||
import { Collector } from '../models/collectors.ts'
|
import { Collector } from '../models/collectors.ts'
|
||||||
|
import { MessageAttachment } from '../structures/message.ts'
|
||||||
import { TOKEN } from './config.ts'
|
import { TOKEN } from './config.ts'
|
||||||
|
|
||||||
const client = new Client({
|
const client = new Client({
|
||||||
|
@ -143,6 +144,16 @@ client.on('messageCreate', async (msg: Message) => {
|
||||||
coll.on('collect', (msg) =>
|
coll.on('collect', (msg) =>
|
||||||
msg.channel.send(`[COL] Collect: ${msg.content}`)
|
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 === '!textfile') {
|
||||||
|
msg.channel.send({
|
||||||
|
file: new MessageAttachment('hello.txt', 'hello world')
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { Embed } from '../structures/embed.ts'
|
import { Embed } from '../structures/embed.ts'
|
||||||
|
import { MessageAttachment } from '../structures/message.ts'
|
||||||
import { EmojiPayload } from './emoji.ts'
|
import { EmojiPayload } from './emoji.ts'
|
||||||
import { MemberPayload } from './guild.ts'
|
import { MemberPayload } from './guild.ts'
|
||||||
import { UserPayload } from './user.ts'
|
import { UserPayload } from './user.ts'
|
||||||
|
@ -155,10 +156,10 @@ export interface MessagePayload {
|
||||||
stickers?: MessageStickerPayload[]
|
stickers?: MessageStickerPayload[]
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MessageOption {
|
export interface MessageOptions {
|
||||||
tts?: boolean
|
tts?: boolean
|
||||||
embed?: Embed
|
embed?: Embed
|
||||||
file?: Attachment
|
file?: MessageAttachment | string
|
||||||
allowedMentions?: {
|
allowedMentions?: {
|
||||||
parse?: 'everyone' | 'users' | 'roles'
|
parse?: 'everyone' | 'users' | 'roles'
|
||||||
roles?: string[]
|
roles?: string[]
|
||||||
|
|
Loading…
Reference in a new issue