diff --git a/client/components/Chat.vue b/client/components/Chat.vue index 4199da14..4b75177d 100644 --- a/client/components/Chat.vue +++ b/client/components/Chat.vue @@ -28,6 +28,7 @@ :title="channel.topic" class="topic"> @@ -59,6 +61,7 @@ v-else class="chat-content"> - + - + @@ -26,6 +27,7 @@ export default { Message, }, props: { + network: Object, messages: Array, }, data() { diff --git a/client/components/MessageList.vue b/client/components/MessageList.vue index bc59dfcf..73a5b4de 100644 --- a/client/components/MessageList.vue +++ b/client/components/MessageList.vue @@ -46,9 +46,11 @@ is away - () + () @@ -22,6 +25,7 @@ export default { Username, }, props: { + network: Object, message: Object, }, }; diff --git a/client/components/MessageTypes/back.vue b/client/components/MessageTypes/back.vue index 88560965..5c056689 100644 --- a/client/components/MessageTypes/back.vue +++ b/client/components/MessageTypes/back.vue @@ -2,6 +2,7 @@ @@ -21,6 +22,7 @@ export default { Username, }, props: { + network: Object, message: Object, }, }; diff --git a/client/components/MessageTypes/invite.vue b/client/components/MessageTypes/invite.vue index 3f7a144f..5d32709e 100644 --- a/client/components/MessageTypes/invite.vue +++ b/client/components/MessageTypes/invite.vue @@ -6,7 +6,9 @@ - to + to @@ -21,6 +23,7 @@ export default { Username, }, props: { + network: Object, message: Object, }, }; diff --git a/client/components/MessageTypes/kick.vue b/client/components/MessageTypes/kick.vue index bb2bc41c..92b09a5f 100644 --- a/client/components/MessageTypes/kick.vue +++ b/client/components/MessageTypes/kick.vue @@ -5,7 +5,9 @@ () + class="part-reason">() @@ -20,6 +22,7 @@ export default { Username, }, props: { + network: Object, message: Object, }, }; diff --git a/client/components/MessageTypes/motd.vue b/client/components/MessageTypes/motd.vue index 3987cfaf..c08b60e3 100644 --- a/client/components/MessageTypes/motd.vue +++ b/client/components/MessageTypes/motd.vue @@ -1,6 +1,8 @@ - + @@ -13,6 +15,7 @@ export default { ParsedMessage, }, props: { + network: Object, message: Object, }, computed: { diff --git a/client/components/MessageTypes/part.vue b/client/components/MessageTypes/part.vue index fe122f73..021e2b9d 100644 --- a/client/components/MessageTypes/part.vue +++ b/client/components/MessageTypes/part.vue @@ -5,7 +5,9 @@ has left the channel () + class="part-reason">() @@ -20,6 +22,7 @@ export default { Username, }, props: { + network: Object, message: Object, }, }; diff --git a/client/components/MessageTypes/quit.vue b/client/components/MessageTypes/quit.vue index 66672e52..5e4a44ea 100644 --- a/client/components/MessageTypes/quit.vue +++ b/client/components/MessageTypes/quit.vue @@ -5,7 +5,9 @@ has quit () + class="quit-reason">() @@ -20,6 +22,7 @@ export default { Username, }, props: { + network: Object, message: Object, }, }; diff --git a/client/components/MessageTypes/topic.vue b/client/components/MessageTypes/topic.vue index 9aca33d5..2187079f 100644 --- a/client/components/MessageTypes/topic.vue +++ b/client/components/MessageTypes/topic.vue @@ -9,7 +9,9 @@ + class="new-topic"> @@ -24,6 +26,7 @@ export default { Username, }, props: { + network: Object, message: Object, }, }; diff --git a/client/components/MessageTypes/whois.vue b/client/components/MessageTypes/whois.vue index 9b94e36d..31221298 100644 --- a/client/components/MessageTypes/whois.vue +++ b/client/components/MessageTypes/whois.vue @@ -27,7 +27,9 @@ Real name: - + @@ -37,7 +39,9 @@ Channels: - + @@ -67,7 +71,9 @@ Away: - + @@ -104,6 +110,7 @@ export default { Username, }, props: { + network: Object, message: Object, }, }; diff --git a/client/components/ParsedMessage.vue b/client/components/ParsedMessage.vue index 2b832021..f8dbba0e 100644 --- a/client/components/ParsedMessage.vue +++ b/client/components/ParsedMessage.vue @@ -7,13 +7,15 @@ export default { props: { text: String, message: Object, + network: Object, }, render(createElement, context) { - if (typeof context.props.text !== "undefined") { - return parse(createElement, context.props.text); - } - - return parse(createElement, context.props.message.text, context.props.message); + return parse( + createElement, + typeof context.props.text !== "undefined" ? context.props.text : context.props.message.text, + context.props.message, + context.props.network + ); }, }; diff --git a/client/components/Special/ListBans.vue b/client/components/Special/ListBans.vue index ec825126..662e63f3 100644 --- a/client/components/Special/ListBans.vue +++ b/client/components/Special/ListBans.vue @@ -23,6 +23,7 @@ export default { name: "ListBans", props: { + network: Object, channel: Object, }, }; diff --git a/client/components/Special/ListChannels.vue b/client/components/Special/ListChannels.vue index a9fbd8bb..4286e7f6 100644 --- a/client/components/Special/ListChannels.vue +++ b/client/components/Special/ListChannels.vue @@ -14,9 +14,13 @@ - + {{ chan.num_users }} - + @@ -31,6 +35,7 @@ export default { ParsedMessage, }, props: { + network: Object, channel: Object, }, }; diff --git a/client/components/Special/ListIgnored.vue b/client/components/Special/ListIgnored.vue index 4da5a5db..e9e24c14 100644 --- a/client/components/Special/ListIgnored.vue +++ b/client/components/Special/ListIgnored.vue @@ -21,6 +21,7 @@ export default { name: "ListIgnored", props: { + network: Object, channel: Object, }, }; diff --git a/client/js/libs/handlebars/parse.js b/client/js/libs/handlebars/parse.js index 0b0dfe48..1b84f659 100644 --- a/client/js/libs/handlebars/parse.js +++ b/client/js/libs/handlebars/parse.js @@ -57,7 +57,7 @@ function createFragment(fragment, createElement) { // Transform an IRC message potentially filled with styling control codes, URLs, // nicknames, and channels into a string of HTML elements to display on the client. -module.exports = function parse(createElement, text, message = null) { +module.exports = function parse(createElement, text, message = undefined, network = undefined) { // Extract the styling information and get the plain text version from it const styleFragments = parseStyle(text); const cleanText = styleFragments.map((fragment) => fragment.text).join(""); @@ -65,8 +65,8 @@ module.exports = function parse(createElement, text, message = null) { // On the plain text, find channels and URLs, returned as "parts". Parts are // arrays of objects containing start and end markers, as well as metadata // depending on what was found (channel or link). - const channelPrefixes = ["#", "&"]; // TODO Channel prefixes should be RPL_ISUPPORT.CHANTYPES - const userModes = ["!", "@", "%", "+"]; // TODO User modes should be RPL_ISUPPORT.PREFIX + const channelPrefixes = network ? network.serverOptions.CHANTYPES : ["#", "&"]; + const userModes = network ? network.serverOptions.PREFIX : ["!", "@", "%", "+"]; const channelParts = findChannels(cleanText, channelPrefixes, userModes); const linkParts = findLinks(cleanText); const emojiParts = findEmoji(cleanText); diff --git a/client/js/socket-events/network.js b/client/js/socket-events/network.js index ca584ecf..fc6eac52 100644 --- a/client/js/socket-events/network.js +++ b/client/js/socket-events/network.js @@ -27,7 +27,7 @@ socket.on("network", function(data) { .prop("disabled", false); }); -socket.on("network_changed", function(data) { +socket.on("network:options", function(data) { vueApp.networks.find((n) => n.uuid === data.network).serverOptions = data.serverOptions; }); diff --git a/src/models/network.js b/src/models/network.js index 28edc340..bb8c5b99 100644 --- a/src/models/network.js +++ b/src/models/network.js @@ -40,6 +40,7 @@ function Network(attr) { hostname: null, irc: null, serverOptions: { + CHANTYPES: [], PREFIX: [], NETWORK: "", }, diff --git a/src/plugins/irc-events/connection.js b/src/plugins/irc-events/connection.js index 40bc86c7..6a7368ff 100644 --- a/src/plugins/irc-events/connection.js +++ b/src/plugins/irc-events/connection.js @@ -142,20 +142,17 @@ module.exports = function(irc, network) { }); irc.on("server options", function(data) { - if (network.serverOptions.PREFIX === data.options.PREFIX && network.serverOptions.NETWORK === data.options.NETWORK) { - return; - } - network.prefixLookup = {}; data.options.PREFIX.forEach((mode) => { network.prefixLookup[mode.mode] = mode.symbol; }); - network.serverOptions.PREFIX = data.options.PREFIX; + network.serverOptions.CHANTYPES = data.options.CHANTYPES; + network.serverOptions.PREFIX = data.options.PREFIX.map((p) => p.symbol); network.serverOptions.NETWORK = data.options.NETWORK; - client.emit("network_changed", { + client.emit("network:options", { network: network.uuid, serverOptions: network.serverOptions, });