Browse Source

feature: Add missing application properties (including Teams) (#1604)

* Add missing application properties

Add IsBotPublic, BotRequiresCodeGrant, and Team properties to IApplication

* To immutable list

* Change list to array
tags/2.3.0
Paulo GitHub 4 years ago
parent
commit
10fcde0a32
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 213 additions and 1 deletions
  1. +11
    -0
      src/Discord.Net.Core/CDN.cs
  2. +12
    -0
      src/Discord.Net.Core/Entities/IApplication.cs
  3. +27
    -0
      src/Discord.Net.Core/Entities/Teams/ITeam.cs
  4. +25
    -0
      src/Discord.Net.Core/Entities/Teams/ITeamMember.cs
  5. +11
    -0
      src/Discord.Net.Core/Entities/Teams/MembershipState.cs
  6. +7
    -1
      src/Discord.Net.Rest/API/Common/Application.cs
  7. +9
    -0
      src/Discord.Net.Rest/API/Common/MembershipState.cs
  8. +17
    -0
      src/Discord.Net.Rest/API/Common/Team.cs
  9. +17
    -0
      src/Discord.Net.Rest/API/Common/TeamMember.cs
  10. +10
    -0
      src/Discord.Net.Rest/Entities/RestApplication.cs
  11. +37
    -0
      src/Discord.Net.Rest/Entities/Teams/RestTeam.cs
  12. +30
    -0
      src/Discord.Net.Rest/Entities/Teams/RestTeamMember.cs

+ 11
- 0
src/Discord.Net.Core/CDN.cs View File

@@ -7,6 +7,17 @@ namespace Discord
/// </summary>
public static class CDN
{
/// <summary>
/// Returns a team icon URL.
/// </summary>
/// <param name="teamId">The team identifier.</param>
/// <param name="iconId">The icon identifier.</param>
/// <returns>
/// A URL pointing to the team's icon.
/// </returns>
public static string GetTeamIconUrl(ulong teamId, string iconId)
=> iconId != null ? $"{DiscordConfig.CDNUrl}team-icons/{teamId}/{iconId}.jpg" : null;

/// <summary>
/// Returns an application icon URL.
/// </summary>


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

@@ -22,6 +22,18 @@ namespace Discord
/// Gets the icon URL of the application.
/// </summary>
string IconUrl { get; }
/// <summary>
/// Gets if the bot is public.
/// </summary>
bool IsBotPublic { get; }
/// <summary>
/// Gets if the bot requires code grant.
/// </summary>
bool BotRequiresCodeGrant { get; }
/// <summary>
/// Gets the team associated with this application if there is one.
/// </summary>
ITeam Team { get; }

/// <summary>
/// Gets the partial user object containing info on the owner of the application.


+ 27
- 0
src/Discord.Net.Core/Entities/Teams/ITeam.cs View File

@@ -0,0 +1,27 @@
using System.Collections.Generic;

namespace Discord
{
/// <summary>
/// Represents a Discord Team.
/// </summary>
public interface ITeam
{
/// <summary>
/// Gets the team icon url.
/// </summary>
string IconUrl { get; }
/// <summary>
/// Gets the team unique identifier.
/// </summary>
ulong Id { get; }
/// <summary>
/// Gets the members of this team.
/// </summary>
IReadOnlyList<ITeamMember> TeamMembers { get; }
/// <summary>
/// Gets the user identifier that owns this team.
/// </summary>
ulong OwnerUserId { get; }
}
}

+ 25
- 0
src/Discord.Net.Core/Entities/Teams/ITeamMember.cs View File

@@ -0,0 +1,25 @@
namespace Discord
{
/// <summary>
/// Represents a Discord Team member.
/// </summary>
public interface ITeamMember
{
/// <summary>
/// Gets the membership state of this team member.
/// </summary>
MembershipState MembershipState { get; }
/// <summary>
/// Gets the permissions of this team member.
/// </summary>
string[] Permissions { get; }
/// <summary>
/// Gets the team unique identifier for this team member.
/// </summary>
ulong TeamId { get; }
/// <summary>
/// Gets the Discord user of this team member.
/// </summary>
IUser User { get; }
}
}

+ 11
- 0
src/Discord.Net.Core/Entities/Teams/MembershipState.cs View File

@@ -0,0 +1,11 @@
namespace Discord
{
/// <summary>
/// Represents the membership state of a team member.
/// </summary>
public enum MembershipState
{
Invited,
Accepted,
}
}

+ 7
- 1
src/Discord.Net.Rest/API/Common/Application.cs View File

@@ -1,4 +1,4 @@
#pragma warning disable CS1591
#pragma warning disable CS1591
using Newtonsoft.Json;

namespace Discord.API
@@ -15,6 +15,12 @@ namespace Discord.API
public ulong Id { get; set; }
[JsonProperty("icon")]
public string Icon { get; set; }
[JsonProperty("bot_public")]
public bool IsBotPublic { get; set; }
[JsonProperty("bot_require_code_grant")]
public bool BotRequiresCodeGrant { get; set; }
[JsonProperty("team")]
public Optional<Team> Team { get; set; }

[JsonProperty("flags"), Int53]
public Optional<ulong> Flags { get; set; }


+ 9
- 0
src/Discord.Net.Rest/API/Common/MembershipState.cs View File

@@ -0,0 +1,9 @@
namespace Discord.API
{
internal enum MembershipState
{
None = 0,
Invited = 1,
Accepted = 2,
}
}

+ 17
- 0
src/Discord.Net.Rest/API/Common/Team.cs View File

@@ -0,0 +1,17 @@
#pragma warning disable CS1591
using Newtonsoft.Json;

namespace Discord.API
{
internal class Team
{
[JsonProperty("icon")]
public Optional<string> Icon { get; set; }
[JsonProperty("id")]
public ulong Id { get; set; }
[JsonProperty("members")]
public TeamMember[] TeamMembers { get; set; }
[JsonProperty("owner_user_id")]
public ulong OwnerUserId { get; set; }
}
}

+ 17
- 0
src/Discord.Net.Rest/API/Common/TeamMember.cs View File

@@ -0,0 +1,17 @@
#pragma warning disable CS1591
using Newtonsoft.Json;

namespace Discord.API
{
internal class TeamMember
{
[JsonProperty("membership_state")]
public MembershipState MembershipState { get; set; }
[JsonProperty("permissions")]
public string[] Permissions { get; set; }
[JsonProperty("team_id")]
public ulong TeamId { get; set; }
[JsonProperty("user")]
public User User { get; set; }
}
}

+ 10
- 0
src/Discord.Net.Rest/Entities/RestApplication.cs View File

@@ -21,6 +21,12 @@ namespace Discord.Rest
public string[] RPCOrigins { get; private set; }
/// <inheritdoc />
public ulong Flags { get; private set; }
/// <inheritdoc />
public bool IsBotPublic { get; private set; }
/// <inheritdoc />
public bool BotRequiresCodeGrant { get; private set; }
/// <inheritdoc />
public ITeam Team { get; private set; }

/// <inheritdoc />
public IUser Owner { get; private set; }
@@ -46,11 +52,15 @@ namespace Discord.Rest
RPCOrigins = model.RPCOrigins;
Name = model.Name;
_iconId = model.Icon;
IsBotPublic = model.IsBotPublic;
BotRequiresCodeGrant = model.BotRequiresCodeGrant;

if (model.Flags.IsSpecified)
Flags = model.Flags.Value; //TODO: Do we still need this?
if (model.Owner.IsSpecified)
Owner = RestUser.Create(Discord, model.Owner.Value);
if (model.Team.IsSpecified)
Team = RestTeam.Create(Discord, model.Team.Value);
}

/// <exception cref="InvalidOperationException">Unable to update this object from a different application token.</exception>


+ 37
- 0
src/Discord.Net.Rest/Entities/Teams/RestTeam.cs View File

@@ -0,0 +1,37 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using Model = Discord.API.Team;

namespace Discord.Rest
{
public class RestTeam : RestEntity<ulong>, ITeam
{
/// <inheritdoc />
public string IconUrl => _iconId != null ? CDN.GetTeamIconUrl(Id, _iconId) : null;
/// <inheritdoc />
public IReadOnlyList<ITeamMember> TeamMembers { get; private set; }
/// <inheritdoc />
public ulong OwnerUserId { get; private set; }

private string _iconId;

internal RestTeam(BaseDiscordClient discord, ulong id)
: base(discord, id)
{
}
internal static RestTeam Create(BaseDiscordClient discord, Model model)
{
var entity = new RestTeam(discord, model.Id);
entity.Update(model);
return entity;
}
internal virtual void Update(Model model)
{
if (model.Icon.IsSpecified)
_iconId = model.Icon.Value;
OwnerUserId = model.OwnerUserId;
TeamMembers = model.TeamMembers.Select(x => new RestTeamMember(Discord, x)).ToImmutableArray();
}
}
}

+ 30
- 0
src/Discord.Net.Rest/Entities/Teams/RestTeamMember.cs View File

@@ -0,0 +1,30 @@
using System;
using Model = Discord.API.TeamMember;

namespace Discord.Rest
{
public class RestTeamMember : ITeamMember
{
/// <inheritdoc />
public MembershipState MembershipState { get; }
/// <inheritdoc />
public string[] Permissions { get; }
/// <inheritdoc />
public ulong TeamId { get; }
/// <inheritdoc />
public IUser User { get; }

internal RestTeamMember(BaseDiscordClient discord, Model model)
{
MembershipState = model.MembershipState switch
{
API.MembershipState.Invited => MembershipState.Invited,
API.MembershipState.Accepted => MembershipState.Accepted,
_ => throw new InvalidOperationException("Invalid membership state"),
};
Permissions = model.Permissions;
TeamId = model.TeamId;
User = RestUser.Create(discord, model.User);
}
}
}

Loading…
Cancel
Save