geekbot/Geekbot.net/Commands/User/Ranking/Rank.cs

116 lines
4.7 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Discord.Commands;
2018-05-10 17:56:43 +02:00
using Geekbot.net.Database;
using Geekbot.net.Lib.CommandPreconditions;
using Geekbot.net.Lib.Converters;
using Geekbot.net.Lib.ErrorHandling;
2018-05-10 17:56:43 +02:00
using Geekbot.net.Lib.Extensions;
using Geekbot.net.Lib.Highscores;
2019-05-12 16:38:43 +02:00
using Geekbot.net.Lib.Localization;
using Geekbot.net.Lib.UserRepository;
2018-05-03 21:20:49 +02:00
namespace Geekbot.net.Commands.User.Ranking
{
public class Rank : ModuleBase
{
2017-12-29 01:53:50 +01:00
private readonly IEmojiConverter _emojiConverter;
private readonly IHighscoreManager _highscoreManager;
2019-05-12 16:38:43 +02:00
private readonly ITranslationHandler _translationHandler;
private readonly IErrorHandler _errorHandler;
2018-05-10 17:56:43 +02:00
private readonly DatabaseContext _database;
private readonly IUserRepository _userRepository;
2017-12-29 01:53:50 +01:00
2018-05-13 21:33:48 +02:00
public Rank(DatabaseContext database, IErrorHandler errorHandler, IUserRepository userRepository,
2019-05-12 16:38:43 +02:00
IEmojiConverter emojiConverter, IHighscoreManager highscoreManager, ITranslationHandler translationHandler)
{
2018-05-10 17:56:43 +02:00
_database = database;
_errorHandler = errorHandler;
_userRepository = userRepository;
2017-11-06 23:55:28 +01:00
_emojiConverter = emojiConverter;
_highscoreManager = highscoreManager;
2019-05-12 16:38:43 +02:00
_translationHandler = translationHandler;
}
2017-12-29 01:53:50 +01:00
[Command("rank", RunMode = RunMode.Async)]
[Summary("get user top 10 in messages or karma")]
[DisableInDirectMessage]
2018-05-03 21:20:49 +02:00
public async Task RankCmd([Summary("type")] string typeUnformated = "messages", [Summary("amount")] int amount = 10)
{
try
{
2019-05-12 16:38:43 +02:00
var transContext = await _translationHandler.GetGuildContext(Context);
HighscoreTypes type;
2018-05-10 17:56:43 +02:00
try
{
type = Enum.Parse<HighscoreTypes>(typeUnformated, true);
if (!Enum.IsDefined(typeof(HighscoreTypes), type)) throw new Exception();
2018-05-10 17:56:43 +02:00
}
catch
{
2019-05-12 16:38:43 +02:00
await ReplyAsync(transContext.GetString("InvalidType"));
return;
}
2017-12-29 01:53:50 +01:00
var replyBuilder = new StringBuilder();
if (amount > 20)
{
2019-05-12 16:38:43 +02:00
await ReplyAsync(transContext.GetString("LimitingTo20Warning"));
amount = 20;
}
2018-05-10 17:56:43 +02:00
var guildId = Context.Guild.Id;
SortedDictionary<HighscoreUserDto, int> highscoreUsers;
try
{
highscoreUsers = _highscoreManager.GetHighscoresWithUserData(type, guildId, amount);
}
catch (HighscoreListEmptyException)
{
2019-05-12 16:38:43 +02:00
await ReplyAsync(transContext.GetString("NoTypeFoundForServer", type));
2018-05-10 17:56:43 +02:00
return;
}
int guildMessages = 0;
if (type == HighscoreTypes.messages)
{
guildMessages = _database.Messages
.Where(e => e.GuildId.Equals(Context.Guild.Id.AsLong()))
.Select(e => e.MessageCount)
.Sum();
}
var failedToRetrieveUser = highscoreUsers.Any(e => string.IsNullOrEmpty(e.Key.Username));
2017-12-29 01:53:50 +01:00
2019-05-12 16:38:43 +02:00
if (failedToRetrieveUser) replyBuilder.AppendLine(transContext.GetString("FailedToResolveAllUsernames"));
replyBuilder.AppendLine(transContext.GetString("HighscoresFor", type.ToString().CapitalizeFirst(), Context.Guild.Name));
var highscorePlace = 1;
foreach (var user in highscoreUsers)
{
replyBuilder.Append(highscorePlace < 11
2018-04-30 23:44:19 +02:00
? $"{_emojiConverter.NumberToEmoji(highscorePlace)} "
: $"`{highscorePlace}.` ");
replyBuilder.Append(user.Key.Username != null
? $"**{user.Key.Username}#{user.Key.Discriminator}**"
: $"**{user.Key.Id}**");
replyBuilder.Append(type == HighscoreTypes.messages
? $" - {user.Value} {type} - {Math.Round((double) (100 * user.Value) / guildMessages, digits: 2)}%\n"
: $" - {user.Value} {type}\n");
2017-12-29 01:53:50 +01:00
highscorePlace++;
}
2017-12-29 01:53:50 +01:00
await ReplyAsync(replyBuilder.ToString());
}
catch (Exception e)
{
await _errorHandler.HandleCommandException(e, Context);
}
}
}
2017-04-12 21:49:04 +02:00
}