void ReplicatedMapAddEntryListenerCodec::AbstractEventHandler::handle(std::auto_ptr<protocol::ClientMessage> clientMessage) { int messageType = clientMessage->getMessageType(); switch (messageType) { case protocol::EVENT_ENTRY: { std::auto_ptr<serialization::pimpl::Data > key = clientMessage->getNullable<serialization::pimpl::Data >(); std::auto_ptr<serialization::pimpl::Data > value = clientMessage->getNullable<serialization::pimpl::Data >(); std::auto_ptr<serialization::pimpl::Data > oldValue = clientMessage->getNullable<serialization::pimpl::Data >(); std::auto_ptr<serialization::pimpl::Data > mergingValue = clientMessage->getNullable<serialization::pimpl::Data >(); int32_t eventType = clientMessage->get<int32_t >(); std::string uuid = clientMessage->get<std::string >(); int32_t numberOfAffectedEntries = clientMessage->get<int32_t >(); handleEntry(key, value, oldValue, mergingValue, eventType, uuid, numberOfAffectedEntries); break; } default: char buf[300]; util::snprintf(buf, 300, "[ReplicatedMapAddEntryListenerCodec::AbstractEventHandler::handle] Unknown message type (%d) received on event handler.", clientMessage->getMessageType()); util::ILogger::getLogger().warning(buf); } }
bool MinecraftDynmapProto::doSendMessage(const std::string &message_text) { handleEntry(__FUNCTION__); JSONNode json(JSON_NODE); json.push_back(JSONNode("name", m_nick.c_str())); json.push_back(JSONNode("message", message_text.c_str())); std::string data = json.write(); http::response resp = sendRequest(MINECRAFTDYNMAP_REQUEST_MESSAGE, &data); if (resp.code == HTTP_CODE_OK) { JSONNode root = JSONNode::parse(resp.data.c_str()); if (root) { const JSONNode &error_ = root["error"]; if (error_) { std::string error = error_.as_string(); if (error == "none") { return handleSuccess(__FUNCTION__); } else if (error == "not-allowed") { UpdateChat(NULL, Translate("Message was not sent. Probably you are sending them too fast or chat is disabled completely.")); } } } } return handleError(__FUNCTION__); }
bool MinecraftDynmapProto::doSignOn() { handleEntry(__FUNCTION__); http::response resp = sendRequest(MINECRAFTDYNMAP_REQUEST_CONFIGURATION); if (resp.code != HTTP_CODE_OK) { return handleError(__FUNCTION__, "Can't load configuration", true); } JSONNode root = JSONNode::parse(resp.data.c_str()); if (!root) return false; /* const JSONNode &allowchat_ = root["allowchat"]; // boolean const JSONNode &allowwebchat_ = root["allowwebchat"]; // boolean const JSONNode &loggedin_ = root["loggedin"]; // boolean const JSONNode &loginEnabled_ = root["login-enabled"]; // boolean const JSONNode &loginRequired_ = root["webchat-requires-login"]; // boolean */ const JSONNode &title_ = root["title"]; // name of server const JSONNode &interval_ = root["webchat-interval"]; // limit in seconds for sending messages const JSONNode &rate_ = root["updaterate"]; // probably update rate for events request if (!title_ || !interval_ || !rate_) { return handleError(__FUNCTION__, "No title, interval or rate in configuration", true); } m_title = title_.as_string(); m_interval = interval_.as_int(); m_updateRate = rate_.as_int(); m_cookie.clear(); if (resp.headers.find("Set-Cookie") != resp.headers.end()) { // Load Session identifier std::string cookies = resp.headers["Set-Cookie"]; const char *findStr = "JSESSIONID="; std::string::size_type start = cookies.find(findStr); if (start != std::string::npos) { m_cookie = cookies.substr(start, cookies.find(";") - start); } } if (m_cookie.empty()) { return handleError(__FUNCTION__, "Empty session id", true); } return handleSuccess(__FUNCTION__); }
std::string MinecraftDynmapProto::doGetPage(const int request_type) { handleEntry(__FUNCTION__); http::response resp = sendRequest(request_type); if (resp.code == HTTP_CODE_OK) { handleSuccess(__FUNCTION__); } else { handleError(__FUNCTION__); } return resp.data; }
bool MinecraftDynmapProto::doEvents() { handleEntry(__FUNCTION__); // Get update http::response resp = sendRequest(MINECRAFTDYNMAP_REQUEST_EVENTS); if (resp.code != HTTP_CODE_OK) return handleError(__FUNCTION__, "Response is not code 200"); JSONNode root = JSONNode::parse(resp.data.c_str()); if (!root) return handleError(__FUNCTION__, "Invalid JSON response"); const JSONNode ×tamp_ = root["timestamp"]; if (!timestamp_) return handleError(__FUNCTION__, "Received no timestamp node"); m_timestamp = timestamp_.as_string(); const JSONNode &updates_ = root["updates"]; if (!updates_) return handleError(__FUNCTION__, "Received no updates node"); for (auto it = updates_.begin(); it != updates_.end(); ++it) { const JSONNode &type_ = (*it)["type"]; if (type_ && type_.as_string() == "chat") { const JSONNode &time_ = (*it)["timestamp"]; // const JSONNode &source_ = (*it)["source"]; // e.g. "web" const JSONNode &playerName_ = (*it)["playerName"]; const JSONNode &message_ = (*it)["message"]; // TODO: there are also "channel" and "account" elements if (!time_ || !playerName_ || !message_) { debugLog(_T("Error: No player name, time or text for message")); continue; } time_t timestamp = utils::time::from_string(time_.as_string()); std::string name = playerName_.as_string(); std::string message = message_.as_string(); debugLog(_T("Received message: [%d] %s -> %s"), timestamp, name.c_str(), message.c_str()); UpdateChat(name.c_str(), message.c_str(), timestamp); } } return handleSuccess(__FUNCTION__); }