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/lobby/lobby.js =================================================================== --- binaries/data/mods/public/gui/lobby/lobby.js +++ binaries/data/mods/public/gui/lobby/lobby.js @@ -69,6 +69,11 @@ const g_SenderFont = "sans-bold-13"; /** + * 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 = []; @@ -278,6 +283,13 @@ updateGameSelection(); } +function rateRemove(playerName) +{ + let result = /^(\S+)\ \(\d+\)$/g.exec(playerName); + return result ? result[1] : playerName; +} + + /** * Filter a game based on the status of the filter dropdowns. * @@ -382,15 +394,24 @@ 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 = false; + if (g_UserBuddies.concat(g_Username).indexOf(player.name) != -1) + player.isBuddy = true; + return player; }).sort((a, b) => { let sortA, sortB; switch (sortBy) { + case 'buddy': + sortA = g_UserBuddies.indexOf(a.name); + sortB = g_UserBuddies.indexOf(b.name); + break; case 'rating': sortA = +a.rating; sortB = +b.rating; @@ -426,6 +447,7 @@ let coloredName = colorPlayerName((player.role == "moderator" ? g_ModeratorPrefix : "") + player.name); let coloredPresence = '[color="' + statusColor + '"]' + g_PlayerStatuses[presence].status + "[/color]"; let coloredRating = '[color="' + statusColor + '"]' + rating + "[/color]"; + buddyStatusList.push('[font="sans-10"][color="' + g_PlayerStatuses[presence].color + ' ' + (player.isBuddy ? "255" : "0") + '"]●[/color][/font]'); playerList.push(coloredName); presenceList.push(coloredPresence); @@ -433,6 +455,7 @@ nickList.push(player.name); } + playersBox.list_buddy = buddyStatusList; playersBox.list_name = playerList; playersBox.list_status = presenceList; playersBox.list_rating = ratingList; @@ -443,6 +466,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,13 +694,31 @@ 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 (g_UserBuddies.indexOf(rateRemove(player.Name)) != -1) + { + game.buddy = player.Team == "observer" ? 2 : 1; + if (player.Team != "observer") + break; + } + } + + return game; + + }).filter(game => !filterGame(game)).sort((a, b) => { let sortA, sortB; switch (sortBy) { case 'name': case 'mapSize': case 'mapType': + case 'buddy': sortA = a[sortBy]; sortB = b[sortBy]; break; @@ -661,6 +741,7 @@ return 0; }); + let list_buddy = []; let list_name = []; let list_mapName = []; let list_mapSize = []; @@ -679,6 +760,7 @@ if (game.ip == g_SelectedGameIP && game.port == g_SelectedGamePort) selectedGameIndex = +i; + list_buddy.push('[font="sans-10"][color="' + g_GameColors[game.state] + ' ' + (game.buddy ? "255" : "0") + '"]●[/color][/font]'); list_name.push('[color="' + g_GameColors[game.state] + '"]' + gameName); list_mapName.push(translateMapTitle(game.niceMapName)); list_mapSize.push(translateMapSize(game.mapSize)); @@ -688,6 +770,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,7 +50,9 @@ displayProfile("lobbylist"); + unhideToggleBuddy(this); + toggleBuddy(); updatePlayerList(); @@ -88,7 +93,13 @@ - + + Leaderboard Engine.SendGetBoardList(); @@ -97,7 +108,7 @@ displayProfile("leaderboard"); - + User Profile Lookup Engine.GetGUIObjectByName("profileFetch").hidden = false; @@ -199,7 +210,10 @@ updateGameSelection(); applyFilters(); joinButton(); - + + + + Name