summaryrefslogtreecommitdiff
authorskyhusker <skyhusker>2005-01-14 20:54:49 (UTC)
committer skyhusker <skyhusker>2005-01-14 20:54:49 (UTC)
commita808497c334275c4b73e31a9bea37f84e344964d (patch) (side-by-side diff)
tree490b0396494b83b1145fc65ab81e3e437af9aed5
parentb6c5c3b8b1ab130217678ec789db573ffc52c3eb (diff)
downloadopie-a808497c334275c4b73e31a9bea37f84e344964d.zip
opie-a808497c334275c4b73e31a9bea37f84e344964d.tar.gz
opie-a808497c334275c4b73e31a9bea37f84e344964d.tar.bz2
Added message queue, now topics always appear in channel tab
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/net/opieirc/ircchannellist.cpp0
-rw-r--r--noncore/net/opieirc/ircchanneltab.cpp17
-rw-r--r--noncore/net/opieirc/ircchanneltab.h3
-rw-r--r--noncore/net/opieirc/ircmessage.cpp31
-rw-r--r--noncore/net/opieirc/ircmessage.h6
-rw-r--r--noncore/net/opieirc/ircmessageparser.cpp158
-rw-r--r--noncore/net/opieirc/ircmessageparser.h10
-rw-r--r--noncore/net/opieirc/ircserver.cpp9
-rw-r--r--noncore/net/opieirc/ircservereditor.cpp8
-rw-r--r--noncore/net/opieirc/ircservertab.cpp39
-rw-r--r--noncore/net/opieirc/ircservertab.h1
-rw-r--r--noncore/net/opieirc/ircsession.cpp48
-rw-r--r--noncore/net/opieirc/ircsession.h7
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
@@ -3,2 +3,3 @@
#include <qhbox.h>
+#include <qdict.h>
@@ -8,2 +9,4 @@
+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) {
@@ -55,2 +58,8 @@ IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainW
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());
+ }
}
@@ -184,2 +193,9 @@ 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() {
@@ -191 +207,2 @@ IRCChannelList *IRCChannelTab::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
@@ -33,2 +33,3 @@
+template <class T> class QDict;
class IRCServerTab;
@@ -46,2 +47,3 @@ public:
void appendText(QString text);
+ static void enqueue(const QString &channel, const QString &message);
public slots:
@@ -72,2 +74,3 @@ protected:
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,2 +1,5 @@
#include <qtextstream.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
#include "ircmessage.h"
@@ -67,3 +70,3 @@ IRCMessage::IRCMessage(QString line) {
/*
- -- Uncomment to debug --
+ //-- Uncomment to debug --
@@ -79,2 +82,3 @@ IRCMessage::IRCMessage(QString line) {
printf("CTCP param count is : '%i'\n", m_parameters.count());
+
*/
@@ -86,2 +90,27 @@ QString IRCMessage::param(int param) {
+QStringList IRCMessage::params(const QString &paramstring) 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() {
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
@@ -23,4 +23,4 @@
-#include <qstring.h>
-#include <qstringlist.h>
+class QString;
+class QStringList;
@@ -54,2 +54,4 @@ public:
QString param(int param);
+ /* Return some parameters */
+ QStringList params(const QString &paramstring) const;
protected:
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,2 +1,4 @@
#include <qtextstream.h>
+#include <qdatetime.h>
+
#include "ircmessageparser.h"
@@ -29,32 +31,51 @@ 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 }
};
@@ -72,3 +93,3 @@ void IRCMessageParser::parse(IRCMessage *message) {
if (message->commandNumber() == numericalParserProcTable[i].commandNumber) {
- (this->*(numericalParserProcTable[i].proc))(message);
+ parseNumerical(message, i);
return;
@@ -96,4 +117,46 @@ 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())));
+
}
@@ -211,7 +274,7 @@ 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));
@@ -221,4 +284,4 @@ void IRCMessageParser::parseLiteralNick(IRCMessage *message) {
} else {
- /* Someone else is */
- IRCPerson *person = m_session->getPerson(mask.nick());
+ Someone else is
+ RCPerson *person = m_session->getPerson(mask.nick());
if (person) {
@@ -226,3 +289,3 @@ void IRCMessageParser::parseLiteralNick(IRCMessage *message) {
- /* 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;
@@ -239,3 +302,3 @@ void IRCMessageParser::parseLiteralNick(IRCMessage *message) {
}
- /* new code ends here */
+ new code ends here
} else {
@@ -243,3 +306,3 @@ void IRCMessageParser::parseLiteralNick(IRCMessage *message) {
}
- }
+ }*/
}
@@ -326,3 +389,3 @@ 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()));
@@ -465,11 +528,2 @@ 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) {
@@ -534,2 +588,6 @@ 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")));
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
@@ -48,2 +48,4 @@ typedef struct IRCNumericalMessageParserStruct {
unsigned short commandNumber;
+ char *message;
+ char *params;
IRCMessageParseProc proc;
@@ -63,3 +65,2 @@ private:
/* Parser functions */
- void nullFunc(IRCMessage *message);
void parseLiteralPing(IRCMessage *message);
@@ -75,4 +76,7 @@ private:
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);
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,2 +1,5 @@
#include "ircserver.h"
+#include "ircversion.h"
+
+#include <qobject.h>
@@ -51,3 +54,6 @@ QString IRCServer::name() {
unsigned short int IRCServer::port() {
+ if(m_port)
return m_port;
+
+ return 6667;
}
@@ -67,3 +73,6 @@ 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
@@ -60,8 +60,8 @@ void IRCServerEditor::accept() {
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 {
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
@@ -19,3 +19,3 @@ IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *pa
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);
@@ -37,2 +37,3 @@ IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *pa
connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling()));
+ connect(m_session, SIGNAL(updateChannels()), this, SLOT(slotUpdateChannels()));
settingsChanged();
@@ -115,3 +116,9 @@ void IRCServerTab::executeCommand(IRCTab *tab, QString line) {
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);
@@ -347,3 +354,3 @@ 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>");
}
@@ -361,15 +368,18 @@ 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:
@@ -388,2 +398,5 @@ void IRCServerTab::display(IRCOutput output) {
break;
+ case OUTPUT_TITLE:
+ m_description->setText(output.message());
+ break;
default:
@@ -393 +406,9 @@ 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
@@ -64,2 +64,3 @@ public slots:
void settingsChanged();
+ void slotUpdateChannels();
protected slots:
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
@@ -90,5 +90,9 @@ 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
@@ -101,2 +105,44 @@ 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);
+}
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
@@ -59,2 +59,3 @@ public:
void endSession();
+ bool isLoggedIn();
void sendMessage(IRCPerson *person, QString message);
@@ -63,2 +64,5 @@ public:
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);
@@ -75,2 +79,3 @@ signals:
void outputReady(IRCOutput output);
+ void updateChannels();
protected:
@@ -81,2 +86,4 @@ protected:
QList<IRCPerson> m_people;
+ QString m_validUsermodes;
+ QString m_validChannelmodes;
};