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 @@ -112,6 +112,16 @@ var g_Kicked = false; /** + * Don't display automated role changes on login. + */ +var g_MuteNotificationTimeout = 5000; + +/** + * Remember when clients joined in order to mute notifications of automated role changes. + */ +var g_JoinedTime = {}; + +/** * Notifications sent by XmppClient.cpp */ var g_NetMessageTypes = { @@ -129,6 +139,7 @@ for (let button of ["host", "leaderboard", "userprofile"]) Engine.GetGUIObjectByName(button + "Button").enabled = false; + Engine.GetGUIObjectByName("chatInput").hidden = true; if (!g_Kicked) addChatMessage({ @@ -148,6 +159,7 @@ updateSubject(msg.text); }, "join": msg => { + g_JoinedTime[msg.text] = new Date().getTime(); addChatMessage({ "text": "/special " + sprintf(translate("%(nick)s has joined."), { "nick": msg.text @@ -168,6 +180,36 @@ }, "presence": msg => { }, + "role": msg => { + Engine.GetGUIObjectByName("chatInput").hidden = Engine.LobbyGetPlayerRole(g_Username) == "visitor"; + + let me = g_Username == msg.text; + if (!me && new Date().getTime() - g_JoinedTime[msg.text] < g_MuteNotificationTimeout) + return; + + let role = Engine.LobbyGetPlayerRole(msg.text); + let txt = + role == "visitor" ? + me ? + translate("You have been muted.") : + translate("%(nick)s has been muted.") : + role == "moderator" ? + me ? + translate("You are now a moderator.") : + translate("%(nick)s is now a moderator.") : + msg.data == "visitor" ? + me ? + translate("You have been unmuted.") : + translate("%(nick)s has been unmuted.") : + me ? + translate("You are not a moderator anymore.") : + translate("%(nick)s is not a moderator anymore."); + + addChatMessage({ + "text": "/special " + sprintf(txt, { "nick": msg.text }), + "isSpecial": true + }); + }, "nick": msg => { addChatMessage({ "text": "/special " + sprintf(translate("%(oldnick)s is now known as %(newnick)s."), { @@ -227,6 +269,7 @@ initGameFilters(); + g_JoinedTime[g_Username] = new Date().getTime(); Engine.LobbySetPlayerPresence("available"); // When rejoining the lobby after a game, we don't need to process presence changes Index: source/lobby/XmppClient.cpp =================================================================== --- source/lobby/XmppClient.cpp +++ source/lobby/XmppClient.cpp @@ -765,12 +765,12 @@ */ void XmppClient::handleMUCParticipantPresence(glooxwrapper::MUCRoom*, const glooxwrapper::MUCRoomParticipant participant, const glooxwrapper::Presence& presence) { - //std::string jid = participant.jid->full(); std::string nick = participant.nick->resource().to_string(); gloox::Presence::PresenceType presenceType = presence.presence(); std::string presenceString, roleString; GetPresenceString(presenceType, presenceString); GetRoleString(participant.role, roleString); + if (presenceType == gloox::Presence::Unavailable) { if (!participant.newNick.empty() && (participant.flags & (gloox::UserNickChanged | gloox::UserSelf))) @@ -814,6 +814,8 @@ } else if (m_PlayerMap.find(nick) == m_PlayerMap.end()) CreateGUIMessage("chat", "join", nick); + else if (m_PlayerMap[nick][2] != roleString) + CreateGUIMessage("chat", "role", nick, m_PlayerMap[nick][2]); else CreateGUIMessage("chat", "presence", nick);