[Feature] Voice messages support (#2665)
This commit is contained in:
@@ -188,6 +188,7 @@ namespace Discord
|
||||
CannotConvertBetweenPremiumEmojiAndNormalEmoji = 50145,
|
||||
UploadedFileNotFound = 50146,
|
||||
FeatureInProcessOfRollingOut = 50155,
|
||||
CannotSendVoiceMessageInThisChannel = 50173,
|
||||
MissingPermissionToSendThisSticker = 50600,
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -70,5 +70,15 @@ namespace Discord
|
||||
/// Gets the media's <see href="https://en.wikipedia.org/wiki/Media_type">MIME type</see> if present; otherwise <see langword="null"/>.
|
||||
/// </summary>
|
||||
string ContentType { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the duration of the audio file. <see langword="null"/> if the attachment is not a voice message.
|
||||
/// </summary>
|
||||
double? Duration { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the base64 encoded bytearray representing a sampled waveform. <see langword="null"/> if the attachment is not a voice message.
|
||||
/// </summary>
|
||||
public string Waveform { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,6 +51,11 @@ namespace Discord
|
||||
/// <summary>
|
||||
/// Flag give to messages that will not trigger push and desktop notifications.
|
||||
/// </summary>
|
||||
SuppressNotification = 1 << 12
|
||||
SuppressNotification = 1 << 12,
|
||||
|
||||
/// <summary>
|
||||
/// This message is a voice message.
|
||||
/// </summary>
|
||||
VoiceMessage = 1 << 13,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -177,5 +177,10 @@ namespace Discord
|
||||
/// Allows members to edit and cancel events in this channel.
|
||||
/// </summary>
|
||||
CreateEvents = 1L << 44,
|
||||
|
||||
/// <summary>
|
||||
/// Allows sending voice messages.
|
||||
/// </summary>
|
||||
SendVoiceMessages = 1L << 46,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,22 +18,22 @@ namespace Discord
|
||||
/// <summary>
|
||||
/// Gets a <see cref="ChannelPermissions"/> that grants all permissions for text channels.
|
||||
/// </summary>
|
||||
public static readonly ChannelPermissions Text = new(0b01_001111_110010_110011_111101_111111_111101_010001);
|
||||
public static readonly ChannelPermissions Text = new(0b10001_001111_110010_110011_111101_111111_111101_010001);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="ChannelPermissions"/> that grants all permissions for voice channels.
|
||||
/// </summary>
|
||||
public static readonly ChannelPermissions Voice = new(0b01_001010_001010_110011_111101_111111_111101_010001); // (0b1_00000_0000100_1111110_0000000011100_010001 (<- voice only perms) |= Text)
|
||||
public static readonly ChannelPermissions Voice = new(0b10001_001010_001010_110011_111101_111111_111101_010001);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="ChannelPermissions"/> that grants all permissions for stage channels.
|
||||
/// </summary>
|
||||
public static readonly ChannelPermissions Stage = new(0b0010_001110_010001_010101_111111_111001_010001);
|
||||
public static readonly ChannelPermissions Stage = new(0b10000_000010_001110_010001_010101_111111_111001_010001);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="ChannelPermissions"/> that grants all permissions for category channels.
|
||||
/// </summary>
|
||||
public static readonly ChannelPermissions Category = new(0b01100_1111110_1111111110001_010001);
|
||||
public static readonly ChannelPermissions Category = new(0b011001_001111_111110_110011_111101_111111_111101_010001);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="ChannelPermissions"/> that grants all permissions for direct message channels.
|
||||
@@ -140,6 +140,8 @@ namespace Discord
|
||||
public bool UseSoundboard => Permissions.GetValue(RawValue, ChannelPermission.UseSoundboard);
|
||||
/// <summary> If <see langword="true"/>, a user can edit and cancel events in this channel.</summary>
|
||||
public bool CreateEvents => Permissions.GetValue(RawValue, ChannelPermission.CreateEvents);
|
||||
/// <summary> If <see langword="true"/>, a user can send voice messages in this channel.</summary>
|
||||
public bool SendVoiceMessages => Permissions.GetValue(RawValue, ChannelPermission.SendVoiceMessages);
|
||||
|
||||
/// <summary> Creates a new <see cref="ChannelPermissions"/> with the provided packed value.</summary>
|
||||
public ChannelPermissions(ulong rawValue) { RawValue = rawValue; }
|
||||
@@ -176,7 +178,8 @@ namespace Discord
|
||||
bool? sendMessagesInThreads = null,
|
||||
bool? startEmbeddedActivities = null,
|
||||
bool? useSoundboard = null,
|
||||
bool? createEvents = null)
|
||||
bool? createEvents = null,
|
||||
bool? sendVoiceMessages = null)
|
||||
{
|
||||
ulong value = initialValue;
|
||||
|
||||
@@ -212,6 +215,7 @@ namespace Discord
|
||||
Permissions.SetValue(ref value, startEmbeddedActivities, ChannelPermission.StartEmbeddedActivities);
|
||||
Permissions.SetValue(ref value, useSoundboard, ChannelPermission.UseSoundboard);
|
||||
Permissions.SetValue(ref value, createEvents, ChannelPermission.CreateEvents);
|
||||
Permissions.SetValue(ref value, sendVoiceMessages, ChannelPermission.SendVoiceMessages);
|
||||
|
||||
RawValue = value;
|
||||
}
|
||||
@@ -249,12 +253,13 @@ namespace Discord
|
||||
bool sendMessagesInThreads = false,
|
||||
bool startEmbeddedActivities = false,
|
||||
bool useSoundboard = false,
|
||||
bool createEvents = false)
|
||||
bool createEvents = false,
|
||||
bool sendVoiceMessages = false)
|
||||
: this(0, createInstantInvite, manageChannel, addReactions, viewChannel, sendMessages, sendTTSMessages, manageMessages,
|
||||
embedLinks, attachFiles, readMessageHistory, mentionEveryone, useExternalEmojis, connect,
|
||||
speak, muteMembers, deafenMembers, moveMembers, useVoiceActivation, prioritySpeaker, stream, manageRoles, manageWebhooks,
|
||||
useApplicationCommands, requestToSpeak, manageThreads, createPublicThreads, createPrivateThreads, useExternalStickers, sendMessagesInThreads,
|
||||
startEmbeddedActivities, useSoundboard, createEvents)
|
||||
startEmbeddedActivities, useSoundboard, createEvents, sendVoiceMessages)
|
||||
{ }
|
||||
|
||||
/// <summary> Creates a new <see cref="ChannelPermissions"/> from this one, changing the provided non-null permissions.</summary>
|
||||
@@ -290,7 +295,8 @@ namespace Discord
|
||||
bool? sendMessagesInThreads = null,
|
||||
bool? startEmbeddedActivities = null,
|
||||
bool? useSoundboard = null,
|
||||
bool? createEvents = null)
|
||||
bool? createEvents = null,
|
||||
bool? sendVoiceMessages = null)
|
||||
=> new ChannelPermissions(RawValue,
|
||||
createInstantInvite,
|
||||
manageChannel,
|
||||
@@ -323,7 +329,8 @@ namespace Discord
|
||||
sendMessagesInThreads,
|
||||
startEmbeddedActivities,
|
||||
useSoundboard,
|
||||
createEvents);
|
||||
createEvents,
|
||||
sendVoiceMessages);
|
||||
|
||||
public bool Has(ChannelPermission permission) => Permissions.GetValue(RawValue, permission);
|
||||
|
||||
|
||||
@@ -262,5 +262,10 @@ namespace Discord
|
||||
/// Allows for using the soundboard.
|
||||
/// </summary>
|
||||
UseSoundboard = 1L << 42,
|
||||
|
||||
/// <summary>
|
||||
/// Allows sending voice messages.
|
||||
/// </summary>
|
||||
SendVoiceMessages = 1L << 46,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,6 +108,8 @@ namespace Discord
|
||||
public bool UseSoundboard => Permissions.GetValue(RawValue, GuildPermission.UseSoundboard);
|
||||
/// <summary> If <see langword="true"/>, a user can view monetization analytics in this guild.</summary>
|
||||
public bool ViewMonetizationAnalytics => Permissions.GetValue(RawValue, GuildPermission.ViewMonetizationAnalytics);
|
||||
/// <summary> If <see langword="true"/>, a user can send voice messages in this channel.</summary>
|
||||
public bool SendVoiceMessages => Permissions.GetValue(RawValue, GuildPermission.SendVoiceMessages);
|
||||
|
||||
/// <summary> Creates a new <see cref="GuildPermissions"/> with the provided packed value. </summary>
|
||||
public GuildPermissions(ulong rawValue) { RawValue = rawValue; }
|
||||
@@ -158,7 +160,8 @@ namespace Discord
|
||||
bool? startEmbeddedActivities = null,
|
||||
bool? moderateMembers = null,
|
||||
bool? useSoundboard = null,
|
||||
bool? viewMonetizationAnalytics = null)
|
||||
bool? viewMonetizationAnalytics = null,
|
||||
bool? sendVoiceMessages = null)
|
||||
{
|
||||
ulong value = initialValue;
|
||||
|
||||
@@ -205,6 +208,7 @@ namespace Discord
|
||||
Permissions.SetValue(ref value, moderateMembers, GuildPermission.ModerateMembers);
|
||||
Permissions.SetValue(ref value, useSoundboard, GuildPermission.UseSoundboard);
|
||||
Permissions.SetValue(ref value, viewMonetizationAnalytics, GuildPermission.ViewMonetizationAnalytics);
|
||||
Permissions.SetValue(ref value, sendVoiceMessages, GuildPermission.SendVoiceMessages);
|
||||
|
||||
RawValue = value;
|
||||
}
|
||||
@@ -253,7 +257,8 @@ namespace Discord
|
||||
bool startEmbeddedActivities = false,
|
||||
bool moderateMembers = false,
|
||||
bool useSoundboard = false,
|
||||
bool viewMonetizationAnalytics = false)
|
||||
bool viewMonetizationAnalytics = false,
|
||||
bool sendVoiceMessages = false)
|
||||
: this(0,
|
||||
createInstantInvite: createInstantInvite,
|
||||
manageRoles: manageRoles,
|
||||
@@ -297,7 +302,8 @@ namespace Discord
|
||||
startEmbeddedActivities: startEmbeddedActivities,
|
||||
moderateMembers: moderateMembers,
|
||||
useSoundboard: useSoundboard,
|
||||
viewMonetizationAnalytics: viewMonetizationAnalytics)
|
||||
viewMonetizationAnalytics: viewMonetizationAnalytics,
|
||||
sendVoiceMessages: sendVoiceMessages)
|
||||
{ }
|
||||
|
||||
/// <summary> Creates a new <see cref="GuildPermissions"/> from this one, changing the provided non-null permissions. </summary>
|
||||
@@ -344,13 +350,14 @@ namespace Discord
|
||||
bool? startEmbeddedActivities = null,
|
||||
bool? moderateMembers = null,
|
||||
bool? useSoundboard = null,
|
||||
bool? viewMonetizationAnalytics = null)
|
||||
bool? viewMonetizationAnalytics = null,
|
||||
bool? sendVoiceMessages = null)
|
||||
=> new GuildPermissions(RawValue, createInstantInvite, kickMembers, banMembers, administrator, manageChannels, manageGuild, addReactions,
|
||||
viewAuditLog, viewGuildInsights, viewChannel, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles,
|
||||
readMessageHistory, mentionEveryone, useExternalEmojis, connect, speak, muteMembers, deafenMembers, moveMembers,
|
||||
useVoiceActivation, prioritySpeaker, stream, changeNickname, manageNicknames, manageRoles, manageWebhooks, manageEmojisAndStickers,
|
||||
useApplicationCommands, requestToSpeak, manageEvents, manageThreads, createPublicThreads, createPrivateThreads, useExternalStickers, sendMessagesInThreads,
|
||||
startEmbeddedActivities, moderateMembers, useSoundboard, viewMonetizationAnalytics);
|
||||
startEmbeddedActivities, moderateMembers, useSoundboard, viewMonetizationAnalytics, sendVoiceMessages);
|
||||
|
||||
/// <summary>
|
||||
/// Returns a value that indicates if a specific <see cref="GuildPermission"/> is enabled
|
||||
|
||||
@@ -24,5 +24,9 @@ namespace Discord.API
|
||||
public Optional<int> Width { get; set; }
|
||||
[JsonProperty("ephemeral")]
|
||||
public Optional<bool> Ephemeral { get; set; }
|
||||
[JsonProperty("duration_secs")]
|
||||
public Optional<double> DurationSeconds { get; set; }
|
||||
[JsonProperty("waveform")]
|
||||
public Optional<string> Waveform { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,9 +27,13 @@ namespace Discord
|
||||
public string Description { get; }
|
||||
/// <inheritdoc />
|
||||
public string ContentType { get; }
|
||||
/// <inheritdoc />
|
||||
public string Waveform { get; }
|
||||
/// <inheritdoc />
|
||||
public double? Duration { get; }
|
||||
|
||||
internal Attachment(ulong id, string filename, string url, string proxyUrl, int size, int? height, int? width,
|
||||
bool? ephemeral, string description, string contentType)
|
||||
bool? ephemeral, string description, string contentType, double? duration, string waveform)
|
||||
{
|
||||
Id = id;
|
||||
Filename = filename;
|
||||
@@ -41,6 +45,8 @@ namespace Discord
|
||||
Ephemeral = ephemeral.GetValueOrDefault(false);
|
||||
Description = description;
|
||||
ContentType = contentType;
|
||||
Duration = duration;
|
||||
Waveform = waveform;
|
||||
}
|
||||
internal static Attachment Create(Model model)
|
||||
{
|
||||
@@ -48,7 +54,9 @@ namespace Discord
|
||||
model.Height.IsSpecified ? model.Height.Value : (int?)null,
|
||||
model.Width.IsSpecified ? model.Width.Value : (int?)null,
|
||||
model.Ephemeral.ToNullable(), model.Description.GetValueOrDefault(),
|
||||
model.ContentType.GetValueOrDefault());
|
||||
model.ContentType.GetValueOrDefault(),
|
||||
model.DurationSeconds.IsSpecified ? model.DurationSeconds.Value : null,
|
||||
model.Waveform.GetValueOrDefault(null));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -92,6 +92,7 @@ namespace Discord
|
||||
AssertFlag(() => new ChannelPermissions(startEmbeddedActivities: true), ChannelPermission.StartEmbeddedActivities);
|
||||
AssertFlag(() => new ChannelPermissions(useSoundboard: true), ChannelPermission.UseSoundboard);
|
||||
AssertFlag(() => new ChannelPermissions(createEvents: true), ChannelPermission.CreateEvents);
|
||||
AssertFlag(() => new ChannelPermissions(sendVoiceMessages: true), ChannelPermission.SendVoiceMessages);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -156,6 +157,7 @@ namespace Discord
|
||||
AssertUtil(ChannelPermission.ManageWebhooks, x => x.ManageWebhooks, (p, enable) => p.Modify(manageWebhooks: enable));
|
||||
AssertUtil(ChannelPermission.PrioritySpeaker, x => x.PrioritySpeaker, (p, enable) => p.Modify(prioritySpeaker: enable));
|
||||
AssertUtil(ChannelPermission.Stream, x => x.Stream, (p, enable) => p.Modify(stream: enable));
|
||||
AssertUtil(ChannelPermission.SendVoiceMessages, x => x.SendVoiceMessages, (p, enable) => p.Modify(sendVoiceMessages: enable));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -102,6 +102,7 @@ namespace Discord
|
||||
AssertFlag(() => new GuildPermissions(moderateMembers: true), GuildPermission.ModerateMembers);
|
||||
AssertFlag(() => new GuildPermissions(viewMonetizationAnalytics: true), GuildPermission.ViewMonetizationAnalytics);
|
||||
AssertFlag(() => new GuildPermissions(useSoundboard: true), GuildPermission.UseSoundboard);
|
||||
AssertFlag(() => new GuildPermissions(sendVoiceMessages: true), GuildPermission.SendVoiceMessages);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -180,6 +181,9 @@ namespace Discord
|
||||
AssertUtil(GuildPermission.CreatePrivateThreads, x => x.CreatePrivateThreads, (p, enable) => p.Modify(createPrivateThreads: enable));
|
||||
AssertUtil(GuildPermission.UseExternalStickers, x => x.UseExternalStickers, (p, enable) => p.Modify(useExternalStickers: enable));
|
||||
AssertUtil(GuildPermission.ModerateMembers, x => x.ModerateMembers, (p, enable) => p.Modify(moderateMembers: enable));
|
||||
AssertUtil(GuildPermission.ViewMonetizationAnalytics, x => x.ViewMonetizationAnalytics, (p, enable) => p.Modify(viewMonetizationAnalytics: enable));
|
||||
AssertUtil(GuildPermission.UseSoundboard, x => x.UseSoundboard, (p, enable) => p.Modify(useSoundboard: enable));
|
||||
AssertUtil(GuildPermission.SendVoiceMessages, x => x.SendVoiceMessages, (p, enable) => p.Modify(sendVoiceMessages: enable));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user