2023-10-24 15:25:45 +02:00
using BiblioTech.Options ;
2024-09-30 10:59:22 +02:00
using Discord ;
2025-01-16 13:51:29 +01:00
using Utils ;
2023-10-22 10:10:52 +02:00
2023-10-22 10:38:46 +02:00
namespace BiblioTech.Commands
2023-10-22 10:10:52 +02:00
{
public class UserAssociateCommand : BaseCommand
{
2024-01-22 10:27:07 +01:00
public UserAssociateCommand ( NotifyCommand notifyCommand )
{
this . notifyCommand = notifyCommand ;
}
private readonly NotifyCommand notifyCommand ;
2023-10-25 11:25:27 +02:00
private readonly EthAddressOption ethOption = new EthAddressOption ( isRequired : false ) ;
2023-10-22 10:38:46 +02:00
private readonly UserOption optionalUser = new UserOption (
description : "If set, associates Ethereum address for another user. (Optional, admin-only)" ,
isRequired : false ) ;
2023-10-22 10:10:52 +02:00
public override string Name = > "set" ;
2023-11-02 12:30:48 +01:00
public override string StartingMessage = > RandomBusyMessage . Get ( ) ;
2023-10-22 11:10:45 +02:00
public override string Description = > "Associates a Discord user with an Ethereum address." ;
public override CommandOption [ ] Options = > new CommandOption [ ] { ethOption , optionalUser } ;
2023-10-22 10:10:52 +02:00
2023-10-24 15:25:45 +02:00
protected override async Task Invoke ( CommandContext context )
2023-10-22 10:10:52 +02:00
{
2023-10-25 11:25:27 +02:00
var user = GetUserFromCommand ( optionalUser , context ) ;
2024-09-30 10:59:22 +02:00
var newAddress = await ethOption . Parse ( context ) ;
if ( newAddress = = null ) return ;
2023-10-22 10:10:52 +02:00
2023-10-25 11:25:27 +02:00
var currentAddress = Program . UserRepo . GetCurrentAddressForUser ( user ) ;
2023-10-24 15:25:45 +02:00
if ( currentAddress ! = null & & ! IsSenderAdmin ( context . Command ) )
2023-10-22 10:10:52 +02:00
{
2023-10-25 10:54:26 +02:00
await context . Followup ( $"You've already set your Ethereum address to {currentAddress}." ) ;
2024-09-30 10:59:22 +02:00
await Program . AdminChecker . SendInAdminChannel ( $"User {Mention(user)} used '/{Name}' but already has an address set. ({currentAddress})" ) ;
2023-10-22 10:10:52 +02:00
return ;
}
2024-09-30 10:59:22 +02:00
var result = Program . UserRepo . AssociateUserWithAddress ( user , newAddress ) ;
switch ( result )
2023-10-25 10:25:00 +02:00
{
2024-09-30 10:59:22 +02:00
case SetAddressResponse . OK :
await ResponseOK ( context , user , newAddress ) ;
break ;
case SetAddressResponse . AddressAlreadyInUse :
await ResponseAlreadyUsed ( context , user , newAddress ) ;
break ;
case SetAddressResponse . CreateUserFailed :
await ResponseCreateUserFailed ( context , user ) ;
break ;
default :
throw new Exception ( "Unknown SetAddressResponse mode" ) ;
}
}
private async Task ResponseCreateUserFailed ( CommandContext context , IUser user )
{
await context . Followup ( "Internal error. Error details sent to admin." ) ;
await Program . AdminChecker . SendInAdminChannel ( $"User {Mention(user)} used '/{Name}' but failed to create new user." ) ;
}
private async Task ResponseAlreadyUsed ( CommandContext context , IUser user , EthAddress newAddress )
{
await context . Followup ( "This address is already in use by another user." ) ;
await Program . AdminChecker . SendInAdminChannel ( $"User {Mention(user)} used '/{Name}' but the provided address is already in use by another user. (address: {newAddress})" ) ;
}
2025-01-16 13:51:29 +01:00
private async Task ResponseOK ( CommandContext context , IUser user , EthAddress newAddress )
2024-09-30 10:59:22 +02:00
{
await context . Followup ( new string [ ]
2025-01-16 13:51:29 +01:00
{
2024-01-22 10:27:07 +01:00
"Done! Thank you for joining the test net!" ,
2024-09-30 10:59:22 +02:00
"By default, the bot will @-mention you with test-net related notifications." ,
2024-01-22 10:27:07 +01:00
$"You can enable/disable this behavior with the '/{notifyCommand.Name}' command."
2025-01-16 13:51:29 +01:00
} ) ;
2024-09-30 10:59:22 +02:00
await Program . AdminChecker . SendInAdminChannel ( $"User {Mention(user)} used '/{Name}' successfully. ({newAddress})" ) ;
2023-10-22 10:10:52 +02:00
}
}
}