]> git.localhorst.tv Git - blank.git/blobdiff - src/shared/CLIContext.hpp
impersonate command
[blank.git] / src / shared / CLIContext.hpp
index 8de432b7788adb966e0a890e45111e868290b0ca..1556b8e164628130692cbd1e9d704052cd53311d 100644 (file)
@@ -7,15 +7,45 @@
 namespace blank {
 
 class Player;
+class Entity;
 
 class CLIContext {
 
 public:
-       explicit CLIContext(Player &p)
-       : player(p) { }
+       /// Create context with optional player and entity
+       /// entity defaults to the player's if given
+       /// Associated player or entity can be changed during
+       /// the context's lifetime and will assume the original
+       /// values when reset.
+       explicit CLIContext(Player *p = nullptr, Entity *e = nullptr);
 
+       /// get a best name for this context
+       std::string Name() const;
+
+       /// check if this context associates a player
+       bool HasPlayer() const noexcept { return effective_player; }
        /// get the player responsible for all this
-       Player &GetPlayer() { return player; }
+       /// only valid if HasPlayer() returns true
+       Player &GetPlayer() noexcept { return *effective_player; }
+       const Player &GetPlayer() const noexcept { return *effective_player; }
+       /// change the effective player of this context
+       /// note that this will *not* change the effective entity
+       void SetPlayer(Player &p) noexcept { effective_player = &p; }
+
+       /// check if this context associates an entity
+       bool HasEntity() const noexcept { return effective_entity; }
+       /// get the entity on which operations should be performed
+       /// only valid if HasPlayer() returns true
+       Entity &GetEntity() noexcept { return *effective_entity; }
+       const Entity &GetEntity() const noexcept { return *effective_entity; }
+       /// change the effective player of this context
+       void SetEntity(Entity &e) noexcept { effective_entity = &e; }
+
+       /// reset effective player and entity to their original values
+       void Reset() noexcept {
+               effective_player = original_player;
+               effective_player = original_player;
+       }
 
        /// an error has happened and the player should be notified
        virtual void Error(const std::string &) = 0;
@@ -29,7 +59,10 @@ public:
        virtual void Broadcast(const std::string &) = 0;
 
 private:
-       Player &player;
+       Player *original_player;
+       Player *effective_player;
+       Entity *original_entity;
+       Entity *effective_entity;
 
 };