Build a quick #slack #bot in c#

I’m not actually a big fan of Slack, but personal opinions aside, creating a simple slack bot for notifications is super easy to do in C#. I built a File system watcher slack bot, that could notify a custom channel in Slack whenever a new file was uploaded to my server.
You need to log in to Slack and get a slack incoming webhook url, it should look something like this:
https://hooks.slack.com/services/T04XXX/B3HKKXXXXL/4XXXXXW
You can set the name and icon for the bot too via the Web UI, which is nice.
So, the main class, which I found on Github, is as follows
using Newtonsoft.Json;
using System;
using System.Collections.Specialized;
using System.Net;
using System.Text;
namespace SaleWatcherApp
{
//A simple C# class to post messages to a Slack channel
//Note: This class uses the Newtonsoft Json.NET serializer available via NuGet
public class SlackClient
{
private readonly Uri _uri;
private readonly Encoding _encoding = new UTF8Encoding();
public SlackClient(string urlWithAccessToken)
{
_uri = new Uri(urlWithAccessToken);
}
//Post a message using simple strings
public void PostMessage(string text, string username = null, string channel = null)
{
Payload payload = new Payload()
{
Channel = channel,
Username = username,
Text = text
};
PostMessage(payload);
}
//Post a message using a Payload object
public void PostMessage(Payload payload)
{
string payloadJson = JsonConvert.SerializeObject(payload);
using (WebClient client = new WebClient())
{
NameValueCollection data = new NameValueCollection();
data["payload"] = payloadJson;
var response = client.UploadValues(_uri, "POST", data);
//The response text is usually "ok"
string responseText = _encoding.GetString(response);
}
}
}
//This class serializes into the Json payload required by Slack Incoming WebHooks
public class Payload
{
[JsonProperty("channel")]
public string Channel { get; set; }
[JsonProperty("username")]
public string Username { get; set; }
[JsonProperty("text")]
public string Text { get; set; }
}
}
It requires Newtonsoft nuget, which you should install now.
Then, I created a console app, that watches my folder of interest. I installed this on the server using NSSM so that the EXE ran as a service.
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
namespace SaleWatcherApp
{
class Program
{
static List<string> newFiles = new List<string>();
private static SlackClient slack = null;
static void Main(string[] args)
{
slack = new SlackClient(ConfigurationManager.AppSettings["slackHook"]);
watch();
Console.ReadLine();
}
private static void watch()
{
var watcher = new FileSystemWatcher
{
Path = ConfigurationManager.AppSettings["watchPath"],
NotifyFilter = NotifyFilters.LastWrite,
Filter = "*.*"
};
watcher.Changed += (sender, args) =>
{
if (newFiles.All(f => f != args.Name))
{
Console.WriteLine(args.Name);
slack.PostMessage(args.Name);
}
newFiles.Add(args.Name);
};
watcher.EnableRaisingEvents = true;
}
}
}