Refactoring using Claims more, add Server Side Messaging (#20)
* add some refactoring based on claims, handle chara ident inside claim, fix discord userid in log * improve authentication responses, add server side messaging * update server to mainline api Co-authored-by: rootdarkarchon <root.darkarchon@outlook.com>
This commit is contained in:
@@ -6,11 +6,11 @@ using Microsoft.EntityFrameworkCore;
|
||||
using Discord.WebSocket;
|
||||
using Prometheus;
|
||||
using MareSynchronosShared.Models;
|
||||
using MareSynchronosShared.Metrics;
|
||||
using MareSynchronosShared.Utils;
|
||||
using MareSynchronosShared.Services;
|
||||
using static MareSynchronosShared.Protos.IdentificationService;
|
||||
using static System.Formats.Asn1.AsnWriter;
|
||||
using Grpc.Net.ClientFactory;
|
||||
using MareSynchronosShared.Protos;
|
||||
|
||||
namespace MareSynchronosServices.Discord;
|
||||
|
||||
@@ -30,23 +30,26 @@ public class MareModule : InteractionModuleBase
|
||||
private readonly DiscordBotServices _botServices;
|
||||
private readonly IdentificationServiceClient _identificationServiceClient;
|
||||
private readonly IConfigurationService<ServerConfiguration> _mareClientConfigurationService;
|
||||
private readonly GrpcClientFactory _grpcClientFactory;
|
||||
private Random random = new();
|
||||
|
||||
public MareModule(ILogger<MareModule> logger, IServiceProvider services, DiscordBotServices botServices,
|
||||
IdentificationServiceClient identificationServiceClient, IConfigurationService<ServerConfiguration> mareClientConfigurationService)
|
||||
IdentificationServiceClient identificationServiceClient, IConfigurationService<ServerConfiguration> mareClientConfigurationService,
|
||||
GrpcClientFactory grpcClientFactory)
|
||||
{
|
||||
_logger = logger;
|
||||
_services = services;
|
||||
_botServices = botServices;
|
||||
_identificationServiceClient = identificationServiceClient;
|
||||
_mareClientConfigurationService = mareClientConfigurationService;
|
||||
_grpcClientFactory = grpcClientFactory;
|
||||
}
|
||||
|
||||
[SlashCommand("register", "Starts the registration process for the Mare Synchronos server of this Discord")]
|
||||
public async Task Register([Summary("overwrite", "Overwrites your old account")] bool overwrite = false)
|
||||
{
|
||||
_logger.LogInformation("SlashCommand:{userId}:{Method}:{params}",
|
||||
Context.Client.CurrentUser.Id, nameof(Register),
|
||||
Context.Interaction.User.Id, nameof(Register),
|
||||
string.Join(",", new[] { $"{nameof(overwrite)}:{overwrite}" }));
|
||||
|
||||
await TryRespondAsync(async () =>
|
||||
@@ -64,7 +67,7 @@ public class MareModule : InteractionModuleBase
|
||||
public async Task SetVanityUid([Summary("vanity_uid", "Desired Vanity UID")] string vanityUid)
|
||||
{
|
||||
_logger.LogInformation("SlashCommand:{userId}:{Method}:{params}",
|
||||
Context.Client.CurrentUser.Id, nameof(SetVanityUid),
|
||||
Context.Interaction.User.Id, nameof(SetVanityUid),
|
||||
string.Join(",", new[] { $"{nameof(vanityUid)}:{vanityUid}" }));
|
||||
|
||||
await TryRespondAsync(async () =>
|
||||
@@ -83,7 +86,7 @@ public class MareModule : InteractionModuleBase
|
||||
[Summary("vanity_syncshell_id", "Desired Vanity Syncshell ID")] string vanityId)
|
||||
{
|
||||
_logger.LogInformation("SlashCommand:{userId}:{Method}:{params}",
|
||||
Context.Client.CurrentUser.Id, nameof(SetSyncshellVanityId),
|
||||
Context.Interaction.User.Id, nameof(SetSyncshellVanityId),
|
||||
string.Join(",", new[] { $"{nameof(syncshellId)}:{syncshellId}", $"{nameof(vanityId)}:{vanityId}" }));
|
||||
|
||||
await TryRespondAsync(async () =>
|
||||
@@ -100,7 +103,7 @@ public class MareModule : InteractionModuleBase
|
||||
public async Task Verify()
|
||||
{
|
||||
_logger.LogInformation("SlashCommand:{userId}:{Method}",
|
||||
Context.Client.CurrentUser.Id, nameof(Verify));
|
||||
Context.Interaction.User.Id, nameof(Verify));
|
||||
await TryRespondAsync(async () =>
|
||||
{
|
||||
EmbedBuilder eb = new();
|
||||
@@ -128,7 +131,7 @@ public class MareModule : InteractionModuleBase
|
||||
public async Task VerifyRelink()
|
||||
{
|
||||
_logger.LogInformation("SlashCommand:{userId}:{Method}",
|
||||
Context.Client.CurrentUser.Id, nameof(VerifyRelink));
|
||||
Context.Interaction.User.Id, nameof(VerifyRelink));
|
||||
await TryRespondAsync(async () =>
|
||||
{
|
||||
EmbedBuilder eb = new();
|
||||
@@ -156,7 +159,7 @@ public class MareModule : InteractionModuleBase
|
||||
public async Task Recover()
|
||||
{
|
||||
_logger.LogInformation("SlashCommand:{userId}:{Method}",
|
||||
Context.Client.CurrentUser.Id, nameof(Recover));
|
||||
Context.Interaction.User.Id, nameof(Recover));
|
||||
await RespondWithModalAsync<LodestoneModal>("recover_modal").ConfigureAwait(false);
|
||||
}
|
||||
|
||||
@@ -166,7 +169,7 @@ public class MareModule : InteractionModuleBase
|
||||
[Summary("uid", "ADMIN ONLY: UID to check for")] string? uid = null)
|
||||
{
|
||||
_logger.LogInformation("SlashCommand:{userId}:{Method}",
|
||||
Context.Client.CurrentUser.Id, nameof(UserInfo));
|
||||
Context.Interaction.User.Id, nameof(UserInfo));
|
||||
|
||||
await TryRespondAsync(async () =>
|
||||
{
|
||||
@@ -182,7 +185,7 @@ public class MareModule : InteractionModuleBase
|
||||
public async Task Relink()
|
||||
{
|
||||
_logger.LogInformation("SlashCommand:{userId}:{Method}",
|
||||
Context.Client.CurrentUser.Id, nameof(Relink));
|
||||
Context.Interaction.User.Id, nameof(Relink));
|
||||
await RespondWithModalAsync<LodestoneModal>("relink_modal").ConfigureAwait(false);
|
||||
}
|
||||
|
||||
@@ -190,7 +193,7 @@ public class MareModule : InteractionModuleBase
|
||||
public async Task UserAdd([Summary("desired_uid", "Desired UID")] string desiredUid)
|
||||
{
|
||||
_logger.LogInformation("SlashCommand:{userId}:{Method}:{params}",
|
||||
Context.Client.CurrentUser.Id, nameof(UserAdd),
|
||||
Context.Interaction.User.Id, nameof(UserAdd),
|
||||
string.Join(",", new[] { $"{nameof(desiredUid)}:{desiredUid}" }));
|
||||
|
||||
await TryRespondAsync(async () =>
|
||||
@@ -201,11 +204,51 @@ public class MareModule : InteractionModuleBase
|
||||
});
|
||||
}
|
||||
|
||||
[SlashCommand("message", "ADMIN ONLY: sends a message to clients")]
|
||||
public async Task SendMessageToClients([Summary("message", "Message to send")] string message,
|
||||
[Summary("severity", "Severity of the message")] MareSynchronosShared.Protos.MessageType messageType = MareSynchronosShared.Protos.MessageType.Info,
|
||||
[Summary("uid", "User ID to the person to send the message to")] string? uid = null)
|
||||
{
|
||||
_logger.LogInformation("SlashCommand:{userId}:{Method}:{message}:{type}:{uid}", Context.Interaction.User.Id, nameof(SendMessageToClients), message, messageType, uid);
|
||||
|
||||
using var scope = _services.CreateScope();
|
||||
using var db = scope.ServiceProvider.GetService<MareDbContext>();
|
||||
|
||||
if (!(await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(a => a.DiscordId == Context.Interaction.User.Id))?.User?.IsAdmin ?? true)
|
||||
{
|
||||
await RespondAsync("No permission", ephemeral: true).ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(uid) && !await db.Users.AnyAsync(u => u.UID == uid))
|
||||
{
|
||||
await RespondAsync("Specified UID does not exist", ephemeral: true).ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var client = _grpcClientFactory.CreateClient<ClientMessageService.ClientMessageServiceClient>("MessageClient");
|
||||
await client.SendClientMessageAsync(new ClientMessage()
|
||||
{
|
||||
Message = message,
|
||||
Type = messageType,
|
||||
Uid = uid ?? string.Empty
|
||||
});
|
||||
|
||||
await RespondAsync("Message sent", ephemeral: true).ConfigureAwait(false);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
await RespondAsync("Failed to send message: " + ex.ToString(), ephemeral: true).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
[ModalInteraction("recover_modal")]
|
||||
public async Task RecoverModal(LodestoneModal modal)
|
||||
{
|
||||
_logger.LogInformation("Modal:{userId}:{Method}",
|
||||
Context.Client.CurrentUser.Id, nameof(RecoverModal));
|
||||
Context.Interaction.User.Id, nameof(RecoverModal));
|
||||
|
||||
await TryRespondAsync(async () =>
|
||||
{
|
||||
@@ -218,7 +261,7 @@ public class MareModule : InteractionModuleBase
|
||||
public async Task RegisterModal(LodestoneModal modal)
|
||||
{
|
||||
_logger.LogInformation("Modal:{userId}:{Method}",
|
||||
Context.Client.CurrentUser.Id, nameof(RegisterModal));
|
||||
Context.Interaction.User.Id, nameof(RegisterModal));
|
||||
|
||||
await TryRespondAsync(async () =>
|
||||
{
|
||||
@@ -231,7 +274,7 @@ public class MareModule : InteractionModuleBase
|
||||
public async Task RelinkModal(LodestoneModal modal)
|
||||
{
|
||||
_logger.LogInformation("Modal:{userId}:{Method}",
|
||||
Context.Client.CurrentUser.Id, nameof(RelinkModal));
|
||||
Context.Interaction.User.Id, nameof(RelinkModal));
|
||||
|
||||
await TryRespondAsync(async () =>
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user