Add /leaderboard command

This commit is contained in:
Basique Evangelist 2019-07-09 22:44:58 +03:00
parent dbbc616c8c
commit 92e996e599
Signed by untrusted user: BasiqueEvangelist
GPG Key ID: B370219149301706
5 changed files with 93 additions and 5 deletions

View File

@ -0,0 +1,75 @@
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Perfusion;
using Telegram.Bot;
using Telegram.Bot.Args;
using Telegram.Bot.Types;
using JetKarmaBot.Models;
using JetKarmaBot.Services;
namespace JetKarmaBot.Commands
{
class LeaderboardCommand : IChatCommand
{
public IReadOnlyCollection<string> Names => new[] { "leaderboard" };
public bool Execute(CommandString cmd, MessageEventArgs args)
{
using (var db = Db.GetContext())
{
var currentLocale = Locale[db.Chats.Find(args.Message.Chat.Id).Locale];
var asker = args.Message.From;
var awardTypeName = cmd.Parameters.FirstOrDefault();
string response;
if (string.IsNullOrWhiteSpace(awardTypeName))
response = currentLocale["jetkarmabot.leaderboard.noallawardtypes"];
else
{
var awardTypeIdQuery = from awt in db.AwardTypes
where awt.CommandName == awardTypeName
select awt.AwardTypeId;
var awardTypeId = awardTypeIdQuery.First();
var awardType = db.AwardTypes.Find(awardTypeId);
response = string.Format(currentLocale["jetkarmabot.leaderboard.specifictext"], awardType.Symbol) + "\n" + string.Join(' ', db.Awards
.Where(x => x.ChatId == args.Message.Chat.Id && x.AwardTypeId == awardTypeId)
.GroupBy(x => x.ToId)
.Select(x => new {UserId = x.Key, Amount = x.Sum(y => y.Amount)})
.OrderByDescending(x => x.Amount)
.Take(5)
.ToList()
.Select((x,index) => $"{index+1}. {db.Users.Find(x.UserId).Username} - {x.Amount}"));
}
Client.SendTextMessageAsync(
args.Message.Chat.Id,
response,
replyToMessageId: args.Message.MessageId);
return true;
}
}
[Inject] KarmaContextFactory Db { get; set; }
[Inject] TelegramBotClient Client { get; set; }
[Inject] Localization Locale { get; set; }
public string Description => "Shows the people with the most of a specific award.";
public string DescriptionID => "jetkarmabot.leaderboard.help";
public IReadOnlyCollection<ChatCommandArgument> Arguments => new ChatCommandArgument[] {
new ChatCommandArgument() {
Name="awardtype",
Required=true,
Type=ChatCommandArgumentType.String,
Description="The awardtype to show a leaderboard for.",
DescriptionID= "jetkarmabot.leaderboard.awardtypehelp"
}
};
}
}

View File

@ -58,10 +58,10 @@ namespace JetKarmaBot
using (KarmaContext db = Db.GetContext())
{
if (!db.Users.Any(x => x.UserId == messageEventArgs.Message.From.Id))
db.Users.Add(new Models.User { UserId = messageEventArgs.Message.From.Id });
db.Users.Add(new Models.User { UserId = messageEventArgs.Message.From.Id, Username = messageEventArgs.Message.From.Username});
if (messageEventArgs.Message.ReplyToMessage != null)
if (!db.Users.Any(x => x.UserId == messageEventArgs.Message.ReplyToMessage.From.Id))
db.Users.Add(new Models.User { UserId = messageEventArgs.Message.ReplyToMessage.From.Id });
db.Users.Add(new Models.User { UserId = messageEventArgs.Message.ReplyToMessage.From.Id, Username = messageEventArgs.Message.ReplyToMessage.From.Username });
if (!db.Chats.Any(x => x.ChatId == messageEventArgs.Message.Chat.Id))
db.Chats.Add(new Models.Chat { ChatId = messageEventArgs.Message.Chat.Id });
db.SaveChanges();
@ -80,6 +80,7 @@ namespace JetKarmaBot
Commands.Add(c.ResolveObject(new StatusCommand()));
Commands.Add(c.ResolveObject(new LocaleCommand()));
Commands.Add(c.ResolveObject(new CurrenciesCommand()));
Commands.Add(c.ResolveObject(new LeaderboardCommand()));
}
#endregion

View File

@ -33,6 +33,10 @@
"jetkarmabot.help.commandhelp": "Каманда, да якой трэба паказаць інструкцыю. Калі пуста, то паказваецца спіс каманд.",
"jetkarmabot.currencies.help": "Паказвае ўсе тыпы узнагарод",
"jetkarmabot.currencies.listtext": "Тыпы узнагарод:",
"jetkarmabot.leaderboard.help": "<todo>",
"jetkarmabot.leaderboard.awardtypehelp": "<todo>",
"jetkarmabot.leaderboard.noallawardtypes": "<todo>",
"jetkarmabot.leaderboard.specifictext": "<todo>",
"jetkarmabot.awardtypes.nominative.star": "зорачка",
"jetkarmabot.awardtypes.nominative.pie": "з паліцы піражок",
"jetkarmabot.awardtypes.nominative.dream": "мара",

View File

@ -32,6 +32,10 @@
"jetkarmabot.help.commandhelp": "The command to return help text for. If empty shows all commands.",
"jetkarmabot.currencies.help": "Shows all award types",
"jetkarmabot.currencies.listtext": "Award types:",
"jetkarmabot.leaderboard.help": "Shows the people with the most of a specific award.",
"jetkarmabot.leaderboard.awardtypehelp": "The awardtype to show a leaderboard for.",
"jetkarmabot.leaderboard.noallawardtypes": "Sorry, but leaderboards for all award types are not implemented yet.",
"jetkarmabot.leaderboard.specifictext": "Leaderboard for {0}:",
"jetkarmabot.awardtypes.nominative.star": "star",
"jetkarmabot.awardtypes.nominative.pie": "pie from the shelf",
"jetkarmabot.awardtypes.nominative.dream": "dream",

View File

@ -32,6 +32,10 @@
"jetkarmabot.help.commandhelp": "Команда, к которой нужно показать инструкцию. Если пусто, то показывается список команд.",
"jetkarmabot.currencies.help": "Показывает все типы наград",
"jetkarmabot.currencies.listtext": "Типы наград:",
"jetkarmabot.leaderboard.help": "<todo>",
"jetkarmabot.leaderboard.awardtypehelp": "<todo>",
"jetkarmabot.leaderboard.noallawardtypes": "<todo>",
"jetkarmabot.leaderboard.specifictext": "<todo>",
"jetkarmabot.awardtypes.nominative.star": "звездочка",
"jetkarmabot.awardtypes.nominative.pie": "с полки пирожок",
"jetkarmabot.awardtypes.nominative.dream": "мечта",