00001 #ifndef ERIS_ROOM_H
00002 #define ERIS_ROOM_H
00003
00004 #include <Eris/Types.h>
00005 #include <Eris/Router.h>
00006 #include <vector>
00007 #include <map>
00008
00009 #include <sigc++/trackable.h>
00010 #include <sigc++/signal.h>
00011
00012 namespace Eris
00013 {
00014
00015
00016 class Person;
00017 class Lobby;
00018
00023 class Room : public sigc::trackable, public Router
00024 {
00025 public:
00026 virtual ~Room();
00027
00029 void say(const std::string &tk);
00030
00033 void emote(const std::string &em);
00034
00037 void leave();
00038
00043 Room* createRoom(const std::string &name);
00044
00046 std::string getName() const
00047 {
00048 return m_name;
00049 }
00050
00051 std::string getTopic() const
00052 {
00053 return m_topic;
00054 }
00055
00057 std::vector<Person*> getPeople() const;
00058
00060 std::vector<Room*> getRooms() const
00061 {
00062 return m_subrooms;
00063 }
00064
00067 std::string getId() const
00068 {
00069 return m_roomId;
00070 }
00071
00072 Person* getPersonByUID(const std::string& uid);
00073
00074
00077 sigc::signal<void, Room*> Entered;
00078
00081 sigc::signal<void, Room*, Person*, const std::string&> Speech;
00082
00084 sigc::signal<void, Room*, Person*, const std::string&> Emote;
00085
00089 sigc::signal<void, Room*, Person*> Appearance;
00090
00092 sigc::signal<void, Room*, Person*> Disappearance;
00093
00094
00095 protected:
00096 friend class Lobby;
00097
00098 typedef std::map<std::string, Person*> IdPersonMap;
00099
00102 explicit Room(Lobby *l, const std::string& id);
00103
00104 virtual RouterResult handleOperation(const Atlas::Objects::Operation::RootOperation& op);
00105 void handleSoundTalk(Person* p, const std::string& speech);
00106 void handleEmote(Person* p, const std::string& desc);
00107
00108
00109 std::string m_roomId;
00110 private:
00112 void checkEntry();
00113
00114 void sight(const Atlas::Objects::Entity::RootEntity &room);
00115
00116 void appearance(const std::string& personId);
00117 void disappearance(const std::string& personId);
00118
00119
00120 void notifyPersonSight(Person *p);
00121
00122 std::string m_name;
00123 std::string m_topic;
00124 bool m_entered;
00125 Lobby* m_lobby;
00126
00127 IdPersonMap m_members;
00128
00129 std::vector<Room*> m_subrooms;
00130 };
00131
00132 }
00133
00134 #endif