[polari/wip/raresv/userTrackerAndPopoversRebase: 2/24] Revert of "userTracker (used to save us from later conflicts): patch based on the first userTracker



commit b63826667b24f37d0eea2f604a5a5eeb9df8fc94
Author: raresv <rares visalom gmail com>
Date:   Tue Aug 2 00:46:26 2016 +0300

    Revert of "userTracker (used to save us from later conflicts):
    patch based on the first userTracker patch that included only
    the local history. this is more or less the *final* first
    patch for the UserTracker".
    
    This reverts commit 2d9f3605d4ef77a9dc0d8973002e2a939f6e11d9.

 src/userTracker.js |  159 +++++++++++++++++++++++++++++-----------------------
 1 files changed, 89 insertions(+), 70 deletions(-)
---
diff --git a/src/userTracker.js b/src/userTracker.js
index 5f9ca55..392e46b 100644
--- a/src/userTracker.js
+++ b/src/userTracker.js
@@ -2,128 +2,147 @@ const Polari = imports.gi.Polari;
 const Lang = imports.lang;
 const Tp = imports.gi.TelepathyGLib;
 const Signals = imports.signals;
-const GObject = imports.gi.GObject;
-const Utils = imports.utils;
-const Gio = imports.gi.Gio;
-const GLib = imports.gi.GLib;
+const ChatroomManager = imports.chatroomManager;
+
 
 const UserTracker = new Lang.Class({
     Name: 'UserTracker',
-    Extends: GObject.Object,
-
-    Signals: {
-        'status-changed': {
-            flags: GObject.SignalFlags.DETAILED,
-            param_types: [GObject.TYPE_STRING, GObject.TYPE_INT]
-        }
-    },
 
     _init: function(room) {
-        this.parent();
-
-        this._baseNickContacts = new Map();
-
-        this._room = room;
-
-        this._onRoomAdded(this._room);
-        this._onChannelChanged(this._room);
-    },
-
-    _onRoomAdded: function(room) {
-        let roomSignals = [
+        this._referenceRoomSignals = [
             { name: 'notify::channel',
               handler: Lang.bind(this, this._onChannelChanged) },
             { name: 'member-renamed',
               handler: Lang.bind(this, this._onMemberRenamed) },
             { name: 'member-disconnected',
-              handler: Lang.bind(this, this._onMemberLeft) },
+              handler: Lang.bind(this, this._onMemberDisconnected) },
             { name: 'member-kicked',
-              handler: Lang.bind(this, this._onMemberLeft) },
+              handler: Lang.bind(this, this._onMemberKicked) },
             { name: 'member-banned',
-              handler: Lang.bind(this, this._onMemberLeft) },
+              handler: Lang.bind(this, this._onMemberBanned) },
             { name: 'member-joined',
               handler: Lang.bind(this, this._onMemberJoined) },
             { name: 'member-left',
               handler: Lang.bind(this, this._onMemberLeft) }
         ];
 
-        roomSignals.forEach(Lang.bind(this, function(signal) {
-            room.connect(signal.name, signal.handler);
-        }));
-    }
+        this._contactMapping = new Map();
+
+        if (!room) {
+            log("global user tracker created");
+            this._chatroomManager = ChatroomManager.getDefault();
 
-    _onChannelChanged: function(room) {
-        if (!room.channel) {
-            this._clearUsers();
-            return;
+            this._chatroomManager.connect('room-added', Lang.bind(this, this._onRoomAdded));
+            this._chatroomManager.connect('room-removed', Lang.bind(this, this._onRoomRemoved));
+        } else {
+            this._room = room;
+
+            this._onRoomAdded(null, this._room);
+            this._onChannelChanged(this._room);
         }
+    },
 
-        let members;
-        if (room.type == Tp.HandleType.ROOM)
-            members = room.channel.group_dup_members_contacts();
-        else
-            members = [room.channel.connection.self_contact, room.channel.target_contact];
+    _onRoomAdded: function(roomManager , room) {
+        this._roomSignals = [];
+        this._referenceRoomSignals.forEach(Lang.bind(this, function(signal) {
+            this._roomSignals.push(room.connect(signal.name, signal.handler));
+        }));
+    },
 
-        members.forEach(m => { this._trackMember(m); });
+    _onRoomRemoved: function(roomManager, room) {
+        for (let i = 0; i < this._roomSignals.length; i++)
+            room.disconnect(this._roomSignals[i]);
+        this._roomSignals = [];
     },
 
-    _clearUsers: function() {
-        for ([baseNick, contacts] of this._baseNickContacts)
-            contacts.slice().forEach((m) => { this._untrackMember(m); });
+    _onChannelChanged: function(emittingRoom) {
+        if (emittingRoom.channel) {
+            let members;
+            if (emittingRoom.type == Tp.HandleType.ROOM)
+                members = emittingRoom.channel.group_dup_members_contacts();
+            else
+                members = [emittingRoom.channel.connection.self_contact, 
emittingRoom.channel.target_contact];
+
+            members.forEach(m => {
+                m._room = emittingRoom;
+                this._trackMember(m);
+            });
+        } else {
+            for ([baseNick, basenickContacts] of this._contactMapping) {
+                basenickContacts.forEach(Lang.bind(this, function(member) {
+                    if (member._room == emittingRoom)
+                        this._untrackMember(member);
+                }));
+
+                this._contactMapping.delete(baseNick);
+            }
+        }
     },
 
     _onMemberRenamed: function(room, oldMember, newMember) {
+        oldMember._room = room;
+        newMember._room = room;
         this._untrackMember(oldMember);
         this._trackMember(newMember);
     },
 
-    _onMemberJoined: function(room, member) {
-        this._trackMember(member);
+    _onMemberDisconnected: function(room, member, message) {
+        member._room = room;
+        this._untrackMember(member);
     },
 
-    _onMemberLeft: function(room, member) {
+    _onMemberKicked: function(room, member, actor) {
+        member._room = room;
         this._untrackMember(member);
     },
 
-    _pushMember: function(baseNick, member) {
-        if (!this._baseNickContacts.has(baseNick))
-            this._baseNickContacts.set(baseNick, []);
-        let contacts = this._baseNickContacts.get(baseNick);
-        return contacts.push(member);
+    _onMemberBanned: function(room, member, actor) {
+        member._room = room;
+        this._untrackMember(member);
+    },
+
+    _onMemberJoined: function(room, member) {
+        member._room = room;
+        this._trackMember(member);
+    },
+
+    _onMemberLeft: function(room, member, message) {
+        member._room = room;
+        this._untrackMember(member);
     },
 
     _trackMember: function(member) {
         let baseNick = Polari.util_get_basenick(member.alias);
-        let status = Tp.ConnectionPresenceType.AVAILABLE;
 
-        if (this._pushMember(baseNick, member) == 1)
-            this.emit("status-changed::" + baseNick, baseNick, status);
-    },
+        if (this._contactMapping.has(baseNick))
+            this._contactMapping.get(baseNick).push(member);
+        else
+            this._contactMapping.set(baseNick, [member]);
 
-    _popMember: function(baseNick, member) {
-        let contacts = this._baseNickContacts.get(baseNick) || [];
-        let index = contacts.map(c => c.alias).indexOf(member.alias);
-        if (index < 0)
-            return [false, contacts.length];
-        contacts.splice(index, 1);
-        return [true, contacts.length];
+        if (this._contactMapping.get(baseNick).length == 1)
+            this.emit('status-changed', member.alias, Tp.ConnectionPresenceType.AVAILABLE);
     },
 
     _untrackMember: function(member) {
         let baseNick = Polari.util_get_basenick(member.alias);
-        let status = Tp.ConnectionPresenceType.OFFLINE;
 
-        let [found, nContacts] = this._popMember(baseNick, member);
-        if (found)
-            if (nContacts == 0)
-                this.emit("status-changed::" + baseNick, member.alias, status);
+        let contacts = this._contactMapping.get(baseNick) || [];
+        let indexToDelete = contacts.map(c => c.alias).indexOf(member.alias);
+
+        if (indexToDelete > -1) {
+            contacts.splice(indexToDelete, 1);
+
+            if (contacts.length == 0)
+                this.emit('status-changed', member.alias, Tp.ConnectionPresenceType.OFFLINE);
+        }
     },
 
     getNickStatus: function(nickName) {
         let baseNick = Polari.util_get_basenick(nickName);
 
-        let contacts = this._baseNickContacts.get(baseNick) || [];
+        let contacts = this._contactMapping.get(baseNick) || [];
         return contacts.length == 0 ? Tp.ConnectionPresenceType.OFFLINE
                                     : Tp.ConnectionPresenceType.AVAILABLE;
-    }
+    },
 });
+Signals.addSignalMethods(UserTracker.prototype);


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