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