Skip to content

Repository files navigation

SlackNet

An easy-to-use and flexible API for writing Slack bots in .NET, built on top of a comprehensive Slack API client.

Getting Started

There are three NuGet packages available to install, depending on your use case.

SlackNet

To use the Web API:

varapi=newSlackApiClient("<your OAuth access token here>");

then start calling methods:

varchannels=awaitapi.Channels.List();

To use the RTM API:

varrtm=newSlackRtmClient("<your OAuth access token here>");awaitrtm.Connect();rtm.Events.Subscribe(/* handle every event */);rtm.Messages.Subscribe(/* handle message events */);

SlackNet.Bot

varbot=newSlackBot("<your bot token here>");awaitbot.Connect();

You can handle messages in a number of ways:

// .NET eventsbot.OnMessage+=(sender,message)=>{/* handle message */};// Adding handlersclassMyMessageHandler:IMessageHandler{publicTaskHandleMessage(IMessagemessage){// handle message}}bot.AddHandler(newMyMessageHandler());// Subscribing to Rx streambot.Messages.Subscribe(/* handle message */);

The easiest way to reply to messages is by using their ReplyWith method. Replies will be sent to same channel and thread as the message being replied to.

message.ReplyWith("simple text message");message.ReplyWith(newBotMessage{Text="more complicated message",Attachments={newAttachment{Title="attachments!"}}});message.ReplyWith(async()=>{// Show typing indication in Slack while message is build builtvarasyncInfo=awaitSomeAsyncMethod();returnnewBotMessage{Text="async message: "+asyncInfo};});

SlackNet.Bot includes a simplified API for getting common information from Slack:

varuser=awaitbot.GetUserByName("someuser");varchannels=awaitbot.GetChannels();// etc.

Everything is cached, so go nuts getting the information you need. You can clear the cache with bot.ClearCache().

SlackNet.AspNetCore

In your Startup class:

publicvoidConfigureServices(IServiceCollectionservices){services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));}publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>"));}

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

Azure Functions

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:

publicoverridevoidConfigure(IFunctionsHostBuilderbuilder){builder.Services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));builder.Services.AddSingleton(newSlackEndpointConfiguration().UseSigningSecret("<your signing secret here>"));}

Copy SlackEndpoint.cs 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 SlackNet.AzureFunctionExample and SlackNet.EventsExample projects for more detail.

Endpoints naming convention

SlackNet requires the Slack app endpoints to be named after the following convention:

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:

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>").MapToPrefix("api/slack"));}

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.

About

A comprehensive Slack API client for .NET

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - mantro/SlackNet: A comprehensive Slack API client for .NET · GitHub
Skip to content

Repository files navigation

SlackNet

An easy-to-use and flexible API for writing Slack bots in .NET, built on top of a comprehensive Slack API client.

Getting Started

There are three NuGet packages available to install, depending on your use case.

SlackNet

To use the Web API:

varapi=newSlackApiClient("<your OAuth access token here>");

then start calling methods:

varchannels=awaitapi.Channels.List();

To use the RTM API:

varrtm=newSlackRtmClient("<your OAuth access token here>");awaitrtm.Connect();rtm.Events.Subscribe(/* handle every event */);rtm.Messages.Subscribe(/* handle message events */);

SlackNet.Bot

varbot=newSlackBot("<your bot token here>");awaitbot.Connect();

You can handle messages in a number of ways:

// .NET eventsbot.OnMessage+=(sender,message)=>{/* handle message */};// Adding handlersclassMyMessageHandler:IMessageHandler{publicTaskHandleMessage(IMessagemessage){// handle message}}bot.AddHandler(newMyMessageHandler());// Subscribing to Rx streambot.Messages.Subscribe(/* handle message */);

The easiest way to reply to messages is by using their ReplyWith method. Replies will be sent to same channel and thread as the message being replied to.

message.ReplyWith("simple text message");message.ReplyWith(newBotMessage{Text="more complicated message",Attachments={newAttachment{Title="attachments!"}}});message.ReplyWith(async()=>{// Show typing indication in Slack while message is build builtvarasyncInfo=awaitSomeAsyncMethod();returnnewBotMessage{Text="async message: "+asyncInfo};});

SlackNet.Bot includes a simplified API for getting common information from Slack:

varuser=awaitbot.GetUserByName("someuser");varchannels=awaitbot.GetChannels();// etc.

Everything is cached, so go nuts getting the information you need. You can clear the cache with bot.ClearCache().

SlackNet.AspNetCore

In your Startup class:

publicvoidConfigureServices(IServiceCollectionservices){services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));}publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>"));}

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

Azure Functions

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:

publicoverridevoidConfigure(IFunctionsHostBuilderbuilder){builder.Services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));builder.Services.AddSingleton(newSlackEndpointConfiguration().UseSigningSecret("<your signing secret here>"));}

Copy SlackEndpoint.cs 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 SlackNet.AzureFunctionExample and SlackNet.EventsExample projects for more detail.

Endpoints naming convention

SlackNet requires the Slack app endpoints to be named after the following convention:

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:

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>").MapToPrefix("api/slack"));}

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.

About

A comprehensive Slack API client for .NET

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - mantro/SlackNet: A comprehensive Slack API client for .NET · GitHub
Skip to content

Repository files navigation

SlackNet

An easy-to-use and flexible API for writing Slack bots in .NET, built on top of a comprehensive Slack API client.

Getting Started

There are three NuGet packages available to install, depending on your use case.

SlackNet

To use the Web API:

varapi=newSlackApiClient("<your OAuth access token here>");

then start calling methods:

varchannels=awaitapi.Channels.List();

To use the RTM API:

varrtm=newSlackRtmClient("<your OAuth access token here>");awaitrtm.Connect();rtm.Events.Subscribe(/* handle every event */);rtm.Messages.Subscribe(/* handle message events */);

SlackNet.Bot

varbot=newSlackBot("<your bot token here>");awaitbot.Connect();

You can handle messages in a number of ways:

// .NET eventsbot.OnMessage+=(sender,message)=>{/* handle message */};// Adding handlersclassMyMessageHandler:IMessageHandler{publicTaskHandleMessage(IMessagemessage){// handle message}}bot.AddHandler(newMyMessageHandler());// Subscribing to Rx streambot.Messages.Subscribe(/* handle message */);

The easiest way to reply to messages is by using their ReplyWith method. Replies will be sent to same channel and thread as the message being replied to.

message.ReplyWith("simple text message");message.ReplyWith(newBotMessage{Text="more complicated message",Attachments={newAttachment{Title="attachments!"}}});message.ReplyWith(async()=>{// Show typing indication in Slack while message is build builtvarasyncInfo=awaitSomeAsyncMethod();returnnewBotMessage{Text="async message: "+asyncInfo};});

SlackNet.Bot includes a simplified API for getting common information from Slack:

varuser=awaitbot.GetUserByName("someuser");varchannels=awaitbot.GetChannels();// etc.

Everything is cached, so go nuts getting the information you need. You can clear the cache with bot.ClearCache().

SlackNet.AspNetCore

In your Startup class:

publicvoidConfigureServices(IServiceCollectionservices){services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));}publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>"));}

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

Azure Functions

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:

publicoverridevoidConfigure(IFunctionsHostBuilderbuilder){builder.Services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));builder.Services.AddSingleton(newSlackEndpointConfiguration().UseSigningSecret("<your signing secret here>"));}

Copy SlackEndpoint.cs 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 SlackNet.AzureFunctionExample and SlackNet.EventsExample projects for more detail.

Endpoints naming convention

SlackNet requires the Slack app endpoints to be named after the following convention:

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:

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>").MapToPrefix("api/slack"));}

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.

About

A comprehensive Slack API client for .NET

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - mantro/SlackNet: A comprehensive Slack API client for .NET · GitHub
Skip to content

Repository files navigation

SlackNet

An easy-to-use and flexible API for writing Slack bots in .NET, built on top of a comprehensive Slack API client.

Getting Started

There are three NuGet packages available to install, depending on your use case.

SlackNet

To use the Web API:

varapi=newSlackApiClient("<your OAuth access token here>");

then start calling methods:

varchannels=awaitapi.Channels.List();

To use the RTM API:

varrtm=newSlackRtmClient("<your OAuth access token here>");awaitrtm.Connect();rtm.Events.Subscribe(/* handle every event */);rtm.Messages.Subscribe(/* handle message events */);

SlackNet.Bot

varbot=newSlackBot("<your bot token here>");awaitbot.Connect();

You can handle messages in a number of ways:

// .NET eventsbot.OnMessage+=(sender,message)=>{/* handle message */};// Adding handlersclassMyMessageHandler:IMessageHandler{publicTaskHandleMessage(IMessagemessage){// handle message}}bot.AddHandler(newMyMessageHandler());// Subscribing to Rx streambot.Messages.Subscribe(/* handle message */);

The easiest way to reply to messages is by using their ReplyWith method. Replies will be sent to same channel and thread as the message being replied to.

message.ReplyWith("simple text message");message.ReplyWith(newBotMessage{Text="more complicated message",Attachments={newAttachment{Title="attachments!"}}});message.ReplyWith(async()=>{// Show typing indication in Slack while message is build builtvarasyncInfo=awaitSomeAsyncMethod();returnnewBotMessage{Text="async message: "+asyncInfo};});

SlackNet.Bot includes a simplified API for getting common information from Slack:

varuser=awaitbot.GetUserByName("someuser");varchannels=awaitbot.GetChannels();// etc.

Everything is cached, so go nuts getting the information you need. You can clear the cache with bot.ClearCache().

SlackNet.AspNetCore

In your Startup class:

publicvoidConfigureServices(IServiceCollectionservices){services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));}publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>"));}

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

Azure Functions

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:

publicoverridevoidConfigure(IFunctionsHostBuilderbuilder){builder.Services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));builder.Services.AddSingleton(newSlackEndpointConfiguration().UseSigningSecret("<your signing secret here>"));}

Copy SlackEndpoint.cs 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 SlackNet.AzureFunctionExample and SlackNet.EventsExample projects for more detail.

Endpoints naming convention

SlackNet requires the Slack app endpoints to be named after the following convention:

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:

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>").MapToPrefix("api/slack"));}

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.

About

A comprehensive Slack API client for .NET

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - mantro/SlackNet: A comprehensive Slack API client for .NET · GitHub
Skip to content

Repository files navigation

SlackNet

An easy-to-use and flexible API for writing Slack bots in .NET, built on top of a comprehensive Slack API client.

Getting Started

There are three NuGet packages available to install, depending on your use case.

SlackNet

To use the Web API:

varapi=newSlackApiClient("<your OAuth access token here>");

then start calling methods:

varchannels=awaitapi.Channels.List();

To use the RTM API:

varrtm=newSlackRtmClient("<your OAuth access token here>");awaitrtm.Connect();rtm.Events.Subscribe(/* handle every event */);rtm.Messages.Subscribe(/* handle message events */);

SlackNet.Bot

varbot=newSlackBot("<your bot token here>");awaitbot.Connect();

You can handle messages in a number of ways:

// .NET eventsbot.OnMessage+=(sender,message)=>{/* handle message */};// Adding handlersclassMyMessageHandler:IMessageHandler{publicTaskHandleMessage(IMessagemessage){// handle message}}bot.AddHandler(newMyMessageHandler());// Subscribing to Rx streambot.Messages.Subscribe(/* handle message */);

The easiest way to reply to messages is by using their ReplyWith method. Replies will be sent to same channel and thread as the message being replied to.

message.ReplyWith("simple text message");message.ReplyWith(newBotMessage{Text="more complicated message",Attachments={newAttachment{Title="attachments!"}}});message.ReplyWith(async()=>{// Show typing indication in Slack while message is build builtvarasyncInfo=awaitSomeAsyncMethod();returnnewBotMessage{Text="async message: "+asyncInfo};});

SlackNet.Bot includes a simplified API for getting common information from Slack:

varuser=awaitbot.GetUserByName("someuser");varchannels=awaitbot.GetChannels();// etc.

Everything is cached, so go nuts getting the information you need. You can clear the cache with bot.ClearCache().

SlackNet.AspNetCore

In your Startup class:

publicvoidConfigureServices(IServiceCollectionservices){services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));}publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>"));}

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

Azure Functions

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:

publicoverridevoidConfigure(IFunctionsHostBuilderbuilder){builder.Services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));builder.Services.AddSingleton(newSlackEndpointConfiguration().UseSigningSecret("<your signing secret here>"));}

Copy SlackEndpoint.cs 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 SlackNet.AzureFunctionExample and SlackNet.EventsExample projects for more detail.

Endpoints naming convention

SlackNet requires the Slack app endpoints to be named after the following convention:

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:

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>").MapToPrefix("api/slack"));}

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.

About

A comprehensive Slack API client for .NET

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - mantro/SlackNet: A comprehensive Slack API client for .NET · GitHub
Skip to content

Repository files navigation

SlackNet

An easy-to-use and flexible API for writing Slack bots in .NET, built on top of a comprehensive Slack API client.

Getting Started

There are three NuGet packages available to install, depending on your use case.

SlackNet

To use the Web API:

varapi=newSlackApiClient("<your OAuth access token here>");

then start calling methods:

varchannels=awaitapi.Channels.List();

To use the RTM API:

varrtm=newSlackRtmClient("<your OAuth access token here>");awaitrtm.Connect();rtm.Events.Subscribe(/* handle every event */);rtm.Messages.Subscribe(/* handle message events */);

SlackNet.Bot

varbot=newSlackBot("<your bot token here>");awaitbot.Connect();

You can handle messages in a number of ways:

// .NET eventsbot.OnMessage+=(sender,message)=>{/* handle message */};// Adding handlersclassMyMessageHandler:IMessageHandler{publicTaskHandleMessage(IMessagemessage){// handle message}}bot.AddHandler(newMyMessageHandler());// Subscribing to Rx streambot.Messages.Subscribe(/* handle message */);

The easiest way to reply to messages is by using their ReplyWith method. Replies will be sent to same channel and thread as the message being replied to.

message.ReplyWith("simple text message");message.ReplyWith(newBotMessage{Text="more complicated message",Attachments={newAttachment{Title="attachments!"}}});message.ReplyWith(async()=>{// Show typing indication in Slack while message is build builtvarasyncInfo=awaitSomeAsyncMethod();returnnewBotMessage{Text="async message: "+asyncInfo};});

SlackNet.Bot includes a simplified API for getting common information from Slack:

varuser=awaitbot.GetUserByName("someuser");varchannels=awaitbot.GetChannels();// etc.

Everything is cached, so go nuts getting the information you need. You can clear the cache with bot.ClearCache().

SlackNet.AspNetCore

In your Startup class:

publicvoidConfigureServices(IServiceCollectionservices){services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));}publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>"));}

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

Azure Functions

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:

publicoverridevoidConfigure(IFunctionsHostBuilderbuilder){builder.Services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));builder.Services.AddSingleton(newSlackEndpointConfiguration().UseSigningSecret("<your signing secret here>"));}

Copy SlackEndpoint.cs 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 SlackNet.AzureFunctionExample and SlackNet.EventsExample projects for more detail.

Endpoints naming convention

SlackNet requires the Slack app endpoints to be named after the following convention:

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:

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>").MapToPrefix("api/slack"));}

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.

About

A comprehensive Slack API client for .NET

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - mantro/SlackNet: A comprehensive Slack API client for .NET · GitHub
Skip to content

Repository files navigation

SlackNet

An easy-to-use and flexible API for writing Slack bots in .NET, built on top of a comprehensive Slack API client.

Getting Started

There are three NuGet packages available to install, depending on your use case.

SlackNet

To use the Web API:

varapi=newSlackApiClient("<your OAuth access token here>");

then start calling methods:

varchannels=awaitapi.Channels.List();

To use the RTM API:

varrtm=newSlackRtmClient("<your OAuth access token here>");awaitrtm.Connect();rtm.Events.Subscribe(/* handle every event */);rtm.Messages.Subscribe(/* handle message events */);

SlackNet.Bot

varbot=newSlackBot("<your bot token here>");awaitbot.Connect();

You can handle messages in a number of ways:

// .NET eventsbot.OnMessage+=(sender,message)=>{/* handle message */};// Adding handlersclassMyMessageHandler:IMessageHandler{publicTaskHandleMessage(IMessagemessage){// handle message}}bot.AddHandler(newMyMessageHandler());// Subscribing to Rx streambot.Messages.Subscribe(/* handle message */);

The easiest way to reply to messages is by using their ReplyWith method. Replies will be sent to same channel and thread as the message being replied to.

message.ReplyWith("simple text message");message.ReplyWith(newBotMessage{Text="more complicated message",Attachments={newAttachment{Title="attachments!"}}});message.ReplyWith(async()=>{// Show typing indication in Slack while message is build builtvarasyncInfo=awaitSomeAsyncMethod();returnnewBotMessage{Text="async message: "+asyncInfo};});

SlackNet.Bot includes a simplified API for getting common information from Slack:

varuser=awaitbot.GetUserByName("someuser");varchannels=awaitbot.GetChannels();// etc.

Everything is cached, so go nuts getting the information you need. You can clear the cache with bot.ClearCache().

SlackNet.AspNetCore

In your Startup class:

publicvoidConfigureServices(IServiceCollectionservices){services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));}publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>"));}

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

Azure Functions

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:

publicoverridevoidConfigure(IFunctionsHostBuilderbuilder){builder.Services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));builder.Services.AddSingleton(newSlackEndpointConfiguration().UseSigningSecret("<your signing secret here>"));}

Copy SlackEndpoint.cs 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 SlackNet.AzureFunctionExample and SlackNet.EventsExample projects for more detail.

Endpoints naming convention

SlackNet requires the Slack app endpoints to be named after the following convention:

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:

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>").MapToPrefix("api/slack"));}

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.

About

A comprehensive Slack API client for .NET

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - mantro/SlackNet: A comprehensive Slack API client for .NET · GitHub
Skip to content

Repository files navigation

SlackNet

An easy-to-use and flexible API for writing Slack bots in .NET, built on top of a comprehensive Slack API client.

Getting Started

There are three NuGet packages available to install, depending on your use case.

SlackNet

To use the Web API:

varapi=newSlackApiClient("<your OAuth access token here>");

then start calling methods:

varchannels=awaitapi.Channels.List();

To use the RTM API:

varrtm=newSlackRtmClient("<your OAuth access token here>");awaitrtm.Connect();rtm.Events.Subscribe(/* handle every event */);rtm.Messages.Subscribe(/* handle message events */);

SlackNet.Bot

varbot=newSlackBot("<your bot token here>");awaitbot.Connect();

You can handle messages in a number of ways:

// .NET eventsbot.OnMessage+=(sender,message)=>{/* handle message */};// Adding handlersclassMyMessageHandler:IMessageHandler{publicTaskHandleMessage(IMessagemessage){// handle message}}bot.AddHandler(newMyMessageHandler());// Subscribing to Rx streambot.Messages.Subscribe(/* handle message */);

The easiest way to reply to messages is by using their ReplyWith method. Replies will be sent to same channel and thread as the message being replied to.

message.ReplyWith("simple text message");message.ReplyWith(newBotMessage{Text="more complicated message",Attachments={newAttachment{Title="attachments!"}}});message.ReplyWith(async()=>{// Show typing indication in Slack while message is build builtvarasyncInfo=awaitSomeAsyncMethod();returnnewBotMessage{Text="async message: "+asyncInfo};});

SlackNet.Bot includes a simplified API for getting common information from Slack:

varuser=awaitbot.GetUserByName("someuser");varchannels=awaitbot.GetChannels();// etc.

Everything is cached, so go nuts getting the information you need. You can clear the cache with bot.ClearCache().

SlackNet.AspNetCore

In your Startup class:

publicvoidConfigureServices(IServiceCollectionservices){services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));}publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>"));}

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

Azure Functions

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:

publicoverridevoidConfigure(IFunctionsHostBuilderbuilder){builder.Services.AddSlackNet(c =>c.UseApiToken("<your OAuth access token here>"));builder.Services.AddSingleton(newSlackEndpointConfiguration().UseSigningSecret("<your signing secret here>"));}

Copy SlackEndpoint.cs 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 SlackNet.AzureFunctionExample and SlackNet.EventsExample projects for more detail.

Endpoints naming convention

SlackNet requires the Slack app endpoints to be named after the following convention:

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:

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseSlackNet(c =>c.UseSigningSecret("<your signing secret here>").MapToPrefix("api/slack"));}

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.

About

A comprehensive Slack API client for .NET

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages