#include "ctcphandler.h"
#include "ircuser.h"
-#include "ircchannel.h"
+#include "coreircchannel.h"
#include "logger.h"
#include <QDebug>
}
IrcServerHandler::~IrcServerHandler() {
-
}
/*! Handle a raw message string sent by the server. We try to find a suitable handler, otherwise we call a default handler. */
return;
QString target = serverDecode(params[0]);
- if(prefix.isEmpty() || target == "AUTH")
+
+ // special treatment for welcome messages like:
+ // :ChanServ!ChanServ@services. NOTICE egst :[#apache] Welcome, this is #apache. Please read the in-channel topic message. This channel is being logged by IRSeekBot. If you have any question please see http://blog.freenode.net/?p=68
+ if(!network()->isChannelName(target)) {
+ QString msg = serverDecode(params[1]);
+ QRegExp welcomeRegExp("^\\[([^\\]]+)\\] ");
+ if(welcomeRegExp.indexIn(msg) != -1) {
+ QString channelname = welcomeRegExp.cap(1);
+ msg = msg.mid(welcomeRegExp.matchedLength());
+ CoreIrcChannel *chan = static_cast<CoreIrcChannel *>(network()->ircChannel(channelname)); // we only have CoreIrcChannels in the core, so this cast is safe
+ if(chan && !chan->receivedWelcomeMsg()) {
+ chan->setReceivedWelcomeMsg();
+ emit displayMsg(Message::Notice, BufferInfo::ChannelBuffer, channelname, msg, prefix);
+ return;
+ }
+ }
+ }
+
+ if(prefix.isEmpty() || target == "AUTH") {
target = "";
- else if(!network()->isChannelName(target))
- target = nickFromMask(prefix);
+ } else {
+ if(!target.isEmpty() && network()->prefixes().contains(target[0]))
+ target = target.mid(1);
+ if(!network()->isChannelName(target))
+ target = nickFromMask(prefix);
+ }
networkConnection()->ctcpHandler()->parse(Message::Notice, prefix, target, params[1]);
}
? QByteArray("")
: params[1];
- // are we the target?
- if(network()->isMyNick(target))
- target = nickFromMask(ircuser->nick());
+ if(!network()->isChannelName(target))
+ target = nickFromMask(prefix);
// it's possible to pack multiple privmsgs into one param using ctcp
// - > we let the ctcpHandler do the work
if(me)
me->setAway(false);
- if(!params.isEmpty())
- emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", serverDecode(params[0]));
+ if(!network()->autoAwayActive()) {
+ if(!params.isEmpty())
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", serverDecode(params[0]));
+ } else {
+ network()->setAutoAwayActive(false);
+ }
}
// 306 RPL_NOWAWAY
if(me)
me->setAway(true);
- if(!params.isEmpty())
+ if(!params.isEmpty() && !network()->autoAwayActive())
emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", serverDecode(params[0]));
}