Event backend porting
[quassel.git] / src / core / coresessioneventprocessor.cpp
index 8599524..e3eca41 100644 (file)
@@ -57,3 +57,143 @@ void CoreSessionEventProcessor::processIrcEventNumeric(IrcEventNumeric *e) {
     break;
   }
 }
+
+void CoreSessionEventProcessor::processIrcEventAuthenticate(IrcEvent *e) {
+  if(!checkParamCount(e, 1))
+    return;
+
+  if(e->params().at(0) != "+") {
+    qWarning() << "Invalid AUTHENTICATE" << e;
+    return;
+  }
+
+  CoreNetwork *net = coreNetwork(e);
+
+  QString construct = net->saslAccount();
+  construct.append(QChar(QChar::Null));
+  construct.append(net->saslAccount());
+  construct.append(QChar(QChar::Null));
+  construct.append(net->saslPassword());
+  QByteArray saslData = QByteArray(construct.toAscii().toBase64());
+  saslData.prepend("AUTHENTICATE ");
+  net->putRawLine(saslData);
+}
+
+void CoreSessionEventProcessor::processIrcEventCap(IrcEvent *e) {
+  // for SASL, there will only be a single param of 'sasl', however you can check here for
+  // additional CAP messages (ls, multi-prefix, et cetera).
+
+  if(e->params().count() == 3) {
+    if(e->params().at(2) == "sasl") {
+      // FIXME use event
+      coreNetwork(e)->putRawLine(coreNetwork(e)->serverEncode("AUTHENTICATE PLAIN")); // Only working with PLAIN atm, blowfish later
+    }
+  }
+}
+
+void CoreSessionEventProcessor::processIrcEventInvite(IrcEvent *e) {
+  if(checkParamCount(e, 2)) {
+    e->network()->updateNickFromMask(e->prefix());
+  }
+}
+
+void CoreSessionEventProcessor::processIrcEventKick(IrcEvent *e) {
+  if(checkParamCount(e, 2)) {
+    e->network()->updateNickFromMask(e->prefix());
+    IrcUser *victim = e->network()->ircUser(e->params().at(1));
+    if(victim) {
+      victim->partChannel(e->params().at(0));
+      //if(e->network()->isMe(victim)) e->network()->setKickedFromChannel(channel);
+    }
+  }
+}
+
+void CoreSessionEventProcessor::processIrcEventNick(IrcEvent *e) {
+  if(checkParamCount(e, 1)) {
+    IrcUser *ircuser = e->network()->updateNickFromMask(e->prefix());
+    if(!ircuser) {
+      qWarning() << Q_FUNC_INFO << "Unknown IrcUser!";
+      return;
+    }
+    QString newnick = e->params().at(0);
+    QString oldnick = ircuser->nick();
+
+    // the order is cruicial
+    // otherwise the client would rename the buffer, see that the assigned ircuser doesn't match anymore
+    // and remove the ircuser from the querybuffer leading to a wrong on/offline state
+    ircuser->setNick(newnick);
+    coreSession()->renameBuffer(e->networkId(), newnick, oldnick);
+  }
+}
+
+void CoreSessionEventProcessor::processIrcEventPart(IrcEvent *e) {
+  if(checkParamCount(e, 1)) {
+    IrcUser *ircuser = e->network()->updateNickFromMask(e->prefix());
+    if(!ircuser) {
+      qWarning() << Q_FUNC_INFO<< "Unknown IrcUser!";
+      return;
+    }
+    QString channel = e->params().at(0);
+    ircuser->partChannel(channel);
+    if(e->network()->isMe(ircuser))
+      qobject_cast<CoreNetwork *>(e->network())->setChannelParted(channel);
+  }
+}
+
+void CoreSessionEventProcessor::processIrcEventPong(IrcEvent *e) {
+  // the server is supposed to send back what we passed as param. and we send a timestamp
+  // but using quote and whatnought one can send arbitrary pings, so we have to do some sanity checks
+  if(checkParamCount(e, 2)) {
+    QString timestamp = e->params().at(1);
+    QTime sendTime = QTime::fromString(timestamp, "hh:mm:ss.zzz");
+    if(sendTime.isValid())
+      e->network()->setLatency(sendTime.msecsTo(QTime::currentTime()) / 2);
+  }
+}
+
+void CoreSessionEventProcessor::processIrcEventTopic(IrcEvent *e) {
+  if(checkParamCount(e, 2)) {
+    e->network()->updateNickFromMask(e->prefix());
+    IrcChannel *channel = e->network()->ircChannel(e->params().at(0));
+    if(channel)
+      channel->setTopic(e->params().at(1));
+  }
+}
+
+/* RPL_WELCOME */
+void CoreSessionEventProcessor::processIrcEvent001(IrcEvent *e) {
+  if(!checkParamCount(e, 1))
+    return;
+
+  QString myhostmask = e->params().at(0).section(' ', -1, -1);
+  e->network()->setCurrentServer(e->prefix());
+  e->network()->setMyNick(nickFromMask(myhostmask));
+}
+
+/* RPL_UMODEIS - "<user_modes> [<user_mode_params>]" */
+void CoreSessionEventProcessor::processIrcEvent221(IrcEvent *) {
+  // TODO: save information in network object
+}
+
+/* RPL_STATSCONN - "Highest connection cout: 8000 (7999 clients)" */
+void CoreSessionEventProcessor::processIrcEvent250(IrcEvent *) {
+  // TODO: save information in network object
+}
+
+/* RPL_LOCALUSERS - "Current local user: 5024  Max: 7999 */
+void CoreSessionEventProcessor::processIrcEvent265(IrcEvent *) {
+  // TODO: save information in network object
+}
+
+/* RPL_GLOBALUSERS - "Current global users: 46093  Max: 47650" */
+void CoreSessionEventProcessor::processIrcEvent266(IrcEvent *) {
+  // TODO: save information in network object
+}
+
+/* template
+void CoreSessionEventProcessor::processIrcEvent(IrcEvent *e) {
+  if(!checkParamCount(e, 1))
+    return;
+
+}
+*/