Example #1
0
        private async Task ListenTo(string json)
        {
            bool    isValidJson = true;
            JObject jObject     = null;

            try
            {
                jObject = JObject.Parse(json);
            }
            catch (JsonReaderException)
            {
                isValidJson = false;
#if DEBUG
                Console.WriteLine($"Illegal JSON message: {json}");
#endif
            }

            if (!isValidJson)
            {
                return;
            }

            if (jObject["type"].Value <string>() == "message")
            {
                var          channelID = jObject["channel"].Value <string>();
                SlackChatHub hub       = null;

                if (ConnectedHubs.ContainsKey(channelID))
                {
                    hub = ConnectedHubs[channelID];
                }
                else
                {
                    hub = SlackChatHub.FromID(channelID);
                    var hubs = new Dictionary <string, SlackChatHub>(ConnectedHubs.ToDictionary(kvp => kvp.Key, kvp => kvp.Value));
                    hubs.Add(hub.ID, hub);
                    ConnectedHubs = hubs;
                }

                // some messages may not have text or a user (like unfurled data from URLs)
                var messageText = (jObject["text"] != null ? jObject["text"].Value <string>() : null);

                SlackMessage message = new SlackMessage()
                {
                    ChatHub = hub,
                    // check to see if bot has been mentioned
                    MentionsBot = (messageText != null ? Regex.IsMatch(messageText, BotNameRegex, RegexOptions.IgnoreCase) : false),
                    RawData     = json,
                    Text        = messageText,
                    User        = (jObject["user"] != null ? new SlackUser()
                    {
                        ID = jObject["user"].Value <string>()
                    } : null)
                };

                ResponseContext context = new ResponseContext()
                {
                    BotHasResponded = false,
                    BotUserID       = UserID,
                    BotUserName     = UserName,
                    Message         = message,
                    TeamID          = TeamID,
                    UserNameCache   = new ReadOnlyDictionary <string, string>(UserNameCache)
                };

                // if the end dev has added any static entries to the ResponseContext collection of Bot, add them to the context being passed to the responders.
                if (ResponseContext != null)
                {
                    foreach (string key in ResponseContext.Keys)
                    {
                        context.Set(key, ResponseContext[key]);
                    }
                }

                // margie can never respond to herself and requires that the message have text and be from an actual person
                if (message.User != null && message.User.ID != UserID && message.Text != null)
                {
                    foreach (var responder in Responders ?? Enumerable.Empty <IResponder>())
                    {
                        if (responder != null && responder.CanRespond(context))
                        {
                            await SendIsTyping(message.ChatHub);
                            await Say(responder.GetResponse(context), context);

                            context.BotHasResponded = true;
                        }
                    }
                }
            }

            RaiseMessageReceived(json);
        }
Example #2
0
        private async Task ListenTo(string json)
        {
            JObject jObject = JObject.Parse(json);

            if (jObject["type"].Value <string>() == "message")
            {
                string       channelID = jObject["channel"].Value <string>();
                SlackChatHub hub       = null;

                if (ConnectedHubs.ContainsKey(channelID))
                {
                    hub = ConnectedHubs[channelID];
                }
                else
                {
                    hub = SlackChatHub.FromID(channelID);
                    List <SlackChatHub> hubs = new List <SlackChatHub>();
                    hubs.AddRange(ConnectedHubs.Values);
                    hubs.Add(hub);
                }

                string messageText = (jObject["text"] != null ? jObject["text"].Value <string>() : null);
                // check to see if bot has been mentioned
                SlackMessage message = new SlackMessage()
                {
                    ChatHub     = hub,
                    MentionsBot = (messageText != null ? Regex.IsMatch(messageText, BotNameRegex, RegexOptions.IgnoreCase) : false),
                    RawData     = json,
                    // some messages may not have text or a user (like unfurled data from URLs)
                    Text = messageText,
                    User = (jObject["user"] != null ? new SlackUser()
                    {
                        ID = jObject["user"].Value <string>()
                    } : null)
                };

                ResponseContext context = new ResponseContext()
                {
                    BotHasResponded = false,
                    BotUserID       = UserID,
                    BotUserName     = UserName,
                    Message         = message,
                    TeamID          = this.TeamID,
                    UserNameCache   = new ReadOnlyDictionary <string, string>(this.UserNameCache)
                };

                if (StaticResponseContextData != null)
                {
                    foreach (string key in StaticResponseContextData.Keys)
                    {
                        context.Set(key, StaticResponseContextData[key]);
                    }
                }

                // margie can never respond to herself and requires that the message have text and be from an actual person
                if (message.User != null && message.User.ID != UserID && message.Text != null)
                {
                    foreach (IResponseProcessor processor in ResponseProcessors)
                    {
                        if (processor.CanRespond(context))
                        {
                            await Say(processor.GetResponse(context), context);

                            context.BotHasResponded = true;
                        }
                    }
                }
            }

            RaiseMessageReceived(json);
        }
Example #3
0
        private async Task ListenTo(string json)
        {
            JObject jObject = JObject.Parse(json);

            if (jObject["type"].Value <string>() == "message")
            {
                string       channelID = jObject["channel"].Value <string>();
                SlackChatHub hub       = null;

                if (ConnectedHubs.ContainsKey(channelID))
                {
                    hub = ConnectedHubs[channelID];
                }
                else
                {
                    hub = SlackChatHub.FromID(channelID);
                    Dictionary <string, SlackChatHub> hubs = new Dictionary <string, SlackChatHub>(ConnectedHubs.ToDictionary(kvp => kvp.Key, kvp => kvp.Value));
                    hubs.Add(hub.ID, hub);
                    ConnectedHubs = hubs;
                }

                string messageText = (jObject["text"] != null ? jObject["text"].Value <string>() : null);
                // check to see if bot has been mentioned
                SlackMessage message = new SlackMessage()
                {
                    ChatHub     = hub,
                    MentionsBot = (messageText != null ? Regex.IsMatch(messageText, BotNameRegex, RegexOptions.IgnoreCase) : false),
                    RawData     = json,
                    // some messages may not have text or a user (like unfurled data from URLs)
                    Text = messageText,
                    User = (jObject["user"] != null ? new SlackUser()
                    {
                        ID = jObject["user"].Value <string>()
                    } : null)
                };

                ResponseContext context = new ResponseContext()
                {
                    BotHasResponded = false,
                    BotUserID       = UserID,
                    BotUserName     = UserName,
                    Message         = message,
                    TeamID          = this.TeamID,
                    UserNameCache   = new ReadOnlyDictionary <string, string>(this.UserNameCache)
                };

                // if the end dev has added any static entries to the ResponseContext collection of Bot, add them to the context being passed to the responders.
                if (ResponseContext != null)
                {
                    foreach (string key in ResponseContext.Keys)
                    {
                        context.Set(key, ResponseContext[key]);
                    }
                }

                // determine if margie can respond
                if (CanResponseToMessage(message))
                {
                    foreach (IResponder responder in Responders)
                    {
                        if (responder.CanRespond(context))
                        {
                            await Say(responder.GetResponse(context), context);

                            context.BotHasResponded = true;
                        }
                    }
                }
            }

            RaiseMessageReceived(json);
        }