[polari/wip/raresv/userTracker] i think it's working :D userTracler part 11
- From: Rares Visalom <raresvisalom src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [polari/wip/raresv/userTracker] i think it's working :D userTracler part 11
- Date: Tue, 5 Jul 2016 19:46:59 +0000 (UTC)
commit 027d0d5572be04565ea05c93b44c76beb6cf8364
Author: raresv <rares visalom gmail com>
Date: Tue Jul 5 22:36:48 2016 +0300
i think it's working :D userTracler part 11
src/chatView.js | 7 +++
src/userTracker.js | 137 ++++++++++++++++++++++++++++++++-------------------
2 files changed, 93 insertions(+), 51 deletions(-)
---
diff --git a/src/chatView.js b/src/chatView.js
index 9bdcb69..2f48cd5 100644
--- a/src/chatView.js
+++ b/src/chatView.js
@@ -341,6 +341,9 @@ const ChatView = new Lang.Class({
this._roomSignals.push(room.connect(signal.name, signal.handler));
}));
this._onChannelChanged();
+
+ /*where should we unwatch? int onChannelChanged when we don't have a channel?*/
+ this._roomWatchHandler =
this._userStatusMonitor.getUserTrackerForAccount(this._room.account).watchUser(this._room, null,
Lang.bind(this, this._onStatusChangedCallback));
},
_createTags: function() {
@@ -378,6 +381,10 @@ const ChatView = new Lang.Class({
});
},
+ _onStatusChangedCallback: function(nick, status) {
+ log("Nick " + nick + " has local status " + status);
+ },
+
_onStyleUpdated: function() {
let context = this.get_style_context();
context.save();
diff --git a/src/userTracker.js b/src/userTracker.js
index 42432f4..5dc7c6a 100644
--- a/src/userTracker.js
+++ b/src/userTracker.js
@@ -51,19 +51,6 @@ const UserStatusMonitor = new Lang.Class({
if (this._userTrackersMaping.has(account))
return this._userTrackersMaping.get(account);
return null;
- },
-
- watchUser: function(room, nickName, callback) {
- let baseNick = Polari.util_get_basenick(nickName);
- let contactList =
this.getUserTrackerForAccount(room.account)._roomMapping.get(room)._contactMapping.get(baseNick) || [];
-
- for (let i = 0; i < contactList.length; i++) {
- if (nickName == contactList[i].alias) {
- contactList[i]._onStatusChangedCallback = callback;
-
- contactList[i]._onStatusChangedCallback(nickName, Tp.ConnectionPresenceType.AVAILABLE);
- }
- }
}
});
@@ -93,6 +80,7 @@ const UserTracker = new Lang.Class({
this._globalContactMapping = new Map();
this._roomMapping = new Map();
+ this._handlerCounter = 0;
this._userStatusMonitor = getUserStatusMonitor();
@@ -112,8 +100,7 @@ const UserTracker = new Lang.Class({
},
_connectRoomSignalsForRoom: function(room) {
- if (!this._roomMapping.get(room))
- this._roomMapping.set(room, {});
+ this._ensureRoomMappingForRoom(room);
let roomData = this._roomMapping.get(room);
@@ -140,19 +127,23 @@ const UserTracker = new Lang.Class({
else
members = [emittingRoom.channel.connection.self_contact,
emittingRoom.channel.target_contact];
+ /*is this needed here?*/
+ this._ensureRoomMappingForRoom(emittingRoom);
+
/*if there is no map keeping track of the users in the emittingRoom
create it*/
if (!this._roomMapping.get(emittingRoom)._contactMapping)
this._roomMapping.get(emittingRoom)._contactMapping = new Map();
+ /*if there is no map keeping track of the local status change handlers*/
+ this._ensureHandlerMappingForRoom(emittingRoom);
+
/*keep track of initial members in the emittingRoom, both locally and
globally*/
members.forEach(m => {
m._room = emittingRoom;
- this._trackMember(this._roomMapping.get(emittingRoom)._contactMapping, m);
- this._trackMember(this._globalContactMapping, m);
-
- this._userStatusMonitor.watchUser(emittingRoom, m.alias, Lang.bind(this,
this._onLocalStatusChanged));
+ this._trackMember(this._roomMapping.get(emittingRoom)._contactMapping, m, emittingRoom);
+ this._trackMember(this._globalContactMapping, m, emittingRoom);
});
} else {
/*handle the absence of a channel for the global case*/
@@ -160,7 +151,7 @@ const UserTracker = new Lang.Class({
basenickContacts.forEach(Lang.bind(this, function(member) {
if (member._room == emittingRoom)
/*safe to delete while iterating?*/
- this._untrackMember(this._globalContactMapping, member);
+ this._untrackMember(this._globalContactMapping, member, emittingRoom);
}));
this._globalContactMapping.delete(baseNick);
@@ -170,11 +161,29 @@ const UserTracker = new Lang.Class({
basenickContacts.forEach(Lang.bind(this, function(member) {
if (member._room == emittingRoom)
/*safe to delete while iterating?*/
- this._untrackMember(this._roomMapping.get(emittingRoom)._contactMapping, member);
+ this._untrackMember(this._roomMapping.get(emittingRoom)._contactMapping, member,
emittingRoom);
}));
this._roomMapping.get(emittingRoom)._contactMapping.delete(baseNick);
}
+
+ /*since we have no channel, all users must be locally marked offline. so call the callbacks*/
+ for ([handlerID, handlerInfo] of this._roomMapping.get(emittingRoom)._handlerMapping) {
+ handlerInfo.handler(handlerInfo.nickName, Tp.ConnectionPresenceType.OFFLINE);
+ }
+ }
+ },
+
+ _ensureRoomMappingForRoom: function(room) {
+ if (!this._roomMapping.has(room))
+ this._roomMapping.set(room, {});
+ },
+
+ _ensureHandlerMappingForRoom: function(room) {
+ /*if there is no map keeping track of the local status change handlers*/
+ if (!this._roomMapping.get(room)._handlerMapping) {
+ this._roomMapping.get(room)._handlerMapping = new Map();
+ this._handlerCounter = 0;
}
},
@@ -182,52 +191,48 @@ const UserTracker = new Lang.Class({
oldMember._room = room;
newMember._room = room;
- this._untrackMember(this._roomMapping.get(room)._contactMapping, oldMember);
- this._untrackMember(this._globalContactMapping, oldMember);
- this._trackMember(this._roomMapping.get(room)._contactMapping, newMember);
- this._trackMember(this._globalContactMapping, newMember);
-
- this._userStatusMonitor.watchUser(room, newMember.alias, Lang.bind(this,
this._onLocalStatusChanged));
+ this._untrackMember(this._roomMapping.get(room)._contactMapping, oldMember, room);
+ this._untrackMember(this._globalContactMapping, oldMember, room);
+ this._trackMember(this._roomMapping.get(room)._contactMapping, newMember, room);
+ this._trackMember(this._globalContactMapping, newMember, room);
},
_onMemberDisconnected: function(room, member, message) {
member._room = room;
- this._untrackMember(this._roomMapping.get(room)._contactMapping, member);
- this._untrackMember(this._globalContactMapping, member);
+ this._untrackMember(this._roomMapping.get(room)._contactMapping, member, room);
+ this._untrackMember(this._globalContactMapping, member, room);
},
_onMemberKicked: function(room, member, actor) {
member._room = room;
- this._untrackMember(this._roomMapping.get(room)._contactMapping, member);
- this._untrackMember(this._globalContactMapping, member);
+ this._untrackMember(this._roomMapping.get(room)._contactMapping, member, room);
+ this._untrackMember(this._globalContactMapping, member, room);
},
_onMemberBanned: function(room, member, actor) {
member._room = room;
- this._untrackMember(this._roomMapping.get(room)._contactMapping, member);
- this._untrackMember(this._globalContactMapping, member);
+ this._untrackMember(this._roomMapping.get(room)._contactMapping, member, room);
+ this._untrackMember(this._globalContactMapping, member, room);
},
_onMemberJoined: function(room, member) {
member._room = room;
- this._trackMember(this._roomMapping.get(room)._contactMapping, member);
- this._trackMember(this._globalContactMapping, member);
-
- this._userStatusMonitor.watchUser(room, member.alias, Lang.bind(this, this._onLocalStatusChanged));
+ this._trackMember(this._roomMapping.get(room)._contactMapping, member, room);
+ this._trackMember(this._globalContactMapping, member, room);
},
_onMemberLeft: function(room, member, message) {
member._room = room;
- this._untrackMember(this._roomMapping.get(room)._contactMapping, member);
- this._untrackMember(this._globalContactMapping, member);
+ this._untrackMember(this._roomMapping.get(room)._contactMapping, member, room);
+ this._untrackMember(this._globalContactMapping, member, room);
},
- _trackMember: function(map, member) {
+ _trackMember: function(map, member, room) {
let baseNick = Polari.util_get_basenick(member.alias);
if (map.has(baseNick))
@@ -239,14 +244,19 @@ const UserTracker = new Lang.Class({
if (map == this._globalContactMapping)
this.emit("global-status-changed::" + member.alias, Tp.ConnectionPresenceType.AVAILABLE);
else
- log("[Local UserTracker] User " + member.alias + " is now available in room " +
member._room.channelName + " on " + this._account.get_display_name());
+ //log("[Local UserTracker] User " + member.alias + " is now available in room " +
member._room.channelName + " on " + this._account.get_display_name());
+ for ([handlerID, handlerInfo] of this._roomMapping.get(room)._handlerMapping)
+ if (handlerInfo.nickName == member.alias)
+ handlerInfo.handler(handlerInfo.nickName, Tp.ConnectionPresenceType.AVAILABLE);
+ else if (!handlerInfo.nickName)
+ handlerInfo.handler(member.alias, Tp.ConnectionPresenceType.AVAILABLE);
},
- _untrackMember: function(map, member) {
+ _untrackMember: function(map, member, room) {
let baseNick = Polari.util_get_basenick(member.alias);
let contacts = map.get(baseNick) || [];
- /*i really don;t like this search. maybe use a for loop?*/
+ /*i really don't like this search. maybe use a for loop?*/
let indexToDelete = contacts.map(c => c.alias + "|" + c._room.channelName).indexOf(member.alias +
"|" + member._room.channelName);
if (indexToDelete > -1) {
@@ -257,23 +267,48 @@ const UserTracker = new Lang.Class({
this.emit("global-status-changed::" + member.alias, Tp.ConnectionPresenceType.OFFLINE);
else
//log("[Local UserTracker] User " + member.alias + " is now offline in room " +
member._room.channelName + " on " + this._account.get_display_name());
- if (removedMember._onStatusChangedCallback)
- removedMember._onStatusChangedCallback(member.alias,
Tp.ConnectionPresenceType.OFFLINE);
- else
- log("does not have callback");
+ for ([handlerID, handlerInfo] of this._roomMapping.get(room)._handlerMapping)
+ if (handlerInfo.nickName == member.alias)
+ handlerInfo.handler(handlerInfo.nickName, Tp.ConnectionPresenceType.OFFLINE);
+ else if (!handlerInfo.nickName)
+ handlerInfo.handler(member.alias, Tp.ConnectionPresenceType.OFFLINE);
}
},
- _onLocalStatusChanged: function(nickName, status) {
- log("LOCAL STATUS CHANGED FOR " + nickName + " to " + status);
- },
-
getNickGlobalStatus: function(nickName) {
let baseNick = Polari.util_get_basenick(nickName);
let contacts = this._globalContactMapping.get(baseNick) || [];
return contacts.length == 0 ? Tp.ConnectionPresenceType.OFFLINE
: Tp.ConnectionPresenceType.AVAILABLE;
+ },
+
+ watchUser: function(room, nick, callback) {
+ this._ensureRoomMappingForRoom(room);
+ this._ensureHandlerMappingForRoom(room);
+
+ this._roomMapping.get(room)._handlerMapping.set(this._handlerCounter, {
+ nickName: nick,
+ handler: callback
+ });
+
+ this._handlerCounter++;
+
+ return this._handlerCounter - 1;
+ }
+
+ unwatchUser: function(room, nick, callback) {
+ /*would it make sense to call _ensure() here?*/
+ if (!this._roomMapping)
+ return;
+
+ if (!this._roomMapping.has(room))
+ return;
+
+ if (!this._roomMapping.get(room)._handlerMapping)
+ return;
+
+
}
});
Signals.addSignalMethods(UserTracker.prototype);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]