Chat Timestamp And Whisper Link *OLD*

Shows timestamp and whisper-link on mouseover of message sender

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name          Chat Timestamp And Whisper Link *OLD*
// @namespace     tag://kongregate
// @description   Shows timestamp and whisper-link on mouseover of message sender
// @include       http://www.kongregate.com/games/*
// @author        Ventero
// @version       1.2.2
// @date          06.04.2013
// @license       MIT license
// @require       https://greasyfork.org/scripts/18206-chat-timestamp-and-whisper-link-library/code/Chat%20Timestamp%20And%20Whisper%20Link%20Library.js?version=114947
// ==/UserScript==

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

function init_timestamp(dom){

	var holodeck = dom.holodeck,
			ChatDialogue = dom.ChatDialogue,
			$ = dom.$;

	function injectMouseover(dom, $, holodeck, ChatDialogue) {
		var message_rollover_template = new dom.Element("div", {id: "message_rollover_template", "class": "user_rollover_container spritesite", style: "display: none"});
		var message_rollover = new dom.Element("div", {"class": "user_rollover spritesite"});
		var message_rollover_inner = new dom.Element("div", {"class": "user_rollover_inner"});
		var rollover_private_message_holder = new dom.Element("p", {"class": "rollover_message_private_message_link_message_link_holder"});
		var rollover_private_message_link = new dom.Element("a", {id: "rollover_message_private_message_link", "class": "rollover_message_private_message_link", href: "#"}).update("Private Message");
		rollover_private_message_holder.appendChild(rollover_private_message_link);
		var rollover_time_text = new dom.Element("p", {id: "rollover_time_text"});
		message_rollover_inner.appendChild(rollover_time_text);
		message_rollover_inner.appendChild(rollover_private_message_holder);
		message_rollover.appendChild(message_rollover_inner);
		message_rollover_template.appendChild(message_rollover);
		$('chat_tab_pane').appendChild(message_rollover_template);

		var MessageRollover = dom.MessageRollover = function(chat_dialogue) {
			this.initialize(chat_dialogue);
			return this;
		}

		MessageRollover.prototype = {
			initialize: function(chat_dialogue){
				this._active_dialogue = chat_dialogue;
				this._holodeck = chat_dialogue._holodeck;
				this._rollover_template_node = $('message_rollover_template');
				this._private_message_node = $('rollover_message_private_message_link');
				this._time_node = $('rollover_time_text');

				this._private_message_observer = function(){};

				if(this._rollover_template_node){
					var rollover = this;
					this._rollover_template_node.observe('mouseover', function(event){
						rollover.stopHide();
						dom.Event.stop(event);
					});
					this._rollover_template_node.observe('mouseout', function(event){
						rollover.beginHide();
						dom.Event.stop(event);
					});
				}
			},
			show: function(time, user, event){
				if(this._hideTimer) clearTimeout(this._hideTimer);
				this.updatePrivateMessageLink(user);
				this.updateTimeText(time);
				this.setRolloverPosition(event);
				this._rollover_template_node.show();
			},
			setRolloverPosition: function(event) {
				var messagenode = event.target;
				var current_scroll_top = this._active_dialogue._message_window_node.scrollTop;
				var current_message_top = messagenode.positionedOffset()[1];
				// nudge the user rollover up a little
				current_message_top = current_message_top - 9;

				var new_top_val = current_message_top;
				if ( current_scroll_top < current_message_top ) {
					new_top_val = current_message_top - current_scroll_top;
				}

				var top_style_str = new_top_val + 'px';
				this._rollover_template_node.setStyle({ top: top_style_str });

				// set left position based on username length
				var username_width = messagenode.getWidth();
				var new_left_val = 20 + username_width;

				var left_style_str = new_left_val + 'px';
				this._rollover_template_node.setStyle({ left: left_style_str });
			},

			updatePrivateMessageLink: function(username){
				var cw = this._holodeck.chatWindow();
				// replace observer
				this._private_message_node.stopObserving('click');
				this._private_message_observer = dom.CapturesToInlineRegistration.decorate(function(event){
					// just put /w <username> in the chat input field
					cw.insertPrivateMessagePrefixFor(username);
					dom.Event.stop(event);
					return false;
				});
				this._private_message_node.observe('click', this._private_message_observer);
			},
			updateTimeText: function(time){
				this._time_node.innerHTML = time;
			},
			beginHide: function() {
				var rollover = this;
				if(this._hideTimer){ clearTimeout(this._hideTimer); }
				this._hideTimer = setTimeout(function() { rollover.hide(); }, 500);
			},
			stopHide: function() {
				clearTimeout(this._hideTimer);
			},
			hide: function() {
				this._rollover_template_node.hide();
			}
		};

		ChatDialogue.MESSAGE_TEMPLATE.template = '<p class="#{classNames}"><span username="#{username}" time="#{time}" class="username #{userClassNames}">#{prefix}#{username}</span><span class="separator">: </span><span class="message">#{message}</span><span class="clear"></span></p>';
		ChatDialogue.MESSAGE_TEMPLATE.old_evaluate = ChatDialogue.MESSAGE_TEMPLATE.evaluate;
		ChatDialogue.MESSAGE_TEMPLATE.evaluate = function(args){
			var date = new Date();
			var hours = date.getHours();
			var minutes = date.getMinutes();
			var seconds = date.getSeconds();
			var time;
			if (holodeck._timeFormat == 12){
				time = (hours<10?(hours==0?"12":"0"+hours):(hours>12?(hours>21?hours-12:"0"+(hours-12)):hours))+":"+(minutes<10?"0":"")+minutes+":"+(seconds<10?"0":"")+seconds+(hours>11?" PM":" AM"); // 12-hour clock
			} else {
				time = (hours<10?"0":"")+hours+":"+(minutes<10?"0":"")+minutes+":"+(seconds<10?"0":"")+seconds; //24-hour clock
			}
			args.time = time;
			return this.old_evaluate(args);
		};

		ChatDialogue.prototype.initialize = function(parent_node, onInputFunction, holodeck, user_manager) {
			this._messages_until_next_collection = 0;
			this._holodeck = holodeck;
			this._user_manager = user_manager;
			this._parent_node = parent_node;
			this._messages_count = 0;
			this._insertion_count = 0;
			this._onInputFunction = onInputFunction;
			this._message_rollover_manager = new MessageRollover(this);

			// Establish references to re-used nodes
			this._message_window_node = parent_node.down('.chat_message_window');
			this._input_node = parent_node.down('.chat_input');

			this._messages_to_retain = 200;

			this._message_window_node.stopObserving();

			this._message_window_node.observe('mouseover', function(event) {
			var time = event.target.getAttribute("time"),
					user = event.target.getAttribute("username");
				if (time){
					holodeck.activeDialogue().showMessageRollover(time, user, event);
					dom.Event.stop(event);
				}
			});

			this._message_window_node.observe('mouseout', function(event) {
				holodeck.activeDialogue().hideMessageRollover();
				dom.Event.stop(event);
			});

			// Bind event listeners
			var dialogue = this,
					input_node = this._input_node;
			this._input_node.observe('keypress', function(event) { dialogue.onKeyPress(event); });
			this._input_node.observe('focus', function(event) { dialogue.clearPrompt(); });

			// Trigger mini-profile for clicks on usernames in chat.
			this._message_window_node.observe('click',
				function(event) {
					if (event.target) {
						var username = event.target.getAttribute('username');
						if(username){
							event.stop();
							user_manager.showProfile(username);
						}
					}
				});
		}

		ChatDialogue.prototype.showMessageRollover = function (time, user, event){
			this._message_rollover_manager.show(time, user, event);
		}

		ChatDialogue.prototype.hideMessageRollover = function(){
			this._message_rollover_manager.beginHide();
		}
	}

	if(holodeck && ChatDialogue){
		if(!ChatDialogue.prototype && dom.CDprototype)
			ChatDialogue.prototype = dom.CDprototype;

		if(!holodeck.__mouseover){
			holodeck.__mouseover = true;

			var script = document.createElement("script");
			script.type = "text/javascript";
			script.textContent = "(" + injectMouseover.toString() + ")(window, $, holodeck, ChatDialogue);";
			document.body.appendChild(script);
			setTimeout(function(){document.body.removeChild(script);}, 100);

			holodeck.addChatCommand("timeformat", function(l,n){
					var k = n.match(/^\/\S+\s+(\d+)/),
							m = "",
							q = l.activeDialogue();
					k && (m=k[1]);
					if(m==12 || m==24){
						l._timeFormat = m;
						window.setTimeout(function(){GM_setValue("kong_timeformat", m);}, 0);
						q.displayMessage("Timeformat", "Set to "+m+"-hour clock (hh:mm:ss"+(m==12?" AM/PM)":")"), { "class": "whisper received_whisper"}, {non_user: true});
					} else {
						q.displayMessage("Timeformat", "Allowed values: 12 and 24", { "class": "whisper received_whisper"}, {non_user: true});
					}
					return false;
				});

			var timeformat = 12;

			if(typeof GM_setValue !== "undefined"){
					timeformat = GM_getValue("kong_timeformat", 12)||12;
			}else{
				GM_setValue = function(){};
			}

			holodeck._timeFormat = timeformat;
		}
	}
}

function check(){
	var dom = (typeof unsafeWindow === "undefined"?window:unsafeWindow);
	var injectScript = dom.injectScript||(document.getElementById("injectScriptDiv")?document.getElementById("injectScriptDiv").onclick():0);
	if(injectScript){
		injectScript(init_timestamp, 0);
	} 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);