Grundo's Cafe Brain Tree

Store and auto-populate answer info for Brain Tree daily quest.

  1. // ==UserScript==
  2. // @name Grundo's Cafe Brain Tree
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.1
  5. // @description Store and auto-populate answer info for Brain Tree daily quest.
  6. // @author baileyb (GC user bailey)
  7. // @match http*://grundos.cafe/halloween/braintree*
  8. // @match http*://grundos.cafe/halloween/esophagor*
  9. // @match http*://www.grundos.cafe/halloween/braintree*
  10. // @match http*://www.grundos.cafe/halloween/esophagor*
  11. // @icon https://www.google.com/s2/favicons?sz=64&domain=grundos.cafe
  12. // @grant GM_setValue
  13. // @grant GM_getValue
  14. // @grant GM_deleteValue
  15. // ==/UserScript==
  16.  
  17. const selectors = {
  18. answer: "#page_content strong u",
  19. submitButton: "#page_content input[type='submit']",
  20. placeInput: "input[name='place']",
  21. yearInput: "input[name='year']"
  22. };
  23.  
  24. const elements = {
  25. answer: document.querySelector(selectors.answer),
  26. submitButton: document.querySelector(selectors.submitButton),
  27. placeInput: document.querySelector(selectors.placeInput),
  28. yearInput: document.querySelector(selectors.yearInput)
  29. };
  30.  
  31. const currentDate = new Date();
  32.  
  33. /**
  34. * Compute if Daylight Savings Time is active.
  35. * @param {Object} date
  36. * @returns {Boolean}
  37. */
  38. function isDaylightSavings(date) {
  39. let jan = new Date(date.getFullYear(), 0, 1).getTimezoneOffset()
  40. let jul = new Date(date.getFullYear(), 6, 1).getTimezoneOffset()
  41. return Math.max(jan, jul) !== date.getTimezoneOffset()
  42. }
  43.  
  44. /**
  45. * Compute Date for midnight when dailies reset.
  46. * @param {Object} date
  47. * @returns {Object} date at midnight
  48. */
  49. function getMidnight(date) {
  50. let midnightNumber = 0;
  51.  
  52. if (isDaylightSavings(date)) {
  53. midnightNumber = date.setUTCHours(31,0,0,0);
  54. } else {
  55. midnightNumber = date.setUTCHours(32,0,0,0);
  56. }
  57. return new Date(midnightNumber);
  58. }
  59.  
  60. /**
  61. * Handle locally stored answer value by clearing if expired, or populating input.
  62. * @param {String} answerType - 'year' or 'place'
  63. * @param {Object} date - current date
  64. */
  65. function handleStoredAnswer(answerType, date) {
  66. const answer = GM_getValue(answerType);
  67. const answerExpires = new Date(GM_getValue(`${answerType}Expires`));
  68.  
  69. if (!answer) {
  70. return;
  71. } else {
  72. if (answerExpires && date > answerExpires) {
  73. GM_deleteValue(answerType);
  74. GM_deleteValue(`${answerType}Expires`);
  75. } else {
  76. elements[`${answerType}Input`].value = answer;
  77. }
  78. }
  79. }
  80.  
  81. /**
  82. * Store answer.
  83. * @param {String} answer
  84. */
  85. function storeAnswer(answer) {
  86. const midnight = Date.parse(getMidnight(currentDate));
  87.  
  88. if (answer.match(/[\d]+[\w]*/)) {
  89. GM_setValue('year', answer);
  90. GM_setValue('yearExpires', midnight);
  91. } else {
  92. GM_setValue('place', answer);
  93. GM_setValue('placeExpires', midnight);
  94. }
  95. }
  96.  
  97. (function() {
  98. 'use strict';
  99.  
  100. if (window.location.href.includes('braintree')) {
  101. if (!elements.submitButton) {
  102. return;
  103. } else {
  104. handleStoredAnswer('year', currentDate);
  105. handleStoredAnswer('place', currentDate);
  106. }
  107. }
  108.  
  109. if (window.location.href.includes('esophagor')) {
  110. if (!elements.answer) {
  111. return;
  112. } else {
  113. const answer = elements.answer.innerHTML;
  114. storeAnswer(answer);
  115. }
  116. }
  117. })();