From 92e8b68a648d1f3e44a1f7e134faecdae3fe2ac8 Mon Sep 17 00:00:00 2001 From: Spielepapagei Date: Mon, 13 Mar 2023 21:11:09 +0100 Subject: [PATCH 1/7] CreadedDiscordBot --- .../App/Helpers/DiscordMaintenanceToggle.cs | 21 +++++++ .../App/Services/DiscordBot/BaseModule.cs | 6 +- .../Services/DiscordBot/DiscordBotService.cs | 57 +++++++++++++++++-- .../Modules/RemoveCommandsModuels.cs | 34 +++++++++++ Moonlight/Moonlight.csproj | 2 +- 5 files changed, 112 insertions(+), 8 deletions(-) create mode 100644 Moonlight/App/Helpers/DiscordMaintenanceToggle.cs create mode 100644 Moonlight/App/Services/DiscordBot/Modules/RemoveCommandsModuels.cs diff --git a/Moonlight/App/Helpers/DiscordMaintenanceToggle.cs b/Moonlight/App/Helpers/DiscordMaintenanceToggle.cs new file mode 100644 index 00000000..07c57423 --- /dev/null +++ b/Moonlight/App/Helpers/DiscordMaintenanceToggle.cs @@ -0,0 +1,21 @@ +using Discord.WebSocket; +using Moonlight.App.Services.DiscordBot; + +namespace Moonlight.App.Helpers; + +public class DiscordMaintenanceToggle +{ + private Task MaintenanceModeToggle(SocketSlashCommand command) + { + if (DiscordBotService.MaintenanceMode) + { + DiscordBotService.MaintenanceMode = false; + } + else + { + DiscordBotService.MaintenanceMode = true; + } + return Task.CompletedTask; + } + +} \ No newline at end of file diff --git a/Moonlight/App/Services/DiscordBot/BaseModule.cs b/Moonlight/App/Services/DiscordBot/BaseModule.cs index 616435fd..17e2360e 100644 --- a/Moonlight/App/Services/DiscordBot/BaseModule.cs +++ b/Moonlight/App/Services/DiscordBot/BaseModule.cs @@ -2,12 +2,14 @@ namespace Moonlight.App.Services.DiscordBot; -public class BaseModule +public abstract class BaseModule { public DiscordSocketClient Client { get; set; } public ConfigService ConfigService { get; set; } public IServiceScope Scope { get; set; } - + + public abstract Task RegisterCommands(); + public BaseModule( DiscordSocketClient client, ConfigService configService, diff --git a/Moonlight/App/Services/DiscordBot/DiscordBotService.cs b/Moonlight/App/Services/DiscordBot/DiscordBotService.cs index 1547a42f..e79b8d6c 100644 --- a/Moonlight/App/Services/DiscordBot/DiscordBotService.cs +++ b/Moonlight/App/Services/DiscordBot/DiscordBotService.cs @@ -1,20 +1,25 @@ -using Discord; +using System.Diagnostics; +using Discord; using Discord.WebSocket; using Logging.Net; +using Moonlight.App.Services.DiscordBot.Commands; namespace Moonlight.App.Services.DiscordBot; public class DiscordBotService { + public static bool MaintenanceMode = false; + private readonly IServiceScopeFactory ServiceScopeFactory; private readonly ConfigService ConfigService; private IServiceScope ServiceScope; private readonly DiscordSocketClient Client; - + // Add here references so e.g. // public ExampleModule ExampleModule { get; private set; } + public RemoveCommandsModuels RemoveCommandsModuels { get; private set; } public DiscordBotService( IServiceScopeFactory serviceScopeFactory, @@ -39,19 +44,61 @@ public class DiscordBotService return; Client.Log += Log; - - // Init here the modules e.g. - // ExampleModule = new(Client, ConfigService, Scope) + Client.Ready += OnReady; + + //Commands + RemoveCommandsModuels = new(Client, ConfigService, ServiceScope); await Client.LoginAsync(TokenType.Bot, discordConfig.GetValue("Token")); await Client.StartAsync(); await Task.Delay(-1); } + private async Task OnReady() + { + //TODO: MASU Ladenachrichten jede Minute ändern. + await Client.SetGameAsync("Masu ist zu lazy um das zu Implementieren.", null, ActivityType.Listening); + await Client.SetStatusAsync(UserStatus.Idle); + + Logger.Info($"Invite link: https://discord.com/api/oauth2/authorize?client_id={Client.CurrentUser.Id}&permissions=1099511696391&scope=bot%20applications.commands"); + Logger.Info($"Login as {Client.CurrentUser.Username}#{Client.CurrentUser.DiscriminatorValue}"); + } private Task Log(LogMessage message) { Logger.Debug(message.Message); return Task.CompletedTask; } + + public async Task CreateCommands() + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + + var type = this.GetType(); + var properties = type.GetProperties(); + Logger.Debug("Start Initializing Commands (1 Command/s)"); + foreach (var property in properties) + { + if (property.PropertyType.IsSubclassOf(typeof(BaseModule))) + { + try + { + var instance = (BaseModule)property.GetValue(this)!; + await instance.RegisterCommands(); + Logger.Debug("Registered" + instance); + await Task.Delay(TimeSpan.FromMilliseconds(1000)); + } + catch (Exception ex) + { + Logger.Error($"Module Error {ex.Message}"); + Logger.Error(ex.InnerException); + } + } + } + + stopwatch.Stop(); + Logger.Info($"Registered all commands. Done in {stopwatch.ElapsedMilliseconds}ms"); + } + } \ No newline at end of file diff --git a/Moonlight/App/Services/DiscordBot/Modules/RemoveCommandsModuels.cs b/Moonlight/App/Services/DiscordBot/Modules/RemoveCommandsModuels.cs new file mode 100644 index 00000000..90e05bab --- /dev/null +++ b/Moonlight/App/Services/DiscordBot/Modules/RemoveCommandsModuels.cs @@ -0,0 +1,34 @@ +using System.Diagnostics; +using Discord; +using Discord.WebSocket; +using Logging.Net; + +namespace Moonlight.App.Services.DiscordBot.Commands; + +public class RemoveCommandsModuels : BaseModule +{ + public RemoveCommandsModuels(DiscordSocketClient client, ConfigService configService, IServiceScope scope) : base(client, configService, scope) {} + public override Task RegisterCommands() + { return Task.CompletedTask; } + + private async void VoidCommands() + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + + var commands = await Client.GetGlobalApplicationCommandsAsync(); + if (commands == null) return; + + foreach (var slashCommand in commands) + { + if(slashCommand.Name == "commands") continue; + + await slashCommand.DeleteAsync(); + Logger.Debug($"Deleted {slashCommand.Name}, {slashCommand.Id}"); + await Task.Delay(TimeSpan.FromMilliseconds(1000)); + } + + stopwatch.Stop(); + Logger.Info($"Deleted all commands. Done in {stopwatch.ElapsedMilliseconds}ms"); + } +} \ No newline at end of file diff --git a/Moonlight/Moonlight.csproj b/Moonlight/Moonlight.csproj index c9c7eeda..3d16d5f0 100644 --- a/Moonlight/Moonlight.csproj +++ b/Moonlight/Moonlight.csproj @@ -62,7 +62,7 @@ - + From 98a35f74b31850bb7328a4d9e9241eeb23007a8e Mon Sep 17 00:00:00 2001 From: Spielepapagei Date: Thu, 23 Mar 2023 20:35:13 +0100 Subject: [PATCH 2/7] Update DiscordBotService.cs --- Moonlight/App/Services/DiscordBot/DiscordBotService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Moonlight/App/Services/DiscordBot/DiscordBotService.cs b/Moonlight/App/Services/DiscordBot/DiscordBotService.cs index e79b8d6c..91ad5561 100644 --- a/Moonlight/App/Services/DiscordBot/DiscordBotService.cs +++ b/Moonlight/App/Services/DiscordBot/DiscordBotService.cs @@ -77,7 +77,7 @@ public class DiscordBotService var type = this.GetType(); var properties = type.GetProperties(); - Logger.Debug("Start Initializing Commands (1 Command/s)"); + Logger.Debug("Start Initializing Commands"); foreach (var property in properties) { if (property.PropertyType.IsSubclassOf(typeof(BaseModule))) From 4e84d0ac8db50c33f3e93aac608ab8b21146d9c0 Mon Sep 17 00:00:00 2001 From: Spielepapagei Date: Fri, 24 Mar 2023 17:54:33 +0100 Subject: [PATCH 3/7] Simplified this --- Moonlight/App/Helpers/DiscordMaintenanceToggle.cs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Moonlight/App/Helpers/DiscordMaintenanceToggle.cs b/Moonlight/App/Helpers/DiscordMaintenanceToggle.cs index 07c57423..fee30658 100644 --- a/Moonlight/App/Helpers/DiscordMaintenanceToggle.cs +++ b/Moonlight/App/Helpers/DiscordMaintenanceToggle.cs @@ -7,15 +7,7 @@ public class DiscordMaintenanceToggle { private Task MaintenanceModeToggle(SocketSlashCommand command) { - if (DiscordBotService.MaintenanceMode) - { - DiscordBotService.MaintenanceMode = false; - } - else - { - DiscordBotService.MaintenanceMode = true; - } + DiscordBotService.MaintenanceMode = !DiscordBotService.MaintenanceMode; return Task.CompletedTask; } - -} \ No newline at end of file +} From 0e6910f46bff432c0b73c76fc9a78349b5393f4d Mon Sep 17 00:00:00 2001 From: Spielepapagei Date: Wed, 5 Apr 2023 15:02:29 +0200 Subject: [PATCH 4/7] Added LoadingMessagesRepository Migrated LoadingMessages from Moonlight v1 --- .../Repositories/LoadingMessageRepository.cs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Moonlight/App/Repositories/LoadingMessageRepository.cs diff --git a/Moonlight/App/Repositories/LoadingMessageRepository.cs b/Moonlight/App/Repositories/LoadingMessageRepository.cs new file mode 100644 index 00000000..8575ff74 --- /dev/null +++ b/Moonlight/App/Repositories/LoadingMessageRepository.cs @@ -0,0 +1,44 @@ +using Microsoft.EntityFrameworkCore; +using Moonlight.App.Database; +using Moonlight.App.Database.Entities; + +namespace Moonlight.App.Repositories; + +public class LoadingMessageRepository : IDisposable +{ + private readonly DataContext DataContext; + + public LoadingMessageRepository(DataContext dataContext) + { + DataContext = dataContext; + } + + public DbSet Get() + { + return DataContext.LoadingMessages; + } + + public LoadingMessage Add(LoadingMessage loadingMessage) + { + var x = DataContext.LoadingMessages.Add(loadingMessage); + DataContext.SaveChanges(); + return x.Entity; + } + + public void Update(LoadingMessage loadingMessage) + { + DataContext.LoadingMessages.Update(loadingMessage); + DataContext.SaveChanges(); + } + + public void Delete(LoadingMessage loadingMessage) + { + DataContext.LoadingMessages.Remove(loadingMessage); + DataContext.SaveChanges(); + } + + public void Dispose() + { + DataContext.Dispose(); + } +} \ No newline at end of file From f4efb0f9a789e13f538691e8f740e316b0ee955c Mon Sep 17 00:00:00 2001 From: Spielepapagei Date: Wed, 5 Apr 2023 23:26:09 +0200 Subject: [PATCH 5/7] Added ActivityStatus --- .../Services/DiscordBot/DiscordBotService.cs | 40 +++++++++++-------- .../Modules/ActivityStatusModule.cs | 39 ++++++++++++++++++ Moonlight/Moonlight.csproj | 1 - Moonlight/Program.cs | 7 ++-- .../Shared/Views/Admin/Sys/DiscordBot.razor | 20 ++++++++-- 5 files changed, 83 insertions(+), 24 deletions(-) create mode 100644 Moonlight/App/Services/DiscordBot/Modules/ActivityStatusModule.cs diff --git a/Moonlight/App/Services/DiscordBot/DiscordBotService.cs b/Moonlight/App/Services/DiscordBot/DiscordBotService.cs index 91ad5561..dbb99687 100644 --- a/Moonlight/App/Services/DiscordBot/DiscordBotService.cs +++ b/Moonlight/App/Services/DiscordBot/DiscordBotService.cs @@ -2,26 +2,27 @@ using Discord; using Discord.WebSocket; using Logging.Net; +using Moonlight.App.Repositories; using Moonlight.App.Services.DiscordBot.Commands; +using Moonlight.App.Services.DiscordBot.Modules; namespace Moonlight.App.Services.DiscordBot; public class DiscordBotService { public static bool MaintenanceMode = false; - + private readonly IServiceScopeFactory ServiceScopeFactory; private readonly ConfigService ConfigService; - + private IServiceScope ServiceScope; private readonly DiscordSocketClient Client; - // Add here references so e.g. - // public ExampleModule ExampleModule { get; private set; } - public RemoveCommandsModuels RemoveCommandsModuels { get; private set; } + // References + public ActivityStatusModule ActivityStatusModule { get; private set; } - public DiscordBotService( +public DiscordBotService( IServiceScopeFactory serviceScopeFactory, ConfigService configService) { @@ -39,15 +40,19 @@ public class DiscordBotService var discordConfig = ConfigService .GetSection("Moonlight") .GetSection("DiscordBot"); - - if(!discordConfig.GetValue("Enable")) + + if (!discordConfig.GetValue("Enable")) return; - + Client.Log += Log; Client.Ready += OnReady; //Commands - RemoveCommandsModuels = new(Client, ConfigService, ServiceScope); + + //Module + ActivityStatusModule = new(Client, ConfigService, ServiceScope); + + await ActivityStatusModule.UpdateActivityStatusList(); await Client.LoginAsync(TokenType.Bot, discordConfig.GetValue("Token")); await Client.StartAsync(); @@ -56,12 +61,13 @@ public class DiscordBotService } private async Task OnReady() { - //TODO: MASU Ladenachrichten jede Minute ändern. - await Client.SetGameAsync("Masu ist zu lazy um das zu Implementieren.", null, ActivityType.Listening); + //await Client.SetGameAsync(name: "https://endelon-hosting.de", type: ActivityType.Watching); await Client.SetStatusAsync(UserStatus.Idle); - + Logger.Info($"Invite link: https://discord.com/api/oauth2/authorize?client_id={Client.CurrentUser.Id}&permissions=1099511696391&scope=bot%20applications.commands"); Logger.Info($"Login as {Client.CurrentUser.Username}#{Client.CurrentUser.DiscriminatorValue}"); + + Task.Run(ActivityStatusModule.ActivityStatusScheduler); } private Task Log(LogMessage message) @@ -69,12 +75,12 @@ public class DiscordBotService Logger.Debug(message.Message); return Task.CompletedTask; } - + public async Task CreateCommands() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); - + var type = this.GetType(); var properties = type.GetProperties(); Logger.Debug("Start Initializing Commands"); @@ -96,9 +102,9 @@ public class DiscordBotService } } } - + stopwatch.Stop(); Logger.Info($"Registered all commands. Done in {stopwatch.ElapsedMilliseconds}ms"); } - + } \ No newline at end of file diff --git a/Moonlight/App/Services/DiscordBot/Modules/ActivityStatusModule.cs b/Moonlight/App/Services/DiscordBot/Modules/ActivityStatusModule.cs new file mode 100644 index 00000000..970fa474 --- /dev/null +++ b/Moonlight/App/Services/DiscordBot/Modules/ActivityStatusModule.cs @@ -0,0 +1,39 @@ +using Discord; +using Discord.WebSocket; +using Moonlight.App.Database.Entities; +using Moonlight.App.Repositories; + +namespace Moonlight.App.Services.DiscordBot.Modules; + +public class ActivityStatusModule : BaseModule +{ + + private List LoadingMessages; + + private readonly PeriodicTimer Timer = new(TimeSpan.FromMinutes(1)); + + public ActivityStatusModule(DiscordSocketClient client, ConfigService configService, IServiceScope scope) : base(client, configService, scope) + { } + public override Task RegisterCommands() + { return Task.CompletedTask; } + + public Task UpdateActivityStatusList() + { + var loadingMessageRepo = Scope.ServiceProvider.GetRequiredService(); + LoadingMessages = loadingMessageRepo.Get().ToList(); + + return Task.CompletedTask; + } + + public async void ActivityStatusScheduler() + { + while (await Timer.WaitForNextTickAsync()) + { + Random rand = new Random(); + LoadingMessage random = LoadingMessages[rand.Next(LoadingMessages.Count)]; + + await Client.SetGameAsync(random.Message, "https://www.endelon.team", ActivityType.Streaming); + } + } + +} \ No newline at end of file diff --git a/Moonlight/Moonlight.csproj b/Moonlight/Moonlight.csproj index 27c1bed0..f4e59156 100644 --- a/Moonlight/Moonlight.csproj +++ b/Moonlight/Moonlight.csproj @@ -66,7 +66,6 @@ - diff --git a/Moonlight/Program.cs b/Moonlight/Program.cs index 5b4efebf..ccd680cd 100644 --- a/Moonlight/Program.cs +++ b/Moonlight/Program.cs @@ -60,7 +60,8 @@ namespace Moonlight builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); - + builder.Services.AddScoped(); + builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); @@ -125,7 +126,6 @@ namespace Moonlight builder.Services.AddSingleton(); // Third party services - builder.Services.AddBlazorTable(); builder.Services.AddSweetAlert2(options => { options.Theme = SweetAlertTheme.Dark; }); builder.Services.AddBlazorContextMenu(); @@ -153,8 +153,9 @@ namespace Moonlight // Support service var supportServerService = app.Services.GetRequiredService(); - // cleanup service + // AutoStart services _ = app.Services.GetRequiredService(); + _ = app.Services.GetRequiredService(); // Discord bot service //var discordBotService = app.Services.GetRequiredService(); diff --git a/Moonlight/Shared/Views/Admin/Sys/DiscordBot.razor b/Moonlight/Shared/Views/Admin/Sys/DiscordBot.razor index 22f7c9ef..282b78d2 100644 --- a/Moonlight/Shared/Views/Admin/Sys/DiscordBot.razor +++ b/Moonlight/Shared/Views/Admin/Sys/DiscordBot.razor @@ -6,20 +6,34 @@ - +
+ + +
-@code +@code { + //ToDo: Ole muss ins Bett gehen + //ToDo: Bot Info Card with Name, Bot Avatar, (RichPresence) Game Status, Activity Status + private async Task RegisterCommands() { - + await DiscordBotService.CreateCommands(); + } + + private Task VoidCommands() + { + return Task.CompletedTask; } } \ No newline at end of file From c6a9da834c1e6187ffdb5a1b4fff036b03fea26f Mon Sep 17 00:00:00 2001 From: Daniel Balk <67603460+Daniel-Balk@users.noreply.github.com> Date: Thu, 6 Apr 2023 01:26:31 +0200 Subject: [PATCH 6/7] added domain overview --- .../Views/Domain/{Index.razor => View.razor} | 0 Moonlight/Shared/Views/Domains.razor | 49 +++++++++++++++++++ 2 files changed, 49 insertions(+) rename Moonlight/Shared/Views/Domain/{Index.razor => View.razor} (100%) diff --git a/Moonlight/Shared/Views/Domain/Index.razor b/Moonlight/Shared/Views/Domain/View.razor similarity index 100% rename from Moonlight/Shared/Views/Domain/Index.razor rename to Moonlight/Shared/Views/Domain/View.razor diff --git a/Moonlight/Shared/Views/Domains.razor b/Moonlight/Shared/Views/Domains.razor index b2251222..e98fc70d 100644 --- a/Moonlight/Shared/Views/Domains.razor +++ b/Moonlight/Shared/Views/Domains.razor @@ -1,2 +1,51 @@ @page "/domains" +@using Moonlight.App.Repositories.Domains +@using Moonlight.App.Database.Entities +@using Microsoft.EntityFrameworkCore +@using BlazorTable +@using Moonlight.App.Services +@using domain = Moonlight.App.Database.Entities.Domain + +@inject DomainRepository DomainRepository +@inject DomainService DomainService +@inject SmartTranslateService SmartTranslateService + + + @foreach (var domain in domains) + { +
+
+ +
+
+ } +
+ +@code { + [CascadingParameter] + public User? User { get; set; } + + private domain[] domains { get; set; } + + public async Task Load(LazyLoader loader) + { + domains = DomainRepository + .Get() + .Include(x => x.SharedDomain) + .Include(x => x.Owner) + .Where(x => x.Owner == User) + .ToArray(); + } +} \ No newline at end of file From 15bd3180558b03f243089a2fe53bb700512846b1 Mon Sep 17 00:00:00 2001 From: Daniel Balk <67603460+Daniel-Balk@users.noreply.github.com> Date: Thu, 6 Apr 2023 01:58:43 +0200 Subject: [PATCH 7/7] domain edit design fix --- Moonlight/Shared/Views/Domain/View.razor | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Moonlight/Shared/Views/Domain/View.razor b/Moonlight/Shared/Views/Domain/View.razor index 6a7c87d7..ad737f13 100644 --- a/Moonlight/Shared/Views/Domain/View.razor +++ b/Moonlight/Shared/Views/Domain/View.razor @@ -60,7 +60,7 @@ -
+

-

-
+
@@ -129,8 +129,8 @@
-
-
+
+
-
+