From 5c19869186ecec617f4302d4c02ac11722a81e53 Mon Sep 17 00:00:00 2001 From: Nikolay Kochulin Date: Tue, 9 Jul 2019 22:44:58 +0300 Subject: [PATCH] Add /leaderboard command --- JetKarmaBot/Commands/LeaderboardCommand.cs | 75 ++++++++++++++++++++++ JetKarmaBot/JetKarmaBot.cs | 5 +- JetKarmaBot/lang/be-BY.json | 6 +- JetKarmaBot/lang/en-US.json | 6 +- JetKarmaBot/lang/ru-RU.json | 6 +- 5 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 JetKarmaBot/Commands/LeaderboardCommand.cs diff --git a/JetKarmaBot/Commands/LeaderboardCommand.cs b/JetKarmaBot/Commands/LeaderboardCommand.cs new file mode 100644 index 0000000..922eeee --- /dev/null +++ b/JetKarmaBot/Commands/LeaderboardCommand.cs @@ -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 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 Arguments => new ChatCommandArgument[] { + new ChatCommandArgument() { + Name="awardtype", + Required=true, + Type=ChatCommandArgumentType.String, + Description="The awardtype to show a leaderboard for.", + DescriptionID= "jetkarmabot.leaderboard.awardtypehelp" + } + }; + } +} diff --git a/JetKarmaBot/JetKarmaBot.cs b/JetKarmaBot/JetKarmaBot.cs index 303aed5..f0bfe99 100644 --- a/JetKarmaBot/JetKarmaBot.cs +++ b/JetKarmaBot/JetKarmaBot.cs @@ -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 diff --git a/JetKarmaBot/lang/be-BY.json b/JetKarmaBot/lang/be-BY.json index 64896fb..6e1e596 100644 --- a/JetKarmaBot/lang/be-BY.json +++ b/JetKarmaBot/lang/be-BY.json @@ -33,6 +33,10 @@ "jetkarmabot.help.commandhelp": "Каманда, да якой трэба паказаць інструкцыю. Калі пуста, то паказваецца спіс каманд.", "jetkarmabot.currencies.help": "Паказвае ўсе тыпы узнагарод", "jetkarmabot.currencies.listtext": "Тыпы узнагарод:", + "jetkarmabot.leaderboard.help": "", + "jetkarmabot.leaderboard.awardtypehelp": "", + "jetkarmabot.leaderboard.noallawardtypes": "", + "jetkarmabot.leaderboard.specifictext": "", "jetkarmabot.awardtypes.nominative.star": "зорачка", "jetkarmabot.awardtypes.nominative.pie": "з паліцы піражок", "jetkarmabot.awardtypes.nominative.dream": "мара", @@ -46,4 +50,4 @@ "jetkarmabot.awardtypes.accusative.determination": "DETERMINATION", "jetkarmabot.awardtypes.accusative.raisin": "разыначкі" } -} \ No newline at end of file +} diff --git a/JetKarmaBot/lang/en-US.json b/JetKarmaBot/lang/en-US.json index be6d96f..fa6fbde 100644 --- a/JetKarmaBot/lang/en-US.json +++ b/JetKarmaBot/lang/en-US.json @@ -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", @@ -45,4 +49,4 @@ "jetkarmabot.awardtypes.accusative.determination": "DETERMINATION", "jetkarmabot.awardtypes.accusative.raisin": "raisin" } -} \ No newline at end of file +} diff --git a/JetKarmaBot/lang/ru-RU.json b/JetKarmaBot/lang/ru-RU.json index e854a59..47e644e 100644 --- a/JetKarmaBot/lang/ru-RU.json +++ b/JetKarmaBot/lang/ru-RU.json @@ -32,6 +32,10 @@ "jetkarmabot.help.commandhelp": "Команда, к которой нужно показать инструкцию. Если пусто, то показывается список команд.", "jetkarmabot.currencies.help": "Показывает все типы наград", "jetkarmabot.currencies.listtext": "Типы наград:", + "jetkarmabot.leaderboard.help": "", + "jetkarmabot.leaderboard.awardtypehelp": "", + "jetkarmabot.leaderboard.noallawardtypes": "", + "jetkarmabot.leaderboard.specifictext": "", "jetkarmabot.awardtypes.nominative.star": "звездочка", "jetkarmabot.awardtypes.nominative.pie": "с полки пирожок", "jetkarmabot.awardtypes.nominative.dream": "мечта", @@ -45,4 +49,4 @@ "jetkarmabot.awardtypes.accusative.determination": "РЕШИТЕЛЬНОСТЬ", "jetkarmabot.awardtypes.accusative.raisin": "изюм" } -} \ No newline at end of file +}