From 119f4586c7932fa78618f4343d45256e64a8f11d Mon Sep 17 00:00:00 2001 From: runebaas Date: Fri, 10 May 2019 20:51:13 +0200 Subject: [PATCH 1/2] Add Some Cookies --- Geekbot.net/Commands/Rpg/Cookies.cs | 95 +++++++++++++++++++++ Geekbot.net/Database/DatabaseContext.cs | 1 + Geekbot.net/Database/Models/CookiesModel.cs | 21 +++++ 3 files changed, 117 insertions(+) create mode 100644 Geekbot.net/Commands/Rpg/Cookies.cs create mode 100644 Geekbot.net/Database/Models/CookiesModel.cs diff --git a/Geekbot.net/Commands/Rpg/Cookies.cs b/Geekbot.net/Commands/Rpg/Cookies.cs new file mode 100644 index 0000000..c96d456 --- /dev/null +++ b/Geekbot.net/Commands/Rpg/Cookies.cs @@ -0,0 +1,95 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Discord.Commands; +using Geekbot.net.Database; +using Geekbot.net.Database.Models; +using Geekbot.net.Lib.CommandPreconditions; +using Geekbot.net.Lib.ErrorHandling; +using Geekbot.net.Lib.Extensions; +using Geekbot.net.Lib.Localization; + +namespace Geekbot.net.Commands.Rpg +{ + [DisableInDirectMessage] + [Group("cookie")] + public class Cookies : ModuleBase + { + private readonly DatabaseContext _database; + private readonly IErrorHandler _errorHandler; + private readonly ITranslationHandler _translation; + + public Cookies(DatabaseContext database, IErrorHandler errorHandler, ITranslationHandler translation) + { + _database = database; + _errorHandler = errorHandler; + _translation = translation; + } + + [Command("get", RunMode = RunMode.Async)] + [Summary("Get a cookie every 24 hours")] + public async Task GetCookies() + { + try + { + var actor = await GetUser(Context.User.Id); + if (actor.LastPayout.Value.AddHours(24) > DateTimeOffset.Now) + { + await ReplyAsync($"You already got cookies in the last 24 hours, wait until {actor.LastPayout.Value.AddHours(24):HH:mm:ss} for more cookies"); + return; + } + actor.Cookies += 10; + actor.LastPayout = DateTimeOffset.Now; + await SetUser(actor); + await ReplyAsync($"You got 10 cookies, there are now {actor.Cookies} cookies in you cookie jar"); + + } + catch (Exception e) + { + await _errorHandler.HandleCommandException(e, Context); + } + } + + [Command("jar", RunMode = RunMode.Async)] + [Summary("Look at your cookie jar")] + public async Task PeekIntoCookieJar() + { + try + { + var actor = await GetUser(Context.User.Id); + await ReplyAsync($"There are {actor.Cookies} cookies in you cookie jar"); + + } + catch (Exception e) + { + await _errorHandler.HandleCommandException(e, Context); + } + } + + private async Task GetUser(ulong userId) + { + var user = _database.Cookies.FirstOrDefault(u =>u.GuildId.Equals(Context.Guild.Id.AsLong()) && u.UserId.Equals(userId.AsLong())) ?? await CreateNewRow(userId); + return user; + } + + private async Task SetUser(CookiesModel user) + { + _database.Cookies.Update(user); + await _database.SaveChangesAsync(); + } + + private async Task CreateNewRow(ulong userId) + { + var user = new CookiesModel() + { + GuildId = Context.Guild.Id.AsLong(), + UserId = userId.AsLong(), + Cookies = 0, + LastPayout = DateTimeOffset.MinValue + }; + var newUser = _database.Cookies.Add(user).Entity; + await _database.SaveChangesAsync(); + return newUser; + } + } +} diff --git a/Geekbot.net/Database/DatabaseContext.cs b/Geekbot.net/Database/DatabaseContext.cs index ab786b1..cbfa30d 100644 --- a/Geekbot.net/Database/DatabaseContext.cs +++ b/Geekbot.net/Database/DatabaseContext.cs @@ -17,5 +17,6 @@ namespace Geekbot.net.Database public DbSet Globals { get; set; } public DbSet RoleSelfService { get; set; } public DbSet Polls { get; set; } + public DbSet Cookies { get; set; } } } \ No newline at end of file diff --git a/Geekbot.net/Database/Models/CookiesModel.cs b/Geekbot.net/Database/Models/CookiesModel.cs new file mode 100644 index 0000000..228f3b0 --- /dev/null +++ b/Geekbot.net/Database/Models/CookiesModel.cs @@ -0,0 +1,21 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace Geekbot.net.Database.Models +{ + public class CookiesModel + { + [Key] + public int Id { get; set; } + + [Required] + public long GuildId { get; set; } + + [Required] + public long UserId { get; set; } + + public int Cookies { get; set; } = 0; + + public DateTimeOffset? LastPayout { get; set; } + } +} \ No newline at end of file From efaaf594f0b2b048747576f2e67528c8514134b7 Mon Sep 17 00:00:00 2001 From: runebaas Date: Fri, 10 May 2019 21:10:49 +0200 Subject: [PATCH 2/2] Make sure that stats works with the inmemory database and add cookies --- Geekbot.net/Commands/User/Stats.cs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Geekbot.net/Commands/User/Stats.cs b/Geekbot.net/Commands/User/Stats.cs index 4145d03..6ddf7d4 100644 --- a/Geekbot.net/Commands/User/Stats.cs +++ b/Geekbot.net/Commands/User/Stats.cs @@ -42,17 +42,20 @@ namespace Geekbot.net.Commands.User var joinedDayAgo = Math.Floor((DateTime.Now - joinedAt).TotalDays); var messages = _database.Messages - .First(e => e.GuildId.Equals(Context.Guild.Id.AsLong()) && e.UserId.Equals(userInfo.Id.AsLong())) - .MessageCount; + ?.FirstOrDefault(e => e.GuildId.Equals(Context.Guild.Id.AsLong()) && e.UserId.Equals(userInfo.Id.AsLong())) + ?.MessageCount ?? 0; var guildMessages = _database.Messages - .Where(e => e.GuildId.Equals(Context.Guild.Id.AsLong())) - .Select(e => e.MessageCount) - .Sum(); -// 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()); + ?.Where(e => e.GuildId.Equals(Context.Guild.Id.AsLong())) + .Select(e => e.MessageCount) + .Sum() ?? 0; + var level = _levelCalc.GetLevel(messages); - var percent = Math.Round((double) (100 * messages) / guildMessages, 2); + var percent = Math.Round((double) (100 * messages) / guildMessages, digits: 2); + + var cookies = _database.Cookies + ?.FirstOrDefault(e => e.GuildId.Equals(Context.Guild.Id.AsLong()) && e.UserId.Equals(userInfo.Id.AsLong())) + ?.Cookies ?? 0; var eb = new EmbedBuilder(); eb.WithAuthor(new EmbedAuthorBuilder() @@ -77,6 +80,7 @@ namespace Geekbot.net.Commands.User .AddInlineField("Server Total", $"{percent}%"); if (correctRolls != null) eb.AddInlineField("Guessed Rolls", correctRolls.Rolls); + if (cookies > 0) eb.AddInlineField("Cookies", cookies); await ReplyAsync("", false, eb.Build()); }