Ticket #3143: 3143_lobby_data_v2.5.patch

File 3143_lobby_data_v2.5.patch, 13.5 KB (added by Imarok, 8 years ago)

Move duplicating formatting into common. Translate ,

  • binaries/data/mods/public/gui/common/functions_utility.js

     
    6767    return text.substr(0, 255).replace(/\\/g, "\\\\").replace(/\[/g, "\\[");
    6868}
    6969
     70function unescapeText(text)
     71{
     72    if (!text)
     73        return text;
     74    return text.replace(/\\\\/g, "\\").replace(/\\\[/g, "\[");
     75}
     76
    7077function translateMapTitle(mapTitle)
    7178{
    7279    return mapTitle == "random" ? translateWithContext("map selection", "Random") : translate(mapTitle);
     
    262269        return '[font="sans-bold-14"]' + teamCaption + "[/font]:\n" + playerDescriptions[team].join("\n");
    263270    }).join("\n\n");
    264271}
     272/**
     273 * Returns an object with formatted player and observer lists to send them to the lobby
     274 *
     275 * @returns {object}
     276 */
     277function formatClientsForLobbyReport(playerData, playerAssignments)
     278{
     279    let observerNames = [];
     280    let playerNames = [];
     281    for (let guid in playerAssignments)
     282    {
     283        let pData = playerData[playerAssignments[guid].player - 1];
     284        if (pData)
     285            playerNames.push({
     286                "name": playerAssignments[guid].name,
     287                "team": (pData.Team || pData.team) + 1
     288            });
     289        else
     290            observerNames.push(playerAssignments[guid].name);
     291    }
     292    return {
     293        "players": escapeText(JSON.stringify(playerNames)),
     294        "playersLength": playerNames.length,
     295        "observers": escapeText(JSON.stringify(observerNames))
     296    };
     297}
     298 No newline at end of file
  • binaries/data/mods/public/gui/gamesetup/gamesetup.js

     
    676676{
    677677    if (g_IsController && Engine.HasXmppClient())
    678678    {
    679         let playerNames = Object.keys(g_PlayerAssignments).map(guid => g_PlayerAssignments[guid].name);
    680         Engine.SendChangeStateGame(playerNames.length, playerNames.join(", "));
     679        let clients = formatClients();
     680        Engine.SendChangeStateGame(clients.playersLength, clients.players, clients.observers);
    681681    }
    682682
    683683    Engine.SwitchGuiPage("page_loading.xml", {
     
    19391939
    19401940    let mapSize = g_GameAttributes.mapType == "random" ? Engine.GetGUIObjectByName("mapSize").list_data[selectedMapSize] : "Default";
    19411941    let victoryCondition = Engine.GetGUIObjectByName("victoryCondition").list[selectedVictoryCondition];
    1942     let playerNames = Object.keys(g_PlayerAssignments).map(guid => g_PlayerAssignments[guid].name).sort();
     1942    let clients = formatClientsForLobbyReport(g_GameAttributes.settings.PlayerData, g_PlayerAssignments);
    19431943
    19441944    let stanza = {
    19451945        "name": g_ServerName,
     
    19491949        "mapSize": mapSize,
    19501950        "mapType": g_GameAttributes.mapType,
    19511951        "victoryCondition": victoryCondition,
    1952         "nbp": Object.keys(g_PlayerAssignments).length || 1,
    1953         "tnbp": g_GameAttributes.settings.PlayerData.length,
    1954         "players": playerNames.join(", ")
     1952        "nbp": clients.playersLength,
     1953        "maxnbp": g_GameAttributes.settings.PlayerData.length,
     1954        "players": clients.players,
     1955        "observers": clients.observers
    19551956    };
    19561957
    19571958    // Only send the stanza if the relevant settings actually changed
  • binaries/data/mods/public/gui/lobby/lobby.js

     
    285285        return true;
    286286
    287287    if (playersNumberFilter.selected != 0 &&
    288         game.tnbp != playersNumberFilter.list_data[playersNumberFilter.selected])
     288        game.maxnbp != playersNumberFilter.list_data[playersNumberFilter.selected])
    289289        return true;
    290290
    291291    if (mapTypeFilter.selected != 0 &&
     
    292292        game.mapType != mapTypeFilter.list_data[mapTypeFilter.selected])
    293293        return true;
    294294
    295     if (!showFullFilter.checked && game.tnbp <= game.nbp)
     295    if (!showFullFilter.checked && game.maxnbp <= game.nbp)
    296296        return true;
    297297
    298298    return false;
     
    555555            break;
    556556        case 'nPlayers':
    557557            // Compare playercount ratio
    558             sortA = a.nbp * b.tnbp;
    559             sortB = b.nbp * a.tnbp;
     558            sortA = a.nbp * b.maxnbp;
     559            sortB = b.nbp * a.maxnbp;
    560560            break;
    561561        case 'status':
    562562        default:
     
    591591        list_mapName.push(translateMapTitle(game.niceMapName));
    592592        list_mapSize.push(translateMapSize(game.mapSize));
    593593        list_mapType.push(g_MapTypes.Title[mapTypeIdx] || "");
    594         list_nPlayers.push(game.nbp + "/" + game.tnbp);
     594        list_nPlayers.push(game.nbp + "/" + game.maxnbp);
    595595        list.push(gameName);
    596596        list_data.push(i);
    597597    }
     
    625625
    626626    Engine.GetGUIObjectByName("sgMapName").caption = translateMapTitle(game.niceMapName);
    627627    Engine.GetGUIObjectByName("sgNbPlayers").caption = sprintf(
    628         translate("Players: %(current)s/%(total)s"), {
     628        translate("Players: %(current)s/%(max)s"), {
    629629            "current": game.nbp,
    630             "total": game.tnbp
     630            "max": game.maxnbp
    631631        });
    632632
    633     Engine.GetGUIObjectByName("sgPlayersNames").caption = game.players;
     633    let players = JSON.parse(unescapeText(game.players));
     634    let observers = JSON.parse(unescapeText(game.observers));
     635    let teams = [];
     636    for (let player of players)
     637    {
     638        let teamIndex = player.team;
     639        if (!teams[teamIndex])
     640            teams[teamIndex] = [];
     641        teams[teamIndex].push(player.name);
     642    }
     643
     644    let playersCaption = "";
     645    for (let team in teams)
     646    {
     647        teams[team].sort();
     648        playersCaption += (team == 0 ? sprintf(translate("No Team: %(players)s\n"), { "players": teams[team].join(translate(", ")) }) :
     649            sprintf(translate("Team %(teamnumber)s: %(players)s"), { "teamnumber": team, "players": teams[team].join(translate(", ")) })
     650        );
     651    }
     652    if (observers.length)
     653        playersCaption += sprintf(translatePlural("Observer: %(observers)s", "Observers: %(observers)s", observers.length), { "observers": observers.sort().join(translate(", ")) });
     654
     655    Engine.GetGUIObjectByName("sgPlayersNames").caption = playersCaption;
    634656    Engine.GetGUIObjectByName("sgMapSize").caption = translateMapSize(game.mapSize);
    635657
    636658    let mapTypeIdx = g_MapTypes.Name.indexOf(game.mapType);
     
    662684
    663685    let username = g_UserRating ? g_Username + " (" + g_UserRating + ")" : g_Username;
    664686
    665     if (game.state == "init" || game.players.split(", ").indexOf(username) > -1)
     687    if (game.state == "init" ||
     688        JSON.parse(unescapeText(game.players)).some(player => player.name == username) ||
     689        JSON.parse(unescapeText(game.observers)).indexOf(username) > -1)
    666690        joinSelectedGame();
    667691    else
    668692        messageBox(
  • binaries/data/mods/public/gui/session/messages.js

     
    536536    // Update lobby gamestatus
    537537    if (g_IsController && Engine.HasXmppClient())
    538538    {
    539         let players = Object.keys(g_PlayerAssignments).map(guid => g_PlayerAssignments[guid].name);
    540         Engine.SendChangeStateGame(Object.keys(g_PlayerAssignments).length, players.join(", "));
     539        let formattedClients = formatClientsForLobbyReport(getPlayerData(), g_PlayerAssignments);
     540        Engine.SendChangeStateGame(formattedClients.playersLength, formattedClients.players, formattedClients.observers);
    541541    }
    542542}
    543543
  • source/lobby/IXmppClient.h

     
    1 /* Copyright (C) 2015 Wildfire Games.
     1/* Copyright (C) 2016 Wildfire Games.
    22 * This file is part of 0 A.D.
    33 *
    44 * 0 A.D. is free software: you can redistribute it and/or modify
     
    3838    virtual void SendIqGameReport(ScriptInterface& scriptInterface, JS::HandleValue data) = 0;
    3939    virtual void SendIqRegisterGame(ScriptInterface& scriptInterface, JS::HandleValue data) = 0;
    4040    virtual void SendIqUnregisterGame() = 0;
    41     virtual void SendIqChangeStateGame(const std::string& nbp, const std::string& players) = 0;
     41    virtual void SendIqChangeStateGame(const std::string& nbp, const std::string& players, const std::string& observers) = 0;
    4242    virtual void SetNick(const std::string& nick) = 0;
    4343    virtual void GetNick(std::string& nick) = 0;
    4444    virtual void kick(const std::string& nick, const std::string& reason) = 0;
  • source/lobby/scripting/JSInterface_Lobby.cpp

     
    1 /* Copyright (C) 2014 Wildfire Games.
     1/* Copyright (C) 2016 Wildfire Games.
    22 * This file is part of 0 A.D.
    33 *
    44 * 0 A.D. is free software: you can redistribute it and/or modify
     
    4646    scriptInterface.RegisterFunction<void, JS::HandleValue, &JSI_Lobby::SendRegisterGame>("SendRegisterGame");
    4747    scriptInterface.RegisterFunction<void, JS::HandleValue, &JSI_Lobby::SendGameReport>("SendGameReport");
    4848    scriptInterface.RegisterFunction<void, &JSI_Lobby::SendUnregisterGame>("SendUnregisterGame");
    49     scriptInterface.RegisterFunction<void, std::wstring, std::wstring, &JSI_Lobby::SendChangeStateGame>("SendChangeStateGame");
     49    scriptInterface.RegisterFunction<void, std::wstring, std::wstring, std::wstring, &JSI_Lobby::SendChangeStateGame>("SendChangeStateGame");
    5050    scriptInterface.RegisterFunction<JS::Value, &JSI_Lobby::GetPlayerList>("GetPlayerList");
    5151    scriptInterface.RegisterFunction<void, &JSI_Lobby::LobbyClearPresenceUpdates>("LobbyClearPresenceUpdates");
    5252    scriptInterface.RegisterFunction<int, &JSI_Lobby::LobbyGetMucMessageCount>("LobbyGetMucMessageCount");
     
    171171    g_XmppClient->SendIqUnregisterGame();
    172172}
    173173
    174 void JSI_Lobby::SendChangeStateGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::wstring& nbp, const std::wstring& players)
     174void JSI_Lobby::SendChangeStateGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::wstring& nbp, const std::wstring& players, const std::wstring& observers)
    175175{
    176176    if (!g_XmppClient)
    177177        return;
    178     g_XmppClient->SendIqChangeStateGame(utf8_from_wstring(nbp), utf8_from_wstring(players));
     178    g_XmppClient->SendIqChangeStateGame(utf8_from_wstring(nbp), utf8_from_wstring(players), utf8_from_wstring(observers));
    179179}
    180180
    181181JS::Value JSI_Lobby::GetPlayerList(ScriptInterface::CxPrivate* pCxPrivate)
  • source/lobby/scripting/JSInterface_Lobby.h

     
    1 /* Copyright (C) 2014 Wildfire Games.
     1/* Copyright (C) 2016 Wildfire Games.
    22 * This file is part of 0 A.D.
    33 *
    44 * 0 A.D. is free software: you can redistribute it and/or modify
     
    4343    void SendGameReport(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue data);
    4444    void SendRegisterGame(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue data);
    4545    void SendUnregisterGame(ScriptInterface::CxPrivate* pCxPrivate);
    46     void SendChangeStateGame(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& nbp, const std::wstring& players);
     46    void SendChangeStateGame(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& nbp, const std::wstring& players, const std::wstring& observers);
    4747    JS::Value GetPlayerList(ScriptInterface::CxPrivate* pCxPrivate);
    4848    void LobbyClearPresenceUpdates(ScriptInterface::CxPrivate* pCxPrivate);
    4949    int LobbyGetMucMessageCount(ScriptInterface::CxPrivate* pCxPrivate);
  • source/lobby/XmppClient.cpp

     
    408408 * decides which - but we need to update the current players that are
    409409 * in-game so the server can make the calculation.
    410410 */
    411 void XmppClient::SendIqChangeStateGame(const std::string& nbp, const std::string& players)
     411void XmppClient::SendIqChangeStateGame(const std::string& nbp, const std::string& players, const std::string& observers)
    412412{
    413413    glooxwrapper::JID xpartamuppJid(m_xpartamuppId);
    414414
     
    418418    glooxwrapper::Tag* game = glooxwrapper::Tag::allocate("game");
    419419    game->addAttribute("nbp", nbp);
    420420    game->addAttribute("players", players);
     421    game->addAttribute("observers", observers);
    421422    g->m_GameList.emplace_back(game);
    422423
    423424    glooxwrapper::IQ iq(gloox::IQ::Set, xpartamuppJid);
     
    502503    JSAutoRequest rq(cx);
    503504
    504505    scriptInterface.Eval("([])", ret);
    505     const char* stats[] = { "name", "ip", "port", "state", "nbp", "tnbp", "players", "mapName", "niceMapName", "mapSize", "mapType", "victoryCondition" };
     506    const char* stats[] = { "name", "ip", "port", "state", "nbp", "maxnbp", "players", "observers", "mapName", "niceMapName", "mapSize", "mapType", "victoryCondition" };
    506507    for(const glooxwrapper::Tag* const& t : m_GameList)
    507508    {
    508509        JS::RootedValue game(cx);
  • source/lobby/XmppClient.h

     
    6868    void SendIqGameReport(ScriptInterface& scriptInterface, JS::HandleValue data);
    6969    void SendIqRegisterGame(ScriptInterface& scriptInterface, JS::HandleValue data);
    7070    void SendIqUnregisterGame();
    71     void SendIqChangeStateGame(const std::string& nbp, const std::string& players);
     71    void SendIqChangeStateGame(const std::string& nbp, const std::string& players, const std::string& observers);
    7272    void SetNick(const std::string& nick);
    7373    void GetNick(std::string& nick);
    7474    void kick(const std::string& nick, const std::string& reason);