[smuxi] Engine: implemented new engine/session/on-event-message hook



commit 024b02d597db23470da184edb988f800bf31310a
Author: Mirco Bauer <meebey meebey net>
Date:   Sun Jul 13 19:43:59 2014 +0200

    Engine: implemented new engine/session/on-event-message hook

 src/Engine/Session.cs |   53 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 53 insertions(+), 0 deletions(-)
---
diff --git a/src/Engine/Session.cs b/src/Engine/Session.cs
index 0d6a826..fa353ab 100644
--- a/src/Engine/Session.cs
+++ b/src/Engine/Session.cs
@@ -63,6 +63,7 @@ namespace Smuxi.Engine
         public event EventHandler<GroupChatPersonAddedEventArgs> GroupChatPersonAdded;
         public event EventHandler<GroupChatPersonRemovedEventArgs> GroupChatPersonRemoved;
         public event EventHandler<GroupChatPersonUpdatedEventArgs> GroupChatPersonUpdated;
+        public event EventHandler<EventMessageEventArgs> EventMessage;
 
         public IList<IProtocolManager> ProtocolManagers {
             get {
@@ -1326,6 +1327,14 @@ namespace Smuxi.Engine
                     fm.AddMessageToChat(chat, msg);
                 }
             }
+
+            if (msg.MessageType == MessageType.Event) {
+                // on-event-message
+                OnEventMessage(
+                    // at this point we no longer know who sent this nor to whom
+                    new EventMessageEventArgs(chat, msg, String.Empty, String.Empty)
+                );
+            }
         }
         
         public void AddPersonToGroupChat(GroupChatModel groupChat, PersonModel person)
@@ -2041,6 +2050,33 @@ namespace Smuxi.Engine
             hooks.Run();
         }
 
+        protected virtual void OnEventMessage(EventMessageEventArgs e)
+        {
+            if (EventMessage != null) {
+                EventMessage(this, e);
+            }
+
+            var pm = e.Chat.ProtocolManager;
+            var hooks = new HookRunner("engine", "session", "on-event-message");
+            hooks.Environments.Add(new ChatHookEnvironment(e.Chat));
+            if (pm != null) {
+                hooks.Environments.Add(new ProtocolManagerHookEnvironment(pm));
+            }
+            hooks.Environments.Add(new MessageHookEnvironment(e.Message,
+                                                              e.Sender,
+                                                              e.Receiver));
+
+            var cmdChar = (string) UserConfig["Interface/Entry/CommandCharacter"];
+            hooks.Commands.Add(new SessionHookCommand(this, e.Chat, cmdChar));
+            if (pm != null) {
+                hooks.Commands.Add(new ProtocolManagerHookCommand(pm, e.Chat, cmdChar));
+            }
+
+            // show time
+            hooks.Init();
+            hooks.Run();
+        }
+
         private static string _(string msg)
         {
             return LibraryCatalog.GetString(msg, _LibraryTextDomain);
@@ -2088,4 +2124,21 @@ namespace Smuxi.Engine
             NewPerson = newPerson;
         }
     }
+
+    public class EventMessageEventArgs : EventArgs
+    {
+        public ChatModel Chat { get; protected set; }
+        public MessageModel Message { get; protected set; }
+        public string Sender { get; protected set; }
+        public string Receiver { get; protected set; }
+
+        public EventMessageEventArgs(ChatModel chat, MessageModel msg,
+                                     string sender, string receiver)
+        {
+            Chat = chat;
+            Message = msg;
+            Sender = sender;
+            Receiver = receiver;
+        }
+    }
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]