| @@ -13,33 +13,34 @@ | |||||
| public const string Channels = "channels"; | public const string Channels = "channels"; | ||||
| public static string Channel(string channelId) => $"channels/{channelId}"; | public static string Channel(string channelId) => $"channels/{channelId}"; | ||||
| public static string ChannelTyping(string channelId) => $"channels/{channelId}/typing"; | |||||
| public static string ChannelInvites(string channelId) => $"channels/{channelId}/invites"; | |||||
| public static string ChannelMessages(string channelId) => $"channels/{channelId}/messages"; | public static string ChannelMessages(string channelId) => $"channels/{channelId}/messages"; | ||||
| public static string ChannelMessages(string channelId, int limit) => $"channels/{channelId}/messages?limit={limit}"; | public static string ChannelMessages(string channelId, int limit) => $"channels/{channelId}/messages?limit={limit}"; | ||||
| public static string ChannelMessages(string channelId, int limit, string beforeId) => $"channels/{channelId}/messages?limit={limit}&before={beforeId}"; | public static string ChannelMessages(string channelId, int limit, string beforeId) => $"channels/{channelId}/messages?limit={limit}&before={beforeId}"; | ||||
| public static string ChannelMessage(string channelId, string msgId) => $"channels/{channelId}/messages/{msgId}"; | public static string ChannelMessage(string channelId, string msgId) => $"channels/{channelId}/messages/{msgId}"; | ||||
| public static string ChannelMessageAck(string channelId, string msgId) => $"channels/{channelId}/messages/{msgId}/ack"; | public static string ChannelMessageAck(string channelId, string msgId) => $"channels/{channelId}/messages/{msgId}/ack"; | ||||
| public static string ChannelInvites(string channelId) => $"channels/{channelId}/invites"; | |||||
| public static string ChannelPermission(string channelId, string userOrRoleId) => $"channels/{channelId}/permissions/{userOrRoleId}"; | public static string ChannelPermission(string channelId, string userOrRoleId) => $"channels/{channelId}/permissions/{userOrRoleId}"; | ||||
| public static string ChannelTyping(string channelId) => $"channels/{channelId}/typing"; | |||||
| public const string Servers = "guilds"; | public const string Servers = "guilds"; | ||||
| public static string Server(string serverId) => $"guilds/{serverId}"; | public static string Server(string serverId) => $"guilds/{serverId}"; | ||||
| public static string ServerBan(string serverId, string userId) => $"guilds/{serverId}/bans/{userId}"; | |||||
| public static string ServerChannels(string serverId) => $"guilds/{serverId}/channels"; | public static string ServerChannels(string serverId) => $"guilds/{serverId}/channels"; | ||||
| public static string ServerInvites(string serverId) => $"guilds/{serverId}/invites"; | |||||
| public static string ServerMember(string serverId, string userId) => $"guilds/{serverId}/members/{userId}"; | public static string ServerMember(string serverId, string userId) => $"guilds/{serverId}/members/{userId}"; | ||||
| public static string ServerBan(string serverId, string userId) => $"guilds/{serverId}/bans/{userId}"; | |||||
| public static string ServerPrune(string serverId, int days) => $"guilds/{serverId}/prune?days={days}"; | |||||
| public static string ServerRoles(string serverId) => $"guilds/{serverId}/roles"; | public static string ServerRoles(string serverId) => $"guilds/{serverId}/roles"; | ||||
| public static string ServerRole(string serverId, string roleId) => $"guilds/{serverId}/roles/{roleId}"; | public static string ServerRole(string serverId, string roleId) => $"guilds/{serverId}/roles/{roleId}"; | ||||
| public static string ServerPrune(string serverId, int days) => $"guilds/{serverId}/prune?days={days}"; | |||||
| public const string Invites = "invite"; | public const string Invites = "invite"; | ||||
| public static string Invite(string inviteId) => $"invite/{inviteId}"; | public static string Invite(string inviteId) => $"invite/{inviteId}"; | ||||
| public static string InviteUrl(string inviteId) => $"https://discord.gg/{inviteId}"; | public static string InviteUrl(string inviteId) => $"https://discord.gg/{inviteId}"; | ||||
| public const string Users = "users"; | public const string Users = "users"; | ||||
| public static string UserMe => $"users/@me"; | |||||
| public static string UserChannels(string userId) => $"users/{userId}/channels"; | |||||
| public static string UserAvatar(string userId, string avatarId) => $"users/{userId}/avatars/{avatarId}.jpg"; | public static string UserAvatar(string userId, string avatarId) => $"users/{userId}/avatars/{avatarId}.jpg"; | ||||
| public static string UserChannels(string userId) => $"users/{userId}/channels"; | |||||
| public static string UserMe => $"users/@me"; | |||||
| public const string Voice = "voice"; | public const string Voice = "voice"; | ||||
| public const string VoiceRegions = "voice/regions"; | public const string VoiceRegions = "voice/regions"; | ||||
| //public const string VoiceIce = "voice/ice"; | //public const string VoiceIce = "voice/ice"; | ||||
| @@ -4,6 +4,7 @@ | |||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
| using System; | using System; | ||||
| using System.Collections.Generic; | |||||
| namespace Discord.API | namespace Discord.API | ||||
| { | { | ||||
| @@ -53,6 +54,7 @@ namespace Discord.API | |||||
| //Get | //Get | ||||
| public class GetInviteResponse : InviteReference { } | public class GetInviteResponse : InviteReference { } | ||||
| public class GetInvitesResponse : List<InviteReference> { } | |||||
| //Accept | //Accept | ||||
| public class AcceptInviteResponse : InviteReference { } | public class AcceptInviteResponse : InviteReference { } | ||||
| @@ -126,6 +126,12 @@ namespace Discord | |||||
| return _rest.Get<GetInviteResponse>(Endpoints.Invite(inviteIdOrXkcd)); | return _rest.Get<GetInviteResponse>(Endpoints.Invite(inviteIdOrXkcd)); | ||||
| } | } | ||||
| public Task<GetInvitesResponse> GetInvites(string serverId) | |||||
| { | |||||
| if (serverId == null) throw new ArgumentNullException(nameof(serverId)); | |||||
| return _rest.Get<GetInvitesResponse>(Endpoints.ServerInvites(serverId)); | |||||
| } | |||||
| public Task<AcceptInviteResponse> AcceptInvite(string inviteId) | public Task<AcceptInviteResponse> AcceptInvite(string inviteId) | ||||
| { | { | ||||
| if (inviteId == null) throw new ArgumentNullException(nameof(inviteId)); | if (inviteId == null) throw new ArgumentNullException(nameof(inviteId)); | ||||
| @@ -1,4 +1,5 @@ | |||||
| using System; | using System; | ||||
| using System.Linq; | |||||
| using System.Net; | using System.Net; | ||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
| @@ -10,8 +11,6 @@ namespace Discord | |||||
| /// <remarks> Supported formats: inviteCode, xkcdCode, https://discord.gg/inviteCode, https://discord.gg/xkcdCode </remarks> | /// <remarks> Supported formats: inviteCode, xkcdCode, https://discord.gg/inviteCode, https://discord.gg/xkcdCode </remarks> | ||||
| public async Task<Invite> GetInvite(string inviteIdOrXkcd) | public async Task<Invite> GetInvite(string inviteIdOrXkcd) | ||||
| { | { | ||||
| //This doesn't work well if it's an invite to a different server! | |||||
| if (inviteIdOrXkcd == null) throw new ArgumentNullException(nameof(inviteIdOrXkcd)); | if (inviteIdOrXkcd == null) throw new ArgumentNullException(nameof(inviteIdOrXkcd)); | ||||
| CheckReady(); | CheckReady(); | ||||
| @@ -30,6 +29,22 @@ namespace Discord | |||||
| return invite; | return invite; | ||||
| } | } | ||||
| /// <summary> Gets all active (non-expired) invites to a provided server. </summary> | |||||
| public async Task<Invite[]> GetInvites(Server server) | |||||
| { | |||||
| if (server == null) throw new ArgumentNullException(nameof(server)); | |||||
| CheckReady(); | |||||
| var response = await _api.GetInvites(server.Id).ConfigureAwait(false); | |||||
| return response.Select(x => | |||||
| { | |||||
| var invite = new Invite(this, x.Code, x.XkcdPass, x.Guild.Id, x.Inviter?.Id, x.Channel?.Id); | |||||
| invite.Cache(); //Builds references | |||||
| invite.Update(x); | |||||
| return invite; | |||||
| }).ToArray(); | |||||
| } | |||||
| /// <summary> Creates a new invite to the default channel of the provided server. </summary> | /// <summary> Creates a new invite to the default channel of the provided server. </summary> | ||||
| /// <param name="maxAge"> Time (in seconds) until the invite expires. Set to 0 to never expire. </param> | /// <param name="maxAge"> Time (in seconds) until the invite expires. Set to 0 to never expire. </param> | ||||
| /// <param name="tempMembership"> If true, a user accepting this invite will be kicked from the server after closing their client. </param> | /// <param name="tempMembership"> If true, a user accepting this invite will be kicked from the server after closing their client. </param> | ||||
| @@ -55,11 +55,6 @@ namespace Discord | |||||
| public IEnumerable<Channel> VoiceChannels => _channels.Select(x => x.Value).Where(x => x.Type == ChannelType.Voice); | public IEnumerable<Channel> VoiceChannels => _channels.Select(x => x.Value).Where(x => x.Type == ChannelType.Voice); | ||||
| private ConcurrentDictionary<string, Channel> _channels; | private ConcurrentDictionary<string, Channel> _channels; | ||||
| /// <summary> Returns a collection of all invites to this server. </summary> | |||||
| [JsonIgnore] | |||||
| public IEnumerable<Invite> Invites => _invites.Values; | |||||
| private ConcurrentDictionary<string, Invite> _invites; | |||||
| /// <summary> Returns a collection of all users within this server with their server-specific data. </summary> | /// <summary> Returns a collection of all users within this server with their server-specific data. </summary> | ||||
| [JsonIgnore] | [JsonIgnore] | ||||
| public IEnumerable<User> Members => _members.Select(x => x.Value); | public IEnumerable<User> Members => _members.Select(x => x.Value); | ||||
| @@ -85,7 +80,6 @@ namespace Discord | |||||
| //Local Cache | //Local Cache | ||||
| _bans = new ConcurrentDictionary<string, bool>(); | _bans = new ConcurrentDictionary<string, bool>(); | ||||
| _invites = new ConcurrentDictionary<string, Invite>(); | |||||
| } | } | ||||
| internal override void LoadReferences() | internal override void LoadReferences() | ||||
| { | { | ||||
| @@ -113,11 +107,6 @@ namespace Discord | |||||
| roles.Clear(); | roles.Clear(); | ||||
| //Local Cache | //Local Cache | ||||
| var invites = _invites; | |||||
| foreach (var invite in invites) | |||||
| invite.Value.Uncache(); | |||||
| invites.Clear(); | |||||
| _bans.Clear(); | _bans.Clear(); | ||||
| _afkChannel.Unload(); | _afkChannel.Unload(); | ||||
| @@ -218,9 +207,6 @@ namespace Discord | |||||
| _channels.TryRemove(channel.Id, out channel); | _channels.TryRemove(channel.Id, out channel); | ||||
| } | } | ||||
| internal void AddInvite(Invite invite) => _invites.TryAdd(invite.Id, invite); | |||||
| internal void RemoveInvite(Invite invite) => _invites.TryRemove(invite.Id, out invite); | |||||
| internal void AddMember(User user) | internal void AddMember(User user) | ||||
| { | { | ||||
| if (_members.TryAdd(user.Id, user)) | if (_members.TryAdd(user.Id, user)) | ||||