public void OnNewMessage(IChirperMessage message)
        {
            bool important = false;

            if (message != null && theBannerPanel != null)
            {
                try {
                    string citizenMessageID = string.Empty;

                    CitizenMessage cm = message as CitizenMessage;
                    if (cm != null)
                    {
                        //DebugOutputPanel.AddMessage(ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format("found citmess MessageID: {0} GetText: {1}", cm.m_messageID, cm.GetText()));
                        citizenMessageID = cm.m_messageID;
                    }

                    if (!string.IsNullOrEmpty(citizenMessageID))
                    {
                        // TODO: Do stuff if the Chirper message is actually important.
                        // Hope is to mimic SimCity's ticker.
                        // List of LocaleIDs available here: https://github.com/cities-skylines/Assembly-CSharp/wiki/LocaleID
                        important = FilterMessage(cm.m_messageID);
                    }
                } catch (Exception ex) {
                    DebugOutputPanel.AddMessage(ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format("ChirpBanner.OnNewMessage threw Exception: {0}", ex.Message));
                }

                // use rich styled text
                // Colossal markup uses sliiiiiightly different tags than unity.
                // munge our config strings to fit
                string nameColorTag = MyConfig.ConfigHolder.Config.NameColor;
                string textColorTag = MyConfig.ConfigHolder.Config.MessageColor;

                if (nameColorTag.Length == 9)                    // ie: #001122FF
                {
                    nameColorTag = nameColorTag.Substring(0, 7); // drop alpha bits
                }

                if (textColorTag.Length == 9)                    // ie: #001122FF
                {
                    textColorTag = textColorTag.Substring(0, 7); // drop alpha bits
                }

                // Check for CurrentConfig.ColorChirps
                if (MyConfig.ConfigHolder.Config.ColorChirps)
                {
                    // If chirp is important, and ColorChirps is enabled, make the chirp name and message red.
                    if (important)
                    {
                        //DebugOutputPanel.AddMessage (ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format ("Chirp is important: {0}", message.text));
                        //DebugOutputPanel.AddMessage (ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format ("CurrentConfig.NameColor: {0}", CurrentConfig.NameColor));
                        //DebugOutputPanel.AddMessage (ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format ("CurrentConfig.MessageColor: {0}", CurrentConfig.MessageColor));
                        textColorTag = "#FF0000";
                        nameColorTag = "#FF0000";
                    }
                }

                string str = String.Format("<color{0}>{1}</color> : <color{2}>{3}</color>", nameColorTag, message.senderName, textColorTag, message.text);

                // Check for CurrentConfig.FilterChirps
                if (MyConfig.ConfigHolder.Config.FilterChirps)
                {
                    // If Chirp is deemed not important as a result of above LocaleIDs, just return, do nothing
                    if (!important)
                    {
                        //DebugOutputPanel.AddMessage (ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format ("Chirp is not important: {0}", message.text));
                        return;
                    }
                    // Otherwise, do something
                    if (important)
                    {
                        //DebugOutputPanel.AddMessage (ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format ("Chirp is important: {0}", message.text));

                        //theBannerPanel.CreateBannerLabel (str, message.senderID);
                        ChirpMoverThread.addTask2Main(() => { theBannerPanel.CreateBannerLabel(str, message.senderID); });
                    }
                }
                else
                {
                    //theBannerPanel.CreateBannerLabel (str, message.senderID);
                    ChirpMoverThread.addTask2Main(() => { theBannerPanel.CreateBannerLabel(str, message.senderID); });
                }

                //DebugOutputPanel.AddMessage (ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format ("textColorTag: {0}", textColorTag));
                //DebugOutputPanel.AddMessage (ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format ("nameColorTag: {0}", nameColorTag));
                //DebugOutputPanel.AddMessage(ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format("chirp! {0}", message.text));


                //MyIThreadingExtension.addTask2Main(() => { theBannerPanel.CreateBannerLabel(str, message.senderID); });
                //MyIThreadingExtension.addTask2Main(() => { DebugOutputPanel.AddMessage(ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format("chirp! {0}", message.text)); });
            }
        }
        public void OnNewMessage(IChirperMessage message)
        {
            if (message != null && theBannerPanel != null)
            {
                try
                {
                    string citizenMessageID = string.Empty;

                    CitizenMessage cm = message as CitizenMessage;
                    if (cm != null)
                    {
                        //DebugOutputPanel.AddMessage(ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format("found citmess MessageID: {0} GetText: {1}", cm.m_messageID, cm.GetText()));
                        citizenMessageID = cm.m_messageID;
                    }

                    if (!string.IsNullOrEmpty(citizenMessageID))
                    {
                        // Integrate with ChirpFilter
                        if (ChirpFilter_FilterModule == null)
                        {
                            GameObject ChirpFilter_GameObject = GameObject.Find("ChirperFilterModule");

                            if (ChirpFilter_GameObject != null)
                            {
                                ChirpFilter_FilterModule = ChirpFilter_GameObject.GetComponent("ChirpFilter.FilterModule");
                            }
                        }

                        if (ChirpFilter_FilterModule != null)
                        {
                            bool bIsBlacklisted = false;

                            if (ChirpFilter_FilterModule is IFormattable)
                            {
                                IFormattable ifs = ChirpFilter_FilterModule as IFormattable;


                                string sresult = ifs.ToString(citizenMessageID, null);

                                if (string.IsNullOrEmpty(sresult) || sresult == "false")
                                {
                                    bIsBlacklisted = false;
                                }
                                else if (sresult == "true")
                                {
                                    bIsBlacklisted = true;
                                }
                            }

                            // see if ChirpFilter wants us to filter (not show) the message
                            if (bIsBlacklisted)
                            {
                                //DebugOutputPanel.AddMessage(ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format("msgid {0} msg {1} blacklisted", citizenMessageID, message.text));
                                return;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    DebugOutputPanel.AddMessage(ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format("ChirpBanner.OnNewMessage threw Exception: {0}", ex.Message));
                }

                // use rich styled text
                // Colossal markup uses sliiiiiightly different tags than unity.
                // munge our config strings to fit
                string nameColorTag = CurrentConfig.NameColor;
                string textColorTag = CurrentConfig.MessageColor;

                if (nameColorTag.Length == 9)                    // ie: #001122FF
                {
                    nameColorTag = nameColorTag.Substring(0, 7); // drop alpha bits
                }

                if (textColorTag.Length == 9)                    // ie: #001122FF
                {
                    textColorTag = textColorTag.Substring(0, 7); // drop alpha bits
                }

                //DebugOutputPanel.AddMessage(ColossalFramework.Plugins.PluginManager.MessageType.Message, string.Format("chirp! {0}", message.text));

                string str = String.Format("<color{0}>{1}</color> : <color{2}>{3}</color>", nameColorTag, message.senderName, textColorTag, message.text);
                theBannerPanel.CreateBannerLabel(str, message.senderID);
            }
        }