Browse Source

Merge branch 'docs/faq-n-patches' of https://github.com/Still34/Discord.Net into docs/faq-n-patches

pull/988/head
Hsu Still 7 years ago
parent
commit
2b04752d18
48 changed files with 498 additions and 157 deletions
  1. +1
    -1
      src/Discord.Net.Core/Entities/Activities/Game.cs
  2. +1
    -1
      src/Discord.Net.Core/Entities/Activities/GameAsset.cs
  3. +4
    -1
      src/Discord.Net.Core/Entities/Activities/GameParty.cs
  4. +3
    -0
      src/Discord.Net.Core/Entities/Activities/GameSecrets.cs
  5. +1
    -1
      src/Discord.Net.Core/Entities/Activities/IActivity.cs
  6. +3
    -0
      src/Discord.Net.Core/Entities/Activities/RichGame.cs
  7. +12
    -4
      src/Discord.Net.Core/Entities/Channels/Direction.cs
  8. +1
    -1
      src/Discord.Net.Core/Entities/Channels/ICategoryChannel.cs
  9. +1
    -1
      src/Discord.Net.Core/Entities/Channels/IGroupChannel.cs
  10. +2
    -2
      src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs
  11. +10
    -1
      src/Discord.Net.Core/Entities/Emotes/EmoteProperties.cs
  12. +12
    -0
      src/Discord.Net.Core/Entities/Emotes/GuildEmote.cs
  13. +19
    -1
      src/Discord.Net.Core/Entities/IApplication.cs
  14. +1
    -1
      src/Discord.Net.Core/Entities/Invites/IInviteMetadata.cs
  15. +0
    -1
      src/Discord.Net.Core/Entities/Messages/EmbedAuthor.cs
  16. +0
    -1
      src/Discord.Net.Core/Entities/Messages/EmbedFooter.cs
  17. +0
    -1
      src/Discord.Net.Core/Entities/Messages/EmbedImage.cs
  18. +0
    -1
      src/Discord.Net.Core/Entities/Messages/EmbedProvider.cs
  19. +0
    -1
      src/Discord.Net.Core/Entities/Messages/EmbedThumbnail.cs
  20. +30
    -10
      src/Discord.Net.Core/Entities/Messages/EmbedType.cs
  21. +16
    -6
      src/Discord.Net.Core/Entities/Messages/EmbedVideo.cs
  22. +24
    -8
      src/Discord.Net.Core/Entities/Messages/IAttachment.cs
  23. +42
    -14
      src/Discord.Net.Core/Entities/Messages/IEmbed.cs
  24. +48
    -16
      src/Discord.Net.Core/Entities/Messages/IMessage.cs
  25. +6
    -2
      src/Discord.Net.Core/Entities/Messages/IReaction.cs
  26. +3
    -1
      src/Discord.Net.Core/Entities/Messages/ISystemMessage.cs
  27. +30
    -10
      src/Discord.Net.Core/Entities/Messages/IUserMessage.cs
  28. +17
    -17
      src/Discord.Net.Core/Entities/Messages/MessageProperties.cs
  29. +15
    -5
      src/Discord.Net.Core/Entities/Messages/MessageSource.cs
  30. +24
    -8
      src/Discord.Net.Core/Entities/Messages/MessageType.cs
  31. +9
    -3
      src/Discord.Net.Core/Entities/Messages/ReactionMetadata.cs
  32. +5
    -5
      src/Discord.Net.Core/Entities/Users/GuildUserProperties.cs
  33. +2
    -2
      src/Discord.Net.Core/Entities/Users/SelfUserProperties.cs
  34. +1
    -1
      src/Discord.Net.Core/Format.cs
  35. +3
    -0
      src/Discord.Net.Core/RequestOptions.cs
  36. +9
    -0
      src/Discord.Net.Core/TokenType.cs
  37. +27
    -8
      src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs
  38. +7
    -1
      src/Discord.Net.Rest/Entities/Channels/IRestPrivateChannel.cs
  39. +4
    -3
      src/Discord.Net.Rest/Entities/Channels/RestCategoryChannel.cs
  40. +16
    -3
      src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs
  41. +13
    -2
      src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs
  42. +14
    -2
      src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs
  43. +13
    -5
      src/Discord.Net.Rest/Entities/Invites/RestInvite.cs
  44. +11
    -1
      src/Discord.Net.Rest/Entities/Invites/RestInviteMetadata.cs
  45. +13
    -1
      src/Discord.Net.Rest/Entities/Messages/RestMessage.cs
  46. +11
    -1
      src/Discord.Net.Rest/Entities/Messages/RestReaction.cs
  47. +11
    -2
      src/Discord.Net.Rest/Entities/RestApplication.cs
  48. +3
    -0
      src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs

+ 1
- 1
src/Discord.Net.Core/Entities/Activities/Game.cs View File

@@ -3,7 +3,7 @@ using System.Diagnostics;
namespace Discord namespace Discord
{ {
/// <summary> /// <summary>
/// A user's game activity.
/// A user's game status.
/// </summary> /// </summary>
[DebuggerDisplay(@"{DebuggerDisplay,nq}")] [DebuggerDisplay(@"{DebuggerDisplay,nq}")]
public class Game : IActivity public class Game : IActivity


+ 1
- 1
src/Discord.Net.Core/Entities/Activities/GameAsset.cs View File

@@ -1,7 +1,7 @@
namespace Discord namespace Discord
{ {
/// <summary> /// <summary>
/// An asset for a <see cref="RichGame" /> object.
/// An asset for a <see cref="RichGame" /> object containing the text and image.
/// </summary> /// </summary>
public class GameAsset public class GameAsset
{ {


+ 4
- 1
src/Discord.Net.Core/Entities/Activities/GameParty.cs View File

@@ -1,11 +1,14 @@
namespace Discord namespace Discord
{ {
/// <summary>
/// Party information for a <see cref="RichGame" /> object.
/// </summary>
public class GameParty public class GameParty
{ {
internal GameParty() { } internal GameParty() { }


/// <summary> /// <summary>
/// Gets the id of the party.
/// Gets the ID of the party.
/// </summary> /// </summary>
public string Id { get; internal set; } public string Id { get; internal set; }
public long Members { get; internal set; } public long Members { get; internal set; }


+ 3
- 0
src/Discord.Net.Core/Entities/Activities/GameSecrets.cs View File

@@ -1,5 +1,8 @@
namespace Discord namespace Discord
{ {
/// <summary>
/// Party secret for a <see cref="RichGame" /> object.
/// </summary>
public class GameSecrets public class GameSecrets
{ {
/// <summary> /// <summary>


+ 1
- 1
src/Discord.Net.Core/Entities/Activities/IActivity.cs View File

@@ -1,7 +1,7 @@
namespace Discord namespace Discord
{ {
/// <summary> /// <summary>
/// A Discord activity, typically a game.
/// A user's activity status, typically a <see cref="Game"/>.
/// </summary> /// </summary>
public interface IActivity public interface IActivity
{ {


+ 3
- 0
src/Discord.Net.Core/Entities/Activities/RichGame.cs View File

@@ -2,6 +2,9 @@ using System.Diagnostics;


namespace Discord namespace Discord
{ {
/// <summary>
/// A user's Rich Presence status.
/// </summary>
[DebuggerDisplay(@"{DebuggerDisplay,nq}")] [DebuggerDisplay(@"{DebuggerDisplay,nq}")]
public class RichGame : Game public class RichGame : Game
{ {


+ 12
- 4
src/Discord.Net.Core/Entities/Channels/Direction.cs View File

@@ -1,13 +1,21 @@
namespace Discord namespace Discord
{ {
/// <summary> Specifies the direction of where message(s) should be gotten from. </summary>
/// <summary>
/// Specifies the direction of where message(s) should be gotten from.
/// </summary>
public enum Direction public enum Direction
{ {
/// <summary> The message(s) should be retrieved before a message. </summary>
/// <summary>
/// The message(s) should be retrieved before a message.
/// </summary>
Before, Before,
/// <summary> The message(s) should be retrieved after a message. </summary>
/// <summary>
/// The message(s) should be retrieved after a message.
/// </summary>
After, After,
/// <summary> The message(s) should be retrieved around a message. </summary>
/// <summary>
/// The message(s) should be retrieved around a message.
/// </summary>
Around Around
} }
} }

+ 1
- 1
src/Discord.Net.Core/Entities/Channels/ICategoryChannel.cs View File

@@ -1,7 +1,7 @@
namespace Discord namespace Discord
{ {
/// <summary> /// <summary>
/// Represents a generic category channel.
/// Represents a generic category channel.
/// </summary> /// </summary>
public interface ICategoryChannel : IGuildChannel public interface ICategoryChannel : IGuildChannel
{ {


+ 1
- 1
src/Discord.Net.Core/Entities/Channels/IGroupChannel.cs View File

@@ -3,7 +3,7 @@ using System.Threading.Tasks;
namespace Discord namespace Discord
{ {
/// <summary> /// <summary>
/// Represents a generic group channel.
/// Represents a private generic group channel.
/// </summary> /// </summary>
public interface IGroupChannel : IMessageChannel, IPrivateChannel, IAudioChannel public interface IGroupChannel : IMessageChannel, IPrivateChannel, IAudioChannel
{ {


+ 2
- 2
src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs View File

@@ -16,12 +16,12 @@ namespace Discord
Task<IUserMessage> SendMessageAsync(string text, bool isTTS = false, Embed embed = null, RequestOptions options = null); Task<IUserMessage> SendMessageAsync(string text, bool isTTS = false, Embed embed = null, RequestOptions options = null);
#if FILESYSTEM #if FILESYSTEM
/// <summary> /// <summary>
/// Sends a file to this <paramref name="text"/> channel, with an optional caption.
/// Sends a file to this message channel, with an optional caption.
/// </summary> /// </summary>
Task<IUserMessage> SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null); Task<IUserMessage> SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null);
#endif #endif
/// <summary> /// <summary>
/// Sends a file to this <paramref name="text"/> channel, with an optional caption.
/// Sends a file to this message channel, with an optional caption.
/// </summary> /// </summary>
Task<IUserMessage> SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null); Task<IUserMessage> SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null);




+ 10
- 1
src/Discord.Net.Core/Entities/Emotes/EmoteProperties.cs View File

@@ -1,10 +1,19 @@
using System.Collections.Generic;
using System.Collections.Generic;


namespace Discord namespace Discord
{ {
/// <summary>
/// Properties that are used to modify an <see cref="Emote" /> with the specified changes.
/// </summary>
public class EmoteProperties public class EmoteProperties
{ {
/// <summary>
/// Gets or sets the name of the <see cref="Emote" /> .
/// </summary>
public Optional<string> Name { get; set; } public Optional<string> Name { get; set; }
/// <summary>
/// Gets or sets the roles that can access this <see cref="Emote" /> .
/// </summary>
public Optional<IEnumerable<IRole>> Roles { get; set; } public Optional<IEnumerable<IRole>> Roles { get; set; }
} }
} }

+ 12
- 0
src/Discord.Net.Core/Entities/Emotes/GuildEmote.cs View File

@@ -9,8 +9,17 @@ namespace Discord
[DebuggerDisplay(@"{DebuggerDisplay,nq}")] [DebuggerDisplay(@"{DebuggerDisplay,nq}")]
public class GuildEmote : Emote public class GuildEmote : Emote
{ {
/// <summary>
/// Gets whether this emoji is managed.
/// </summary>
public bool IsManaged { get; } public bool IsManaged { get; }
/// <summary>
/// Gets whether this emoji must be wrapped in colons.
/// </summary>
public bool RequireColons { get; } public bool RequireColons { get; }
/// <summary>
/// Gets the roles this emoji is whitelisted to.
/// </summary>
public IReadOnlyList<ulong> RoleIds { get; } public IReadOnlyList<ulong> RoleIds { get; }


internal GuildEmote(ulong id, string name, bool animated, bool isManaged, bool requireColons, IReadOnlyList<ulong> roleIds) : base(id, name, animated) internal GuildEmote(ulong id, string name, bool animated, bool isManaged, bool requireColons, IReadOnlyList<ulong> roleIds) : base(id, name, animated)
@@ -21,6 +30,9 @@ namespace Discord
} }


private string DebuggerDisplay => $"{Name} ({Id})"; private string DebuggerDisplay => $"{Name} ({Id})";
/// <summary>
/// Gets the raw representation of the emoji.
/// </summary>
public override string ToString() => $"<{(Animated ? "a" : "")}:{Name}:{Id}>"; public override string ToString() => $"<{(Animated ? "a" : "")}:{Name}:{Id}>";
} }
} }

+ 19
- 1
src/Discord.Net.Core/Entities/IApplication.cs View File

@@ -1,13 +1,31 @@
namespace Discord
namespace Discord
{ {
/// <summary>
/// Represents a Discord application created via the developer portal.
/// </summary>
public interface IApplication : ISnowflakeEntity public interface IApplication : ISnowflakeEntity
{ {
/// <summary>
/// Gets the name of the application.
/// </summary>
string Name { get; } string Name { get; }
/// <summary>
/// Gets the description of the application.
/// </summary>
string Description { get; } string Description { get; }
/// <summary>
/// Gets the RPC origins of the application.
/// </summary>
string[] RPCOrigins { get; } string[] RPCOrigins { get; }
ulong Flags { get; } ulong Flags { get; }
/// <summary>
/// Gets the icon URL of the application.
/// </summary>
string IconUrl { get; } string IconUrl { get; }


/// <summary>
/// Gets the partial user object containing info on the owner of the application.
/// </summary>
IUser Owner { get; } IUser Owner { get; }
} }
} }

+ 1
- 1
src/Discord.Net.Core/Entities/Invites/IInviteMetadata.cs View File

@@ -2,7 +2,7 @@ using System;


namespace Discord namespace Discord
{ {
/// <summary> Represents additional information regarding the invite object. </summary>
/// <summary> Represents additional information regarding the generic invite object. </summary>
public interface IInviteMetadata : IInvite public interface IInviteMetadata : IInvite
{ {
/// <summary> /// <summary>


+ 0
- 1
src/Discord.Net.Core/Entities/Messages/EmbedAuthor.cs View File

@@ -1,4 +1,3 @@
using System;
using System.Diagnostics; using System.Diagnostics;


namespace Discord namespace Discord


+ 0
- 1
src/Discord.Net.Core/Entities/Messages/EmbedFooter.cs View File

@@ -1,4 +1,3 @@
using System;
using System.Diagnostics; using System.Diagnostics;


namespace Discord namespace Discord


+ 0
- 1
src/Discord.Net.Core/Entities/Messages/EmbedImage.cs View File

@@ -1,4 +1,3 @@
using System;
using System.Diagnostics; using System.Diagnostics;


namespace Discord namespace Discord


+ 0
- 1
src/Discord.Net.Core/Entities/Messages/EmbedProvider.cs View File

@@ -1,4 +1,3 @@
using System;
using System.Diagnostics; using System.Diagnostics;


namespace Discord namespace Discord


+ 0
- 1
src/Discord.Net.Core/Entities/Messages/EmbedThumbnail.cs View File

@@ -1,4 +1,3 @@
using System;
using System.Diagnostics; using System.Diagnostics;


namespace Discord namespace Discord


+ 30
- 10
src/Discord.Net.Core/Entities/Messages/EmbedType.cs View File

@@ -1,25 +1,45 @@
namespace Discord namespace Discord
{ {
/// <summary> Specifies the type of embed. </summary>
/// <summary>
/// Specifies the type of embed.
/// </summary>
public enum EmbedType public enum EmbedType
{ {
/// <summary> An unknown embed type. </summary>
/// <summary>
/// An unknown embed type.
/// </summary>
Unknown = -1, Unknown = -1,
/// <summary> A rich embed type. </summary>
/// <summary>
/// A rich embed type.
/// </summary>
Rich, Rich,
/// <summary> A link embed type. </summary>
/// <summary>
/// A link embed type.
/// </summary>
Link, Link,
/// <summary> A video embed type. </summary>
/// <summary>
/// A video embed type.
/// </summary>
Video, Video,
/// <summary> An image embed type. </summary>
/// <summary>
/// An image embed type.
/// </summary>
Image, Image,
/// <summary> A GIFV embed type. </summary>
/// <summary>
/// A GIFV embed type.
/// </summary>
Gifv, Gifv,
/// <summary> An article embed type. </summary>
/// <summary>
/// An article embed type.
/// </summary>
Article, Article,
/// <summary> A tweet embed type. </summary>
/// <summary>
/// A tweet embed type.
/// </summary>
Tweet, Tweet,
/// <summary> A HTML embed type. </summary>
/// <summary>
/// A HTML embed type.
/// </summary>
Html, Html,
} }
} }

+ 16
- 6
src/Discord.Net.Core/Entities/Messages/EmbedVideo.cs View File

@@ -1,17 +1,24 @@
using System;
using System.Diagnostics; using System.Diagnostics;


namespace Discord namespace Discord
{ {
/// <summary> A video featured in an <see cref="Embed"/>. </summary>
/// <summary>
/// A video featured in an <see cref="Embed" /> .
/// </summary>
[DebuggerDisplay("{DebuggerDisplay,nq}")] [DebuggerDisplay("{DebuggerDisplay,nq}")]
public struct EmbedVideo public struct EmbedVideo
{ {
/// <summary> Gets the URL of the video. </summary>
/// <summary>
/// Gets the URL of the video.
/// </summary>
public string Url { get; } public string Url { get; }
/// <summary> Gets the height of the video if there is any. </summary>
/// <summary>
/// Gets the height of the video, or <see langword="null"/> if none.
/// </summary>
public int? Height { get; } public int? Height { get; }
/// <summary> Gets the weight of the video if there is any. </summary>
/// <summary>
/// Gets the weight of the video, or <see langword="null"/> if none.
/// </summary>
public int? Width { get; } public int? Width { get; }


internal EmbedVideo(string url, int? height, int? width) internal EmbedVideo(string url, int? height, int? width)
@@ -22,6 +29,9 @@ namespace Discord
} }


private string DebuggerDisplay => $"{Url} ({(Width != null && Height != null ? $"{Width}x{Height}" : "0x0")})"; private string DebuggerDisplay => $"{Url} ({(Width != null && Height != null ? $"{Width}x{Height}" : "0x0")})";
public override string ToString() => Url.ToString();
/// <summary>
/// Gets the URL of the video.
/// </summary>
public override string ToString() => Url;
} }
} }

+ 24
- 8
src/Discord.Net.Core/Entities/Messages/IAttachment.cs View File

@@ -1,22 +1,38 @@
namespace Discord namespace Discord
{ {
/// <summary> Represents a Discord attachment. </summary>
/// <summary>
/// Represents a Discord attachment.
/// </summary>
public interface IAttachment public interface IAttachment
{ {
/// <summary> Gets the snowflake ID of the attachment. </summary>
/// <summary>
/// Gets the snowflake ID of the attachment.
/// </summary>
ulong Id { get; } ulong Id { get; }


/// <summary> Gets the filename of the attachment. </summary>
/// <summary>
/// Gets the filename of the attachment.
/// </summary>
string Filename { get; } string Filename { get; }
/// <summary> Gets the URL of the attachment. </summary>
/// <summary>
/// Gets the URL of the attachment.
/// </summary>
string Url { get; } string Url { get; }
/// <summary> Gets the proxied URL of the attachment. </summary>
/// <summary>
/// Gets the proxied URL of the attachment.
/// </summary>
string ProxyUrl { get; } string ProxyUrl { get; }
/// <summary> Gets the file size of the attachment. </summary>
/// <summary>
/// Gets the file size of the attachment.
/// </summary>
int Size { get; } int Size { get; }
/// <summary> Gets the height of the attachment if it is an image, or return <see langword="null"/> when it is not. </summary>
/// <summary>
/// Gets the height of the attachment if it is an image, or return <see langword="null" /> when it is not.
/// </summary>
int? Height { get; } int? Height { get; }
/// <summary> Gets the width of the attachment if it is an image, or return <see langword="null"/> when it is not. </summary>
/// <summary>
/// Gets the width of the attachment if it is an image, or return <see langword="null" /> when it is not.
/// </summary>
int? Width { get; } int? Width { get; }
} }
} }

+ 42
- 14
src/Discord.Net.Core/Entities/Messages/IEmbed.cs View File

@@ -3,34 +3,62 @@ using System.Collections.Immutable;


namespace Discord namespace Discord
{ {
/// <summary> Represents a Discord embed object. </summary>
/// <summary>
/// Represents a Discord embed object.
/// </summary>
public interface IEmbed public interface IEmbed
{ {
/// <summary> Gets the title URL of the embed. </summary>
/// <summary>
/// Gets the title URL of the embed.
/// </summary>
string Url { get; } string Url { get; }
/// <summary> Gets the title of the embed. </summary>
/// <summary>
/// Gets the title of the embed.
/// </summary>
string Title { get; } string Title { get; }
/// <summary> Gets the description of the embed. </summary>
/// <summary>
/// Gets the description of the embed.
/// </summary>
string Description { get; } string Description { get; }
/// <summary> Gets the type of the embed. </summary>
/// <summary>
/// Gets the type of the embed.
/// </summary>
EmbedType Type { get; } EmbedType Type { get; }
/// <summary> Gets the timestamp of the embed. </summary>
/// <summary>
/// Gets the timestamp of the embed, or <see langword="null" /> if none is set.
/// </summary>
DateTimeOffset? Timestamp { get; } DateTimeOffset? Timestamp { get; }
/// <summary> Gets the sidebar color of the embed. </summary>
/// <summary>
/// Gets the sidebar color of the embed, or <see langword="null" /> if none is set.
/// </summary>
Color? Color { get; } Color? Color { get; }
/// <summary> Gets the image of the embed. </summary>
/// <summary>
/// Gets the image of the embed, or <see langword="null" /> if none is set.
/// </summary>
EmbedImage? Image { get; } EmbedImage? Image { get; }
/// <summary> Gets the video of the embed. </summary>
/// <summary>
/// Gets the video of the embed, or <see langword="null" /> if none is set.
/// </summary>
EmbedVideo? Video { get; } EmbedVideo? Video { get; }
/// <summary> Gets the author field of the embed. </summary>
/// <summary>
/// Gets the author field of the embed, or <see langword="null" /> if none is set.
/// </summary>
EmbedAuthor? Author { get; } EmbedAuthor? Author { get; }
/// <summary> Gets the footer field of the embed. </summary>
/// <summary>
/// Gets the footer field of the embed, or <see langword="null" /> if none is set.
/// </summary>
EmbedFooter? Footer { get; } EmbedFooter? Footer { get; }
/// <summary> Gets the provider of the embed. </summary>
/// <summary>
/// Gets the provider of the embed, or <see langword="null" /> if none is set.
/// </summary>
EmbedProvider? Provider { get; } EmbedProvider? Provider { get; }
/// <summary> Gets the thumbnail featured in the embed. </summary>
/// <summary>
/// Gets the thumbnail featured in the embed, or <see langword="null" /> if none is set.
/// </summary>
EmbedThumbnail? Thumbnail { get; } EmbedThumbnail? Thumbnail { get; }
/// <summary> Gets the fields of the embed. </summary>
/// <summary>
/// Gets the fields of the embed.
/// </summary>
ImmutableArray<EmbedField> Fields { get; } ImmutableArray<EmbedField> Fields { get; }
} }
} }

+ 48
- 16
src/Discord.Net.Core/Entities/Messages/IMessage.cs View File

@@ -3,40 +3,72 @@ using System.Collections.Generic;


namespace Discord namespace Discord
{ {
/// <summary> Represents a Discord message object. </summary>
/// <summary>
/// Represents a Discord message object.
/// </summary>
public interface IMessage : ISnowflakeEntity, IDeletable public interface IMessage : ISnowflakeEntity, IDeletable
{ {
/// <summary> Gets the type of this system message. </summary>
/// <summary>
/// Gets the type of this system message.
/// </summary>
MessageType Type { get; } MessageType Type { get; }
/// <summary> Gets the source of this message. </summary>
/// <summary>
/// Gets the source type of this message.
/// </summary>
MessageSource Source { get; } MessageSource Source { get; }
/// <summary> Returns true if this message was sent as a text-to-speech message. </summary>
/// <summary>
/// Returns <see langword="true"/> if this message was sent as a text-to-speech message.
/// </summary>
bool IsTTS { get; } bool IsTTS { get; }
/// <summary> Returns true if this message was added to its channel's pinned messages. </summary>
/// <summary>
/// Returns <see langword="true"/> if this message was added to its channel's pinned messages.
/// </summary>
bool IsPinned { get; } bool IsPinned { get; }
/// <summary> Returns the content for this message. </summary>
/// <summary>
/// Returns the content for this message.
/// </summary>
string Content { get; } string Content { get; }
/// <summary> Gets the time this message was sent. </summary>
/// <summary>
/// Gets the time this message was sent.
/// </summary>
DateTimeOffset Timestamp { get; } DateTimeOffset Timestamp { get; }
/// <summary> Gets the time of this message's last edit, if any. </summary>
/// <summary>
/// Gets the time of this message's last edit, or <see langword="null" /> if none is set.
/// </summary>
DateTimeOffset? EditedTimestamp { get; } DateTimeOffset? EditedTimestamp { get; }
/// <summary> Gets the channel this message was sent to. </summary>
/// <summary>
/// Gets the channel this message was sent to.
/// </summary>
IMessageChannel Channel { get; } IMessageChannel Channel { get; }
/// <summary> Gets the author of this message. </summary>
/// <summary>
/// Gets the author of this message.
/// </summary>
IUser Author { get; } IUser Author { get; }


/// <summary> Returns all attachments included in this message. </summary>
/// <summary>
/// Returns all attachments included in this message.
/// </summary>
IReadOnlyCollection<IAttachment> Attachments { get; } IReadOnlyCollection<IAttachment> Attachments { get; }
/// <summary> Returns all embeds included in this message. </summary>
/// <summary>
/// Returns all embeds included in this message.
/// </summary>
IReadOnlyCollection<IEmbed> Embeds { get; } IReadOnlyCollection<IEmbed> Embeds { get; }
/// <summary> Returns all tags included in this message's content. </summary>
/// <summary>
/// Returns all tags included in this message's content.
/// </summary>
IReadOnlyCollection<ITag> Tags { get; } IReadOnlyCollection<ITag> Tags { get; }
/// <summary> Returns the ids of channels mentioned in this message. </summary>
/// <summary>
/// Returns the IDs of channels mentioned in this message.
/// </summary>
IReadOnlyCollection<ulong> MentionedChannelIds { get; } IReadOnlyCollection<ulong> MentionedChannelIds { get; }
/// <summary> Returns the ids of roles mentioned in this message. </summary>
/// <summary>
/// Returns the IDs of roles mentioned in this message.
/// </summary>
IReadOnlyCollection<ulong> MentionedRoleIds { get; } IReadOnlyCollection<ulong> MentionedRoleIds { get; }
/// <summary> Returns the ids of users mentioned in this message. </summary>
/// <summary>
/// Returns the IDs of users mentioned in this message.
/// </summary>
IReadOnlyCollection<ulong> MentionedUserIds { get; } IReadOnlyCollection<ulong> MentionedUserIds { get; }
} }
} }

+ 6
- 2
src/Discord.Net.Core/Entities/Messages/IReaction.cs View File

@@ -1,9 +1,13 @@
namespace Discord namespace Discord
{ {
/// <summary> Represents a Discord reaction object. </summary>
/// <summary>
/// Represents a generic reaction object.
/// </summary>
public interface IReaction public interface IReaction
{ {
/// <summary> The <see cref="IEmote"/> used in the reaction. </summary>
/// <summary>
/// The <see cref="IEmote" /> used in the reaction.
/// </summary>
IEmote Emote { get; } IEmote Emote { get; }
} }
} }

+ 3
- 1
src/Discord.Net.Core/Entities/Messages/ISystemMessage.cs View File

@@ -1,6 +1,8 @@
namespace Discord namespace Discord
{ {
/// <summary> Represents a message sent by the system. </summary>
/// <summary>
/// Represents a message sent by the system.
/// </summary>
public interface ISystemMessage : IMessage public interface ISystemMessage : IMessage
{ {
} }


+ 30
- 10
src/Discord.Net.Core/Entities/Messages/IUserMessage.cs View File

@@ -4,29 +4,49 @@ using System.Threading.Tasks;


namespace Discord namespace Discord
{ {
/// <summary> Represents a Discord message object. </summary>
/// <summary>
/// Represents a Discord message object.
/// </summary>
public interface IUserMessage : IMessage public interface IUserMessage : IMessage
{ {
/// <summary> Modifies this message. </summary>
/// <summary>
/// Modifies this message.
/// </summary>
Task ModifyAsync(Action<MessageProperties> func, RequestOptions options = null); Task ModifyAsync(Action<MessageProperties> func, RequestOptions options = null);
/// <summary> Adds this message to its channel's pinned messages. </summary>
/// <summary>
/// Adds this message to its channel's pinned messages.
/// </summary>
Task PinAsync(RequestOptions options = null); Task PinAsync(RequestOptions options = null);
/// <summary> Removes this message from its channel's pinned messages. </summary>
/// <summary>
/// Removes this message from its channel's pinned messages.
/// </summary>
Task UnpinAsync(RequestOptions options = null); Task UnpinAsync(RequestOptions options = null);


/// <summary> Returns all reactions included in this message. </summary>
/// <summary>
/// Returns all reactions included in this message.
/// </summary>
IReadOnlyDictionary<IEmote, ReactionMetadata> Reactions { get; } IReadOnlyDictionary<IEmote, ReactionMetadata> Reactions { get; }


/// <summary> Adds a reaction to this message. </summary>
/// <summary>
/// Adds a reaction to this message.
/// </summary>
Task AddReactionAsync(IEmote emote, RequestOptions options = null); Task AddReactionAsync(IEmote emote, RequestOptions options = null);
/// <summary> Removes a reaction from message. </summary>
/// <summary>
/// Removes a reaction from message.
/// </summary>
Task RemoveReactionAsync(IEmote emote, IUser user, RequestOptions options = null); Task RemoveReactionAsync(IEmote emote, IUser user, RequestOptions options = null);
/// <summary> Removes all reactions from this message. </summary>
/// <summary>
/// Removes all reactions from this message.
/// </summary>
Task RemoveAllReactionsAsync(RequestOptions options = null); Task RemoveAllReactionsAsync(RequestOptions options = null);
/// <summary> Gets all users that reacted to a message with a given emote. </summary>
/// <summary>
/// Gets all users that reacted to a message with a given emote.
/// </summary>
Task<IReadOnlyCollection<IUser>> GetReactionUsersAsync(IEmote emoji, int limit = 100, ulong? afterUserId = null, RequestOptions options = null); Task<IReadOnlyCollection<IUser>> GetReactionUsersAsync(IEmote emoji, int limit = 100, ulong? afterUserId = null, RequestOptions options = null);


/// <summary> Transforms this message's text into a human-readable form by resolving its tags. </summary>
/// <summary>
/// Transforms this message's text into a human-readable form by resolving its tags.
/// </summary>
string Resolve( string Resolve(
TagHandling userHandling = TagHandling.Name, TagHandling userHandling = TagHandling.Name,
TagHandling channelHandling = TagHandling.Name, TagHandling channelHandling = TagHandling.Name,


+ 17
- 17
src/Discord.Net.Core/Entities/Messages/MessageProperties.cs View File

@@ -1,36 +1,36 @@
namespace Discord namespace Discord
{ {
/// <summary> /// <summary>
/// Properties that are used to modify an <see cref="IUserMessage"/> with the specified changes.
/// Properties that are used to modify an <see cref="IUserMessage" /> with the specified changes.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// The content of a message can be cleared with String.Empty; if and only if an Embed is present.
/// The content of a message can be cleared with String.Empty; if and only if an Embed is present.
/// </remarks> /// </remarks>
/// <example> /// <example>
/// <code language="c#">
/// var message = await ReplyAsync("abc");
/// await message.ModifyAsync(x =>
/// {
/// x.Content = "";
/// x.Embed = new EmbedBuilder()
/// .WithColor(new Color(40, 40, 120))
/// .WithAuthor(a => a.Name = "foxbot")
/// .WithTitle("Embed!")
/// .WithDescription("This is an embed.");
/// });
/// </code>
/// <code lang="c#">
/// var message = await ReplyAsync("abc");
/// await message.ModifyAsync(x =&gt;
/// {
/// x.Content = "";
/// x.Embed = new EmbedBuilder()
/// .WithColor(new Color(40, 40, 120))
/// .WithAuthor(a =&gt; a.Name = "foxbot")
/// .WithTitle("Embed!")
/// .WithDescription("This is an embed.");
/// });
/// </code>
/// </example> /// </example>
public class MessageProperties public class MessageProperties
{ {
/// <summary> /// <summary>
/// The content of the message.
/// Gets or sets the content of the message.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// This must be less than 2000 characters.
/// This must be less than 2000 characters.
/// </remarks> /// </remarks>
public Optional<string> Content { get; set; } public Optional<string> Content { get; set; }
/// <summary> /// <summary>
/// The embed the message should display.
/// Gets or sets the embed the message should display.
/// </summary> /// </summary>
public Optional<Embed> Embed { get; set; } public Optional<Embed> Embed { get; set; }
} }


+ 15
- 5
src/Discord.Net.Core/Entities/Messages/MessageSource.cs View File

@@ -1,15 +1,25 @@
namespace Discord namespace Discord
{ {
/// <summary> Specifies the source of the Discord message. </summary>
/// <summary>
/// Specifies the source of the Discord message.
/// </summary>
public enum MessageSource public enum MessageSource
{ {
/// <summary> The message is sent by the system. </summary>
/// <summary>
/// The message is sent by the system.
/// </summary>
System, System,
/// <summary> The message is sent by a user. </summary>
/// <summary>
/// The message is sent by a user.
/// </summary>
User, User,
/// <summary> The message is sent by a bot. </summary>
/// <summary>
/// The message is sent by a bot.
/// </summary>
Bot, Bot,
/// <summary> The message is sent by a webhook. </summary>
/// <summary>
/// The message is sent by a webhook.
/// </summary>
Webhook Webhook
} }
} }

+ 24
- 8
src/Discord.Net.Core/Entities/Messages/MessageType.cs View File

@@ -1,21 +1,37 @@
namespace Discord namespace Discord
{ {
/// <summary> Specifies the type of message. </summary>
/// <summary>
/// Specifies the type of message.
/// </summary>
public enum MessageType public enum MessageType
{ {
/// <summary> The default message type. </summary>
/// <summary>
/// The default message type.
/// </summary>
Default = 0, Default = 0,
/// <summary> The message when a recipient is added. </summary>
/// <summary>
/// The message when a recipient is added.
/// </summary>
RecipientAdd = 1, RecipientAdd = 1,
/// <summary> The message when a recipient is removed. </summary>
/// <summary>
/// The message when a recipient is removed.
/// </summary>
RecipientRemove = 2, RecipientRemove = 2,
/// <summary> The message when a user is called. </summary>
/// <summary>
/// The message when a user is called.
/// </summary>
Call = 3, Call = 3,
/// <summary> The message when a channel name is changed. </summary>
/// <summary>
/// The message when a channel name is changed.
/// </summary>
ChannelNameChange = 4, ChannelNameChange = 4,
/// <summary> The message when a channel icon is changed. </summary>
/// <summary>
/// The message when a channel icon is changed.
/// </summary>
ChannelIconChange = 5, ChannelIconChange = 5,
/// <summary> The message when another message is pinned. </summary>
/// <summary>
/// The message when another message is pinned.
/// </summary>
ChannelPinnedMessage = 6 ChannelPinnedMessage = 6
} }
} }

+ 9
- 3
src/Discord.Net.Core/Entities/Messages/ReactionMetadata.cs View File

@@ -1,12 +1,18 @@
namespace Discord namespace Discord
{ {
/// <summary> A metadata containing reaction information. </summary>
/// <summary>
/// A metadata containing reaction information.
/// </summary>
public struct ReactionMetadata public struct ReactionMetadata
{ {
/// <summary> Gets the number of reactions. </summary>
/// <summary>
/// Gets the number of reactions.
/// </summary>
public int ReactionCount { get; internal set; } public int ReactionCount { get; internal set; }


/// <summary> Returns true if the current user has used this reaction. </summary>
/// <summary>
/// Returns <see langword="true"/> if the current user has used this reaction.
/// </summary>
public bool IsMe { get; internal set; } public bool IsMe { get; internal set; }
} }
} }

+ 5
- 5
src/Discord.Net.Core/Entities/Users/GuildUserProperties.cs View File

@@ -17,21 +17,21 @@ namespace Discord
public class GuildUserProperties public class GuildUserProperties
{ {
/// <summary> /// <summary>
/// Sets whether the user should be muted in a voice channel.
/// Gets or sets whether the user should be muted in a voice channel.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// If this value is set to <see langword="true"/>, no user will be able to hear this user speak in the guild. /// If this value is set to <see langword="true"/>, no user will be able to hear this user speak in the guild.
/// </remarks> /// </remarks>
public Optional<bool> Mute { get; set; } public Optional<bool> Mute { get; set; }
/// <summary> /// <summary>
/// Sets whether the user should be deafened in a voice channel.
/// Gets or sets whether the user should be deafened in a voice channel.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// If this value is set to <see langword="true"/>, this user will not be able to hear anyone speak in the guild. /// If this value is set to <see langword="true"/>, this user will not be able to hear anyone speak in the guild.
/// </remarks> /// </remarks>
public Optional<bool> Deaf { get; set; } public Optional<bool> Deaf { get; set; }
/// <summary> /// <summary>
/// Sets the user's nickname.
/// Gets or sets the user's nickname.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// To clear the user's nickname, this value can be set to <see langword="null" /> or /// To clear the user's nickname, this value can be set to <see langword="null" /> or
@@ -39,7 +39,7 @@ namespace Discord
/// </remarks> /// </remarks>
public Optional<string> Nickname { get; set; } public Optional<string> Nickname { get; set; }
/// <summary> /// <summary>
/// Sets the roles the user should have.
/// Gets or sets the roles the user should have.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// <para> /// <para>
@@ -53,7 +53,7 @@ namespace Discord
/// </remarks> /// </remarks>
public Optional<IEnumerable<IRole>> Roles { get; set; } public Optional<IEnumerable<IRole>> Roles { get; set; }
/// <summary> /// <summary>
/// Sets the roles the user should have.
/// Gets or sets the roles the user should have.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// <para> /// <para>


+ 2
- 2
src/Discord.Net.Core/Entities/Users/SelfUserProperties.cs View File

@@ -15,11 +15,11 @@ namespace Discord
public class SelfUserProperties public class SelfUserProperties
{ {
/// <summary> /// <summary>
/// Sets the username.
/// Gets or sets the username.
/// </summary> /// </summary>
public Optional<string> Username { get; set; } public Optional<string> Username { get; set; }
/// <summary> /// <summary>
/// Sets the avatar.
/// Gets or sets the avatar.
/// </summary> /// </summary>
public Optional<Image?> Avatar { get; set; } public Optional<Image?> Avatar { get; set; }
} }


+ 1
- 1
src/Discord.Net.Core/Format.cs View File

@@ -4,7 +4,7 @@ namespace Discord
public static class Format public static class Format
{ {
// Characters which need escaping // Characters which need escaping
private static string[] SensitiveCharacters = { "\\", "*", "_", "~", "`" };
private static readonly string[] SensitiveCharacters = { "\\", "*", "_", "~", "`" };


/// <summary> Returns a markdown-formatted string with bold formatting. </summary> /// <summary> Returns a markdown-formatted string with bold formatting. </summary>
public static string Bold(string text) => $"**{text}**"; public static string Bold(string text) => $"**{text}**";


+ 3
- 0
src/Discord.Net.Core/RequestOptions.cs View File

@@ -2,6 +2,9 @@ using System.Threading;


namespace Discord namespace Discord
{ {
/// <summary>
/// Represents options that should be used when sending a request.
/// </summary>
public class RequestOptions public class RequestOptions
{ {
/// <summary> /// <summary>


+ 9
- 0
src/Discord.Net.Core/TokenType.cs View File

@@ -7,8 +7,17 @@ namespace Discord
{ {
[Obsolete("User logins are deprecated and may result in a ToS strike against your account - please see https://github.com/RogueException/Discord.Net/issues/827", error: true)] [Obsolete("User logins are deprecated and may result in a ToS strike against your account - please see https://github.com/RogueException/Discord.Net/issues/827", error: true)]
User, User,
/// <summary>
/// An OAuth2 token type.
/// </summary>
Bearer, Bearer,
/// <summary>
/// A bot token type.
/// </summary>
Bot, Bot,
/// <summary>
/// A webhook token type.
/// </summary>
Webhook Webhook
} }
} }

+ 27
- 8
src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs View File

@@ -4,26 +4,45 @@ using System.Threading.Tasks;


namespace Discord.Rest namespace Discord.Rest
{ {
/// <summary>
/// Represents a REST channel that can send and receive messages.
/// </summary>
public interface IRestMessageChannel : IMessageChannel public interface IRestMessageChannel : IMessageChannel
{ {
/// <summary> Sends a message to this message channel. </summary>
/// <summary>
/// Sends a message to this message channel.
/// </summary>
new Task<RestUserMessage> SendMessageAsync(string text, bool isTTS = false, Embed embed = null, RequestOptions options = null); new Task<RestUserMessage> SendMessageAsync(string text, bool isTTS = false, Embed embed = null, RequestOptions options = null);
#if FILESYSTEM #if FILESYSTEM
/// <summary> Sends a file to this text channel, with an optional caption. </summary>
/// <summary>
/// Sends a file to this message channel, with an optional caption.
/// </summary>
new Task<RestUserMessage> SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null); new Task<RestUserMessage> SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null);
#endif #endif
/// <summary> Sends a file to this text channel, with an optional caption. </summary>
/// <summary>
/// Sends a file to this message channel, with an optional caption.
/// </summary>
new Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null); new Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null);


/// <summary> Gets a message from this message channel with the given id, or null if not found. </summary>
/// <summary>
/// Gets a message from this message channel with the given ID, or <see langword="null"/> if not found.
/// </summary>
Task<RestMessage> GetMessageAsync(ulong id, RequestOptions options = null); Task<RestMessage> GetMessageAsync(ulong id, RequestOptions options = null);
/// <summary> Gets the last N messages from this message channel. </summary>
/// <summary>
/// Gets the last N messages from this message channel.
/// </summary>
IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null); IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null);
/// <summary> Gets a collection of messages in this channel. </summary>
/// <summary>
/// Gets a collection of messages in this channel.
/// </summary>
IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(ulong fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null); IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(ulong fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null);
/// <summary> Gets a collection of messages in this channel. </summary>
/// <summary>
/// Gets a collection of messages in this channel.
/// </summary>
IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(IMessage fromMessage, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null); IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(IMessage fromMessage, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null);
/// <summary> Gets a collection of pinned messages in this channel. </summary>
/// <summary>
/// Gets a collection of pinned messages in this channel.
/// </summary>
new Task<IReadOnlyCollection<RestMessage>> GetPinnedMessagesAsync(RequestOptions options = null); new Task<IReadOnlyCollection<RestMessage>> GetPinnedMessagesAsync(RequestOptions options = null);
} }
} }

+ 7
- 1
src/Discord.Net.Rest/Entities/Channels/IRestPrivateChannel.cs View File

@@ -1,9 +1,15 @@
using System.Collections.Generic;
using System.Collections.Generic;


namespace Discord.Rest namespace Discord.Rest
{ {
/// <summary>
/// Represents a REST channel that is private to select recipients.
/// </summary>
public interface IRestPrivateChannel : IPrivateChannel public interface IRestPrivateChannel : IPrivateChannel
{ {
/// <summary>
/// Users that can access this channel.
/// </summary>
new IReadOnlyCollection<RestUser> Recipients { get; } new IReadOnlyCollection<RestUser> Recipients { get; }
} }
} }

+ 4
- 3
src/Discord.Net.Rest/Entities/Channels/RestCategoryChannel.cs View File

@@ -1,13 +1,14 @@
using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Model = Discord.API.Channel; using Model = Discord.API.Channel;


namespace Discord.Rest namespace Discord.Rest
{ {
/// <summary>
/// Represents a REST category channel.
/// </summary>
[DebuggerDisplay(@"{DebuggerDisplay,nq}")] [DebuggerDisplay(@"{DebuggerDisplay,nq}")]
public class RestCategoryChannel : RestGuildChannel, ICategoryChannel public class RestCategoryChannel : RestGuildChannel, ICategoryChannel
{ {


+ 16
- 3
src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs View File

@@ -9,11 +9,14 @@ using Model = Discord.API.Channel;


namespace Discord.Rest namespace Discord.Rest
{ {
/// <summary>
/// Represents a REST DM channel.
/// </summary>
[DebuggerDisplay(@"{DebuggerDisplay,nq}")] [DebuggerDisplay(@"{DebuggerDisplay,nq}")]
public class RestDMChannel : RestChannel, IDMChannel, IRestPrivateChannel, IRestMessageChannel, IUpdateable
public class RestDMChannel : RestChannel, IDMChannel, IRestPrivateChannel, IRestMessageChannel
{ {
public RestUser CurrentUser { get; private set; }
public RestUser Recipient { get; private set; }
public RestUser CurrentUser { get; }
public RestUser Recipient { get; }


public IReadOnlyCollection<RestUser> Users => ImmutableArray.Create(CurrentUser, Recipient); public IReadOnlyCollection<RestUser> Users => ImmutableArray.Create(CurrentUser, Recipient);


@@ -39,6 +42,7 @@ namespace Discord.Rest
var model = await Discord.ApiClient.GetChannelAsync(Id, options).ConfigureAwait(false); var model = await Discord.ApiClient.GetChannelAsync(Id, options).ConfigureAwait(false);
Update(model); Update(model);
} }
/// <inheritdoc />
public Task CloseAsync(RequestOptions options = null) public Task CloseAsync(RequestOptions options = null)
=> ChannelHelper.DeleteAsync(this, Discord, options); => ChannelHelper.DeleteAsync(this, Discord, options);


@@ -52,26 +56,35 @@ namespace Discord.Rest
return null; return null;
} }


/// <inheritdoc />
public Task<RestMessage> GetMessageAsync(ulong id, RequestOptions options = null) public Task<RestMessage> GetMessageAsync(ulong id, RequestOptions options = null)
=> ChannelHelper.GetMessageAsync(this, Discord, id, options); => ChannelHelper.GetMessageAsync(this, Discord, id, options);
/// <inheritdoc />
public IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null) public IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null)
=> ChannelHelper.GetMessagesAsync(this, Discord, null, Direction.Before, limit, options); => ChannelHelper.GetMessagesAsync(this, Discord, null, Direction.Before, limit, options);
/// <inheritdoc />
public IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(ulong fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null) public IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(ulong fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null)
=> ChannelHelper.GetMessagesAsync(this, Discord, fromMessageId, dir, limit, options); => ChannelHelper.GetMessagesAsync(this, Discord, fromMessageId, dir, limit, options);
/// <inheritdoc />
public IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(IMessage fromMessage, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null) public IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(IMessage fromMessage, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null)
=> ChannelHelper.GetMessagesAsync(this, Discord, fromMessage.Id, dir, limit, options); => ChannelHelper.GetMessagesAsync(this, Discord, fromMessage.Id, dir, limit, options);
/// <inheritdoc />
public Task<IReadOnlyCollection<RestMessage>> GetPinnedMessagesAsync(RequestOptions options = null) public Task<IReadOnlyCollection<RestMessage>> GetPinnedMessagesAsync(RequestOptions options = null)
=> ChannelHelper.GetPinnedMessagesAsync(this, Discord, options); => ChannelHelper.GetPinnedMessagesAsync(this, Discord, options);


/// <inheritdoc />
public Task<RestUserMessage> SendMessageAsync(string text, bool isTTS = false, Embed embed = null, RequestOptions options = null) public Task<RestUserMessage> SendMessageAsync(string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, options); => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, options);
#if FILESYSTEM #if FILESYSTEM
/// <inheritdoc />
public Task<RestUserMessage> SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null) public Task<RestUserMessage> SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, options); => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, options);
#endif #endif
/// <inheritdoc />
public Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null) public Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, options); => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, options);


/// <inheritdoc />
public Task TriggerTypingAsync(RequestOptions options = null) public Task TriggerTypingAsync(RequestOptions options = null)
=> ChannelHelper.TriggerTypingAsync(this, Discord, options); => ChannelHelper.TriggerTypingAsync(this, Discord, options);
public IDisposable EnterTypingState(RequestOptions options = null) public IDisposable EnterTypingState(RequestOptions options = null)


+ 13
- 2
src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs View File

@@ -11,11 +11,12 @@ using Model = Discord.API.Channel;
namespace Discord.Rest namespace Discord.Rest
{ {
[DebuggerDisplay(@"{DebuggerDisplay,nq}")] [DebuggerDisplay(@"{DebuggerDisplay,nq}")]
public class RestGroupChannel : RestChannel, IGroupChannel, IRestPrivateChannel, IRestMessageChannel, IRestAudioChannel, IUpdateable
public class RestGroupChannel : RestChannel, IGroupChannel, IRestPrivateChannel, IRestMessageChannel, IRestAudioChannel
{ {
private string _iconId; private string _iconId;
private ImmutableDictionary<ulong, RestGroupUser> _users; private ImmutableDictionary<ulong, RestGroupUser> _users;


/// <inheritdoc />
public string Name { get; private set; } public string Name { get; private set; }


public IReadOnlyCollection<RestGroupUser> Users => _users.ToReadOnlyCollection(); public IReadOnlyCollection<RestGroupUser> Users => _users.ToReadOnlyCollection();
@@ -49,12 +50,13 @@ namespace Discord.Rest
users[models[i].Id] = RestGroupUser.Create(Discord, models[i]); users[models[i].Id] = RestGroupUser.Create(Discord, models[i]);
_users = users.ToImmutable(); _users = users.ToImmutable();
} }
/// <inheritdoc />
public override async Task UpdateAsync(RequestOptions options = null) public override async Task UpdateAsync(RequestOptions options = null)
{ {
var model = await Discord.ApiClient.GetChannelAsync(Id, options).ConfigureAwait(false); var model = await Discord.ApiClient.GetChannelAsync(Id, options).ConfigureAwait(false);
Update(model); Update(model);
} }
/// <inheritdoc />
public Task LeaveAsync(RequestOptions options = null) public Task LeaveAsync(RequestOptions options = null)
=> ChannelHelper.DeleteAsync(this, Discord, options); => ChannelHelper.DeleteAsync(this, Discord, options);


@@ -65,26 +67,35 @@ namespace Discord.Rest
return null; return null;
} }


/// <inheritdoc />
public Task<RestMessage> GetMessageAsync(ulong id, RequestOptions options = null) public Task<RestMessage> GetMessageAsync(ulong id, RequestOptions options = null)
=> ChannelHelper.GetMessageAsync(this, Discord, id, options); => ChannelHelper.GetMessageAsync(this, Discord, id, options);
/// <inheritdoc />
public IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null) public IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null)
=> ChannelHelper.GetMessagesAsync(this, Discord, null, Direction.Before, limit, options); => ChannelHelper.GetMessagesAsync(this, Discord, null, Direction.Before, limit, options);
/// <inheritdoc />
public IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(ulong fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null) public IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(ulong fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null)
=> ChannelHelper.GetMessagesAsync(this, Discord, fromMessageId, dir, limit, options); => ChannelHelper.GetMessagesAsync(this, Discord, fromMessageId, dir, limit, options);
/// <inheritdoc />
public IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(IMessage fromMessage, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null) public IAsyncEnumerable<IReadOnlyCollection<RestMessage>> GetMessagesAsync(IMessage fromMessage, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null)
=> ChannelHelper.GetMessagesAsync(this, Discord, fromMessage.Id, dir, limit, options); => ChannelHelper.GetMessagesAsync(this, Discord, fromMessage.Id, dir, limit, options);
/// <inheritdoc />
public Task<IReadOnlyCollection<RestMessage>> GetPinnedMessagesAsync(RequestOptions options = null) public Task<IReadOnlyCollection<RestMessage>> GetPinnedMessagesAsync(RequestOptions options = null)
=> ChannelHelper.GetPinnedMessagesAsync(this, Discord, options); => ChannelHelper.GetPinnedMessagesAsync(this, Discord, options);


/// <inheritdoc />
public Task<RestUserMessage> SendMessageAsync(string text, bool isTTS = false, Embed embed = null, RequestOptions options = null) public Task<RestUserMessage> SendMessageAsync(string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, options); => ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, options);
#if FILESYSTEM #if FILESYSTEM
/// <inheritdoc />
public Task<RestUserMessage> SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null) public Task<RestUserMessage> SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, options); => ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, options);
#endif #endif
/// <inheritdoc />
public Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null) public Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, options); => ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, options);


/// <inheritdoc />
public Task TriggerTypingAsync(RequestOptions options = null) public Task TriggerTypingAsync(RequestOptions options = null)
=> ChannelHelper.TriggerTypingAsync(this, Discord, options); => ChannelHelper.TriggerTypingAsync(this, Discord, options);
public IDisposable EnterTypingState(RequestOptions options = null) public IDisposable EnterTypingState(RequestOptions options = null)


+ 14
- 2
src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
@@ -7,16 +7,24 @@ using Model = Discord.API.Channel;


namespace Discord.Rest namespace Discord.Rest
{ {
public class RestGuildChannel : RestChannel, IGuildChannel, IUpdateable
/// <summary>
/// Represents a private REST group channel.
/// </summary>
public class RestGuildChannel : RestChannel, IGuildChannel
{ {
private ImmutableArray<Overwrite> _overwrites; private ImmutableArray<Overwrite> _overwrites;


/// <inheritdoc />
public IReadOnlyCollection<Overwrite> PermissionOverwrites => _overwrites; public IReadOnlyCollection<Overwrite> PermissionOverwrites => _overwrites;


internal IGuild Guild { get; } internal IGuild Guild { get; }
/// <inheritdoc />
public string Name { get; private set; } public string Name { get; private set; }
/// <inheritdoc />
public int Position { get; private set; } public int Position { get; private set; }
/// <inheritdoc />
public ulong? CategoryId { get; private set; } public ulong? CategoryId { get; private set; }
/// <inheritdoc />
public ulong GuildId => Guild.Id; public ulong GuildId => Guild.Id;


internal RestGuildChannel(BaseDiscordClient discord, IGuild guild, ulong id) internal RestGuildChannel(BaseDiscordClient discord, IGuild guild, ulong id)
@@ -51,19 +59,23 @@ namespace Discord.Rest
_overwrites = newOverwrites.ToImmutable(); _overwrites = newOverwrites.ToImmutable();
} }


/// <inheritdoc />
public override async Task UpdateAsync(RequestOptions options = null) public override async Task UpdateAsync(RequestOptions options = null)
{ {
var model = await Discord.ApiClient.GetChannelAsync(GuildId, Id, options).ConfigureAwait(false); var model = await Discord.ApiClient.GetChannelAsync(GuildId, Id, options).ConfigureAwait(false);
Update(model); Update(model);
} }
/// <inheritdoc />
public async Task ModifyAsync(Action<GuildChannelProperties> func, RequestOptions options = null) public async Task ModifyAsync(Action<GuildChannelProperties> func, RequestOptions options = null)
{ {
var model = await ChannelHelper.ModifyAsync(this, Discord, func, options).ConfigureAwait(false); var model = await ChannelHelper.ModifyAsync(this, Discord, func, options).ConfigureAwait(false);
Update(model); Update(model);
} }
/// <inheritdoc />
public Task DeleteAsync(RequestOptions options = null) public Task DeleteAsync(RequestOptions options = null)
=> ChannelHelper.DeleteAsync(this, Discord, options); => ChannelHelper.DeleteAsync(this, Discord, options);


/// <inheritdoc />
public async Task<ICategoryChannel> GetCategoryAsync() public async Task<ICategoryChannel> GetCategoryAsync()
{ {
if (CategoryId.HasValue) if (CategoryId.HasValue)


+ 13
- 5
src/Discord.Net.Rest/Entities/Invites/RestInvite.cs View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Diagnostics; using System.Diagnostics;
using System.Threading.Tasks; using System.Threading.Tasks;
using Model = Discord.API.Invite; using Model = Discord.API.Invite;
@@ -8,14 +8,20 @@ namespace Discord.Rest
[DebuggerDisplay(@"{DebuggerDisplay,nq}")] [DebuggerDisplay(@"{DebuggerDisplay,nq}")]
public class RestInvite : RestEntity<string>, IInvite, IUpdateable public class RestInvite : RestEntity<string>, IInvite, IUpdateable
{ {
/// <inheritdoc />
public string ChannelName { get; private set; } public string ChannelName { get; private set; }
/// <inheritdoc />
public string GuildName { get; private set; } public string GuildName { get; private set; }
/// <inheritdoc />
public ulong ChannelId { get; private set; } public ulong ChannelId { get; private set; }
/// <inheritdoc />
public ulong GuildId { get; private set; } public ulong GuildId { get; private set; }
internal IChannel Channel { get; private set; }
internal IGuild Guild { get; private set; }
internal IChannel Channel { get; }
internal IGuild Guild { get; }


/// <inheritdoc />
public string Code => Id; public string Code => Id;
/// <inheritdoc />
public string Url => $"{DiscordConfig.InviteUrl}{Code}"; public string Url => $"{DiscordConfig.InviteUrl}{Code}";


internal RestInvite(BaseDiscordClient discord, IGuild guild, IChannel channel, string id) internal RestInvite(BaseDiscordClient discord, IGuild guild, IChannel channel, string id)
@@ -37,15 +43,17 @@ namespace Discord.Rest
GuildName = model.Guild.Name; GuildName = model.Guild.Name;
ChannelName = model.Channel.Name; ChannelName = model.Channel.Name;
} }

/// <inheritdoc />
public async Task UpdateAsync(RequestOptions options = null) public async Task UpdateAsync(RequestOptions options = null)
{ {
var model = await Discord.ApiClient.GetInviteAsync(Code, options).ConfigureAwait(false); var model = await Discord.ApiClient.GetInviteAsync(Code, options).ConfigureAwait(false);
Update(model); Update(model);
} }
/// <inheritdoc />
public Task DeleteAsync(RequestOptions options = null) public Task DeleteAsync(RequestOptions options = null)
=> InviteHelper.DeleteAsync(this, Discord, options); => InviteHelper.DeleteAsync(this, Discord, options);
/// <inheritdoc />
public Task AcceptAsync(RequestOptions options = null) public Task AcceptAsync(RequestOptions options = null)
=> InviteHelper.AcceptAsync(this, Discord, options); => InviteHelper.AcceptAsync(this, Discord, options);




+ 11
- 1
src/Discord.Net.Rest/Entities/Invites/RestInviteMetadata.cs View File

@@ -1,19 +1,29 @@
using System;
using System;
using Model = Discord.API.InviteMetadata; using Model = Discord.API.InviteMetadata;


namespace Discord.Rest namespace Discord.Rest
{ {
/// <summary> Represents additional information regarding the REST invite object. </summary>
public class RestInviteMetadata : RestInvite, IInviteMetadata public class RestInviteMetadata : RestInvite, IInviteMetadata
{ {
private long _createdAtTicks; private long _createdAtTicks;


/// <inheritdoc />
public bool IsRevoked { get; private set; } public bool IsRevoked { get; private set; }
/// <inheritdoc />
public bool IsTemporary { get; private set; } public bool IsTemporary { get; private set; }
/// <inheritdoc />
public int? MaxAge { get; private set; } public int? MaxAge { get; private set; }
/// <inheritdoc />
public int? MaxUses { get; private set; } public int? MaxUses { get; private set; }
/// <inheritdoc />
public int Uses { get; private set; } public int Uses { get; private set; }
/// <summary>
/// Gets the user that created this invite.
/// </summary>
public RestUser Inviter { get; private set; } public RestUser Inviter { get; private set; }


/// <inheritdoc />
public DateTimeOffset CreatedAt => DateTimeUtils.FromTicks(_createdAtTicks); public DateTimeOffset CreatedAt => DateTimeUtils.FromTicks(_createdAtTicks);


internal RestInviteMetadata(BaseDiscordClient discord, IGuild guild, IChannel channel, string id) internal RestInviteMetadata(BaseDiscordClient discord, IGuild guild, IChannel channel, string id)


+ 13
- 1
src/Discord.Net.Rest/Entities/Messages/RestMessage.cs View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
@@ -11,23 +11,33 @@ namespace Discord.Rest
{ {
private long _timestampTicks; private long _timestampTicks;


/// <inheritdoc />
public IMessageChannel Channel { get; } public IMessageChannel Channel { get; }
public IUser Author { get; } public IUser Author { get; }
/// <inheritdoc />
public MessageSource Source { get; } public MessageSource Source { get; }


/// <inheritdoc />
public string Content { get; private set; } public string Content { get; private set; }


/// <inheritdoc />
public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id);
/// <inheritdoc />
public virtual bool IsTTS => false; public virtual bool IsTTS => false;
/// <inheritdoc />
public virtual bool IsPinned => false; public virtual bool IsPinned => false;
/// <inheritdoc />
public virtual DateTimeOffset? EditedTimestamp => null; public virtual DateTimeOffset? EditedTimestamp => null;
public virtual IReadOnlyCollection<Attachment> Attachments => ImmutableArray.Create<Attachment>(); public virtual IReadOnlyCollection<Attachment> Attachments => ImmutableArray.Create<Attachment>();
public virtual IReadOnlyCollection<Embed> Embeds => ImmutableArray.Create<Embed>(); public virtual IReadOnlyCollection<Embed> Embeds => ImmutableArray.Create<Embed>();
/// <inheritdoc />
public virtual IReadOnlyCollection<ulong> MentionedChannelIds => ImmutableArray.Create<ulong>(); public virtual IReadOnlyCollection<ulong> MentionedChannelIds => ImmutableArray.Create<ulong>();
/// <inheritdoc />
public virtual IReadOnlyCollection<ulong> MentionedRoleIds => ImmutableArray.Create<ulong>(); public virtual IReadOnlyCollection<ulong> MentionedRoleIds => ImmutableArray.Create<ulong>();
public virtual IReadOnlyCollection<RestUser> MentionedUsers => ImmutableArray.Create<RestUser>(); public virtual IReadOnlyCollection<RestUser> MentionedUsers => ImmutableArray.Create<RestUser>();
public virtual IReadOnlyCollection<ITag> Tags => ImmutableArray.Create<ITag>(); public virtual IReadOnlyCollection<ITag> Tags => ImmutableArray.Create<ITag>();


/// <inheritdoc />
public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks);


internal RestMessage(BaseDiscordClient discord, ulong id, IMessageChannel channel, IUser author, MessageSource source) internal RestMessage(BaseDiscordClient discord, ulong id, IMessageChannel channel, IUser author, MessageSource source)
@@ -53,11 +63,13 @@ namespace Discord.Rest
Content = model.Content.Value; Content = model.Content.Value;
} }


/// <inheritdoc />
public async Task UpdateAsync(RequestOptions options = null) public async Task UpdateAsync(RequestOptions options = null)
{ {
var model = await Discord.ApiClient.GetChannelMessageAsync(Channel.Id, Id, options).ConfigureAwait(false); var model = await Discord.ApiClient.GetChannelMessageAsync(Channel.Id, Id, options).ConfigureAwait(false);
Update(model); Update(model);
} }
/// <inheritdoc />
public Task DeleteAsync(RequestOptions options = null) public Task DeleteAsync(RequestOptions options = null)
=> MessageHelper.DeleteAsync(this, Discord, options); => MessageHelper.DeleteAsync(this, Discord, options);




+ 11
- 1
src/Discord.Net.Rest/Entities/Messages/RestReaction.cs View File

@@ -1,11 +1,21 @@
using Model = Discord.API.Reaction;
using Model = Discord.API.Reaction;


namespace Discord.Rest namespace Discord.Rest
{ {
/// <summary>
/// Represents a REST reaction object.
/// </summary>
public class RestReaction : IReaction public class RestReaction : IReaction
{ {
/// <inheritdoc />
public IEmote Emote { get; } public IEmote Emote { get; }
/// <summary>
/// Gets the number of reactions added.
/// </summary>
public int Count { get; } public int Count { get; }
/// <summary>
/// Gets whether the reactions is added by the user.
/// </summary>
public bool Me { get; } public bool Me { get; }


internal RestReaction(IEmote emote, int count, bool me) internal RestReaction(IEmote emote, int count, bool me)


+ 11
- 2
src/Discord.Net.Rest/Entities/RestApplication.cs View File

@@ -1,23 +1,32 @@
using System;
using System;
using System.Diagnostics; using System.Diagnostics;
using System.Threading.Tasks; using System.Threading.Tasks;
using Model = Discord.API.Application; using Model = Discord.API.Application;


namespace Discord.Rest namespace Discord.Rest
{ {
/// <summary>
/// Represents a REST entity that contains information about a Discord application created via the developer portal.
/// </summary>
[DebuggerDisplay(@"{DebuggerDisplay,nq}")] [DebuggerDisplay(@"{DebuggerDisplay,nq}")]
public class RestApplication : RestEntity<ulong>, IApplication public class RestApplication : RestEntity<ulong>, IApplication
{ {
protected string _iconId; protected string _iconId;

/// <inheritdoc />
public string Name { get; private set; } public string Name { get; private set; }
/// <inheritdoc />
public string Description { get; private set; } public string Description { get; private set; }
/// <inheritdoc />
public string[] RPCOrigins { get; private set; } public string[] RPCOrigins { get; private set; }
public ulong Flags { get; private set; } public ulong Flags { get; private set; }


/// <inheritdoc />
public IUser Owner { get; private set; } public IUser Owner { get; private set; }


/// <inheritdoc />
public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id);
/// <inheritdoc />
public string IconUrl => CDN.GetApplicationIconUrl(Id, _iconId); public string IconUrl => CDN.GetApplicationIconUrl(Id, _iconId);


internal RestApplication(BaseDiscordClient discord, ulong id) internal RestApplication(BaseDiscordClient discord, ulong id)


+ 3
- 0
src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs View File

@@ -14,6 +14,9 @@ using VoiceStateModel = Discord.API.VoiceState;


namespace Discord.WebSocket namespace Discord.WebSocket
{ {
/// <summary>
/// Represents a private WebSocket group channel.
/// </summary>
[DebuggerDisplay(@"{DebuggerDisplay,nq}")] [DebuggerDisplay(@"{DebuggerDisplay,nq}")]
public class SocketGroupChannel : SocketChannel, IGroupChannel, ISocketPrivateChannel, ISocketMessageChannel, ISocketAudioChannel public class SocketGroupChannel : SocketChannel, IGroupChannel, ISocketPrivateChannel, ISocketMessageChannel, ISocketAudioChannel
{ {


Loading…
Cancel
Save