Private Chat Helper

Easy Private Rooms functionality

当前为 2017-11-13 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Private Chat Helper
  3. // @namespace profusiongames.com
  4. // @author UnknownGuardian
  5. // @version 1.65.1
  6. // @date 07/24/2013
  7. // @include *://www.kongregate.com/games/*/*
  8. // @description Easy Private Rooms functionality
  9. // ==/UserScript==
  10.  
  11. // Written by UnknownGuardian (http://www.kongregate.com/accounts/UnknownGuardian) 12/08/2012
  12. // Licensed under MIT/X11 license
  13. // Copyright (c) 2012 UnknownGuardian
  14. // http://www.opensource.org/licenses/mit-license.php
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21. function main()
  22. {
  23. //console.log("Private Chat helper 1");
  24. var dom = (typeof unsafeWindow === "undefined"?window:unsafeWindow);
  25.  
  26. dom.privateScriptVersion = "1.65";
  27. dom.updateURL = "";
  28. dom.r = Math.floor(Math.random()*99999);
  29.  
  30.  
  31.  
  32. dom.pmholodeckCheckCounter = 0
  33. dom.pmholodeckInterval = dom.setInterval(checkIfHolodeckLoaded, 100)
  34. dom.pmoneScriptsInitialize = [];
  35.  
  36.  
  37.  
  38. function checkIfHolodeckLoaded()
  39. {
  40. dom.pmholodeckCheckCounter++;
  41. console.log("[PM Helper Script] Checking if holodeck loaded");
  42. if(typeof holodeck === 'undefined')
  43. {
  44.  
  45. }
  46. else if(holodeck.ready)
  47. {
  48. dom.clearInterval(dom.pmholodeckInterval);
  49. console.log("[PM Helper Script] Holodeck loaded");
  50. startPMHelperScript();
  51. }
  52.  
  53. if(dom.pmholodeckCheckCounter > 40)
  54. {
  55. dom.clearInterval(dom.pmholodeckInterval);
  56. console.log("[PM Helper Script] Holodeck failed to load");
  57. }
  58. }
  59.  
  60. function startPMHelperScript()
  61. {
  62. if($("chat_tab_pane") != null)
  63. putOnPage();
  64. else
  65. {
  66. var force = new Element("a",{"style":"color:#CCCCCC;float:left;clear:both;"}).update("Force Load PM Script");
  67. force.onclick = tryPutOnPage;
  68. $$(".gamepage_header_outer")[0].down().insert({after:force});
  69. }
  70. }
  71.  
  72. function tryPutOnPage()
  73. {
  74. if($("chat_tab_pane") != null)
  75. putOnPage();
  76. }
  77.  
  78. function putOnPage() {
  79. dom.head = $$("head")[0];//console.log("Private Chat helper 21");
  80. dom.paneHeight = "height:" + $("chat_tab_pane").getStyle("height");//console.log("Private Chat helper 22");
  81. dom.tabElementGroup = $("main_tab_set");//console.log("Private Chat helper 23");
  82. dom.paneElementGroup = $("kong_game_ui");//console.log("Private Chat helper 24");
  83. dom.privateTab = new Element("li", {"class":"tab", "id":"private_tab"});//console.log("Private Chat helper 25");
  84. dom.privateTabTitle = new Element("a", {"href":"#private_tab_pane"}).update("Private");//console.log("Private Chat helper 26");
  85. dom.privatePaneElement = new Element("div", {"id":"private_tab_pane", "class":"tabpane", "style":dom.paneHeight})
  86. dom.disabledButtonStyle = new Element("style").update(".panel_body .btn:disabled {background: none repeat scroll 0 0 #CCCCCC; border: 1px solid #AAAAAA !important; color: #888888 !important; cursor: default; text-shadow: 0 0 0 black !important;}");
  87.  
  88. //console.log("Private Chat helper 3");
  89.  
  90. dom.CDa = dom.ChatDialogue;
  91. CDa.prototype = dom.CDprototype||dom.ChatDialogue.prototype;
  92.  
  93. //console.log("Private Chat helper 4");
  94.  
  95.  
  96. dom.tabContent = '<div id="script_credits_panel" class="collapsible_panel">' +
  97. '<p class="ug_handle panel_handle mvs spritegame opened_link"><a>Info</a></p>' +
  98. '<div id="script_credits" class="panel_body cntrToggle splittext smltxt-reset" style="">' +
  99. '<p>Private Chat rooms Expander Script v' + privateScriptVersion + '</p>' +
  100. '<p>Developed by <a href="http://www.kongregate.com/accounts/UnknownGuardian" target="_blank">UnknownGuardian</a></p>' +
  101. '<input id="pr-update-button" type="button" value="Check For Updates" class="btn btn_wide btn_action">' +
  102. '</div>' +
  103. '</div>' +
  104. '<div id="room_options_panel" class="collapsible_panel">' +
  105. '<p class="ug_handle panel_handle mvs spritegame opened_link"><a>Password Settings</a></p>' +
  106. '<div id="room_options" class="panel_body cntrToggle splittext smltxt-reset" style="">' +
  107. '<p><label>Room Password: </label>' +
  108. '<input id="pr-password" class="pr-listener" type="text"><br>' +
  109. '<em>People that PM you this password will be automatically invited.</em></p>' +
  110.  
  111. '<p><label>Password Enabled: </label>' +
  112. '<input id="pr-password-enabled" class="pr-listener" type="checkbox"><br>' +
  113. '<em>Invites will only be sent automatically if this box is checked.</em></p>' +
  114. '<input id="pr-save-pass-enabled" type="button" value="Save" class="btn btn_wide btn_action" disabled>' +
  115. '</div>' +
  116. '</div>' +
  117. '<div id="adv_options_panel" class="collapsible_panel">' +
  118. '<p class="ug_handle panel_handle mvs spritegame opened_link"><a>Access Settings</a></p>' +
  119. '<div id="adv_options" class="panel_body cntrToggle splittext smltxt-reset" style="">' +
  120. '<p><label>Blacklist Enabled: </label>' +
  121. '<input id="pr-blacklist-enabled" class="pr-listener" type="checkbox"><br>' +
  122. '<em>Enable blacklist.</em></p>' +
  123.  
  124. '<p><label>Username Blacklist: </label><br>' +
  125. '<textarea id="pr-blacklist" class="pr-listener" style="width:248px;" rows="3"></textarea><br>' +
  126. '<em>Comma delimited list of users to deny automatic invitation.</em></p>' +
  127.  
  128. '<p><label>Whitelist Enabled: </label>' +
  129. '<input id="pr-whitelist-enabled" class="pr-listener" type="checkbox"><br>' +
  130. '<em>Enable whitelist automatic invitation only.</em></p>' +
  131.  
  132. '<p><label>Username Whitelist: </label><br>' +
  133. '<textarea id="pr-whitelist" class="pr-listener" style="width:248px;" rows="3"></textarea><br>' +
  134. '<em>Comma delimited list of users to only send automatic invitation to.</em></p>' +
  135. '<input id="pr-save-list-enabled" type="button" value="Save" class="btn btn_wide btn_action" disabled>' +
  136. '</div>' +
  137. '</div>' +
  138. '<div id="adv_misc_panel" class="collapsible_panel">' +
  139. '<p class="ug_handle panel_handle mvs spritegame opened_link"><a>Miscellaneous</a></p>' +
  140. '<div id="adv_misc" class="panel_body cntrToggle splittext smltxt-reset" style="">' +
  141.  
  142. '<p><label>Show Whitelist Adding Prompt: </label>' +
  143. '<input id="pr-whitelist-add-prompt" type="checkbox"><br>' +
  144. '<em>Asks if you want to add a user who PMed you the correct password but is not on the enabled whitelist.</em></p>' +
  145. '</div>' +
  146. '</div>';
  147. privateRoomScript();
  148. }
  149.  
  150.  
  151.  
  152. /*
  153. * Scripts for UI on tab
  154. */
  155.  
  156. //start update------------>
  157. function buttonScriptUpdate() {
  158. var updateElement = new Element('script', {'type':'text/javascript', 'src':'http://www.profusiongames.com/kong/public-userscripts/update.js?r=' + r });
  159. var updateCallback = new Element('script', {'type':'text/javascript'}).update(hasUpdate);
  160. head.insert(updateCallback);
  161. head.insert(updateElement);
  162. return false;
  163. }
  164.  
  165. function hasUpdate(newVersion, url){
  166. dom.updateURL = url;
  167. if(newVersion != privateScriptVersion) {
  168. $('pr-update-button').value = "Click to update to v." + privateScriptVersion;
  169. $('pr-update-button').onclick = function() { window.open(updateURL); } ;
  170. }
  171. else {
  172. $('pr-update-button').value = "No Update Found";+
  173. $('pr-update-button').setAttribute('onclick', "");
  174. }
  175. }
  176. //end update------------>
  177.  
  178.  
  179. //start enabled------------>
  180. function buttonScriptSavePass() {
  181. var password = $('pr-password').getValue();
  182. Cookie.set('pr-password', password, 1000000,'/');
  183. var enabled = $('pr-password-enabled').checked;
  184. Cookie.set('pr-password-enabled', enabled, 1000000, '/');
  185. $('pr-save-pass-enabled').writeAttribute({'disabled':''});
  186. }
  187. //end enabled------------>
  188.  
  189.  
  190. //start list------------>
  191. function buttonScriptSaveList() {
  192. var blacklistEnabled = $('pr-blacklist-enabled').checked;
  193. Cookie.set('pr-blacklist-enabled', blacklistEnabled, 1000000, '/');
  194. var blacklist = $('pr-blacklist').getValue();
  195. Cookie.set('pr-blacklist', blacklist, 1000000,'/');
  196. var whitelistEnabled = $('pr-whitelist-enabled').checked;
  197. Cookie.set('pr-whitelist-enabled', whitelistEnabled, 1000000, '/');
  198. var whitelist = $('pr-whitelist').getValue();
  199. Cookie.set('pr-whitelist', whitelist, 1000000,'/');
  200. $('pr-save-list-enabled').writeAttribute({'disabled':''});
  201. }
  202. //end list------------>
  203.  
  204.  
  205.  
  206.  
  207. /*
  208. * Util functions for everyting else
  209. */
  210. function setFieldsToDefault()
  211. {
  212. var password = getPassword();
  213. var passwordElement = $("pr-password");
  214. passwordElement.setValue(password);
  215.  
  216. var enabled = getEnabled();
  217. var enabledElement = $("pr-password-enabled");
  218. //enabledElement.setValue(enabled);
  219. enabledElement.checked = enabled;
  220.  
  221. var blacklistEnabled = getBlacklistEnabled();
  222. var blacklistEnabledElement = $("pr-blacklist-enabled");
  223. //blacklistEnabledElement.setValue(blacklistEnabled);
  224. blacklistEnabledElement.checked = blacklistEnabled;
  225.  
  226. var blacklist = getBlacklist();
  227. var blacklistElement = $("pr-blacklist");
  228. blacklistElement.setValue(blacklist);
  229.  
  230. var whitelistEnabled = getWhitelistEnabled();
  231. var whitelistEnabledElement = $("pr-whitelist-enabled");
  232. //whitelistEnabledElement.setValue(whitelistEnabled);
  233. whitelistEnabledElement.checked = whitelistEnabled;
  234.  
  235. var whitelist = getWhitelist();
  236. var whitelistElement = $("pr-whitelist");
  237. whitelistElement.setValue(whitelist);
  238.  
  239. var whiteListAddPromptEnabled = getWhiteListAddPromptEnabled();
  240. var whiteListAddPromptElement = $("pr-whitelist-add-prompt");
  241. whiteListAddPromptElement.checked = whiteListAddPromptEnabled;
  242. }
  243. function hideActiveTab(event)
  244. {
  245. event.stop();
  246. $$(".tabpane").each(function(item) {
  247. if(item.id != 'private_tab_pane') item.setStyle({display:'none'});
  248. });
  249.  
  250. $$(".main_tabs")[0].childElements().each(function(item) {
  251. if(item.id == 'private_tab')
  252. {
  253. item.down("a").addClassName("active");
  254. $("private_tab_pane").setStyle({display:"block"});
  255. }
  256. else
  257. item.down("a").removeClassName("active");
  258. });
  259. }
  260.  
  261. function addActiveListenersToTabs()
  262. {
  263. $("main_tab_set").childElements().each(function(item) {
  264. if(item.id == 'private_tab')
  265. {
  266. //do nothing
  267. }
  268. else
  269. item.down("a").observe("click", deactivatePrivateTab);
  270. });
  271. dom.setInterval(function() {checkForActiveWindowsConflict() }, 3000);
  272. }
  273.  
  274. function checkForActiveWindowsConflict()
  275. {
  276. //visible tab
  277. var tab = $('private_tab_pane');
  278. if(tab.getStyle("display") == "block")
  279. {
  280. $$(".tabpane").each(function(item) {
  281. if(item.id == 'private_tab_pane'){}
  282. else if(item.getStyle("display") != "none")
  283. deactivatePrivateTab();
  284. });
  285. }
  286. }
  287.  
  288. function deactivatePrivateTab(event)
  289. {
  290. if(event != null) event.stop();
  291. $("private_tab").down("a").removeClassName("active");
  292. $("private_tab_pane").setStyle({display:"none"});
  293. }
  294.  
  295. function addActiveListenersToCollapsibles()
  296. {
  297. //new Effect.BlindDown(s,{duration:1})
  298. $$(".ug_handle").each(function(item) {
  299. item.observe("click", toggleCollapsiblePanel);
  300. });
  301. }
  302.  
  303. function toggleCollapsiblePanel(event)
  304. {
  305. event.stop();
  306. var item = this;
  307. var body = item.up().down(".panel_body");
  308. //Fix bugs with not showing
  309. if(item.hasClassName("open_link") && body.getStyle('display') == 'none')
  310. {
  311. item.removeClassName("opened_link");
  312. item.addClassName("closed_link");
  313. }
  314. else if(item.hasClassName("closed_link") && body.getStyle('display') != 'none')
  315. {
  316. item.removeClassName("closed_link");
  317. item.addClassName("opened_link");
  318. }
  319. if(item.hasClassName("opened_link"))
  320. {
  321. item.removeClassName("opened_link");
  322. item.addClassName("closed_link");
  323. new Effect.Fade(body,{duration:0.35})
  324. }
  325. else
  326. {
  327. item.removeClassName("closed_link");
  328. item.addClassName("opened_link");
  329. new Effect.Appear(body,{duration:0.35})
  330. }
  331. }
  332.  
  333. function addListenerToMiscGroup()
  334. {
  335. $("pr-whitelist-add-prompt").observe("click", toggleWhiteListAddingPrompt);
  336. }
  337.  
  338. function toggleWhiteListAddingPrompt()
  339. {
  340. var enabled = $("pr-whitelist-add-prompt").checked;
  341. Cookie.set("pr-whitelist-add-prompt", enabled, 10000, '/');
  342. }
  343.  
  344. function generateWhiteListAddLinkFor(user)
  345. {
  346. return "var newList = '" + user + "' + ', ';"+
  347. "var whitelist = Cookie.get('pr-whitelist');" +
  348. "if(whitelist == null) whitelist = '';" +
  349. "newList += whitelist;" +
  350. "var whitelistElement = $('pr-whitelist');"+
  351. "whitelistElement.setValue(newList);"+
  352. "Cookie.set('pr-whitelist', newList, 10000,'/');"+
  353. "this.parentNode.innerHTML = 'Added " + user + " to the whitelist!';" +
  354. "holodeck.sendPrivateRoomInvitation('" + user + "');" +
  355. "return false";
  356. }
  357.  
  358. function shouldInviteAutomatically(enabled, password, blacklistEnabled, blacklist, whitelistEnabled, whitelist, user, message)
  359. {
  360. var splitBlacklist = blacklist.split(/ ?, ?/);
  361. var splitWhitelist = whitelist.split(/ ?, ?/);
  362. if(whitelistEnabled)
  363. return enabled && password != "" && splitWhitelist.indexOf(user) != -1 && message.toLowerCase() == password.toLowerCase();
  364. else if(blacklistEnabled)
  365. return enabled && password != "" && splitBlacklist.indexOf(user) == -1 && message.toLowerCase() == password.toLowerCase();
  366. else
  367. return enabled && password != "" && message.toLowerCase() == password.toLowerCase();
  368. }
  369.  
  370. function usingWhiteListAndUserIsNotOnWhiteList(enabled, password, blacklistEnabled, blacklist, whitelistEnabled, whitelist, user, message)
  371. {
  372. var splitWhitelist = whitelist.split(/ ?, ?/);
  373. return whitelistEnabled && getWhiteListAddPromptEnabled() && splitWhitelist.indexOf(user) == -1 && message.toLowerCase() == password.toLowerCase();
  374. }
  375.  
  376. function addListenersToFieldsForSaving()
  377. {
  378. $$(".pr-listener").each(function(item) {
  379. if(item.type == "textarea"||item.type == "text")
  380. item.observe("input", enableSectionSaveButton);
  381. else if(item.type == "checkbox")
  382. item.observe("click", enableSectionSaveButton);
  383. });
  384. }
  385.  
  386. function enableSectionSaveButton(event)
  387. {
  388. this.up(".panel_body").down("input[type=button]").removeAttribute("disabled");
  389. }
  390.  
  391.  
  392.  
  393. /*
  394. * Settings getters/setters
  395. */
  396.  
  397. function getPassword() {
  398. var password = Cookie.get("pr-password");
  399. if(password == null)
  400. password = "";
  401. return password;
  402. }
  403.  
  404. function getEnabled() {
  405. var enabled = Cookie.get("pr-password-enabled");
  406. if(enabled == null) enabled = false;
  407. return enabled;
  408. }
  409.  
  410. function getBlacklistEnabled() {
  411. var enabled = Cookie.get("pr-blacklist-enabled");
  412. if(enabled == null) enabled = false;
  413. return enabled;
  414. }
  415.  
  416. function getBlacklist() {
  417. var blacklist = Cookie.get("pr-blacklist");
  418. if(blacklist == null)
  419. blacklist = "";
  420. return blacklist;
  421. }
  422.  
  423. function getWhitelistEnabled() {
  424. var enabled = Cookie.get("pr-whitelist-enabled");
  425. if(enabled == null) enabled = false;
  426. return enabled;
  427. }
  428.  
  429. function getWhitelist() {
  430. var blacklist = Cookie.get("pr-whitelist");
  431. if(blacklist == null)
  432. blacklist = "";
  433. return blacklist;
  434. }
  435.  
  436. function getWhiteListAddPromptEnabled() {
  437. var enabled = Cookie.get("pr-whitelist-add-prompt");
  438. if(enabled == null) enabled = false;
  439. return enabled;
  440. }
  441.  
  442.  
  443. function privateRoomScript()
  444. {
  445. console.log("Private Room Helper Script is starting up!")
  446. //var paneHeight = "height:" + $("chat_tab_pane").getStyle("height");
  447.  
  448. ///var tabElement = new Element("li", {"class":"tab", "id":"private_tab"});
  449. ///var aElement = new Element("a", {"href":"#private_tab_pane"}).update("Private");
  450. ///var paneElement = new Element("div", {"id":"private_tab_pane", "class":"tabpane", "style":paneHeight}).update(tabContent);
  451. privatePaneElement.update(dom.tabContent);
  452. console.log("Private Room Helper Script injected the tab")
  453.  
  454. ///var disabledButtonStyle = new Element("style").update(".panel_body .btn:disabled {background: none repeat scroll 0 0 #CCCCCC; border: 1px solid #AAAAAA !important; color: #888888 !important; cursor: default; text-shadow: 0 0 0 black !important;}");
  455. ///var head = $$("head")[0];
  456. ///var tabElementGroup = $("main_tab_set");
  457. ///var paneElementGroup = $("kong_game_ui");
  458. //var dom = (typeof unsafeWindow === "undefined"?window:unsafeWindow);
  459. //var CDa = dom.ChatDialogue;
  460. //CDa.prototype = dom.CDprototype||dom.ChatDialogue.prototype;
  461.  
  462. head.insert(disabledButtonStyle);
  463. privateTab.insert(privateTabTitle)
  464. tabElementGroup.insert({bottom:privateTab});
  465. paneElementGroup.insert({bottom:privatePaneElement});
  466. privateTabTitle.observe("click", hideActiveTab);
  467. ///head.insert(disabledButtonStyle);
  468. ///tabElement.insert(aElement);
  469. ///tabElementGroup.insert({bottom:tabElement});
  470. ///paneElementGroup.insert({bottom:paneElement});
  471. //aElement.observe("click", hideActiveTab);
  472.  
  473. //inject scripts into interactable elements
  474. $('pr-update-button').onclick = buttonScriptUpdate;
  475. $('pr-save-pass-enabled').onclick = buttonScriptSavePass;
  476. $('pr-save-list-enabled').onclick = buttonScriptSaveList;
  477.  
  478. setFieldsToDefault();
  479. addActiveListenersToTabs();
  480. addActiveListenersToCollapsibles();
  481. addListenerToMiscGroup();
  482. addListenersToFieldsForSaving();
  483.  
  484.  
  485. //actual chat interception and automation here.
  486. if(!CDa.prototype.showReceivedPMHelper)
  487. {
  488. CDa.prototype.showReceivedPMHelper = CDa.prototype.receivedPrivateMessage;
  489. }
  490. CDa.prototype.receivedPrivateMessage = function (a){
  491. console.log("[Recieved PM Private Chat Helper] " + a.data.from + ": " + a.data.message);
  492. console.log(a);
  493. if (a.data.success){
  494. var enabled = getEnabled();
  495. var password = getPassword()
  496. var blacklistEnabled = getBlacklistEnabled();
  497. var blacklist = getBlacklist();
  498. var whitelistEnabled = getWhitelistEnabled();
  499. var whitelist = getWhitelist();
  500. //if(enabled && password != "" && splitBlacklist.indexOf(a.data.from) == -1 && a.data.message.toLowerCase() == password.toLowerCase())
  501. if(shouldInviteAutomatically(enabled, password, blacklistEnabled, blacklist, whitelistEnabled, whitelist, a.data.from, a.data.message))
  502. holodeck.sendPrivateRoomInvitation(a.data.from);
  503.  
  504. this.showReceivedPMHelper(a);
  505.  
  506. if(usingWhiteListAndUserIsNotOnWhiteList(enabled, password, blacklistEnabled, blacklist, whitelistEnabled, whitelist, a.data.from, a.data.message))
  507. {
  508. //a.data.message += " <br><br>Private Room Helper - A WhiteList is enabled and this user is not on the whitelist but has the password. <a href='#''>Add this user to the WhiteList and Invite</a>";
  509.  
  510.  
  511. //$$(".whisper")[0].down(".message").innerHTML +=
  512. var helper = a.data.from + ' is not on the enabled whitelist. Would you like to <a href="#" onclick="' + generateWhiteListAddLinkFor(a.data.from) + '" >add ' + a.data.from + ' to whitelist and invite</a> right now?';
  513. this.displayUnsanitizedMessage("Private Helper",helper,{"class":"whisper received_whisper"},{non_user:true})
  514. //this.showReceivedPMHelper(container);
  515. }
  516.  
  517. }
  518. else
  519. {
  520. this.showReceivedPMHelper(a);
  521. }
  522. }
  523. }
  524. }
  525.  
  526.  
  527.  
  528.  
  529. // This injects our script onto the page.
  530. // Kinda borrowed from http://userscripts.org/scripts/review/125666
  531. // Borrowed from: http://stackoverflow.com/a/2303228
  532. var script = document.createElement('script');
  533. script.appendChild(document.createTextNode('('+ main +')();'));
  534. (document.body || document.head || document.documentElement).appendChild(script);