From ab658c837a6a945afc3ba948fb4a6a779d519a1d Mon Sep 17 00:00:00 2001 From: Mihinator3000 <70411602+Mihinator3000@users.noreply.github.com> Date: Wed, 31 Aug 2022 23:22:52 +0300 Subject: [PATCH 1/8] refactor: add context abstactions --- .../Abstractions/Contexts/IDialogContext.cs | 2 -- .../Abstractions/Contexts/IDiscordSenderInfo.cs | 6 ++++++ .../Abstractions/Contexts/ISenderInfo.cs | 6 +++++- .../Abstractions/Contexts/ITelegramSenderInfo.cs | 5 +++++ .../Abstractions/Services/IDialogContextProvider.cs | 2 +- .../Abstractions/Visitors/IContextVisitor.cs | 10 ++++++++++ 6 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 Kysect.BotFramework.Abstractions/Abstractions/Contexts/IDiscordSenderInfo.cs create mode 100644 Kysect.BotFramework.Abstractions/Abstractions/Contexts/ITelegramSenderInfo.cs create mode 100644 Kysect.BotFramework.Abstractions/Abstractions/Visitors/IContextVisitor.cs diff --git a/Kysect.BotFramework.Abstractions/Abstractions/Contexts/IDialogContext.cs b/Kysect.BotFramework.Abstractions/Abstractions/Contexts/IDialogContext.cs index 80adc3e..2e0458a 100644 --- a/Kysect.BotFramework.Abstractions/Abstractions/Contexts/IDialogContext.cs +++ b/Kysect.BotFramework.Abstractions/Abstractions/Contexts/IDialogContext.cs @@ -2,7 +2,5 @@ public interface IDialogContext { - ISenderInfo SenderInfo { get; } - int State { get; set; } } \ No newline at end of file diff --git a/Kysect.BotFramework.Abstractions/Abstractions/Contexts/IDiscordSenderInfo.cs b/Kysect.BotFramework.Abstractions/Abstractions/Contexts/IDiscordSenderInfo.cs new file mode 100644 index 0000000..a9f3cd0 --- /dev/null +++ b/Kysect.BotFramework.Abstractions/Abstractions/Contexts/IDiscordSenderInfo.cs @@ -0,0 +1,6 @@ +namespace Kysect.BotFramework.Abstractions.Contexts; + +public interface IDiscordSenderInfo : ISenderInfo +{ + ulong GuildId { get; } +} \ No newline at end of file diff --git a/Kysect.BotFramework.Abstractions/Abstractions/Contexts/ISenderInfo.cs b/Kysect.BotFramework.Abstractions/Abstractions/Contexts/ISenderInfo.cs index 072c621..a986ff7 100644 --- a/Kysect.BotFramework.Abstractions/Abstractions/Contexts/ISenderInfo.cs +++ b/Kysect.BotFramework.Abstractions/Abstractions/Contexts/ISenderInfo.cs @@ -1,4 +1,6 @@ -namespace Kysect.BotFramework.Abstractions.Contexts; +using Kysect.BotFramework.Abstractions.Visitors; + +namespace Kysect.BotFramework.Abstractions.Contexts; public interface ISenderInfo { @@ -6,4 +8,6 @@ public interface ISenderInfo long UserSenderId { get; } string UserSenderUsername { get; } bool IsAdmin { get; } + + TContext Accept(IContextVisitor visitor); } \ No newline at end of file diff --git a/Kysect.BotFramework.Abstractions/Abstractions/Contexts/ITelegramSenderInfo.cs b/Kysect.BotFramework.Abstractions/Abstractions/Contexts/ITelegramSenderInfo.cs new file mode 100644 index 0000000..b76b1f2 --- /dev/null +++ b/Kysect.BotFramework.Abstractions/Abstractions/Contexts/ITelegramSenderInfo.cs @@ -0,0 +1,5 @@ +namespace Kysect.BotFramework.Abstractions.Contexts; + +public interface ITelegramSenderInfo : ISenderInfo +{ +} \ No newline at end of file diff --git a/Kysect.BotFramework.Abstractions/Abstractions/Services/IDialogContextProvider.cs b/Kysect.BotFramework.Abstractions/Abstractions/Services/IDialogContextProvider.cs index 9b34a38..1ac01bb 100644 --- a/Kysect.BotFramework.Abstractions/Abstractions/Services/IDialogContextProvider.cs +++ b/Kysect.BotFramework.Abstractions/Abstractions/Services/IDialogContextProvider.cs @@ -4,5 +4,5 @@ namespace Kysect.BotFramework.Abstactions.Services; public interface IDialogContextProvider { - public IDialogContext GetDialogContext(ISenderInfo senderInfo); + IDialogContext GetDialogContext(ISenderInfo senderInfo); } \ No newline at end of file diff --git a/Kysect.BotFramework.Abstractions/Abstractions/Visitors/IContextVisitor.cs b/Kysect.BotFramework.Abstractions/Abstractions/Visitors/IContextVisitor.cs new file mode 100644 index 0000000..7690010 --- /dev/null +++ b/Kysect.BotFramework.Abstractions/Abstractions/Visitors/IContextVisitor.cs @@ -0,0 +1,10 @@ +using Kysect.BotFramework.Abstractions.Contexts; + +namespace Kysect.BotFramework.Abstractions.Visitors; + +public interface IContextVisitor +{ + TContext Visit(IDiscordSenderInfo senderInfo); + + TContext Visit(ITelegramSenderInfo senderInfo); +} \ No newline at end of file From 6c7b8b608f2d75cb633e1ba82084e6c5495ce076 Mon Sep 17 00:00:00 2001 From: Mihinator3000 <70411602+Mihinator3000@users.noreply.github.com> Date: Wed, 31 Aug 2022 23:25:02 +0300 Subject: [PATCH 2/8] feat: dialog context visitor --- .../ApiProviders/Discord/DiscordSenderInfo.cs | 56 ++++++-------- .../Telegram/TelegramSenderInfo.cs | 49 ++++++------- .../Core/Contexts/DialogContext.cs | 73 +++++++++---------- .../Core/Visitors/DialogContextVisitor.cs | 33 +++++++++ .../Data/Entities/DiscordSenderInfoEntity.cs | 4 +- .../Data/Entities/TelegramSenderInfoEntity.cs | 4 +- 6 files changed, 115 insertions(+), 104 deletions(-) create mode 100644 Kysect.BotFramework/Core/Visitors/DialogContextVisitor.cs diff --git a/Kysect.BotFramework/ApiProviders/Discord/DiscordSenderInfo.cs b/Kysect.BotFramework/ApiProviders/Discord/DiscordSenderInfo.cs index 3acccd8..fd8dfb6 100644 --- a/Kysect.BotFramework/ApiProviders/Discord/DiscordSenderInfo.cs +++ b/Kysect.BotFramework/ApiProviders/Discord/DiscordSenderInfo.cs @@ -1,39 +1,29 @@ using Kysect.BotFramework.Abstractions.Contexts; -using Kysect.BotFramework.Core.Contexts; -using Kysect.BotFramework.Data; -using Kysect.BotFramework.Data.Entities; +using Kysect.BotFramework.Abstractions.Visitors; -namespace Kysect.BotFramework.ApiProviders.Discord +namespace Kysect.BotFramework.ApiProviders.Discord; + +public class DiscordSenderInfo : IDiscordSenderInfo { - public class DiscordSenderInfo : SenderInfo + public DiscordSenderInfo(long chatId, long userSenderId, string userSenderUsername, bool isAdmin, ulong guildId) { - public ulong GuildId { get; } - - internal override ContextType ContextType => ContextType.Discord; - - public DiscordSenderInfo(long chatId, long userSenderId, string userSenderUsername, bool isAdmin, ulong guildId) - : base(chatId, userSenderId, userSenderUsername, isAdmin) - { - GuildId = guildId; - } - - private DiscordSenderInfoEntity ToEntity() - { - var entity = new DiscordSenderInfoEntity - { - GuildId = GuildId, - ChatId = ChatId, - UserSenderId = UserSenderId - }; - return entity; - } - - internal override IDialogContext GetOrCreateDialogContext(BotFrameworkDbContext dbContext) - { - var contextSenderInfo = DiscordSenderInfoEntity.GetOrCreate(this, dbContext); - var contextModel = DialogContextEntity.GetOrCreate(contextSenderInfo, ContextType, dbContext); - - return new DialogContext(contextModel.State, contextModel.SenderInfoId, this, ContextType, dbContext); - } + GuildId = guildId; + ChatId = chatId; + UserSenderId = userSenderId; + UserSenderUsername = userSenderUsername; + IsAdmin = isAdmin; } + + public long ChatId { get; } + + public long UserSenderId { get; } + + public string UserSenderUsername { get; } + + public bool IsAdmin { get; } + + public ulong GuildId { get; } + + public TContext Accept(IContextVisitor visitor) + => visitor.Visit(this); } \ No newline at end of file diff --git a/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs b/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs index b6ad066..901e4b3 100644 --- a/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs +++ b/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs @@ -1,34 +1,27 @@ -using Kysect.BotFramework.Abstractions.Contexts; -using Kysect.BotFramework.Core.Contexts; -using Kysect.BotFramework.Data; -using Kysect.BotFramework.Data.Entities; +using System; +using Kysect.BotFramework.Abstractions.Contexts; +using Kysect.BotFramework.Abstractions.Visitors; -namespace Kysect.BotFramework.ApiProviders.Telegram +namespace Kysect.BotFramework.ApiProviders.Telegram; + +public class TelegramSenderInfo : ITelegramSenderInfo { - public class TelegramSenderInfo : SenderInfo + public TelegramSenderInfo(long chatId, long userSenderId, string userSenderUsername, bool isAdmin) { - internal override ContextType ContextType => ContextType.Telegram; + ChatId = chatId; + UserSenderId = userSenderId; + UserSenderUsername = userSenderUsername; + IsAdmin = isAdmin; + } - public TelegramSenderInfo(long chatId, long userSenderId, string userSenderUsername, bool isAdmin) - : base(chatId, userSenderId, userSenderUsername, isAdmin) - { } - - private TelegramSenderInfoEntity ToEntity() - { - var entity = new TelegramSenderInfoEntity() - { - ChatId = ChatId, - UserSenderId = UserSenderId - }; - return entity; - } + public long ChatId { get; } - internal override IDialogContext GetOrCreateDialogContext(BotFrameworkDbContext dbContext) - { - var contextSenderInfo = TelegramSenderInfoEntity.GetOrCreate(this, dbContext); - var contextModel = DialogContextEntity.GetOrCreate(contextSenderInfo, ContextType, dbContext); - - return new DialogContext(contextModel.State, contextModel.SenderInfoId, this, ContextType, dbContext); - } - } + public long UserSenderId { get; } + + public string UserSenderUsername { get; } + + public bool IsAdmin { get; } + + public TContext Accept(IContextVisitor visitor) + => visitor.Visit(this); } \ No newline at end of file diff --git a/Kysect.BotFramework/Core/Contexts/DialogContext.cs b/Kysect.BotFramework/Core/Contexts/DialogContext.cs index b615bb4..b5f83ed 100644 --- a/Kysect.BotFramework/Core/Contexts/DialogContext.cs +++ b/Kysect.BotFramework/Core/Contexts/DialogContext.cs @@ -3,53 +3,48 @@ using Kysect.BotFramework.Data; using Kysect.BotFramework.Data.Entities; -namespace Kysect.BotFramework.Core.Contexts +namespace Kysect.BotFramework.Core.Contexts; + +public class DialogContext : IDialogContext { - public class DialogContext : IDialogContext - { - private readonly BotFrameworkDbContext _dbContext; + private readonly BotFrameworkDbContext _dbContext; - private readonly long _senderInfoId; - private readonly ContextType _contextType; - - private int _state; + private readonly long _senderInfoId; + private readonly ContextType _contextType; - public ISenderInfo SenderInfo { get; } + private int _state; - public int State + public int State + { + get => _state; + set { - get => _state; - set - { - _state = value; - SaveChanges(); - } + _state = value; + SaveChanges(); } + } - public DialogContext( - int state, - long senderInfoId, - SenderInfo senderInfo, - ContextType contextType, - BotFrameworkDbContext dbContext) - { - SenderInfo = senderInfo; - _senderInfoId = senderInfoId; - _state = state; - _contextType = contextType; - _dbContext = dbContext; - } + public DialogContext( + int state, + long senderInfoId, + ContextType contextType, + BotFrameworkDbContext dbContext) + { + _senderInfoId = senderInfoId; + _state = state; + _contextType = contextType; + _dbContext = dbContext; + } - private void SaveChanges() - { - DialogContextEntity context = _dbContext.DialogContexts.FirstOrDefault( - x => - x.SenderInfoId == _senderInfoId - && x.ContextType == _contextType); + private void SaveChanges() + { + DialogContextEntity context = _dbContext.DialogContexts.FirstOrDefault( + x => + x.SenderInfoId == _senderInfoId + && x.ContextType == _contextType); - context!.State = State; - _dbContext.DialogContexts.Update(context); - _dbContext.SaveChanges(); - } + context!.State = State; + _dbContext.DialogContexts.Update(context); + _dbContext.SaveChanges(); } } \ No newline at end of file diff --git a/Kysect.BotFramework/Core/Visitors/DialogContextVisitor.cs b/Kysect.BotFramework/Core/Visitors/DialogContextVisitor.cs new file mode 100644 index 0000000..24e3730 --- /dev/null +++ b/Kysect.BotFramework/Core/Visitors/DialogContextVisitor.cs @@ -0,0 +1,33 @@ +using Kysect.BotFramework.Abstractions.Contexts; +using Kysect.BotFramework.Abstractions.Visitors; +using Kysect.BotFramework.Core.Contexts; +using Kysect.BotFramework.Data; +using Kysect.BotFramework.Data.Entities; + +namespace Kysect.BotFramework.Core.Visitors; + +public class DialogContextVisitor : IContextVisitor +{ + private readonly BotFrameworkDbContext _dbContext; + + public DialogContextVisitor(BotFrameworkDbContext dbContext) + { + _dbContext = dbContext; + } + + public IDialogContext Visit(IDiscordSenderInfo senderInfo) + { + var contextSenderInfo = DiscordSenderInfoEntity.GetOrCreate(senderInfo, _dbContext); + var contextModel = DialogContextEntity.GetOrCreate(contextSenderInfo, ContextType.Discord, _dbContext); + + return new DialogContext(contextModel.State, contextModel.SenderInfoId, ContextType.Discord, _dbContext); + } + + public IDialogContext Visit(ITelegramSenderInfo senderInfo) + { + var contextSenderInfo = TelegramSenderInfoEntity.GetOrCreate(senderInfo, _dbContext); + var contextModel = DialogContextEntity.GetOrCreate(contextSenderInfo, ContextType.Telegram, _dbContext); + + return new DialogContext(contextModel.State, contextModel.SenderInfoId, ContextType.Telegram, _dbContext); + } +} \ No newline at end of file diff --git a/Kysect.BotFramework/Data/Entities/DiscordSenderInfoEntity.cs b/Kysect.BotFramework/Data/Entities/DiscordSenderInfoEntity.cs index b1c0d84..95eb6e3 100644 --- a/Kysect.BotFramework/Data/Entities/DiscordSenderInfoEntity.cs +++ b/Kysect.BotFramework/Data/Entities/DiscordSenderInfoEntity.cs @@ -1,5 +1,5 @@ using System.Linq; -using Kysect.BotFramework.ApiProviders.Discord; +using Kysect.BotFramework.Abstractions.Contexts; namespace Kysect.BotFramework.Data.Entities { @@ -7,7 +7,7 @@ public class DiscordSenderInfoEntity : SenderInfoEntity { public ulong GuildId { get; set; } - public static DiscordSenderInfoEntity GetOrCreate(DiscordSenderInfo senderInfo, BotFrameworkDbContext dbContext) + public static DiscordSenderInfoEntity GetOrCreate(IDiscordSenderInfo senderInfo, BotFrameworkDbContext dbContext) { var senderInfoEntity = dbContext.DiscordSenderInfos.FirstOrDefault( si => diff --git a/Kysect.BotFramework/Data/Entities/TelegramSenderInfoEntity.cs b/Kysect.BotFramework/Data/Entities/TelegramSenderInfoEntity.cs index 9084cc3..01440cd 100644 --- a/Kysect.BotFramework/Data/Entities/TelegramSenderInfoEntity.cs +++ b/Kysect.BotFramework/Data/Entities/TelegramSenderInfoEntity.cs @@ -1,11 +1,11 @@ using System.Linq; -using Kysect.BotFramework.ApiProviders.Telegram; +using Kysect.BotFramework.Abstractions.Contexts; namespace Kysect.BotFramework.Data.Entities { public class TelegramSenderInfoEntity : SenderInfoEntity { - public static TelegramSenderInfoEntity GetOrCreate(TelegramSenderInfo senderInfo, BotFrameworkDbContext dbContext) + public static TelegramSenderInfoEntity GetOrCreate(ITelegramSenderInfo senderInfo, BotFrameworkDbContext dbContext) { var senderInfoEntity = dbContext.TelegramSenderInfos.FirstOrDefault( si => From 33934b13b6dcb115dd5ce6e5f43f1ec77601dacd Mon Sep 17 00:00:00 2001 From: Mihinator3000 <70411602+Mihinator3000@users.noreply.github.com> Date: Wed, 31 Aug 2022 23:25:21 +0300 Subject: [PATCH 3/8] refactor: add visitor usage --- .../Providers/StorageDialogContextProvider.cs | 12 +++++---- .../Core/Contexts/SenderInfo.cs | 25 ------------------- 2 files changed, 7 insertions(+), 30 deletions(-) delete mode 100644 Kysect.BotFramework/Core/Contexts/SenderInfo.cs diff --git a/Kysect.BotFramework/Core/Contexts/Providers/StorageDialogContextProvider.cs b/Kysect.BotFramework/Core/Contexts/Providers/StorageDialogContextProvider.cs index 322c50f..c989116 100644 --- a/Kysect.BotFramework/Core/Contexts/Providers/StorageDialogContextProvider.cs +++ b/Kysect.BotFramework/Core/Contexts/Providers/StorageDialogContextProvider.cs @@ -1,16 +1,18 @@ using Kysect.BotFramework.Abstactions.Services; using Kysect.BotFramework.Abstractions.Contexts; -using Kysect.BotFramework.Data; +using Kysect.BotFramework.Abstractions.Visitors; namespace Kysect.BotFramework.Core.Contexts.Providers; public class StorageDialogContextProvider : IDialogContextProvider { - private readonly BotFrameworkDbContext _dbContext; + private readonly IContextVisitor _dialogContextVisitor; - public StorageDialogContextProvider(BotFrameworkDbContext dbContext) - => _dbContext = dbContext; + public StorageDialogContextProvider(IContextVisitor dialogContextVisitor) + { + _dialogContextVisitor = dialogContextVisitor; + } public IDialogContext GetDialogContext(ISenderInfo senderInfo) - => (senderInfo as SenderInfo).GetOrCreateDialogContext(_dbContext); + => senderInfo.Accept(_dialogContextVisitor); } \ No newline at end of file diff --git a/Kysect.BotFramework/Core/Contexts/SenderInfo.cs b/Kysect.BotFramework/Core/Contexts/SenderInfo.cs deleted file mode 100644 index fc68b30..0000000 --- a/Kysect.BotFramework/Core/Contexts/SenderInfo.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Kysect.BotFramework.Abstractions.Contexts; -using Kysect.BotFramework.Data; - -namespace Kysect.BotFramework.Core.Contexts -{ - public abstract class SenderInfo : ISenderInfo - { - public long ChatId { get; internal set; } - public long UserSenderId { get; internal set; } - public string UserSenderUsername { get; internal set; } - public bool IsAdmin { get; internal set; } - - internal abstract ContextType ContextType { get; } - - protected SenderInfo(long chatId, long userSenderId, string userSenderUsername, bool isAdmin) - { - ChatId = chatId; - UserSenderId = userSenderId; - UserSenderUsername = userSenderUsername; - IsAdmin = isAdmin; - } - - internal abstract IDialogContext GetOrCreateDialogContext(BotFrameworkDbContext dbContext); - } -} \ No newline at end of file From f621c08117bc4c97c559251a9811a103c8f419eb Mon Sep 17 00:00:00 2001 From: Mihinator3000 <70411602+Mihinator3000@users.noreply.github.com> Date: Wed, 31 Aug 2022 23:25:37 +0300 Subject: [PATCH 4/8] feat: add visitor injection --- Kysect.BotFramework/Core/BotManagerBuilder.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Kysect.BotFramework/Core/BotManagerBuilder.cs b/Kysect.BotFramework/Core/BotManagerBuilder.cs index a1b4cc9..ce23303 100644 --- a/Kysect.BotFramework/Core/BotManagerBuilder.cs +++ b/Kysect.BotFramework/Core/BotManagerBuilder.cs @@ -4,6 +4,8 @@ using FluentScanning; using Kysect.BotFramework.Abstactions.Services; using Kysect.BotFramework.Abstractions.Commands; +using Kysect.BotFramework.Abstractions.Contexts; +using Kysect.BotFramework.Abstractions.Visitors; using Kysect.BotFramework.ApiProviders; using Kysect.BotFramework.Attributes; using Kysect.BotFramework.Core.Contexts.Providers; @@ -11,6 +13,7 @@ using Kysect.BotFramework.Core.Tools; using Kysect.BotFramework.Core.Tools.Extensions; using Kysect.BotFramework.Core.Tools.Loggers; +using Kysect.BotFramework.Core.Visitors; using Kysect.BotFramework.Data; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; @@ -95,7 +98,8 @@ public BotManagerBuilder SetDatabaseOptions(Action opti { ServiceCollection .AddDbContext(optionsAction) - .AddScoped(); + .AddScoped() + .AddScoped, DialogContextVisitor>(); return this; } From 8a146d0e6a90e8bcf9d7b5f98bf6e948618b60d4 Mon Sep 17 00:00:00 2001 From: Mihinator3000 <70411602+Mihinator3000@users.noreply.github.com> Date: Wed, 31 Aug 2022 23:31:04 +0300 Subject: [PATCH 5/8] refactor: remove unnecessary using --- .../ApiProviders/Telegram/TelegramSenderInfo.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs b/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs index 901e4b3..ab94cf4 100644 --- a/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs +++ b/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs @@ -1,5 +1,4 @@ -using System; -using Kysect.BotFramework.Abstractions.Contexts; +using Kysect.BotFramework.Abstractions.Contexts; using Kysect.BotFramework.Abstractions.Visitors; namespace Kysect.BotFramework.ApiProviders.Telegram; From 56dcb49d9c174e35aff3e3df8de2423ea1f0ff5a Mon Sep 17 00:00:00 2001 From: Mihinator3000 <70411602+Mihinator3000@users.noreply.github.com> Date: Wed, 31 Aug 2022 23:37:12 +0300 Subject: [PATCH 6/8] refactor: parameter validation --- .../ApiProviders/Discord/DiscordSenderInfo.cs | 10 ++++++++-- .../ApiProviders/Telegram/TelegramSenderInfo.cs | 8 +++++++- .../Contexts/Providers/StorageDialogContextProvider.cs | 10 ++++++++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Kysect.BotFramework/ApiProviders/Discord/DiscordSenderInfo.cs b/Kysect.BotFramework/ApiProviders/Discord/DiscordSenderInfo.cs index fd8dfb6..2c0bb2f 100644 --- a/Kysect.BotFramework/ApiProviders/Discord/DiscordSenderInfo.cs +++ b/Kysect.BotFramework/ApiProviders/Discord/DiscordSenderInfo.cs @@ -1,4 +1,5 @@ -using Kysect.BotFramework.Abstractions.Contexts; +using System; +using Kysect.BotFramework.Abstractions.Contexts; using Kysect.BotFramework.Abstractions.Visitors; namespace Kysect.BotFramework.ApiProviders.Discord; @@ -25,5 +26,10 @@ public DiscordSenderInfo(long chatId, long userSenderId, string userSenderUserna public ulong GuildId { get; } public TContext Accept(IContextVisitor visitor) - => visitor.Visit(this); + { + if (visitor is null) + throw new ArgumentNullException(nameof(visitor)); + + return visitor.Visit(this); + } } \ No newline at end of file diff --git a/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs b/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs index ab94cf4..75c093b 100644 --- a/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs +++ b/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs @@ -1,5 +1,6 @@ using Kysect.BotFramework.Abstractions.Contexts; using Kysect.BotFramework.Abstractions.Visitors; +using System; namespace Kysect.BotFramework.ApiProviders.Telegram; @@ -22,5 +23,10 @@ public TelegramSenderInfo(long chatId, long userSenderId, string userSenderUsern public bool IsAdmin { get; } public TContext Accept(IContextVisitor visitor) - => visitor.Visit(this); + { + if (visitor is null) + throw new ArgumentNullException(nameof(visitor)); + + return visitor.Visit(this); + } } \ No newline at end of file diff --git a/Kysect.BotFramework/Core/Contexts/Providers/StorageDialogContextProvider.cs b/Kysect.BotFramework/Core/Contexts/Providers/StorageDialogContextProvider.cs index c989116..21d84be 100644 --- a/Kysect.BotFramework/Core/Contexts/Providers/StorageDialogContextProvider.cs +++ b/Kysect.BotFramework/Core/Contexts/Providers/StorageDialogContextProvider.cs @@ -1,4 +1,5 @@ -using Kysect.BotFramework.Abstactions.Services; +using System; +using Kysect.BotFramework.Abstactions.Services; using Kysect.BotFramework.Abstractions.Contexts; using Kysect.BotFramework.Abstractions.Visitors; @@ -14,5 +15,10 @@ public StorageDialogContextProvider(IContextVisitor dialogContex } public IDialogContext GetDialogContext(ISenderInfo senderInfo) - => senderInfo.Accept(_dialogContextVisitor); + { + if (senderInfo is null) + throw new ArgumentNullException(nameof(senderInfo)); + + return senderInfo.Accept(_dialogContextVisitor); + } } \ No newline at end of file From 170d41d41367f2de4f9037005969a73503743c11 Mon Sep 17 00:00:00 2001 From: Mihinator3000 <70411602+Mihinator3000@users.noreply.github.com> Date: Thu, 1 Sep 2022 08:39:27 +0300 Subject: [PATCH 7/8] refactor: rename visitor --- .../Abstractions/Contexts/ISenderInfo.cs | 2 +- .../{IContextVisitor.cs => ISenderInfoVisitor.cs} | 2 +- .../ApiProviders/Discord/DiscordSenderInfo.cs | 2 +- .../ApiProviders/Telegram/TelegramSenderInfo.cs | 2 +- Kysect.BotFramework/Core/BotManagerBuilder.cs | 2 +- .../Contexts/Providers/StorageDialogContextProvider.cs | 8 ++++---- ...DialogContextVisitor.cs => DialogSenderInfoVisitor.cs} | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) rename Kysect.BotFramework.Abstractions/Abstractions/Visitors/{IContextVisitor.cs => ISenderInfoVisitor.cs} (81%) rename Kysect.BotFramework/Core/Visitors/{DialogContextVisitor.cs => DialogSenderInfoVisitor.cs} (89%) diff --git a/Kysect.BotFramework.Abstractions/Abstractions/Contexts/ISenderInfo.cs b/Kysect.BotFramework.Abstractions/Abstractions/Contexts/ISenderInfo.cs index a986ff7..8f54543 100644 --- a/Kysect.BotFramework.Abstractions/Abstractions/Contexts/ISenderInfo.cs +++ b/Kysect.BotFramework.Abstractions/Abstractions/Contexts/ISenderInfo.cs @@ -9,5 +9,5 @@ public interface ISenderInfo string UserSenderUsername { get; } bool IsAdmin { get; } - TContext Accept(IContextVisitor visitor); + TContext Accept(ISenderInfoVisitor visitor); } \ No newline at end of file diff --git a/Kysect.BotFramework.Abstractions/Abstractions/Visitors/IContextVisitor.cs b/Kysect.BotFramework.Abstractions/Abstractions/Visitors/ISenderInfoVisitor.cs similarity index 81% rename from Kysect.BotFramework.Abstractions/Abstractions/Visitors/IContextVisitor.cs rename to Kysect.BotFramework.Abstractions/Abstractions/Visitors/ISenderInfoVisitor.cs index 7690010..ee2d887 100644 --- a/Kysect.BotFramework.Abstractions/Abstractions/Visitors/IContextVisitor.cs +++ b/Kysect.BotFramework.Abstractions/Abstractions/Visitors/ISenderInfoVisitor.cs @@ -2,7 +2,7 @@ namespace Kysect.BotFramework.Abstractions.Visitors; -public interface IContextVisitor +public interface ISenderInfoVisitor { TContext Visit(IDiscordSenderInfo senderInfo); diff --git a/Kysect.BotFramework/ApiProviders/Discord/DiscordSenderInfo.cs b/Kysect.BotFramework/ApiProviders/Discord/DiscordSenderInfo.cs index 2c0bb2f..22a398b 100644 --- a/Kysect.BotFramework/ApiProviders/Discord/DiscordSenderInfo.cs +++ b/Kysect.BotFramework/ApiProviders/Discord/DiscordSenderInfo.cs @@ -25,7 +25,7 @@ public DiscordSenderInfo(long chatId, long userSenderId, string userSenderUserna public ulong GuildId { get; } - public TContext Accept(IContextVisitor visitor) + public TContext Accept(ISenderInfoVisitor visitor) { if (visitor is null) throw new ArgumentNullException(nameof(visitor)); diff --git a/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs b/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs index 75c093b..59f7c9e 100644 --- a/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs +++ b/Kysect.BotFramework/ApiProviders/Telegram/TelegramSenderInfo.cs @@ -22,7 +22,7 @@ public TelegramSenderInfo(long chatId, long userSenderId, string userSenderUsern public bool IsAdmin { get; } - public TContext Accept(IContextVisitor visitor) + public TContext Accept(ISenderInfoVisitor visitor) { if (visitor is null) throw new ArgumentNullException(nameof(visitor)); diff --git a/Kysect.BotFramework/Core/BotManagerBuilder.cs b/Kysect.BotFramework/Core/BotManagerBuilder.cs index ce23303..6cfcf95 100644 --- a/Kysect.BotFramework/Core/BotManagerBuilder.cs +++ b/Kysect.BotFramework/Core/BotManagerBuilder.cs @@ -99,7 +99,7 @@ public BotManagerBuilder SetDatabaseOptions(Action opti ServiceCollection .AddDbContext(optionsAction) .AddScoped() - .AddScoped, DialogContextVisitor>(); + .AddScoped, DialogSenderInfoVisitor>(); return this; } diff --git a/Kysect.BotFramework/Core/Contexts/Providers/StorageDialogContextProvider.cs b/Kysect.BotFramework/Core/Contexts/Providers/StorageDialogContextProvider.cs index 21d84be..d8bc418 100644 --- a/Kysect.BotFramework/Core/Contexts/Providers/StorageDialogContextProvider.cs +++ b/Kysect.BotFramework/Core/Contexts/Providers/StorageDialogContextProvider.cs @@ -7,11 +7,11 @@ namespace Kysect.BotFramework.Core.Contexts.Providers; public class StorageDialogContextProvider : IDialogContextProvider { - private readonly IContextVisitor _dialogContextVisitor; + private readonly ISenderInfoVisitor _dialogSenderInfoVisitor; - public StorageDialogContextProvider(IContextVisitor dialogContextVisitor) + public StorageDialogContextProvider(ISenderInfoVisitor dialogSenderInfoVisitor) { - _dialogContextVisitor = dialogContextVisitor; + _dialogSenderInfoVisitor = dialogSenderInfoVisitor; } public IDialogContext GetDialogContext(ISenderInfo senderInfo) @@ -19,6 +19,6 @@ public IDialogContext GetDialogContext(ISenderInfo senderInfo) if (senderInfo is null) throw new ArgumentNullException(nameof(senderInfo)); - return senderInfo.Accept(_dialogContextVisitor); + return senderInfo.Accept(_dialogSenderInfoVisitor); } } \ No newline at end of file diff --git a/Kysect.BotFramework/Core/Visitors/DialogContextVisitor.cs b/Kysect.BotFramework/Core/Visitors/DialogSenderInfoVisitor.cs similarity index 89% rename from Kysect.BotFramework/Core/Visitors/DialogContextVisitor.cs rename to Kysect.BotFramework/Core/Visitors/DialogSenderInfoVisitor.cs index 24e3730..d157c4e 100644 --- a/Kysect.BotFramework/Core/Visitors/DialogContextVisitor.cs +++ b/Kysect.BotFramework/Core/Visitors/DialogSenderInfoVisitor.cs @@ -6,11 +6,11 @@ namespace Kysect.BotFramework.Core.Visitors; -public class DialogContextVisitor : IContextVisitor +public class DialogSenderInfoVisitor : ISenderInfoVisitor { private readonly BotFrameworkDbContext _dbContext; - public DialogContextVisitor(BotFrameworkDbContext dbContext) + public DialogSenderInfoVisitor(BotFrameworkDbContext dbContext) { _dbContext = dbContext; } From 6788ca598af800dcc88e1ca730e6f737f40c3aa6 Mon Sep 17 00:00:00 2001 From: Fredi Kats Date: Sat, 3 Sep 2022 22:21:41 +0400 Subject: [PATCH 8/8] docs: add project diagram --- Docs/BotFramework.puml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 Docs/BotFramework.puml diff --git a/Docs/BotFramework.puml b/Docs/BotFramework.puml new file mode 100644 index 0000000..5a74951 --- /dev/null +++ b/Docs/BotFramework.puml @@ -0,0 +1,26 @@ +@startuml Modules + +package Framework { + package BF.Abstractions + package BF.Analyzer + package BF.Core +} + +package Plugins { + package BF.Providers.Telegram + package BF.Providers.Discord +} + +BF.Analyzer --> BF.Abstractions +BF.Core --> BF.Abstractions +BF.Core --> BF.Analyzer + +BF.Providers.Telegram --> BF.Abstractions +BF.Providers.Discord --> BF.Abstractions + +package Bot + +Bot --> BF.Core +Bot --> BF.Providers.Telegram + +@enduml \ No newline at end of file