From bd44e8d0a94dd96e6f8eb0828b4f2b5de902ee83 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 5 Apr 2015 20:22:00 +0300 Subject: add chat command for join chat room. New chat command: /joinroom NAME --- src/CMakeLists.txt | 1 + src/Makefile.am | 1 + src/actions/commands.cpp | 17 +++++++++++ src/actions/commands.h | 1 + src/input/inputaction.h | 1 + src/input/inputactionmap.h | 5 +++ src/net/eathena/chathandler.cpp | 25 +++++++++++++-- src/resources/chatobject.cpp | 68 +++++++++++++++++++++++++++++++++++++++++ src/resources/chatobject.h | 21 +++++++------ 9 files changed, 128 insertions(+), 12 deletions(-) create mode 100644 src/resources/chatobject.cpp (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 13d3e70aa..68edd4ded 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -588,6 +588,7 @@ SET(SRCS resources/beinginfo.cpp resources/beinginfo.h resources/beingmenuitem.h + resources/chatobject.cpp resources/chatobject.h resources/db/chardb.cpp resources/db/chardb.h diff --git a/src/Makefile.am b/src/Makefile.am index 7e3efddf2..be74b9256 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -722,6 +722,7 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \ resources/beinginfo.cpp \ resources/beinginfo.h \ resources/beingmenuitem.h \ + resources/chatobject.cpp \ resources/chatobject.h \ resources/db/chardb.cpp \ resources/db/chardb.h \ diff --git a/src/actions/commands.cpp b/src/actions/commands.cpp index 76d94886c..18206b9a3 100644 --- a/src/actions/commands.cpp +++ b/src/actions/commands.cpp @@ -55,6 +55,7 @@ #include "net/serverfeatures.h" #include "resources/iteminfo.h" +#include "resources/chatobject.h" #include "utils/chatutils.h" #include "utils/gettext.h" @@ -881,4 +882,20 @@ impHandler(createPublicChatRoom) #endif } +impHandler(joinChatRoom) +{ +#ifdef EATHENA_SUPPORT + const std::string args = event.args; + if (args.empty()) + return false; + ChatObject *const chat = ChatObject::findByName(args); + if (!chat) + return false; + chatHandler->joinChat(chat, ""); + return true; +#else + return false; +#endif +} + } // namespace Actions diff --git a/src/actions/commands.h b/src/actions/commands.h index f5fa4344b..ef02a70eb 100644 --- a/src/actions/commands.h +++ b/src/actions/commands.h @@ -83,6 +83,7 @@ namespace Actions decHandler(homunEmote); decHandler(commandHomunEmote); decHandler(createPublicChatRoom); + decHandler(joinChatRoom); } // namespace Actions #undef decHandler diff --git a/src/input/inputaction.h b/src/input/inputaction.h index 438075dcf..dba7a2a91 100644 --- a/src/input/inputaction.h +++ b/src/input/inputaction.h @@ -592,6 +592,7 @@ namespace InputAction KICK_GUILD, HAT, CREATE_PUBLIC_ROOM, + JOIN_ROOM, TOTAL }; } // namespace InputAction diff --git a/src/input/inputactionmap.h b/src/input/inputactionmap.h index 78e23d819..f923e2000 100644 --- a/src/input/inputactionmap.h +++ b/src/input/inputactionmap.h @@ -4441,6 +4441,11 @@ static const InputActionData inputActionData[InputAction::TOTAL] = { InputCondition::INGAME, "createroom|createpublicroom", true}, + {"keyJoinRoom", + defaultAction(&Actions::joinChatRoom), + InputCondition::INGAME, + "joinroom", + true}, }; #undef defaultAction diff --git a/src/net/eathena/chathandler.cpp b/src/net/eathena/chathandler.cpp index eb7dfe375..77e87df71 100644 --- a/src/net/eathena/chathandler.cpp +++ b/src/net/eathena/chathandler.cpp @@ -661,6 +661,7 @@ void ChatHandler::processChatDisplay(Net::MessageIn &msg) obj->currentUsers = msg.readInt16("current users"); obj->type = msg.readUInt8("type"); obj->title = msg.readString(len, "title"); + obj->update(); Being *const dstBeing = actorManager->findBeing(obj->ownerId); if (dstBeing) @@ -680,14 +681,31 @@ void ChatHandler::joinChat(const ChatObject *const chat, void ChatHandler::processChatRoomJoinAck(Net::MessageIn &msg) { - UNIMPLIMENTEDPACKET; - const int count = msg.readInt16("len") - 8; - msg.readInt32("chat id"); + const int count = (msg.readInt16("len") - 8) / 28; + const int id = msg.readInt32("chat id"); + + // +++ ignore chat members for now for (int f = 0; f < count; f ++) { msg.readInt32("role"); msg.readString(24, "name"); } + + ChatObject *oldChat = ChatObject::findById(id); + if (!oldChat) + oldChat = new ChatObject; + + PlayerInfo::setRoomName(oldChat->title); + chatWindow->joinRoom(true); + ChatObject *const obj = new ChatObject; + obj->ownerId = oldChat->ownerId; + obj->chatId = oldChat->chatId; + obj->maxUsers = oldChat->maxUsers; + obj->currentUsers = oldChat->currentUsers; + obj->type = oldChat->type; + obj->title = oldChat->title; + obj->update(); + localPlayer->setChat(obj); } void ChatHandler::processChatRoomLeave(Net::MessageIn &msg) @@ -863,6 +881,7 @@ void ChatHandler::processChatRoomCreateAck(Net::MessageIn &msg) obj->currentUsers = 1; obj->type = 1; obj->title = mChatRoom; + obj->update(); localPlayer->setChat(obj); break; } diff --git a/src/resources/chatobject.cpp b/src/resources/chatobject.cpp new file mode 100644 index 000000000..fa2663614 --- /dev/null +++ b/src/resources/chatobject.cpp @@ -0,0 +1,68 @@ +/* + * The ManaPlus Client + * Copyright (C) 2012-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "resources/chatobject.h" + +std::map ChatObject::chatNameMap; +std::map ChatObject::chatIdMap; + +ChatObject::ChatObject() : + ownerId(0), + chatId(0), + maxUsers(0), + currentUsers(0), + type(0), + title() +{ +} + +ChatObject::~ChatObject() +{ + std::map::iterator it = chatNameMap.find(title); + if (it != chatNameMap.end()) + chatNameMap.erase(it); + std::map::iterator it2 = chatIdMap.find(chatId); + if (it2 != chatIdMap.end()) + chatIdMap.erase(it2); +} + +void ChatObject::update() +{ + chatNameMap[title] = this; + chatIdMap[chatId] = this; +} + +ChatObject *ChatObject::findByName(const std::string &name) +{ + std::map::iterator it = chatNameMap.find(name); + if (it == chatNameMap.end()) + return nullptr; + else + return (*it).second; +} + +ChatObject *ChatObject::findById(const int id) +{ + std::map::iterator it = chatIdMap.find(id); + if (it == chatIdMap.end()) + return nullptr; + else + return (*it).second; +} diff --git a/src/resources/chatobject.h b/src/resources/chatobject.h index b3945ec5f..431718e41 100644 --- a/src/resources/chatobject.h +++ b/src/resources/chatobject.h @@ -25,24 +25,27 @@ struct ChatObject final { - ChatObject() : - ownerId(0), - chatId(0), - maxUsers(0), - currentUsers(0), - type(0), - title() - { - } + ChatObject(); + + ~ChatObject(); A_DELETE_COPY(ChatObject) + void update(); + + static ChatObject *findByName(const std::string &name); + + static ChatObject *findById(const int id); + int ownerId; int chatId; uint16_t maxUsers; uint16_t currentUsers; uint8_t type; std::string title; + + static std::map chatNameMap; + static std::map chatIdMap; }; #endif // RESOURCES_CHATOBJECT_H -- cgit v1.2.3-60-g2f50