geekbot/Geekbot.net/Database/RedisMigration.cs

379 lines
15 KiB
C#
Raw Normal View History

2018-05-11 00:36:29 +02:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Discord;
using Discord.WebSocket;
using Geekbot.net.Commands.Utils.Quote;
using Geekbot.net.Database.Models;
using Geekbot.net.Lib.AlmostRedis;
2018-05-11 00:36:29 +02:00
using Geekbot.net.Lib.Extensions;
using Geekbot.net.Lib.Logger;
using Newtonsoft.Json;
namespace Geekbot.net.Database
{
public class RedisMigration
{
private readonly DatabaseContext _database;
private readonly IAlmostRedis _redis;
2018-05-11 00:36:29 +02:00
private readonly IGeekbotLogger _logger;
private readonly DiscordSocketClient _client;
public RedisMigration(DatabaseContext database, IAlmostRedis redis, IGeekbotLogger logger, DiscordSocketClient client)
2018-05-11 00:36:29 +02:00
{
_database = database;
_redis = redis;
_logger = logger;
_client = client;
}
2018-05-14 18:57:07 +02:00
public async Task Migrate()
2018-05-11 00:36:29 +02:00
{
_logger.Information(LogSource.Geekbot, "Starting migration process");
foreach (var guild in _client.Guilds)
{
if (guild.MemberCount > 10000)
{
_logger.Information(LogSource.Geekbot, $"Skipping {guild.Name} because server size is to big ({guild.MemberCount})");
break;
}
2018-05-11 00:36:29 +02:00
_logger.Information(LogSource.Geekbot, $"Start Migration for {guild.Name}");
#region Quotes
/**
* Quotes
*/
try
{
var data = _redis.Db.SetScan($"{guild.Id}:Quotes");
2018-05-11 00:36:29 +02:00
foreach (var q in data)
{
try
{
var qd = JsonConvert.DeserializeObject<QuoteObjectDto>(q);
var quote = CreateQuoteObject(guild.Id, qd);
_database.Quotes.Add(quote);
2018-05-14 18:57:07 +02:00
await _database.SaveChangesAsync();
2018-05-11 00:36:29 +02:00
}
catch (Exception e)
2018-05-11 00:36:29 +02:00
{
_logger.Error(LogSource.Geekbot, $"quote failed: {q}", e);
2018-05-11 00:36:29 +02:00
}
}
}
catch (Exception e)
2018-05-11 00:36:29 +02:00
{
_logger.Error(LogSource.Geekbot, "quote migration failed", e);
2018-05-11 00:36:29 +02:00
}
#endregion
#region Karma
/**
* Karma
*/
try
{
var data = _redis.Db.HashGetAll($"{guild.Id}:Karma");
2018-05-11 00:36:29 +02:00
foreach (var q in data)
{
try
{
var user = new KarmaModel()
{
GuildId = guild.Id.AsLong(),
UserId = ulong.Parse(q.Name).AsLong(),
Karma = int.Parse(q.Value),
TimeOut = DateTimeOffset.MinValue
};
_database.Karma.Add(user);
2018-05-14 18:57:07 +02:00
await _database.SaveChangesAsync();
2018-05-11 00:36:29 +02:00
}
catch (Exception e)
2018-05-11 00:36:29 +02:00
{
_logger.Error(LogSource.Geekbot, $"karma failed for: {q.Name}", e);
2018-05-11 00:36:29 +02:00
}
}
}
catch (Exception e)
2018-05-11 00:36:29 +02:00
{
_logger.Error(LogSource.Geekbot, "karma migration failed", e);
2018-05-11 00:36:29 +02:00
}
#endregion
#region Rolls
/**
* Rolls
*/
try
{
var data = _redis.Db.HashGetAll($"{guild.Id}:Rolls");
2018-05-11 00:36:29 +02:00
foreach (var q in data)
{
try
{
var user = new RollsModel()
{
GuildId = guild.Id.AsLong(),
UserId = ulong.Parse(q.Name).AsLong(),
Rolls = int.Parse(q.Value)
};
_database.Rolls.Add(user);
2018-05-14 18:57:07 +02:00
await _database.SaveChangesAsync();
2018-05-11 00:36:29 +02:00
}
catch (Exception e)
2018-05-11 00:36:29 +02:00
{
_logger.Error(LogSource.Geekbot, $"Rolls failed for: {q.Name}", e);
2018-05-11 00:36:29 +02:00
}
}
}
catch (Exception e)
2018-05-11 00:36:29 +02:00
{
_logger.Error(LogSource.Geekbot, "rolls migration failed", e);
2018-05-11 00:36:29 +02:00
}
#endregion
#region Slaps
/**
* Slaps
*/
try
{
var given = _redis.Db.HashGetAll($"{guild.Id}:SlapsGiven");
var gotten = _redis.Db.HashGetAll($"{guild.Id}:SlapsGiven");
2018-05-11 00:36:29 +02:00
foreach (var q in given)
{
try
{
var user = new SlapsModel()
{
GuildId = guild.Id.AsLong(),
UserId = ulong.Parse(q.Name).AsLong(),
Given = int.Parse(q.Value),
Recieved= int.Parse(gotten[long.Parse(q.Name)].Value)
2018-05-11 00:36:29 +02:00
};
_database.Slaps.Add(user);
2018-05-14 18:57:07 +02:00
await _database.SaveChangesAsync();
2018-05-11 00:36:29 +02:00
}
catch (Exception e)
2018-05-11 00:36:29 +02:00
{
_logger.Error(LogSource.Geekbot, $"Slaps failed for: {q.Name}", e);
2018-05-11 00:36:29 +02:00
}
}
}
catch (Exception e)
2018-05-11 00:36:29 +02:00
{
_logger.Error(LogSource.Geekbot, "Slaps migration failed", e);
2018-05-11 00:36:29 +02:00
}
#endregion
#region Messages
/**
* Messages
*/
// try
// {
// var data = _redis.Db.HashGetAll($"{guild.Id}:Messages");
// foreach (var q in data)
// {
// try
// {
// var user = new MessagesModel()
// {
// GuildId = guild.Id.AsLong(),
// UserId = ulong.Parse(q.Name).AsLong(),
// MessageCount= int.Parse(q.Value)
// };
// _database.Messages.Add(user);
// await _database.SaveChangesAsync();
// }
// catch (Exception e)
// {
// _logger.Error(LogSource.Geekbot, $"Messages failed for: {q.Name}", e);
// }
// }
// }
// catch (Exception e)
// {
// _logger.Error(LogSource.Geekbot, "Messages migration failed", e);
// }
2018-05-11 00:36:29 +02:00
#endregion
#region Ships
/**
* Ships
*/
try
{
var data = _redis.Db.HashGetAll($"{guild.Id}:Ships");
2018-05-11 00:36:29 +02:00
var done = new List<string>();
foreach (var q in data)
{
try
{
if (done.Contains(q.Name)) continue;
var split = q.Name.ToString().Split('-');
var user = new ShipsModel()
{
FirstUserId = ulong.Parse(split[0]).AsLong(),
SecondUserId = ulong.Parse(split[1]).AsLong(),
Strength = int.Parse(q.Value)
};
_database.Ships.Add(user);
2018-05-14 18:57:07 +02:00
await _database.SaveChangesAsync();
2018-05-11 00:36:29 +02:00
done.Add(q.Name);
}
catch (Exception e)
2018-05-11 00:36:29 +02:00
{
_logger.Error(LogSource.Geekbot, $"Ships failed for: {q.Name}", e);
2018-05-11 00:36:29 +02:00
}
}
}
catch (Exception e)
2018-05-11 00:36:29 +02:00
{
_logger.Error(LogSource.Geekbot, "Ships migration failed", e);
2018-05-11 00:36:29 +02:00
}
#endregion
2018-05-13 21:33:48 +02:00
#region GuildSettings
/**
* Users
*/
try
{
var data = _redis.Db.HashGetAll($"{guild.Id}:Settings");
2018-05-13 21:33:48 +02:00
var settings = new GuildSettingsModel()
{
GuildId = guild.Id.AsLong(),
Hui = true
};
foreach (var setting in data)
{
try
{
switch (setting.Name)
{
case "ShowLeave":
settings.ShowLeave = setting.Value.ToString() == "1";
break;
case "ShowDelete":
2018-05-13 21:33:48 +02:00
settings.ShowDelete = setting.Value.ToString() == "1";
break;
case "WikiLang":
settings.WikiLang = setting.Value.ToString();
break;
case "Language":
settings.Language = setting.Value.ToString();
break;
case "WelcomeMsg":
settings.WelcomeMessage = setting.Value.ToString();
break;
case "ping":
settings.Ping = bool.Parse(setting.Value.ToString());
break;
case "ModChannel":
settings.ModChannel = long.Parse(setting.Value);
break;
}
}
catch (Exception e)
2018-05-13 21:33:48 +02:00
{
_logger.Error(LogSource.Geekbot, $"Setting failed: {setting.Name} - {guild.Id}", e);
2018-05-13 21:33:48 +02:00
}
}
}
catch (Exception e)
2018-05-13 21:33:48 +02:00
{
_logger.Error(LogSource.Geekbot, "Settings migration failed", e);
2018-05-13 21:33:48 +02:00
}
#endregion
2018-05-11 00:36:29 +02:00
#region Users
/**
* Users
*/
try
{
var data = guild.Users;
foreach (var user in data)
{
try
{
if (user.Username == null)
{
await Task.Delay(100);
if (user.Username == null) break;
}
var namesSerialized = _redis.Db.HashGet($"User:{user.Id}", "UsedNames").ToString();
var names = namesSerialized != null
? Utf8Json.JsonSerializer.Deserialize<string[]>(namesSerialized)
: new string[] {user.Username};
2018-05-13 14:14:50 +02:00
_database.Users.AddIfNotExists(new UserModel()
{
UserId = user.Id.AsLong(),
Username = user.Username,
Discriminator = user.Discriminator,
AvatarUrl = user.GetAvatarUrl(ImageFormat.Auto, 1024),
IsBot = user.IsBot,
Joined = user.CreatedAt,
UsedNames = names.Select(name => new UserUsedNamesModel() {Name = name, FirstSeen = DateTimeOffset.Now}).ToList()
2018-05-13 14:14:50 +02:00
}, model => model.UserId.Equals(user.Id.AsLong()));
2018-05-14 18:57:07 +02:00
await _database.SaveChangesAsync();
2018-05-11 00:36:29 +02:00
}
catch (Exception e)
2018-05-11 00:36:29 +02:00
{
_logger.Error(LogSource.Geekbot, $"User failed: {user.Username}", e);
2018-05-11 00:36:29 +02:00
}
}
}
catch (Exception e)
2018-05-11 00:36:29 +02:00
{
_logger.Error(LogSource.Geekbot, "User migration failed", e);
2018-05-11 00:36:29 +02:00
}
#endregion
#region Guilds
try
{
_database.Guilds.Add(new GuildsModel
{
CreatedAt = guild.CreatedAt,
GuildId = guild.Id.AsLong(),
IconUrl = guild?.IconUrl,
Name = guild.Name,
Owner = guild.Owner.Id.AsLong()
});
await _database.SaveChangesAsync();
}
catch (Exception e)
2018-05-11 00:36:29 +02:00
{
_logger.Error(LogSource.Geekbot, $"Guild migration failed: {guild.Name}", e);
}
2018-05-11 00:36:29 +02:00
#endregion
_logger.Information(LogSource.Geekbot, $"Finished Migration for {guild.Name}");
await Task.Delay(1000);
2018-05-11 00:36:29 +02:00
}
_logger.Information(LogSource.Geekbot, "Finished migration process");
}
private QuoteModel CreateQuoteObject(ulong guild, QuoteObjectDto quote)
{
var last = _database.Quotes.Where(e => e.GuildId.Equals(guild.AsLong()))
.OrderByDescending(e => e.InternalId).FirstOrDefault();
int internalId = 1;
if (last != null) internalId = last.InternalId + 1;
return new QuoteModel()
{
InternalId = internalId,
GuildId = guild.AsLong(),
UserId = quote.UserId.AsLong(),
Time = quote.Time,
Quote = quote.Quote,
Image = quote.Image
};
}
}
}