Advertisement
Guest User

Untitled

a guest
Jan 29th, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 52.36 KB | None | 0 0
  1. // ==UserScript==
  2. // @name SE
  3. // @namespace
  4. // @version SE 2.0
  5. // @description Productivity fixes for chattcentralen
  6. // @author
  7. // @match https://chattcentralen.se/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11.  
  12. (function() {
  13. 'use strict';
  14. loadConfig();
  15. console.log(config);
  16. document.title = "✉ Chattcentralen - " + window.location.pathname.substr(1);
  17. switch(window.location.pathname) {
  18. case '/':
  19. console.log("Main page: inserting username and password");
  20. if(config.username)
  21. document.getElementsByClassName('username')[0].value = config.username;
  22. if(config.password)
  23. document.getElementsByClassName('password')[0].value = config.password;
  24. document.getElementsByClassName('ui-button')[1].focus();
  25. if(config.autoLogin && document.getElementsByClassName("messages")[0].textContent.indexOf("Please enter") > -1) {
  26. console.log("Autologin");
  27. document.getElementsByClassName('ui-button')[1].click();
  28. }
  29. break;
  30. case '/messages':
  31. shimFunctions();
  32. case '/announcements':
  33. case '/statistics':
  34. if(config.showCounters) {
  35. createCounters();
  36. getStats();
  37. }
  38. registerHotkeys();
  39. createSettingsButton();
  40. if(config.goToMessagesFirst && document.referrer == window.location.origin+'/')
  41. window.location = window.location.origin+'/messages';
  42. break;
  43. }
  44. })();
  45.  
  46. function loadConfig() {
  47. console.log("Loading config");
  48. var defaults = {
  49. hotkeys: ['KeyQ', 'KeyW', 'KeyA', 'KeyS', 'KeyZ', 'KeyX', 'Digit1', 'Digit2', 'Digit5', 'KeyH', 'KeyK', 'Digit4', 'Digit5', 'KeyH', 'KeyK', 'ArrowRight'],
  50. username: '',
  51. password: '',
  52. autoLogin: false,
  53. showCounters: true,
  54. goToMessagesFirst: false,
  55. highlightMessagesNotes: true,
  56. focusTargetNotes: false,
  57. notificationSound: true
  58. };
  59.  
  60. var local = JSON.parse(localStorage.getItem('config'));
  61. if(local === null)
  62. local = defaults;
  63. for (let i in defaults)
  64. if (!local.hasOwnProperty(i))
  65. local[i] = defaults[i];
  66. for (let i in local)
  67. if (!defaults.hasOwnProperty(i))
  68. delete local[i];
  69. console.log("\tConfig loaded");
  70.  
  71. Notification.requestPermission().then(function(result) {
  72. local.showNotifications = result === "granted";
  73. });
  74. config = local;
  75. }
  76.  
  77. (function(){
  78. let allowCopyAndPaste = function(e){
  79. e.stopImmediatePropagation();
  80. return true;
  81. };
  82.  
  83. document.addEventListener('copy', allowCopyAndPaste, true);
  84. document.addEventListener('paste', allowCopyAndPaste, true);
  85. document.addEventListener('onpaste', allowCopyAndPaste, true);
  86. document.addEventListener('oncontextmenu', allowCopyAndPaste, true);
  87. document.addEventListener('contextmenu', allowCopyAndPaste, true);
  88. })();
  89.  
  90.  
  91. function focusMessageBox() {
  92. window.scroll(0, 0);
  93. document.getElementsByClassName('conversation-message-text')[0].focus();
  94. }
  95.  
  96. function getTargetName() {
  97. return document.getElementsByClassName('target-name')[0].textContent.slice(1);
  98. }
  99. function getUsername() {
  100. return document.getElementsByClassName("user")[0].textContent.match(/\w+/)[0];
  101. }
  102.  
  103. function notifyOperator() {
  104. if(document.hidden) {
  105. if(notifyOperator.notificationSound === undefined) {
  106. notifyOperator.notificationSound = new Audio("https://youtu.be/llcQu-XB6oE?t=10");
  107. }
  108. console.log("Sending notification");
  109. let oldTitle = document.title;
  110. let newTitle = "✉ New message!";
  111. let notification = new Notification("Chattcentralen", {body: "New message received!"});
  112. if(config.notificationSound) {
  113. notifyOperator.notificationSound.play();
  114. }
  115. setTimeout(() => {
  116. notification.close.bind(notification);
  117. }, 5000);
  118. var n = 0;
  119. function blinkTitle() {
  120. document.title = n%2 ? newTitle : oldTitle;
  121. n++;
  122. if(document.hidden)
  123. window.setTimeout(blinkTitle, 500);
  124. else
  125. document.title = oldTitle;
  126. }
  127. blinkTitle();
  128. window.focus();
  129. }
  130. }
  131.  
  132. function highlightMessagesNotes(element) {
  133. console.log("Highlighting messages and notes");
  134. let username = document.getElementsByClassName('target-name')[0].textContent.match(/\w+/)[0];
  135. for (let e of document.getElementsByClassName("from-to")) {
  136. if(e.textContent.indexOf(username) > -1) {
  137. e.parentElement.parentElement.style.background = highlightColor;
  138. }
  139. }
  140. let target = getTargetName();
  141.  
  142. }
  143.  
  144. /**
  145. * jQuery.autotype -
  146. */
  147. (function($){
  148.  
  149. // code type constants
  150. var CHARACTER = 1,
  151. NON_CHARACTER = 2,
  152. MODIFIER_BEGIN = 3,
  153. MODIFIER_END = 4,
  154. isNullOrEmpty = function(val) { return val === null || val.length === 0; },
  155. isUpper = function(char) { return char.toUpperCase() === char; },
  156. isLower = function(char) { return char.toLowerCase() === char; },
  157. areDifferentlyCased = function(char1,char2) {
  158. return (isUpper(char1) && isLower(char2)) ||
  159. (isLower(char1) && isUpper(char2));
  160. },
  161. convertCase = function(char) {
  162. return isUpper(char) ? char.toLowerCase() : char.toUpperCase();
  163. },
  164. parseCodes = function(value, codeMap) {
  165. // buffer to hold a collection of key/char code pairs corresponding to input string value
  166. var codes = [],
  167. // buffer to hold the name of a control key as it's being parsed
  168. definingControlKey = false,
  169. // hold a collection of currently pushed modifier keys
  170. activeModifiers = {
  171. alt: false,
  172. meta: false,
  173. shift: false,
  174. ctrl: false
  175. },
  176. explicitModifiers = $.extend({}, activeModifiers),
  177. // buffer to hold construction of current control key
  178. currentControlKey = '',
  179. previousChar = '',
  180. pushCode = function(opts) {
  181. codes.push($.extend({}, opts, activeModifiers));
  182. },
  183. pushModifierBeginCode = function(modifierName) {
  184. activeModifiers[modifierName] = true;
  185. pushCode({
  186. keyCode: codeMap[modifierName],
  187. charCode: 0,
  188. char: '',
  189. type: MODIFIER_BEGIN
  190. });
  191. },
  192. pushModifierEndCode = function(modifierName) {
  193. activeModifiers[modifierName] = false;
  194. pushCode({
  195. keyCode: codeMap[modifierName],
  196. charCode: 0,
  197. char: '',
  198. type: MODIFIER_END
  199. });
  200. };
  201.  
  202. for(var i=0;i<value.length;i++) {
  203. // if the character is about to define a control key
  204. if(!definingControlKey &&
  205. i <= value.length - 5 &&
  206. value.charAt(i) === '{' &&
  207. value.charAt(i+1) === '{')
  208. {
  209. // skip the next "{"
  210. i++;
  211.  
  212. definingControlKey = true;
  213. }
  214. // if the character is about to end definition of control key
  215. else if (definingControlKey &&
  216. i <= value.length - 2 &&
  217. value.charAt(i) === '}' &&
  218. value.charAt(i+1) === '}')
  219. {
  220. // skip the next "}"
  221. i++;
  222.  
  223. // check if this key is a modifier-opener (is a ctrl,alt,del,shift)
  224. if(activeModifiers[currentControlKey] !== undefined)
  225. {
  226. explicitModifiers[currentControlKey] = true;
  227. pushModifierBeginCode(currentControlKey);
  228. }
  229. // check if this key is a modifier-closer (is a /ctrl,/alt,/del,.shift)
  230. else if(activeModifiers[currentControlKey.substring(1)] !== undefined)
  231. {
  232. explicitModifiers[currentControlKey] = false;
  233. pushModifierEndCode(currentControlKey.substring(1));
  234. }
  235. // otherwise is some other kind of non-modifier control key
  236. else
  237. {
  238. pushCode({
  239. keyCode: codeMap[currentControlKey],
  240. charCode: 0,
  241. char: '',
  242. type: NON_CHARACTER,
  243. controlKeyName: currentControlKey
  244. });
  245. }
  246.  
  247. definingControlKey = false;
  248. currentControlKey = '';
  249. }
  250. // currently defining control key
  251. else if (definingControlKey)
  252. {
  253. currentControlKey += value.charAt(i);
  254. }
  255. // otherwise is just a text character
  256. else
  257. {
  258. var character = value.charAt(i);
  259.  
  260. // check for any implicitly changing of cases, and register presses/releases
  261. // of the shift key in accord with them.
  262. if(
  263. (!isNullOrEmpty(previousChar) && areDifferentlyCased(previousChar, character)) ||
  264. (isNullOrEmpty(previousChar) && isUpper(character))
  265. )
  266. {
  267. if(isUpper(character) && !activeModifiers.shift) {
  268. pushModifierBeginCode("shift");
  269. } else if (isLower(character) && activeModifiers.shift && !explicitModifiers.shift){
  270. pushModifierEndCode("shift");
  271. }
  272. }
  273.  
  274. // modify the current character if there are active modifiers
  275. if((activeModifiers.shift && isLower(character)) ||
  276. (!activeModifiers.shift && isUpper(character))) {
  277. // shift converts case
  278. character = convertCase(character);
  279. }
  280.  
  281. var code = {
  282. // if can't identify a keycode, just fudge with the char code.
  283. // nope, this isn't ideal by any means.
  284. keyCode: codeMap[character] || character.charCodeAt(0),
  285. charCode: character.charCodeAt(0),
  286. char: character,
  287. type: CHARACTER
  288. };
  289.  
  290. // modify the current character if there are active modifiers
  291. if(activeModifiers.alt ||
  292. activeModifiers.ctrl ||
  293. activeModifiers.meta) {
  294. // alt, ctrl, meta make it so nothing is typed
  295. code.char = '';
  296. }
  297. pushCode(code);
  298. if(code.char !== '') { previousChar = code.char; }
  299. }
  300. }
  301. return codes;
  302. },
  303. triggerCodeOnField = function(code, field) {
  304. // build up base content that every event should contain
  305. // with information about whether certain chord keys are
  306. // simulated as being pressed
  307. var evnt = {
  308. altKey: code.alt,
  309. metaKey: code.meta,
  310. shiftKey: code.shift,
  311. ctrlKey: code.ctrl
  312. };
  313.  
  314. // build out 3 event instances for all the steps of a key entry
  315. var keyDownEvent = $.extend($.Event(), evnt, {type:'keydown', keyCode: code.keyCode, charCode: 0, which: code.keyCode});
  316. var keyPressEvent = $.extend($.Event(), evnt, {type:'keypress', keyCode: 0, charCode: code.charCode, which: code.charCode || code.keyCode});
  317. var keyUpEvent = $.extend($.Event(), evnt, {type:'keyup', keyCode: code.keyCode, charCode: 0, which: code.keyCode});
  318.  
  319. // go ahead and trigger the first 2 (down and press)
  320. // a keyup of a modifier shouldn't also re-trigger a keydown
  321. if(code.type !== MODIFIER_END) {
  322. field.trigger(keyDownEvent);
  323. }
  324.  
  325. // modifier keys don't have a keypress event, only down or up
  326. if(code.type !== MODIFIER_BEGIN && code.type !== MODIFIER_END) {
  327. field.trigger(keyPressEvent);
  328. }
  329.  
  330. // only actually add the new character to the input if the keydown or keypress events
  331. // weren't cancelled by any consuming event handlers
  332. if(!keyDownEvent.isPropagationStopped() &&
  333. !keyPressEvent.isPropagationStopped()) {
  334. if(code.type === NON_CHARACTER) {
  335. switch(code.controlKeyName) {
  336. case 'enter':
  337. field.val(field.val() + "\n");
  338. break;
  339. case 'back':
  340. field.val(field.val().substring(0,field.val().length-1));
  341. break;
  342. }
  343. } else {
  344. field.val(field.val() + code.char);
  345. }
  346. }
  347.  
  348. // then also trigger the 3rd event (up)
  349. // a keydown of a modifier shouldn't also trigger a keyup until coded
  350. if(code.type !== MODIFIER_BEGIN) {
  351. field.trigger(keyUpEvent);
  352. }
  353. },
  354. triggerCodesOnField = function(codes, field, delay, global) {
  355. if(delay > 0) {
  356. codes = codes.reverse();
  357. var keyInterval = global.setInterval(function(){
  358. var code = codes.pop();
  359. triggerCodeOnField(code, field);
  360. if(codes.length === 0) {
  361. global.clearInterval(keyInterval);
  362. field.trigger('autotyped');
  363. }
  364. }, delay);
  365. } else {
  366. $.each(codes,function(){
  367. triggerCodeOnField(this, field);
  368. });
  369. field.trigger('autotyped');
  370. }
  371. };
  372.  
  373. $.fn.autotype = function(value, options) {
  374. if(value === undefined || value === null) { throw("Value is required by jQuery.autotype plugin"); }
  375. var settings = $.extend({}, $.fn.autotype.defaults, options);
  376.  
  377. // 1st Pass
  378. // step through the input string and convert it into
  379. // a logical sequence of steps, key, and charcodes to apply to the inputs
  380. var codes = parseCodes(value, settings.keyCodes[settings.keyBoard]);
  381.  
  382. // 2nd Pass
  383. // Run the translated codes against each input through a realistic
  384. // and cancelable series of key down/press/up events
  385. return this.each(function(){ triggerCodesOnField(codes, $(this), settings.delay, settings.global); });
  386. };
  387.  
  388. $.fn.autotype.defaults = {
  389. version: '0.5.0',
  390. keyBoard: 'enUs',
  391. delay: 0,
  392. global: window,
  393. keyCodes: {
  394. enUs: { 'back':8,'ins':45,'del':46,'enter':13,'shift':16,'ctrl':17,'meta':224,
  395. 'alt':18,'pause':19,'caps':20,'esc':27,'pgup':33,'pgdn':34,
  396. 'end':35,'home':36,'left':37,'up':38,'right':39,'down':40,
  397. 'printscr':44,'num0':96,'num1':97,'num2':98,'num3':99,'num4':100,
  398. 'num5':101,'num6':102,'num7':103,'num8':104,'num9':105,
  399. 'multiply':106,'add':107,'subtract':109,'decimal':110,
  400. 'divide':111,'f1':112,'f2':113,'f3':114,'f4':115,'f5':116,
  401. 'f6':117,'f7':118,'f8':119,'f9':120,'f10':121,'f11':122,
  402. 'f12':123,'numlock':144,'scrolllock':145,' ':9,' ':32,
  403. 'tab':9,'space':32,'0':48,'1':49,'2':50,'3':51,'4':52,
  404. '5':53,'6':54,'7':55,'8':56,'9':57,')':48,'!':49,'@':50,
  405. '#':51,'$':52,'%':53,'^':54,'&':55,'*':56,'(':57,';':186,
  406. '=':187,',':188,'-':189,'.':190,'/':191,'[':219,'\\':220,
  407. ']':221,"'":222,':':186,'+':187,'<':188,'_':189,'>':190,
  408. '?':191,'{':219,'|':220,'}':221,'"':222,'a':65,'b':66,'c':67,
  409. 'd':68,'e':69,'f':70,'g':71,'h':72,'i':73,'j':74,'k':75,
  410. 'l':76,'m':77,'n':78,'o':79,'p':80,'q':81,'r':82,'s':83,
  411. 't':84,'u':85,'v':86,'w':87,'x':88,'y':89,'z':90,'A':65,
  412. 'B':66,'C':67,'D':68,'E':69,'F':70,'G':71,'H':72,'I':73,
  413. 'J':74,'K':75,'L':76,'M':77,'N':78,'O':79,'P':80,'Q':81,
  414. 'R':82,'S':83,'T':84,'U':85,'V':86,'W':87,'X':88,'Y':89,'Z':90, 'Å':197, 'Ä':196, 'Ö':214}
  415. }
  416. };
  417.  
  418. })(jQuery);
  419.  
  420. window.afterConversationLoaded = function() {
  421. console.log("Loaded conversation");
  422. getStats();
  423. notifyOperator();
  424.  
  425. console.log("Registering emoji click refocusing");
  426. for(let e of document.getElementsByClassName('emoji-insert')) {
  427. e.addEventListener('click', focusMessageBox);
  428. }
  429.  
  430. console.log("Registering automatic photo adding");
  431. for(let e of document.getElementById('AddMediaDialog').getElementsByClassName("mediaAddContainer")) {
  432. e.addEventListener('click', () => {
  433. e.getElementsByTagName("img")[0].click();
  434. e.getElementsByTagName("input")[0].click();
  435. $('#btnAddMedia').button('enable')[0].click();
  436. focusMessageBox();
  437. });
  438. }
  439.  
  440. let highlightColor = "rgb(255, 211, 20)";
  441. var target = document.getElementById('conversation-content');
  442. if(config.highlightMessagesNotes) {
  443. console.log("Highlighting own messages");
  444. for(let e of document.getElementById("conversation-messages").getElementsByClassName('message-text')) {
  445. let parentParent = e.parentElement.parentElement;
  446. if(parentParent.textContent.slice(1).indexOf(getTargetName()) > -1)
  447. parentParent.style.background = "rgb(145, 145, 145)";
  448. else
  449.  
  450. parentParent.style.background = "rgb(107, 107, 107)";
  451. }
  452.  
  453.  
  454.  
  455. console.log("Highlighting target notes");
  456. let ending = getTargetName().toUpperCase();
  457. for(let e of document.getElementsByClassName('player-last-notes')[0].children) {
  458. if(e.children[2].textContent.toUpperCase().replace(/[\ \)]*$/,"").indexOf(ending) > -1) {
  459. e.style.background = highlightColor;
  460. }
  461. }
  462. }
  463.  
  464.  
  465. let targetNotesContent = document.getElementsByClassName('target-note-content')[0];
  466. document.addEventListener('selectionchange', (e) => {
  467. let anchor = document.getSelection().anchorNode;
  468. if(anchor && anchor.nodeType === Node.TEXT_NODE) {
  469. anchor = anchor.parentElement;
  470. }
  471. if(anchor.classList.contains('message-text')) {
  472. targetNotesContent.value = window.getSelection().toString();
  473. }
  474. });
  475. }
  476.  
  477. function shimFunctions() {
  478. /*
  479. if(config.showCounters) {
  480. console.log("Adding statistics counters");
  481. loadConversation = (function() {
  482. var cached_loadConversation = loadConversation;
  483. return function() {
  484. var result = cached_loadConversation.apply(this, arguments);
  485. afterConversationLoaded();
  486. return result;
  487. };
  488. })();
  489. }
  490. /*/
  491. console.log("Adding statistics counters????");
  492. if(config.showCounters) {
  493. console.log("Adding statistics counters");
  494. loadConversation = new Function(
  495. "id",
  496. "doPreload",
  497. "review",
  498. "fromClaimNext",
  499. "claimNextType",
  500. loadConversation.toString()
  501. .replace("userIdleTime = 0;", "userIdleTime = 0;\n\t\tafterConversationLoaded();")
  502. .replace(/^function[^{]+{/i,"")
  503. .replace(/}[^}]*$/i, "")
  504. );
  505. }
  506. //*/
  507. console.log("Shimming playerNotes");
  508. playerNotes = (function() {
  509. var cached_playerNotes = playerNotes;
  510. return function() { // Swaps category dropdown and log button for player
  511. var result = cached_playerNotes.apply(this, arguments);
  512. let e = document.getElementsByClassName('player-note-categories')[0];
  513. let f = document.getElementsByClassName('player-save-note')[0];
  514. if(e !== undefined && f !== undefined) {
  515. f.insertAdjacentElement('beforebegin', e);
  516. f.addEventListener('click', focusMessageBox);
  517. }
  518. return result;
  519. };
  520. })();
  521. console.log("Shimming targetNotes");
  522. targetNotes = (function() { // Swaps category dropdown and log button for player
  523. var cached_targetNotes = targetNotes;
  524. return function() {
  525. var result = cached_targetNotes.apply(this, arguments);
  526. let e = document.getElementsByClassName('target-note-categories')[0];
  527. let f = document.getElementsByClassName('target-save-note')[0];
  528. if(e !== undefined && f !== undefined) {
  529. f.insertAdjacentElement('beforebegin', e);
  530. if(config.focusTargetNotes) {
  531. f.addEventListener('click', (() => $('.target-note-content')[0].focus()));
  532. } else {
  533. f.addEventListener('click', focusMessageBox);
  534. }
  535. }
  536. return result;
  537. };
  538. })();
  539. }
  540.  
  541. function registerHotkeys() {
  542. console.log("Registering hotkeys");
  543. var helperFunctions = new Map();
  544. var helpFunctions = new Map();
  545.  
  546. helperFunctions.set(config.hotkeys[0], // Go to player note
  547. () => {
  548. let e = document.getElementsByClassName('player-note-content')[0];
  549. if(e !== undefined) {
  550. var targetNameNote = " (" + getTargetName() + ")";
  551. if(!e.value.endsWith(targetNameNote))
  552. e.value += targetNameNote;
  553. $.fancybox.close();
  554. e.focus();
  555. let pos = e.value.length - targetNameNote.length;
  556. e.setSelectionRange(pos, pos);
  557. }
  558. });
  559. helperFunctions.set(config.hotkeys[1], // Go to target note
  560. () => {
  561. let e = document.getElementsByClassName('target-note-content')[0];
  562. if(e !== undefined) {
  563. $.fancybox.close();
  564. e.focus();
  565. }
  566. });
  567. helperFunctions.set(config.hotkeys[2], focusMessageBox); // Go to message box
  568. helperFunctions.set(config.hotkeys[3], // Open latest attachment
  569. () => {
  570. let e = document.getElementsByClassName('conversation-attachment')[0];
  571. if(e !== undefined) {
  572. e.click();
  573. }
  574. });
  575. helperFunctions.set(config.hotkeys[4], // Add image
  576. () => {
  577. let e = document.getElementsByClassName('message-addmedia-button')[0];
  578. if(e !== undefined) {
  579. e.click();
  580. }
  581. });
  582. helperFunctions.set(config.hotkeys[5], // Remove image
  583. () => {
  584. let e = document.getElementsByClassName('message-delmedia-button')[0];
  585. if(e !== undefined) {
  586. e.click();
  587. }
  588. });
  589. helperFunctions.set(config.hotkeys[6], // Go to Messages
  590. () => {
  591. $('button[rel="messages"]').click();
  592. });
  593. helperFunctions.set(config.hotkeys[7], // Go to Statistics
  594. () => {
  595. $('button[rel="statistics"]').click();
  596. /*console.log("Sending notification");
  597. window.setTimeout(() => {
  598. notifyOperator();
  599. }, 2000);*/
  600. });
  601. helperFunctions.set(config.hotkeys[10], // Go to Settings
  602. () => {
  603. $('button[rel="settings"]').click();
  604. });
  605. helperFunctions.set(config.hotkeys[11], // Generate Hobbies and save to Notes
  606. () => {
  607. // Adds :containsNC - non case-sensitive :contains
  608. $.extend($.expr[":"], {
  609. "containsNC": function(elem, i, match, array) {
  610. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  611. }
  612. });
  613.  
  614. var interests = [' astrologi' ,'bakning' ,'basta' ,'bilar' ,'bio' ,'brädspel' ,'båtar' ,'böcker' ,'campa' ,'cykla' ,'dansa' ,'datorer' ,'dekorera' ,'djur' ,'film' ,'fiska' ,'flyga' ,'fotboll' ,'fotografera' ,'friluftsliv' ,'friskvård' ,'gymnastik' ,'hund' ,'husdjur' ,'hälsa' ,'jogga' ,'katt' ,'klättring' ,'konserter' ,'konst' ,'litteratur' ,'matlagning' ,'meditera' ,'motorcyklar' ,'museum' ,'musik' ,'måla' ,'natur' ,'opera' ,'politik' ,'promenera' ,'pyssla' ,'religion' ,'renovera' ,'resa' ,'rida' ,'segla' ,'simma' ,'skidor' ,'skådespel' ,'social media' ,'spela kort' ,'tatueringar' ,'teater' ,'teckna' ,'teknik' ,'trädgård' ,'träna' ,'tv' ,'umgås' ,'uteliv' ,'vandra' ,'vinprovning' ,'vintersport' ,'äta ute'];
  615.  
  616. var n = ~~(Math.random() * 4) + 2;
  617.  
  618. var rand = [];
  619. do {
  620. rand[rand.length] = interests.splice(Math.floor(Math.random() * interests.length), 1)[0];
  621. } while (rand.length < n);
  622.  
  623. var sex = rand;
  624.  
  625. // Extract target name
  626. var targetName = $('.target-name').text();
  627. // Trim period from target name
  628. var targetNamee = targetName.substr(1);
  629. // Insert text to note
  630. $('.player-note-content.area').val(sex + ' (' + targetNamee + ')');
  631.  
  632. // Select note category
  633. var category = 'Hobby';
  634.  
  635. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  636. // Save note
  637. $('.player-save-note').trigger('click')
  638.  
  639. //Autotype text to Message
  640. $('.conversation-message-text').autotype(sex);
  641. });
  642. helperFunctions.set(config.hotkeys[12], // Generera Sexintressen + spara i Notes
  643. () => {
  644. // Adds :containsNC - non case-sensitive :contains
  645. $.extend($.expr[":"], {
  646. "containsNC": function(elem, i, match, array) {
  647. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  648. }
  649. });
  650.  
  651. var interests = [' analt' ,' bakifrån' ,' bli bunden' ,' att binda' ,' använda buttplug' ,' använda dildo' ,' dominans' ,' kyssar' ,' långa förspel' ,' missionären' ,' ögonbindel' ,' offentliga platser' ,' onani' ,' hårdare smisk' ,' att rida' ,' rollspel' ,' sexiga underkläder' ,' sexleksaker' ,' skeda' ,' att suga' ,' att svälja' ,' teasing' ,' vaniljsex'];
  652.  
  653. var n = ~~(Math.random() * 4) + 2;
  654.  
  655. var rand = [];
  656. do {
  657. rand[rand.length] = interests.splice(Math.floor(Math.random() * interests.length), 1)[0];
  658. } while (rand.length < n);
  659.  
  660. var sex = rand;
  661.  
  662. // Extract target name
  663. var targetName = $('.target-name').text();
  664. // Trim period from target name
  665. var targetNamee = targetName.substr(1);
  666. // Insert text to note
  667. $('.player-note-content.area').val(sex + ' (' + targetNamee + ')');
  668.  
  669. // Select note category
  670. var category = 'Sexuella preferenser';
  671.  
  672. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  673. // Save note
  674. $('.player-save-note').trigger('click')
  675.  
  676. //Autotype text to Message
  677. $('.conversation-message-text').autotype(sex);
  678.  
  679. });
  680. helperFunctions.set(config.hotkeys[13], // Player Jobb+Spara i Notes
  681. () => {
  682. // Adds :containsNC - non case-sensitive :contains
  683. $.extend($.expr[":"], {
  684. "containsNC": function(elem, i, match, array) {
  685. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  686. }
  687. });
  688.  
  689. //Extract Player Proffesion//
  690. var playerjob = $('.profession').text().toLowerCase();
  691. // Extract target name
  692. var targetName = $('.target-name').text();
  693. // Trim period from target name
  694. var targetNamee = targetName.substr(1);
  695. // Insert text to note
  696. $('.player-note-content.area').val(playerjob + ' (' + targetNamee + ')');
  697. // Select note category
  698. var category = 'jobb/utbildning';
  699. // Categories
  700. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  701. // Save note
  702. $('.player-save-note').trigger('click')
  703.  
  704. //paste proffesion//
  705.  
  706. $('.conversation-message-text').autotype(playerjob);
  707. });
  708. helperFunctions.set(config.hotkeys[14], // Retrieve Player Name and Save to Notes
  709. () => {
  710. // Adds :containsNC - non case-sensitive :contains
  711. $.extend($.expr[":"], {
  712. "containsNC": function(elem, i, match, array) {
  713. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  714. }
  715. });
  716.  
  717. var playername = $('.real_name').text();
  718. // Extract target name
  719. var targetName = $('.target-name').text();
  720. // Trim period from target name
  721. var targetNamee = targetName.substr(1);
  722. // Insert text to note
  723. $('.player-note-content.area').val(playername + ' (' + targetNamee + ')');
  724. // Select note category
  725. var category = 'namn';
  726. // Categories
  727. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  728. // Save note
  729. $('.player-save-note').trigger('click')
  730.  
  731. //Autotype text to Message
  732. $('.conversation-message-text').autotype(playername);
  733. });
  734.  
  735. helpFunctions.set(config.hotkeys[15], // Target Notes+Autoval av Kategori
  736. () => {
  737. // Adds :containsNC - non case-sensitive :contains
  738. $.extend($.expr[":"], {
  739. "containsNC": function(elem, i, match, array) {
  740. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  741. }
  742. });
  743.  
  744. // Extract selected text
  745. var note = window.getSelection().toString();
  746. // Modify and verify selected text
  747. var text = prompt('Target note:', note);
  748. // Insert text to note
  749. $('.target-note-content.area').val(text);
  750. // Select note category
  751. var category;
  752. if (text.match(/bild|selfie|kuk|gif/i)) {
  753. var category = 'Bilder';
  754. } else if (text.match(/jobb|arbetar|plugg|stude|pension|kör buss|kör lastbil|kör taxi|på järnvägen|chef|kock|vakt|pilot|polis|bagare|förare|frisör|jurist|läkare|lärare|ledare|målare|montör|rektor|advokat|konsult|optiker|pedagog|säljare|väktare|arbetare|arkitekt|brandman|chaufför|designer|fotograf|ingenjör|operatör|snickare|arbetslös|assistent|bartender|maskinist|sköterska|veterinär|elektriker|journalist|hantverkare|programmerare|projektledare|mekaniker|driver eget|företag|firma|måleri|snickeri|verkstad/i)) {
  755. var category = 'Jobb/Utbildning';
  756. } else if (text.match(/hund|katt|husdjur|spela|träna|astrologi|basta|bakning|bilar|bio|film|brädspel|båtar|böcker|litteratur|campa|cykla|dansa|datorer|dekorera|djur|fiska|flyga|fotboll|fotografera|friluftsliv|gymnastik|hälsa|friskvård|jogga|klättring|konserter|konst|museum|matlagning|meditera|motorcyklar|musik|måla|natur|nyheter|politik|opera|promenera|pyssla|religion|renovera|resa|rida|resa|segla|simma|skidor|skådespel|social media|tatueringar|teater|teckna|teknik|trädgård|träna|tv|umgås|uteliv|vandra|vinprovning|vintersport|äta ute/i)) {
  757. var category = 'Hobby';
  758. } else if (text.match(/singel|barn|son|söner|döttrar|dotter|fru|särbo|sambo|gift|skild|änk/i)) {
  759. var category = 'Familj/Relationer';
  760. } else if (text.match(/bor/i)) {
  761. var category = 'Stad';
  762. } else if (text.match(/heter|Abbe|Abdullah|Abraham|Adam|Adel|Adis|Agris|Agua|Alaga|Albert|Albin|Alek|Alex|Alexander|Alf|Alfred|Ali|Allan|Amir|Anders|Andreas|André|Andy|Ante|Anton|Ants|Ari|Aristides|Arne|Arto|Arvid|Axel|Azar|Behzad|Bengt|Bengt-Åke|Benny|Bernt|Bernt-Olov|Bernth|Bert|Bertil|Birger|Birgir|Bjarne|Björn|Bo|Bogdan|Boris|Bosse|Bror|Börge|Börje|Calle|Calmer|Carl|Carsten|Chaban|Charlie|Chris|Christer|Christian|Christoffer|Christophe|Christopher|Claes|Classe|Claudiu|Conny|Costas|Dan|Dane|Daniel|Danne|David|Davide|Davor|Deivys|Demir|Dennis|Derek|Dick|Edi|Edvard|Edvin|Ego|Eije|Einar|Eki|Elias|Emanuel|Emil|Emir|Eric|Erik|Erland|Evert|Ewen|Farid|Filip|Folke|Francesco|Franjo|Frank|Freddie|Fredrik|Friedhelm|Frode|Fugus|Gabriel|Georg|Gerald|Gerd|Gerra|Gert|Gert-Owe|Getahun|Gunnar|Gustaf|Gustav|Göran|Görgen|Görgen|Gösta|Göte|Habib|Hans|Hans Börge|Harald|Harri|Harry|Hasse|Helmut|Henke|Henrik|Henry|Hossein|Hugo|Håkan|Ihsan|Inge|Ingemar|Ingmar|Ingvar|Isaac|Isac|Isak|Ismail|Ivar|Jack|Jakob|Jan|Janne|Jean|Jens|Jerry|Jesper|Jhonatan|Jimmy|Joakim|Joar|Jocke|Joel|Johan|Johannes|John|Johnny|Jon|Jonas|Jonathan|Jonny|Juan|Julius|Jyrki|Jörgen|Kai|Kaj|Kalle|Kari|Karl|Karl Gustav|Karl-Erik|Karl-Olov|Karol|Ken|Kenneth|Kenny|Kent|Kenta|Kenth|Kieren|Kim|Kjell|Kjelle|Klas|Knut|Krister|Kristian|Kristoffer|Kurt|Kurt-Lennart|Kutte|Kåge|Lars|Lars Olov|Larsa|Larte|Larui|Lasse|Leif|Lellas|Lennart|Leo|Leon|Linus|Lucky|Ludvig|Magnus|Manne|Manuel|Marco|Marcus|Marek|Marian|Mario|Mark|Marko|Markus|Martin|Mathias|Mats|Matsvo|Matte|Matti|Mattias|Max|Melker|Michael|Michel|Micke|Mika|Mikael|Mikael|Mille|Miron|Misa|Mohamed|Mohammed|Morgan|Musa|Mustapha|Måns|Mårten|Nicke|Nicklas|Nicky|Niclas|Niklas|Nille|Nils|Nisse|Nurko|Ola|Oliver|Olle|Olof|Olov|Oscar|Oskar|Ove|Owe|Parsia|Pasi|Patric|Patrick|Patrik|Paul|Pavel|Peder|Pelle|Peo|Per|Per-Olof|Peter|Pether|Petter|Philip|Pierre|Pontus|Poul|Putte|Pär|Rafael|Rafeo|Ragnar|Raimo|Rasmus|Riccardo|Richard|Rickard|Rikard|Rimtaf|Risto|Robban|Robert|Robin|Roffe|Roger|Roland|Rolf|Rolle|Romii|Ronnie|Ronny|Ruben|Rune|Sabah|Sajad|Saladin|Sam|Samuel|Sebastian|Seed|Serko|Sigge|Silvo|Simon|Stefan|Steffen|Sten|Sten-Åke|Stig|Stig-Evert|Sture|Sune|Sven|Sven Erik|Sven Ingvar|Sven Åke|Sven-Erik|Sven-Gunnar|Sven-Åke|Sören|Tage|Taha|Tapio|Ted|Thomas|Thorbjörn|Tobbe|Tobias|Tobias|Tom|Tomas|Tommy|Tony|Torbjörn|Tord|Tore|Torgny|Torsten|Uffe|Ulf|Ulrik|Uno|Urban|Valentin|Victor|Viktor|Vilhelm|Waldemar|Wiktor|Wilhelm|William|Wojtek|Yngve|Yousef|Zdislav|Åke|Öyvind/i)) {
  763. var category = 'Namn';
  764. } else if (text.match(/anal|bakifrån|bunden|buttplug|dildo|dominans|kyssar|förspel|missionär|mystik|offentlig|onan|piska|rollspel|underkläder|sexleksaker|strap-on|suga|svälja|teasing|trekant|kondom|vaniljsex|wet/i)) {
  765. var category = 'Sexuella preferenser';
  766. } else if (text.match(/bil|båt|mc|motorcykel/i)) {
  767. var category = 'Transportmedel';
  768. } else if (text.match(/mejl|mail|telef|skype|kik|fb|facebook/i)) {
  769. var category = 'Mejl och telefon';
  770. } else if (text.match(/sjuk/i)) {
  771. var category = 'Hälsa';
  772. } else var category = prompt('Select category:');
  773. // Categories
  774. $('select.target-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  775. // Save note
  776. $('.target-save-note').trigger('click')
  777. //Focus TextField
  778. window.scroll(0, 0);
  779. $( ".conversation-message-text" ).focus();
  780. });
  781. helpFunctions.set(config.hotkeys[16], // Save to Target Aktuellt
  782. () => {
  783. // Adds :containsNC - non case-sensitive :contains
  784. $.extend($.expr[":"], {
  785. "containsNC": function(elem, i, match, array) {
  786. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  787. }
  788. });
  789.  
  790. // Extract selected text
  791. var note = window.getSelection().toString();
  792. // Insert text to note
  793. $('.target-note-content.area').val(note);
  794. // Select note category
  795. var category = 'aktuella saker';
  796. // Categories
  797. $('select.target-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  798. // Save note
  799. $('.target-save-note').trigger('click')
  800. //Focus TextField
  801. window.scroll(0, 0);
  802. $( ".conversation-message-text" ).focus();
  803. });
  804. helpFunctions.set(config.hotkeys[17], // Save To Player Auto Category
  805. () => {
  806. // Adds :containsNC - non case-sensitive :contains
  807. $.extend($.expr[":"], {
  808. "containsNC": function(elem, i, match, array) {
  809. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  810. }
  811. });
  812. //Function to focus end of text
  813. (function($){
  814. $.fn.focusTextToEnd = function(){
  815. this.focus();
  816. var $thisVal = this.val();
  817. this.val('').val($thisVal);
  818. return this;
  819. }
  820. }(jQuery));
  821. // Extract selected text
  822. var note = window.getSelection().toString();
  823. // Modify and verify selected text
  824. var text = prompt('Player note:', note);
  825. // Extract target name
  826. var targetName = $('.target-name').text();
  827. // Trim period from target name
  828. var targetNamee = targetName.substr(1);
  829. // Insert text to note
  830. $('.player-note-content.area').val(text + ' (' + targetNamee + ')');
  831. // Select note category
  832. var category;
  833. if (text.match(/bild|selfie|target|kuk|gif|naken/i)) {
  834. var category = 'Bilder';
  835. } else if (text.match(/jobb|arbetar|plugga|stude|pension|kör lastbil|kör buss|kör taxi|på järnvägen|chef|kock|vakt|pilot|polis|bagare|förare|frisör|jurist|läkare|lärare|ledare|målare|montör|rektor|advokat|konsult|optiker|pedagog|säljare|väktare|arbetare|arkitekt|brandman|chaufför|designer|fotograf|ingenjör|operatör|snickare|arbetslös|assistent|bartender|maskinist|sköterska|veterinär|elektriker|journalist|hantverkare|programmerare|projektledare|mekaniker|driver eget|företag|firma|måleri|snickeri|verkstad/i)) {
  836. var category = 'Jobb/Utbildning';
  837. } else if (text.match(/hund|katt|husdjur|spela|träna|astrologi|basta|bakning|bilar|bio|film|brädspel|båtar|böcker|litteratur|campa|cykla|dansa|datorer|dekorera|djur|fiska|flyga|fotboll|fotografera|friluftsliv|gymnastik|hälsa|friskvård|jogga|klättring|konserter|konst|museum|matlagning|meditera|motorcyklar|musik|måla|natur|nyheter|politik|opera|promenera|pyssla|religion|renovera|resa|rida|resa|segla|simma|skidor|skådespel|social media|tatueringar|teater|teckna|teknik|trädgård|träna|tv|umgås|uteliv|vandra|vinprovning|vintersport|äta ute/i)) {
  838. var category = 'Hobby';
  839. } else if (text.match(/singel|barn|son|dotter|fru|särbo|sambo|gift|skild|änk/i)) {
  840. var category = 'Familj/Relationer';
  841. } else if (text.match(/bor/i)) {
  842. var category = 'Stad';
  843. } else if (text.match(/heter/i)) {
  844. var category = 'Namn';
  845. } else if (text.match(/anal|bakifrån|bunden|buttplug|dildo|dominans|kyssar|förspel|missionär|mystik|offentlig|onan|piska|rollspel|underkläder|sexleksaker|strap-on|suga|svälja|teasing|trekant|kondom|vaniljsex|wet/i)) {
  846. var category = 'Sexuella preferenser';
  847. } else if (text.match(/bil|båt|mc|motorcykel/i)) {
  848. var category = 'Transportmedel';
  849. } else if (text.match(/mejl|mail|telef|skype|kik|fb|facebook/i)) {
  850. var category = 'Mejl och telefon';
  851. } else if (text.match(/sjuk/i)) {
  852. var category = 'Hälsa';
  853. } else var category = prompt('Select category:');
  854. // Categories
  855. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  856. // Save note
  857. $('.player-save-note').trigger('click')
  858. //Focus TextField
  859. window.scroll(0, 0);
  860. $('.conversation-message-text').focusTextToEnd();
  861. });
  862. helpFunctions.set(config.hotkeys[18], // Player Save to Stad
  863. () => {
  864. // Adds :containsNC - non case-sensitive :contains
  865. $.extend($.expr[":"], {
  866. "containsNC": function(elem, i, match, array) {
  867. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  868. }
  869. });
  870. //Function to focus end of text
  871. (function($){
  872. $.fn.focusTextToEnd = function(){
  873. this.focus();
  874. var $thisVal = this.val();
  875. this.val('').val($thisVal);
  876. return this;
  877. }
  878. }(jQuery));
  879. // Extract selected text
  880. var note = window.getSelection().toString();
  881. // Extract target name
  882. var targetName = $('.target-name').text();
  883. // Trim period from target name
  884. var targetNamee = targetName.substr(1);
  885. // Insert text to note
  886. $('.player-note-content.area').val(note + ' (' + targetNamee + ')');
  887. // Select note category
  888. var category = 'stad';
  889. // Categories
  890. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  891. // Save note
  892. $('.player-save-note').trigger('click')
  893. //Focus TextField
  894. window.scroll(0, 0);
  895. $('.conversation-message-text').focusTextToEnd();
  896.  
  897. });
  898. helpFunctions.set(config.hotkeys[19], // Player Save to Aktuellt
  899. () => {
  900. // Adds :containsNC - non case-sensitive :contains
  901. $.extend($.expr[":"], {
  902. "containsNC": function(elem, i, match, array) {
  903. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  904. }
  905. });
  906. //Function to focus end of text
  907. (function($){
  908. $.fn.focusTextToEnd = function(){
  909. this.focus();
  910. var $thisVal = this.val();
  911. this.val('').val($thisVal);
  912. return this;
  913. }
  914. }(jQuery));
  915. // Extract selected text
  916. var note = window.getSelection().toString();
  917. // Extract target name
  918. var targetName = $('.target-name').text();
  919. // Trim period from target name
  920. var targetNamee = targetName.substr(1);
  921. // Insert text to note
  922. $('.player-note-content.area').val(note + ' (' + targetNamee + ')');
  923. // Select note category
  924. var category = 'Aktuella saker';
  925. // Categories
  926. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  927. // Save note
  928. $('.player-save-note').trigger('click')
  929. //Focus TextField
  930. window.scroll(0, 0);
  931. $('.conversation-message-text').focusTextToEnd();
  932. });
  933.  
  934. //Key Event Listensers for Hotkeys
  935.  
  936. document.addEventListener('keyup', (e) =>{ // Send Mssg and Lap Time on hit Enter Key
  937. if (e.which == 13) {
  938. var isFocused = $(".conversation-message-text").is(":focus")
  939. var len = $('.conversation-message-text').val().length;
  940. if (len >= 75 && isFocused) {
  941. $('#counters-column5').trigger("click");
  942. $('.message-submit-button').trigger("click");
  943. }}
  944. });
  945.  
  946.  
  947. document.addEventListener('keydown', (e) => { // Adds Alt Key event listeners for the hotkeys
  948. if(e.altKey && isOkHotkey(e.code)) {
  949. e.preventDefault();
  950. e.stopPropagation();
  951. let f = helperFunctions.get(e.code);
  952. if(f !== undefined) f();
  953. }
  954. });
  955.  
  956. document.addEventListener('keydown', (e) => { // Adds Ctrl Key event listeners for the hotkeys
  957. if(e.ctrlKey && isOkHotkey(e.code)) {
  958. e.preventDefault();
  959. e.stopPropagation();
  960. let r = helpFunctions.get(e.code);
  961. if(r !== undefined) r();
  962. }
  963. });
  964.  
  965.  
  966. console.log("\tHotkeys registered");
  967. }
  968.  
  969. function isOkHotkey(code) {
  970. return code.startsWith("Key") || code.startsWith("Digit") || code.startsWith("Numpad") || code.startsWith("Arrow") || code.startsWith("F") || code.startsWith("R");
  971. }
  972.  
  973. function createSettingsButton() {
  974. function addSetting(value, name) {
  975. var id_name = (name + 'Setting').replace(/[^A-Za-z_]/g,'');
  976. var label = document.createElement('label');
  977. label.innerHTML = name + ": ";
  978. label.setAttribute('for', id_name);
  979. label.style.gridColumn = '1';
  980. var element = document.createElement('input');
  981. if(typeof value == 'boolean') {
  982. element.type = 'checkbox';
  983. element.checked = value;
  984. } else {
  985. element.type = 'text';
  986. element.value = value !== undefined ? value : "";
  987. }
  988. element.id = id_name;
  989. element.name = id_name;
  990. element.style.gridColumn = '2';
  991. settingsDialog.appendChild(label);
  992. settingsDialog.appendChild(element);
  993. return element;
  994. }
  995.  
  996. function setHotkey(n, e) {
  997. if(isOkHotkey(e.code) || ['Backspace', 'Delete'].includes(e.code)) {
  998. e.preventDefault();
  999. e.stopPropagation();
  1000. var code = (['Backspace', 'Delete'].includes(e.code)) ? "" : e.code;
  1001. e.target.value = code;
  1002. config.hotkeys[n] = code;
  1003. }
  1004. }
  1005. console.log("Creating settings button");
  1006.  
  1007. var menu = $('#topmenu1')[0];
  1008. var settingsDialog = document.createElement('div');
  1009. settingsDialog.id = 'SettingsDialog';
  1010. settingsDialog.style.display = 'none';
  1011. settingsDialog.style.alignItems = 'center';
  1012.  
  1013. addSetting(config.username, 'Username') .addEventListener('change', (e) => {config.username = e.target.value;});
  1014. addSetting(config.password, 'Password') .addEventListener('change', (e) => {config.password = e.target.value;});
  1015. addSetting(config.autoLogin, 'Autologin') .addEventListener('change', (e) => {config.autoLogin = e.target.checked;});
  1016. addSetting(config.showCounters, 'Show counters') .addEventListener('change', (e) => {config.showCounters = e.target.checked;});
  1017. addSetting(config.goToMessagesFirst, 'Go to Messages after login')
  1018. .addEventListener('change', (e) => {config.goToMessagesFirst = e.target.checked;});
  1019. addSetting(config.highlightMessagesNotes, 'Highlights messages and notes')
  1020. .addEventListener('change', (e) => {config.highlightMessagesNotes = e.target.checked;});
  1021. addSetting(config.focusTargetNotes, 'Focus target notes after logging')
  1022. .addEventListener('change', (e) => {config.focusTargetNotes = e.target.checked;});
  1023. addSetting(config.notificationSound, 'Play sound on new message')
  1024. .addEventListener('change', (e) => {config.notificationSound = e.target.checked;});
  1025. settingsDialog.appendChild(document.createElement('span'));
  1026. settingsDialog.appendChild(document.createElement('br'));
  1027. settingsDialog.appendChild(document.createElement('span')); settingsDialog.lastChild.innerHTML = 'Functions Starting With ALT Key';
  1028. settingsDialog.appendChild(document.createElement('span'));
  1029. settingsDialog.appendChild(document.createElement('br'));
  1030. addSetting(config.hotkeys[ 0], 'Go to player logging') .addEventListener('keydown', (e) => {setHotkey( 0, e);});
  1031. addSetting(config.hotkeys[ 1], 'Go to target logging') .addEventListener('keydown', (e) => {setHotkey( 1, e);});
  1032. addSetting(config.hotkeys[ 2], 'Go to message box') .addEventListener('keydown', (e) => {setHotkey( 2, e);});
  1033. addSetting(config.hotkeys[ 3], 'Open latest attachment').addEventListener('keydown', (e) => {setHotkey( 3, e);});
  1034. addSetting(config.hotkeys[ 4], 'Add photo dialog') .addEventListener('keydown', (e) => {setHotkey( 4, e);});
  1035. addSetting(config.hotkeys[ 5], 'Remove selected photo') .addEventListener('keydown', (e) => {setHotkey( 5, e);});
  1036. addSetting(config.hotkeys[ 6], 'Go to Messages') .addEventListener('keydown', (e) => {setHotkey( 6, e);});
  1037. addSetting(config.hotkeys[ 7], 'Go to Statistics') .addEventListener('keydown', (e) => {setHotkey( 7, e);});
  1038. addSetting(config.hotkeys[10], 'Open these settings') .addEventListener('keydown', (e) => {setHotkey(10, e);});
  1039. addSetting(config.hotkeys[11], 'Generate Hobbies') .addEventListener('keydown', (e) => {setHotkey(11, e);});
  1040. addSetting(config.hotkeys[12], 'SexIntressen') .addEventListener('keydown', (e) => {setHotkey(12, e);});
  1041. addSetting(config.hotkeys[13], 'Player Jobb') .addEventListener('keydown', (e) => {setHotkey(13, e);});
  1042. addSetting(config.hotkeys[14], 'Player Namn') .addEventListener('keydown', (e) => {setHotkey(14, e);});
  1043. settingsDialog.appendChild(document.createElement('span'));
  1044. settingsDialog.appendChild(document.createElement('br'));
  1045. settingsDialog.appendChild(document.createElement('span')); settingsDialog.lastChild.innerHTML = 'Functions Starting With CTRL Key';
  1046. settingsDialog.appendChild(document.createElement('span'));
  1047. settingsDialog.appendChild(document.createElement('br'));
  1048. addSetting(config.hotkeys[15], 'Target AutoNotes') .addEventListener('keydown', (e) => {setHotkey(15, e);});
  1049. addSetting(config.hotkeys[16], 'Target Aktuellt') .addEventListener('keydown', (e) => {setHotkey(16, e);});
  1050. addSetting(config.hotkeys[17], 'Player AutoNotes') .addEventListener('keydown', (e) => {setHotkey(17, e);});
  1051. addSetting(config.hotkeys[18], 'Player Stad') .addEventListener('keydown', (e) => {setHotkey(18, e);});
  1052. addSetting(config.hotkeys[19], 'Player Aktuellt') .addEventListener('keydown', (e) => {setHotkey(19, e);});
  1053.  
  1054. var settingsButton = menu.children[5].cloneNode();
  1055. settingsButton.id = 'SettingsButton';
  1056. settingsButton.setAttribute('rel', 'settings');
  1057. settingsButton.addEventListener('click', () => {
  1058. $('#SettingsDialog').dialog({
  1059. title: "Settings",
  1060. resizable: false,
  1061. modal: true,
  1062. position: 'top',
  1063. width: '400',
  1064. open: () => {
  1065. $('#SettingsDialog')[0].style.display = 'grid';
  1066. },
  1067. buttons: [
  1068. {
  1069. text: "Save",
  1070. click: () => {
  1071. console.log("Storing config");
  1072. localStorage.setItem('config', JSON.stringify(config));
  1073. console.log("\tConfig stored:");
  1074. console.log(localStorage.getItem('config'));
  1075. loadConfig();
  1076. //window.location.reload();
  1077. }
  1078. }
  1079. ]
  1080. });
  1081. });
  1082. $('button[rel="documents/manual.pdf"]')[0].insertAdjacentElement('afterend', settingsButton);
  1083. $('button[rel="documents/manual.pdf"]')[0].insertAdjacentText('afterend', '\n');
  1084. $('#SettingsButton').button();
  1085. settingsButton.children[0].innerHTML = 'Settings';
  1086. document.getElementById('informDialog').insertAdjacentElement('afterend', settingsDialog);
  1087. console.log("\tSettings button created");
  1088. }
  1089.  
  1090. function createCounters() {
  1091. console.log("Creating counter elements");
  1092. var menu = document.getElementById('topmenu1');
  1093. menu.style.position = 'relative';
  1094.  
  1095. var counters = document.createElement('div');
  1096. counters.id = 'counters-container';
  1097. counters.style.display = 'inline-block';
  1098. counters.style.position = 'absolute';
  1099. counters.style.top = '50%';
  1100. counters.style.transform = 'translateY(-50%)';
  1101. counters.style.fontSize = '1.1em';
  1102.  
  1103. var column1 = document.createElement('div');
  1104. column1.id = 'counters-column1';
  1105. column1.style.display = 'inline-block';
  1106. column1.style.marginLeft = '1em';
  1107. column1.style.marginTop = '1em';
  1108. column1.style.verticalAlign = 'top';
  1109. column1.appendChild(document.createElement('span')); column1.lastChild.innerHTML = 'Sent: ';
  1110. column1.appendChild(document.createElement('span'));
  1111. column1.appendChild(document.createElement('br'));
  1112. column1.appendChild(document.createElement('span')); column1.lastChild.innerHTML = 'Earned: €';
  1113. column1.appendChild(document.createElement('span'));
  1114. column1.appendChild(document.createElement('br'));
  1115.  
  1116.  
  1117. var column2 = document.createElement('div');
  1118. column2.id = 'counters-column2';
  1119. column2.style.display = 'inline-block';
  1120. column2.style.marginLeft = '2em';
  1121. column2.style.marginTop = '1em';
  1122. column2.style.verticalAlign = 'top';
  1123. column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'This week: ';
  1124. column2.appendChild(document.createElement('span'));
  1125. column2.appendChild(document.createElement('br'));
  1126. column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'Earned: €';
  1127. column2.appendChild(document.createElement('span'));
  1128. column2.appendChild(document.createElement('br'));
  1129. column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'Rate: €';
  1130. column2.appendChild(document.createElement('span'));
  1131. column2.appendChild(document.createElement('br'));
  1132.  
  1133. var column4 = document.createElement('div');
  1134. column4.id = 'counters-column4';
  1135. column4.style.display = 'inline-block';
  1136. column4.style.marginLeft = '3em';
  1137. column4.style.marginTop = '1em';
  1138. column4.style.verticalAlign = 'top';
  1139. column4.appendChild(document.createElement('span')); column4.lastChild.innerHTML = 'Time: ';
  1140. column4.appendChild(document.createElement('span'));
  1141. column4.appendChild(document.createElement('br'));
  1142. column4.appendChild(document.createElement('span')); column4.lastChild.innerHTML = 'Last Msg: ';
  1143. column4.appendChild(document.createElement('span'));
  1144.  
  1145. var column5 = document.createElement('div');
  1146. column5.id = 'counters-column5';
  1147. column5.style.display = 'inline-block';
  1148. column5.style.marginLeft = '3em';
  1149. column5.style.marginTop = '1em';
  1150. column5.style.verticalAlign = 'top';
  1151. column5.appendChild(document.createElement('button')); column5.lastChild.innerHTML = 'Clear';
  1152.  
  1153. counters.appendChild(column1);
  1154. counters.appendChild(column2);
  1155. counters.appendChild(column4);
  1156. counters.appendChild(column5);
  1157. menu.insertBefore(counters, menu.lastElementChild);
  1158. console.log("\tCounter elements created");
  1159. }
  1160.  
  1161.  
  1162. function calcRate(messages) {
  1163. if(messages >= 1976)
  1164. return 0.19;
  1165. if(messages >= 1576)
  1166. return 0.16;
  1167. if(messages >= 776)
  1168. return 0.14;
  1169. return 0.12;
  1170. }
  1171.  
  1172. function calcEarned(rate, normal, bonus, other) {
  1173. return rate * (normal + bonus) +
  1174. 0.02 * bonus +
  1175. 0.12 * other;
  1176. }
  1177.  
  1178.  
  1179. function getStats() {
  1180. function updateCounters(stats) {
  1181. function statsForDate(date) {
  1182. var normal = parseInt(date.replied_messages_normal) | 0;
  1183. var peakHour = parseInt(date.replied_messages_peakhour) | 0;
  1184. var weekend = parseInt(date.replied_messages_saturday) +
  1185. parseInt(date.replied_messages_sunday) +
  1186. parseInt(date.replied_messages_specialtrigger) | 0;
  1187. var other = parseInt(date.replied_favorites) +
  1188. parseInt(date.replied_flirts) +
  1189. parseInt(date.replied_matches) +
  1190. parseInt(date.replied_proposals)| 0;
  1191. return [normal, peakHour + weekend, other];
  1192. }
  1193. console.log("Updating counters");
  1194. var date = new Date().toLocaleString('sv-SE', {
  1195. year: 'numeric',
  1196. month: '2-digit',
  1197. day: '2-digit'
  1198. });
  1199. var sentNormal, sentBonus, other, normalWeek=0, bonusWeek=0, otherWeek=0, rate,
  1200. column1 = document.getElementById('counters-column1'),
  1201. column2 = document.getElementById('counters-column2'),
  1202. column4 = document.getElementById('counters-column4'),
  1203. column5 = document.getElementById('counters-column5');
  1204. column1.children[1].innerHTML = 'No statistics for today (yet?)!';
  1205. column1.children[4].innerHTML = '';
  1206. for(const s of stats) {
  1207. [sentNormal, sentBonus, other] = statsForDate(s);
  1208. normalWeek += sentNormal;
  1209. bonusWeek += sentBonus;
  1210. otherWeek += other;
  1211. if(s.date == date) {
  1212. rate = calcRate(normalWeek + bonusWeek);
  1213. column1.children[1].innerHTML = sentNormal + sentBonus;
  1214. column1.children[4].innerHTML = (rate * (sentNormal + sentBonus)).toFixed(2);
  1215. console.log("\tCounters for today updated");
  1216. break;
  1217. }
  1218. }
  1219. column2.children[1].innerHTML = normalWeek + bonusWeek;
  1220. column2.children[4].innerHTML = calcEarned(rate, normalWeek, bonusWeek, otherWeek).toFixed(2);
  1221. column2.children[7].innerHTML = rate;
  1222.  
  1223.  
  1224. console.log("\tCounters updated");
  1225. }
  1226. console.log("Getting statistics");
  1227. $.ajax({
  1228. url: '/ajax/stats/action/getStats',
  1229. dataType: 'json',
  1230. type: 'POST',
  1231. data: {
  1232. year: new Date().getFullYear(),
  1233. weekno: $.datepicker.iso8601Week(new Date()),
  1234. pagination: {
  1235. current: 1,
  1236. drawPagination: false,
  1237. perPage: 20,
  1238. total: 1
  1239. },
  1240. type: 'mine'
  1241. },
  1242. success: function (response) {
  1243. console.log("getStats AJAX call success");
  1244. updateCounters(response.data.result);
  1245. },
  1246. complete: function () {}
  1247. });
  1248. console.log("\tStatistics gotten");
  1249. }
  1250.  
  1251.  
  1252.  
  1253. var h1 = document.getElementById('counters-column4'),
  1254. start = document.getElementById('counters-column5'),
  1255. h2 = document.getElementById('counters-column4'),
  1256. seconds = 0, minutes = 0, hours = 0,
  1257. t;
  1258.  
  1259. function add() {
  1260. seconds++;
  1261. if (seconds >= 60) {
  1262. seconds = 0;
  1263. minutes++;
  1264. if (minutes >= 60) {
  1265. minutes = 0;
  1266. hours++;
  1267. }
  1268. }
  1269.  
  1270. h1.children[1].textContent = (minutes ? (minutes > 9 ? minutes : "0" + minutes) : "00") + ":" + (seconds > 9 ? seconds : "0" + seconds);
  1271.  
  1272. timer();
  1273. }
  1274. function timer() {
  1275. t = setTimeout(add, 1000);
  1276. }
  1277. timer();
  1278.  
  1279.  
  1280. /* Start button */
  1281. start.onclick = function() {
  1282.  
  1283. h2.children[4].textContent = leftPad(minutes) + ":" + leftPad(seconds);
  1284. h1.children[1].innerHTML = "00:00";
  1285. seconds = 0; minutes = 0; hours = 0;
  1286. return false;
  1287. }
  1288. return true;
  1289.  
  1290.  
  1291.  
  1292.  
  1293.  
  1294. function leftPad(value) {
  1295. return value < 10 ? ('0' + value) : value;
  1296. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement