// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #ifndef CL_PEOPLE_INTERRACTION_H #define CL_PEOPLE_INTERRACTION_H #include "people_list.h" #include "chat_filter.h" #include "nel/misc/smart_ptr.h" class CChatWindow; class CFilteredChatSummary; class CFilteredDynChatSummary; // *************************************************************************** #define TEAM_DB_PATH "SERVER:GROUP" // *************************************************************************** // max number of people in the team const uint MaxNumPeopleInTeam = 8; // max number of user chats const uint MaxNumUserChats = 5; // *************************************************************************** /** Infos about a party chat */ struct CPartyChatInfo { uint32 ID; CChatWindow *Window; NLMISC::CSmartPtr Filter; }; // *************************************************************************** // a chat filter and the associated window class CFilteredChat { public: CChatWindow *Window; CChatTargetFilter Filter; public: CFilteredChat() : Window(NULL) {} ~CFilteredChat() { if (Window) { nlwarning("window not released"); } } void release() { if (Window) { CChatWindowManager &cwm = getChatWndMgr(); cwm.removeChatWindow(Window); Window = NULL; } } }; // *************************************************************************** /** Standard inputs for the chat */ class CChatStdInput { public: CChatInputFilter AroundMe; CChatInputFilter Region; CChatInputFilter Team; CChatInputFilter Guild; CChatInputFilter SystemInfo; CChatInputFilter Universe; CChatInputFilter Tell; CChatInputFilter DebugInfo; // Dynamic Chat. A fixed number of chat that can be assign CChatInputFilter DynamicChat[CChatGroup::MaxDynChanPerPlayer]; public: void registerListeningWindow(CChatWindow *cw); CChatStdInput() { AroundMe.FilterType = CChatGroup::arround; Region.FilterType = CChatGroup::region; Team.FilterType = CChatGroup::team; Guild.FilterType = CChatGroup::guild; SystemInfo.FilterType = CChatGroup::system; Tell.FilterType = CChatGroup::tell; Universe.FilterType = CChatGroup::universe; for(uint i=0;i PartyChats; uint32 CurrPartyChatID; // CChatStdInput ChatInput; // //CFilteredChat MainChat; CFilteredChat ChatGroup; CFilteredChat AroundMe; CFilteredChat DebugConsole; // additionnal user chats CFilteredChat UserChat[MaxNumUserChats]; CFilteredChat TheUserChat; // Id of last people who talked ucstring LastSenderName; // system message struct CSysMsg { ucstring Str; std::string Cat; }; // system message buffer std::vector SystemMessageBuffer; public: // ctor CPeopleInterraction(); // void init(); // init the people lists, create basic chats // void initAfterLoad(); // must call after load time to reset prompt color, default channel etc... // void release(); // removes every people list & chat windows // /** from a group container ID, returns a pointer on the people list and a people index * \return false is the id was invalid */ bool getPeopleFromContainerID(const std::string &id, CPeopleList *&peopleList, uint &index); /** Get the people list & index that triggered the current menu. */ bool getPeopleFromCurrentMenu(CPeopleList *&peopleList, uint &index); /** Get the people list that triggered the current menu */ CPeopleList *getPeopleListFromCurrentMenu(); /** Get a people list from its container id */ CPeopleList *getPeopleListFromContainerID(const std::string &id); /** From a window, get the associated filtered chat (or NULL if none) */ CFilteredChat *getFilteredChatFromChatWindow(CChatWindow *cw); bool testValidPartyChatName(const ucstring &name); bool removePartyChat(CChatWindow *window); void removeAllPartyChat(); /** * create a named party chat. */ bool createNewPartyChat(const ucstring &title); static void assignPartyChatMenu(CChatWindow *partyChat); /// \name CONTACT LIST // @{ // ask the server to add/move/remove a contact void askAddContact(const ucstring &contactName, CPeopleList *pl); void askMoveContact(uint peopleIndexInSrc, CPeopleList *plSRC, CPeopleList *plDST); void askRemoveContact(uint peopleIndex, CPeopleList *pl); // init contact list (from server typically) void initContactLists( const std::vector &vFriendListName, const std::vector &vFriendListOnline, const std::vector &vIgnoreListName ); // Friend list == 0 // Ignore list == 1 void addContactInList(uint32 contactId, uint32 nameID, TCharConnectionState Online, uint8 nList); void addContactInList(uint32 contactId, const ucstring &name, TCharConnectionState Online, uint8 nList); bool isContactInList(const ucstring &name, uint8 nList) const; // Called each frame to receive name from IOS void updateWaitingContacts(); // server decide to remove a contact (if it does not exists anymore) void removeContactFromList(uint32 contactId, uint8 nList); // server update the online status void updateContactInList(uint32 contactId, TCharConnectionState online, uint nList); // @} // save info about user chats bool saveUserChatsInfos(NLMISC::IStream &f); // restore infos about user chats bool loadUserChatsInfos(NLMISC::IStream &f); // save info about user dyn chats bool saveUserDynChatsInfos(NLMISC::IStream &f); // restore info about user dyn chats bool loadUserDynChatsInfos(NLMISC::IStream &f); // remove all the user chats void removeAllUserChats(); // refrech the 'active' state of user chats : useful when a virtual desktop change occurs void refreshActiveUserChats(); // Create a user chat at the given index. The target user chat must be empty void createUserChat(uint index); // Test if the given chat is a user chat (this includes the main chat) bool isUserChat(CChatWindow *cw) const; void talkInDynamicChannel(uint32 channelNb,ucstring sentence); CChatGroupWindow *getChatGroupWindow() const; void updateAllFreeTellerHeaders(); void removeAllFreeTellers(); static void displayTellInMainChat(const ucstring &playerName); private: // create various chat & people lists void createTeamChat(); void createTeamList(); void createFriendList(); void createIgnoreList(); // void createSystemInfo(); void createAroundMeWindow(); void createRegionWindow(); void createUniverseWindow(); void createTellWindow(); void createGuildChat(); void createDebugInfo(); void createChatGroup(); // Create chat group containing all other chat void createTheUserChat(); void createDynamicChats(); // void initStdInputs(); // // build summary about a filtered chat void buildFilteredChatSummary(const CFilteredChat &src, CFilteredChatSummary &dest); void buildFilteredDynChatSummary(const CFilteredChat &src, CFilteredDynChatSummary &dest); void saveFilteredChat(NLMISC::IStream &f, const CFilteredChat &src); void saveFilteredDynChat(NLMISC::IStream &f, const CFilteredChat &src); // setup a user chat from its summary void setupUserChatFromSummary(const CFilteredChatSummary &summary, CFilteredChat &dest); void setupUserDynChatFromSummary(const CFilteredDynChatSummary &summary, CFilteredChat &dest); private: // Contact waiting their name (received by string_manager) to be added struct SWaitingContact { uint32 ContactId; uint32 NameId; uint8 List; TCharConnectionState Online; }; std::vector WaitingContacts; }; // instance of class that manage people lists extern CPeopleInterraction PeopleInterraction; #endif