Index: binaries/data/config/default.cfg =================================================================== --- binaries/data/config/default.cfg +++ binaries/data/config/default.cfg @@ -372,6 +372,7 @@ room = "arena22" ; Default MUC room to join server = "lobby.wildfiregames.com" ; Address of lobby server xpartamupp = "wfgbot22" ; Name of the server-side xmpp client that manage games +buddies = "|" ; User buddies [mod] enabledmods = "mod public" Index: binaries/data/mods/public/gui/common/functions_utility.js =================================================================== --- binaries/data/mods/public/gui/common/functions_utility.js +++ binaries/data/mods/public/gui/common/functions_utility.js @@ -214,6 +214,15 @@ } /** + * Removes rate from playername string + */ +function playerNameRateRemove(playerName) +{ + let result = /^(\S+)\ \(\d+\)$/g.exec(playerName); + return result ? result[1] : playerName; +} + +/** * Plays a sound if user's nick is mentioned in chat */ function notifyUser(userName, msgText) 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 @@ -69,6 +69,21 @@ const g_SenderFont = "sans-bold-13"; /** + * Buddy sign + */ +const g_BuddySign = '●'; + +/** + * User sign + */ +const g_UserSign = '▶'; + +/** + * User buddies + */ +var g_UserBuddies = Engine.ConfigDB_GetValue("user", "lobby.buddies").split("|"); + +/** * All chat messages received since init (i.e. after lobby join and after returning from a game). */ var g_ChatMessages = []; @@ -382,21 +397,30 @@ if (playersBox.selected > -1) g_SelectedPlayer = playersBox.list[playersBox.selected]; + let buddyStatusList = []; let playerList = []; let presenceList = []; let nickList = []; let ratingList = []; - let cleanPlayerList = Engine.GetPlayerList().sort((a, b) => { + let cleanPlayerList = Engine.GetPlayerList().map(player => { + player.isBuddy = g_UserBuddies.concat(g_Username).indexOf(player.name) != -1; + return player; }); + + cleanPlayerList = cleanPlayerList.sort((a, b) => { let sortA, sortB; + let statusOrder = Object.keys(g_PlayerStatuses); switch (sortBy) { + case 'buddy': + sortA = (a.isBuddy ? "1" : "2") + (statusOrder.indexOf(a.presence) + 1).toString() + a.name.toLowerCase(); + sortB = (b.isBuddy ? "1" : "2") + (statusOrder.indexOf(b.presence) + 1).toString() + b.name.toLowerCase(); + break; case 'rating': sortA = +a.rating; sortB = +b.rating; break; case 'status': - let statusOrder = Object.keys(g_PlayerStatuses); sortA = statusOrder.indexOf(a.presence); sortB = statusOrder.indexOf(b.presence); break; @@ -427,12 +451,14 @@ let coloredPresence = '[color="' + statusColor + '"]' + g_PlayerStatuses[presence].status + "[/color]"; let coloredRating = '[color="' + statusColor + '"]' + rating + "[/color]"; + buddyStatusList.push('[color="' + statusColor + ' ' + (player.isBuddy ? 255 : 0) + '"]' + (player.name == g_Username ? g_UserSign : g_BuddySign) + '[/color]'); playerList.push(coloredName); presenceList.push(coloredPresence); ratingList.push(coloredRating); nickList.push(player.name); } + playersBox.list_buddy = buddyStatusList; playersBox.list_name = playerList; playersBox.list_status = presenceList; playersBox.list_rating = ratingList; @@ -443,6 +469,45 @@ playersBox.selected = playersBox.list.indexOf(g_SelectedPlayer); } +function unhideToggleBuddy(playersBox) +{ + if (playersBox.selected != -1) + { + Engine.GetGUIObjectByName("leftPanel").size = "20 30 20% 100%-310"; + Engine.GetGUIObjectByName("profilePanel").size="20 100%-305 20% 100%-110"; + Engine.GetGUIObjectByName("leftButtonPanel").size="20 100%-105 20% 100%-20"; + Engine.GetGUIObjectByName("toggleBuddy").hidden = false; + } + else + { + Engine.GetGUIObjectByName("leftPanel").size = "20 30 20% 100%-280"; + Engine.GetGUIObjectByName("profilePanel").size="20 100%-275 20% 100%-80"; + Engine.GetGUIObjectByName("leftButtonPanel").size="20 100%-75 20% 100%-20"; + Engine.GetGUIObjectByName("toggleBuddy").hidden = true; + } +} + +/** +* Toggle buddy state for a player in playerlist within the user config +*/ +function toggleBuddy() +{ + var buddies = Engine.ConfigDB_GetValue("user", "lobby.buddies"); + let playerList = Engine.GetGUIObjectByName("playersBox"); + let name = playerList.list[playerList.selected]; + + let index = g_UserBuddies.indexOf(name); + if (index != -1) + g_UserBuddies.splice(index, 1); + else + g_UserBuddies.push(name); + + Engine.ConfigDB_CreateValue("user", "lobby.buddies", g_UserBuddies.join("|")); + Engine.ConfigDB_WriteValueToFile("user", "lobby.buddies", g_UserBuddies.join("|"), "config/user.cfg"); + updatePlayerList(); + updateGameList(); +} + /** * Select the game listing the selected player when toggling the full games filter. */ @@ -632,7 +697,23 @@ g_SelectedGamePort = g_GameList[gamesBox.selected].port; } - g_GameList = Engine.GetGameList().filter(game => !filterGame(game)).sort((a, b) => { + g_GameList = Engine.GetGameList().map(game => { + game.buddy = 0; + for (let player of stringifiedTeamListToPlayerData(game.players)) + { + if (!player.Name) + continue; + if (playerNameRateRemove(player.Name) == g_Username) + { + game.buddy = 3; + break; + } + if (game.buddy < 2 && g_UserBuddies.indexOf(playerNameRateRemove(player.Name)) != -1) + game.buddy = player.Team == "observer" ? 1 : 2; + } + return game; }); + + g_GameList = g_GameList.filter(game => !filterGame(game)).sort((a, b) => { let sortA, sortB; switch (sortBy) { @@ -642,6 +723,10 @@ sortA = a[sortBy]; sortB = b[sortBy]; break; + case 'buddy': + sortA = b.buddy + "" + g_GameStatusOrder.indexOf(a.state) + "" + a.name.toLowerCase(); + sortB = a.buddy + "" + g_GameStatusOrder.indexOf(b.state) + "" + b.name.toLowerCase(); + break; case 'mapName': sortA = translate(a.niceMapName); sortB = translate(b.niceMapName); @@ -661,6 +746,7 @@ return 0; }); + let list_buddy = []; let list_name = []; let list_mapName = []; let list_mapSize = []; @@ -679,6 +765,7 @@ if (game.ip == g_SelectedGameIP && game.port == g_SelectedGamePort) selectedGameIndex = +i; + list_buddy.push('[color="' + g_GameColors[game.state] + ' ' + (game.buddy ? 255 : 0) + '"]' + (game.buddy == 3 ? g_UserSign : g_BuddySign) + '[/color]'); list_name.push('[color="' + g_GameColors[game.state] + '"]' + gameName); list_mapName.push(translateMapTitle(game.niceMapName)); list_mapSize.push(translateMapSize(game.mapSize)); @@ -688,6 +775,7 @@ list_data.push(i); } + gamesBox.list_buddy = list_buddy; gamesBox.list_name = list_name; gamesBox.list_mapName = list_mapName; gamesBox.list_mapSize = list_mapSize; Index: binaries/data/mods/public/gui/lobby/lobby.xml =================================================================== --- binaries/data/mods/public/gui/lobby/lobby.xml +++ binaries/data/mods/public/gui/lobby/lobby.xml @@ -36,10 +36,13 @@ size="0 0 100% 100%" font="sans-bold-stroke-13" > + + + Status - + Name @@ -47,6 +50,7 @@ displayProfile("lobbylist"); + unhideToggleBuddy(this); updatePlayerList(); @@ -88,7 +92,13 @@ - + + Leaderboard Engine.SendGetBoardList(); @@ -97,7 +107,7 @@ displayProfile("leaderboard"); - + User Profile Lookup Engine.GetGUIObjectByName("profileFetch").hidden = false; @@ -199,7 +209,10 @@ updateGameSelection(); applyFilters(); joinButton(); - + + + + Name