var neoColourOptions = [ {name: 'weechat.color.chat_nick_self', label: 'Your nickname', variable: '--neorelay-nick-self'}, {name: 'weechat.color.chat_nick', label: 'Regular nickname fallback', variable: '--neorelay-nick'}, {name: 'weechat.color.chat_nick_other', label: 'Other private nicknames', variable: '--neorelay-nick-other'}, {name: 'weechat.color.nicklist_away', label: 'Away / AFK', variable: '--neorelay-nick-away'}, {name: 'weechat.color.chat_highlight', label: 'Highlight foreground', variable: '--neorelay-chat-highlight'}, {name: 'weechat.color.chat_highlight_bg', label: 'Highlight background', variable: '--neorelay-chat-highlight-bg'}, {name: 'weechat.color.chat_time', label: 'Timestamp', variable: '--neorelay-chat-time'} ]; var neoPrefixOption = 'irc.color.nick_prefixes'; var neoPaletteOption = 'weechat.color.chat_nick_colors'; $scope.neoWeeChatColours = {loading: false, status: '', items: neoColourOptions, rows: {}, values: {}, prefixes: {}, prefixRaw: '', palettePreview: []}; $scope.neoWeeChatColourPreview = neoResolveWeeChatColour; $scope.updateNeoPalettePreview = function() { $scope.neoWeeChatColours.palettePreview = String($scope.neoWeeChatColours.values[neoPaletteOption] || '').split(',').map(function(value) { return value.trim(); }).filter(neoValidWeeChatColour); }; function neoParsePrefixes(value) { var result = {}; String(value || '').split(';').forEach(function(entry) { var match = entry.match(/^([A-Za-z*]):([^;]+)$/); if (match) result[match[1]] = match[2].replace(/^[*!/_|]+/, ''); }); return result; } function neoApplyRelayColours() { neoColourOptions.forEach(function(item) { var value = $scope.neoWeeChatColours.values[item.name]; document.documentElement.style.setProperty(item.variable, neoResolveWeeChatColour(value)); }); var prefixes = $scope.neoWeeChatColours.prefixes; document.documentElement.style.setProperty('--neorelay-nick-op', neoResolveWeeChatColour(prefixes.o || prefixes.a || prefixes.q || prefixes['*'])); document.documentElement.style.setProperty('--neorelay-nick-halfop', neoResolveWeeChatColour(prefixes.h || prefixes['*'])); document.documentElement.style.setProperty('--neorelay-nick-voice', neoResolveWeeChatColour(prefixes.v || prefixes['*'])); } $scope.loadNeoWeeChatColours = function() { if (!$rootScope.connected || $scope.neoWeeChatColours.loading) return; $scope.neoWeeChatColours.loading = true; $scope.neoWeeChatColours.status = 'Loading WeeChat colours...'; var names = neoColourOptions.map(function(item) { return item.name; }).concat([neoPrefixOption, neoPaletteOption]); Promise.all(names.map(function(name) { return connection.requestInfolist('option', 0, name); })).then(function(results) { $scope.$applyAsync(function() { results.forEach(function(rows) { if (!rows[0]) return; var row = neoNormalizeOption(rows[0]); neoLoadedOptions[row.name] = row; $scope.neoWeeChatColours.rows[row.name] = row; $scope.neoWeeChatColours.values[row.name] = row.value; }); $scope.neoWeeChatColours.prefixRaw = $scope.neoWeeChatColours.values[neoPrefixOption] || ''; $scope.neoWeeChatColours.prefixes = neoParsePrefixes($scope.neoWeeChatColours.prefixRaw); $scope.updateNeoPalettePreview(); neoApplyRelayColours(); $scope.neoWeeChatColours.loading = false; $scope.neoWeeChatColours.status = 'Loaded from WeeChat.'; }); }, function() { $scope.$applyAsync(function() { $scope.neoWeeChatColours.loading = false; $scope.neoWeeChatColours.status = 'Unable to load WeeChat colours.'; }); }); }; $scope.setNeoWeeChatColour = function(name) { var row = $scope.neoWeeChatColours.rows[name]; var value = $scope.neoWeeChatColours.values[name]; neoWriteOption(row, value, function(updated) { $scope.neoWeeChatColours.values[name] = updated.value; if (name === neoPaletteOption) $scope.updateNeoPalettePreview(); neoApplyRelayColours(); $scope.neoWeeChatColours.status = 'Saved ' + name + ' to WeeChat.'; }, function(message) { $scope.neoWeeChatColours.status = message; }); }; $scope.setNeoNickPrefixColour = function(mode) { var row = $scope.neoWeeChatColours.rows[neoPrefixOption]; if (!row || !neoValidWeeChatColour($scope.neoWeeChatColours.prefixes[mode])) return; var found = false; var entries = String($scope.neoWeeChatColours.prefixRaw || '').split(';').filter(Boolean).map(function(entry) { if (entry.slice(0, 2) === mode + ':') { found = true; return mode + ':' + $scope.neoWeeChatColours.prefixes[mode]; } return entry; }); if (!found) entries.push(mode + ':' + $scope.neoWeeChatColours.prefixes[mode]); var value = entries.join(';'); neoWriteOption(row, value, function(updated) { $scope.neoWeeChatColours.prefixRaw = updated.value; $scope.neoWeeChatColours.values[neoPrefixOption] = updated.value; $scope.neoWeeChatColours.prefixes = neoParsePrefixes(updated.value); neoApplyRelayColours(); $scope.neoWeeChatColours.status = 'Saved IRC prefix colours to WeeChat.'; }, function(message) { $scope.neoWeeChatColours.status = message; }); }; $scope.$watch(function() { return $rootScope.connected; }, function(connected) { if (connected) $timeout($scope.loadNeoWeeChatColours, 250); });