From 3fde2aa7b9433225379d253f0aea8af3fdfb03a6 Mon Sep 17 00:00:00 2001 From: Pavel Djundik Date: Tue, 1 Sep 2020 11:39:36 +0300 Subject: [PATCH] Always use multi-prefix modes Fixes #323 --- client/components/ChatUserList.vue | 21 ++++++++++++++------- client/components/ContextMenu.vue | 5 ++++- client/components/Username.vue | 10 +++++++++- client/js/helpers/contextMenu.js | 7 ++++--- src/models/user.js | 11 +++++++---- src/plugins/irc-events/mode.js | 3 --- 6 files changed, 38 insertions(+), 19 deletions(-) diff --git a/client/components/ChatUserList.vue b/client/components/ChatUserList.vue index bfdde826..2bc19696 100644 --- a/client/components/ChatUserList.vue +++ b/client/components/ChatUserList.vue @@ -32,7 +32,7 @@ :on-hover="hoverUser" :active="user.original === activeUser" :user="user.original" - v-html="user.original.mode + user.string" + v-html="user.string" /> @@ -22,6 +22,14 @@ export default { onHover: Function, }, computed: { + mode() { + // Message objects have a singular mode, but user objects have modes array + if (this.user.modes) { + return this.user.modes[0]; + } + + return this.user.mode; + }, nickColor() { return colorClass(this.user.nick); }, diff --git a/client/js/helpers/contextMenu.js b/client/js/helpers/contextMenu.js index 8496cfa2..71b8a08f 100644 --- a/client/js/helpers/contextMenu.js +++ b/client/js/helpers/contextMenu.js @@ -172,6 +172,7 @@ export function generateChannelContextMenu($root, channel, network) { export function generateUserContextMenu($root, channel, network, user) { const currentChannelUser = channel.users.find((u) => u.nick === network.nick) || {}; + const currentChannelModes = currentChannelUser.modes || []; const whois = () => { const chan = $root.$store.getters.findChannelOnCurrentNetwork(user.nick); @@ -221,7 +222,7 @@ export function generateUserContextMenu($root, channel, network, user) { }, ]; - if (currentChannelUser.mode === "@") { + if (currentChannelModes.includes("@")) { items.push({ label: "Kick", type: "item", @@ -234,7 +235,7 @@ export function generateUserContextMenu($root, channel, network, user) { }, }); - if (user.mode === "@") { + if (user.modes.includes("@")) { items.push({ label: "Revoke operator (-o)", type: "item", @@ -260,7 +261,7 @@ export function generateUserContextMenu($root, channel, network, user) { }); } - if (user.mode === "+") { + if (user.modes.includes("+")) { items.push({ label: "Revoke voice (-v)", type: "item", diff --git a/src/models/user.js b/src/models/user.js index a0a63b45..591ebddd 100644 --- a/src/models/user.js +++ b/src/models/user.js @@ -8,25 +8,28 @@ function User(attr, prefixLookup) { _.defaults(this, attr, { modes: [], away: "", - mode: "", nick: "", lastMessage: 0, }); + Object.defineProperty(this, "mode", { + get() { + return this.modes[0] || ""; + }, + }); + this.setModes(this.modes, prefixLookup); } User.prototype.setModes = function (modes, prefixLookup) { // irc-framework sets character mode, but The Lounge works with symbols this.modes = modes.map((mode) => prefixLookup[mode]); - - this.mode = this.modes[0] || ""; }; User.prototype.toJSON = function () { return { nick: this.nick, - mode: this.mode, + modes: this.modes, lastMessage: this.lastMessage, }; }; diff --git a/src/plugins/irc-events/mode.js b/src/plugins/irc-events/mode.js index 5d6441c7..b07f0954 100644 --- a/src/plugins/irc-events/mode.js +++ b/src/plugins/irc-events/mode.js @@ -117,9 +117,6 @@ module.exports = function (irc, network) { return userModeSortPriority[a] - userModeSortPriority[b]; }); } - - // TODO: remove in future - user.mode = (user.modes && user.modes[0]) || ""; }); if (!usersUpdated) {