+ QString nick = updateNickFromMask(prefix);
+ if(nick == currentNick) {
+ // Q_ASSERT(!buffers.contains(params[0])); // cannot join a buffer twice!
+ // Buffer *buf = new Buffer(params[0]);
+ // buffers[params[0]] = buf;
+ } else {
+ VarMap n;
+ if(nicks.contains(nick)) {
+ n = nicks[nick].toMap();
+ VarMap chans = n["Channels"].toMap();
+ // Q_ASSERT(!chans.keys().contains(params[0])); TODO uncomment
+ chans[params[0]] = VarMap();
+ n["Channels"] = chans;
+ nicks[nick] = n;
+ emit nickUpdated(network, nick, n);
+ } else {
+ VarMap chans;
+ chans[params[0]] = VarMap();
+ n["Channels"] = chans;
+ n["User"] = userFromMask(prefix);
+ n["Host"] = hostFromMask(prefix);
+ nicks[nick] = n;
+ emit nickAdded(network, nick, n);
+ }
+ emit displayMsg(params[0], Message(Message::Join, params[0], prefix));
+ }
+}
+
+void Server::handleServerKick(QString prefix, QStringList params) {
+ QString kicker = updateNickFromMask(prefix);
+ QString nick = params[1];
+ Q_ASSERT(nicks.contains(nick));
+ VarMap n = nicks[nick].toMap();
+ VarMap chans = n["Channels"].toMap();
+ Q_ASSERT(chans.contains(params[0]));
+ chans.remove(params[0]);
+ QString msg = nick;
+ if(params.count() > 2) msg = QString("%1 %2").arg(msg).arg(params[2]);
+ emit displayMsg(params[0], Message(Message::Kick, msg, prefix));
+ if(chans.count() > 0) {
+ n["Channels"] = chans;
+ nicks[nick] = n;
+ emit nickUpdated(network, nick, n);
+ } else {
+ nicks.remove(nick);
+ emit nickRemoved(network, nick);
+ }
+}
+
+void Server::handleServerMode(QString prefix, QStringList params) {
+ if(isChannelName(params[0])) {
+ // TODO only channel-user modes supported by now
+ QString prefixes = serverSupports["PrefixModes"].toString();
+ QString modes = params[1];
+ int p = 2;
+ int m = 0;
+ bool add = true;
+ while(m < modes.length()) {
+ if(modes[m] == '+') { add = true; m++; continue; }
+ if(modes[m] == '-') { add = false; m++; continue; }
+ if(prefixes.contains(modes[m])) { // it's a user channel mode
+ Q_ASSERT(params.count() > m && nicks.contains(params[p]));
+ QString nick = params[p++];
+ VarMap n = nicks[nick].toMap(); VarMap clist = n["Channels"].toMap(); VarMap chan = clist[params[0]].toMap();
+ QString mstr = chan["Mode"].toString();
+ add ? mstr += modes[m] : mstr.remove(modes[m]);
+ chan["Mode"] = mstr; clist[params[0]] = chan; n["Channels"] = clist; nicks[nick] = n;
+ emit nickUpdated(network, nick, n);
+ m++;
+ } else {
+ // TODO add more modes
+ m++;
+ }
+ }
+ emit displayMsg(params[0], Message(Message::Mode, params.join(" "), prefix));
+ } else {
+ //Q_ASSERT(nicks.contains(params[0]));
+ //VarMap n = nicks[params[0]].toMap();
+ //QString mode = n["Mode"].toString();
+ emit displayMsg("", Message(Message::Mode, params.join(" ")));
+ }
+}
+
+void Server::handleServerNick(QString prefix, QStringList params) {
+ QString oldnick = updateNickFromMask(prefix);
+ QString newnick = params[0];
+ QVariant v = nicks.take(oldnick);
+ nicks[newnick] = v;
+ VarMap chans = v.toMap()["Channels"].toMap();
+ foreach(QString c, chans.keys()) {
+ if(oldnick != currentNick) { emit displayMsg(c, Message(Message::Nick, newnick, prefix)); }
+ else { emit displayMsg(c, Message(Message::Nick, newnick, newnick)); }
+ }
+ emit nickRenamed(network, oldnick, newnick);
+ if(oldnick == currentNick) {
+ currentNick = newnick;
+ emit ownNickSet(network, newnick);