Add Message migration script
This commit is contained in:
parent
a8c91c0372
commit
fce6be56e2
5 changed files with 132 additions and 36 deletions
8
Geekbot.net/Commands/Admin/Owner/MigrationMethods.cs
Normal file
8
Geekbot.net/Commands/Admin/Owner/MigrationMethods.cs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
namespace Geekbot.net.Commands.Admin.Owner
|
||||||
|
{
|
||||||
|
public enum MigrationMethods
|
||||||
|
{
|
||||||
|
redis,
|
||||||
|
messages
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,7 +9,7 @@ using Geekbot.net.Lib.GlobalSettings;
|
||||||
using Geekbot.net.Lib.Logger;
|
using Geekbot.net.Lib.Logger;
|
||||||
using Geekbot.net.Lib.UserRepository;
|
using Geekbot.net.Lib.UserRepository;
|
||||||
|
|
||||||
namespace Geekbot.net.Commands.Admin
|
namespace Geekbot.net.Commands.Admin.Owner
|
||||||
{
|
{
|
||||||
[Group("owner")]
|
[Group("owner")]
|
||||||
[RequireOwner]
|
[RequireOwner]
|
||||||
|
@ -35,27 +35,42 @@ namespace Geekbot.net.Commands.Admin
|
||||||
}
|
}
|
||||||
|
|
||||||
[Command("migrate", RunMode = RunMode.Async)]
|
[Command("migrate", RunMode = RunMode.Async)]
|
||||||
public async Task Migrate(string force = "")
|
public async Task Migrate(MigrationMethods method, string force = "")
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var status = _globalSettings.GetKey("MigrationStatus");
|
switch (method)
|
||||||
if (status.Equals("Running"))
|
|
||||||
{
|
{
|
||||||
await ReplyAsync("Migration already running");
|
case MigrationMethods.redis:
|
||||||
return;
|
var status = _globalSettings.GetKey("MigrationStatus");
|
||||||
}
|
if (status.Equals("Running"))
|
||||||
if (status.Equals("Done") && !force.Equals("force"))
|
{
|
||||||
{
|
await ReplyAsync("Migration already running");
|
||||||
await ReplyAsync("Migration already ran, write `!owner migrate force` to run again");
|
return;
|
||||||
return;
|
}
|
||||||
}
|
if (status.Equals("Done") && !force.Equals("force"))
|
||||||
|
{
|
||||||
|
await ReplyAsync("Migration already ran, write `!owner migrate redis force` to run again");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
await ReplyAsync("starting migration");
|
await ReplyAsync("starting migration");
|
||||||
await _globalSettings.SetKey("MigrationStatus", "Running");
|
await _globalSettings.SetKey("MigrationStatus", "Running");
|
||||||
var redisMigration = new RedisMigration(_database, _redis, _logger, _client);
|
var redisMigration = new RedisMigration(_database, _redis, _logger, _client);
|
||||||
await redisMigration.Migrate();
|
await redisMigration.Migrate();
|
||||||
await _globalSettings.SetKey("MigrationStatus", "Done");
|
await _globalSettings.SetKey("MigrationStatus", "Done");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MigrationMethods.messages:
|
||||||
|
await ReplyAsync("Migrating Messages to postgres...");
|
||||||
|
var messageMigration = new MessageMigration(_database, _redis, _logger);
|
||||||
|
await messageMigration.Migrate();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
await ReplyAsync("No Migration Method specified...");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
|
@ -151,17 +151,17 @@ namespace Geekbot.net.Commands.User.Ranking
|
||||||
|
|
||||||
private Dictionary<ulong, int> GetMessageList(int amount)
|
private Dictionary<ulong, int> GetMessageList(int amount)
|
||||||
{
|
{
|
||||||
// return _database.Messages
|
return _database.Messages
|
||||||
// .Where(k => k.GuildId.Equals(Context.Guild.Id.AsLong()))
|
.Where(k => k.GuildId.Equals(Context.Guild.Id.AsLong()))
|
||||||
// .OrderByDescending(o => o.MessageCount)
|
.OrderByDescending(o => o.MessageCount)
|
||||||
// .Take(amount)
|
|
||||||
// .ToDictionary(key => key.UserId.AsUlong(), key => key.MessageCount);
|
|
||||||
return _redis.Db
|
|
||||||
.HashGetAll($"{Context.Guild.Id}:Messages")
|
|
||||||
.Where(user => !user.Name.Equals(0))
|
|
||||||
.OrderByDescending(s => s.Value)
|
|
||||||
.Take(amount)
|
.Take(amount)
|
||||||
.ToDictionary(user => ulong.Parse(user.Name), user => int.Parse(user.Value));
|
.ToDictionary(key => key.UserId.AsUlong(), key => key.MessageCount);
|
||||||
|
// return _redis.Db
|
||||||
|
// .HashGetAll($"{Context.Guild.Id}:Messages")
|
||||||
|
// .Where(user => !user.Name.Equals(0))
|
||||||
|
// .OrderByDescending(s => s.Value)
|
||||||
|
// .Take(amount)
|
||||||
|
// .ToDictionary(user => ulong.Parse(user.Name), user => int.Parse(user.Value));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Dictionary<ulong, int> GetKarmaList(int amount)
|
private Dictionary<ulong, int> GetKarmaList(int amount)
|
||||||
|
|
|
@ -39,15 +39,15 @@ namespace Geekbot.net.Commands.User
|
||||||
var age = Math.Floor((DateTime.Now - createdAt).TotalDays);
|
var age = Math.Floor((DateTime.Now - createdAt).TotalDays);
|
||||||
var joinedDayAgo = Math.Floor((DateTime.Now - joinedAt).TotalDays);
|
var joinedDayAgo = Math.Floor((DateTime.Now - joinedAt).TotalDays);
|
||||||
|
|
||||||
// var messages = _database.Messages
|
var messages = _database.Messages
|
||||||
// .First(e => e.GuildId.Equals(Context.Guild.Id.AsLong()) && e.UserId.Equals(Context.User.Id.AsLong()))
|
.First(e => e.GuildId.Equals(Context.Guild.Id.AsLong()) && e.UserId.Equals(Context.User.Id.AsLong()))
|
||||||
// .MessageCount;
|
.MessageCount;
|
||||||
// var guildMessages = _database.Messages
|
var guildMessages = _database.Messages
|
||||||
// .Where(e => e.GuildId.Equals(Context.Guild.Id.AsLong()))
|
.Where(e => e.GuildId.Equals(Context.Guild.Id.AsLong()))
|
||||||
// .Select(e => e.MessageCount)
|
.Select(e => e.MessageCount)
|
||||||
// .Sum();
|
.Sum();
|
||||||
var messages = (int) _redis.Db.HashGet($"{Context.Guild.Id}:Messages", userInfo.Id.ToString());
|
// var messages = (int) _redis.Db.HashGet($"{Context.Guild.Id}:Messages", userInfo.Id.ToString());
|
||||||
var guildMessages = (int) _redis.Db.HashGet($"{Context.Guild.Id}:Messages", 0.ToString());
|
// var guildMessages = (int) _redis.Db.HashGet($"{Context.Guild.Id}:Messages", 0.ToString());
|
||||||
var level = _levelCalc.GetLevel(messages);
|
var level = _levelCalc.GetLevel(messages);
|
||||||
|
|
||||||
var percent = Math.Round((double) (100 * messages) / guildMessages, 2);
|
var percent = Math.Round((double) (100 * messages) / guildMessages, 2);
|
||||||
|
|
73
Geekbot.net/Database/MessageMigration.cs
Normal file
73
Geekbot.net/Database/MessageMigration.cs
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Geekbot.net.Database.Models;
|
||||||
|
using Geekbot.net.Lib.AlmostRedis;
|
||||||
|
using Geekbot.net.Lib.Extensions;
|
||||||
|
using Geekbot.net.Lib.Logger;
|
||||||
|
|
||||||
|
namespace Geekbot.net.Database
|
||||||
|
{
|
||||||
|
public class MessageMigration
|
||||||
|
{
|
||||||
|
private readonly DatabaseContext _database;
|
||||||
|
private readonly IAlmostRedis _redis;
|
||||||
|
private readonly IGeekbotLogger _logger;
|
||||||
|
|
||||||
|
public MessageMigration(DatabaseContext database, IAlmostRedis redis, IGeekbotLogger logger)
|
||||||
|
{
|
||||||
|
_database = database;
|
||||||
|
_redis = redis;
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task Migrate()
|
||||||
|
{
|
||||||
|
_logger.Warning(LogSource.Migration, "Starting message migration");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var messageKeys = _redis.GetAllKeys().Where(e => e.ToString().EndsWith("Messages"));
|
||||||
|
foreach (var keyName in messageKeys)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var guildId = ulong.Parse(keyName.ToString().Split(':').FirstOrDefault());
|
||||||
|
var guildUsers = _redis.Db.HashGetAll(keyName);
|
||||||
|
foreach (var user in guildUsers)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var userId = ulong.Parse(user.Name);
|
||||||
|
if (userId != 0)
|
||||||
|
{
|
||||||
|
var userMessages = int.Parse(user.Value);
|
||||||
|
_database.Messages.Add(new MessagesModel
|
||||||
|
{
|
||||||
|
UserId = userId.AsLong(),
|
||||||
|
GuildId = guildId.AsLong(),
|
||||||
|
MessageCount = userMessages
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_logger.Error(LogSource.Migration, $"Failed to add record for a user in {guildId}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await _database.SaveChangesAsync();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_logger.Error(LogSource.Migration, "Failed to determinate guild", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_logger.Warning(LogSource.Migration, "Successfully finished message migration");
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_logger.Error(LogSource.Migration, "Message migration failed", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue