Core now remembers the channels you've joined if a disconnect happens, so you'll...
[quassel.git] / src / core / userinputhandler.cpp
index a431f3d..0856134 100644 (file)
@@ -63,7 +63,7 @@ void UserInputHandler::handleBan(const BufferInfo &bufferInfo, const QString &ms
   
   //TODO: find suitable default hostmask if msg gives only nickname 
   // Example: MODE &oulu +b *!*@*
-  QByteArray banMsg = serverEncode(bufferInfo.bufferName()) + " +b " + bufferEncode(bufferInfo.bufferName(), msg);
+  QByteArray banMsg = serverEncode(bufferInfo.bufferName()) + " +b " + channelEncode(bufferInfo.bufferName(), msg);
   emit putCmd("MODE", banMsg);
 }
 
@@ -107,18 +107,27 @@ void UserInputHandler::handleInvite(const BufferInfo &bufferInfo, const QString
 }
 
 void UserInputHandler::handleJ(const BufferInfo &bufferInfo, const QString &msg) {
-  Q_UNUSED(bufferInfo)
-  QStringList params = msg.split(" ");
-  if(params.size() > 0 && !params[0].startsWith("#")) {
-    params[0] = QString("#%1").arg(params[0]);
-  }
-  emit putCmd("JOIN", serverEncode(params));
+  QString trimmed = msg.trimmed();
+  if(trimmed.length() == 0) return;
+  if(trimmed[0].isLetter()) trimmed.prepend("#");
+  handleJoin(bufferInfo, trimmed);
 }
 
 void UserInputHandler::handleJoin(const BufferInfo &bufferInfo, const QString &msg) {
   Q_UNUSED(bufferInfo)
-  QStringList params = msg.split(" ");
-  emit putCmd("JOIN", serverEncode(params));
+  QStringList params = msg.trimmed().split(" ");
+  QStringList chans = params[0].split(",");
+  QStringList keys;
+  if(params.count() > 1) keys = params[1].split(",");
+  emit putCmd("JOIN", serverEncode(params)); // FIXME handle messages longer than 512 bytes!
+  int i = 0;
+  for(; i < keys.count(); i++) {
+    if(i >= chans.count()) break;
+    networkConnection()->addChannelKey(chans[i], keys[i]);
+  }
+  for(; i < chans.count(); i++) {
+    networkConnection()->removeChannelKey(chans[i]);
+  }
 }
 
 void UserInputHandler::handleKick(const BufferInfo &bufferInfo, const QString &msg) {
@@ -126,7 +135,7 @@ void UserInputHandler::handleKick(const BufferInfo &bufferInfo, const QString &m
   QString reason = msg.section(' ', 1, -1, QString::SectionSkipEmpty).trimmed();
   if(reason.isEmpty()) reason = networkConnection()->identity()->kickReason();
   QList<QByteArray> params;
-  params << serverEncode(bufferInfo.bufferName()) << serverEncode(nick) << bufferEncode(bufferInfo.bufferName(), reason);
+  params << serverEncode(bufferInfo.bufferName()) << serverEncode(nick) << channelEncode(bufferInfo.bufferName(), reason);
   emit putCmd("KICK", params);
 }
 
@@ -138,13 +147,13 @@ void UserInputHandler::handleList(const BufferInfo &bufferInfo, const QString &m
 
 void UserInputHandler::handleMe(const BufferInfo &bufferInfo, const QString &msg) {
   if(bufferInfo.bufferName().isEmpty()) return; // server buffer
-  networkConnection()->ctcpHandler()->query(bufferInfo.bufferName(), "ACTION", bufferEncode(bufferInfo.bufferName(), msg));
+  networkConnection()->ctcpHandler()->query(bufferInfo.bufferName(), "ACTION", channelEncode(bufferInfo.bufferName(), msg));
   emit displayMsg(Message::Action, bufferInfo.type(), bufferInfo.bufferName(), msg, network()->myNick());
 }
 
 void UserInputHandler::handleMode(const BufferInfo &bufferInfo, const QString &msg) {
   Q_UNUSED(bufferInfo)
-  // TODO handle correct encoding for buffer modes (bufferEncode())
+  // TODO handle correct encoding for buffer modes (channelEncode())
   emit putCmd("MODE", serverEncode(msg.split(' ', QString::SkipEmptyParts)));
 }
 
@@ -177,7 +186,7 @@ void UserInputHandler::handleOp(const BufferInfo &bufferInfo, const QString &msg
 
 void UserInputHandler::handlePart(const BufferInfo &bufferInfo, const QString &msg) {
   QList<QByteArray> params;
-  params << serverEncode(bufferInfo.bufferName()) << bufferEncode(bufferInfo.bufferName(), msg);
+  params << serverEncode(bufferInfo.bufferName()) << channelEncode(bufferInfo.bufferName(), msg);
   emit putCmd("PART", params);
 }
 
@@ -206,7 +215,7 @@ void UserInputHandler::handleQuote(const BufferInfo &bufferInfo, const QString &
 void UserInputHandler::handleSay(const BufferInfo &bufferInfo, const QString &msg) {
   if(bufferInfo.bufferName().isEmpty()) return;  // server buffer
   QList<QByteArray> params;
-  params << serverEncode(bufferInfo.bufferName()) << bufferEncode(bufferInfo.bufferName(), msg);
+  params << serverEncode(bufferInfo.bufferName()) << channelEncode(bufferInfo.bufferName(), msg);
   emit putCmd("PRIVMSG", params);
   emit displayMsg(Message::Plain, bufferInfo.type(), bufferInfo.bufferName(), msg, network()->myNick(), Message::Self);
 }
@@ -214,7 +223,7 @@ void UserInputHandler::handleSay(const BufferInfo &bufferInfo, const QString &ms
 void UserInputHandler::handleTopic(const BufferInfo &bufferInfo, const QString &msg) {
   if(bufferInfo.bufferName().isEmpty()) return;
   QList<QByteArray> params;
-  params << serverEncode(bufferInfo.bufferName()) << bufferEncode(bufferInfo.bufferName(), msg);
+  params << serverEncode(bufferInfo.bufferName()) << channelEncode(bufferInfo.bufferName(), msg);
   emit putCmd("TOPIC", params);
 }