Index: binaries/data/mods/public/gui/lobby/lobby.js =================================================================== --- binaries/data/mods/public/gui/lobby/lobby.js +++ binaries/data/mods/public/gui/lobby/lobby.js @@ -91,6 +91,16 @@ var g_GameList = {}; /** + * All games where buddy joined. + */ +var g_BuddyGames = undefined; + +/** + * Color used for buddy info sender in chat. + */ +var g_BuddyInfoColor = "255 128 255"; + +/** * Used to restore the selection after updating the playerlist. */ var g_SelectedPlayer = ""; @@ -908,6 +918,9 @@ g_SelectedGamePort = g_GameList[gamesBox.selected].port; } + if (g_BuddyGames) + g_BuddyGames.stillRunning = !g_BuddyGames.stillRunning; + g_GameList = Engine.GetGameList().map(game => { game.hasBuddies = 0; @@ -915,6 +928,14 @@ // Compute average rating of participating players let playerRatings = []; + let initBuddyGames = !g_BuddyGames; + if (initBuddyGames) + g_BuddyGames = {"games": [], "stillRunning": true}; + if (!g_BuddyGames.games[game]) + g_BuddyGames.games[game] = {"running": g_BuddyGames.stillRunning, "buddies": []}; + else + g_BuddyGames.games[game].running = g_BuddyGames.stillRunning; + for (let player of stringifiedTeamListToPlayerData(game.players)) { let [nick, rating] = splitRatingFromNick(player.Name); @@ -922,6 +943,23 @@ if (player.Team != "observer") playerRatings.push(rating || g_DefaultLobbyRating); + if (g_Buddies.indexOf(nick) != -1 && + g_BuddyGames.games[game].buddies.indexOf(nick) == -1) + { + g_BuddyGames.games[game].buddies.push(nick); + let nickName = (player.role && player.role == "moderator" ? g_ModeratorPrefix : "") + nick; + if (!initBuddyGames) + addChatMessage({ + "from": "buddyinfo", + "text": sprintf( + translate("%(buddy)s has joined game %(game)s."), + {"buddy": '[color="' + getPlayerColor(nickName) + '"]' + + g_BuddySymbol + " " + nickName + '[/color]', + "game": '[color="' + g_GameColors[game.state] + '"]' + g_BuddySymbol + " " + game.name + '[/color]'} + )} + ); + } + // Sort games with playing buddies above games with spectating buddies if (game.hasBuddies < 2 && g_Buddies.indexOf(nick) != -1) game.hasBuddies = player.Team == "observer" ? 1 : 2; @@ -965,6 +1003,11 @@ return 0; }); + if (g_BuddyGames) + for (let game in g_BuddyGames.games) + if (g_BuddyGames.games[game].running != g_BuddyGames.stillRunning) + delete g_BuddyGames.games[game]; + let list_buddy = []; let list_name = []; let list_mapName = []; @@ -1314,6 +1357,8 @@ { let formattedMessage = ""; let coloredFrom = msg.from && colorPlayerName(msg.from); + if (msg.from && msg.from == "buddyinfo") + coloredFrom = '[color="' + g_BuddyInfoColor + '"]' + translate("Buddy") + '[/color]'; // Handle commands allowed past handleChatCommand. if (msg.text[0] == '/')