DotD tools

Tools for DotD on Kongregate

当前为 2014-08-03 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name DotD tools
  3. // @namespace http://www.flipmctwist.tk
  4. // @description Tools for DotD on Kongregate
  5. // @include http://www.kongregate.com/games/*
  6. // @version 1.01
  7. // @grant GM_xmlhttpRequest
  8. // @grant GM_getValue
  9. // @grant GM_setValue
  10. // ==/UserScript==
  11.  
  12. function main(s) {
  13. var dotd_tools = s;
  14. window.load = function(n) {
  15. if (typeof holodeck == 'object' && holodeck.ready == true) {
  16. init();
  17. }
  18. else if (n < 25) {
  19. setTimeout(function(){load(n+1);},1000);
  20. }
  21. else { console.log('DE: aborting'); }
  22. }
  23. load(0);
  24. window.init = function() {
  25. ChatDialogue.MESSAGE_TEMPLATE=new Template('<p class="#{classNames}"><span class="#{userClassNames} username time">#{time}</span> <span username="#{username}" class="username #{userClassNames}" oncontextmenu="rWhisper(\'#{username}\');return false;">#{prefix}#{username}</span><span class="separator">: </span><span class="message hyphenate">#{message}</span><span class="clear"></span></p>');
  26. ChatDialogue.MESSAGE_TEMPLATE.reEval = ChatDialogue.MESSAGE_TEMPLATE.evaluate;
  27. ChatDialogue.MESSAGE_TEMPLATE.evaluate = function(a) {
  28. a.time = dotd_tools['tools_timestamp'] == true ? timestamp() + "&nbsp;": "";
  29. return this.reEval(a);
  30. };
  31. ChatDialogue.prototype.msgHandler = ChatDialogue.prototype.displayUnsanitizedMessage;
  32. ChatDialogue.prototype.displayUnsanitizedMessage = function(a,b,c,d) {
  33. //console.log("Chat:" + a,b);
  34. if (!c) { c = {}; }
  35. if (dotd_tools['tools_charter'] == true && /kv_action_type\=signcharter/.test(b)) { return; }
  36. if (dotd_tools['tools_friend'] == true && isFriend(a)) { c.class += " friend"; }
  37. if (dotd_tools['tools_highlight'] == true) {
  38. if (b.search(holodeck._username) >= 0) {
  39. c.class += " highlight";
  40. }
  41. else {
  42. var s = dotd_tools['tools_highlight_list'];
  43. s = s.replace(/(\.|\*|\$|\^|\[|\]|\+|\?)/g,"\\$1");
  44. console.log(s);
  45. var r = new RegExp("(^|\\s)("+s.replace(/,/g,'|')+")(\\s|$)", "ig");
  46. if (r.test(b)) { c.class += " highlight"; }
  47. }
  48. }
  49. this.msgHandler(a,b,c,d);
  50. };
  51. newTab();
  52. setCSS();
  53. holodeck.addChatCommand("room",function(o,t) {
  54. var n;
  55. if (n = /^\/room\s(\d{1,2})/.exec(t)) {
  56. changeRoom(n[1]);
  57. return false;
  58. }
  59. });
  60. holodeck.addChatCommand("echo",function(o,t) {
  61. var n;
  62. if (n = /^\/echo\s(.+?)$/.exec(t)) {
  63. echo(n[1]);
  64. return false;
  65. }
  66. });
  67. holodeck.addChatCommand("share",function(o,t) {
  68. var n;
  69. if (n = /^\/share\s(.+?)$/.exec(t)) {
  70. if (/kv_action_type\=raidhelp/.test(t)) {
  71. shareMsg(n[1]);
  72. return false;
  73. }
  74. else {
  75. echo("Not a valid raid link");
  76. return false;
  77. }
  78. }
  79. });
  80. holodeck.addChatCommand("tools",function(o,t) {
  81. msgRoom("DotD tools by DanElectro: https://greasyfork.org/scripts/3827-dotd-tools");
  82. return false;
  83. });
  84. }
  85. window.msgRoom = function(msg) {
  86. holodeck.activeDialogue()._holodeck.filterOutgoingMessage(msg,holodeck.activeDialogue()._onInputFunction);
  87. }
  88. window.echo = function(msg) {
  89. holodeck.activeDialogue().msgHandler("DotD Tools:",msg,{class: "whisper whisper_received"},{non_user: true});
  90. }
  91. window.shareMsg = function(msg) {
  92. var x = document.getElementById('tools_share_table');
  93. for (var i=0;x.children[i];i++) {
  94. holodeck.activeDialogue().sendPrivateMessage(x.children[i].id,msg);
  95. }
  96. }
  97. window.newTab = function(name) {
  98. var pane = document.createElement('div');
  99. var link = document.createElement('a');
  100. var tab = document.createElement('li');
  101. var html = [
  102. '<div id="tools_cont" style="height:'+document.getElementById('chat_tab_pane').style.height+';">',
  103. '<div>DotD tools by DanElectro</div><br />',
  104. '<form id="tools_settings" class="tools_form" onSubmit="saveData();return false;">',
  105. '<input type="checkbox" name="tools_timestamp" /> Enable timestamp<br />',
  106. '<input type="checkbox" name="tools_charter" /> Hide guild charter messages<br />',
  107. '<input type="checkbox" name="tools_friend" /> Friend color: <input type="text" name="tools_fcolor" class="iSmall" /><br />',
  108. '<input type="checkbox" name="tools_highlight" /> Highlight color: <input type="text" name="tools_hcolor" class="iSmall" /><br />',
  109. '<input type="checkbox" name="tools_highlight_ext" /> Also Highlight: <input type="text" name="tools_highlight_list" /><br />',
  110. '<input type="submit" value="Save"> <span id="tools_save_info"></span>',
  111. '</form>',
  112. '<br /><hr /><br /><div>Raid sharing</div><br />',
  113. '<form id="tools_sharing" class="tools_form" onSubmit="addShare();return false;">',
  114. '<div id="tools_share_table"></div><br />',
  115. '<input type="text" name="tools_share_name" id="tools_share_name" class="iSmall" /> <input type="submit" value="Add" /><br />',
  116. '</form>',
  117. '<br /><hr /><br /><div>Chat Commands</div><br />',
  118. '<form id="tools_commands" class="tools_form" onSubmit="addCmd();return false;">',
  119. '<div id="tools_com_table"></div><br />',
  120. 'Command: <br/><input type="text" name="tools_cmdname" id="tools_cmdname" class="iSmall" /><br />',
  121. 'Message: <br /><input type="text" name="tools_cmddata" id="tools_cmddata" class="iBig" /><br /><br />',
  122. '<input type="submit" value="New" />',
  123. '</form>',
  124. '</div>'
  125. ].join('');
  126. pane.setAttribute('id','tools_tab_pane');
  127. pane.setAttribute('class','tabpane');
  128. pane.setAttribute('style','display:none;');
  129. pane.innerHTML = html;
  130. link.setAttribute('href','#tools_tab_pane');
  131. link.innerHTML = 'Tools';
  132. tab.setAttribute('id','tools_tab');
  133. tab.setAttribute('class','tab');
  134. tab.appendChild(link);
  135. document.getElementById('kong_game_ui').appendChild(pane);
  136. document.getElementById('main_tab_set').appendChild(tab);
  137. holodeck._tabs.addTab(link);
  138. loadData();
  139. }
  140. window.setCSS = function() {
  141. document.getElementById("tools_css").innerHTML = [
  142. '.time {float:left!important;}',
  143. '.iBig {width:98%;}',
  144. '.iSmall {width:60px;}',
  145. '.friend span.username {color:'+ dotd_tools["tools_fcolor"] +'!important;}',
  146. '.highlight .message {color:'+ dotd_tools["tools_hcolor"] +'!important;}',
  147. '.tools_share_name {border: 1px solid #666666; padding:1px;}',
  148. '.cmdname {width:50px;display:inline-block;}',
  149. '#tools_com_table {overflow-x:auto;white-space:nowrap;}'
  150. ].join('');
  151. }
  152. window.addCmd = function() {
  153. var cname = document.getElementById('tools_cmdname');
  154. var cdata = document.getElementById('tools_cmddata');
  155. if (cname.value && cdata.value) {
  156. var cn = cname.value.replace(/\//g,"")
  157. document.getElementById('tools_com_table').innerHTML += '<div class="tools_cmd" id="'+cn+'"><span><sup><a href="#" onClick="remCmd(this);return false;">[remove]</a></sup></span> <span class="cmdname">/'+cn+'</span> <span>:</span> <span class="cmditem">'+cdata.value+'</span></div>';
  158. window.postMessage('DotD_tools addcom '+cn+'|'+cdata.value,'*');
  159. regCmd(cn,cdata.value);
  160. cname.value = "";
  161. cdata.value = "";
  162. }
  163. }
  164. window.remCmd = function(x) {
  165. var e = x.parentElement.parentElement.parentElement;
  166. e.parentElement.removeChild(e);
  167. window.postMessage('DotD_tools remcom '+e.id,'*')
  168. }
  169. window.regCmd = function(name,msg) {
  170. holodeck.addChatCommand(name, function(o,t) {
  171. msgRoom(msg);
  172. return false;
  173. });
  174. }
  175. window.addShare = function() {
  176. var n = document.getElementById('tools_share_name').value;
  177. if (n) {
  178. document.getElementById('tools_share_name').value = "";
  179. document.getElementById('tools_share_table').innerHTML += '<span class="tools_share_name" id="'+n+'">'+n+'<sup><a href="#" onClick="remShare(this);return false;">x</a></sup></span> ';
  180. window.postMessage('DotD_tools make share','*');
  181. }
  182. }
  183. window.remShare = function(x) {
  184. var e = x.parentElement.parentElement;
  185. e.parentElement.removeChild(e);
  186. window.postMessage('DotD_tools make share','*');
  187. }
  188. window.saveData = function() {
  189. var x = document.getElementById('tools_settings');
  190. var sdata = {};
  191. var d = new Date();
  192. for (var i=0;i < x.length;i++) {
  193. if (x.elements[i].type == "checkbox") { sdata[x.elements[i].name] = x.elements[i].checked; }
  194. else if (x.elements[i].type == "text") {
  195. var val = x.elements[i].value;
  196. sdata[x.elements[i].name] = val;
  197. }
  198. }
  199. dotd_tools = sdata;
  200. setCSS();
  201. window.postMessage('DotD_tools save '+JSON.stringify(sdata),'*');
  202. document.getElementById("tools_save_info").innerHTML = "Saved at "+ d.toLocaleTimeString();
  203. }
  204. window.loadData = function() {
  205. window.postMessage('DotD_tools load','*');
  206. }
  207. window.rWhisper = function(name) {
  208. holodeck.chatWindow().insertPrivateMessagePrefixFor(name);
  209. }
  210. window.isFriend = function(name) {
  211. return holodeck.activeDialogue()._user_manager.isFriend(name);
  212. }
  213. window.timestamp = function() {
  214. var d = new Date();
  215. var h = (d.getHours() < 10) ? "0"+d.getHours() : d.getHours();
  216. var m = (d.getMinutes() < 10) ? "0"+d.getMinutes() : d.getMinutes();
  217. return '['+h+':'+m+']';
  218. }
  219. window.changeRoom = function(n) {
  220. n=n-1;
  221. if (n >= 0 && n < 13) {
  222. var r = [
  223. {"name":"Dawn of the Dragons - Room #01","id":"44247","xmpp_name":"138636-dawn-of-the-dragons-1","type":"game"},
  224. {"name":"Dawn of the Dragons - Room #02","id":"138636","xmpp_name":"138636-dawn-of-the-dragons-2","type":"game"},
  225. {"name":"Dawn of the Dragons - Room #03","id":"44303","xmpp_name":"138636-dawn-of-the-dragons-3","type":"game"},
  226. {"name":"Dawn of the Dragons - Room #04","id":"44336","xmpp_name":"138636-dawn-of-the-dragons-4","type":"game"},
  227. {"name":"Dawn of the Dragons - Room #05","id":"44341","xmpp_name":"138636-dawn-of-the-dragons-5","type":"game"},
  228. {"name":"Dawn of the Dragons - Room #06","id":"44345","xmpp_name":"138636-dawn-of-the-dragons-6","type":"game"},
  229. {"name":"Dawn of the Dragons - Room #07","id":"44348","xmpp_name":"138636-dawn-of-the-dragons-7","type":"game"},
  230. {"name":"Dawn of the Dragons - Room #08","id":"44464","xmpp_name":"138636-dawn-of-the-dragons-8","type":"game"},
  231. {"name":"Dawn of the Dragons - Room #09","id":"44465","xmpp_name":"138636-dawn-of-the-dragons-9","type":"game"},
  232. {"name":"Dawn of the Dragons - Room #10","id":"44466","xmpp_name":"138636-dawn-of-the-dragons-10","type":"game"},
  233. {"name":"Dawn of the Dragons - Room #11","id":"44467","xmpp_name":"138636-dawn-of-the-dragons-11","type":"game"},
  234. {"name":"Dawn of the Dragons - Room #12","id":"44468","xmpp_name":"138636-dawn-of-the-dragons-12","type":"game"},
  235. {"name":"Dawn of the Dragons - Room #13","id":"44473","xmpp_name":"138636-dawn-of-the-dragons-13","type":"game"}
  236. ]
  237. holodeck.joinRoom(r[n]);
  238. }
  239. }
  240. }
  241. function rMessage(e) {
  242. var r;
  243. if (r = /^DotD_tools\ssave\s(.+?)$/.exec(e.data)) {
  244. GM_setValue("settings",r[1]);
  245. }
  246. else if (r = /^DotD_tools\sload$/.exec(e.data)) {
  247. var sdata = JSON.parse(GM_getValue("settings"));
  248. var x = document.getElementById('tools_settings');
  249. for (var i=0;x.elements[i] != null;i++) {
  250. if (x.elements[i].type == "checkbox") { x.elements[i].checked = sdata[x.elements[i].name]; }
  251. else if (x.elements[i].type == "text") { x.elements[i].value = sdata[x.elements[i].name]; }
  252. }
  253. sdata = JSON.parse(GM_getValue("share"));
  254. var html = "";
  255. for (var i=0;sdata[i] != null;i++) {
  256. html += '<span class="tools_share_name" id="'+sdata[i]+'">'+sdata[i]+'<sup><a href="#" onClick="remShare(this);return false;">x</a></sup></span> ';
  257. }
  258. document.getElementById('tools_share_table').innerHTML = html;
  259. html = "";
  260. sdata = JSON.parse(GM_getValue("commands"));
  261. for (var i in sdata) {
  262. html += '<div class="tools_cmd" id="'+i+'"><span><sup><a href="#" onClick="remCmd(this);return false;">[remove]</a></sup></span> <span class="cmdname">/'+i+'</span> <span>:</span> <span class="cmditem">'+sdata[i]+'</span></div>';
  263. unsafeWindow.regCmd(i,sdata[i]);
  264. }
  265. document.getElementById('tools_com_table').innerHTML = html;
  266. }
  267. else if (r = /^DotD_tools\smake\sshare$/.exec(e.data)) {
  268. var sdata = {};
  269. var x = document.getElementById('tools_share_table');
  270. for (var i=0;x.children[i];i++) {
  271. sdata[i] = x.children[i].id;
  272. }
  273. GM_setValue("share",JSON.stringify(sdata));
  274. }
  275. else if (r = /^DotD_tools\saddcom\s(.+?)$/.exec(e.data)) {
  276. var sdata = GM_getValue("commands") ? JSON.parse(GM_getValue("commands")) : {};
  277. var x = r[1].split("|");
  278. sdata[x[0]] = x[1];
  279. GM_setValue("commands",JSON.stringify(sdata));
  280. }
  281. else if (r = /^DotD_tools\sremcom\s(.+?)$/.exec(e.data)) {
  282. var sdata = JSON.parse(GM_getValue("commands"));
  283. delete sdata[r[1]];
  284. GM_setValue("commands",JSON.stringify(sdata))
  285. }
  286. }
  287. if (window.top == window.self) {
  288. if (GM_getValue("settings") == undefined) {
  289. var s = {"tools_timestamp":true,"tools_charter":false,"tools_friend":false,"tools_fcolor":"#0088CC","tools_highlight":false,"tools_hcolor":"#00CCCC","tools_highlight_ext":false,"tools_highlight_list":""};
  290. GM_setValue("settings",JSON.stringify(s));
  291. GM_setValue("share","");
  292. GM_setValue("commands","");
  293. }
  294. var s = GM_getValue("settings");
  295. var script = document.createElement('script');
  296. script.type = "text/javascript";
  297. script.appendChild(document.createTextNode('('+main+')('+s+')'));
  298. document.head.appendChild(script);
  299. window.addEventListener("message",rMessage,false);
  300. var css = document.createElement('style');
  301. css.setAttribute('id','tools_css');
  302. css.type = "text/css";
  303. document.head.appendChild(css);
  304. }