Index: gui/lobby/lobby.js =================================================================== --- gui/lobby/lobby.js +++ gui/lobby/lobby.js @@ -69,14 +69,46 @@ const g_SenderFont = "sans-bold-13"; /** + * + */ +const g_BuddyChatFilter = { + "list": [ "All", "Buddies/ping1", "Buddies/ping2", "Buddies/only" ], + "all": 0, "ping1": 1, "ping2": 2, "buddies": 3 + }; +/** + * + */ +const g_BuddyPlayerFilter = { + "list": [ "All", "Buddies", "Moderators" ], + "all": 0, "buddies": 1, "moderators": 2, + }; +/** + * + */ +const g_BuddyGameFilter = { + "list": [ "All", "Buddies" ], + "all": 0, "buddies": 1 + }; + +/** * All chat messages received since init (i.e. after lobby join and after returning from a game). */ var g_ChatMessages = []; +/** + * All chat messages received since init (i.e. after lobby join and after returning from a game). + */ +var g_ChatMessagesBuddies = []; /** * Rating of the current user. * Contains the number or an empty string in case the user has no rating. */ +var g_UserBuddies = Engine.ConfigDB_GetValue("user", "lobby.buddies").split("|"); +var g_UserTempBuddies = []; +/** + * Rating of the current user. + * Contains the number or an empty string in case the user has no rating. + */ var g_UserRating = ""; /** @@ -210,6 +242,8 @@ initMusic(); global.music.setState(global.music.states.MENU); + initLobbyFilters(); + initGameFilters(); Engine.LobbySetPlayerPresence("available"); @@ -229,6 +263,16 @@ Engine.SwitchGuiPage("page_pregame.xml"); } +function initLobbyFilters() +{ + Engine.GetGUIObjectByName("buddyChatFilter").list = g_BuddyChatFilter.list; + Engine.GetGUIObjectByName("buddyChatFilter").selected = 0; + Engine.GetGUIObjectByName("buddyPlayerFilter").list = g_BuddyPlayerFilter.list; + Engine.GetGUIObjectByName("buddyPlayerFilter").selected = 0; + Engine.GetGUIObjectByName("buddyGameFilter").list = g_BuddyGameFilter.list; + Engine.GetGUIObjectByName("buddyGameFilter").selected = 0; +} + function initGameFilters() { let mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter"); @@ -254,15 +298,21 @@ Engine.GetGUIObjectByName("mapTypeFilter").selected = g_MapTypes.Default; Engine.GetGUIObjectByName("showFullFilter").checked = false; - applyFilters(); + applyGameFilters(); } -function applyFilters() +function applyGameFilters() { updateGameList(); updateGameSelection(); } +function ridOfRate(playerName) +{ + let result = /^(\S+)\ \(\d+\)$/g.exec(playerName); + return result ? result[1] : playerName; +} + /** * Filter a game based on the status of the filter dropdowns. * @@ -292,6 +342,9 @@ if (!showFullFilter.checked && game.maxnbp <= game.nbp) return true; + if (Engine.GetGUIObjectByName("buddyGameFilter").selected == g_BuddyGameFilter["buddies"] && !stringifiedTeamListToPlayerData(game.players).some(player => g_UserBuddies.some(buddy => { if (!player.Name) return false; return buddy == ridOfRate(player.Name); }))) + return true; + return false; } @@ -327,15 +380,52 @@ 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) => { + + var cleanPlayerList = Engine.GetPlayerList(); + if (Engine.GetGUIObjectByName("buddyPlayerFilter").selected != g_BuddyPlayerFilter["all"]) + switch (Engine.GetGUIObjectByName("buddyPlayerFilter").selected) + { + case g_BuddyPlayerFilter["buddies"]: + cleanPlayerList = cleanPlayerList.filter(player => g_UserBuddies.concat(g_Username).some(buddy => buddy == player.name)); + break; + case g_BuddyPlayerFilter["moderators"]: + cleanPlayerList = cleanPlayerList.filter(player => player.role == "moderator" || player.name == g_Username); + break; + } + + + // sort by names before when buddy sort + if (sortBy == "buddy") + { + sortOrder *= -1; + cleanPlayerList = cleanPlayerList.sort((a, b) => {let sortA, sortB; + sortA = a.name.toLowerCase(); + sortB = b.name.toLowerCase(); + if (sortA < sortB) return -1; + if (sortA > sortB) return +1; + return 0; + }); + } + + // vanish username to put it first afterwards first + var userPlayer = cleanPlayerList.find((player) => { return player.name === g_Username; }); + if (userPlayer != null) + cleanPlayerList.splice(cleanPlayerList.indexOf(userPlayer), 1); + + cleanPlayerList = cleanPlayerList.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; @@ -356,6 +446,10 @@ return 0; }); + // put username first in list + if (userPlayer != null) + cleanPlayerList.unshift(userPlayer); + // Colorize list entries for (let player of cleanPlayerList) { @@ -372,12 +466,19 @@ let coloredPresence = '[color="' + statusColor + '"]' + g_PlayerStatuses[presence].status + "[/color]"; let coloredRating = '[color="' + statusColor + '"]' + rating + "[/color]"; + if (player.name == g_Username) + buddyStatusList.push('[color="255 255 255"]ยด[/color]'); + else if (g_UserBuddies.indexOf(player.name) != -1) + buddyStatusList.push('[color="255 255 255"]*[/color]'); + else + buddyStatusList.push('[color="255 255 255"]-[/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; @@ -389,6 +490,27 @@ } /** + * 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(); + applyGameFilters(); +} + +/** * Display the profile of the selected player. * Displays N/A for all stats until updateProfile is called when the stats * are actually received from the bot. @@ -855,7 +977,18 @@ return; g_ChatMessages.push(formatted); - Engine.GetGUIObjectByName("chatText").caption = g_ChatMessages.join("\n"); + if (msg.buddy || (msg.ping && (Engine.GetGUIObjectByName("buddyChatFilter").selected == g_BuddyChatFilter["ping1"] || + Engine.GetGUIObjectByName("buddyChatFilter").selected == g_BuddyChatFilter["ping2"] || msg.from.search("^@") != -1))) + g_ChatMessagesBuddies.push(formatted); + showChat(); +} + +function showChat() +{ + if (Engine.GetGUIObjectByName("buddyChatFilter").selected == g_BuddyChatFilter["all"]) + Engine.GetGUIObjectByName("chatText").caption = g_ChatMessages.join("\n"); + else + Engine.GetGUIObjectByName("chatText").caption = g_ChatMessagesBuddies.join("\n"); } @@ -880,6 +1013,7 @@ */ function ircFormat(msg) { + print(uneval(msg) + "\n"); let formattedMessage = ""; let coloredFrom = !msg.from ? "" : @@ -887,10 +1021,20 @@ '[color="' + msg.color + '"]' + msg.from + "[/color]" : colorPlayerName(msg.from); + msg.buddy = false; + msg.ping = false; + if (msg.text.search(g_Username) != -1) + { + if (Engine.GetGUIObjectByName("buddyChatFilter").selected == g_BuddyChatFilter["ping1"]) + Engine.GetGUIObjectByName("buddyChatFilter").selected = g_BuddyChatFilter["all"]; + msg.ping = true; + } // Handle commands allowed past handleSpecialCommand. if (msg.text[0] == '/') { let [command, message] = ircSplit(msg.text); + if (g_UserBuddies.concat(g_Username).find(buddy => { return (message.search(new RegExp("^"+buddy)) != -1) ? buddy : null ; }) != null) + msg.buddy = true; switch (command) { case "me": @@ -948,6 +1092,8 @@ else { let senderString; + if (g_UserBuddies.concat(g_Username).some(buddy => buddy == msg.from.replace(g_ModeratorPrefix, ""))) + msg.buddy = true; // Translation: IRC message prefix. if (msg.private) Index: gui/lobby/lobby.xml =================================================================== --- gui/lobby/lobby.xml +++ gui/lobby/lobby.xml @@ -23,7 +23,7 @@ - + + + + Status - + Name @@ -48,13 +51,14 @@ displayProfile("lobbylist"); + toggleBuddy(); updatePlayerList(); - + - + + Toggle Buddy + + toggleBuddy(); + + + Leaderboard Engine.SendGetBoardList(); @@ -97,7 +107,7 @@ displayProfile("leaderboard"); - + User Profile Lookup Engine.GetGUIObjectByName("profileFetch").hidden = false; @@ -197,7 +207,7 @@ font="sans-stroke-13" > updateGameSelection(); - applyFilters(); + applyGameFilters(); joinButton(); Name @@ -222,7 +232,7 @@ style="ModernDropDown" size="52%-5 0 68%-10 100%" font="sans-bold-13"> - applyFilters(); + applyGameFilters(); - applyFilters(); + applyGameFilters(); - applyFilters(); + applyGameFilters(); @@ -250,11 +260,44 @@ style="ModernTickBox" size="0 0 20 20" font="sans-bold-13"> - applyFilters(); + applyGameFilters(); + + + + + + Chat: + + + showChat(); + + + Players: + + + updatePlayerList(); + + + Games: + + + applyGameFilters(); - + submitChatInput();