[smuxi: 6/6] Engine(-IRC|-XMPP): implemented engine/protocol-manager/on-presence-status-changed hook point



commit d4739cf61885b724af6ea77d6450328dfbbd43c0
Author: Mirco Bauer <meebey meebey net>
Date:   Thu May 22 19:11:00 2014 +0200

    Engine(-IRC|-XMPP): implemented engine/protocol-manager/on-presence-status-changed hook point

 src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs |    6 ++-
 .../Protocols/Xmpp/XmppProtocolManager.cs          |    2 +
 src/Engine/Protocols/ProtocolManagerBase.cs        |   56 ++++++++++++++++++--
 3 files changed, 58 insertions(+), 6 deletions(-)
---
diff --git a/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs 
b/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs
index 0c258fd..855345f 100644
--- a/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs
+++ b/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs
@@ -717,6 +717,8 @@ namespace Smuxi.Engine
                     _IrcClient.RfcAway(message);
                     break;
             }
+
+            base.SetPresenceStatus(status, message);
         }
 
         public override bool Command(CommandModel command)
@@ -1639,9 +1641,9 @@ namespace Smuxi.Engine
         public void CommandAway(CommandModel cd)
         {
             if (cd.DataArray.Length >= 2) {
-                _IrcClient.RfcAway(cd.Parameter);
+                SetPresenceStatus(PresenceStatus.Away, cd.Parameter);
             } else {
-                _IrcClient.RfcAway();
+                SetPresenceStatus(PresenceStatus.Online, null);
             }
         }
         
diff --git a/src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs 
b/src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs
index ebae831..aae8be7 100644
--- a/src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs
+++ b/src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs
@@ -640,6 +640,8 @@ namespace Smuxi.Engine
             }
 
             JabberClient.SendMyPresence();
+
+            base.SetPresenceStatus(status, message);
         }
 
         [MethodImpl(MethodImplOptions.Synchronized)]
diff --git a/src/Engine/Protocols/ProtocolManagerBase.cs b/src/Engine/Protocols/ProtocolManagerBase.cs
index a638a8f..3b6e1ca 100644
--- a/src/Engine/Protocols/ProtocolManagerBase.cs
+++ b/src/Engine/Protocols/ProtocolManagerBase.cs
@@ -1,7 +1,7 @@
 /*
  * Smuxi - Smart MUltipleXed Irc
  *
- * Copyright (c) 2007-2013 Mirco Bauer <meebey meebey net>
+ * Copyright (c) 2007-2014 Mirco Bauer <meebey meebey net>
  *
  * Full GPL License: <http://www.gnu.org/licenses/gpl.txt>
  *
@@ -48,6 +48,7 @@ namespace Smuxi.Engine
         public event EventHandler Disconnected;
         public event EventHandler<MessageEventArgs> MessageSent;
         public event EventHandler<MessageEventArgs> MessageReceived;
+        public event EventHandler<PresenceStatusChangedEventArgs> PresenceStatusChanged;
 
         public virtual string Host {
             get {
@@ -81,7 +82,6 @@ namespace Smuxi.Engine
                 return _PresenceStatus;
             }
             set {
-                _PresenceStatus = value;
                 SetPresenceStatus(value, null);
             }
         }
@@ -174,8 +174,17 @@ namespace Smuxi.Engine
         public abstract void OpenChat(FrontendManager fm, ChatModel chat);
         public abstract void CloseChat(FrontendManager fm, ChatModel chat);
 
-        public abstract void SetPresenceStatus(PresenceStatus status,
-                                               string message);
+        public virtual void SetPresenceStatus(PresenceStatus status,
+                                              string message)
+        {
+            var args = new PresenceStatusChangedEventArgs(_PresenceStatus,
+                                                          status, message);
+            _PresenceStatus = status;
+
+            if (args.OldStatus != args.NewStatus) {
+                OnPresenceStatusChanged(args);
+            }
+        }
 
         protected void NotConnected(CommandModel cmd)
         {
@@ -308,6 +317,29 @@ namespace Smuxi.Engine
             hooks.Run();
         }
 
+        protected virtual void OnPresenceStatusChanged(PresenceStatusChangedEventArgs e)
+        {
+            Trace.Call(e);
+
+            if (PresenceStatusChanged != null) {
+                PresenceStatusChanged(this, e);
+            }
+
+            var hooks = new HookRunner("engine", "protocol-manager", "on-presence-status-changed");
+            hooks.EnvironmentVariables.Add("PRESENCE_STATUS_CHANGED_OLD_STATUS", e.OldStatus.ToString());
+            hooks.EnvironmentVariables.Add("PRESENCE_STATUS_CHANGED_NEW_STATUS", e.NewStatus.ToString());
+            hooks.EnvironmentVariables.Add("PRESENCE_STATUS_CHANGED_NEW_MESSAGE", e.NewMessage);
+            hooks.Environments.Add(new ProtocolManagerHookEnvironment(this));
+
+            var cmdChar = (string) Session.UserConfig["Interface/Entry/CommandCharacter"];
+            hooks.Commands.Add(new SessionHookCommand(Session, Chat, cmdChar));
+            hooks.Commands.Add(new ProtocolManagerHookCommand(this, Chat, cmdChar));
+
+            // show time
+            hooks.Init();
+            hooks.Run();
+        }
+
         private static string _(string msg)
         {
             return LibraryCatalog.GetString(msg, _LibraryTextDomain);
@@ -413,4 +445,20 @@ namespace Smuxi.Engine
             Receiver = receiver;
         }
     }
+
+    public class PresenceStatusChangedEventArgs : EventArgs
+    {
+        public PresenceStatus OldStatus { get; protected set; }
+        public PresenceStatus NewStatus { get; protected set; }
+        public string NewMessage { get; protected set; }
+
+        public PresenceStatusChangedEventArgs(PresenceStatus oldStatus,
+                                              PresenceStatus newStatus,
+                                              string newMessage)
+        {
+            OldStatus = oldStatus;
+            NewStatus = newStatus;
+            NewMessage = newMessage;
+        }
+    }
 }


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