changeset 13600:aa4e5bed1750

Automatically changing nick when logging in to server.
author Jacob Dawid <jacob.dawid@googlemail.com>
date Mon, 15 Aug 2011 03:20:55 +0200
parents e67616aca5a6
children 26956bb3c927
files gui/src/IRCWidget.cpp gui/src/IRCWidget.h gui/src/qirc/IRCClientImpl.cpp gui/src/qirc/IRCClientImpl.h gui/src/qirc/IRCClientInterface.h
diffstat 5 files changed, 48 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/gui/src/IRCWidget.cpp
+++ b/gui/src/IRCWidget.cpp
@@ -91,8 +91,11 @@
            this, SLOT (handleNickChange (QString,QString)));
   connect (m_ircClientInterface, SIGNAL (notification (QString,QString)),
            this, SLOT (showNotification (QString,QString)));
-  connect (m_ircClientInterface, SIGNAL (loggedIn(QString)),
+  connect (m_ircClientInterface, SIGNAL (loggedIn (QString)),
            this, SLOT (handleLoggedIn(QString)));
+  connect (m_ircClientInterface, SIGNAL (userNicknameChanged (QString)),
+           this, SLOT (handleUserNicknameChanged (QString)));
+
   connect (m_nickButton, SIGNAL (clicked ()), this, SLOT (nickPopup ()));
   connect (m_inputLine, SIGNAL (returnPressed ()), this,
 	   SLOT (sendInputLine ()));
@@ -268,10 +271,6 @@
   m_nickList.removeAll (QString (oldNick));
   m_nickList.append (QString (newNick));
   updateNickCompleter ();
-
-  //m_nickButton->setText (m_ircClient->nickInUse ());
-  //QSettings *settings = ResourceManager::instance ()->settings ();
-  //settings->setValue ("IRCNick", m_ircClient->nickInUse ());
 }
 
 void
@@ -293,6 +292,14 @@
 }
 
 void
+IRCWidget::handleUserNicknameChanged (const QString &nick)
+{
+  m_nickButton->setText (nick);
+  QSettings *settings = ResourceManager::instance ()->settings ();
+  settings->setValue ("IRCNick", nick);
+}
+
+void
 IRCWidget::updateNickCompleter ()
 {
   QCompleter *completer = new QCompleter (m_nickList, this);
--- a/gui/src/IRCWidget.h
+++ b/gui/src/IRCWidget.h
@@ -45,6 +45,7 @@
   void handleNickChange (const QString& oldNick, const QString& newNick);
   void handleUserJoined (const QString& nick, const QString& channel);
   void handleUserQuit (const QString& nick, const QString& reason);
+  void handleUserNicknameChanged (const QString& nick);
 
   void nickPopup ();
   void sendMessage (QString);
--- a/gui/src/qirc/IRCClientImpl.cpp
+++ b/gui/src/qirc/IRCClientImpl.cpp
@@ -176,6 +176,7 @@
 IRCClientImpl::IRCClientImpl (QObject *parent)
   : IRCClientInterface (parent)
 {
+  m_loggedIn = false;
   connect (&m_tcpSocket, SIGNAL (connected ()), this, SLOT (handleConnected ()));
   connect (&m_tcpSocket, SIGNAL (disconnected ()), this, SLOT (handleDisconnected ()));
   connect (&m_tcpSocket, SIGNAL (readyRead ()), this, SLOT (handleReadyRead ()));
@@ -216,6 +217,12 @@
   return m_connected;
 }
 
+bool
+IRCClientImpl::isLoggedIn ()
+{
+  return m_loggedIn;
+}
+
 const QHostAddress&
 IRCClientImpl::host()
 {
@@ -293,6 +300,12 @@
 void
 IRCClientImpl::handleNicknameChanged (const QString &oldNick, const QString &newNick)
 {
+  // Check if our nickname changed.
+  if (oldNick == m_nickname)
+    {
+      m_nickname = newNick;
+      emit userNicknameChanged (m_nickname);
+    }
   emit nicknameChanged (oldNick, newNick);
 }
 
@@ -311,7 +324,7 @@
 void
 IRCClientImpl::handleIncomingLine (const QString &line)
 {
-  //emit debugMessage (QString (">>>recv: \"%1\"").arg (line));
+  emit debugMessage (QString (">>>recv: \"%1\"").arg (line));
   if (m_connected && !line.isEmpty())
     {
       IRCServerMessage ircServerMessage(line);
@@ -320,11 +333,26 @@
           switch (ircServerMessage.numericValue ())
             {
               case IRCReply::Welcome:
+                m_loggedIn = true;
+                emit userNicknameChanged (nickname ());
                 emit loggedIn (nickname ());
                 break;
               case IRCError::NicknameInUse:
               case IRCError::NickCollision:
-                emit debugMessage ("FIXME: Received nickname in use reply.");
+                // If we are already logged in, the user attempted to
+                // switch to a username that is already existing.
+                // In that case warn him.
+                if (isLoggedIn ())
+                  {
+                    emit error ("The nickname is already in use.");
+                  }
+                // Otherwise we are attempting to log in to the server.
+                // Change the nick so that we can at least log in.
+                else
+                  {
+                    m_nickname += "_";
+                    sendNicknameChangeRequest (m_nickname);
+                  }
                 break;
               case IRCError::PasswordMismatch:
                 emit debugMessage ("FIXME: Received password mismatch reply.");
@@ -420,7 +448,7 @@
 void
 IRCClientImpl::sendLine (const QString &line)
 {
-  //emit debugMessage (QString (">>>send: \"%1\"").arg (line));
+  emit debugMessage (QString (">>>send: \"%1\"").arg (line));
   if (m_connected)
     m_tcpSocket.write ((line + "\r\n").toStdString ().c_str ());
 }
--- a/gui/src/qirc/IRCClientImpl.h
+++ b/gui/src/qirc/IRCClientImpl.h
@@ -283,6 +283,7 @@
 
   const QString& nickname ();
   bool isConnected ();
+  bool isLoggedIn ();
   const QHostAddress& host();
   int port();
   IRCChannelProxyInterface *ircChannelProxy(const QString& channel);
@@ -315,6 +316,7 @@
   int                                       m_port;
   QString                                   m_nickname;
   bool                                      m_connected;
+  bool                                      m_loggedIn;
   QTcpSocket                                m_tcpSocket;
   QMap<QString, IRCChannelProxyInterface*>  m_channels;
 };
--- a/gui/src/qirc/IRCClientInterface.h
+++ b/gui/src/qirc/IRCClientInterface.h
@@ -54,6 +54,7 @@
 
   virtual const QString& nickname () = 0;
   virtual bool isConnected () = 0;
+  virtual bool isLoggedIn () = 0;
   virtual const QHostAddress& host() = 0;
   virtual int port() = 0;
   virtual IRCChannelProxyInterface *ircChannelProxy(const QString& channel) = 0;
@@ -76,6 +77,7 @@
   void notification (const QString& sender, const QString& message);
   void message (const QString& channel, const QString& sender, const QString& message);
   void nicknameChanged (const QString& oldNick, const QString& newNick);
+  void userNicknameChanged (const QString& nick);
   void userJoined (const QString& nick, const QString& channel);
   void userQuit (const QString& nick, const QString& reason);
   void loggedIn (const QString& nick);