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