[polari/wip/raresv/userTrackerAndPopoversRebase: 2/24] Revert of "userTracker (used to save us from later conflicts): patch based on the first userTracker
- From: Rares Visalom <raresvisalom src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [polari/wip/raresv/userTrackerAndPopoversRebase: 2/24] Revert of "userTracker (used to save us from later conflicts): patch based on the first userTracker
- Date: Fri, 5 Aug 2016 23:40:21 +0000 (UTC)
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]