2023-10-24 13:25:45 +00:00
using BiblioTech.Options ;
2024-09-30 08:59:22 +00:00
using Discord ;
using GethPlugin ;
using k8s.KubeConfigModels ;
using NBitcoin.Secp256k1 ;
2023-10-22 08:10:52 +00:00
2023-10-22 08:38:46 +00:00
namespace BiblioTech.Commands
2023-10-22 08:10:52 +00:00
{
public class UserAssociateCommand : BaseCommand
{
2024-01-22 09:27:07 +00:00
public UserAssociateCommand ( NotifyCommand notifyCommand )
{
this . notifyCommand = notifyCommand ;
}
private readonly NotifyCommand notifyCommand ;
2023-10-25 09:25:27 +00:00
private readonly EthAddressOption ethOption = new EthAddressOption ( isRequired : false ) ;
2023-10-22 08:38:46 +00:00
private readonly UserOption optionalUser = new UserOption (
description : "If set, associates Ethereum address for another user. (Optional, admin-only)" ,
isRequired : false ) ;
2023-10-22 08:10:52 +00:00
public override string Name = > "set" ;
2023-11-02 11:30:48 +00:00
public override string StartingMessage = > RandomBusyMessage . Get ( ) ;
2023-10-22 09:10:45 +00:00
public override string Description = > "Associates a Discord user with an Ethereum address." ;
public override CommandOption [ ] Options = > new CommandOption [ ] { ethOption , optionalUser } ;
2023-10-22 08:10:52 +00:00
2023-10-24 13:25:45 +00:00
protected override async Task Invoke ( CommandContext context )
2023-10-22 08:10:52 +00:00
{
2023-10-25 09:25:27 +00:00
var user = GetUserFromCommand ( optionalUser , context ) ;
2024-09-30 08:59:22 +00:00
var newAddress = await ethOption . Parse ( context ) ;
if ( newAddress = = null ) return ;
2023-10-22 08:10:52 +00:00
2023-10-25 09:25:27 +00:00
var currentAddress = Program . UserRepo . GetCurrentAddressForUser ( user ) ;
2023-10-24 13:25:45 +00:00
if ( currentAddress ! = null & & ! IsSenderAdmin ( context . Command ) )
2023-10-22 08:10:52 +00:00
{
2023-10-25 08:54:26 +00:00
await context . Followup ( $"You've already set your Ethereum address to {currentAddress}." ) ;
2024-09-30 08:59:22 +00:00
await Program . AdminChecker . SendInAdminChannel ( $"User {Mention(user)} used '/{Name}' but already has an address set. ({currentAddress})" ) ;
2023-10-22 08:10:52 +00:00
return ;
}
2024-09-30 08:59:22 +00:00
var result = Program . UserRepo . AssociateUserWithAddress ( user , newAddress ) ;
switch ( result )
2023-10-25 08:25:00 +00:00
{
2024-09-30 08:59:22 +00: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})" ) ;
}
private async Task ResponseOK ( CommandContext context , IUser user , GethPlugin . EthAddress newAddress )
{
await context . Followup ( new string [ ]
{
2024-01-22 09:27:07 +00:00
"Done! Thank you for joining the test net!" ,
2024-09-30 08:59:22 +00:00
"By default, the bot will @-mention you with test-net related notifications." ,
2024-01-22 09:27:07 +00:00
$"You can enable/disable this behavior with the '/{notifyCommand.Name}' command."
2024-09-30 08:59:22 +00:00
} ) ;
await Program . AdminChecker . SendInAdminChannel ( $"User {Mention(user)} used '/{Name}' successfully. ({newAddress})" ) ;
2023-10-22 08:10:52 +00:00
}
}
}