]> jfr.im git - irc/quakenet/qwebirc.git/blob - js/irc/irctracker.js
add highres icon + make app mobile webapp aware
[irc/quakenet/qwebirc.git] / js / irc / irctracker.js
1 qwebirc.irc.NickChanEntry = function() {
2 this.prefixes = "";
3 this.lastSpoke = -Infinity;
4 };
5
6 qwebirc.irc.IRCTracker = new Class({
7 initialize: function(owner) {
8 this.channels = new QHash();
9 this.nicknames = new QHash();
10 this.owner = owner;
11 },
12 toIRCLower: function(value) {
13 /* proxied because the method can change after we connect */
14
15 return this.owner.toIRCLower(value);
16 },
17 getNick: function(nick) {
18 return this.nicknames.get(nick);
19 },
20 getOrCreateNick: function(nick) {
21 var n = this.getNick(nick);
22 if(!n) {
23 n = new QHash();
24 this.nicknames.put(nick, n);
25 }
26 return n;
27 },
28 getChannel: function(channel) {
29 return this.channels.get(this.toIRCLower(channel));
30 },
31 getOrCreateChannel: function(channel) {
32 var c = this.getChannel(channel);
33 if (!c) {
34 c = new QHash();
35 this.channels.put(this.toIRCLower(channel), c);
36 }
37 return c;
38 },
39 getOrCreateNickOnChannel: function(nick, channel) {
40 var n = this.getOrCreateNick(nick);
41
42 var nc = n.get(this.toIRCLower(channel));
43 if(!nc)
44 return this.addNickToChannel(nick, channel);
45
46 return nc;
47 },
48 getNickOnChannel: function(nick, channel) {
49 var n = this.getNick(nick);
50 if(!n)
51 return;
52
53 return n.get(this.toIRCLower(channel));
54 },
55 addNickToChannel: function(nick, channel) {
56 var nc = new qwebirc.irc.NickChanEntry();
57
58 var n = this.getOrCreateNick(nick);
59 n.put(this.toIRCLower(channel), nc);
60
61 var c = this.getOrCreateChannel(channel);
62 c.put(nick, nc);
63
64 return nc;
65 },
66 removeNick: function(nick) {
67 var n = this.getNick(nick);
68 if(!n)
69 return;
70
71 n.each(function(channel) {
72 var lchannel = this.toIRCLower(channel);
73 var c = this.channels.get(lchannel);
74
75 c.remove(nick);
76 if(c.isEmpty())
77 this.channels.remove(lchannel);
78 }, this);
79 this.nicknames.remove(nick);
80 },
81 removeChannel: function(channel) {
82 var c = this.getChannel(channel);
83 if(!c)
84 return;
85
86 var lchannel = this.toIRCLower(channel);
87
88 c.each(function(nick) {
89 var n = this.nicknames.get(nick);
90
91 n.remove(lchannel);
92 if(n.isEmpty())
93 this.nicknames.remove(nick);
94 }, this);
95 this.channels.remove(lchannel);
96 },
97 removeNickFromChannel: function(nick, channel) {
98 var lchannel = this.toIRCLower(channel);
99
100 var n = this.getNick(nick);
101 var c = this.getChannel(lchannel);
102 if(!n || !c)
103 return;
104
105 n.remove(lchannel);
106 c.remove(nick);
107
108 if(n.isEmpty())
109 this.nicknames.remove(nick);
110 if(c.isEmpty())
111 this.channels.remove(lchannel);
112 },
113 renameNick: function(oldnick, newnick) {
114 var n = this.getNick(oldnick);
115 if(!n)
116 return;
117
118 n.each(function(channel) {
119 var c = this.channels.get(this.toIRCLower(channel));
120 c.put(newnick, c.get(oldnick));
121 c.remove(oldnick);
122 }, this);
123
124 this.nicknames.put(newnick, this.nicknames.get(oldnick));
125 this.nicknames.remove(oldnick);
126 },
127 updateLastSpoke: function(nick, channel, time) {
128 var nc = this.getNickOnChannel(nick, channel);
129 if($defined(nc))
130 nc.lastSpoke = time;
131 },
132 __mapAndSortEntries: function(channel, fn, pos) {
133 var c = this.getChannel(channel);
134 if(!c)
135 return;
136
137 var n = c.map(fn);
138 n.sort(qwebirc.util.arrayCmp);
139
140 var n2 = [];
141 for(var i=0;i<n.length;i++)
142 n2.push(n[i][pos]);
143
144 return n2;
145 },
146 getSortedByLastSpoke: function(channel) {
147 var l = this.toIRCLower.bind(this);
148 return this.__mapAndSortEntries(channel, function(nick, nc) {
149 return [-nc.lastSpoke, l(nick)];
150 }, 2);
151 },
152 getSortedByLastSpokePrefix: function(channel) {
153 var p = this.owner.getPrefixPriority.bind(this.owner);
154 var l = this.toIRCLower.bind(this);
155 return this.__mapAndSortEntries(channel, function(nick, nc) {
156 return [-nc.lastSpoke, p(nc.prefixes), l(nick), nick];
157 }, 3);
158 }
159 });