added missing sql queries... OOPS
[quassel.git] / src / core / ctcphandler.cpp
index db3dcd4..1e5254d 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-07 by the Quassel IRC Team                         *
+ *   Copyright (C) 2005-08 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  ***************************************************************************/
 #include "ctcphandler.h"
 
+#include "global.h"
 #include "util.h"
 #include "message.h"
+#include "network.h"
 
-CtcpHandler::CtcpHandler(Server *parent)
+CtcpHandler::CtcpHandler(NetworkConnection *parent)
   : BasicHandler(parent) {
 
   QString MQUOTE = QString('\020');
@@ -48,7 +50,7 @@ QString CtcpHandler::dequote(QString message) {
     if(i+1 < message.size()) {
       for(ctcpquote = ctcpMDequoteHash.begin(); ctcpquote != ctcpMDequoteHash.end(); ++ctcpquote) {
         if(message.mid(i,2) == ctcpquote.key()) {
-          dequotedMessage += ctcpquote.value();
+          messagepart = ctcpquote.value();
           i++;
           break;
         }
@@ -81,16 +83,23 @@ QString CtcpHandler::XdelimDequote(QString message) {
   return dequotedMessage;
 }
 
-QStringList CtcpHandler::parse(CtcpType ctcptype, QString prefix, QString target, QString message) {
-  QStringList messages;
+void CtcpHandler::parse(Message::Type messageType, QString prefix, QString target, QString message) {
   QString ctcp;
   
   //lowlevel message dequote
   QString dequotedMessage = dequote(message);
-  
+
+  CtcpType ctcptype = (messageType == Message::Notice)
+    ? CtcpReply
+    : CtcpQuery;
+
+  BufferInfo::Type bufferType = typeByTarget(target);
+     
   // extract tagged / extended data
   while(dequotedMessage.contains(XDELIM)) {
-    messages << dequotedMessage.section(XDELIM,0,0);
+    if(dequotedMessage.indexOf(XDELIM) > 0)
+      emit displayMsg(messageType, bufferType, target, dequotedMessage.section(XDELIM,0,0), prefix);
+    // messages << dequotedMessage.section(XDELIM,0,0), prefix);
     ctcp = XdelimDequote(dequotedMessage.section(XDELIM,1,1));
     dequotedMessage = dequotedMessage.section(XDELIM,2,2);
     
@@ -100,56 +109,68 @@ QStringList CtcpHandler::parse(CtcpType ctcptype, QString prefix, QString target
 
     handle(ctcpcmd, Q_ARG(CtcpType, ctcptype), Q_ARG(QString, prefix), Q_ARG(QString, target), Q_ARG(QString, ctcpparam));
   }
-  if(!dequotedMessage.isEmpty()) {
-    messages << dequotedMessage;
-  }
-  return messages;
+  
+  if(!dequotedMessage.isEmpty())
+    emit displayMsg(messageType, bufferType, target, dequotedMessage, prefix);
+
 }
 
 QString CtcpHandler::pack(QString ctcpTag, QString message) {
   return XDELIM + ctcpTag + ' ' + message + XDELIM;
 }
 
+// TODO handle encodings correctly!
 void CtcpHandler::query(QString bufname, QString ctcpTag, QString message) {
   QStringList params;
   params << bufname << pack(ctcpTag, message);
-  emit putCmd("PRIVMSG", params); 
+  emit putCmd("PRIVMSG", serverEncode(params));
 }
 
 void CtcpHandler::reply(QString bufname, QString ctcpTag, QString message) {
   QStringList params;
   params << bufname << pack(ctcpTag, message);
-  emit putCmd("NOTICE", params);
+  emit putCmd("NOTICE", serverEncode(params));
 }
 
 //******************************/
 // CTCP HANDLER
 //******************************/
 void CtcpHandler::handleAction(CtcpType ctcptype, QString prefix, QString target, QString param) {
-  emit displayMsg(Message::Action, target, param, prefix);
+  Q_UNUSED(ctcptype)
+  emit displayMsg(Message::Action, typeByTarget(target), target, param, prefix);
 }
 
 void CtcpHandler::handlePing(CtcpType ctcptype, QString prefix, QString target, QString param) {
+  Q_UNUSED(target)
   if(ctcptype == CtcpQuery) {
     reply(nickFromMask(prefix), "PING", param);
-    emit displayMsg(Message::Server, "", tr("Received CTCP PING request from %1").arg(prefix));
+    emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Received CTCP PING request from %1").arg(prefix));
   } else {
     // display ping answer
+    uint now = QDateTime::currentDateTime().toTime_t();
+    uint then = QDateTime().fromTime_t(param.toInt()).toTime_t();
+    emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Received CTCP PING answer from %1 with %2 seconds round trip time").arg(prefix).arg(now-then));
   }
 }
 
 void CtcpHandler::handleVersion(CtcpType ctcptype, QString prefix, QString target, QString param) {
+  Q_UNUSED(target)
   if(ctcptype == CtcpQuery) {
     // FIXME use real Info about quassel :)
-    reply(nickFromMask(prefix), "VERSION", QString("Quassel IRC (Pre-Release) - http://www.quassel-irc.org"));
-    emit displayMsg(Message::Server, "", tr("Received CTCP VERSION request by %1").arg(prefix));
+    reply(nickFromMask(prefix), "VERSION", QString("Quassel IRC (v%1 build >= %2) -- http://www.quassel-irc.org")
+        .arg(Global::quasselVersion).arg(Global::quasselBuild));
+    emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Received CTCP VERSION request by %1").arg(prefix));
   } else {
-    // TODO display Version answer
+    // display Version answer
+    emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Received CTCP VERSION answer from %1: %2").arg(prefix).arg(param));
   }
 }
 
 void CtcpHandler::defaultHandler(QString cmd, CtcpType ctcptype, QString prefix, QString target, QString param) {
-  emit displayMsg(Message::Error, "", tr("Received unknown CTCP %1 by %2").arg(cmd).arg(prefix));
+  Q_UNUSED(ctcptype);
+  Q_UNUSED(target);
+  Q_UNUSED(param);
+  emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Received unknown CTCP %1 by %2").arg(cmd).arg(prefix));
 }