using Maki.Rest; using Maki.Structures.Guilds; using Maki.Structures.Rest; using Maki.Structures.Roles; using System; using System.Linq; namespace Maki { public class DiscordServer { public readonly ulong Id; private readonly Discord client; public string Name { get; internal set; } public ulong OwnerId { get; internal set; } public DateTime Created { get; internal set; } internal string IconHash; public DiscordMember[] Members => client.members.Where(x => x.Server == this).ToArray(); public DiscordMember Owner => Members.Where(x => x.User.Id == OwnerId).FirstOrDefault(); public DiscordMember Me => Members.Where(x => x.User == client.Me).FirstOrDefault(); public DiscordChannel[] TextChannels => client.channels.Where(x => x.Server == this && x.Type == DiscordChannelType.Text).OrderBy(x => x.Position).ToArray(); public DiscordChannel[] VoiceChannels => client.channels.Where(x => x.Server == this && x.Type == DiscordChannelType.Voice).OrderBy(x => x.Position).ToArray(); public DiscordRole[] Roles => client.roles.Where(x => x.Server == this).OrderByDescending(x => x.Position).ToArray(); public string Icon(string ext = @"png", int size = 128) => RestEndpoints.CDN_URL + $@"/icons/{Id}/{IconHash}.{ext}?size={size}"; internal DiscordServer(Discord discord, Guild guild) { client = discord; Id = guild.Id; Name = guild.Name; Created = guild.Created ?? DateTime.MinValue; OwnerId = guild.OwnerId ?? ulong.MinValue; IconHash = guild.IconHash; } public DiscordRole CreateRole(string name = null, DiscordPermission perms = DiscordPermission.None, DiscordColour colour = null, bool hoist = false, bool mentionable = false) { Role? roleStruct; using (WebRequest wr = new WebRequest(HttpMethod.POST, RestEndpoints.GuildRoles(Id))) { wr.AddJson(new RoleCreate { Name = name, Perms = perms, Colour = colour == null ? 0 : colour.Raw, Hoist = hoist, Mentionable = mentionable }); wr.Perform(); if (wr.Status != 200 || wr.Response.Length < 1) throw new DiscordException("Failed to create role"); roleStruct = wr.ResponseJson(); } if (!roleStruct.HasValue) throw new DiscordException("Empty response?"); DiscordRole role = client.roles.Where(x => x.Id == roleStruct.Value.Id).FirstOrDefault(); if (role == default(DiscordRole)) { role = new DiscordRole(client, roleStruct.Value, this); client.roles.Add(role); } return role; } } }