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 @@