/SlackNet

A comprehensive Slack API client for .NET

Primary LanguageC#MIT LicenseMIT

SlackNet

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.

Getting Started

There are three 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.
  • SlackNet.AzureFunctions: Azure Functions 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.

SlackNet

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" });

Socket Mode

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.

SlackNet.AspNetCore

Configure SlackNet in the setup of your ASP.NET Core app:

builder.Services.AddSlackNet(c => c
    .UseApiToken("<your bot or user OAuth token here>")
    .UseSigningSecret("<your signing secret here>"));
var app = builder.Build();
app.UseSlackNet();

Add event handler registrations inside the AddSlackNet callback. See the SlackNetDemo project for more detail.

Developing with Socket Mode

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());

Endpoints naming convention

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.MapToPrefix("api/slack"));
}

SlackNet.AzureFunctions

SlackNet.AzureFunctions is based on SlackNet.AspNetCore, so you'll need to start by configuring ASP.NET Core integration.

Copy the SlackEndpoints class into your project. This provides the functions for Slack to call, and delegates request handling to SlackNet.

Configure SlackNet in the setup of your Azure Functions app:

hostBuilder.ConfigureFunctionsWebApplication(builder => builder.UseSlackNet());
hostBuilder.ConfigureServices(services => services
    .AddSlackNet(c => c
        .UseApiToken("<your bot or user OAuth token here>")
        .UseSigningSecret("<your signing secret here>")));

Add event handler registrations inside the AddSlackNet callback. See the AzureFunctionsExample project for more detail.

Note: Early responses are not supported in Azure Functions, so be sure to finish handling requests in a timely manner.

Examples

Several example projects are provided to help you get started.

Contributing

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.