From 3f1800bb0ccedb824417f37c434eca6bd94333fe Mon Sep 17 00:00:00 2001 From: Nikolay Kochulin Date: Mon, 9 Dec 2019 08:53:19 +0000 Subject: [PATCH] Seperate db from RequestContext --- JetKarmaBot/Commands/AwardCommand.cs | 3 ++- JetKarmaBot/Commands/ChangeLocaleCommand.cs | 3 ++- JetKarmaBot/Commands/CurrenciesCommand.cs | 4 ++-- JetKarmaBot/Commands/HelpCommand.cs | 3 ++- JetKarmaBot/Commands/LeaderboardCommand.cs | 3 ++- JetKarmaBot/Commands/StatusCommand.cs | 3 ++- JetKarmaBot/JetKarmaBot.cs | 12 +++-------- .../Services/Handling/DatabaseHandler.cs | 20 +++++++++++++++++++ .../Services/Handling/RequestContext.cs | 4 +--- JetKarmaBot/Services/Handling/SaveData.cs | 2 +- .../Services/Handling/TimeoutManager.cs | 7 ++++--- 11 files changed, 41 insertions(+), 23 deletions(-) create mode 100644 JetKarmaBot/Services/Handling/DatabaseHandler.cs diff --git a/JetKarmaBot/Commands/AwardCommand.cs b/JetKarmaBot/Commands/AwardCommand.cs index fc9bda3..8ddf800 100644 --- a/JetKarmaBot/Commands/AwardCommand.cs +++ b/JetKarmaBot/Commands/AwardCommand.cs @@ -6,6 +6,7 @@ using JetKarmaBot.Services.Handling; using NLog; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; +using JetKarmaBot.Models; namespace JetKarmaBot.Commands { @@ -16,7 +17,7 @@ namespace JetKarmaBot.Commands public async Task Execute(RequestContext ctx) { - var db = ctx.Database; + var db = ctx.GetFeature(); var currentLocale = Locale[(await db.Chats.FindAsync(ctx.EventArgs.Message.Chat.Id)).Locale]; var awarder = ctx.EventArgs.Message.From; diff --git a/JetKarmaBot/Commands/ChangeLocaleCommand.cs b/JetKarmaBot/Commands/ChangeLocaleCommand.cs index 6ff646a..803e056 100644 --- a/JetKarmaBot/Commands/ChangeLocaleCommand.cs +++ b/JetKarmaBot/Commands/ChangeLocaleCommand.cs @@ -4,6 +4,7 @@ using JetKarmaBot.Services.Handling; using NLog; using System.Linq; using System.Threading.Tasks; +using JetKarmaBot.Models; namespace JetKarmaBot.Commands { @@ -14,7 +15,7 @@ namespace JetKarmaBot.Commands public async Task Execute(RequestContext ctx) { - var db = ctx.Database; + var db = ctx.GetFeature(); var cmd = ctx.Command; var args = ctx.EventArgs; diff --git a/JetKarmaBot/Commands/CurrenciesCommand.cs b/JetKarmaBot/Commands/CurrenciesCommand.cs index cbe165e..c720c69 100644 --- a/JetKarmaBot/Commands/CurrenciesCommand.cs +++ b/JetKarmaBot/Commands/CurrenciesCommand.cs @@ -1,10 +1,10 @@ using System.Collections.Generic; using Perfusion; using JetKarmaBot.Services.Handling; -using Telegram.Bot.Types.Enums; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; +using JetKarmaBot.Models; namespace JetKarmaBot.Commands { @@ -21,7 +21,7 @@ namespace JetKarmaBot.Commands public async Task Execute(RequestContext ctx) { - var db = ctx.Database; + var db = ctx.GetFeature(); var currentLocale = Locale[(await db.Chats.FindAsync(ctx.EventArgs.Message.Chat.Id)).Locale]; await ctx.SendMessage( currentLocale["jetkarmabot.currencies.listtext"] + "\n" + string.Join("\n", diff --git a/JetKarmaBot/Commands/HelpCommand.cs b/JetKarmaBot/Commands/HelpCommand.cs index a5bc9f1..bca1157 100644 --- a/JetKarmaBot/Commands/HelpCommand.cs +++ b/JetKarmaBot/Commands/HelpCommand.cs @@ -3,6 +3,7 @@ using Perfusion; using JetKarmaBot.Services.Handling; using Telegram.Bot.Types.Enums; using System.Threading.Tasks; +using JetKarmaBot.Models; namespace JetKarmaBot.Commands { @@ -26,7 +27,7 @@ namespace JetKarmaBot.Commands public async Task Execute(RequestContext ctx) { - var db = ctx.Database; + var db = ctx.GetFeature(); var currentLocale = Locale[(await db.Chats.FindAsync(ctx.EventArgs.Message.Chat.Id)).Locale]; var router = ctx.GetFeature().Router; if (ctx.Command.Parameters.Length < 1) diff --git a/JetKarmaBot/Commands/LeaderboardCommand.cs b/JetKarmaBot/Commands/LeaderboardCommand.cs index dc03d4c..522b78c 100644 --- a/JetKarmaBot/Commands/LeaderboardCommand.cs +++ b/JetKarmaBot/Commands/LeaderboardCommand.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Perfusion; using JetKarmaBot.Services.Handling; +using JetKarmaBot.Models; namespace JetKarmaBot.Commands { @@ -13,7 +14,7 @@ namespace JetKarmaBot.Commands public async Task Execute(RequestContext ctx) { - var db = ctx.Database; + var db = ctx.GetFeature(); var currentLocale = Locale[(await db.Chats.FindAsync(ctx.EventArgs.Message.Chat.Id)).Locale]; var asker = ctx.EventArgs.Message.From; var awardTypeName = ctx.Command.Parameters.FirstOrDefault(); diff --git a/JetKarmaBot/Commands/StatusCommand.cs b/JetKarmaBot/Commands/StatusCommand.cs index fbe686f..8ad0d53 100644 --- a/JetKarmaBot/Commands/StatusCommand.cs +++ b/JetKarmaBot/Commands/StatusCommand.cs @@ -4,6 +4,7 @@ using Perfusion; using JetKarmaBot.Services.Handling; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; +using JetKarmaBot.Models; namespace JetKarmaBot.Commands { @@ -13,7 +14,7 @@ namespace JetKarmaBot.Commands public async Task Execute(RequestContext ctx) { - var db = ctx.Database; + var db = ctx.GetFeature(); var currentLocale = Locale[(await db.Chats.FindAsync(ctx.EventArgs.Message.Chat.Id)).Locale]; var asker = ctx.EventArgs.Message.From; var awardTypeName = ctx.Command.Parameters.FirstOrDefault(); diff --git a/JetKarmaBot/JetKarmaBot.cs b/JetKarmaBot/JetKarmaBot.cs index e650189..80781fc 100644 --- a/JetKarmaBot/JetKarmaBot.cs +++ b/JetKarmaBot/JetKarmaBot.cs @@ -75,15 +75,8 @@ namespace JetKarmaBot if (cmd.UserName != null && cmd.UserName != Commands.Me.Username) return; - Task.Run(async () => - { - using (KarmaContext db = Db.GetContext()) - { - RequestContext ctx = new RequestContext(Client, args, cmd, db); - await Chain.Handle(ctx); - await db.SaveChangesAsync(); - } - }); + RequestContext ctx = new RequestContext(Client, args, cmd); + _ = Chain.Handle(ctx); } async Task InitCommands(IContainer c) @@ -105,6 +98,7 @@ namespace JetKarmaBot void InitChain(IContainer c) { Chain = new RequestChain(); + Chain.Add(c.GetInstance()); Chain.Add(Timeout); Chain.Add(new SaveData()); Chain.Add(Commands); diff --git a/JetKarmaBot/Services/Handling/DatabaseHandler.cs b/JetKarmaBot/Services/Handling/DatabaseHandler.cs new file mode 100644 index 0000000..d13bcd3 --- /dev/null +++ b/JetKarmaBot/Services/Handling/DatabaseHandler.cs @@ -0,0 +1,20 @@ +using System; +using System.Threading.Tasks; +using Perfusion; + +namespace JetKarmaBot.Services.Handling +{ + public class DatabaseHandler : IRequestHandler + { + [Inject] private KarmaContextFactory Db; + public async Task Handle(RequestContext ctx, Func next) + { + using (var db = Db.GetContext()) + { + ctx.Features.Add(db); + await next(ctx); + await db.SaveChangesAsync(); + } + } + } +} \ No newline at end of file diff --git a/JetKarmaBot/Services/Handling/RequestContext.cs b/JetKarmaBot/Services/Handling/RequestContext.cs index 84b0d41..5481f0c 100644 --- a/JetKarmaBot/Services/Handling/RequestContext.cs +++ b/JetKarmaBot/Services/Handling/RequestContext.cs @@ -14,14 +14,12 @@ namespace JetKarmaBot.Services.Handling public ITelegramBotClient Client { get; } public MessageEventArgs EventArgs { get; } public CommandString Command { get; } - public KarmaContext Database { get; } public ICollection Features { get; } = new List(); - public RequestContext(ITelegramBotClient client, MessageEventArgs args, CommandString cmd, KarmaContext db) + public RequestContext(ITelegramBotClient client, MessageEventArgs args, CommandString cmd) { Client = client; EventArgs = args; Command = cmd; - Database = db; } public object GetService(Type serviceType) => Features.First(x => x.GetType() == serviceType); public T GetFeature() => (T)Features.First(x => x is T); diff --git a/JetKarmaBot/Services/Handling/SaveData.cs b/JetKarmaBot/Services/Handling/SaveData.cs index 5b16a02..5c0130c 100644 --- a/JetKarmaBot/Services/Handling/SaveData.cs +++ b/JetKarmaBot/Services/Handling/SaveData.cs @@ -9,7 +9,7 @@ namespace JetKarmaBot.Services.Handling { public async Task Handle(RequestContext ctx, Func next) { - KarmaContext db = ctx.Database; + KarmaContext db = ctx.GetFeature(); await AddUserToDatabase(db, ctx.EventArgs.Message.From); if (ctx.EventArgs.Message.ReplyToMessage != null) await AddUserToDatabase(db, ctx.EventArgs.Message.ReplyToMessage.From); diff --git a/JetKarmaBot/Services/Handling/TimeoutManager.cs b/JetKarmaBot/Services/Handling/TimeoutManager.cs index 9288561..2f6faf5 100644 --- a/JetKarmaBot/Services/Handling/TimeoutManager.cs +++ b/JetKarmaBot/Services/Handling/TimeoutManager.cs @@ -74,13 +74,14 @@ namespace JetKarmaBot.Services.Handling public async Task Handle(RequestContext ctx, Func next) { int uid = ctx.EventArgs.Message.From.Id; - await PopulateStats(uid, ctx.Database); + KarmaContext db = ctx.GetFeature(); + await PopulateStats(uid, db); DateTime debtLimit = DateTime.Now.AddSeconds(cfg.Timeout.DebtLimitSeconds); if (debtLimit < TimeoutCache[uid].CooldownDate) { if (!TimeoutCache[uid].TimeoutMessaged) { - Locale currentLocale = Locale[(await ctx.Database.Chats.FindAsync(ctx.EventArgs.Message.Chat.Id)).Locale]; + Locale currentLocale = Locale[(await db.Chats.FindAsync(ctx.EventArgs.Message.Chat.Id)).Locale]; await ctx.SendMessage(currentLocale["jetkarmabot.ratelimit"]); TimeoutCache[uid] = new TimeoutStats() { TimeoutMessaged = true, CooldownDate = TimeoutCache[uid].CooldownDate }; } @@ -90,7 +91,7 @@ namespace JetKarmaBot.Services.Handling await next(ctx); var routerFeature = ctx.GetFeature(); - await ApplyCost(getTypeName(routerFeature.CommandType), routerFeature.Succeded, uid, ctx.Database); + await ApplyCost(getTypeName(routerFeature.CommandType), routerFeature.Succeded, uid, db); } private string getTypeName(Type t) {