Chat Timestamp And Whisper Link

Shows timestamp and whisper-link on mouseover of message sender

当前为 2016-03-06 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Chat Timestamp And Whisper Link
  3. // @namespace tag://kongregate
  4. // @description Shows timestamp and whisper-link on mouseover of message sender
  5. // @include http://www.kongregate.com/games/*
  6. // @author Ventero
  7. // @version 1.2.2
  8. // @date 06.04.2013
  9. // require http://kong.ventero.de/updates/50785.js
  10. // ==/UserScript==
  11.  
  12. // Written by Ventero (http://www.kongregate.com/accounts/Ventero) 06/04/09
  13. // Copyright (c) 2009-2013 Ventero, licensed under MIT/X11 license
  14. // http://www.opensource.org/licenses/mit-license.php
  15.  
  16. function init_timestamp(dom){
  17.  
  18. var holodeck = dom.holodeck,
  19. ChatDialogue = dom.ChatDialogue,
  20. $ = dom.$;
  21.  
  22. function injectMouseover(dom, $, holodeck, ChatDialogue) {
  23. var message_rollover_template = new dom.Element("div", {id: "message_rollover_template", "class": "user_rollover_container spritesite", style: "display: none"});
  24. var message_rollover = new dom.Element("div", {"class": "user_rollover spritesite"});
  25. var message_rollover_inner = new dom.Element("div", {"class": "user_rollover_inner"});
  26. var rollover_private_message_holder = new dom.Element("p", {"class": "rollover_message_private_message_link_message_link_holder"});
  27. 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");
  28. rollover_private_message_holder.appendChild(rollover_private_message_link);
  29. var rollover_time_text = new dom.Element("p", {id: "rollover_time_text"});
  30. message_rollover_inner.appendChild(rollover_time_text);
  31. message_rollover_inner.appendChild(rollover_private_message_holder);
  32. message_rollover.appendChild(message_rollover_inner);
  33. message_rollover_template.appendChild(message_rollover);
  34. $('chat_tab_pane').appendChild(message_rollover_template);
  35.  
  36. var MessageRollover = dom.MessageRollover = function(chat_dialogue) {
  37. this.initialize(chat_dialogue);
  38. return this;
  39. }
  40.  
  41. MessageRollover.prototype = {
  42. initialize: function(chat_dialogue){
  43. this._active_dialogue = chat_dialogue;
  44. this._holodeck = chat_dialogue._holodeck;
  45. this._rollover_template_node = $('message_rollover_template');
  46. this._private_message_node = $('rollover_message_private_message_link');
  47. this._time_node = $('rollover_time_text');
  48.  
  49. this._private_message_observer = function(){};
  50.  
  51. if(this._rollover_template_node){
  52. var rollover = this;
  53. this._rollover_template_node.observe('mouseover', function(event){
  54. rollover.stopHide();
  55. dom.Event.stop(event);
  56. });
  57. this._rollover_template_node.observe('mouseout', function(event){
  58. rollover.beginHide();
  59. dom.Event.stop(event);
  60. });
  61. }
  62. },
  63. show: function(time, user, event){
  64. if(this._hideTimer) clearTimeout(this._hideTimer);
  65. this.updatePrivateMessageLink(user);
  66. this.updateTimeText(time);
  67. this.setRolloverPosition(event);
  68. this._rollover_template_node.show();
  69. },
  70. setRolloverPosition: function(event) {
  71. var messagenode = event.target;
  72. var current_scroll_top = this._active_dialogue._message_window_node.scrollTop;
  73. var current_message_top = messagenode.positionedOffset()[1];
  74. // nudge the user rollover up a little
  75. current_message_top = current_message_top - 9;
  76.  
  77. var new_top_val = current_message_top;
  78. if ( current_scroll_top < current_message_top ) {
  79. new_top_val = current_message_top - current_scroll_top;
  80. }
  81.  
  82. var top_style_str = new_top_val + 'px';
  83. this._rollover_template_node.setStyle({ top: top_style_str });
  84.  
  85. // set left position based on username length
  86. var username_width = messagenode.getWidth();
  87. var new_left_val = 20 + username_width;
  88.  
  89. var left_style_str = new_left_val + 'px';
  90. this._rollover_template_node.setStyle({ left: left_style_str });
  91. },
  92.  
  93. updatePrivateMessageLink: function(username){
  94. var cw = this._holodeck.chatWindow();
  95. // replace observer
  96. this._private_message_node.stopObserving('click');
  97. this._private_message_observer = dom.CapturesToInlineRegistration.decorate(function(event){
  98. // just put /w <username> in the chat input field
  99. cw.insertPrivateMessagePrefixFor(username);
  100. dom.Event.stop(event);
  101. return false;
  102. });
  103. this._private_message_node.observe('click', this._private_message_observer);
  104. },
  105. updateTimeText: function(time){
  106. this._time_node.innerHTML = time;
  107. },
  108. beginHide: function() {
  109. var rollover = this;
  110. if(this._hideTimer){ clearTimeout(this._hideTimer); }
  111. this._hideTimer = setTimeout(function() { rollover.hide(); }, 500);
  112. },
  113. stopHide: function() {
  114. clearTimeout(this._hideTimer);
  115. },
  116. hide: function() {
  117. this._rollover_template_node.hide();
  118. }
  119. };
  120.  
  121. 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>';
  122. ChatDialogue.MESSAGE_TEMPLATE.old_evaluate = ChatDialogue.MESSAGE_TEMPLATE.evaluate;
  123. ChatDialogue.MESSAGE_TEMPLATE.evaluate = function(args){
  124. var date = new Date();
  125. var hours = date.getHours();
  126. var minutes = date.getMinutes();
  127. var seconds = date.getSeconds();
  128. var time;
  129. if (holodeck._timeFormat == 12){
  130. 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
  131. } else {
  132. time = (hours<10?"0":"")+hours+":"+(minutes<10?"0":"")+minutes+":"+(seconds<10?"0":"")+seconds; //24-hour clock
  133. }
  134. args.time = time;
  135. return this.old_evaluate(args);
  136. };
  137.  
  138. ChatDialogue.prototype.initialize = function(parent_node, onInputFunction, holodeck, user_manager) {
  139. this._messages_until_next_collection = 0;
  140. this._holodeck = holodeck;
  141. this._user_manager = user_manager;
  142. this._parent_node = parent_node;
  143. this._messages_count = 0;
  144. this._insertion_count = 0;
  145. this._onInputFunction = onInputFunction;
  146. this._message_rollover_manager = new MessageRollover(this);
  147.  
  148. // Establish references to re-used nodes
  149. this._message_window_node = parent_node.down('.chat_message_window');
  150. this._input_node = parent_node.down('.chat_input');
  151.  
  152. this._messages_to_retain = 200;
  153.  
  154. this._message_window_node.stopObserving();
  155.  
  156. this._message_window_node.observe('mouseover', function(event) {
  157. var time = event.target.getAttribute("time"),
  158. user = event.target.getAttribute("username");
  159. if (time){
  160. holodeck.activeDialogue().showMessageRollover(time, user, event);
  161. dom.Event.stop(event);
  162. }
  163. });
  164.  
  165. this._message_window_node.observe('mouseout', function(event) {
  166. holodeck.activeDialogue().hideMessageRollover();
  167. dom.Event.stop(event);
  168. });
  169.  
  170. // Bind event listeners
  171. var dialogue = this,
  172. input_node = this._input_node;
  173. this._input_node.observe('keypress', function(event) { dialogue.onKeyPress(event); });
  174. this._input_node.observe('focus', function(event) { dialogue.clearPrompt(); });
  175.  
  176. // Trigger mini-profile for clicks on usernames in chat.
  177. this._message_window_node.observe('click',
  178. function(event) {
  179. if (event.target) {
  180. var username = event.target.getAttribute('username');
  181. if(username){
  182. event.stop();
  183. user_manager.showProfile(username);
  184. }
  185. }
  186. });
  187. }
  188.  
  189. ChatDialogue.prototype.showMessageRollover = function (time, user, event){
  190. this._message_rollover_manager.show(time, user, event);
  191. }
  192.  
  193. ChatDialogue.prototype.hideMessageRollover = function(){
  194. this._message_rollover_manager.beginHide();
  195. }
  196. }
  197.  
  198. if(holodeck && ChatDialogue){
  199. if(!ChatDialogue.prototype && dom.CDprototype)
  200. ChatDialogue.prototype = dom.CDprototype;
  201.  
  202. if(!holodeck.__mouseover){
  203. holodeck.__mouseover = true;
  204.  
  205. var script = document.createElement("script");
  206. script.type = "text/javascript";
  207. script.textContent = "(" + injectMouseover.toString() + ")(window, $, holodeck, ChatDialogue);";
  208. document.body.appendChild(script);
  209. setTimeout(function(){document.body.removeChild(script);}, 100);
  210.  
  211. holodeck.addChatCommand("timeformat", function(l,n){
  212. var k = n.match(/^\/\S+\s+(\d+)/),
  213. m = "",
  214. q = l.activeDialogue();
  215. k && (m=k[1]);
  216. if(m==12 || m==24){
  217. l._timeFormat = m;
  218. window.setTimeout(function(){GM_setValue("kong_timeformat", m);}, 0);
  219. q.displayMessage("Timeformat", "Set to "+m+"-hour clock (hh:mm:ss"+(m==12?" AM/PM)":")"), { "class": "whisper received_whisper"}, {non_user: true});
  220. } else {
  221. q.displayMessage("Timeformat", "Allowed values: 12 and 24", { "class": "whisper received_whisper"}, {non_user: true});
  222. }
  223. return false;
  224. });
  225.  
  226. var timeformat = 12;
  227.  
  228. if(typeof GM_setValue !== "undefined"){
  229. timeformat = GM_getValue("kong_timeformat", 12)||12;
  230. }else{
  231. GM_setValue = function(){};
  232. }
  233.  
  234. holodeck._timeFormat = timeformat;
  235. }
  236. }
  237. }
  238.  
  239. function check(){
  240. var dom = (typeof unsafeWindow === "undefined"?window:unsafeWindow);
  241. var injectScript = dom.injectScript||(document.getElementById("injectScriptDiv")?document.getElementById("injectScriptDiv").onclick():0);
  242. if(injectScript){
  243. injectScript(init_timestamp, 0);
  244. } else if(!dom._promptedFramework && !/Chrome/i.test(navigator.appVersion)){
  245. if(confirm("You don't have the latest version of the framework-script!\n" +
  246. "Please install it, otherwise the scripts won't work.\n" +
  247. "Clicking ok will open a new tab where you can install the script"))
  248. window.open("http://userscripts.org/scripts/show/54245", "_blank");
  249. dom._promptedFramework = true;
  250. }
  251. }
  252.  
  253. setTimeout(check, 0);