summaryrefslogtreecommitdiff
path: root/src/client.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/client.h')
-rw-r--r--src/client.h132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/client.h b/src/client.h
new file mode 100644
index 0000000..e6cfcc7
--- /dev/null
+++ b/src/client.h
@@ -0,0 +1,132 @@
+#ifndef CLIENT_H
+#define CLIENT_H
+
+#include <string>
+#include <map>
+#include <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
+#include <boost/function.hpp>
+#include <boost/asio.hpp>
+
+#include "connection.h"
+
+//! Abstract client base class.
+class ClientBase {
+ public:
+ typedef boost::shared_ptr<ClientBase> p;
+
+ virtual ~ClientBase() {}
+
+ //! Return client's nick.
+ virtual std::string nick() = 0;
+
+ //! Notify client of a game start.
+ virtual void game_start(boost::function<void ()> callback, std::vector<std::string> players) = 0;
+
+ //! Notify client of a round start.
+ virtual void round_start() = 0;
+
+ //! Send round state.
+ virtual void round_state(const PlayerState& pl_d, const PlayerState& pl_r, const PlayerState& pl_u, const PlayerState& pl_l, const GameState& g, const Actions& a) = 0;
+
+ //! Send round end.
+ virtual void round_end(Message::RoundEnd::p msg, boost::function<void ()> callback) = 0;
+
+ //! Get action. Upon connection error, last element of expected_actions will be provided.
+ virtual void get_action(boost::function<void (Action)> callback, Actions expected_actions) = 0;
+
+ virtual void game_end(Message::GameEnd::p msg, boost::function<void ()> callback) = 0;
+
+};
+
+//! Class implementing ClientBase for real clients.
+class Client : public ClientBase, public boost::enable_shared_from_this<Client> {
+ public:
+ typedef boost::shared_ptr<Client> p;
+
+ //! Construct and return a new Client instance.
+ static p create(Connection::p c, std::string n);
+
+ //! Check if a Client instance of the user already exists and return it.
+ static p exists(Message::Login::p login_msg);
+
+ ~Client();
+
+ private:
+ uint64_t cookie;
+
+ static std::map<uint64_t, boost::weak_ptr<Client> > client_list;
+
+ Connection::p connection;
+
+ boost::asio::deadline_timer timer;
+
+ std::string nick_;
+
+ Client(Connection::p c, std::string n);
+
+ //! Start communicating.
+ void start();
+
+ //! Handle Login-message.
+ void handle_login(Message::p msg, boost::function<void (Client::p)> login_callback);
+
+ //! Handle LobbyAction-message.
+ void handle_lobby(Message::p msg, boost::function<void (int)> lobby_callback);
+
+ //! Handle Ready-message.
+ void handle_ready(Message::p msg, boost::function<void ()> ready_callback);
+
+ //! Handle Action-message.
+ void handle_action(Message::p msg, boost::function<void (Action)> action_callback, Actions expected_actions);
+
+ public:
+ //! Inform client of lobby status (available game modes).
+ void lobby_status(const std::vector<std::string>& game_modes, boost::function<void (int)> callback);
+
+ //! Return client's nick.
+ virtual std::string nick();
+
+ //! Notify client of a game start.
+ virtual void game_start(boost::function<void ()> callback, std::vector<std::string> players);
+
+ //! Notify client of a round start.
+ virtual void round_start();
+
+ //! Send round state.
+ virtual void round_state(const PlayerState& pl_d, const PlayerState& pl_r, const PlayerState& pl_u, const PlayerState& pl_l, const GameState& g, const Actions& a);
+
+ //! Send round end.
+ virtual void round_end(Message::RoundEnd::p msg, boost::function<void ()> callback);
+
+ //! Get action. Upon connection error, last element of expected_actions will be provided.
+ virtual void get_action(boost::function<void (Action)> callback, Actions expected_actions);
+
+ //! Reconnect a player.
+ virtual void reconnect(Connection::p c);
+
+ virtual void game_end(Message::GameEnd::p msg, boost::function<void ()> callback);
+};
+
+typedef std::vector<Client> Clients;
+
+class ClientDumb : public ClientBase {
+ public:
+ virtual unsigned int id();
+
+ virtual std::string nick();
+
+ virtual void game_start(boost::function<void ()> callback, std::vector<std::string> players);
+
+ virtual void round_start();
+
+ virtual void round_state(const PlayerState& pl_d, const PlayerState& pl_r, const PlayerState& pl_u, const PlayerState& pl_l, const GameState& g, const Actions& a);
+
+ virtual void round_end(Message::RoundEnd::p msg, boost::function<void ()> callback);
+
+ virtual void get_action(boost::function<void (Action)> callback, Actions expected_actions);
+
+ virtual void game_end(Message::GameEnd::p msg, boost::function<void ()> callback);
+};
+
+#endif