void IRCClient::readAndProcess(){ while(socket.canReadLine()){ QString line = socket.readLine(); QRegularExpressionMatch parsedLine = parser.match(line); if(parsedLine.hasMatch()){ QString prefix = parsedLine.captured(1); QString nick = parsedLine.captured(2); QString username = parsedLine.captured(3); QString hostname = parsedLine.captured(4); QString command = parsedLine.captured(5); QStringList params = parsedLine.captured(6).split(" "); params.takeFirst(); if(!parsedLine.captured(7).isEmpty()) params.append(parsedLine.captured(7).trimmed()); params.last() = params.last().trimmed(); if(command.compare("PING", Qt::CaseInsensitive) == 0) socket.write(("PONG " + params.last() + "\r\n").toUtf8()); else if(command.compare("JOIN", Qt::CaseInsensitive) == 0){ if(nick.compare(this->nickname, Qt::CaseSensitive) == 0) emit joinedChannel(params.first()); else{ if(!userTable.contains(params.first())) userTable[params.first()] = QStringList(nick); else userTable[params.first()].append(nick); emit updateUserList(params.first(), userTable[params.first()]); emit textChanged(nick + " has joined " + params.first() + "\r\n", params.first()); } } else if(command.compare("353") == 0){ if(!userTable.contains(params.at(2))) userTable[params.at(2)] = params.last().split(" "); else userTable[params.at(2)].append(params.last().split(" ")); emit updateUserList(params.at(2), userTable[params.at(2)]); } else if(command.compare("NOTICE", Qt::CaseInsensitive) == 0){ emit textChanged("[" + nick + "] " + params.last() + "\r\n"); } else if(command.compare("PRIVMSG", Qt::CaseInsensitive) == 0){ if(params.first().compare(this->nickname, Qt::CaseSensitive) == 0) emit textChanged("<" + nick + " -> " + params.first() + "> " + params.last() + "\r\n"); else emit textChanged("<" + nick + "> " + params.last() + "\r\n", params.first()); } else if(command.compare("QUIT", Qt::CaseInsensitive) == 0){ if(params.isEmpty()) emit textChanged(nick + " has disconnected from the server\r\n"); else emit textChanged(nick + " has disconnected from the server\r\n"); } else emit textChanged(line); } else qDebug() << line; } }
void dazeus::Network::slotIrcEvent(const std::string &event, const std::string &origin, const std::vector<std::string> ¶ms) { std::string receiver; if(params.size() > 0) receiver = params[0]; if(event != "ERROR") { // a signal from the server means all is OK deadline_ = 0; } #define MIN(a) if(params.size() < a) { fprintf(stderr, "Too few parameters for event %s\n", event.c_str()); return; } if(event == "CONNECT") { nextPongDeadline_ = time(NULL) + 30; serverIsActuallyOkay(activeServer_->config()); } else if(event == "JOIN") { MIN(1); joinedChannel(origin, receiver); } else if(event == "PART") { MIN(1); partedChannel(origin, std::string(), receiver); } else if(event == "KICK") { MIN(2); kickedChannel(origin, params[1], std::string(), receiver); } else if(event == "QUIT") { std::string message; if(params.size() > 0) { message = params[0]; } slotQuit(origin, message, receiver); } else if(event == "NICK") { MIN(1); slotNickChanged(origin, params[0], receiver); } else if(event == "TOPIC") { MIN(2); slotTopicChanged(origin, params[0], params[1]); } #undef MIN std::vector<NetworkListener*>::iterator nlit; for(nlit = networkListeners_.begin(); nlit != networkListeners_.end(); nlit++) { (*nlit)->ircEvent(event, origin, params, this); } }