| @@ -2,6 +2,7 @@ | |||||
| <PropertyGroup> | <PropertyGroup> | ||||
| <TargetFramework>netstandard2.0</TargetFramework> | <TargetFramework>netstandard2.0</TargetFramework> | ||||
| <LangVersion>7.1</LangVersion> | |||||
| </PropertyGroup> | </PropertyGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| @@ -9,8 +10,4 @@ | |||||
| <PackageReference Include="Wumpus.Net.Rest" Version="0.2.2-build-00031" /> | <PackageReference Include="Wumpus.Net.Rest" Version="0.2.2-build-00031" /> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | |||||
| <Folder Include="Models\Guilds\" /> | |||||
| </ItemGroup> | |||||
| </Project> | </Project> | ||||
| @@ -0,0 +1,11 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Text; | |||||
| namespace Discord | |||||
| { | |||||
| public interface IEmote | |||||
| { | |||||
| string Name { get; } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,7 @@ | |||||
| namespace Discord | |||||
| { | |||||
| public interface IGuildEmote : IEmote | |||||
| { | |||||
| // TODO | |||||
| } | |||||
| } | |||||
| @@ -142,5 +142,40 @@ namespace Discord | |||||
| /// A string containing the identifier for the voice region that this guild uses (e.g. <c>eu-central</c>). | /// A string containing the identifier for the voice region that this guild uses (e.g. <c>eu-central</c>). | ||||
| /// </returns> | /// </returns> | ||||
| string VoiceRegionId { get; } | string VoiceRegionId { get; } | ||||
| /// <summary> | |||||
| /// Gets the <see cref="IAudioClient"/> currently associated with this guild. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// An <see cref="IAudioClient"/> currently associated with this guild. | |||||
| /// </returns> | |||||
| //IAudioClient AudioClient { get; } // TODO: how do we want to handle audio? | |||||
| /// <summary> | |||||
| /// Gets the built-in role containing all users in this guild. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// A role object that represents an <c>@everyone</c> role in this guild. | |||||
| /// </returns> | |||||
| IRole EveryoneRole { get; } | |||||
| /// <summary> | |||||
| /// Gets a collection of all custom emotes for this guild. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// A read-only collection of all custom emotes for this guild. | |||||
| /// </returns> | |||||
| IReadOnlyCollection<IGuildEmote> Emotes { get; } | |||||
| /// <summary> | |||||
| /// Gets a collection of all extra features added to this guild. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// A read-only collection of enabled features in this guild. | |||||
| /// </returns> | |||||
| IReadOnlyCollection<string> Features { get; } | |||||
| /// <summary> | |||||
| /// Gets a collection of all roles in this guild. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// A read-only collection of roles found within this guild. | |||||
| /// </returns> | |||||
| IReadOnlyCollection<IRole> Roles { get; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,7 @@ | |||||
| namespace Discord | |||||
| { | |||||
| public interface IMentionable | |||||
| { | |||||
| string Mention { get; } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,85 @@ | |||||
| using System; | |||||
| using System.Threading.Tasks; | |||||
| using Color = Wumpus.Entities.Color; // TODO: do we need to impl our own color struct? | |||||
| using GuildPermissions = Wumpus.Entities.GuildPermissions; // TODO: permissions | |||||
| namespace Discord | |||||
| { | |||||
| /// <summary> | |||||
| /// Represents a generic role object to be given to a guild user. | |||||
| /// </summary> | |||||
| public interface IRole : ISnowflakeEntity, IDeletable, IMentionable, IComparable<IRole> | |||||
| { | |||||
| /// <summary> | |||||
| /// Gets the guild that owns this role. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// A guild representing the parent guild of this role. | |||||
| /// </returns> | |||||
| IGuild Guild { get; } | |||||
| /// <summary> | |||||
| /// Gets the color given to users of this role. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// A <see cref="Color"/> struct representing the color of this role. | |||||
| /// </returns> | |||||
| Color Color { get; } | |||||
| /// <summary> | |||||
| /// Gets a value that indicates whether the role can be separated in the user list. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// <c>true</c> if users of this role are separated in the user list; otherwise <c>false</c>. | |||||
| /// </returns> | |||||
| bool IsHoisted { get; } | |||||
| /// <summary> | |||||
| /// Gets a value that indicates whether the role is managed by Discord. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// <c>true</c> if this role is automatically managed by Discord; otherwise <c>false</c>. | |||||
| /// </returns> | |||||
| bool IsManaged { get; } | |||||
| /// <summary> | |||||
| /// Gets a value that indicates whether the role is mentionable. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// <c>true</c> if this role may be mentioned in messages; otherwise <c>false</c>. | |||||
| /// </returns> | |||||
| bool IsMentionable { get; } | |||||
| /// <summary> | |||||
| /// Gets the name of this role. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// A string containing the name of this role. | |||||
| /// </returns> | |||||
| string Name { get; } | |||||
| /// <summary> | |||||
| /// Gets the permissions granted to members of this role. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// A <see cref="GuildPermissions"/> struct that this role possesses. | |||||
| /// </returns> | |||||
| GuildPermissions Permissions { get; } | |||||
| /// <summary> | |||||
| /// Gets this role's position relative to other roles in the same guild. | |||||
| /// </summary> | |||||
| /// <returns> | |||||
| /// An <see cref="int"/> representing the position of the role in the role list of the guild. | |||||
| /// </returns> | |||||
| int Position { get; } | |||||
| /// <summary> | |||||
| /// Modifies this role. | |||||
| /// </summary> | |||||
| /// <remarks> | |||||
| /// This method modifies this role with the specified properties. To see an example of this | |||||
| /// method and what properties are available, please refer to <see cref="RoleProperties"/>. | |||||
| /// </remarks> | |||||
| /// <param name="func">A delegate containing the properties to modify the role with.</param> | |||||
| /// <param name="options">The options to be used when sending the request.</param> | |||||
| /// <returns> | |||||
| /// A task that represents the asynchronous modification operation. | |||||
| /// </returns> | |||||
| Task ModifyAsync(); // TODO: stub out request properties | |||||
| } | |||||
| } | |||||
| @@ -6,12 +6,12 @@ namespace Discord | |||||
| { | { | ||||
| public interface IDiscordClient | public interface IDiscordClient | ||||
| { | { | ||||
| event Action Ready; | |||||
| WumpusGatewayClient Gateway { get; } | WumpusGatewayClient Gateway { get; } | ||||
| WumpusRestClient Rest { get; } | WumpusRestClient Rest { get; } | ||||
| Task StartAsync(); | Task StartAsync(); | ||||
| Task StopAsync(); | Task StopAsync(); | ||||
| event Action Ready; | |||||
| } | } | ||||
| } | } | ||||
| @@ -9,7 +9,7 @@ namespace Discord | |||||
| { | { | ||||
| internal class Guild : SnowflakeEntity, IGuild | internal class Guild : SnowflakeEntity, IGuild | ||||
| { | { | ||||
| public Guild(Model model, IDiscordClient client) : base(client) | |||||
| public Guild(Model model, IDiscordClient discord) : base(discord) | |||||
| { | { | ||||
| Name = model.Name.ToString(); | Name = model.Name.ToString(); | ||||
| AFKTimeout = model.AfkTimeout; | AFKTimeout = model.AfkTimeout; | ||||
| @@ -35,6 +35,23 @@ namespace Discord | |||||
| OwnerId = model.OwnerId; | OwnerId = model.OwnerId; | ||||
| ApplicationId = model.ApplicationId; | ApplicationId = model.ApplicationId; | ||||
| VoiceRegionId = null; // TODO? | VoiceRegionId = null; // TODO? | ||||
| Role[] roles = new Role[model.Roles.Length]; | |||||
| Role role; | |||||
| for (int i = 0; i < model.Roles.Length; i++) | |||||
| { | |||||
| role = new Role(model.Roles[i], this, Discord); | |||||
| if (role.Id == Id) // EveryoneRole has the same ID as the guild | |||||
| EveryoneRole = role; | |||||
| roles[i] = role; | |||||
| } | |||||
| Roles = roles; | |||||
| // TODO: emotes | |||||
| string[] features = new string[model.Features.Length]; | |||||
| for (int i = 0; i < model.Features.Length; i++) | |||||
| features[i] = model.Features[i].ToString(); | |||||
| Features = features; | |||||
| } | } | ||||
| public string Name { get; set; } | public string Name { get; set; } | ||||
| @@ -61,6 +78,12 @@ namespace Discord | |||||
| public ulong? ApplicationId { get; set; } | public ulong? ApplicationId { get; set; } | ||||
| public string VoiceRegionId { get; set; } | public string VoiceRegionId { get; set; } | ||||
| public Task DeleteAsync() => throw new NotImplementedException(); | |||||
| public IRole EveryoneRole { get; set; } | |||||
| public IReadOnlyCollection<IGuildEmote> Emotes { get; set; } | |||||
| public IReadOnlyCollection<string> Features { get; set; } | |||||
| public IReadOnlyCollection<IRole> Roles { get; set; } | |||||
| public Task DeleteAsync() | |||||
| => Discord.Rest.DeleteGuildAsync(Id); | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,50 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Text; | |||||
| using System.Threading.Tasks; | |||||
| using Wumpus.Entities; | |||||
| using Model = Wumpus.Entities.Role; | |||||
| namespace Discord | |||||
| { | |||||
| internal class Role : SnowflakeEntity, IRole | |||||
| { | |||||
| public Role(Model model, IGuild guild, IDiscordClient discord) : base(discord) | |||||
| { | |||||
| Guild = guild; | |||||
| Color = model.Color; | |||||
| IsHoisted = model.IsHoisted; | |||||
| IsManaged = model.Managed; | |||||
| IsMentionable = model.IsMentionable; | |||||
| Name = model.Name.ToString(); | |||||
| Permissions = model.Permissions; | |||||
| Position = model.Position; | |||||
| } | |||||
| public IGuild Guild { get; set; } | |||||
| public Color Color { get; set; } | |||||
| public bool IsHoisted { get; set; } | |||||
| public bool IsManaged { get; set; } | |||||
| public bool IsMentionable { get; set; } | |||||
| public string Name { get; set; } | |||||
| public GuildPermissions Permissions { get; set; } | |||||
| public int Position { get; set; } | |||||
| public string Mention => throw new NotImplementedException(); // TODO: MentionUtils | |||||
| public Task DeleteAsync() | |||||
| => Discord.Rest.DeleteGuildRoleAsync(Guild.Id, Id); | |||||
| public Task ModifyAsync() | |||||
| { | |||||
| throw new NotImplementedException(); | |||||
| } | |||||
| // IComparable | |||||
| public int CompareTo(IRole other) | |||||
| { | |||||
| return Id.CompareTo(other.Id); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -4,6 +4,8 @@ | |||||
| <TargetFramework>netcoreapp2.1</TargetFramework> | <TargetFramework>netcoreapp2.1</TargetFramework> | ||||
| <IsPackable>false</IsPackable> | <IsPackable>false</IsPackable> | ||||
| <LangVersion>7.1</LangVersion> | |||||
| </PropertyGroup> | </PropertyGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| @@ -4,6 +4,8 @@ | |||||
| <TargetFramework>netcoreapp2.1</TargetFramework> | <TargetFramework>netcoreapp2.1</TargetFramework> | ||||
| <IsPackable>false</IsPackable> | <IsPackable>false</IsPackable> | ||||
| <LangVersion>7.1</LangVersion> | |||||
| </PropertyGroup> | </PropertyGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||