Automatically sync guilds
This commit is contained in:
@@ -29,8 +29,6 @@ namespace Discord
|
||||
private int _lastSeq;
|
||||
private ImmutableDictionary<string, VoiceRegion> _voiceRegions;
|
||||
private TaskCompletionSource<bool> _connectTask;
|
||||
private ConcurrentHashSet<ulong> _syncedGuilds;
|
||||
private SemaphoreSlim _syncedGuildsLock;
|
||||
private CancellationTokenSource _cancelToken;
|
||||
private Task _heartbeatTask, _guildDownloadTask, _reconnectTask;
|
||||
private long _heartbeatTime;
|
||||
@@ -104,8 +102,6 @@ namespace Discord
|
||||
|
||||
_voiceRegions = ImmutableDictionary.Create<string, VoiceRegion>();
|
||||
_largeGuilds = new ConcurrentQueue<ulong>();
|
||||
_syncedGuilds = new ConcurrentHashSet<ulong>();
|
||||
_syncedGuildsLock = new SemaphoreSlim(1, 1);
|
||||
}
|
||||
|
||||
protected override async Task OnLoginAsync()
|
||||
@@ -309,7 +305,6 @@ namespace Discord
|
||||
}
|
||||
internal CachedGuild RemoveGuild(ulong id)
|
||||
{
|
||||
_syncedGuilds.TryRemove(id);
|
||||
var guild = DataStore.RemoveGuild(id);
|
||||
foreach (var channel in guild.Channels)
|
||||
guild.RemoveChannel(channel.Id);
|
||||
@@ -380,26 +375,9 @@ namespace Discord
|
||||
var cachedGuilds = guilds.ToArray();
|
||||
if (cachedGuilds.Length == 0) return;
|
||||
|
||||
//Sync guilds
|
||||
if (ApiClient.AuthTokenType == TokenType.User)
|
||||
{
|
||||
await _syncedGuildsLock.WaitAsync().ConfigureAwait(false);
|
||||
try
|
||||
{
|
||||
foreach (var guild in cachedGuilds)
|
||||
_syncedGuilds.TryAdd(guild.Id);
|
||||
await ApiClient.SendGuildSyncAsync(_syncedGuilds).ConfigureAwait(false);
|
||||
await Task.WhenAll(cachedGuilds.Select(x => x.SyncPromise));
|
||||
|
||||
//Reduce the list only to those with members left to download
|
||||
cachedGuilds = cachedGuilds.Where(x => !x.HasAllMembers).ToArray();
|
||||
if (cachedGuilds.Length == 0) return;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_syncedGuildsLock.Release();
|
||||
}
|
||||
}
|
||||
var unsyncedGuilds = guilds.Select(x => x.SyncPromise).Where(x => !x.IsCompleted).ToArray();
|
||||
if (unsyncedGuilds.Length > 0)
|
||||
await Task.WhenAll(unsyncedGuilds);
|
||||
|
||||
//Download offline members
|
||||
const short batchSize = 50;
|
||||
@@ -521,7 +499,6 @@ namespace Discord
|
||||
var currentUser = new CachedSelfUser(this, data.User);
|
||||
int unavailableGuilds = 0;
|
||||
//dataStore.GetOrAddUser(data.User.Id, _ => currentUser);
|
||||
|
||||
for (int i = 0; i < data.Guilds.Length; i++)
|
||||
{
|
||||
var model = data.Guilds[i];
|
||||
@@ -536,20 +513,12 @@ namespace Discord
|
||||
_currentUser = currentUser;
|
||||
_unavailableGuilds = unavailableGuilds;
|
||||
_lastGuildAvailableTime = Environment.TickCount;
|
||||
await _syncedGuildsLock.WaitAsync().ConfigureAwait(false);
|
||||
try
|
||||
{
|
||||
_syncedGuilds = new ConcurrentHashSet<ulong>();
|
||||
}
|
||||
finally
|
||||
{
|
||||
_syncedGuildsLock.Release();
|
||||
}
|
||||
DataStore = dataStore;
|
||||
DataStore = dataStore;
|
||||
|
||||
_guildDownloadTask = WaitForGuildsAsync(_cancelToken.Token);
|
||||
|
||||
await _readyEvent.InvokeAsync().ConfigureAwait(false);
|
||||
await SyncGuildsAsync().ConfigureAwait(false);
|
||||
|
||||
_connectTask.TrySetResult(true); //Signal the .Connect() call to complete
|
||||
await _gatewayLogger.InfoAsync("Ready").ConfigureAwait(false);
|
||||
@@ -579,6 +548,7 @@ namespace Discord
|
||||
if (data.Unavailable != false)
|
||||
{
|
||||
guild = AddGuild(data, DataStore);
|
||||
await SyncGuildsAsync().ConfigureAwait(false);
|
||||
await _joinedGuildEvent.InvokeAsync(guild).ConfigureAwait(false);
|
||||
await _gatewayLogger.InfoAsync($"Joined {data.Name}").ConfigureAwait(false);
|
||||
}
|
||||
@@ -1280,5 +1250,11 @@ namespace Discord
|
||||
while ((_unavailableGuilds != 0) && (Environment.TickCount - _lastGuildAvailableTime < 2000))
|
||||
await Task.Delay(500, cancelToken).ConfigureAwait(false);
|
||||
}
|
||||
private async Task SyncGuildsAsync()
|
||||
{
|
||||
var guildIds = Guilds.Where(x => x.Available).Select(x => x.Id).ToArray();
|
||||
if (guildIds.Length > 0)
|
||||
await ApiClient.SendGuildSyncAsync(guildIds).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user