using System; using System.Threading.Tasks; using Discord.Rest; namespace Discord { public partial class TestsFixture { public const uint MigrationCount = 3; public async Task MigrateAsync() { DiscordRestClient client = null; RestGuild guild = null; await _cache.LoadInfoAsync(_config.GuildId).ConfigureAwait(false); while (_cache.Info.Version != MigrationCount) { if (client == null) { client = new DiscordRestClient(); await client.LoginAsync(TokenType.Bot, _config.Token, false).ConfigureAwait(false); guild = await client.GetGuildAsync(_config.GuildId); } uint nextVer = _cache.Info.Version + 1; try { await DoMigrateAsync(client, guild, nextVer).ConfigureAwait(false); _cache.Info.Version = nextVer; await _cache.SaveInfoAsync().ConfigureAwait(false); } catch { await _cache.ClearAsync().ConfigureAwait(false); throw; } } } private static Task DoMigrateAsync(DiscordRestClient client, RestGuild guild, uint toVersion) { switch (toVersion) { case 1: return Migration_WipeGuild(client, guild); case 2: return Tests.Migration_CreateTextChannels(client, guild); case 3: return Tests.Migration_CreateVoiceChannels(client, guild); default: throw new InvalidOperationException("Unknown migration: " + toVersion); } } private static async Task Migration_WipeGuild(DiscordRestClient client, RestGuild guild) { var textChannels = await guild.GetTextChannelsAsync(); var voiceChannels = await guild.GetVoiceChannelsAsync(); var roles = guild.Roles; foreach (var channel in textChannels) { if (channel.Id != guild.DefaultChannelId) await channel.DeleteAsync(); } foreach (var channel in voiceChannels) await channel.DeleteAsync(); foreach (var role in roles) { if (role.Id != guild.EveryoneRole.Id) await role.DeleteAsync(); } } } }