Releases: soxtoby/SlackNet
v0.9.4
v0.9.3
v0.9.2
- Added optional
includeLocaleparameter toInfoandListinUsersApi, and toStartinRtmApi. SlashCommandResponses returned byISlashCommandHandlers are properly passed on to Slack.
Potentially breaking changes
While the includeLocale parameters are optional, they haven't been added as the last parameter, so on the off chance you were using all of the optional parameters in one of the modified methods, without specifying parameter names, then you'll need to add some parameter names.
Thankyou to @Selm for helping with this release 👍
v0.9.1
v0.9.0
Socket Mode
This release introduces support for Slack's new socket mode. Socket mode gives you access to all the available Slack functionality without needing to host a public endpoint, which makes it ideal for testing a new application, or hosting it inside a local network.
TL;DR
See the SlackNet.SocketModeExample project for example usage. See Using a DI container below for example integration code. With a DI container, handler registration is the same as in SlackNet.EventsExample.
Using the built-in SlackServiceBuilder
var slackServices = new SlackServiceBuilder();
slackServices
.UseAppLevelToken("<app-level OAuth token required for socket mode>")
.RegisterEventHandler(myEventHandler)
.RegisterBlockActionHandler(myBlockActionHandler);
var client = slackService.GetSocketModeClient();
await client.Connect();SlackServiceBuilder provides registration methods for all the different types of handlers, as well as the ability to replace specific services with custom implementations, should the need arise.
It also provides methods to retrieve any of the SlackNet services, most notably GetApiClient and GetSocketModeClient.
The socket mode client
Similar to the RTM client, once connected, the socket mode client will reconnect automatically, until the client is disposed, or socket mode is disabled.
Each message received is treated as a "request", equivalent to receiving a request through the ASP.NET integration. Responses are returned as acknowledgements through the websocket connection.
By default, the socket mode client will open 2 connections, 10 seconds apart, so messages can still be received while one of the connections is being reconnected. You can configure this behaviour by passing a SocketModeConnectionOptions object into the client's Connect method.
Using a DI container
The built-in SlackServiceBuilder requires services and handlers to be constructed manually, but with a DI container, they can be registered with just a type, leaving construction to the container. Other services registered in the container can be injected as you'd expect, and services and handlers are given appropriate lifestyles.
Since the configuration has been standardised, it's pretty much the same for any container, but here's what it looks like for the provided integrations…
Autofac
Using the SlackNet.Autofac package:
var containerBuilder = new ContainerBuilder();
containerBuilder.AddSlackNet(c => c
.UseAppLevelToken("<app-level OAuth token>")
.RegisterEventHandler<MyEventHandler>()
.RegisterBlockActionHandler<MyBlockActionHandler>());
var container = containerBuilder.Build();
var client = container.Resolve<ISlackSocketModeClient>();
await client.Connect();Microsoft.Extensions.DependencyInjection
Using the SlackNet.Extensions.DependencyInjection package:
var serviceCollection = new ServiceCollection();
serviceCollection.AddSlackNet(c => c
.UseAppLevelToken("<app-level OAuth token>")
.RegisterEventHandler<MyEventHandler>()
.RegisterBlockActionHandler<MyBlockActionHandler>());
var serviceProvider = serviceCollection.BuildServiceProvider();
var client = serviceProvider.GetRequiredService<ISlackSocketModeClient>();
await client.Connect();SimpleInjector
Using the SlackNet.SimpleInjector package:
var container = new Container {
// AsyncScopedLifestyle is used for scoping handlers
Options = { DefaultScopedLifestyle = new AsyncScopedLifestyle() }
};
container.AddSlackNet(c => c
.UseAppLevelToken("<app-level OAuth token>")
.RegisterEventHandler<MyEventHandler>()
.RegisterBlockActionHandler<MyBlockActionHandler>());
var client = container.GetInstance<ISlackSocketModeClient>();
await client.Connect();Breaking Changes
SlackNet
- Added a dependency on the
Microsoft.Bcl.AsyncInterfacespackage. Default.Httptakes in aFunc<HttpClient>instead of just aHttpClient, to allow a client to be provided per request.Default.RegisterServiceshas been removed.
SlackNet.AspNetCore
- Added a dependency on the
Microsoft.AspNetCore.HttpandSlackNet.Extensions.DependencyInjectionpackages. - Updated
Microsoft.Extensions.DependencyInjection.Abstractionsdependency to 2.2.0. SlackServiceConfigurationhas been replaced withServiceCollectionSlackServiceConfigurationas the configuration object passed to theAddSlackNetconfiguration callback.IEventsObservableshas been removed. It's simple enough to re-implement if anyone needs it, but it doesn't fit the rest of the API.
v0.8.2
v0.8.1
v0.8.0
A few changes relating to Slack deprecating some of their old API features...
- The API token is always sent up as a header - fixes authorization for Slack apps created after 24th February.
Breaking Changes
- Channels, Groups, IM, and MPIM APIs have been removed. SlackNet.Bot APIs using these types will continue to work for now, but will be removed fairly soon.
EventCallback.AuthedUsershas been removed.
v0.7.12
- Added support for workflows.
- Added
Ephemeralproperty toBotMessage, to allow sending ephemeral replies. - Marked channel, group, IM, and MPIM APIs as
Obsolete. These APIs will stop functioning in February 2021.
Thanks to @fstojanac for doing most of the heavy lifting in this release 💪
v0.7.11
- Added
EventContextandAuthorizationstoEventCallback.AuthedUsersis now obsolete. - Added
AppsEventsAuthorizationsAPI toSlackApiClient. - Fleshed out the
AppMentionevent. - Fixed deserialization of user mentions in rich text blocks.
Thanks to @fstojanac and @Julian-Robinson for this release 🎉