@@ -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)) | ||||