[Feature] Voice messages support (#2665)

This commit is contained in:
Misha133
2023-04-15 02:04:41 +03:00
committed by GitHub
parent fe9657a0ee
commit f171684af1
11 changed files with 76 additions and 18 deletions

View File

@@ -188,6 +188,7 @@ namespace Discord
CannotConvertBetweenPremiumEmojiAndNormalEmoji = 50145,
UploadedFileNotFound = 50146,
FeatureInProcessOfRollingOut = 50155,
CannotSendVoiceMessageInThisChannel = 50173,
MissingPermissionToSendThisSticker = 50600,
#endregion

View File

@@ -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; }
}
}

View File

@@ -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,
}
}

View File

@@ -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,
}
}

View File

@@ -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);

View File

@@ -262,5 +262,10 @@ namespace Discord
/// Allows for using the soundboard.
/// </summary>
UseSoundboard = 1L << 42,
/// <summary>
/// Allows sending voice messages.
/// </summary>
SendVoiceMessages = 1L << 46,
}
}

View File

@@ -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

View File

@@ -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; }
}
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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));
}
}
}