summaryrefslogtreecommitdiff
path: root/noncore/net/opieirc/ircmessageparser.cpp
Side-by-side diff
Diffstat (limited to 'noncore/net/opieirc/ircmessageparser.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/net/opieirc/ircmessageparser.cpp100
1 files changed, 58 insertions, 42 deletions
diff --git a/noncore/net/opieirc/ircmessageparser.cpp b/noncore/net/opieirc/ircmessageparser.cpp
index cfad2c1..9c1492c 100644
--- a/noncore/net/opieirc/ircmessageparser.cpp
+++ b/noncore/net/opieirc/ircmessageparser.cpp
@@ -5,2 +5,4 @@
#include "ircversion.h"
+#include "ircchannelperson.h"
+//#include "transferreceiver.h"
@@ -28,2 +30,3 @@ IRCCTCPMessageParserStruct IRCMessageParser::ctcpParserProcTable[] = {
{ "ACTION", FUNC(parseCTCPAction) },
+ { "DCC", FUNC(parseCTCPDCC) },
{ 0 , 0 }
@@ -52,3 +55,3 @@ IRCNumericalMessageParserStruct IRCMessageParser::numericalParserProcTable[] = {
{ 266, "%1", "1", 0 }, // RPL_GLOBALUSERS
- { 311, QT_TR_NOOP("Whois %1 (%2@%3)\nReal name: %4"), "1:3,5" }, // RPL_WHOISUSER
+ { 311, QT_TR_NOOP("Whois %1 (%2@%3)\nReal name: %4"), "1:3,5", 0 }, // RPL_WHOISUSER
{ 312, QT_TR_NOOP("%1 is using server %2"), "1,2", 0 }, // RPL_WHOISSERVER
@@ -56,2 +59,3 @@ IRCNumericalMessageParserStruct IRCMessageParser::numericalParserProcTable[] = {
{ 318, "%1 :%2", "1,2", 0 }, // RPL_ENDOFWHOIS
+ { 319, QT_TR_NOOP("%1 is on channels: %2"), "1,2", 0 }, // RPL_WHOISCHANNELS
{ 320, "%1 %2", "1,2", 0}, // RPL_WHOISVIRT
@@ -69,3 +73,3 @@ IRCNumericalMessageParserStruct IRCMessageParser::numericalParserProcTable[] = {
{ 401, QT_TR_NOOP("Channel or nick %1 doesn't exists"), "1", 0 }, // ERR_NOSUCHNICK
- { 406, QT_TR_NOOP("There is no history information for %1"), "1" }, // ERR_WASNOSUCHNICK
+ { 406, QT_TR_NOOP("There is no history information for %1"), "1", 0 }, // ERR_WASNOSUCHNICK
{ 409, "%1", "1", 0 }, // ERR_NOORIGIN
@@ -101,3 +105,3 @@ void IRCMessageParser::parse(IRCMessage *message) {
if (message->ctcpCommand() == ctcpParserProcTable[i].commandName) {
- (this->*(ctcpParserProcTable[i].proc))(message);
+ parseCTCP(message, i);
return;
@@ -136,5 +140,12 @@ void IRCMessageParser::parseNumerical(IRCMessage *message, int position) {
+void IRCMessageParser::parseCTCP(IRCMessage *message, int position) {
+ if(ctcpParserProcTable[position].proc)
+ (this->*(ctcpParserProcTable[position].proc))(message);
+}
+
+
+
void IRCMessageParser::parseNumericalServerName(IRCMessage *message) {
emit outputReady(IRCOutput(OUTPUT_TITLE, tr("Connected to")+" <b>" + message->prefix() + "</b>"));
- /* Register EFFECTIVE nickname, some networks (as irc-hispano) uses nick:password
+ /* Register EFFECTIVE nickname, some networks (as irc-hispano) use nick:password
* for authentication and the parser gets confused */
@@ -191,3 +202,2 @@ void IRCMessageParser::parseLiteralJoin(IRCMessage *message) {
if (!channel->getPerson(mask.nick())) {
- IRCChannelPerson *chanperson = new IRCChannelPerson();
IRCPerson *person = m_session->getPerson(mask.nick());
@@ -197,4 +207,3 @@ void IRCMessageParser::parseLiteralJoin(IRCMessage *message) {
}
- chanperson->flags = 0;
- chanperson->person = person;
+ IRCChannelPerson *chanperson = new IRCChannelPerson(person);
channel->addPerson(chanperson);
@@ -357,3 +366,3 @@ void IRCMessageParser::parseCTCPPing(IRCMessage *message) {
IRCPerson mask(message->prefix());
- m_session->m_connection->sendCTCP(mask.nick(), "PING " + message->allParameters());
+ m_session->m_connection->sendCTCPReply(mask.nick(), "PING", message->allParameters());
emit outputReady(IRCOutput(OUTPUT_CTCP, tr("Received a CTCP PING from ")+mask.nick()));
@@ -397,4 +406,12 @@ void IRCMessageParser::parseCTCPVersion(IRCMessage *message) {
IRCPerson mask(message->prefix());
- m_session->m_connection->sendCTCP(mask.nick(), "VERSION " APP_VERSION " " APP_COPYSTR);
- emit outputReady(IRCOutput(OUTPUT_CTCP, tr("Received a CTCP VERSION from ")+mask.nick()));
+ IRCOutput output(OUTPUT_CTCP);
+ if(message->isCTCPRequest()) {
+ m_session->m_connection->sendCTCPReply(mask.nick(), "VERSION", APP_VERSION " " APP_COPYSTR);
+ output.setMessage(tr("Received a CTCP VERSION request from ") + mask.nick());
+ }
+
+ else {
+ output.setMessage("Received CTCP VERSION reply from " + mask.nick() + ":" + message->param(0));
+ }
+ emit outputReady(output);
}
@@ -436,2 +453,12 @@ void IRCMessageParser::parseCTCPAction(IRCMessage *message) {
+void IRCMessageParser::parseCTCPDCC(IRCMessage *message) {
+ QStringList params = QStringList::split(' ', message->param(0).stripWhiteSpace());
+ if( params.count() != 5) {
+ emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Malformed DCC request from ") + IRCPerson(message->prefix()).nick()));
+ return;
+ }
+
+ //TransferReceiver *foo = new TransferReceiver(params[2].toUInt(), params[3].toUInt(), params[1], params[4].toUInt());
+}
+
void IRCMessageParser::parseLiteralMode(IRCMessage *message) {
@@ -450,6 +477,9 @@ void IRCMessageParser::parseLiteralMode(IRCMessage *message) {
temp = temp.right(1);
- } else if (temp.startsWith("-")) {
+ }
+ else
+ if (temp.startsWith("-")) {
set = FALSE;
temp = temp.right(1);
- } else {
+ }
+ else {
emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Mode change has unknown type")));
@@ -461,11 +491,3 @@ void IRCMessageParser::parseLiteralMode(IRCMessage *message) {
if (person) {
- if (set) {
- person->flags |= PERSON_FLAG_OP;
- IRCOutput output(OUTPUT_CHANPERSONMODE, mask.nick() + tr(" gives channel operator status to " + person->person->nick()));
- output.addParam(channel);
- output.addParam(person);
- emit outputReady(output);
- } else {
- person->flags &= 0xFFFF - PERSON_FLAG_OP;
- IRCOutput output(OUTPUT_CHANPERSONMODE, mask.nick() + tr(" removes channel operator status from " + person->person->nick()));
+ IRCOutput output(OUTPUT_CHANPERSONMODE, person->setOp(mask.nick(), set));
output.addParam(channel);
@@ -474,6 +496,8 @@ void IRCMessageParser::parseLiteralMode(IRCMessage *message) {
}
- } else {
+ else {
emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Mode change with unknown person - Desynchronized?")));
}
- } else if (temp == "v") {
+ }
+ else
+ if (temp == "v") {
stream >> temp;
@@ -481,11 +505,3 @@ void IRCMessageParser::parseLiteralMode(IRCMessage *message) {
if (person) {
- if (set) {
- person->flags |= PERSON_FLAG_VOICE;
- IRCOutput output(OUTPUT_CHANPERSONMODE, mask.nick() + tr(" gives voice to " + person->person->nick()));
- output.addParam(channel);
- output.addParam(person);
- emit outputReady(output);
- } else {
- person->flags &= 0xFFFF - PERSON_FLAG_VOICE;
- IRCOutput output(OUTPUT_CHANPERSONMODE, mask.nick() + tr(" removes voice from " + person->person->nick()));
+ IRCOutput output(OUTPUT_CHANPERSONMODE, person->setVoice(mask.nick(), set));
output.addParam(channel);
@@ -494,6 +510,7 @@ void IRCMessageParser::parseLiteralMode(IRCMessage *message) {
}
- } else {
+ else {
emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Mode change with unknown person - Desynchronized?")));
}
- } else {
+ }
+ else {
emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Mode change with unknown flag")));
@@ -515,3 +532,3 @@ void IRCMessageParser::parseLiteralKick(IRCMessage *message) {
if (person) {
- if (person->person->nick() == m_session->m_server->nick()) {
+ if (person->nick() == m_session->m_server->nick()) {
m_session->removeChannel(channel);
@@ -523,3 +540,3 @@ void IRCMessageParser::parseLiteralKick(IRCMessage *message) {
channel->removePerson(person);
- IRCOutput output(OUTPUT_OTHERKICK, person->person->nick() + tr(" was kicked from ") + channel->channelname() + tr(" by ") + mask.nick()+ " (" + message->param(2) + ")");
+ IRCOutput output(OUTPUT_OTHERKICK, person->nick() + tr(" was kicked from ") + channel->channelname() + tr(" by ") + mask.nick()+ " (" + message->param(2) + ")");
output.addParam(channel);
@@ -555,5 +572,5 @@ void IRCMessageParser::parseNumericalNames(IRCMessage *message) {
switch (flagch) {
- case '@': flag = PERSON_FLAG_OP; break;
- case '+': flag = PERSON_FLAG_VOICE; break;
- case '%': flag = PERSON_FLAG_HALFOP; break;
+ case '@': flag = IRCChannelPerson::PERSON_FLAG_OP; break;
+ case '+': flag = IRCChannelPerson::PERSON_FLAG_VOICE; break;
+ case '%': flag = IRCChannelPerson::PERSON_FLAG_HALFOP; break;
default : flag = 0; break;
@@ -564,3 +581,2 @@ void IRCMessageParser::parseNumericalNames(IRCMessage *message) {
- IRCChannelPerson *chan_person = new IRCChannelPerson();
IRCPerson *person = m_session->getPerson(nick);
@@ -571,4 +587,4 @@ void IRCMessageParser::parseNumericalNames(IRCMessage *message) {
}
- chan_person->person = person;
- chan_person->flags = flag;
+ IRCChannelPerson *chan_person = new IRCChannelPerson(person);
+ chan_person->setFlags(flag);
channel->addPerson(chan_person);