Skip to content

Commit

Permalink
Update Guild and Message Models (#1165)
Browse files Browse the repository at this point in the history
* Add ExplicitContentFilter property to Guild

* re-order properties to match order listed on api docs

* re-order SystemChannelId to match api docs

* Implement ApplicationId in Guild model

* Add ExplicitContentFilter property to Guild

* re-order properties to match order listed on api docs

* re-order SystemChannelId to match api docs

* Implement ApplicationId in Guild model

* Improve xmldoc for IGuild ExplicitContentFilter

* Update xmldoc

* docs "Id" -> "ID"

* rename Test.GuildPermissions to a more general Test.Guilds

* Add ExplicitContentFilter to GuildProperties

* Add a test for ExplicitContentFilterLevel modification behavior

* Implement ModifyAsync behavior

* simplify ExplicitContentFilter test

* Add RestGuild ApplicationId inheritdoc

* Implement message Activity and Application model update

* RestMessage Application and Activity implementation

* add ToString to MessageApplication

* Add IconUrl property to MessageApplication

* clean up whitespace

* another excessive whitespace removal
  • Loading branch information
Chris-Johnston authored and foxbot committed Oct 19, 2018
1 parent 10f67a8 commit d30d122
Show file tree
Hide file tree
Showing 18 changed files with 302 additions and 8 deletions.
13 changes: 13 additions & 0 deletions src/Discord.Net.Core/Entities/Guilds/ExplicitContentFilterLevel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Discord
{
public enum ExplicitContentFilterLevel
{
/// <summary> No messages will be scanned. </summary>
Disabled = 0,
/// <summary> Scans messages from all guild members that do not have a role. </summary>
/// <remarks> Recommented option for servers that use roles for trusted membership. </remarks>
MembersWithoutRoles = 1,
/// <summary> Scan messages sent by all guild members. </summary>
AllMembers = 2
}
}
4 changes: 4 additions & 0 deletions src/Discord.Net.Core/Entities/Guilds/GuildProperties.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,5 +66,9 @@ public class GuildProperties
/// Gets or sets the ID of the owner of this guild.
/// </summary>
public Optional<ulong> OwnerId { get; set; }
/// <summary>
/// Gets or sets the explicit content filter level of this guild.
/// </summary>
public Optional<ExplicitContentFilterLevel> ExplicitContentFilter { get; set; }
}
}
14 changes: 14 additions & 0 deletions src/Discord.Net.Core/Entities/Guilds/IGuild.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,13 @@ public interface IGuild : IDeletable, ISnowflakeEntity
/// </returns>
VerificationLevel VerificationLevel { get; }
/// <summary>
/// Gets the level of content filtering applied to user's content in a Guild.
/// </summary>
/// <returns>
/// The level of explicit content filtering.
/// </returns>
ExplicitContentFilterLevel ExplicitContentFilter { get; }
/// <summary>
/// Gets the ID of this guild's icon.
/// </summary>
/// <returns>
Expand Down Expand Up @@ -141,6 +148,13 @@ public interface IGuild : IDeletable, ISnowflakeEntity
/// </returns>
ulong OwnerId { get; }
/// <summary>
/// Gets the application ID of the guild creator if it is bot-created.
/// </summary>
/// <returns>
/// A <see cref="ulong"/> representing the snowflake identifier of the application ID that created this guild, or <c>null</c> if it was not bot-created.
/// </returns>
ulong? ApplicationId { get; }
/// <summary>
/// Gets the ID of the region hosting this guild's voice channels.
/// </summary>
/// <returns>
Expand Down
20 changes: 20 additions & 0 deletions src/Discord.Net.Core/Entities/Messages/IMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,5 +100,25 @@ public interface IMessage : ISnowflakeEntity, IDeletable
/// A read-only collection of user IDs.
/// </returns>
IReadOnlyCollection<ulong> MentionedUserIds { get; }
/// <summary>
/// Returns the Activity associated with a message.
/// </summary>
/// <remarks>
/// Sent with Rich Presence-related chat embeds.
/// </remarks>
/// <returns>
/// A message's activity, if any is associated.
/// </returns>
MessageActivity Activity { get; }
/// <summary>
/// Returns the Application associated with a messsage.
/// </summary>
/// <remarks>
/// Sent with Rich-Presence-related chat embeds.
/// </remarks>
/// <returns>
/// A message's application, if any is associated.
/// </returns>
MessageApplication Application { get; }
}
}
27 changes: 27 additions & 0 deletions src/Discord.Net.Core/Entities/Messages/MessageActivity.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
[DebuggerDisplay(@"{DebuggerDisplay,nq}")]
public class MessageActivity
{
/// <summary>
/// Gets the type of activity of this message.
/// </summary>
public MessageActivityType Type { get; set; }
/// <summary>
/// Gets the party ID of this activity, if any.
/// </summary>
public string PartyId { get; set; }

private string DebuggerDisplay
=> $"{Type}{(string.IsNullOrWhiteSpace(PartyId) ? "" : $" {PartyId}")}";

public override string ToString() => DebuggerDisplay;
}
}
16 changes: 16 additions & 0 deletions src/Discord.Net.Core/Entities/Messages/MessageActivityType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
public enum MessageActivityType
{
Join = 1,
Spectate = 2,
Listen = 3,
JoinRequest = 5
}
}
43 changes: 43 additions & 0 deletions src/Discord.Net.Core/Entities/Messages/MessageApplication.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
[DebuggerDisplay(@"{DebuggerDisplay,nq}")]
public class MessageApplication
{
/// <summary>
/// Gets the snowflake ID of the application.
/// </summary>
public ulong Id { get; set; }
/// <summary>
/// Gets the ID of the embed's image asset.
/// </summary>
public string CoverImage { get; set; }
/// <summary>
/// Gets the application's description.
/// </summary>
public string Description { get; set; }
/// <summary>
/// Gets the ID of the application's icon.
/// </summary>
public string Icon { get; set; }
/// <summary>
/// Gets the Url of the application's icon.
/// </summary>
public string IconUrl
=> $"https://cdn.discordapp.com/app-icons/{Id}/{Icon}";
/// <summary>
/// Gets the name of the application.
/// </summary>
public string Name { get; set; }
private string DebuggerDisplay
=> $"{Name} ({Id}): {Description}";
public override string ToString()
=> DebuggerDisplay;
}
}
14 changes: 9 additions & 5 deletions src/Discord.Net.Rest/API/Common/Guild.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#pragma warning disable CS1591
#pragma warning disable CS1591
using Newtonsoft.Json;

namespace Discord.API
Expand All @@ -25,10 +25,12 @@ internal class Guild
public bool EmbedEnabled { get; set; }
[JsonProperty("embed_channel_id")]
public ulong? EmbedChannelId { get; set; }
[JsonProperty("system_channel_id")]
public ulong? SystemChannelId { get; set; }
[JsonProperty("verification_level")]
public VerificationLevel VerificationLevel { get; set; }
[JsonProperty("default_message_notifications")]
public DefaultMessageNotifications DefaultMessageNotifications { get; set; }
[JsonProperty("explicit_content_filter")]
public ExplicitContentFilterLevel ExplicitContentFilter { get; set; }
[JsonProperty("voice_states")]
public VoiceState[] VoiceStates { get; set; }
[JsonProperty("roles")]
Expand All @@ -39,7 +41,9 @@ internal class Guild
public string[] Features { get; set; }
[JsonProperty("mfa_level")]
public MfaLevel MfaLevel { get; set; }
[JsonProperty("default_message_notifications")]
public DefaultMessageNotifications DefaultMessageNotifications { get; set; }
[JsonProperty("application_id")]
public ulong? ApplicationId { get; set; }
[JsonProperty("system_channel_id")]
public ulong? SystemChannelId { get; set; }
}
}
6 changes: 6 additions & 0 deletions src/Discord.Net.Rest/API/Common/Message.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,11 @@ internal class Message
public Optional<bool> Pinned { get; set; }
[JsonProperty("reactions")]
public Optional<Reaction[]> Reactions { get; set; }
// sent with Rich Presence-related chat embeds
[JsonProperty("activity")]
public Optional<MessageActivity> Activity { get; set; }
// sent with Rich Presence-related chat embeds
[JsonProperty("application")]
public Optional<MessageApplication> Application { get; set; }
}
}
17 changes: 17 additions & 0 deletions src/Discord.Net.Rest/API/Common/MessageActivity.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{
public class MessageActivity
{
[JsonProperty("type")]
public Optional<MessageActivityType> Type { get; set; }
[JsonProperty("party_id")]
public Optional<string> PartyId { get; set; }
}
}
38 changes: 38 additions & 0 deletions src/Discord.Net.Rest/API/Common/MessageApplication.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{
public class MessageApplication
{
/// <summary>
/// Gets the snowflake ID of the application.
/// </summary>
[JsonProperty("id")]
public ulong Id { get; set; }
/// <summary>
/// Gets the ID of the embed's image asset.
/// </summary>
[JsonProperty("cover_image")]
public string CoverImage { get; set; }
/// <summary>
/// Gets the application's description.
/// </summary>
[JsonProperty("description")]
public string Description { get; set; }
/// <summary>
/// Gets the ID of the application's icon.
/// </summary>
[JsonProperty("icon")]
public string Icon { get; set; }
/// <summary>
/// Gets the name of the application.
/// </summary>
[JsonProperty("name")]
public string Name { get; set; }
}
}
4 changes: 3 additions & 1 deletion src/Discord.Net.Rest/API/Rest/ModifyGuildParams.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#pragma warning disable CS1591
#pragma warning disable CS1591
using Newtonsoft.Json;

namespace Discord.API.Rest
Expand Down Expand Up @@ -28,5 +28,7 @@ internal class ModifyGuildParams
public Optional<ulong?> AfkChannelId { get; set; }
[JsonProperty("owner_id")]
public Optional<ulong> OwnerId { get; set; }
[JsonProperty("explicit_content_filter")]
public Optional<ExplicitContentFilterLevel> ExplicitContentFilter { get; set; }
}
}
6 changes: 5 additions & 1 deletion src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ public static async Task<Model> ModifyAsync(IGuild guild, BaseDiscordClient clie
Icon = args.Icon.IsSpecified ? args.Icon.Value?.ToModel() : Optional.Create<ImageModel?>(),
Name = args.Name,
Splash = args.Splash.IsSpecified ? args.Splash.Value?.ToModel() : Optional.Create<ImageModel?>(),
VerificationLevel = args.VerificationLevel
VerificationLevel = args.VerificationLevel,
ExplicitContentFilter = args.ExplicitContentFilter
};

if (args.AfkChannel.IsSpecified)
Expand Down Expand Up @@ -60,6 +61,9 @@ public static async Task<Model> ModifyAsync(IGuild guild, BaseDiscordClient clie
if (!apiArgs.Icon.IsSpecified && guild.IconId != null)
apiArgs.Icon = new ImageModel(guild.IconId);

if (args.ExplicitContentFilter.IsSpecified)
apiArgs.ExplicitContentFilter = args.ExplicitContentFilter.Value;

return await client.ApiClient.ModifyGuildAsync(guild.Id, apiArgs, options).ConfigureAwait(false);
}
/// <exception cref="ArgumentNullException"><paramref name="func"/> is <c>null</c>.</exception>
Expand Down
6 changes: 6 additions & 0 deletions src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public class RestGuild : RestEntity<ulong>, IGuild, IUpdateable
public MfaLevel MfaLevel { get; private set; }
/// <inheritdoc />
public DefaultMessageNotifications DefaultMessageNotifications { get; private set; }
/// <inheritdoc />
public ExplicitContentFilterLevel ExplicitContentFilter { get; private set; }

/// <inheritdoc />
public ulong? AFKChannelId { get; private set; }
Expand All @@ -48,6 +50,8 @@ public class RestGuild : RestEntity<ulong>, IGuild, IUpdateable
/// <inheritdoc />
public string SplashId { get; private set; }
internal bool Available { get; private set; }
/// <inheritdoc />
public ulong? ApplicationId { get; private set; }

/// <inheritdoc />
public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id);
Expand Down Expand Up @@ -98,6 +102,8 @@ internal void Update(Model model)
VerificationLevel = model.VerificationLevel;
MfaLevel = model.MfaLevel;
DefaultMessageNotifications = model.DefaultMessageNotifications;
ExplicitContentFilter = model.ExplicitContentFilter;
ApplicationId = model.ApplicationId;

if (model.Emojis != null)
{
Expand Down
27 changes: 27 additions & 0 deletions src/Discord.Net.Rest/Entities/Messages/RestMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ public abstract class RestMessage : RestEntity<ulong>, IMessage, IUpdateable

/// <inheritdoc />
public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks);
/// <inheritdoc />
public MessageActivity Activity { get; private set; }
/// <inheritdoc />
public MessageApplication Application { get; private set; }

internal RestMessage(BaseDiscordClient discord, ulong id, IMessageChannel channel, IUser author, MessageSource source)
: base(discord, id)
Expand All @@ -77,6 +81,29 @@ internal virtual void Update(Model model)

if (model.Content.IsSpecified)
Content = model.Content.Value;

if (model.Application.IsSpecified)
{
// create a new Application from the API model
Application = new MessageApplication()
{
Id = model.Application.Value.Id,
CoverImage = model.Application.Value.CoverImage,
Description = model.Application.Value.Description,
Icon = model.Application.Value.Icon,
Name = model.Application.Value.Name
};
}

if (model.Activity.IsSpecified)
{
// create a new Activity from the API model
Activity = new MessageActivity()
{
Type = model.Activity.Value.Type.Value,
PartyId = model.Activity.Value.PartyId.Value
};
}
}

/// <inheritdoc />
Expand Down
6 changes: 6 additions & 0 deletions src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ public class SocketGuild : SocketEntity<ulong>, IGuild
public MfaLevel MfaLevel { get; private set; }
/// <inheritdoc />
public DefaultMessageNotifications DefaultMessageNotifications { get; private set; }
/// <inheritdoc />
public ExplicitContentFilterLevel ExplicitContentFilter { get; private set; }
/// <summary>
/// Gets the number of members.
/// </summary>
Expand All @@ -73,6 +75,8 @@ public class SocketGuild : SocketEntity<ulong>, IGuild
internal bool IsAvailable { get; private set; }
/// <summary> Indicates whether the client is connected to this guild. </summary>
public bool IsConnected { get; internal set; }
/// <inheritdoc />
public ulong? ApplicationId { get; internal set; }

internal ulong? AFKChannelId { get; private set; }
internal ulong? EmbedChannelId { get; private set; }
Expand Down Expand Up @@ -346,6 +350,8 @@ internal void Update(ClientState state, Model model)
VerificationLevel = model.VerificationLevel;
MfaLevel = model.MfaLevel;
DefaultMessageNotifications = model.DefaultMessageNotifications;
ExplicitContentFilter = model.ExplicitContentFilter;
ApplicationId = model.ApplicationId;

if (model.Emojis != null)
{
Expand Down
Loading

0 comments on commit d30d122

Please sign in to comment.