Remora.Discord.Interactivity 3.0.21

The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org. Prefix Reserved
There is a newer version of this package available.
See the version list below for details.
dotnet add package Remora.Discord.Interactivity --version 3.0.21
NuGet\Install-Package Remora.Discord.Interactivity -Version 3.0.21
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Remora.Discord.Interactivity" Version="3.0.21" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Remora.Discord.Interactivity --version 3.0.21
#r "nuget: Remora.Discord.Interactivity, 3.0.21"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Remora.Discord.Interactivity as a Cake Addin
#addin nuget:?package=Remora.Discord.Interactivity&version=3.0.21

// Install Remora.Discord.Interactivity as a Cake Tool
#tool nuget:?package=Remora.Discord.Interactivity&version=3.0.21

Remora.Discord.Interactivity

This package provides a framework for creating interaction-driven entities using Discord's message components.

Structure

The library's design revolves around an MVC-like architecture, where your application provides and drives the model and controller, while Discord serves as the view.

A controller is implemented by creating a class that implements IInteractiveEntity, which in turn may access data from an arbitrary model of your choice (EF Core, in-memory data, external APIs, etc). This entity is then instantiated and invoked when your application receives a component interaction, and declares its interest in the interaction based on contextual data.

Interested entities (of which there may be several) are then allowed to perform their implemented functionality in order to update the model or view.

Usage

First, add the required services to the dependency injection container.

services.AddInteractivity();

In order to respond to incoming component interactions, declare a class that implements one or more interfaces related to the component type the entity wishes to provide business logic for (such as IButtonInteractiveEntity, ISelectMenuInteractiveEntity, or IModalInteractiveEntity).

Entities are transient services, so you may inject any other dependencies in normal fashion.

public class MyEntity : IButtonInteractiveEntity
{
    public Task<Result<bool>> IsInterestedAsync(ComponentType? componentType, string customID, CancellationToken ct = default)
    {
        // ...
    }
    
    public Task<Result> HandleInteractionAsync(IUser user, string customID, CancellationToken ct = default)
    {
        // ...
    }
}

These entities must then be registered with your dependency injection container.

services.AddInteractiveEntity<MyEntity>();

External model

If your controller manipulates data from an external model, it is up to you to appropriately synchronize access or inject relevant services into the entity.

In-memory model

If your controller only has simple needs, a built-in in-memory model may be used, wherein access to a shared object is controlled by Remora. Entities that wish to access the same in-memory model are executed sequentially, and changes made to the object are propagated between each entity.

Entities which wish to use this in-memory model must inherit from InMemoryPersistentInteractiveEntity<TData>, and messages associated with these entities must be sent via the InteractiveMessageService where an initial model state is provided.

public class MyInMemoryEntity : InMemoryPersistentInteractiveEntity, IButtonInteractiveEntity
{
    public string Nonce => _myContextualInformation.Nonce;

    public Task<Result<bool>> IsInterestedAsync(ComponentType? componentType, string customID, CancellationToken ct = default)
    {
        // ...
    }
    
    public Task<Result> HandleInteractionAsync(IUser user, string customID, CancellationToken ct = default)
    {
        // ...
        this.Data.DoSomething();
    }
}

The Nonce property is used to identify which shared object the entity wishes to act upon, and is usually formed from contextual information injected into the entity (such as a guild, channel, user, or message ID).

If the shared object should be deleted after the entity has finished executing, you may set the DeleteData property to true.

Note that the shared objects are not deleted automatically, and do not have a set lifetime. If you do not flag them for deletion at some point, they will persist indefinitely.

Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (3)

Showing the top 3 NuGet packages that depend on Remora.Discord.Interactivity:

Package Downloads
Remora.Discord The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.

Metapackage for Remora.Discord's various components

Remora.Discord.Extensions The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.

Utilities and components which extend upon Remora.Discord's base resources

Remora.Discord.Pagination The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.

Button-based pagination of messages for Remora.Discord

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
4.5.3 12,583 2/5/2024
4.5.2 14,050 11/14/2023
4.5.1 29,011 7/24/2023
4.5.0 18,428 5/11/2023
4.4.6 1,745 3/20/2023
4.4.5 2,162 1/19/2023
4.4.4 1,542 1/10/2023
4.4.3 1,874 12/28/2022
4.4.2 1,248 12/13/2022
4.4.1 946 12/13/2022
4.4.0 970 12/10/2022
4.3.0 1,503 10/30/2022
4.2.6 16,741 9/2/2022
4.2.5 1,384 8/19/2022
4.2.4 1,545 7/28/2022
4.2.3 1,393 7/26/2022
4.2.2 1,271 7/26/2022
4.2.1 1,819 6/30/2022
4.2.0 1,300 6/30/2022
4.1.0 1,251 6/29/2022
4.0.0 1,292 6/27/2022
3.0.26 1,379 6/23/2022
3.0.25 1,846 6/20/2022
3.0.24 1,324 6/19/2022
3.0.23 1,279 6/18/2022
3.0.22 1,432 6/14/2022
3.0.21 1,338 6/8/2022
3.0.20 1,358 6/3/2022
3.0.19 1,367 5/25/2022
3.0.18 1,378 5/23/2022
3.0.17 1,462 5/15/2022
3.0.16 1,371 5/10/2022
3.0.15 1,331 5/9/2022
3.0.14 1,326 5/8/2022
3.0.13 1,406 5/3/2022
3.0.12 1,662 4/28/2022
3.0.11 1,305 4/28/2022
3.0.10 1,324 4/25/2022
3.0.9 1,730 4/18/2022
3.0.8 1,332 4/18/2022
3.0.7 1,502 4/2/2022
3.0.6 1,336 4/2/2022
3.0.5 1,395 3/21/2022
3.0.4 1,374 3/17/2022
3.0.3 1,288 3/15/2022
3.0.2 1,777 2/20/2022
3.0.1 1,280 2/20/2022
3.0.0 1,358 2/19/2022
3.0.0-rc1 622 2/14/2022
2.0.0 1,368 2/14/2022
1.0.4 1,602 1/27/2022
1.0.3 2,452 1/11/2022
1.0.2 34,370 1/2/2022
1.0.1 844 1/1/2022
1.0.0 959 12/29/2021

Improve result usage.
           Update dependencies.