diff --git a/client/js/socket-events/part.js b/client/js/socket-events/part.js index 58be3a57..7706f41c 100644 --- a/client/js/socket-events/part.js +++ b/client/js/socket-events/part.js @@ -12,10 +12,14 @@ socket.on("part", function (data) { const channel = store.getters.findChannel(data.chan); - if (channel) { - channel.network.channels.splice( - channel.network.channels.findIndex((c) => c.id === data.chan), - 1 - ); + if (!channel) { + return; } + + channel.network.channels.splice( + channel.network.channels.findIndex((c) => c.id === data.chan), + 1 + ); + + store.dispatch("partChannel", channel); }); diff --git a/client/js/store.js b/client/js/store.js index 83ce7f86..53659934 100644 --- a/client/js/store.js +++ b/client/js/store.js @@ -130,6 +130,12 @@ const store = new Vuex.Store({ state.messageSearchResults = value; }, }, + actions: { + partChannel({commit, state}, netChan) { + const mentions = state.mentions.filter((msg) => !(msg.chanId === netChan.channel.id)); + commit("mentions", mentions); + }, + }, getters: { findChannelOnCurrentNetwork: (state) => (name) => { name = name.toLowerCase(); diff --git a/src/client.js b/src/client.js index 4a8aa080..309d820c 100644 --- a/src/client.js +++ b/src/client.js @@ -649,6 +649,17 @@ Client.prototype.names = function (data) { }); }; +Client.prototype.part = function (network, chan) { + const client = this; + network.channels = _.without(network.channels, chan); + client.mentions = client.mentions.filter((msg) => !(msg.chanId === chan.id)); + chan.destroy(); + client.save(); + client.emit("part", { + chan: chan.id, + }); +}; + Client.prototype.quit = function (signOut) { const sockets = this.manager.sockets.sockets; const room = sockets.adapter.rooms.get(this.id); diff --git a/src/plugins/inputs/part.js b/src/plugins/inputs/part.js index d4ba095a..988dfba5 100644 --- a/src/plugins/inputs/part.js +++ b/src/plugins/inputs/part.js @@ -1,6 +1,5 @@ "use strict"; -const _ = require("lodash"); const Msg = require("../../models/msg"); const Chan = require("../../models/chan"); const Helper = require("../../helper"); @@ -41,12 +40,7 @@ exports.input = function (network, chan, cmd, args) { !network.irc.connection || !network.irc.connection.connected ) { - network.channels = _.without(network.channels, target); - target.destroy(); - this.emit("part", { - chan: target.id, - }); - this.save(); + this.part(network, target); } else { const partMessage = args.join(" ") || network.leaveMessage || Helper.config.leaveMessage; network.irc.part(target.name, partMessage); diff --git a/src/plugins/irc-events/part.js b/src/plugins/irc-events/part.js index a82d4e24..25c698cf 100644 --- a/src/plugins/irc-events/part.js +++ b/src/plugins/irc-events/part.js @@ -1,6 +1,5 @@ "use strict"; -const _ = require("lodash"); const Msg = require("../../models/msg"); module.exports = function (irc, network) { @@ -25,12 +24,7 @@ module.exports = function (irc, network) { chan.pushMessage(client, msg); if (data.nick === irc.user.nick) { - network.channels = _.without(network.channels, chan); - chan.destroy(); - client.save(); - client.emit("part", { - chan: chan.id, - }); + client.part(network, chan); } else { chan.removeUser(user); }