From 3386bab2c0f6bd111b3950bc9207193a92db7302 Mon Sep 17 00:00:00 2001 From: Jaw0r3k Date: Sun, 23 Apr 2023 21:03:29 +0200 Subject: [PATCH] feat: voice messages (#9444) * feat: voice messages * fix: delete unnesseary error --- src/structures/MessageAttachment.js | 22 ++++++++++++++++++++++ src/util/Constants.js | 5 +++++ src/util/MessageFlags.js | 1 + src/util/Permissions.js | 1 + typings/index.d.ts | 13 +++++++++++-- typings/rawDataTypes.d.ts | 16 ++++++++++++++-- 6 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/structures/MessageAttachment.js b/src/structures/MessageAttachment.js index 3426a17ae..4be74c8f4 100644 --- a/src/structures/MessageAttachment.js +++ b/src/structures/MessageAttachment.js @@ -147,6 +147,28 @@ class MessageAttachment { * @type {boolean} */ this.ephemeral = data.ephemeral ?? false; + + if ('duration_secs' in data) { + /** + * The duration of this attachment in seconds + * This will only be available if the attachment is an audio file. + * @type {?number} + */ + this.duration = data.duration_secs; + } else { + this.duration ??= null; + } + + if ('waveform' in data) { + /** + * The base64 encoded byte array representing a sampled waveform + * This will only be available if the attachment is an audio file. + * @type {?string} + */ + this.waveform = data.waveform; + } else { + this.waveform ??= null; + } } /** diff --git a/src/util/Constants.js b/src/util/Constants.js index 8d7d04dd8..5a8623166 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -1141,6 +1141,11 @@ exports.APIErrors = { INVALID_JSON: 50109, CANNOT_MIX_SUBSCRIPTION_AND_NON_SUBSCRIPTION_ROLES_FOR_EMOJI: 50144, CANNOT_CONVERT_PREMIUM_EMOJI_TO_NORMAL_EMOJI: 50145, + VOICE_MESSAGES_DO_NOT_SUPPORT_ADDITIONAL_CONTENT: 50159, + VOICE_MESSAGES_MUST_HAVE_A_SINGLE_AUDIO_ATTACHMENT: 50160, + VOICE_MESSAGES_MUST_HAVE_SUPPORTING_METADATA: 50161, + VOICE_MESSAGES_CANNOT_BE_EDITED: 50162, + YOU_CANNOT_SEND_VOICE_MESSAGES_IN_THIS_CHANNEL: 50173, TWO_FACTOR_REQUIRED: 60003, NO_USERS_WITH_DISCORDTAG_EXIST: 80004, REACTION_BLOCKED: 90001, diff --git a/src/util/MessageFlags.js b/src/util/MessageFlags.js index 2aef376b6..1759b368d 100644 --- a/src/util/MessageFlags.js +++ b/src/util/MessageFlags.js @@ -45,6 +45,7 @@ MessageFlags.FLAGS = { EPHEMERAL: 1 << 6, LOADING: 1 << 7, SUPPRESS_NOTIFICATIONS: 1 << 12, + IS_VOICE_MESSAGE: 1 << 13, }; module.exports = MessageFlags; diff --git a/src/util/Permissions.js b/src/util/Permissions.js index 32f68314d..4ec12b6ef 100644 --- a/src/util/Permissions.js +++ b/src/util/Permissions.js @@ -160,6 +160,7 @@ Permissions.FLAGS = { MODERATE_MEMBERS: 1n << 40n, VIEW_CREATOR_MONETIZATION_ANALYTICS: 1n << 41n, USE_SOUNDBOARD: 1n << 42n, + SEND_VOICE_MESSAGES: 1n << 46n, }; /** diff --git a/typings/index.d.ts b/typings/index.d.ts index cc7ca061e..9488d7544 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1705,6 +1705,7 @@ export class MessageAttachment { public attachment: BufferResolvable | Stream; public contentType: string | null; public description: string | null; + public duration: number | null; public ephemeral: boolean; public height: number | null; public id: Snowflake; @@ -1713,6 +1714,7 @@ export class MessageAttachment { public size: number; public readonly spoiler: boolean; public url: string; + public waveform: string | null; public width: number | null; public setDescription(description: string): this; public setFile(attachment: BufferResolvable | Stream, name?: string): this; @@ -3933,6 +3935,11 @@ export interface APIErrors { INSUFFICIENT_BOOSTS: 50101; INVALID_JSON: 50109; CANNOT_MIX_SUBSCRIPTION_AND_NON_SUBSCRIPTION_ROLES_FOR_EMOJI: 50144; + VOICE_MESSAGES_DO_NOT_SUPPORT_ADDITIONAL_CONTENT: 50159; + VOICE_MESSAGES_MUST_HAVE_A_SINGLE_AUDIO_ATTACHMENT: 50160; + VOICE_MESSAGES_MUST_HAVE_SUPPORTING_METADATA: 50161; + VOICE_MESSAGES_CANNOT_BE_EDITED: 50162; + YOU_CANNOT_SEND_VOICE_MESSAGES_IN_THIS_CHANNEL: 50173; CANNOT_CONVERT_PREMIUM_EMOJI_TO_NORMAL_EMOJI: 50145; TWO_FACTOR_REQUIRED: 60003; NO_USERS_WITH_DISCORDTAG_EXIST: 80004; @@ -5864,7 +5871,8 @@ export type MessageFlagsString = | 'HAS_THREAD' | 'EPHEMERAL' | 'LOADING' - | 'SUPPRESS_NOTIFICATIONS'; + | 'SUPPRESS_NOTIFICATIONS' + | 'IS_VOICE_MESSAGE'; export interface MessageInteraction { id: Snowflake; @@ -6056,7 +6064,8 @@ export type PermissionString = | 'MODERATE_MEMBERS' | 'MANAGE_EVENTS' | 'VIEW_CREATOR_MONETIZATION_ANALYTICS' - | 'USE_SOUNDBOARD'; + | 'USE_SOUNDBOARD' + | 'SEND_VOICE_MESSAGES'; export type RecursiveArray = ReadonlyArray>; diff --git a/typings/rawDataTypes.d.ts b/typings/rawDataTypes.d.ts index f48c30dc5..72268b762 100644 --- a/typings/rawDataTypes.d.ts +++ b/typings/rawDataTypes.d.ts @@ -5,7 +5,6 @@ import { APIApplication, APIApplicationCommand, APIApplicationCommandInteraction, - APIAttachment, APIAuditLog, APIAuditLogEntry, APIBan, @@ -169,7 +168,20 @@ export type RawInviteStageInstance = APIInviteStageInstance; export type RawMessageData = APIMessage; export type RawPartialMessageData = GatewayMessageUpdateDispatchData; -export type RawMessageAttachmentData = APIAttachment; +export interface RawMessageAttachmentData { + id: Snowflake; + filename: string; + description?: string; + content_type?: string; + size: number; + url: string; + proxy_url: string; + height?: number | null; + width?: number | null; + ephemeral?: boolean; + duration_secs?: number; + waveform?: string; +} export type RawMessagePayloadData = | RESTPostAPIChannelMessageJSONBody