+
+/* Handle signals from Netsplit objects */
+
+void CoreSessionEventProcessor::handleNetsplitJoin(Network *net,
+ const QString &channel,
+ const QStringList &users,
+ const QStringList &modes,
+ const QString& quitMessage)
+{
+ IrcChannel *ircChannel = net->ircChannel(channel);
+ if(!ircChannel) {
+ return;
+ }
+ QList<IrcUser *> ircUsers;
+ QStringList newModes = modes;
+ QStringList newUsers = users;
+
+ foreach(const QString &user, users) {
+ IrcUser *iu = net->ircUser(nickFromMask(user));
+ if(iu)
+ ircUsers.append(iu);
+ else { // the user already quit
+ int idx = users.indexOf(user);
+ newUsers.removeAt(idx);
+ newModes.removeAt(idx);
+ }
+ }
+
+ ircChannel->joinIrcUsers(ircUsers, newModes);
+ NetworkSplitEvent *event = new NetworkSplitEvent(EventManager::NetworkSplitJoin, net, channel, newUsers, quitMessage);
+ coreSession()->eventManager()->sendEvent(event);
+}
+
+void CoreSessionEventProcessor::handleNetsplitQuit(Network *net, const QString &channel, const QStringList &users, const QString& quitMessage) {
+ NetworkSplitEvent *event = new NetworkSplitEvent(EventManager::NetworkSplitQuit, net, channel, users, quitMessage);
+ coreSession()->eventManager()->sendEvent(event);
+ foreach(QString user, users) {
+ IrcUser *iu = net->ircUser(nickFromMask(user));
+ if(iu)
+ iu->quit();
+ }
+}
+
+void CoreSessionEventProcessor::handleEarlyNetsplitJoin(Network *net, const QString &channel, const QStringList &users, const QStringList &modes) {
+ IrcChannel *ircChannel = net->ircChannel(channel);
+ if(!ircChannel) {
+ qDebug() << "handleEarlyNetsplitJoin(): channel " << channel << " invalid";
+ return;
+ }
+ QList<NetworkEvent *> events;
+ QList<IrcUser *> ircUsers;
+ QStringList newModes = modes;
+
+ foreach(QString user, users) {
+ IrcUser *iu = net->updateNickFromMask(user);
+ if(iu) {
+ ircUsers.append(iu);
+ // fake event for scripts that consume join events
+ events << new IrcEvent(EventManager::IrcEventJoin, net, iu->hostmask(), QStringList() << channel);
+ }
+ else {
+ newModes.removeAt(users.indexOf(user));
+ }
+ }
+ ircChannel->joinIrcUsers(ircUsers, newModes);
+ foreach(NetworkEvent *event, events) {
+ event->setFlag(EventManager::Fake); // ignore this in here!
+ coreSession()->eventManager()->sendEvent(event);
+ }
+}
+
+void CoreSessionEventProcessor::handleNetsplitFinished() {
+ Netsplit* n = qobject_cast<Netsplit*>(sender());
+ Q_ASSERT(n);
+ QHash<QString, Netsplit *> splithash = _netsplits.take(n->network());
+ splithash.remove(splithash.key(n));
+ if(splithash.count())
+ _netsplits[n->network()] = splithash;
+ n->deleteLater();
+}
+
+void CoreSessionEventProcessor::destroyNetsplits(NetworkId netId) {
+ Network *net = coreSession()->network(netId);
+ if(!net)
+ return;
+
+ QHash<QString, Netsplit *> splits = _netsplits.take(net);
+ qDeleteAll(splits);
+}