@@ -918,17 +918,28 @@ namespace Discord.API | |||
//Was this an empty batch? | |||
if (models.Length == 0) break; | |||
//We can't assume these messages to be sorted by id (fails in rare cases), lets search for the highest/lowest id ourselves | |||
switch (args.RelativeDirection) | |||
{ | |||
case Direction.Before: | |||
case Direction.Around: | |||
default: | |||
result[i] = models; | |||
relativeId = models[models.Length - 1].Id; | |||
relativeId = ulong.MaxValue; | |||
for (int j = 0; j < models.Length; j++) | |||
{ | |||
if (models[j].Id < relativeId.Value) | |||
relativeId = models[j].Id; | |||
} | |||
break; | |||
case Direction.After: | |||
result[runs - i - 1] = models; | |||
relativeId = models[0].Id; | |||
relativeId = ulong.MinValue; | |||
for (int j = 0; j < models.Length; j++) | |||
{ | |||
if (models[j].Id > relativeId.Value) | |||
relativeId = models[j].Id; | |||
} | |||
break; | |||
} | |||
@@ -194,11 +194,23 @@ namespace Discord | |||
return null; | |||
} | |||
/// <inheritdoc /> | |||
public virtual async Task<IReadOnlyCollection<IUserGuild>> GetGuildsAsync() | |||
public virtual async Task<IReadOnlyCollection<IUserGuild>> GetGuildSummariesAsync() | |||
{ | |||
var models = await ApiClient.GetMyGuildsAsync().ConfigureAwait(false); | |||
return models.Select(x => new UserGuild(this, x)).ToImmutableArray(); | |||
} | |||
/// <inheritdoc /> | |||
public virtual async Task<IReadOnlyCollection<IGuild>> GetGuildsAsync() | |||
{ | |||
var summaryModels = await ApiClient.GetMyGuildsAsync().ConfigureAwait(false); | |||
var guilds = ImmutableArray.CreateBuilder<IGuild>(summaryModels.Count); | |||
foreach (var summaryModel in summaryModels) | |||
{ | |||
var guildModel = await ApiClient.GetGuildAsync(summaryModel.Id).ConfigureAwait(false); | |||
if (guildModel != null) | |||
guilds.Add(new Guild(this, guildModel)); | |||
} | |||
return guilds.ToImmutable(); | |||
} | |||
/// <inheritdoc /> | |||
public virtual async Task<IGuild> CreateGuildAsync(string name, IVoiceRegion region, Stream jpegIcon = null) | |||
@@ -190,24 +190,29 @@ namespace Discord | |||
ConnectionState = ConnectionState.Disconnecting; | |||
await _gatewayLogger.InfoAsync("Disconnecting").ConfigureAwait(false); | |||
await _gatewayLogger.DebugAsync("Disconnecting - CancelToken").ConfigureAwait(false); | |||
//Signal tasks to complete | |||
try { _cancelToken.Cancel(); } catch { } | |||
await _gatewayLogger.DebugAsync("Disconnecting - ApiClient").ConfigureAwait(false); | |||
//Disconnect from server | |||
await ApiClient.DisconnectAsync().ConfigureAwait(false); | |||
//Wait for tasks to complete | |||
await _gatewayLogger.DebugAsync("Disconnecting - Heartbeat").ConfigureAwait(false); | |||
var heartbeatTask = _heartbeatTask; | |||
if (heartbeatTask != null) | |||
await heartbeatTask.ConfigureAwait(false); | |||
_heartbeatTask = null; | |||
await _gatewayLogger.DebugAsync("Disconnecting - Guild Downloader").ConfigureAwait(false); | |||
var guildDownloadTask = _guildDownloadTask; | |||
if (guildDownloadTask != null) | |||
await guildDownloadTask.ConfigureAwait(false); | |||
_guildDownloadTask = null; | |||
//Clear large guild queue | |||
await _gatewayLogger.DebugAsync("Disconnecting - Clean Large Guilds").ConfigureAwait(false); | |||
while (_largeGuilds.TryDequeue(out guildId)) { } | |||
ConnectionState = ConnectionState.Disconnected; | |||
@@ -293,10 +298,14 @@ namespace Discord | |||
else | |||
return Task.FromResult<GuildEmbed?>(null); | |||
} | |||
public override Task<IReadOnlyCollection<IUserGuild>> GetGuildsAsync() | |||
public override Task<IReadOnlyCollection<IUserGuild>> GetGuildSummariesAsync() | |||
{ | |||
return Task.FromResult<IReadOnlyCollection<IUserGuild>>(Guilds); | |||
} | |||
public override Task<IReadOnlyCollection<IGuild>> GetGuildsAsync() | |||
{ | |||
return Task.FromResult<IReadOnlyCollection<IGuild>>(Guilds); | |||
} | |||
internal CachedGuild AddGuild(ExtendedGuild model, DataStore dataStore) | |||
{ | |||
var guild = new CachedGuild(this, model, dataStore); | |||
@@ -8,6 +8,7 @@ using System.Threading.Tasks; | |||
namespace Discord | |||
{ | |||
//TODO: Add docstrings | |||
//TODO: Docstrings should explain when REST requests are sent and how many | |||
public interface IDiscordClient : IDisposable | |||
{ | |||
LoginState LoginState { get; } | |||
@@ -28,7 +29,8 @@ namespace Discord | |||
Task<IReadOnlyCollection<IConnection>> GetConnectionsAsync(); | |||
Task<IGuild> GetGuildAsync(ulong id); | |||
Task<IReadOnlyCollection<IUserGuild>> GetGuildsAsync(); | |||
Task<IReadOnlyCollection<IGuild>> GetGuildsAsync(); | |||
Task<IReadOnlyCollection<IUserGuild>> GetGuildSummariesAsync(); | |||
Task<IGuild> CreateGuildAsync(string name, IVoiceRegion region, Stream jpegIcon = null); | |||
Task<IInvite> GetInviteAsync(string inviteIdOrXkcd); | |||