mirror of
				https://gitlab.com/Kwoth/nadekobot.git
				synced 2025-11-04 08:34:27 -05:00 
			
		
		
		
	- Added a simple bank system. Users can deposit, withdraw and check the balance of their currency in the bank.
- Users can't check other user's bank balances. - Added a button on a .$ command which, when clicked, sends you a message with your bank balance that only you can see. - Updated pagination, it now uses buttons instead of reactions - using .h <command group> (atm only .bank is a proper group) will list commands with their descriptions in that group
This commit is contained in:
		
							
								
								
									
										80
									
								
								src/NadekoBot/Common/NadekoInteractionBase.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								src/NadekoBot/Common/NadekoInteractionBase.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
			
		||||
namespace NadekoBot;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public abstract class NadekoInteraction
 | 
			
		||||
{
 | 
			
		||||
    // improvements:
 | 
			
		||||
    //  - state in OnAction
 | 
			
		||||
    //  - configurable delay
 | 
			
		||||
    //  - 
 | 
			
		||||
    public abstract string Name { get; }
 | 
			
		||||
    public abstract IEmote Emote { get; }
 | 
			
		||||
    public Func<SocketMessageComponent, Task> OnAction { get; }
 | 
			
		||||
 | 
			
		||||
    protected readonly DiscordSocketClient _client;
 | 
			
		||||
 | 
			
		||||
    protected readonly TaskCompletionSource<bool> _interactionCompletedSource;
 | 
			
		||||
 | 
			
		||||
    protected ulong _authorId;
 | 
			
		||||
    protected IUserMessage message;
 | 
			
		||||
 | 
			
		||||
    protected NadekoInteraction(DiscordSocketClient client, ulong authorId, Func<SocketMessageComponent, Task> onAction)
 | 
			
		||||
    {
 | 
			
		||||
        _client = client;
 | 
			
		||||
        _authorId = authorId;
 | 
			
		||||
        OnAction = onAction;
 | 
			
		||||
        _interactionCompletedSource = new(TaskCreationOptions.RunContinuationsAsynchronously);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public async Task RunAsync(IUserMessage msg)
 | 
			
		||||
    {
 | 
			
		||||
        message = msg;
 | 
			
		||||
 | 
			
		||||
        _client.InteractionCreated += OnInteraction;
 | 
			
		||||
        await Task.WhenAny(Task.Delay(10_000), _interactionCompletedSource.Task);
 | 
			
		||||
        _client.InteractionCreated -= OnInteraction;
 | 
			
		||||
 | 
			
		||||
        await msg.ModifyAsync(m => m.Components = new ComponentBuilder().Build());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private async Task OnInteraction(SocketInteraction arg)
 | 
			
		||||
    {
 | 
			
		||||
        if (arg is not SocketMessageComponent smc)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (smc.Message.Id != message.Id)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (smc.Data.CustomId != Name)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (smc.User.Id != _authorId)
 | 
			
		||||
        {
 | 
			
		||||
            await arg.DeferAsync();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        _ = Task.Run(async () =>
 | 
			
		||||
        {
 | 
			
		||||
            await OnAction(smc);
 | 
			
		||||
            
 | 
			
		||||
            // this should only be a thing on single-response buttons
 | 
			
		||||
            _interactionCompletedSource.TrySetResult(true);
 | 
			
		||||
 | 
			
		||||
            if (!smc.HasResponded)
 | 
			
		||||
            {
 | 
			
		||||
                await smc.DeferAsync();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public MessageComponent CreateComponent()
 | 
			
		||||
    {
 | 
			
		||||
        var comp = new ComponentBuilder()
 | 
			
		||||
            .WithButton(new ButtonBuilder(style: ButtonStyle.Secondary, emote: Emote, customId: Name));
 | 
			
		||||
 | 
			
		||||
        return comp.Build();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
    
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
#nullable disable
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using MessageType = NadekoBot.Extensions.MessageType;
 | 
			
		||||
 | 
			
		||||
// ReSharper disable InconsistentNaming
 | 
			
		||||
 | 
			
		||||
@@ -29,20 +30,15 @@ public abstract class NadekoModule : ModuleBase
 | 
			
		||||
 | 
			
		||||
    protected string GetText(in LocStr data)
 | 
			
		||||
        => Strings.GetText(data, Culture);
 | 
			
		||||
 | 
			
		||||
    public Task<IUserMessage> SendErrorAsync(string error)
 | 
			
		||||
        => ctx.Channel.SendErrorAsync(_eb, error);
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    public Task<IUserMessage> SendErrorAsync(
 | 
			
		||||
        string title,
 | 
			
		||||
        string error,
 | 
			
		||||
        string url = null,
 | 
			
		||||
        string footer = null)
 | 
			
		||||
        string footer = null, 
 | 
			
		||||
        NadekoInteraction inter = null)
 | 
			
		||||
        => ctx.Channel.SendErrorAsync(_eb, title, error, url, footer);
 | 
			
		||||
 | 
			
		||||
    public Task<IUserMessage> SendConfirmAsync(string text)
 | 
			
		||||
        => ctx.Channel.SendConfirmAsync(_eb, text);
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    public Task<IUserMessage> SendConfirmAsync(
 | 
			
		||||
        string title,
 | 
			
		||||
        string text,
 | 
			
		||||
@@ -50,25 +46,33 @@ public abstract class NadekoModule : ModuleBase
 | 
			
		||||
        string footer = null)
 | 
			
		||||
        => ctx.Channel.SendConfirmAsync(_eb, title, text, url, footer);
 | 
			
		||||
 | 
			
		||||
    public Task<IUserMessage> SendPendingAsync(string text)
 | 
			
		||||
        => ctx.Channel.SendPendingAsync(_eb, text);
 | 
			
		||||
    // 
 | 
			
		||||
    public Task<IUserMessage> SendErrorAsync(string text, NadekoInteraction inter = null)
 | 
			
		||||
        => ctx.Channel.SendAsync(_eb, text, MessageType.Error, inter);
 | 
			
		||||
    public Task<IUserMessage> SendConfirmAsync(string text, NadekoInteraction inter = null)
 | 
			
		||||
        => ctx.Channel.SendAsync(_eb, text, MessageType.Ok, inter);
 | 
			
		||||
    public Task<IUserMessage> SendPendingAsync(string text, NadekoInteraction inter = null)
 | 
			
		||||
        => ctx.Channel.SendAsync(_eb, text, MessageType.Pending, inter);
 | 
			
		||||
 | 
			
		||||
    public Task<IUserMessage> ErrorLocalizedAsync(LocStr str)
 | 
			
		||||
        => SendErrorAsync(GetText(str));
 | 
			
		||||
    
 | 
			
		||||
    // localized normal
 | 
			
		||||
    public Task<IUserMessage> ErrorLocalizedAsync(LocStr str, NadekoInteraction inter = null)
 | 
			
		||||
        => SendErrorAsync(GetText(str), inter);
 | 
			
		||||
 | 
			
		||||
    public Task<IUserMessage> PendingLocalizedAsync(LocStr str)
 | 
			
		||||
        => SendPendingAsync(GetText(str));
 | 
			
		||||
    public Task<IUserMessage> PendingLocalizedAsync(LocStr str, NadekoInteraction inter = null)
 | 
			
		||||
        => SendPendingAsync(GetText(str), inter);
 | 
			
		||||
 | 
			
		||||
    public Task<IUserMessage> ConfirmLocalizedAsync(LocStr str)
 | 
			
		||||
        => SendConfirmAsync(GetText(str));
 | 
			
		||||
    public Task<IUserMessage> ConfirmLocalizedAsync(LocStr str, NadekoInteraction inter = null)
 | 
			
		||||
        => SendConfirmAsync(GetText(str), inter);
 | 
			
		||||
 | 
			
		||||
    public Task<IUserMessage> ReplyErrorLocalizedAsync(LocStr str)
 | 
			
		||||
    // localized replies
 | 
			
		||||
    public Task<IUserMessage> ReplyErrorLocalizedAsync(LocStr str, NadekoInteraction inter = null)
 | 
			
		||||
        => SendErrorAsync($"{Format.Bold(ctx.User.ToString())} {GetText(str)}");
 | 
			
		||||
 | 
			
		||||
    public Task<IUserMessage> ReplyPendingLocalizedAsync(LocStr str)
 | 
			
		||||
    public Task<IUserMessage> ReplyPendingLocalizedAsync(LocStr str, NadekoInteraction inter = null)
 | 
			
		||||
        => SendPendingAsync($"{Format.Bold(ctx.User.ToString())} {GetText(str)}");
 | 
			
		||||
 | 
			
		||||
    public Task<IUserMessage> ReplyConfirmLocalizedAsync(LocStr str)
 | 
			
		||||
    public Task<IUserMessage> ReplyConfirmLocalizedAsync(LocStr str, NadekoInteraction inter = null)
 | 
			
		||||
        => SendConfirmAsync($"{Format.Bold(ctx.User.ToString())} {GetText(str)}");
 | 
			
		||||
 | 
			
		||||
    public async Task<bool> PromptUserConfirmAsync(IEmbedBuilder embed)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user