private async Task Say(BotMessage message, ResponseContext context) { string chatHubID = null; if (message == null) { return; } if(message.ChatHub != null) { chatHubID = message.ChatHub.ID; } else if(context != null && context.Message.ChatHub != null) { chatHubID = context.Message.ChatHub.ID; } if(chatHubID != null) { NoobWebClient client = new NoobWebClient(); List<string> values = new List<string>() { "token", this.SlackKey, "channel", chatHubID, "text", message.Text, "as_user", "true" }; if (message.Attachments.Count > 0) { values.Add("attachments"); values.Add(JsonConvert.SerializeObject(message.Attachments)); } await client.DownloadString( "https://slack.com/api/chat.postMessage", RequestMethod.Post, values.ToArray() ); } else { throw new ArgumentException("When calling the Say() method, the message parameter must have its ChatHub property set."); } }
public async Task Connect(string slackKey) { this.SlackKey = slackKey; // disconnect in case we're already connected like a crazy person Disconnect(); // kill the regex for our bot's name - we'll rebuild it upon request with some of the info we get here BotNameRegex = string.Empty; NoobWebClient client = new NoobWebClient(); string json = await client.DownloadString("https://slack.com/api/rtm.start", RequestMethod.Post, "token", this.SlackKey); JObject jData = JObject.Parse(json); TeamID = jData["team"]["id"].Value<string>(); TeamName = jData["team"]["name"].Value<string>(); UserID = jData["self"]["id"].Value<string>(); UserName = jData["self"]["name"].Value<string>(); string webSocketUrl = jData["url"].Value<string>(); UserNameCache.Clear(); foreach (JObject userObject in jData["users"]) { UserNameCache.Add(userObject["id"].Value<string>(), userObject["name"].Value<string>()); } // load the channels, groups, and DMs that margie's in Dictionary<string, SlackChatHub> hubs = new Dictionary<string, SlackChatHub>(); ConnectedHubs = hubs; // channelz if (jData["channels"] != null) { foreach (JObject channelData in jData["channels"]) { if (!channelData["is_archived"].Value<bool>() && channelData["is_member"].Value<bool>()) { SlackChatHub channel = new SlackChatHub() { ID = channelData["id"].Value<string>(), Name = "#" + channelData["name"].Value<string>(), Type = SlackChatHubType.Channel }; hubs.Add(channel.ID, channel); } } } // groupz if (jData["groups"] != null) { foreach (JObject groupData in jData["groups"]) { if (!groupData["is_archived"].Value<bool>() && groupData["members"].Values<string>().Contains(UserID)) { SlackChatHub group = new SlackChatHub() { ID = groupData["id"].Value<string>(), Name = groupData["name"].Value<string>(), Type = SlackChatHubType.Group }; hubs.Add(group.ID, group); } } } // dmz if (jData["ims"] != null) { foreach (JObject dmData in jData["ims"]) { string userID = dmData["user"].Value<string>(); SlackChatHub dm = new SlackChatHub() { ID = dmData["id"].Value<string>(), Name = "@" + (UserNameCache.ContainsKey(userID) ? UserNameCache[userID] : userID), Type = SlackChatHubType.DM }; hubs.Add(dm.ID, dm); } } // set up the websocket and connect WebSocket = new WebSocket(webSocketUrl); WebSocket.OnOpen += (object sender, EventArgs e) => { // set connection-related properties ConnectedSince = DateTime.Now; }; WebSocket.OnMessage += async (object sender, MessageEventArgs args) => { await ListenTo(args.Data); }; WebSocket.OnClose += (object sender, CloseEventArgs e) => { // set connection-related properties ConnectedSince = null; TeamID = null; TeamName = null; UserID = null; UserName = null; }; WebSocket.Connect(); }