X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=network%2Fserver.cpp;h=ffc90548d3ff0abde5738ed0f5e672934c0814c0;hp=bf78eafa86e946da5f4d058fb7a90d9656087340;hb=f02f9f00b4cdb9819fcafbb33c4ee8b044f1f0f1;hpb=23221be79f5a6c064061f425a156b27fd9802a09 diff --git a/network/server.cpp b/network/server.cpp index bf78eafa..ffc90548 100644 --- a/network/server.cpp +++ b/network/server.cpp @@ -18,6 +18,10 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +/* OBSOLETE CODE, MOVED TO core/ */ + +#error "obsolete code" + #include "util.h" #include "global.h" #include "server.h" @@ -109,12 +113,12 @@ QString Server::updateNickFromMask(QString mask) { void Server::userInput(QString net, QString buf, QString msg) { if(net != network) return; // not me! - msg = msg.trimmed(); // remove whitespace from start and end + //msg = msg.trimmed(); // remove whitespace from start and end if(msg.isEmpty()) return; if(!msg.startsWith('/')) { msg = QString("/SAY ") + msg; } - handleUserMsg(buf, msg); + handleUserInput(buf, msg); } void Server::putRawLine(QString s) { @@ -131,7 +135,7 @@ void Server::putCmd(QString cmd, QStringList params, QString prefix) { m += " " + params[i]; } if(!params.isEmpty()) m += " :" + params.last(); - qDebug() << "SentCmd: " << m; + qDebug() << "Sent: " << m; m += "\r\n"; socket.write(m.toAscii()); } @@ -154,8 +158,14 @@ void Server::handleServerMsg(QString msg) { } cmd = msg.section(' ', 0, 0).toUpper(); msg = msg.section(' ', 1); - QString left = msg.section(':', 0, 0); - QString trailing = msg.section(':', 1); + QString left, trailing; + // RPL_ISUPPORT (005) can contain colons, so don't treat it like the rest of the commands + if(cmd.toUInt() == 5) { + left = msg.remove(QString(":are supported by this server")); + } else { + left = msg.section(':', 0, 0); + trailing = msg.section(':', 1); + } if(!left.isEmpty()) { params << left.split(' ', QString::SkipEmptyParts); } @@ -192,6 +202,24 @@ void Server::defaultServerHandler(QString cmd, QString prefix, QStringList param case 2: case 3: case 4: case 5: case 251: case 252: case 253: case 254: case 255: case 372: case 375: emit displayMsg("", Message(Message::Server, params.join(" "), prefix)); break; + // Server error messages without param, just display them + case 409: case 411: case 412: case 422: case 424: case 431: case 445: case 446: case 451: case 462: + case 463: case 464: case 465: case 466: case 472: case 481: case 483: case 485: case 491: case 501: case 502: + emit displayMsg("", Message(Message::Error, params.join(" "), prefix)); + break; + // Server error messages, display them in red. First param will be appended. + case 401: case 402: case 403: case 404: case 406: case 408: case 415: case 421: case 432: case 442: + { QString p = params.takeFirst(); + emit displayMsg("", Message(Message::Error, params.join(" ") + " " + p, prefix)); + break; + } + // Server error messages which will be displayed with a colon between the first param and the rest + case 413: case 414: case 423: case 433: case 436: case 441: case 444: case 461: + case 467: case 471: case 473: case 474: case 475: case 476: case 477: case 478: case 482: + { QString p = params.takeFirst(); + emit displayMsg("", Message(Message::Error, p + ": " + params.join(" "))); + break; + } // Ignore these commands. case 366: case 376: break; @@ -207,28 +235,30 @@ void Server::defaultServerHandler(QString cmd, QString prefix, QStringList param } } -void Server::handleUserMsg(QString bufname, QString usrMsg) { +void Server::handleUserInput(QString bufname, QString usrMsg) { try { + /* Looks like we don't need core-side buffers... Buffer *buffer = 0; if(!bufname.isEmpty()) { Q_ASSERT(buffers.contains(bufname)); buffer = buffers[bufname]; } + */ QString cmd = usrMsg.section(' ', 0, 0).remove(0, 1).toUpper(); - QString msg = usrMsg.section(' ', 1).trimmed(); + QString msg = usrMsg.section(' ', 1); QString hname = cmd.toLower(); hname[0] = hname[0].toUpper(); hname = "handleUser" + hname; - if(!QMetaObject::invokeMethod(this, hname.toAscii(), Q_ARG(QString, msg), Q_ARG(Buffer*, buffer))) { + if(!QMetaObject::invokeMethod(this, hname.toAscii(), Q_ARG(QString, bufname), Q_ARG(QString, msg))) { // Ok. Default handler it is. - defaultUserHandler(cmd, msg, buffer); + defaultUserHandler(bufname, cmd, msg); } } catch(Exception e) { emit displayMsg("", Message(Message::Error, e.msg())); } } -void Server::defaultUserHandler(QString cmd, QString msg, Buffer *buf) { +void Server::defaultUserHandler(QString bufname, QString cmd, QString msg) { emit displayMsg("", Message(Message::Error, QString("Error: %1 %2").arg(cmd).arg(msg))); } @@ -236,38 +266,117 @@ void Server::defaultUserHandler(QString cmd, QString msg, Buffer *buf) { /**********************************************************************************/ /* -void Server::handleUser(QString msg, Buffer *buf) { +void Server::handleUser(QString bufname, QString msg) { } */ -void Server::handleUserJoin(QString msg, Buffer *buf) { +void Server::handleUserAway(QString bufname, QString msg) { + putCmd("AWAY", QStringList(msg)); +} + +void Server::handleUserDeop(QString bufname, QString msg) { + QStringList nicks = msg.split(' ', QString::SkipEmptyParts); + QString m = "-"; for(int i = 0; i < nicks.count(); i++) m += 'o'; + QStringList params; + params << bufname << m << nicks; + putCmd("MODE", params); +} + +void Server::handleUserDevoice(QString bufname, QString msg) { + QStringList nicks = msg.split(' ', QString::SkipEmptyParts); + QString m = "-"; for(int i = 0; i < nicks.count(); i++) m += 'v'; + QStringList params; + params << bufname << m << nicks; + putCmd("MODE", params); +} + +void Server::handleUserInvite(QString bufname, QString msg) { + QStringList params; + params << msg << bufname; + putCmd("INVITE", params); +} + +void Server::handleUserJoin(QString bufname, QString msg) { putCmd("JOIN", QStringList(msg)); +} + +void Server::handleUserKick(QString bufname, QString msg) { + QStringList params; + params << bufname << msg.split(' ', QString::SkipEmptyParts); + putCmd("KICK", params); +} + +void Server::handleUserList(QString bufname, QString msg) { + putCmd("LIST", msg.split(' ', QString::SkipEmptyParts)); +} + +void Server::handleUserMode(QString bufname, QString msg) { + putCmd("MODE", msg.split(' ', QString::SkipEmptyParts)); +} +void Server::handleUserMsg(QString bufname, QString msg) { + QString nick = msg.section(" ", 0, 0); + msg = msg.section(" ", 1); + if(nick.isEmpty() || msg.isEmpty()) return; + QStringList params; + params << nick << msg; + putCmd("PRIVMSG", params); +} + +void Server::handleUserNick(QString bufname, QString msg) { + QString nick = msg.section(' ', 0, 0); + putCmd("NICK", QStringList(nick)); +} + +void Server::handleUserOp(QString bufname, QString msg) { + QStringList nicks = msg.split(' ', QString::SkipEmptyParts); + QString m = "+"; for(int i = 0; i < nicks.count(); i++) m += 'o'; + QStringList params; + params << bufname << m << nicks; + putCmd("MODE", params); } -void Server::handleUserQuote(QString msg, Buffer *buf) { +void Server::handleUserPart(QString bufname, QString msg) { + QStringList params; + params << bufname << msg; + putCmd("PART", params); +} + +void Server::handleUserQuit(QString bufname, QString msg) { + putCmd("QUIT", QStringList(msg)); +} + +void Server::handleUserQuote(QString bufname, QString msg) { putRawLine(msg); } -void Server::handleUserSay(QString msg, Buffer *buf) { - if(!buf) return; // server buffer +void Server::handleUserSay(QString bufname, QString msg) { + if(bufname.isEmpty()) return; // server buffer QStringList params; - params << buf->name() << msg; + params << bufname << msg; putCmd("PRIVMSG", params); emit displayMsg(params[0], Message(Message::Msg, msg, currentNick, Message::Self)); } +void Server::handleUserVoice(QString bufname, QString msg) { + QStringList nicks = msg.split(' ', QString::SkipEmptyParts); + QString m = "+"; for(int i = 0; i < nicks.count(); i++) m += 'v'; + QStringList params; + params << bufname << m << nicks; + putCmd("MODE", params); +} + /**********************************************************************************/ void Server::handleServerJoin(QString prefix, QStringList params) { Q_ASSERT(params.count() == 1); 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; + // 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)) { @@ -312,6 +421,40 @@ void Server::handleServerKick(QString prefix, QStringList params) { } } +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]; @@ -324,7 +467,7 @@ void Server::handleServerNick(QString prefix, QStringList params) { } emit nickRenamed(network, oldnick, newnick); if(oldnick == currentNick) { - currentNick == newnick; + currentNick = newnick; emit ownNickSet(network, newnick); } } @@ -380,13 +523,43 @@ void Server::handleServerQuit(QString prefix, QStringList params) { void Server::handleServer001(QString prefix, QStringList params) { currentServer = prefix; currentNick = params[0]; + VarMap n; + n["Channels"] = VarMap(); + nicks[currentNick] = n; emit ownNickSet(network, currentNick); + emit nickAdded(network, currentNick, VarMap()); emit displayMsg("", Message(Message::Server, params[1], prefix)); } +/* RPL_ISUPPORT */ +void Server::handleServer005(QString prefix, QStringList params) { + foreach(QString p, params) { + QString key = p.section("=", 0, 0); + QString val = p.section("=", 1); + serverSupports[key] = val; + // handle some special cases + if(key == "PREFIX") { + VarMap foo; QString modes, prefixes; + Q_ASSERT(val.contains(')') && val.startsWith('(')); + int m = 1, p; + for(p = 2; p < val.length(); p++) if(val[p] == ')') break; + p++; + for(; val[m] != ')'; m++, p++) { + Q_ASSERT(p < val.length()); + foo[QString(val[m])] = QString(val[p]); + modes += val[m]; prefixes += val[p]; + } + serverSupports["PrefixModes"] = modes; serverSupports["Prefixes"] = prefixes; + serverSupports["ModePrefixMap"] = foo; + } + } +} + + /* RPL_NOTOPIC */ void Server::handleServer331(QString prefix, QStringList params) { emit topicSet(network, params[0], ""); + emit displayMsg(params[0], Message(Message::Server, tr("No topic is set for %1.").arg(params[0]))); } /* RPL_TOPIC */ @@ -405,12 +578,16 @@ void Server::handleServer333(QString prefix, QStringList params) { void Server::handleServer353(QString prefix, QStringList params) { params.removeFirst(); // = or * QString buf = params.takeFirst(); + QString prefixes = serverSupports["Prefixes"].toString(); foreach(QString nick, params[0].split(' ')) { - // TODO: parse more prefix characters! use 005? - QString mode = ""; - if(nick.startsWith('@')) { mode = "o"; nick.remove(0,1); } - else if(nick.startsWith('+')) { mode = "v"; nick.remove(0,1); } - VarMap c; c["Mode"] = mode; + QString mode = "", pfx = ""; + if(prefixes.contains(nick[0])) { + pfx = nick[0]; + for(int i = 0;; i++) + if(prefixes[i] == nick[0]) { mode = serverSupports["PrefixModes"].toString()[i]; break; } + nick.remove(0,1); + } + VarMap c; c["Mode"] = mode; c["Prefix"] = pfx; if(nicks.contains(nick)) { VarMap n = nicks[nick].toMap(); VarMap chans = n["Channels"].toMap(); @@ -423,7 +600,6 @@ void Server::handleServer353(QString prefix, QStringList params) { c["Mode"] = mode; chans[buf] = c; n["Channels"] = chans; - n["Nick"] = nick; nicks[nick] = n; emit nickAdded(network, nick, n); }