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 @@ -336,6 +336,11 @@ }; /** + * Informations about players presences and messages + */ +let g_Players = {}; + +/** * Called after the XmppConnection succeeded and when returning from a game. * * @param {Object} attribs @@ -363,6 +368,27 @@ updateToggleBuddy(); Engine.GetGUIObjectByName("chatInput").tooltip = colorizeAutocompleteHotkey(); + + // test pings put your username in + + addChatMessage({ + "from": escapeText("your username"), + "text": escapeText("PING"), + "time": 0 + }); + + addChatMessage({ + "from": escapeText("your username"), + "text": escapeText("PING2"), + "time": 0 + }); + + addChatMessage({ + "from": escapeText("your username"), + "text": escapeText("PING3"), + "time": 0 + }); + // after try go lobby type /away and /back to see switching } function updateLobbyColumns() @@ -608,6 +634,8 @@ return 0; }); + let presencesUpdated = false; + // Colorize list entries for (let player of cleanPlayerList) { @@ -618,6 +646,8 @@ let presence = g_PlayerStatuses[player.presence] ? player.presence : "unknown"; if (presence == "unknown") warn("Unknown presence:" + player.presence); + if (updatePlayerPresence(player.name, player.presence)) + presencesUpdated = true; let statusColor = g_PlayerStatuses[presence].color; let coloredName = colorPlayerName((player.role == "moderator" ? g_ModeratorPrefix : "") + player.name); @@ -638,6 +668,32 @@ playersBox.list = nickList; playersBox.selected = playersBox.list.indexOf(g_SelectedPlayer); + + if (presencesUpdated) + updateChat(); +} + +/* + * Update player's presence in g_Players + * return: + * true - presence changed + * false - presence up-to-date + */ +function updatePlayerPresence(name, presence) +{ + if (!g_Players[name]) + g_Players[name] = { "presence": presence }; + else + if (g_Players[name].presence != presence) + { + g_Players[name].presence = presence; + if (g_Players[name].messages) + for (let msg of g_Players[name].messages) + ircFormat(msg); + } + else + return false; + return true; } /** @@ -1229,22 +1285,32 @@ { if (msg.from) { - if (Engine.LobbyGetPlayerRole(msg.from) == "moderator") - msg.from = g_ModeratorPrefix + msg.from; - // Highlight local user's nick if (g_Username != msg.from) { msg.text = msg.text.replace(g_Username, colorPlayerName(g_Username)); notifyUser(g_Username, msg.text); } + + if (!g_Players[msg.from] || g_Players[msg.from]["presence"] == undefined) + g_Players[msg.from] = { "presence": "unknown" }; + + if (g_Players[msg.from].messages == undefined) + g_Players[msg.from].messages = []; } - let formatted = ircFormat(msg); - if (!formatted) + ircFormat(msg); + if (!msg.formatted) return; - g_ChatMessages.push(formatted); + if (msg.from) + g_Players[msg.from].messages.push(msg); + g_ChatMessages.push(msg); + updateChat(); +} + +function updateChat() +{ Engine.GetGUIObjectByName("chatText").caption = g_ChatMessages.join("\n"); } @@ -1272,6 +1338,14 @@ let formattedMessage = ""; let coloredFrom = msg.from && colorPlayerName(msg.from); + if (msg.from) + { + coloredFrom = '[color="' + g_PlayerStatuses[g_Players[msg.from].presence].color + + '"] ' + g_BuddySymbol + ' [/color]' + + colorPlayerName((Engine.LobbyGetPlayerRole(msg.from) == "moderator" ? g_ModeratorPrefix : "") + + msg.from); + } + // Handle commands allowed past handleChatCommand. if (msg.text[0] == '/') { @@ -1353,9 +1427,12 @@ }); } + msg.formatted = formattedMessage; + msg.toString = () => { return msg.formatted; }; + // Add chat message timestamp if (Engine.ConfigDB_GetValue("user", "chat.timestamp") != "true") - return formattedMessage; + return; // Translation: Time as shown in the multiplayer lobby (when you enable it in the options page). // For a list of symbols that you can use, see: @@ -1368,7 +1445,7 @@ }); // Translation: IRC message format when there is a time prefix. - return sprintf(translate("%(time)s %(message)s"), { + msg.formatted = sprintf(translate("%(time)s %(message)s"), { "time": senderFont(timePrefixString), "message": formattedMessage });