+/* Handle signals from Netsplit objects */
+
+void IrcServerHandler::handleNetsplitJoin(const QString &channel, const QStringList &users, const QStringList &modes, const QString& quitMessage)
+{
+ IrcChannel *ircChannel = network()->ircChannel(channel);
+ if(!ircChannel) {
+ return;
+ }
+ QList<IrcUser *> ircUsers;
+ QStringList newModes = modes;
+
+ foreach(QString user, users) {
+ IrcUser *iu = network()->updateNickFromMask(user);
+ if(iu)
+ ircUsers.append(iu);
+ else {
+ newModes.removeAt(users.indexOf(user));
+ }
+ }
+
+ QString msg = users.join("#:#").append("#:#").append(quitMessage);
+ emit displayMsg(Message::NetsplitJoin, BufferInfo::ChannelBuffer, channel, msg);
+ ircChannel->joinIrcUsers(ircUsers, newModes);
+}
+
+void IrcServerHandler::handleNetsplitQuit(const QString &channel, const QStringList &users, const QString& quitMessage)
+{
+ QString msg = users.join("#:#").append("#:#").append(quitMessage);
+ emit displayMsg(Message::NetsplitQuit, BufferInfo::ChannelBuffer, channel, msg);
+ foreach(QString user, users) {
+ IrcUser *iu = network()->ircUser(nickFromMask(user));
+ if(iu)
+ iu->quit();
+ }
+}
+
+void IrcServerHandler::handleEarlyNetsplitJoin(const QString &channel, const QStringList &users, const QStringList &modes) {
+ IrcChannel *ircChannel = network()->ircChannel(channel);
+ if(!ircChannel) {
+ qDebug() << "handleEarlyNetsplitJoin(): channel " << channel << " invalid";
+ return;
+ }
+ QList<IrcUser *> ircUsers;
+ QStringList newModes = modes;
+
+ foreach(QString user, users) {
+ IrcUser *iu = network()->updateNickFromMask(user);
+ if(iu) {
+ ircUsers.append(iu);
+ emit displayMsg(Message::Join, BufferInfo::ChannelBuffer, channel, channel, user);
+ }
+ else {
+ newModes.removeAt(users.indexOf(user));
+ }
+ }
+ ircChannel->joinIrcUsers(ircUsers, newModes);
+}
+void IrcServerHandler::handleNetsplitFinished()
+{
+ Netsplit* n = qobject_cast<Netsplit*>(sender());
+ _netsplits.remove(_netsplits.key(n));
+ n->deleteLater();
+}
+
+/* */
+
+// FIXME networkConnection()->setChannelKey("") for all ERR replies indicating that a JOIN went wrong
+// mostly, these are codes in the 47x range
+
+/* */
+
+void IrcServerHandler::tryNextNick(const QString &errnick, bool erroneus) {
+ QStringList desiredNicks = coreSession()->identity(network()->identity())->nicks();
+ int nextNickIdx = desiredNicks.indexOf(errnick) + 1;
+ QString nextNick;
+ if(nextNickIdx > 0 && desiredNicks.size() > nextNickIdx) {
+ nextNick = desiredNicks[nextNickIdx];
+ } else {
+ if(erroneus) {
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("No free and valid nicks in nicklist found. use: /nick <othernick> to continue"));
+ return;
+ } else {
+ nextNick = errnick + "_";
+ }
+ }
+ putCmd("NICK", serverEncode(nextNick));
+}
+
+bool IrcServerHandler::checkParamCount(const QString &methodName, const QList<QByteArray> ¶ms, int minParams) {
+ if(params.count() < minParams) {
+ qWarning() << qPrintable(methodName) << "requires" << minParams << "parameters but received only" << params.count() << serverDecode(params);
+ return false;