Lots of additions again. Working on implementing commands and prettifying the output.
[quassel.git] / network / server.h
index cc46899..c5a3daa 100644 (file)
 #define _SERVER_H_
 
 #include <QtCore>
+#include <QTimer>
 #include <QtNetwork>
 
-class Server {
+#include "global.h"
+#include "buffer.h"
+#include "message.h"
+
+#define DEFAULT_PORT 6667
+
+
+/*!
+ * This is a server object, managing a single connection to an IRC server, handling the associated channels and so on.
+ * We have this running in its own thread mainly to not block other server objects or the core if something goes wrong,
+ * e.g. if some scripts starts running wild...
+ */
+
+class Server : public QThread {
   Q_OBJECT
 
+  public:
+    Server(QString network);
+    ~Server();
+
+    // serverState state();
+    bool isConnected() { return socket.state() == QAbstractSocket::ConnectedState; }
+    QString getNetwork() { return network; }
+
+  public slots:
+    // void setServerOptions();
+    void connectToIrc(QString net);
+    void disconnectFromIrc(QString net);
+    void userInput(QString net, QString buffer, QString msg);
+
+    void putRawLine(QString input);
+    void putCmd(QString cmd, QStringList params, QString prefix = 0);
+
+    //void exitThread();
+
+  signals:
+    void recvRawServerMsg(QString);
+    void displayStatusMsg(QString);
+    void displayMsg(QString buffer, Message msg);
+    void disconnected();
+
+    void nickAdded(QString network, QString nick, VarMap props);
+    void nickRemoved(QString network, QString nick);
+    void nickUpdated(QString network, QString nick, VarMap props);
+    void modeSet(QString network, QString target, QString mode);
+    void topicSet(QString network, QString buffer, QString topic);
+    void setNicks(QString network, QString buffer, QStringList nicks);
+    void ownNickSet(QString network, QString newNick);
 
 
+  private slots:
+    void run();
+    void socketHasData();
+    void socketError(QAbstractSocket::SocketError);
+    void socketConnected();
+    void socketDisconnected();
+    void socketStateChanged(QAbstractSocket::SocketState);
+
+    /* Message Handlers */
+
+    /* handleUser(QString, Buffer *) */
+    void handleUserJoin(QString, Buffer *);
+    void handleUserQuote(QString, Buffer *);
+    void handleUserSay(QString, Buffer *);
+
+
+    /* handleServer(QString, QStringList); */
+    void handleServerJoin(QString, QStringList);
+    void handleServerNotice(QString, QStringList);
+    void handleServerPing(QString, QStringList);
+    void handleServerPrivmsg(QString, QStringList);
+
+    void handleServer001(QString, QStringList);   // RPL_WELCOME
+    void handleServer331(QString, QStringList);   // RPL_NOTOPIC
+    void handleServer332(QString, QStringList);   // RPL_TOPIC
+    void handleServer333(QString, QStringList);   // Topic set by...
+    void handleServer353(QString, QStringList);   // RPL_NAMREPLY
+
+    void defaultServerHandler(QString cmd, QString prefix, QStringList params);
+    void defaultUserHandler(QString cmd, QString msg, Buffer *buf);
+
   private:
+    QString network;
+    QTcpSocket socket;
+    QHash<QString, Buffer*> buffers;
 
-};
+    QString currentNick;
+    QString currentServer;
+    VarMap networkSettings;
+    VarMap identity;
+    VarMap nicks;  // stores all known nicks for the server
 
-class Connection : public QThread {
+    void handleServerMsg(QString rawMsg);
+    void handleUserMsg(QString buffer, QString usrMsg);
 
+    QString nickFromMask(QString mask);
+    QString userFromMask(QString mask);
+    QString hostFromMask(QString mask);
 
+    class ParseError : public Exception {
+      public:
+        ParseError(QString cmd, QString prefix, QStringList params);
+    };
 
+    class UnknownCmdError : public Exception {
+      public:
+        UnknownCmdError(QString cmd, QString prefix, QStringList params);
+    };
 };
 
-
 #endif