void CNetClient::CheckServerConnection() { // Trigger local warnings if the connection to the server is bad. // At most once per second. std::time_t now = std::time(nullptr); if (now <= m_LastConnectionCheck) return; m_LastConnectionCheck = now; JSContext* cx = GetScriptInterface().GetContext(); // Report if we are losing the connection to the server u32 lastReceived = m_Session->GetLastReceivedTime(); if (lastReceived > NETWORK_WARNING_TIMEOUT) { JS::RootedValue msg(cx); GetScriptInterface().Eval("({ 'type':'netwarn', 'warntype': 'server-timeout' })", &msg); GetScriptInterface().SetProperty(msg, "lastReceivedTime", lastReceived); PushGuiMessage(msg); return; } // Report if we have a bad ping to the server u32 meanRTT = m_Session->GetMeanRTT(); if (meanRTT > DEFAULT_TURN_LENGTH_MP) { JS::RootedValue msg(cx); GetScriptInterface().Eval("({ 'type':'netwarn', 'warntype': 'server-latency' })", &msg); GetScriptInterface().SetProperty(msg, "meanRTT", meanRTT); PushGuiMessage(msg); } }
/** * Create a new detail message for the GUI. * * @param type General message type * @param level Detailed message type * @param text Body of the message * @param data Optional field, used for auxiliary data */ void XmppClient::CreateSimpleMessage(const std::string& type, const std::string& text, const std::string& level, const std::string& data) { GUIMessage message; message.type = wstring_from_utf8(type); message.level = wstring_from_utf8(level); message.text = wstring_from_utf8(text); message.data = wstring_from_utf8(data); PushGuiMessage(message); }
/** * Handle a standard textual message. */ void XmppClient::handleMessage(const glooxwrapper::Message& msg, glooxwrapper::MessageSession *) { DbgXMPP("type " << msg.subtype() << ", subject " << msg.subject() << ", message " << msg.body() << ", thread id " << msg.thread()); GUIMessage message; message.from = wstring_from_utf8(msg.from().username().to_string()); message.message = wstring_from_utf8(msg.body().to_string()); PushGuiMessage(message); }
/** * Handle a standard MUC textual message. */ void XmppClient::handleMUCMessage(glooxwrapper::MUCRoom*, const glooxwrapper::Message& msg, bool) { DbgXMPP(msg.from().resource() << " said " << msg.body()); GUIMessage message; message.type = L"mucmessage"; message.from = wstring_from_utf8(msg.from().resource().to_string()); message.text = wstring_from_utf8(msg.body().to_string()); PushGuiMessage(message); }
void CNetClient::LoadFinished() { JSContext* cx = GetScriptInterface().GetContext(); JSAutoRequest rq(cx); if (!m_JoinSyncBuffer.empty()) { // We're rejoining a game, and just finished loading the initial map, // so deserialize the saved game state now std::string state; DecompressZLib(m_JoinSyncBuffer, state, true); std::stringstream stream(state); u32 turn; stream.read((char*)&turn, sizeof(turn)); turn = to_le32(turn); LOGMESSAGE("Rejoining client deserializing state at turn %u\n", turn); bool ok = m_Game->GetSimulation2()->DeserializeState(stream); ENSURE(ok); m_ClientTurnManager->ResetState(turn, turn); JS::RootedValue msg(cx); GetScriptInterface().Eval("({'type':'netstatus','status':'join_syncing'})", &msg); PushGuiMessage(msg); } else { // Connecting at the start of a game, so we'll wait for other players to finish loading JS::RootedValue msg(cx); GetScriptInterface().Eval("({'type':'netstatus','status':'waiting_for_players'})", &msg); PushGuiMessage(msg); } CLoadedGameMessage loaded; loaded.m_CurrentTurn = m_ClientTurnManager->GetCurrentTurn(); SendMessage(&loaded); }
void CNetClient::HandleDisconnect(u32 reason) { JSContext* cx = GetScriptInterface().GetContext(); JSAutoRequest rq(cx); JS::RootedValue msg(cx); GetScriptInterface().Eval("({'type':'netstatus','status':'disconnected'})", &msg); GetScriptInterface().SetProperty(msg, "reason", (int)reason, false); PushGuiMessage(msg); SAFE_DELETE(m_Session); // Update the state immediately to UNCONNECTED (don't bother with FSM transitions since // we'd need one for every single state, and we don't need to use per-state actions) SetCurrState(NCS_UNCONNECTED); }
void CNetClient::PostPlayerAssignmentsToScript() { JSContext* cx = GetScriptInterface().GetContext(); JSAutoRequest rq(cx); JS::RootedValue msg(cx); GetScriptInterface().Eval("({'type':'players', 'hosts':{}})", &msg); JS::RootedValue hosts(cx); GetScriptInterface().GetProperty(msg, "hosts", &hosts); for (PlayerAssignmentMap::iterator it = m_PlayerAssignments.begin(); it != m_PlayerAssignments.end(); ++it) { JS::RootedValue host(cx); GetScriptInterface().Eval("({})", &host); GetScriptInterface().SetProperty(host, "name", std::wstring(it->second.m_Name), false); GetScriptInterface().SetProperty(host, "player", it->second.m_PlayerID, false); GetScriptInterface().SetProperty(host, "status", it->second.m_Status, false); GetScriptInterface().SetProperty(hosts, it->first.c_str(), host, false); } PushGuiMessage(msg); }