Slack.NetStandard 4.0.0

.NET Standard 2.0
There is a newer prerelease version of this package available.
See the version list below for details.
Install-Package Slack.NetStandard -Version 4.0.0
dotnet add package Slack.NetStandard --version 4.0.0
<PackageReference Include="Slack.NetStandard" Version="4.0.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Slack.NetStandard --version 4.0.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Slack.NetStandard, 4.0.0"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install Slack.NetStandard as a Cake Addin
#addin nuget:?package=Slack.NetStandard&version=4.0.0

// Install Slack.NetStandard as a Cake Tool
#tool nuget:?package=Slack.NetStandard&version=4.0.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

Slack.NetStandard

.NET Core NuGet package that helps with Slack interactions Available at https://www.nuget.org/packages/Slack.NetStandard

Create OAuth URL

using Slack.NetStandard.Auth;

var builder = new OAuthV2Builder("clientId")
{
    State = "stateGoesHere", 
    BotScope = "channels:read"
};
var redirectUri = builder.BuildUri();

Get OAuth Access Token from Code

using Slack.NetStandard.Auth;

var token = await OAuthV2Builder.Exchange(code,clientId,clientSecret);

Verify Incoming Request is from Slack

using Slack.NetStandard;

var verifier = new RequestVerifier(signingSecret);
var verified = verifier.Verify(request.Headers[RequestVerifier.SignatureHeaderName], long.Parse(request.Headers[RequestVerifier.TimestampHeaderName]), request.Body);

Receive/Respond to a slash command payload

var command = new SlashCommand(payloadText);

var message = new InteractionMessage();
message.Blocks.Add(new Section{Text = new PlainText("Only title is required")});
message.Blocks.Add(new Divider());
message.Send(command.ResponseUrl);

await command.Respond(message);

// or - if it's not from a slash command, any response url can use
await command.Response(responseUrl);

Building & sending a modal

var view = new View
{
    Type = "modal",
    Title = "Create New Story",
    Close = "Cancel",
    Submit = "Submit",
    Blocks = new List<IMessageBlock>
    {
       new Section{Text = new PlainText("Only title is required")}
    }
};

var client = new SlackWebApiClient(accessToken);
var response = await client.View.Open(triggerId,view);

Sending a new message to a channel

var request = new PostMessageRequest {Channel = "C123456"};
request.Blocks.Add(new Section{Text = new PlainText("Hi There!")});

var client = new SlackWebApiClient("token");
await client.Chat.Post(request);

Parse Events API Body

using Slack.NetStandard.EventsApi;
using Slack.NetStandard.EventsApi.CallbackEvents;

var eventObject = JsonConvert.DeserializeObject<Event>(input.Body);

if (eventObject is EventCallback callback)
{
    switch(callback.Event)
    {
        case AppHomeOpened appHome:
            break;
        case GroupClose groupClose:
            break;

    }
}

Parse incoming text for entities (channels, users, links etc.)

var entities = TextParser.FindEntities("<@W123456|Steven>");
if(entities.First() is UserMention mention)
{
    var userId = mention.UserId //W123456
    var label = mention.Label //Steven
}

Socket Mode - getting to your payload

if(msg.Contains("envelope_id")) //If there's no envelope ID it's a Hello or Disconnect object
{
   var env = JsonConvert.DeserializeObject<Envelope>(msg);
   switch(env.Payload) {
     case SlashCommand command:
       //logic here
       break;
     case EventCallback evt: 
       //logic here
       break;
     case InteractionPayload payload:
       //logic here
       break;
   }
   var ack = new Acknowledge{EnvelopeId=env.EnvelopeId} //All messages must be acknowledged within a few seconds
   Send(ack);
}

For a .NET 3.1 client that helps with a lot of the Socket Mode plumbing, the SocketSample app is now available at Slack.NetStandard.AsyncEnumerable

Product Versions
.NET net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows
.NET Core netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1
.NET Standard netstandard2.0 netstandard2.1
.NET Framework net461 net462 net463 net47 net471 net472 net48
MonoAndroid monoandroid
MonoMac monomac
MonoTouch monotouch
Tizen tizen40 tizen60
Xamarin.iOS xamarinios
Xamarin.Mac xamarinmac
Xamarin.TVOS xamarintvos
Xamarin.WatchOS xamarinwatchos
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Slack.NetStandard:

Package Downloads
Slack.NetStandard.Endpoint

Small library used to build single Slack endpoints - allowing simpler wiring of Slack apps by examining the full request and deserializing appropriately

Slack.NetStandard.AsyncEnumerable

Additional support for Slack.NetStandard apps running Socket Mode

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
4.1.0-beta1 7 7/1/2022
4.0.0 7 7/1/2022
3.14.0-beta6 7 7/1/2022
3.14.0-beta5 37 6/10/2022
3.14.0-beta4 42 6/7/2022
3.14.0-beta3 41 6/3/2022
3.14.0-beta2 46 6/1/2022
3.14.0-beta1 43 6/1/2022
3.13.5 8 7/1/2022
3.13.4 653 6/10/2022
3.13.3 388 6/7/2022
3.13.2 155 6/3/2022
3.13.1 201 6/1/2022
3.13.0 72 6/1/2022
3.13.0-beta2 42 5/27/2022
3.13.0-beta1 47 5/13/2022
3.12.1 230 5/27/2022
3.12.0 821 5/13/2022
3.12.0-beta2 58 4/13/2022
3.12.0-beta1 40 4/5/2022
3.11.0 3,152 4/5/2022
3.11.0-beta1 53 2/23/2022
3.10.0 5,107 2/23/2022
3.10.0-beta2 48 2/17/2022
3.10.0-beta1 55 2/9/2022
3.9.1 428 2/17/2022
3.9.0 288 2/9/2022
3.9.0-beta1 64 2/1/2022
3.8.0 334 2/1/2022
3.8.0-beta3 76 1/15/2022
3.8.0-beta2 64 1/13/2022
3.8.0-beta1 58 1/12/2022
3.7.1 3,916 1/13/2022
3.7.0 99 1/12/2022
3.7.0-beta1 79 12/20/2021
3.6.0 304 12/20/2021
3.6.0-beta1 80 12/14/2021
3.5.0 473 12/14/2021
3.5.0-beta1 3,141 11/25/2021
3.4.0 3,946 11/25/2021
3.4.0-beta1 737 10/10/2021
3.3.0 62,164 10/6/2021
3.2.0 3,388 9/3/2021
3.2.0-beta1 141 8/17/2021
3.1.0 840 8/17/2021
3.0.0 2,599 7/19/2021
2.17.0-beta4 217 6/8/2021
2.17.0-beta3 250 5/30/2021
2.17.0-beta2 187 5/22/2021
2.17.0-beta1 120 5/8/2021
2.16.3 15,889 6/8/2021
2.16.2 529 5/30/2021
2.16.1 225 5/22/2021
2.16.0 545 5/8/2021
2.16.0-beta3 135 5/2/2021
2.16.0-beta2 115 4/28/2021
2.16.0-beta1 215 4/7/2021
2.15.2 222 5/2/2021
2.15.1 1,275 4/28/2021
2.15.0 1,960 4/7/2021
2.15.0-beta5 105 4/7/2021
2.15.0-beta3 3,171 3/21/2021
2.15.0-beta2 205 3/18/2021
2.15.0-beta1 119 3/17/2021
2.14.4 153 4/7/2021
2.14.2 1,810 3/21/2021
2.14.1 169 3/18/2021
2.14.0 190 3/17/2021
2.14.0-beta3 113 3/4/2021
2.14.0-beta2 107 3/2/2021
2.14.0-beta1 124 3/2/2021
2.13.2 318 3/4/2021
2.13.1 6,243 3/2/2021
2.13.0 530 3/2/2021
2.13.0-beta1 135 2/24/2021
2.12.0 329 2/24/2021
2.12.0-beta1 114 2/22/2021
2.11.0 2,756 2/22/2021
2.10.1 198 2/11/2021
2.10.0 983 1/28/2021
2.10.0-beta2 122 1/16/2021
2.10.0-beta1 114 1/15/2021
2.9.2 170 1/27/2021
2.9.1 203 1/16/2021
2.9.0 234 1/15/2021
2.9.0-beta8 162 1/11/2021
2.9.0-beta7 199 12/10/2020
2.9.0-beta6 204 11/30/2020
2.9.0-beta5 204 11/28/2020
2.9.0-beta4 200 11/26/2020
2.9.0-beta3 243 10/20/2020
2.9.0-beta2 188 10/20/2020
2.9.0-beta 225 10/20/2020
2.8.7 3,091 1/11/2021
2.8.6 1,911 12/10/2020
2.8.5 3,674 11/30/2020
2.8.4 305 11/28/2020
2.8.3 271 11/26/2020
2.8.2 1,300 10/20/2020
2.8.1 237 10/20/2020
2.8.0 272 10/20/2020
2.8.0-beta 263 10/17/2020
2.7.0 303 10/17/2020
2.7.0-beta2 173 10/17/2020
2.7.0-beta 219 10/14/2020
2.6.1 210 10/17/2020
2.6.0 263 10/14/2020
2.6.0-beta 288 10/8/2020
2.5.1 364 10/8/2020
2.5.0 332 10/8/2020
2.4.0 305 10/5/2020
2.3.0 982 9/17/2020
2.2.1 14,109 9/1/2020
2.2.0 243 8/28/2020
2.1.0 9,116 6/16/2020
2.0.0 424 5/29/2020
1.7.1 274 5/28/2020
1.7.0 351 5/21/2020
1.6.0 273 5/21/2020
1.5.5 306 5/17/2020
1.5.4 260 5/14/2020
1.5.3 293 5/11/2020
1.5.2 310 5/6/2020
1.5.1 314 5/4/2020
1.5.0 266 5/4/2020
1.4.2 273 5/4/2020
1.4.1 271 5/4/2020
1.4.0 299 5/4/2020
1.3.2 291 5/4/2020
1.3.1 367 4/30/2020
1.3.0 291 4/29/2020
1.2.1 293 4/29/2020
1.2.0 285 4/29/2020
1.1.0 266 4/28/2020
1.0.2 256 4/28/2020
1.0.1 268 4/27/2020
1.0.0 336 4/21/2020
0.5.0 306 4/13/2020
0.4.1-alpha8 275 4/12/2020
0.4.1-alpha7 265 4/12/2020
0.4.1-alpha6 272 4/12/2020
0.4.1-alpha4 282 4/12/2020
0.4.1-alpha3 292 4/12/2020
0.4.1-alpha2 226 4/12/2020
0.4.1-alpha1 242 4/11/2020
0.4.0-pre 382 4/5/2020
0.3.2 353 1/3/2020
0.3.1 329 1/3/2020
0.3.0 364 1/2/2020
0.2.2 349 12/23/2019
0.2.1 304 12/23/2019
0.2.1-pre 293 12/19/2019
0.2.0 310 12/20/2019
0.2.0-pre 289 12/18/2019
0.1.1-pre 276 12/17/2019
0.1.0 308 12/19/2019
0.1.0-pre 281 12/17/2019

Updated properties to use Lists wherever it's involved in making a request