@@ -1,15 +1,17 @@
using Discord ;
using Discord.Interactions ;
using LightlessSync.API.Data.Enum ;
using LightlessSync.API.Dto.Group ;
using LightlessSync.API.Dto.User ;
using LightlessSyncShared.Data ;
using LightlessSyncShared.Models ;
using LightlessSyncShared.Services ;
using LightlessSyncShared.Utils ;
using LightlessSyncShared.Utils.Configuration ;
using Microsoft.EntityFrameworkCore ;
using Prometheus ;
using LightlessSyncShared.Models ;
using LightlessSyncShared.Utils ;
using LightlessSyncShared.Services ;
using StackExchange.Redis ;
using LightlessSync.API.Data.Enum ;
using LightlessSyncShared.Utils.Configuration ;
using LightlessSync.API.Dto.User ;
using System.Net.Http.Json ;
namespace LightlessSyncServices.Discord ;
@@ -110,10 +112,10 @@ public class LightlessModule : InteractionModuleBase
var testUri = new Uri ( _lightlessServicesConfiguration . GetValue < Uri >
( nameof ( ServicesConfiguration . MainServerAddress ) ) , "/msgc/sendMessage" ) ;
await c . PostAsJsonAsync (
using ( await c . PostAsJsonAsync (
new Uri ( _lightlessServicesConfiguration . GetValue < Uri > ( nameof ( ServicesConfiguration . MainServerAddress ) ) , "/msgc/sendMessage" ) ,
new ClientMessage ( messageType , message , uid ? ? string . Empty )
) . ConfigureAwait ( false ) ;
) . ConfigureAwait ( false ) ) { }
var discordChannelForMessages = _lightlessServicesConfiguration . GetValueOrDefault < ulong? > ( nameof ( ServicesConfiguration . DiscordChannelForMessages ) , null ) ;
if ( uid = = null & & discordChannelForMessages ! = null )
@@ -146,20 +148,47 @@ public class LightlessModule : InteractionModuleBase
}
}
[SlashCommand("unbanbydiscord ", "ADMIN ONLY: Unban a user by their discord ID")]
public async Task UnbanByDiscord ( [ Summary ( "discord_id" , "Discord ID to u nban" ) ] string discordId )
[SlashCommand("serviceunban ", "ADMIN ONLY: Unban a user by their discord ID or user ID [CHOOSE ONE ONLY] ")]
public async Task ServiceU nban(
[Summary("discord_id", "Discord ID to unban")] string? discordId ,
[Summary("uid", "UID to unban")] string? uid
)
{
_logger . LogInformation ( "SlashCommand:{userId}:{Method}:{params}" ,
Context . Interaction . User . Id , nameof ( UnbanByDiscord ) ,
string . Join ( "," , new [ ] { $"{nameof(discordId)}:{discordId}" } ) ) ;
Context . Interaction . User . Id , nameof ( ServiceUnban ) ,
string . Join ( "," , new [ ] { $"{nameof(discordId)}:{discordId}" , $"{nameof(uid)}:{uid}" } ) ) ;
try
{
using HttpClient c = new HttpClient ( ) ;
c . DefaultRequestHeaders . Authorization = new System . Net . Http . Headers . AuthenticationHeaderValue ( "Bearer" , _serverTokenGenerator . Token ) ;
await c . PostAsJsonAsync ( new Uri ( _lightlessServicesConfiguration . GetValue < Uri >
( nameof ( ServicesConfiguration . MainServerAddress ) ) , "/user/unbanDiscord" ) , new UnbanRequest ( string . Empty , discordId ) )
. ConfigureAwait ( false ) ;
string endpoint ;
UnbanRequest unbanRequest ;
if ( ! string . IsNullOrEmpty ( uid ) )
{
endpoint = "/user/unbanUID" ;
unbanRequest = new UnbanRequest ( uid , string . Empty ) ;
}
else if ( ! string . IsNullOrEmpty ( discordId ) )
{
endpoint = "/user/unbanDiscord" ;
unbanRequest = new UnbanRequest ( string . Empty , discordId ) ;
}
else
{
await RespondAsync ( "You must provide either a UID or Discord ID." , ephemeral : true ) . ConfigureAwait ( false ) ;
return ;
}
using ( await c . PostAsJsonAsync (
new Uri ( _lightlessServicesConfiguration . GetValue < Uri > ( nameof ( ServicesConfiguration . MainServerAddress ) ) , endpoint ) ,
unbanRequest ) . ConfigureAwait ( false ) )
{
}
var discordChannelForMessages = _lightlessServicesConfiguration . GetValueOrDefault < ulong? > ( nameof ( ServicesConfiguration . DiscordChannelForMessages ) , null ) ;
if ( discordChannelForMessages ! = null )
{
@@ -168,10 +197,12 @@ public class LightlessModule : InteractionModuleBase
{
var embedColor = Color . Blue ;
String idToUse = ! string . IsNullOrEmpty ( uid ) ? uid : discordId ;
EmbedBuilder eb = new ( ) ;
eb . WithTitle ( "Unban Alert!" ) ;
eb . WithColor ( embedColor ) ;
eb . WithDescription ( discordId + " has been unbanned" ) ;
eb . WithDescription ( idToUse + " has been unbanned" ) ;
await discordChannel . SendMessageAsync ( embed : eb . Build ( ) ) . ConfigureAwait ( false ) ;
}
@@ -188,64 +219,20 @@ public class LightlessModule : InteractionModuleBase
}
}
[SlashCommand("unbanbyuid ", "ADMIN ONLY: Un ban a user by their uid")]
public async Task UnbanByUID ( [ Summary ( "uid" , "uid to un ban" ) ] string uid )
[SlashCommand("serviceban ", "ADMIN ONLY: ban a user by their uid")]
public async Task ServiceBan ( [ Summary ( "uid" , "uid to ban" ) ] string uid )
{
_logger . LogInformation ( "SlashCommand:{userId}:{Method}:{params}" ,
Context . Interaction . User . Id , nameof ( UnbanByUID ) ,
string . Join ( "," , new [ ] { $"{nameof(uid)}:{uid}" } ) ) ;
try
{
using HttpClient c = new HttpClient ( ) ;
var testUri = new Uri ( _lightlessServicesConfiguration . GetValue < Uri >
( nameof ( ServicesConfiguration . MainServerAddress ) ) , "/user/unbanDiscord" ) ;
c . DefaultRequestHeaders . Authorization = new System . Net . Http . Headers . AuthenticationHeaderValue ( "Bearer" , _serverTokenGenerator . Token ) ;
await c . PostAsJsonAsync ( new Uri ( _lightlessServicesConfiguration . GetValue < Uri >
( nameof ( ServicesConfiguration . MainServerAddress ) ) , "/user/unbanUID" ) , new UnbanRequest ( uid , string . Empty ) )
. ConfigureAwait ( false ) ;
var discordChannelForMessages = _lightlessServicesConfiguration . GetValueOrDefault < ulong? > ( nameof ( ServicesConfiguration . DiscordChannelForMessages ) , null ) ;
if ( discordChannelForMessages ! = null )
{
var discordChannel = await Context . Guild . GetChannelAsync ( discordChannelForMessages . Value ) . ConfigureAwait ( false ) as IMessageChannel ;
if ( discordChannel ! = null )
{
var embedColor = Color . Blue ;
EmbedBuilder eb = new ( ) ;
eb . WithTitle ( "Unban Alert!" ) ;
eb . WithColor ( embedColor ) ;
eb . WithDescription ( uid + " has been unbanned" ) ;
await discordChannel . SendMessageAsync ( embed : eb . Build ( ) ) . ConfigureAwait ( false ) ;
}
}
await RespondAsync ( "Message sent" , ephemeral : true ) . ConfigureAwait ( false ) ;
}
catch ( Exception ex )
{
EmbedBuilder eb = new ( ) ;
eb . WithTitle ( "An error occured" ) ;
eb . WithDescription ( "Please report this: " + Environment . NewLine + ex . Message + Environment . NewLine + ex . StackTrace + Environment . NewLine ) ;
await RespondAsync ( embeds : new Embed [ ] { eb . Build ( ) } , ephemeral : true ) . ConfigureAwait ( false ) ;
}
}
[SlashCommand("markforban", "ADMIN ONLY: ban a user by their uid")]
public async Task MarkUidForBan ( [ Summary ( "uid" , "uid to ban" ) ] string uid )
{
_logger . LogInformation ( "SlashCommand:{userId}:{Method}:{params}" ,
Context . Interaction . User . Id , nameof ( MarkUidForBan ) ,
Context . Interaction . User . Id , nameof ( ServiceBan ) ,
string . Join ( "," , new [ ] { $"{nameof(uid)}:{uid}" } ) ) ;
try
{
using HttpClient c = new HttpClient ( ) ;
c . DefaultRequestHeaders . Authorization = new System . Net . Http . Headers . AuthenticationHeaderValue ( "Bearer" , _serverTokenGenerator . Token ) ;
await c . PostAsJsonAsync ( new Uri ( _lightlessServicesConfiguration . GetValue < Uri >
using ( await c . PostAsJsonAsync ( new Uri ( _lightlessServicesConfiguration . GetValue < Uri >
( nameof ( ServicesConfiguration . MainServerAddress ) ) , "/user/ban" ) , new BanRequest ( uid ) )
. ConfigureAwait ( false ) ;
. ConfigureAwait ( false ) ) { }
var discordChannelForMessages = _lightlessServicesConfiguration . GetValueOrDefault < ulong? > ( nameof ( ServicesConfiguration . DiscordChannelForMessages ) , null ) ;
if ( discordChannelForMessages ! = null )
{
@@ -274,6 +261,100 @@ public class LightlessModule : InteractionModuleBase
}
}
[SlashCommand("Toggle User Profile", "ADMIN ONLY: disable a user profile by their uid")]
public async Task ToggleUserProfile (
[Summary("uid", "uid to disable")] string uid ,
[Summary("toggle", "Enable or Disable the profile")]
[Choice("Enable", "Enable")]
[Choice("Disable", "Disable")] string toggle
)
{
_logger . LogInformation ( "SlashCommand:{userId}:{Method}:{params}" ,
Context . Interaction . User . Id , nameof ( ToggleUserProfile ) ,
string . Join ( "," , new [ ] { $"{nameof(uid)}:{uid}" } ) ) ;
try
{
using HttpClient c = new HttpClient ( ) ;
c . DefaultRequestHeaders . Authorization = new System . Net . Http . Headers . AuthenticationHeaderValue ( "Bearer" , _serverTokenGenerator . Token ) ;
string endpoint = string . Equals ( toggle , "Enable" , StringComparison . Ordinal ) ? "/user/enableProfile" : "/user/disableProfile" ;
using ( await c . PostAsJsonAsync ( new Uri ( _lightlessServicesConfiguration . GetValue < Uri >
( nameof ( ServicesConfiguration . MainServerAddress ) ) , endpoint ) , new UserProfileAvailabilityRequest ( uid ) )
. ConfigureAwait ( false ) ) { }
var discordChannelForMessages = _lightlessServicesConfiguration . GetValueOrDefault < ulong? > ( nameof ( ServicesConfiguration . DiscordChannelForMessages ) , null ) ;
if ( discordChannelForMessages ! = null )
{
var discordChannel = await Context . Guild . GetChannelAsync ( discordChannelForMessages . Value ) . ConfigureAwait ( false ) as IMessageChannel ;
if ( discordChannel ! = null )
{
var embedColor = Color . Blue ;
var action = string . Equals ( toggle , "Enable" , StringComparison . Ordinal ) ? "enabled" : "disabled" ;
EmbedBuilder eb = new ( ) ;
eb . WithTitle ( $"Profile {action}" ) ;
eb . WithColor ( embedColor ) ;
eb . WithDescription ( $"{uid}'s profile has been {action}" ) ;
await discordChannel . SendMessageAsync ( embed : eb . Build ( ) ) . ConfigureAwait ( false ) ;
}
}
await RespondAsync ( "Message sent" , ephemeral : true ) . ConfigureAwait ( false ) ;
}
catch ( Exception ex )
{
EmbedBuilder eb = new ( ) ;
eb . WithTitle ( "An error occured" ) ;
eb . WithDescription ( "Please report this: " + Environment . NewLine + ex . Message + Environment . NewLine + ex . StackTrace + Environment . NewLine ) ;
await RespondAsync ( embeds : new Embed [ ] { eb . Build ( ) } , ephemeral : true ) . ConfigureAwait ( false ) ;
}
}
[SlashCommand("Toggle Group Profile", "ADMIN ONLY: toggle a group profile by their gid")]
public async Task ToggleGroupProfile (
[Summary("gid", "gid to disable")] string gid ,
[Summary("toggle", "Enable or Disable the profile")]
[Choice("Enable", "Enable")]
[Choice("Disable", "Disable")] string toggle
)
{
_logger . LogInformation ( "SlashCommand:{userId}:{Method}:{params}" ,
Context . Interaction . User . Id , nameof ( ToggleUserProfile ) ,
string . Join ( "," , new [ ] { $"{nameof(gid)}:{gid}" } ) ) ;
try
{
using HttpClient c = new HttpClient ( ) ;
c . DefaultRequestHeaders . Authorization = new System . Net . Http . Headers . AuthenticationHeaderValue ( "Bearer" , _serverTokenGenerator . Token ) ;
string endpoint = string . Equals ( toggle , "Enable" , StringComparison . Ordinal ) ? "/group/enableProfile" : "/group/disableProfile" ;
using ( await c . PostAsJsonAsync ( new Uri ( _lightlessServicesConfiguration . GetValue < Uri >
( nameof ( ServicesConfiguration . MainServerAddress ) ) , endpoint ) , new GroupProfileAvailabilityRequest ( gid ) )
. ConfigureAwait ( false ) ) { }
var discordChannelForMessages = _lightlessServicesConfiguration . GetValueOrDefault < ulong? > ( nameof ( ServicesConfiguration . DiscordChannelForMessages ) , null ) ;
if ( discordChannelForMessages ! = null )
{
var discordChannel = await Context . Guild . GetChannelAsync ( discordChannelForMessages . Value ) . ConfigureAwait ( false ) as IMessageChannel ;
if ( discordChannel ! = null )
{
var embedColor = Color . Blue ;
var action = string . Equals ( toggle , "Enable" , StringComparison . Ordinal ) ? "enabled" : "disabled" ;
EmbedBuilder eb = new ( ) ;
eb . WithTitle ( $"Profile {action}" ) ;
eb . WithColor ( embedColor ) ;
eb . WithDescription ( $"{gid}'s profile has been {action}" ) ;
await discordChannel . SendMessageAsync ( embed : eb . Build ( ) ) . ConfigureAwait ( false ) ;
}
}
await RespondAsync ( "Message sent" , ephemeral : true ) . ConfigureAwait ( false ) ;
}
catch ( Exception ex )
{
EmbedBuilder eb = new ( ) ;
eb . WithTitle ( "An error occured" ) ;
eb . WithDescription ( "Please report this: " + Environment . NewLine + ex . Message + Environment . NewLine + ex . StackTrace + Environment . NewLine ) ;
await RespondAsync ( embeds : new Embed [ ] { eb . Build ( ) } , ephemeral : true ) . ConfigureAwait ( false ) ;
}
}
public async Task < Embed > HandleUserAdd ( string desiredUid , ulong discordUserId )
{
var embed = new EmbedBuilder ( ) ;