Merge pull request #44 from Moonlight-Panel/DiscordBot
Added ActivityStatus
This commit is contained in:
13
Moonlight/App/Helpers/DiscordMaintenanceToggle.cs
Normal file
13
Moonlight/App/Helpers/DiscordMaintenanceToggle.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using Discord.WebSocket;
|
||||
using Moonlight.App.Services.DiscordBot;
|
||||
|
||||
namespace Moonlight.App.Helpers;
|
||||
|
||||
public class DiscordMaintenanceToggle
|
||||
{
|
||||
private Task MaintenanceModeToggle(SocketSlashCommand command)
|
||||
{
|
||||
DiscordBotService.MaintenanceMode = !DiscordBotService.MaintenanceMode;
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
44
Moonlight/App/Repositories/LoadingMessageRepository.cs
Normal file
44
Moonlight/App/Repositories/LoadingMessageRepository.cs
Normal file
@@ -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<LoadingMessage> 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();
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -1,22 +1,28 @@
|
||||
using Discord;
|
||||
using System.Diagnostics;
|
||||
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 DiscordBotService(
|
||||
// References
|
||||
public ActivityStatusModule ActivityStatusModule { get; private set; }
|
||||
|
||||
public DiscordBotService(
|
||||
IServiceScopeFactory serviceScopeFactory,
|
||||
ConfigService configService)
|
||||
{
|
||||
@@ -34,24 +40,71 @@ public class DiscordBotService
|
||||
var discordConfig = ConfigService
|
||||
.GetSection("Moonlight")
|
||||
.GetSection("DiscordBot");
|
||||
|
||||
if(!discordConfig.GetValue<bool>("Enable"))
|
||||
|
||||
if (!discordConfig.GetValue<bool>("Enable"))
|
||||
return;
|
||||
|
||||
|
||||
Client.Log += Log;
|
||||
|
||||
// Init here the modules e.g.
|
||||
// ExampleModule = new(Client, ConfigService, Scope)
|
||||
Client.Ready += OnReady;
|
||||
|
||||
//Commands
|
||||
|
||||
//Module
|
||||
ActivityStatusModule = new(Client, ConfigService, ServiceScope);
|
||||
|
||||
await ActivityStatusModule.UpdateActivityStatusList();
|
||||
|
||||
await Client.LoginAsync(TokenType.Bot, discordConfig.GetValue<string>("Token"));
|
||||
await Client.StartAsync();
|
||||
|
||||
await Task.Delay(-1);
|
||||
}
|
||||
private async Task OnReady()
|
||||
{
|
||||
//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)
|
||||
{
|
||||
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");
|
||||
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");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<LoadingMessage> 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<LoadingMessageRepository>();
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user