Ticket #3244: t3244_keep_player_and_gamelist_selection_v5_16839.patch
File t3244_keep_player_and_gamelist_selection_v5_16839.patch, 12.3 KB (added by , 9 years ago) |
---|
-
binaries/data/mods/public/gui/lobby/lobby.js
1 1 var g_ChatMessages = []; 2 2 var g_Name = "unknown"; 3 3 var g_GameList = {} 4 var g_filteredGameListIPs = []; 5 var g_selectedGameIP = ""; 6 var g_selectedNick = ""; 4 7 var g_GameListSortBy = "name"; 5 8 var g_PlayerListSortBy = "name"; 6 9 var g_GameListOrder = 1; // 1 for ascending sort, and -1 for descending 7 10 var g_PlayerListOrder = 1; 8 varg_specialKey = Math.random();11 const g_specialKey = Math.random(); 9 12 // This object looks like {"name":[numMessagesSinceReset, lastReset, timeBlocked]} when in use. 10 13 var g_spamMonitor = {}; 11 varg_timestamp = Engine.ConfigDB_GetValue("user", "lobby.chattimestamp") == "true";14 const g_timestamp = Engine.ConfigDB_GetValue("user", "lobby.chattimestamp") == "true"; 12 15 var g_mapSizes = {}; 13 16 const g_mapTypesText = [translateWithContext("map", "Skirmish"), translateWithContext("map", "Random"), translate("Scenario")]; 14 17 const g_mapTypes = ["skirmish", "random", "scenario"]; 15 18 var g_userRating = ""; // Rating of user, defaults to Unrated 16 varg_modPrefix = "@";19 const g_modPrefix = "@"; 17 20 var g_joined = false; 18 21 // Block spammers for 30 seconds. 19 varSPAM_BLOCK_LENGTH = 30;22 const SPAM_BLOCK_LENGTH = 30; 20 23 21 24 //////////////////////////////////////////////////////////////////////////////////////////////// 22 25 23 26 function init(attribs) 24 27 { … … 169 172 * 170 173 * @return Array containing the player, presence, nickname, and rating listings. 171 174 */ 172 175 function updatePlayerList() 173 176 { 174 var playersBox = Engine.GetGUIObjectByName("playersBox"); 175 var playerList = []; 176 var presenceList = []; 177 var nickList = []; 178 var ratingList = []; 179 var cleanPlayerList = Engine.GetPlayerList(); 177 let playersBox = Engine.GetGUIObjectByName("playersBox"); 178 179 // Save previously selected player 180 if (playersBox.selected > -1) 181 g_selectedNick = playersBox.list[playersBox.selected]; 182 183 let playerList = []; 184 let presenceList = []; 185 let nickList = []; 186 let ratingList = []; 187 let cleanPlayerList = Engine.GetPlayerList(); 180 188 // Sort the player list, ignoring case. 181 189 cleanPlayerList.sort(function(a,b) 182 190 { 183 191 switch (g_PlayerListSortBy) 184 192 { … … 197 205 else if (presenceA > presenceB) 198 206 return g_PlayerListOrder; 199 207 return 0; 200 208 case 'name': 201 209 default: 202 varaName = a.name.toLowerCase();203 varbName = b.name.toLowerCase();210 let aName = a.name.toLowerCase(); 211 let bName = b.name.toLowerCase(); 204 212 if (aName < bName) 205 213 return -g_PlayerListOrder; 206 214 else if (aName > bName) 207 215 return g_PlayerListOrder; 208 216 return 0; 209 217 } 210 218 }); 211 for ( vari = 0; i < cleanPlayerList.length; i++)219 for (let i = 0; i < cleanPlayerList.length; i++) 212 220 { 213 221 // Identify current user's rating. 214 222 if (cleanPlayerList[i].name == g_Name && cleanPlayerList[i].rating) 215 223 g_userRating = cleanPlayerList[i].rating; 216 224 // Add a "-" for unrated players. 217 225 if (!cleanPlayerList[i].rating) 218 226 cleanPlayerList[i].rating = "-"; 219 227 // Colorize. 220 var[name, status, rating] = formatPlayerListEntry(cleanPlayerList[i].name, cleanPlayerList[i].presence, cleanPlayerList[i].rating, cleanPlayerList[i].role);228 let [name, status, rating] = formatPlayerListEntry(cleanPlayerList[i].name, cleanPlayerList[i].presence, cleanPlayerList[i].rating, cleanPlayerList[i].role); 221 229 // Push to lists. 222 230 playerList.push(name); 223 231 presenceList.push(status); 224 232 nickList.push(cleanPlayerList[i].name); 225 varratingSpaces = " ";226 for ( varindex = 0; index < 4 - Math.ceil(Math.log(cleanPlayerList[i].rating) / Math.LN10); index++)233 let ratingSpaces = " "; 234 for (let index = 0; index < 4 - Math.ceil(Math.log(cleanPlayerList[i].rating) / Math.LN10); index++) 227 235 ratingSpaces += " "; 228 236 ratingList.push(String(ratingSpaces + rating)); 229 237 } 230 238 playersBox.list_name = playerList; 231 239 playersBox.list_status = presenceList; 232 240 playersBox.list_rating = ratingList; 233 241 playersBox.list = nickList; 234 if (playersBox.selected >= playersBox.list.length) 235 playersBox.selected = -1; 242 243 // Select the previously selected player 244 playersBox.selected = playersBox.list.indexOf(g_selectedNick); 245 236 246 return [playerList, presenceList, nickList, ratingList]; 237 247 } 238 248 239 249 /** 240 250 * Display the profile of the selected player. … … 263 273 Engine.GetGUIObjectByName("profileArea").hidden = true; 264 274 return; 265 275 } 266 276 Engine.GetGUIObjectByName("profileArea").hidden = false; 267 277 268 Engine.SendGetProfile(playerList.list[playerList.selected]); 278 Engine.SendGetProfile(playerList.list[playerList.selected]); 269 279 270 280 var user = playerList.list_name[playerList.selected]; 271 281 var role = Engine.LobbyGetPlayerRole(playerList.list[playerList.selected]); 272 282 var userList = Engine.GetGUIObjectByName("playersBox"); 273 283 if (role && caller == "lobbylist") … … 308 318 Engine.GetGUIObjectByName("profileErrorText").hidden = false; 309 319 return; 310 320 } 311 321 Engine.GetGUIObjectByName("profileWindowArea").hidden = false; 312 322 Engine.GetGUIObjectByName("profileErrorText").hidden = true; 313 323 314 324 if (attributes[0].rating != "") 315 325 user = sprintf(translate("%(nick)s (%(rating)s)"), { nick: user, rating: attributes[0].rating }); 316 326 317 327 Engine.GetGUIObjectByName("profileUsernameText").caption = user; 318 328 Engine.GetGUIObjectByName("profileRankText").caption = attributes[0].rank; … … 330 340 } 331 341 else if (!Engine.GetGUIObjectByName("leaderboard").hidden) 332 342 playerList = Engine.GetGUIObjectByName("leaderboardBox"); 333 343 else 334 344 playerList = Engine.GetGUIObjectByName("playersBox"); 335 345 336 346 if (attributes[0].rating == "-2") 337 347 return; 338 348 // Make sure the stats we have received coincide with the selected player. 339 349 if (attributes[0].player != playerList.list[playerList.selected]) 340 350 return; … … 394 404 /** 395 405 * Update the game listing from data cached in C++. 396 406 */ 397 407 function updateGameList() 398 408 { 399 var gamesBox = Engine.GetGUIObjectByName("gamesBox"); 400 var gameList = Engine.GetGameList(); 409 let gamesBox = Engine.GetGUIObjectByName("gamesBox"); 410 411 // Save previously selected game by ip 412 if (gamesBox.selected > -1) 413 g_selectedGameIP = g_filteredGameListIPs[gamesBox.selected]; 414 401 415 // Store the game whole game list data so that we can access it later 402 416 // to update the game info panel. 403 g_GameList = gameList;417 g_GameList = Engine.GetGameList(); 404 418 405 419 // Sort the list of games to that games 'waiting' are displayed at the top, followed by 'init', followed by 'running'. 406 vargameStatuses = ['waiting', 'init', 'running'];420 let gameStatuses = ['waiting', 'init', 'running']; 407 421 g_GameList.sort(function (a,b) { 408 422 switch (g_GameListSortBy) 409 423 { 410 424 case 'name': 411 425 case 'mapSize': … … 443 457 return 1; 444 458 return 0; 445 459 } 446 460 }); 447 461 448 var list_name = []; 449 var list_ip = []; 450 var list_mapName = []; 451 var list_mapSize = []; 452 var list_mapType = []; 453 var list_nPlayers = []; 454 var list = []; 455 var list_data = []; 456 457 var c = 0; 458 for (var g of gameList) 462 let list_name = []; 463 let list_ip = []; 464 let list_mapName = []; 465 let list_mapSize = []; 466 let list_mapType = []; 467 let list_nPlayers = []; 468 let list = []; 469 let list_data = []; 470 let c = 0; 471 let selectedIndex = -1; 472 g_filteredGameListIPs = []; 473 for (let g of g_GameList) 459 474 { 460 475 if (!filterGame(g)) 461 476 { 462 477 // 'waiting' games are highlighted in orange, 'running' in red, and 'init' in green. 463 478 let name = escapeText(g.name); … … 467 482 name = '[color="255 127 0"]' + name + '[/color]'; 468 483 else 469 484 name = '[color="255 0 0"]' + name + '[/color]'; 470 485 list_name.push(name); 471 486 list_ip.push(g.ip); 487 if (g.ip == g_selectedGameIP) 488 selectedIndex = list_ip.length - 1; 472 489 list_mapName.push(translate(g.niceMapName)); 473 490 list_mapSize.push(translatedMapSize(g.mapSize)); 474 491 let idx = g_mapTypes.indexOf(g.mapType); 475 492 list_mapType.push(idx != -1 ? g_mapTypesText[idx] : ""); 476 493 list_nPlayers.push(g.nbp + "/" +g.tnbp); 477 494 list.push(name); 478 495 list_data.push(c); 496 g_filteredGameListIPs.push(g.ip); 479 497 } 480 498 c++; 481 499 } 482 500 483 501 gamesBox.list_name = list_name; … … 486 504 gamesBox.list_mapType = list_mapType; 487 505 gamesBox.list_nPlayers = list_nPlayers; 488 506 gamesBox.list = list; 489 507 gamesBox.list_data = list_data; 490 508 491 if (gamesBox.selected >= gamesBox.list_name.length)492 gamesBox.selected = -1;509 // Select previously selected game 510 gamesBox.selected = selectedIndex; 493 511 494 512 // Update info box about the game currently selected 495 513 updateGameSelection(); 496 514 } 497 515 … … 670 688 checkSpamMonitor(); 671 689 672 690 // Receive messages 673 691 while (true) 674 692 { 675 varmessage = Engine.LobbyGuiPollMessage();693 let message = Engine.LobbyGuiPollMessage(); 676 694 // Clean Message 677 695 if (!message) 678 696 break; 679 var text = escapeText(message.text); 697 let text = escapeText(message.text); 698 let from; 680 699 switch (message.type) 681 700 { 682 701 case "mucmessage": // For room messages 683 varfrom = escapeText(message.from);702 from = escapeText(message.from); 684 703 addChatMessage({ "from": from, "text": text, "datetime": message.datetime}); 685 704 break; 686 705 case "message": // For private messages 687 varfrom = escapeText(message.from);706 from = escapeText(message.from); 688 707 addChatMessage({ "from": from, "text": text, "datetime": message.datetime}); 689 708 break; 690 709 case "muc": 691 var nick = message.text; 692 var presence = Engine.LobbyGetPlayerPresence(nick); 693 var playersBox = Engine.GetGUIObjectByName("playersBox"); 694 var playerList = playersBox.list_name; 695 var presenceList = playersBox.list_status; 696 var nickList = playersBox.list; 697 var ratingList = playersBox.list_rating; 698 var nickIndex = nickList.indexOf(nick); 710 let nick = message.text; 711 let presence = Engine.LobbyGetPlayerPresence(nick); 712 let playersBox = Engine.GetGUIObjectByName("playersBox"); 713 let playerList = playersBox.list_name; 714 let presenceList = playersBox.list_status; 715 let nickList = playersBox.list; 716 let ratingList = playersBox.list_rating; 717 let nickIndex = nickList.indexOf(nick); 718 let name, status, rating; 719 720 // Save the previously selected nickname 721 if (playersBox.selected > -1) 722 g_selectedNick = playersBox.list[playersBox.selected]; 723 699 724 switch(message.level) 700 725 { 701 726 case "join": 702 727 if (nick == g_Name) 703 728 { … … 708 733 g_joined = true; 709 734 break; 710 735 } 711 736 else if (g_joined) 712 737 { 713 var[name, status, rating] = formatPlayerListEntry(nick, presence, "-");738 [name, status, rating] = formatPlayerListEntry(nick, presence, "-"); 714 739 playerList.push(name); 715 740 presenceList.push(status); 716 741 nickList.push(nick); 717 742 ratingList.push(String(rating)); 718 743 Engine.SendGetRatingList(); … … 734 759 if (!isValidNick(message.data)) 735 760 { 736 761 addChatMessage({ "from": "system", "text": sprintf(translate("Invalid nickname: %(nick)s"), { nick: message.data })}); 737 762 break; 738 763 } 739 var[name, status, rating] = formatPlayerListEntry(message.data, presence, stripColorCodes(ratingList[nickIndex])); // TODO: actually we don't want to change the presence here, so use what was used before764 [name, status, rating] = formatPlayerListEntry(message.data, presence, stripColorCodes(ratingList[nickIndex])); // TODO: actually we don't want to change the presence here, so use what was used before 740 765 playerList[nickIndex] = name; 741 766 // presence stays the same 742 767 nickList[nickIndex] = message.data; 743 768 addChatMessage({ "text": "/special " + sprintf(translate("%(oldnick)s is now known as %(newnick)s."), { oldnick: nick, newnick: message.data }), "key": g_specialKey }); 744 769 Engine.SendGetRatingList(); 745 770 break; 746 771 case "presence": 747 772 if (nickIndex == -1) // This shouldn't ever happen 748 773 break; 749 var[name, status, rating] = formatPlayerListEntry(nick, presence, stripColorCodes(ratingList[nickIndex]));774 [name, status, rating] = formatPlayerListEntry(nick, presence, stripColorCodes(ratingList[nickIndex])); 750 775 presenceList[nickIndex] = status; 751 776 playerList[nickIndex] = name; 752 777 ratingList[nickIndex] = rating; 753 778 break; 754 779 case "subject": … … 760 785 } 761 786 // Push new data to GUI 762 787 playersBox.list_name = playerList; 763 788 playersBox.list_status = presenceList; 764 789 playersBox.list_rating = ratingList; 765 playersBox.list = nickList; 766 if (playersBox.selected >= playersBox.list.length)767 playersBox.selected = -1;790 playersBox.list = nickList; 791 // Select the previously selected player 792 playersBox.selected = nickList.indexOf(g_selectedNick); 768 793 break; 769 794 case "system": 770 795 switch (message.level) 771 796 { 772 797 case "standard":