Chat Line Highlighting

Highlights lines which include your name and other set words

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

// ==UserScript==
// @name          Chat Line Highlighting
// @include       http://www.kongregate.com/games/*
// @description   Highlights lines which include your name and other set words
// @author        Ventero
// @version       2.6
// @date          2012-10-21
// require       http://kong.ventero.de/updates/49868.js
// @namespace https://greatest.deepsurf.us/users/32649
// ==/UserScript==

// Written by Ventero (http://www.kongregate.com/accounts/Ventero) 05/23/09
// Copyright (c) 2009-2012 Ventero, licensed under MIT/X11 license
// http://www.opensource.org/licenses/mit-license.php

var dom = (typeof unsafeWindow === "undefined"?window:unsafeWindow);

function init_highlighting(){

	var holodeck = dom.holodeck,
			CDialogue = dom.ChatDialogue,
			CRoom = dom.ChatRoom,
			CWindow = dom.ChatWindow;

	if(CRoom && CDialogue){

		CDialogue.prototype = dom.CDprototype||dom.ChatDialogue.prototype;
		CRoom.prototype = dom.CRprototype||dom.ChatRoom.prototype;
		CWindow.prototype = dom.CWprototype||dom.ChatWindow.prototype;
		if(!CDialogue.prototype.searchWord){

			if(!String.prototype.trim){
				String.prototype.trim = function(){
					return this.replace(/^\s+/, "").replace(/\s+$/, "");
				}
			}

			CDialogue.prototype.searchWord = function(a, b){
				for (var i=0;i<b.length;i++){
					var r = b[i].replace(/(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\)/g, '\\$1'),
									reg = new RegExp("\\b"+r+"\\b");
					if (reg.test(a)) return true;
				}
				return false;
			};

			CDialogue.prototype.searchUser = function(a){
				return this.searchWord(a, this._holodeck._hluser);
			};

			CDialogue.prototype.searchText = function(a){
				var l = this._holodeck,
				z = l._highlighting.concat([l._username.toLowerCase()]);
				return this.searchWord(a, z);
			}

			CWindow.prototype.hlFriend = function(a){
				return this._holodeck._hl_friends && this.isFriend(a);
			}

			CWindow.prototype.hlMod = function(a){
				if(!this._holodeck._hl_mods) return;

				return this._rooms.any(function(roomArr){
					var room = roomArr[1];
					var user = room.user(a);
					return user && room.canUserModerate(user);
				});
			}

			CWindow.prototype.friendOrMod = function(a){
				if(a.toLowerCase() == this._holodeck._username.toLowerCase()) return "";

				var colors = [];
				if(this.hlMod(a)) colors.push(" hlmod");
				if(this.hlFriend(a)) colors.push(" hlfriend");
				if(colors.length > 1)
					return colors[this._holodeck._hl_priority]


				return (colors[0] || "");
			}

			CDialogue.prototype.displayUnsanitizedMessageOldHighlight = CDialogue.prototype.displayUnsanitizedMessage;

			CDialogue.prototype.displayUnsanitizedMessage = function(user, msg, attributes, options){
				if(!attributes) attributes = {};
				var classes = attributes["class"] || "";
				var isWhisper = (classes.indexOf("whisper") >= 0);

				if(!(options && options["private"]))
					classes += this._user_manager.friendOrMod(user.toLowerCase());

				if(!isWhisper &&
					 !this._user_manager.isMuted(user.toLowerCase()) &&
				   (this.searchUser(user.toLowerCase()) ||
				   this.searchText(msg.toLowerCase()))) {
					classes += " highlight";
					if(typeof this.new_private_message === "function") {
						var oldChime = holodeck._pm_chime;
						holodeck._pm_chime = holodeck._hl_chime;
						this.new_private_message();
						holodeck._pm_chime = oldChime;
					}
				}

				attributes["class"] = classes;

				this.displayUnsanitizedMessageOldHighlight(user, msg, attributes, options);
			}

			holodeck.addChatCommand("highlight", function(l,n){
				var k = n.match(/^\/\S+\s+(.+)/),
				z = "";
				k&&(z = k[1])
				if(z){
					z = z.replace(/\s+/g, ' ').trim();
					window.setTimeout(function(){GM_setValue("kong_highlighting", z.toLowerCase());}, 0);
					l.activeDialogue().kongBotMessage("Now highlighting: "+z+" "+l._username);
					l._highlighting = z.toLowerCase().split(' ');
				}
				return false;
			});

			holodeck.addChatCommand("hluser", function(l,n){
				var k = n.match(/^\/\S+\s+(.+)/),
				z = "";
				k&&(z = k[1])
				if(z){
					z = z.replace(/\s+/g, ' ').trim();
					window.setTimeout(function(){GM_setValue("kong_highlightuser", z.toLowerCase());}, 0);
					l.activeDialogue().kongBotMessage("Now highlighting user(s): "+z);
					l._hluser = z.toLowerCase().split(' ');
				}
				return false;
			});

			function generateCallback(name, stop, start){
				return function(l, n){
					if(l["_hl_" + name]){
						l["_hl_" + name] = 0;
						l.activeDialogue().kongBotMessage(stop || "Stopped highlighting messages by " + name);
					}else{
						l["_hl_" + name] = 1;
						l.activeDialogue().kongBotMessage(start || "Now highlighting messages by " + name);
					}
					window.setTimeout(function(){GM_setValue("kong_highlight"+name, l["_hl_" + name]);}, 0);
					return false;
				}
			}

			holodeck.addChatCommand("hlmods", generateCallback("mods"));
			holodeck.addChatCommand("hlfriends", generateCallback("friends"));
			holodeck.addChatCommand("hlchime", generateCallback("chime", "Stopped playing the chime for highlighted messages",
			                                                    "Now playing the chime for highlighted messages"));
			holodeck.addChatCommand("hlpriority", generateCallback("priority", "Now prioritizing mods over friends", "Now prioritizing friends over mods"));

			function generateColorCallback(selector, rule, name, text, max){
				if(!max) max = 1;
				return function(l, n){
					var k = n.match(/^\/\S+\s+#?([0-9a-f]{6})/i),
					    z = "",
					    count = 0;
			    if(k) z = "#" + k[1];
			    if(z){
			    	for(var i = 0; i < sheet.cssRules.length; i++){
			    		if(sheet.cssRules[i].selectorText.indexOf(selector) == 0){
			    			sheet.cssRules[i].style.setProperty(rule, z, "important");
			    			if(++count == max){
				    			window.setTimeout(function(){GM_setValue("kong_" + name, z);}, 0);
				    			l.activeDialogue().kongBotMessage("New " + (text||name) + ": " + z);
			    				return false;
			    			}
			    		}
			    	}
			    } else {
						l.activeDialogue().kongBotMessage("No valid color! Format is /" + name + " XXXXXX (X = hex character)");
					}
					return false;
				}
			};

			holodeck.addChatCommand(
				"whispercolor",
				generateColorCallback("#kong_game_ui .chat_message_window .whisper",
				                      "background-color",
				                      "whispercolor")
			)

			holodeck.addChatCommand(
				"friendcolor",
				generateColorCallback("#kong_game_ui .chat_message_window .hlfriend span.chat_message_window_username",
				                      "color",
				                      "friendcolor")
			)
			holodeck.addChatCommand(
				"hlcolor",
				generateColorCallback("#kong_game_ui .chat_message_window .highlight",
				                      "background-color",
				                      "hlcolor",
				                      "highlighting-color",
				                      2)
			)
			holodeck.addChatCommand(
				"modcolor",
				generateColorCallback("#kong_game_ui .chat_message_window .hlmod span.chat_message_window_username",
				                      "color",
				                      "modcolor")
			)

			holodeck.addChatCommand("hllist", function(l, n) {
				var diag = l.activeDialogue();
				function botMessage(msg) {
					diag.displayUnsanitizedMessage("Kong Bot", msg);
				}

				botMessage("Current highlighting settings:");

				if(holodeck._hluser.length > 0) {
					botMessage('Users:');
					botMessage('Users: ' + holodeck._hluser.map(function(user) {
						return ['<a href="#" onclick="holodeck.showMiniProfile(\'', user,
			              '\'); return false;">', user, '</a>'].join("");
					}).join(" "));
				} else {
					botMessage("No users highlighted");
				}

				if(holodeck._highlighting.length > 0) {
					botMessage('Words: ' + holodeck._highlighting.join(" "));
				} else {
					botMessage("No words highlighted");
				}

				botMessage('Highlight color: <span style="color: ' + color + '">' +
				                    color + '</span>');
				botMessage('Whisper color: <span style="color: ' + wcolor + '">' +
				                    wcolor + '</span>');

				botMessage("Highlighting friends: " +
				                    (holodeck._hl_friends ? "Yes" : "No") +
				                    ' (color: <span style="color: ' + fcolor + '">' +
				                    fcolor + '</span>)');
				botMessage("Highlighting mods: " +
				                    (holodeck._hl_mods ? "Yes" : "No") +
				                    ' (color: <span style="color: ' + mcolor + '">' +
				                    mcolor + '</span>)');

				botMessage("Highlight priority: " +
				                    (holodeck._hl_priority ? "Friends over mods" : "Mods over friends"));
				botMessage("Playing chime: " +
				          (holodeck._hl_chime ?
				          	(typeof holodeck._pm_chime !== "undefined" ? "Yes" :
				          	    'No, <a href="http://userscripts.org/scripts/show/65622">script</a> not installed') :
				          	"No"));
				return false;
			});

			holodeck.addChatCommand("hlreset", function(l, n) {
				var diag = l.activeDialogue();
				diag.kongBotMessage("Resetting all highlighting preferences");

				holodeck._chat_commands.hlcolor[0](holodeck, "/color #def6ea");
				holodeck._chat_commands.whispercolor[0](holodeck, "/color #deeaf6");
				holodeck._chat_commands.friendcolor[0](holodeck, "/color #006600");
				holodeck._chat_commands.modcolor[0](holodeck, "/color #ba6328");
				holodeck._hl_priority = 1;
				holodeck._hl_friends = 1;
				holodeck._hl_mods = 1;
				holodeck._hl_chime = 1;
				holodeck._highlighting = [];
				holodeck._hluser = [];

				["highlighting", "highlightuser", "hlcolor", "whispercolor", "friendcolor",
				 "modcolor", "highlightfriends", "highlightpriority", "highlightmods",
				 "highlightchime"].forEach(function(pref) {
					window.setTimeout(function() {
						GM_deleteValue("kong_" + pref);
					}, 0);
				});

				return false;
			});

			holodeck._chat_commands.hl = holodeck._chat_commands.highlight;
			holodeck._chat_commands.hlfriend = holodeck._chat_commands.hlfriends;

			holodeck._highlighting = [];
			holodeck._hluser = [];


			var color = "#def6ea", wcolor = "#deeaf6", fcolor = "#006600", mcolor = "#ba6328", priority = 1, friends = 1, mods = 1, chime = 1;

			if(typeof GM_setValue !== "function"){
				GM_setValue = GM_getValue = function(){};
			} else {
				// migrate old value
				var temp = GM_getValue("kong_highlightcolor", "");
				if(temp){
					GM_setValue("kong_hlcolor", temp);
					if(typeof GM_deleteValue === "undefined"){
						GM_setValue("kong_highlightcolor", "");
					} else {
						GM_deleteValue("kong_highlightcolor");
					}
				}

				var list = GM_getValue("kong_highlighting"),
				    user = GM_getValue("kong_highlightuser");
				color = GM_getValue("kong_hlcolor", "#def6ea")||"#def6ea";
				wcolor = GM_getValue("kong_whispercolor", "#deeaf6")||"#deeaf6";
				fcolor = GM_getValue("kong_friendcolor", "#006600")||"#006600";
				mcolor = GM_getValue("kong_modcolor", "#ba6328")||"#ba6328";
				friends = GM_getValue("kong_highlightfriends", 1);
				priority = GM_getValue("kong_highlightpriority", 1);
				mods = GM_getValue("kong_highlightmods", 1);
				chime = GM_getValue("kong_highlightchime", 1);
				if(list){holodeck._highlighting = list.trim().split(' ')};
				if(user){holodeck._hluser = user.trim().split(' ')}
			}

			holodeck._hl_friends = friends;
			holodeck._hl_mods = mods;
			holodeck._hl_chime = chime;
			holodeck._hl_priority = priority;

			// guarantee we have a non-crossdomain stylesheet
			var style = document.createElement("style");
			var head = document.getElementsByTagName("head")[0];
			(head || document.body).appendChild(style);

			// now find it...
			var sheet = null;
			for(var s = document.styleSheets.length - 1; s >= 0; --s) {
				try{
					if(document.styleSheets[s].cssRules && document.styleSheets[s].cssRules.length) {
						sheet = document.styleSheets[s];
						break;
					}
				}catch(e){ /* no-op */ }
			}

			if(!sheet) {
				alert("Kongregate Chat Line Highlighting could not find a style sheet!\nPlease send a message to Ventero about this problem.");
				return;
			}

			sheet.insertRule('#kong_game_ui .chat_message_window .whisper { background-color: '+wcolor+' !important; }', sheet.cssRules.length);
			sheet.insertRule('#kong_game_ui .chat_message_window .highlight.even { background-color: '+color+' !important; }', sheet.cssRules.length);
			sheet.insertRule('#kong_game_ui .chat_message_window .highlight { background-color: '+color+' !important; }', sheet.cssRules.length);
			sheet.insertRule('#kong_game_ui .chat_message_window .hlfriend span.chat_message_window_username { color: '+fcolor+' !important; }', sheet.cssRules.length);
			sheet.insertRule('#kong_game_ui .chat_message_window .hlmod span.chat_message_window_username { color: '+mcolor+' !important; }', sheet.cssRules.length);
		}
	}
}

function check(){
	dom.injectScript = dom.injectScript||(document.getElementById("injectScriptDiv")?document.getElementById("injectScriptDiv").onclick():0);
	if(dom.injectScript){
		dom.injectScript(init_highlighting, 300);
	} else if(!dom._promptedFramework && !/Chrome/i.test(navigator.appVersion)){
		if(confirm("You don't have the latest version of the framework-script!\n" +
		           "Please install it, otherwise the scripts won't work.\n" +
		           "Clicking ok will open a new tab where you can install the script"))
			window.open("http://userscripts.org/scripts/show/54245", "_blank");
		dom._promptedFramework = true;
	}
}

setTimeout(check, 0);