Esempio n. 1
0
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;
    }
}
Esempio n. 2
0
void dazeus::Network::slotIrcEvent(const std::string &event, const std::string &origin, const std::vector<std::string> &params) {
	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);
	}
}