[polari/wip/raresv/userTracker] added wrapper around userTracker to group them by accounts, userTracker part 10



commit abcd91d457bc29cd0d9863f8204ce4fe67d8cfd7
Author: raresv <rares visalom gmail com>
Date:   Sun Jul 3 16:53:57 2016 +0300

    added wrapper around userTracker to group them by accounts, userTracker part 10

 src/application.js |    7 +--
 src/chatView.js    |    6 +--
 src/userTracker.js |  174 +++++++++++++---------------------------------------
 3 files changed, 45 insertions(+), 142 deletions(-)
---
diff --git a/src/application.js b/src/application.js
index ccc6641..594e97c 100644
--- a/src/application.js
+++ b/src/application.js
@@ -48,13 +48,8 @@ const Application = new Lang.Class({
         this._chatroomManager = ChatroomManager.getDefault();
         this._accountsMonitor = AccountsMonitor.getDefault();
         this._networkMonitor = Gio.NetworkMonitor.get_default();
+        this._userStatusMonitor = UserTracker.getUserStatusMonitor();
         this._networksManager = NetworksManager.getDefault();
-        /*created here as i couldn't make it work if it was created in the chatroomManager
-        (it didn't receive the room-added signal for the channels restored from the previous session)*/
-        this._globalUserTracker = new UserTracker.UserTracker(null);
-        this._globalUserTracker.connect('status-changed', Lang.bind(this, function(tracker, nick, status){
-            log("[Application] nick " + nick + " global status changed to " + status );
-        }));
 
         this._accountsMonitor.connect('account-removed', Lang.bind(this,
             function(am, account) {
diff --git a/src/chatView.js b/src/chatView.js
index dbebdf5..8eccfce 100644
--- a/src/chatView.js
+++ b/src/chatView.js
@@ -14,7 +14,6 @@ const Mainloop = imports.mainloop;
 const PasteManager = imports.pasteManager;
 const Signals = imports.signals;
 const Utils = imports.utils;
-const UserTracker = imports.userTracker;
 
 const MAX_NICK_CHARS = 8;
 const IGNORE_STATUS_TIME = 5;
@@ -289,9 +288,6 @@ const ChatView = new Lang.Class({
         this._pendingLogs = [];
         this._statusCount = { left: 0, joined: 0, total: 0 };
 
-        this._userTracker = new UserTracker.UserTracker(this._room);
-        this._userTracker.connect('status-changed', Lang.bind(this, this._onNickStatusChanged));
-
         this._room.account.connect('notify::nickname', Lang.bind(this,
             function() {
                 this._updateMaxNickChars(this._room.account.nickname.length);
@@ -1204,7 +1200,7 @@ const ChatView = new Lang.Class({
         let nickTagName = this._getNickTagName(nickName);
 
         let tag = new Gtk.TextTag({ name: nickTagName });
-        this._updateNickTag(tag, this._userTracker.getNickGlobalStatus(nickName));
+        //this._updateNickTag(tag, this._userTracker.getNickGlobalStatus(nickName));
 
         return tag;
     },
diff --git a/src/userTracker.js b/src/userTracker.js
index cec3f87..77b9e18 100644
--- a/src/userTracker.js
+++ b/src/userTracker.js
@@ -2,154 +2,62 @@ const Polari = imports.gi.Polari;
 const Lang = imports.lang;
 const Tp = imports.gi.TelepathyGLib;
 const Signals = imports.signals;
-const ChatroomManager = imports.chatroomManager;
-
-/*left the old tracker here in order to compare the versions*/
-/*const UserTracker = new Lang.Class({
-    Name: 'UserTracker',
-
-    _init: function(room) {
-        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._onMemberDisconnected) },
-            { name: 'member-kicked',
-              handler: Lang.bind(this, this._onMemberKicked) },
-            { name: 'member-banned',
-              handler: Lang.bind(this, this._onMemberBanned) },
-            { name: 'member-joined',
-              handler: Lang.bind(this, this._onMemberJoined) },
-            { name: 'member-left',
-              handler: Lang.bind(this, this._onMemberLeft) }
-        ];
-
-        this._contactMapping = new Map();
-
-        if (!room) {
-            log("global user tracker created");
-            this._chatroomManager = ChatroomManager.getDefault();
 
-            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);
-        }
-    },
-
-    _onRoomAdded: function(roomManager , room) {
-        this._roomSignals = [];
-        this._referenceRoomSignals.forEach(Lang.bind(this, function(signal) {
-            this._roomSignals.push(room.connect(signal.name, signal.handler));
-        }));
-    },
-
-    _onRoomRemoved: function(roomManager, room) {
-        for (let i = 0; i < this._roomSignals.length; i++)
-            room.disconnect(this._roomSignals[i]);
-        this._roomSignals = [];
-    },
-
-    _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);
-                }));
+const AccountsMonitor = imports.accountsMonitor;
+const ChatroomManager = imports.chatroomManager;
 
-                this._contactMapping.delete(baseNick);
-            }
-        }
-    },
+let _singleton = null;
 
-    _onMemberRenamed: function(room, oldMember, newMember) {
-        oldMember._room = room;
-        newMember._room = room;
-        this._untrackMember(oldMember);
-        this._trackMember(newMember);
-    },
+function getUserStatusMonitor() {
+    if (_singleton == null)
+        _singleton = new UserStatusMonitor();
+    return _singleton;
+}
 
-    _onMemberDisconnected: function(room, member, message) {
-        member._room = room;
-        this._untrackMember(member);
-    },
+const UserStatusMonitor = new Lang.Class({
+    Name: 'UserStatusMonitor',
 
-    _onMemberKicked: function(room, member, actor) {
-        member._room = room;
-        this._untrackMember(member);
-    },
+    _init: function() {
+        this._userTrackersMaping = new Map();
+        this._accountsMonitor = AccountsMonitor.getDefault();
 
-    _onMemberBanned: function(room, member, actor) {
-        member._room = room;
-        this._untrackMember(member);
+        this._accountsMonitor.connect('account-added', Lang.bind(this, this._onAccountAdded));
+        this._accountsMonitor.connect('account-removed', Lang.bind(this, this._onAccountRemoved));
     },
 
-    _onMemberJoined: function(room, member) {
-        member._room = room;
-        this._trackMember(member);
+    _onAccountAdded: function(accountsMonitor, account) {
+        this._addUserTrackerForAccount(account);
     },
 
-    _onMemberLeft: function(room, member, message) {
-        member._room = room;
-        this._untrackMember(member);
+    _onAccountRemoved: function(accountsMonitor, account) {
+        this._removeUserTrackerForAccount(account);
     },
 
-    _trackMember: function(member) {
-        let baseNick = Polari.util_get_basenick(member.alias);
+    _addUserTrackerForAccount: function(account) {
+        if (this._userTrackersMaping.has(account))
+            return;
 
-        if (this._contactMapping.has(baseNick))
-            this._contactMapping.get(baseNick).push(member);
-        else
-            this._contactMapping.set(baseNick, [member]);
-
-        if (this._contactMapping.get(baseNick).length == 1)
-            this.emit('status-changed', member.alias, Tp.ConnectionPresenceType.AVAILABLE);
+        this._userTrackersMaping.set(account, new UserTracker(account));
     },
 
-    _untrackMember: function(member) {
-        let baseNick = Polari.util_get_basenick(member.alias);
-
-        let contacts = this._contactMapping.get(baseNick) || [];
-        let indexToDelete = contacts.map(c => c.alias).indexOf(member.alias);
-
-        if (indexToDelete > -1) {
-            contacts.splice(indexToDelete, 1);
+    _removeUserTrackerForAccount: function(account) {
+        if (!this._userTrackersMaping.has(account))
+            return;
 
-            if (contacts.length == 0)
-                this.emit('status-changed', member.alias, Tp.ConnectionPresenceType.OFFLINE);
-        }
+        this._userTrackersMaping.delete(account);
     },
 
-    getNickStatus: function(nickName) {
-        let baseNick = Polari.util_get_basenick(nickName);
+    getUserTrackerForAccount: function(account) {
+        if (this._userTrackersMaping.has(account))
+            return this._userTrackersMaping.get(account);
+    }
+});
 
-        let contacts = this._contactMapping.get(baseNick) || [];
-        return contacts.length == 0 ? Tp.ConnectionPresenceType.OFFLINE
-                                    : Tp.ConnectionPresenceType.AVAILABLE;
-    },
-});*/
 
 const UserTracker = new Lang.Class({
     Name: 'UserTracker',
 
-    _init: function() {
+    _init: function(account) {
         this._referenceRoomSignals = [
             { name: 'notify::channel',
               handler: Lang.bind(this, this._onChannelChanged) },
@@ -167,6 +75,8 @@ const UserTracker = new Lang.Class({
               handler: Lang.bind(this, this._onMemberLeft) }
         ];
 
+        this._account = account;
+
         this._globalContactMapping = new Map();
         this._roomMapping = new Map();
 
@@ -176,11 +86,13 @@ const UserTracker = new Lang.Class({
     },
 
     _onRoomAdded: function(roomManager, room) {
-        this._connectRoomSignalsForRoom(room);
+        if (room.account == this._account)
+            this._connectRoomSignalsForRoom(room);
     },
 
     _onRoomRemoved: function(roomManager, room) {
-        this._disconnectRoomSignalsForRoom(room);
+        if (room.account == this._account)
+            this._disconnectRoomSignalsForRoom(room);
     },
 
     _connectRoomSignalsForRoom: function(room) {
@@ -303,9 +215,9 @@ const UserTracker = new Lang.Class({
 
         if (map.get(baseNick).length == 1)
             if (map == this._globalContactMapping)
-                log("[Global UserTracker] User " + member.alias + " is now globally available");
+                log("[Global UserTracker] User " + member.alias + " is now globally available on " + 
this._account.get_display_name());
             else
-                log("[Local UserTracker] User " + member.alias + " is now available in room " + 
member._room.channelName);
+                log("[Local UserTracker] User " + member.alias + " is now available in room " + 
member._room.channelName + " on " + this._account.get_display_name());
     },
 
     _untrackMember: function(map, member) {
@@ -320,9 +232,9 @@ const UserTracker = new Lang.Class({
 
             if (contacts.length == 0)
                 if (map == this._globalContactMapping)
-                    log("[Global UserTracker] User " + member.alias + " is now globally offline");
+                    log("[Global UserTracker] User " + member.alias + " is now globally offline on " + 
this._account.get_display_name());
                 else
-                    log("[Local UserTracker] User " + member.alias + " is now offline in room " + 
member._room.channelName);
+                    log("[Local UserTracker] User " + member.alias + " is now offline in room " + 
member._room.channelName + " on " + this._account.get_display_name());
         }
     },
 


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