author | skyhusker <skyhusker> | 2005-01-14 20:54:49 (UTC) |
---|---|---|
committer | skyhusker <skyhusker> | 2005-01-14 20:54:49 (UTC) |
commit | a808497c334275c4b73e31a9bea37f84e344964d (patch) (side-by-side diff) | |
tree | 490b0396494b83b1145fc65ab81e3e437af9aed5 /noncore | |
parent | b6c5c3b8b1ab130217678ec789db573ffc52c3eb (diff) | |
download | opie-a808497c334275c4b73e31a9bea37f84e344964d.zip opie-a808497c334275c4b73e31a9bea37f84e344964d.tar.gz opie-a808497c334275c4b73e31a9bea37f84e344964d.tar.bz2 |
Added message queue, now topics always appear in channel tab
-rw-r--r-- | noncore/net/opieirc/ircchannellist.cpp | 0 | ||||
-rw-r--r-- | noncore/net/opieirc/ircchanneltab.cpp | 17 | ||||
-rw-r--r-- | noncore/net/opieirc/ircchanneltab.h | 3 | ||||
-rw-r--r-- | noncore/net/opieirc/ircmessage.cpp | 31 | ||||
-rw-r--r-- | noncore/net/opieirc/ircmessage.h | 6 | ||||
-rw-r--r-- | noncore/net/opieirc/ircmessageparser.cpp | 158 | ||||
-rw-r--r-- | noncore/net/opieirc/ircmessageparser.h | 10 | ||||
-rw-r--r-- | noncore/net/opieirc/ircserver.cpp | 9 | ||||
-rw-r--r-- | noncore/net/opieirc/ircservereditor.cpp | 8 | ||||
-rw-r--r-- | noncore/net/opieirc/ircservertab.cpp | 39 | ||||
-rw-r--r-- | noncore/net/opieirc/ircservertab.h | 1 | ||||
-rw-r--r-- | noncore/net/opieirc/ircsession.cpp | 48 | ||||
-rw-r--r-- | noncore/net/opieirc/ircsession.h | 7 |
13 files changed, 267 insertions, 70 deletions
diff --git a/noncore/net/opieirc/ircchannellist.cpp b/noncore/net/opieirc/ircchannellist.cpp index 6bef318..c32c535 100644 --- a/noncore/net/opieirc/ircchannellist.cpp +++ b/noncore/net/opieirc/ircchannellist.cpp diff --git a/noncore/net/opieirc/ircchanneltab.cpp b/noncore/net/opieirc/ircchanneltab.cpp index 581f9a5..4a35929 100644 --- a/noncore/net/opieirc/ircchanneltab.cpp +++ b/noncore/net/opieirc/ircchanneltab.cpp @@ -2,4 +2,5 @@ #include <qwhatsthis.h> #include <qhbox.h> +#include <qdict.h> #include "ircchanneltab.h" @@ -7,4 +8,6 @@ #include "ircmessageparser.h" +QDict<QString> IRCChannelTab::m_queuedMessages (17); + IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) { m_mainWindow = mainWindow; @@ -54,4 +57,10 @@ IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainW connect(m_list, SIGNAL(doubleClicked ( QListBoxItem * ) ), this, SLOT(popupQuery( QListBoxItem * ) )); settingsChanged(); + + if(m_queuedMessages[m_channel->channelname()]) { + appendText(*m_queuedMessages[m_channel->channelname()]); + delete m_queuedMessages[m_channel->channelname()]; + m_queuedMessages.remove(m_channel->channelname()); + } } @@ -183,4 +192,11 @@ void IRCChannelTab::remove() { } +void IRCChannelTab::enqueue(const QString &channel, const QString &message) { + if (m_queuedMessages.count() == (m_queuedMessages.size() - 1) ) + /* 17 messages max */ + return; + m_queuedMessages.insert(channel, new QString(message)); +} + IRCChannel *IRCChannelTab::channel() { return m_channel; @@ -190,2 +206,3 @@ IRCChannelList *IRCChannelTab::list() { return m_list; } + diff --git a/noncore/net/opieirc/ircchanneltab.h b/noncore/net/opieirc/ircchanneltab.h index 70b212c..ffd1d5f 100644 --- a/noncore/net/opieirc/ircchanneltab.h +++ b/noncore/net/opieirc/ircchanneltab.h @@ -32,4 +32,5 @@ #define LISTWIDTH 70 +template <class T> class QDict; class IRCServerTab; class IRCChannelTab : public IRCTab { @@ -45,4 +46,5 @@ public: public: void appendText(QString text); + static void enqueue(const QString &channel, const QString &message); public slots: void remove(); @@ -71,4 +73,5 @@ protected: bool m_listVisible; int m_lines; + static QDict<QString> m_queuedMessages; }; diff --git a/noncore/net/opieirc/ircmessage.cpp b/noncore/net/opieirc/ircmessage.cpp index d823ad1..d0b2652 100644 --- a/noncore/net/opieirc/ircmessage.cpp +++ b/noncore/net/opieirc/ircmessage.cpp @@ -1,3 +1,6 @@ #include <qtextstream.h> +#include <qstring.h> +#include <qstringlist.h> + #include "ircmessage.h" @@ -66,5 +69,5 @@ IRCMessage::IRCMessage(QString line) { /* - -- Uncomment to debug -- + //-- Uncomment to debug -- printf("Parsed : '%s'\n", line.ascii()); @@ -78,4 +81,5 @@ IRCMessage::IRCMessage(QString line) { printf("CTCP Destination : '%s'\n", m_ctcpDestination.latin1()); printf("CTCP param count is : '%i'\n", m_parameters.count()); + */ } @@ -85,4 +89,29 @@ QString IRCMessage::param(int param) { } +QStringList IRCMessage::params(const QString ¶mstring) const { + QStringList params, retvalue; + params = QStringList::split(',', paramstring); + QStringList::Iterator end = params.end(); + + for (QStringList::Iterator it = params.begin(); it != end; ++it) { + int pos = (*it).find(':'); + if(pos < 0) { + if((*it).toInt() < m_parameters.count()) + retvalue << m_parameters[(*it).toInt()]; + } + + else { + int start, end; + start = (*it).left(pos).toInt(); + end = (*it).mid(pos+1).toInt(); + for (int i=start;i<=end && i < m_parameters.count() ;++i) { + retvalue << m_parameters[i]; + } + } + } + + return retvalue; +} + QString IRCMessage::prefix() { return m_prefix; diff --git a/noncore/net/opieirc/ircmessage.h b/noncore/net/opieirc/ircmessage.h index 0c5c879..10ba450 100644 --- a/noncore/net/opieirc/ircmessage.h +++ b/noncore/net/opieirc/ircmessage.h @@ -22,6 +22,6 @@ #define __IRCMESSAGE_H -#include <qstring.h> -#include <qstringlist.h> +class QString; +class QStringList; /* IRCMessage objects are used to encapsulate information @@ -53,4 +53,6 @@ public: /* Return one parameter */ QString param(int param); + /* Return some parameters */ + QStringList params(const QString ¶mstring) const; protected: QString m_prefix; diff --git a/noncore/net/opieirc/ircmessageparser.cpp b/noncore/net/opieirc/ircmessageparser.cpp index f8ccbb6..fde156c 100644 --- a/noncore/net/opieirc/ircmessageparser.cpp +++ b/noncore/net/opieirc/ircmessageparser.cpp @@ -1,3 +1,5 @@ #include <qtextstream.h> +#include <qdatetime.h> + #include "ircmessageparser.h" #include "ircversion.h" @@ -28,34 +30,53 @@ IRCCTCPMessageParserStruct IRCMessageParser::ctcpParserProcTable[] = { }; -/* Lookup table for numerical commands */ +/* Lookup table for numerical commands + * According to: + * http://www.faqs.org/rfcs/rfc1459.html + * http://www.faqs.org/rfcs/rfc2812.html +*/ + IRCNumericalMessageParserStruct IRCMessageParser::numericalParserProcTable[] = { - { 1, FUNC(parseNumericalSecondParam) }, // RPL_WELCOME - { 2, FUNC(parseNumericalSecondParam) }, // RPL_YOURHOST - { 3, FUNC(parseNumericalSecondParam) }, // RPL_CREATED - { 4, FUNC(parseNumericalAllParams) }, // RPL_MYINFO - { 5, FUNC(parseNumericalSecondParam) }, // RPL_BOUNCE, RPL_PROTOCTL - { 250, FUNC(parseNumericalAllParams) }, // RPL_STATSCONN - { 251, FUNC(parseNumericalSecondParam) }, // RPL_LUSERCLIENT - { 252, FUNC(parseNumericalAllParams) }, // RPL_LUSEROP - { 253, FUNC(parseNumericalAllParams) }, // RPL_LUSERUNKNOWN - { 254, FUNC(parseNumericalAllParams) }, // RPL_LUSERCHANNELS - { 255, FUNC(parseNumericalSecondParam) }, // RPL_LUSERME - { 265, FUNC(parseNumericalAllParams) }, // RPL_LOCALUSERS - { 266, FUNC(parseNumericalAllParams) }, // RPL_GLOBALUSERS - { 332, FUNC(parseNumericalTopic) }, // RPL_TOPIC - { 333, FUNC(parseNumericalTopicWhoTime) }, // RPL_TOPICWHOTIME - { 353, FUNC(parseNumericalNames) }, // RPL_NAMREPLY - { 366, FUNC(parseNumericalEndOfNames) }, // RPL_ENDOFNAMES - { 372, FUNC(parseNumericalSecondParam) }, // RPL_MOTD - { 375, FUNC(parseNumericalSecondParam) }, // RPL_MOTDSTART - { 376, FUNC(parseNumericalSecondParam) }, // RPL_ENDOFMOTD - { 377, FUNC(parseNumericalSecondParam) }, // RPL_MOTD2 - { 378, FUNC(parseNumericalSecondParam) }, // RPL_MOTD3 - { 401, FUNC(parseNumericalNoSuchNick) }, // ERR_NOSUCHNICK - { 406, FUNC(parseNumericalNoSuchNick) }, // ERR_WASNOSUCHNICK - { 412, FUNC(parseNumericalSecondParam) }, // ERR_NOTEXTTOSEND - { 422, FUNC(parseNumericalSecondParam) }, // ERR_NOMOTD - { 433, FUNC(parseNumericalNicknameInUse) }, // ERR_NICKNAMEINUSE - { 0, 0 } + { 1, "%1", "1", FUNC(parseNumericalServerName) }, // RPL_WELCOME + { 2, "%1", "1", 0 }, // RPL_YOURHOST + { 3, "%1", "1", 0 }, // RPL_CREATED + { 4, QT_TR_NOOP("Server %1 version %2 supports usermodes '%3' and channelmodes '%4'"), "1:4", FUNC(parseNumericalServerFeatures) }, // RPL_MYINFO + { 5, 0, 0, FUNC(parseNumericalServerProtocol) }, // RPL_BOUNCE, RPL_PROTOCTL + { 250, "%1", "1", 0 }, // RPL_STATSCONN + { 251, "%1", "1", 0 }, // RPL_LUSERCLIENT + { 252, QT_TR_NOOP("There are %1 operators connected"), "1", 0 }, // RPL_LUSEROP + { 253, QT_TR_NOOP("There are %1 unknown connection(s)"), "1", 0 }, // RPL_LUSERUNKNOWN + { 254, QT_TR_NOOP("There are %1 channels formed"), "1", 0 }, // RPL_LUSERCHANNELS + { 255, "%1", "1", 0 }, // RPL_LUSERME + { 263, QT_TR_NOOP("Please wait a while and try again"), 0, 0 }, // RPL_TRYAGAIN + { 265, "%1", "1", 0 }, // RPL_LOCALUSERS + { 266, "%1", "1", 0 }, // RPL_GLOBALUSERS + { 311, QT_TR_NOOP("Whois %1 (%2@%3)\nReal name: %4"), "1:3,5" }, // RPL_WHOISUSER + { 312, QT_TR_NOOP("%1 is using server %2"), "1,2", 0 }, // RPL_WHOISSERVER + { 317, 0, 0, FUNC(parseNumericalWhoisIdle) }, // RPL_WHOISIDLE + { 318, "%1 :%2", "1,2", 0 }, // RPL_ENDOFWHOIS + { 320, "%1 %2", "1,2", 0}, // RPL_WHOISVIRT + { 332, 0, 0, FUNC(parseNumericalTopic) }, // RPL_TOPIC + { 333, 0, 0, FUNC(parseNumericalTopicWhoTime) }, // RPL_TOPICWHOTIME*/ + { 353, QT_TR_NOOP("Names for %1: %2"), "2,3", FUNC(parseNumericalNames) }, // RPL_NAMREPLY + { 366, "%1 :%2", "1,2", FUNC(parseNumericalEndOfNames) }, // RPL_ENDOFNAMES + { 369, "%1 :%2", "1,2", 0 }, // RPL_ENDOFWHOWAS + { 372, "%1", "1", 0 }, // RPL_MOTD + { 375, "%1", "1", 0 }, // RPL_MOTDSTART + { 376, "%1", "1", 0 }, // RPL_ENDOFMOTD + { 377, "%1", "1", 0 }, // RPL_MOTD2 + { 378, "%1", "1", 0 }, // RPL_MOTD3 + { 391, QT_TR_NOOP("Time on server %1 is %2"), "1,2", 0 }, // RPL_TIME + { 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 + { 409, "%1", "1", 0 }, // ERR_NOORIGIN + { 411, "%1", "1", 0 }, // ERR_NORECIPIENT + { 412, "%1", "1", 0 }, // ERR_NOTEXTTOSEND + { 421, QT_TR_NOOP("Unknown command: %1"), "1", 0 }, // ERR_NOMOTD + { 422, QT_TR_NOOP("You're not on channel %1"), "1", 0}, // ERR_NOTONCHANNEL + { 422, "%1", "1", 0 }, // ERR_NOMOTD + { 433, QT_TR_NOOP("Can't change nick to %1: %2"), "1,2", FUNC(parseNumericalNicknameInUse) }, // ERR_NICKNAMEINUSE + { 477, "%1", "1", 0 }, // ERR_NOCHANMODES || ERR_NEEDREGGEDNICK + { 482, QT_TR_NOOP("[%1] Operation not permitted, you don't have enough channel privileges"), "1", 0 }, //ERR_CHANOPRIVSNEEDED + { 0, 0, 0, 0 } }; @@ -71,5 +92,5 @@ void IRCMessageParser::parse(IRCMessage *message) { for (int i=0; i<numericalParserProcTable[i].commandNumber; i++) { if (message->commandNumber() == numericalParserProcTable[i].commandNumber) { - (this->*(numericalParserProcTable[i].proc))(message); + parseNumerical(message, i); return; } @@ -95,6 +116,48 @@ void IRCMessageParser::parse(IRCMessage *message) { } -void IRCMessageParser::nullFunc(IRCMessage *) { - /* Do nothing */ +void IRCMessageParser::parseNumerical(IRCMessage *message, int position) { + QString out = tr(numericalParserProcTable[position].message); + QString paramString = numericalParserProcTable[position].params; + + if(!out.isEmpty() && !paramString.isEmpty()) { + QStringList params = message->params(numericalParserProcTable[position].params); + + QStringList::Iterator end = params.end(); + for (QStringList::Iterator it = params.begin(); it != end; ++it) { + out = out.arg(*it); + } + + emit outputReady(IRCOutput(OUTPUT_SERVERMESSAGE, out)); + } + + if(numericalParserProcTable[position].proc) + (this->*(numericalParserProcTable[position].proc))(message); +} + +void IRCMessageParser::parseNumericalServerName(IRCMessage *message) { + emit outputReady(IRCOutput(OUTPUT_TITLE, tr("Connected to")+" <b>" + message->prefix() + "</b>")); +} + +void IRCMessageParser::parseNumericalServerFeatures(IRCMessage *message) { + m_session->setValidUsermodes(message->param(2)); + m_session->setValidChannelmodes(message->param(3)); + +} + +void IRCMessageParser::parseNumericalServerProtocol(IRCMessage *message) { + /* XXX: Add some usefull features here */ + QString out = message->allParameters(); + out = out.mid(out.find(' ')+1); + emit outputReady(IRCOutput(OUTPUT_SERVERMESSAGE, out)); +} +void IRCMessageParser::parseNumericalWhoisIdle(IRCMessage *message) { + QDateTime dt; + QTime t; + t = t.addSecs(message->param(2).toInt()); + dt.setTime_t(message->param(3).toInt()); + + emit outputReady(IRCOutput(OUTPUT_SERVERMESSAGE, tr("%1 has been idle for %2").arg(message->param(1)).arg(t.toString()))); + emit outputReady(IRCOutput(OUTPUT_SERVERMESSAGE, tr("%1 signed on %2").arg(message->param(1)).arg(dt.toString()))); + } @@ -210,9 +273,9 @@ void IRCMessageParser::parseLiteralPrivMsg(IRCMessage *message) { void IRCMessageParser::parseLiteralNick(IRCMessage *message) { - IRCPerson mask(message->prefix()); - /* this way of handling nick changes really sucks */ + m_session->updateNickname(mask.nick(), message->param(0)); + /* this way of handling nick changes really sucks if (mask.nick() == m_session->m_server->nick()) { - /* We are changing our nickname */ + We are changing our nickname m_session->m_server->setNick(message->param(0)); IRCOutput output(OUTPUT_NICKCHANGE, tr("You are now known as %1").arg( message->param(0))); @@ -220,10 +283,10 @@ void IRCMessageParser::parseLiteralNick(IRCMessage *message) { emit outputReady(output); } else { - /* Someone else is */ - IRCPerson *person = m_session->getPerson(mask.nick()); + Someone else is + RCPerson *person = m_session->getPerson(mask.nick()); if (person) { //IRCOutput output(OUTPUT_NICKCHANGE, tr("%1 is now known as %2").arg( mask.nick() ).arg( message->param(0))); - /* new code starts here -- this removes the person from all channels */ + new code starts here -- this removes the person from all channels QList<IRCChannel> channels; m_session->getChannelsByPerson(person, channels); @@ -238,9 +301,9 @@ void IRCMessageParser::parseLiteralNick(IRCMessage *message) { emit outputReady(output); } - /* new code ends here */ + new code ends here } else { emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Nickname change of an unknown person"))); } - } + }*/ } @@ -325,5 +388,5 @@ void IRCMessageParser::parseCTCPPing(IRCMessage *message) { void IRCMessageParser::parseCTCPVersion(IRCMessage *message) { IRCPerson mask(message->prefix()); - m_session->m_connection->sendCTCP(mask.nick(), APP_VERSION " " APP_COPYSTR); + 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())); } @@ -464,13 +527,4 @@ void IRCMessageParser::parseLiteralKick(IRCMessage *message) { } - -void IRCMessageParser::parseNumericalSecondParam(IRCMessage *message) { - emit outputReady(IRCOutput(OUTPUT_SERVERMESSAGE, message->param(1))); -} - -void IRCMessageParser::parseNumericalAllParams(IRCMessage *message) { - emit outputReady(IRCOutput(OUTPUT_SERVERMESSAGE, message->allParameters())); -} - void IRCMessageParser::parseNumericalNames(IRCMessage *message) { /* Name list sent when joining a channel */ @@ -533,4 +587,8 @@ void IRCMessageParser::parseNumericalEndOfNames(IRCMessage *message) { void IRCMessageParser::parseNumericalNicknameInUse(IRCMessage *) { + /* If we are connnected this error is not critical */ + if(m_session->isLoggedIn()) + return; + emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Nickname is in use, please reconnect with a different nickname"))); m_session->endSession(); diff --git a/noncore/net/opieirc/ircmessageparser.h b/noncore/net/opieirc/ircmessageparser.h index 5412f5f..2fca61e 100644 --- a/noncore/net/opieirc/ircmessageparser.h +++ b/noncore/net/opieirc/ircmessageparser.h @@ -47,4 +47,6 @@ typedef struct IRCCTCPMessageParserStruct { typedef struct IRCNumericalMessageParserStruct { unsigned short commandNumber; + char *message; + char *params; IRCMessageParseProc proc; }; @@ -62,5 +64,4 @@ signals: private: /* Parser functions */ - void nullFunc(IRCMessage *message); void parseLiteralPing(IRCMessage *message); void parseLiteralNotice(IRCMessage *message); @@ -74,6 +75,9 @@ private: void parseLiteralKick(IRCMessage *message); void parseLiteralTopic(IRCMessage *message); - void parseNumericalSecondParam(IRCMessage *message); - void parseNumericalAllParams(IRCMessage *message); + void parseNumerical(IRCMessage *message, int position); + void parseNumericalServerName(IRCMessage *message); + void parseNumericalServerFeatures(IRCMessage *message); + void parseNumericalServerProtocol(IRCMessage *message); + void parseNumericalWhoisIdle(IRCMessage *message); void parseNumericalNames(IRCMessage *message); void parseNumericalEndOfNames(IRCMessage *message); diff --git a/noncore/net/opieirc/ircserver.cpp b/noncore/net/opieirc/ircserver.cpp index e27e41d..7e7e412 100644 --- a/noncore/net/opieirc/ircserver.cpp +++ b/noncore/net/opieirc/ircserver.cpp @@ -1,3 +1,6 @@ #include "ircserver.h" +#include "ircversion.h" + +#include <qobject.h> IRCServer::IRCServer() { @@ -50,5 +53,8 @@ QString IRCServer::name() { unsigned short int IRCServer::port() { + if(m_port) return m_port; + + return 6667; } @@ -66,5 +72,8 @@ QString IRCServer::nick() { QString IRCServer::realname() { + if(!m_realname.isEmpty()) return m_realname; + + return QString(QObject::tr("Using")) + " " + QString(APP_VERSION); } diff --git a/noncore/net/opieirc/ircservereditor.cpp b/noncore/net/opieirc/ircservereditor.cpp index 2d11bf0..1fda868 100644 --- a/noncore/net/opieirc/ircservereditor.cpp +++ b/noncore/net/opieirc/ircservereditor.cpp @@ -59,10 +59,10 @@ void IRCServerEditor::accept() { else if (m_hostname->text().length()==0) QMessageBox::critical(this, tr("Error"), tr("Host name required")); - else if (m_port->text().toInt()<=0) - QMessageBox::critical(this, tr("Error"), tr("Port required")); + //else if (m_port->text().toInt()<=0) + // QMessageBox::critical(this, tr("Error"), tr("Port required")); else if (m_nickname->text().length()==0) QMessageBox::critical(this, tr("Error"), tr("Nickname required")); - else if (m_realname->text().length()==0) - QMessageBox::critical(this, tr("Error"), tr("Realname required")); + //else if (m_realname->text().length()==0) + // QMessageBox::critical(this, tr("Error"), tr("Realname required")); else { /* Now verify whether the channel list has a valid format */ diff --git a/noncore/net/opieirc/ircservertab.cpp b/noncore/net/opieirc/ircservertab.cpp index e031d4d..90353f2 100644 --- a/noncore/net/opieirc/ircservertab.cpp +++ b/noncore/net/opieirc/ircservertab.cpp @@ -18,5 +18,5 @@ IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *pa m_close = FALSE; m_lines = 0; - m_description->setText(tr("Connection to")+" <b>" + server.hostname() + ":" + QString::number(server.port()) + "</b>"); + m_description->setText(tr("Connecting to")+" <b>" + server.hostname() + ":" + QString::number(server.port()) + "</b>"); m_textview = new QTextView(this); m_textview->setHScrollBarMode(QScrollView::AlwaysOff); @@ -36,4 +36,5 @@ IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *pa connect(m_session, SIGNAL(outputReady(IRCOutput)), this, SLOT(display(IRCOutput))); connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling())); + connect(m_session, SIGNAL(updateChannels()), this, SLOT(slotUpdateChannels())); settingsChanged(); @@ -114,5 +115,11 @@ void IRCServerTab::executeCommand(IRCTab *tab, QString line) { QString channel; stream >> channel; - if (channel.length() > 0 && (channel.startsWith("#") || channel.startsWith("+"))) { + /* According to RFC 1459 */ + if (channel.length() > 0 && channel.length() < 200 && + channel.find(",") == -1 && channel.find("") == -1) { + + if (!channel.startsWith("#") && !channel.startsWith("&")) { + channel = channel.prepend("#"); + } m_session->join(channel); } else { @@ -346,5 +353,5 @@ void IRCServerTab::display(IRCOutput output) { } } - appendText("<font color=\"" + m_notificationColor + "\">"+output.htmlMessage()+"</font><br>"); + IRCChannelTab::enqueue(channel->channelname(), "<font color=\"" + m_notificationColor + "\">"+output.htmlMessage()+"</font><br>"); } break; @@ -360,17 +367,20 @@ void IRCServerTab::display(IRCOutput output) { } break; -/* case OUTPUT_NICKCHANGE: { - //WAS HERE - QString nick = ((IRCPerson *)output.getParam(0))->nick(); + case OUTPUT_NICKCHANGE: { + QString *nick = static_cast<QString*>(output.getParam(0)); + if(!nick) { + appendText("<font color=\"" + m_notificationColor + "\">"+output.htmlMessage()+"</font><br>"); + break; + } QListIterator<IRCChannelTab> it(m_channelTabs); for (; it.current(); ++it) { - if (it.current()->list()->hasPerson(nick)) { + if (it.current()->list()->hasPerson(*nick)) { it.current()->appendText("<font color=\"" + m_notificationColor + "\">"+output.htmlMessage()+"</font><br>"); - it.current()->list()->update(); } } + delete nick; } break; - */ case OUTPUT_OTHERJOIN: + case OUTPUT_OTHERJOIN: case OUTPUT_OTHERKICK: case OUTPUT_CHANPERSONMODE: @@ -387,4 +397,7 @@ void IRCServerTab::display(IRCOutput output) { appendText("<font color=\"" + m_errorColor + "\">" + output.htmlMessage() + "</font><br>"); break; + case OUTPUT_TITLE: + m_description->setText(output.message()); + break; default: appendText("<font color=\"" + m_serverColor + "\">" + output.htmlMessage() + "</font><br>"); @@ -392,2 +405,10 @@ void IRCServerTab::display(IRCOutput output) { } } + +void IRCServerTab::slotUpdateChannels() { + QListIterator<IRCChannelTab> it(m_channelTabs); + for (; it.current(); ++it) { + it.current()->list()->update(); + } +} + diff --git a/noncore/net/opieirc/ircservertab.h b/noncore/net/opieirc/ircservertab.h index 69543fc..42f6f57 100644 --- a/noncore/net/opieirc/ircservertab.h +++ b/noncore/net/opieirc/ircservertab.h @@ -63,4 +63,5 @@ public slots: void processCommand(); void settingsChanged(); + void slotUpdateChannels(); protected slots: void display(IRCOutput output); diff --git a/noncore/net/opieirc/ircsession.cpp b/noncore/net/opieirc/ircsession.cpp index 3b176d0..ca0df50 100644 --- a/noncore/net/opieirc/ircsession.cpp +++ b/noncore/net/opieirc/ircsession.cpp @@ -89,7 +89,11 @@ bool IRCSession::isSessionActive() { } +bool IRCSession::isLoggedIn() { + return m_connection->isLoggedIn(); +} + void IRCSession::endSession() { if (m_connection->isLoggedIn()) - m_connection->sendLine("QUIT :" APP_VERSION); + quit(APP_VERSION); else m_connection->close(); @@ -100,4 +104,46 @@ void IRCSession::part(IRCChannel *channel) { } +void IRCSession::setValidUsermodes(const QString &modes) { + m_validUsermodes = modes; +} + +void IRCSession::setValidChannelmodes(const QString &modes) { + m_validChannelmodes = modes; +} + +void IRCSession::updateNickname(const QString &oldNickname, const QString &newNickname) { + QList<IRCChannel> channels; + IRCOutput output; + + if (oldNickname == m_server->nick()) { + m_server->setNick(newNickname); + output = IRCOutput(OUTPUT_NICKCHANGE, tr("You are now known as %1").arg(newNickname)); + channels = m_channels; + } + + else { + IRCPerson *person = getPerson(oldNickname); + + if(!person) { + emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Nickname change of an unknown person"))); + return; + } + + getChannelsByPerson(person, channels); + output = IRCOutput(OUTPUT_NICKCHANGE, tr("%1 is now known as %2").arg(oldNickname).arg(newNickname)); + } + + QListIterator<IRCChannel> it(channels); + for (;it.current(); ++it) { + IRCChannelPerson *chanperson = it.current()->getPerson(oldNickname); + it.current()->removePerson(chanperson); + chanperson->person->setNick(newNickname); + it.current()->addPerson(chanperson); + } + + emit updateChannels(); + output.addParam(new QString(newNickname)); + emit outputReady(output); +} IRCChannel *IRCSession::getChannel(QString channelname) { diff --git a/noncore/net/opieirc/ircsession.h b/noncore/net/opieirc/ircsession.h index f6330d8..96de3e4 100644 --- a/noncore/net/opieirc/ircsession.h +++ b/noncore/net/opieirc/ircsession.h @@ -58,8 +58,12 @@ public: bool isSessionActive(); void endSession(); + bool isLoggedIn(); void sendMessage(IRCPerson *person, QString message); void sendMessage(IRCChannel *channel, QString message); void sendAction(IRCPerson *person, QString message); void sendAction(IRCChannel *channel, QString message); + void updateNickname(const QString &oldNickname, const QString &newNickname); + void setValidUsermodes(const QString &modes); + void setValidChannelmodes(const QString &modes); IRCChannel *getChannel(QString channelname); IRCPerson *getPerson(QString nickname); @@ -74,4 +78,5 @@ protected slots: signals: void outputReady(IRCOutput output); + void updateChannels(); protected: IRCServer *m_server; @@ -80,4 +85,6 @@ protected: QList<IRCChannel> m_channels; QList<IRCPerson> m_people; + QString m_validUsermodes; + QString m_validChannelmodes; }; |