An easy-to-use and comprehensive API for writing Slack apps in .NET.
This project builds on the Slack API. You should read through Slack's documentation to get an understanding of how Slack apps work and what you can do with them before using SlackNet.
There are two main NuGet packages available to install, depending on your use case.
- SlackNet: A comprehensive Slack API client for .NET, including a socket mode client for receiving events.
- SlackNet.AspNetCore: ASP.NET Core integration for receiving requests from Slack.
A SlackNet.Bot package for using Slack's deprecated RTM API is also available, but you're probably better off using the Socket Mode client instead.
To use the Web API, build the API client:
var api = new SlackServiceBuilder()
.UseApiToken("<your bot or user OAuth token here>")
.GetApiClient();
then call any of Slack's many API methods:
await api.Chat.PostMessage(new Message { Text = "Hello, Slack!", Channel = "#general" });
To use the socket mode client:
var client = new SlackServiceBuilder()
.UseAppLevelToken("<app-level OAuth token required for socket mode>")
/* Register handlers here */
.GetSocketModeClient();
await client.Connect();
A range of handler registration methods are available, but all require that you construct the handlers manually. You can simplify handler registration by integrating with a DI container. Integrations are provided for Autofac, Microsoft.Extensions.DependencyInjection, and SimpleInjector. Examples are provided for each of these options.
Configure SlackNet in your Startup class:
public void ConfigureServices(IServiceCollection services)
{
services.AddSlackNet(c => c.UseApiToken("<your OAuth access token here>"));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSlackNet(c => c.UseSigningSecret("<your signing secret here>"));
}
or in the setup of your ASP.NET Core 6.0 app:
builder.Services.AddSlackNet(c => c.UseApiToken("<your bot or user OAuth token here>"));
var app = builder.Build();
app.UseSlackNet(c => c.UseSigningSecret("<your signing secret here>"));
Add event handler registrations inside the AddSlackNet callback. See the SlackNetDemo project for more detail.
While developing an ASP.NET application, you can use socket mode instead of needing to host the website publicly, by enabling socket mode with:
app.UseSlackNet(c => c.UseSocketMode());
SlackNet.AspNetCore can be used in Azure Functions as well, although it's a little more manual at the moment.
You'll need to enable dependency injection in your project, then include in your Startup class:
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddSlackNet(c => c.UseApiToken("<your bot or user OAuth token here>"));
builder.Services.AddSingleton(new SlackEndpointConfiguration()
.UseSigningSecret("<your signing secret here>"));
}
Copy the SlackEndpoint class into your project. This provides the functions for Slack to call, and delegates request handling the same way the regular ASP.NET integration does, with the same methods for registering event handlers as above.
See the AzureFunctionExample project for more detail.
SlackNet requires the Slack app endpoints to be named after the following convention:
Endpoint | Route |
---|---|
Event subscriptions | {route_prefix}/event |
Interactivity | {route_prefix}/action |
Select menus | {route_prefix}/options |
Slash commands | {route_prefix}/command |
By default, the value of {route_prefix}
is slack
, but this can be configured like so:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSlackNet(c => c.UseSigningSecret("<your signing secret here>").MapToPrefix("api/slack"));
}
Several example projects are provided to help you get started.
Contributions are welcome. Currently, changes must be made on a feature branch, otherwise the CI build will fail.
Slack's API is large and changes often, and while their documentation is very good, it's not always 100% complete or accurate, which can easily lead to bugs or missing features in SlackNet. Raising issues or submitting pull requests for these sorts of discrepencies is highly appreciated, as realistically I have to rely on the documentation unless I happen to be using a particular API myself.