wrkzll.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. const START_BTN_TEXT = "Следить";
  2. const STOP_BTN_TEXT = "Перестать следить";
  3. const SOUND_ON_TEXT_BTN = "Выкл. звук";
  4. const SOUND_OFF_TEXT_BTN = "Вкл. звук";
  5. const DURATION = 0.2; // minute
  6. let soundON = true;
  7. const soundFile =
  8. "https://cdn-prd.sounds.com/sounds/434165816e5346504436a979428f5cabcd7e619a_browser.mp4";
  9. const defaultStopWords = ["заработай", "курьер", "битрикс", "1с"];
  10. const defaultKeywords = [
  11. "python",
  12. "javascript",
  13. "js",
  14. "react",
  15. "nodejs",
  16. "telegram",
  17. "sql",
  18. "vk",
  19. "redux",
  20. "бот",
  21. "парс",
  22. "телеграм",
  23. ];
  24. if (!localStorage.getItem("keywords")) {
  25. localStorage.setItem("keywords", defaultKeywords);
  26. }
  27. if (!localStorage.getItem("stopwords")) {
  28. localStorage.setItem("stopwords", defaultStopWords);
  29. }
  30. function getWords() {
  31. const keywords = localStorage.getItem("keywords");
  32. const stopWords = localStorage.getItem("stopwords");
  33. return [
  34. keywords ? keywords.split(",") : [],
  35. stopWords ? stopWords.split(",") : [],
  36. ];
  37. }
  38. const titleBlock = document.querySelector(".order-list-title");
  39. const filterBlock = document.querySelector(".order-list-section-header");
  40. const startBtn = document.createElement("button");
  41. startBtn.classList.add("wz-button", "filter-button");
  42. startBtn.innerText = START_BTN_TEXT;
  43. startBtn.style.marginLeft = "0.5em";
  44. filterBlock.appendChild(startBtn);
  45. const settingsBtn = document.createElement("button");
  46. settingsBtn.classList.add("wz-button", "filter-button");
  47. settingsBtn.innerText = "Параметры слежения";
  48. settingsBtn.style.marginLeft = "0.5em";
  49. filterBlock.appendChild(settingsBtn);
  50. const setSoundBtn = document.createElement("button");
  51. setSoundBtn.classList.add("wz-button", "filter-button");
  52. setSoundBtn.innerText = soundON ? SOUND_ON_TEXT_BTN : SOUND_OFF_TEXT_BTN;
  53. setSoundBtn.style.backgroundColor = soundON ? "red" : "";
  54. setSoundBtn.style.marginLeft = "0.5em";
  55. filterBlock.appendChild(setSoundBtn);
  56. function setup() {
  57. let [keywords, stopWords] = getWords();
  58. keywords = prompt(
  59. "Введите через пробел или отредактируйте ключевые слова для поиска заданий",
  60. keywords.join(" ")
  61. );
  62. stopWords = prompt(
  63. "Введите через пробел или отредактируйте стоп слова, которых не должно быть в задании",
  64. stopWords.join(" ")
  65. );
  66. localStorage.setItem("keywords", keywords.split(" "));
  67. localStorage.setItem("stopwords", stopWords.split(" "));
  68. }
  69. settingsBtn.addEventListener("click", setup);
  70. startBtn.addEventListener("click", startWatching);
  71. setSoundBtn.addEventListener("click", setSound);
  72. function setSound(e) {
  73. if (e.target.innerText === SOUND_ON_TEXT_BTN) {
  74. setSoundBtn.style.backgroundColor = "";
  75. setSoundBtn.innerText = SOUND_OFF_TEXT_BTN;
  76. } else {
  77. setSoundBtn.style.backgroundColor = "red";
  78. setSoundBtn.innerText = SOUND_ON_TEXT_BTN;
  79. }
  80. soundON = !soundON;
  81. }
  82. let interval;
  83. function startWatching(e = null) {
  84. if (e && e.target.innerText === STOP_BTN_TEXT) {
  85. clearInterval(interval);
  86. startBtn.innerText = START_BTN_TEXT;
  87. startBtn.style.backgroundColor = "";
  88. return;
  89. }
  90. startBtn.style.backgroundColor = "red";
  91. startBtn.innerText = STOP_BTN_TEXT;
  92. interval = setInterval(() => {
  93. try {
  94. getMyJobs();
  95. } catch (error) {
  96. console.log(error);
  97. }
  98. }, 1000 * 60 * DURATION);
  99. }
  100. setTimeout(() => startWatching(), 3000);
  101. // собирает со страницы блоки с заданиями, где есть ключевые слова
  102. function getMyJobs() {
  103. const jobs = document.querySelectorAll(".new-order-short-description");
  104. const jobsFull = document.querySelectorAll(".external-links-wrapper");
  105. const jobsArray = Array.from(jobs);
  106. let newJobs = 0;
  107. let myJobs = 0;
  108. const [keywords, stopWords] = getWords();
  109. for (let i = 0; i < jobs.length; i++) {
  110. if (
  111. jobs[i].style.border !== "3px solid red" &&
  112. hasKeywords(jobsFull[i].innerText, keywords) &&
  113. !hasKeywords(jobsFull[i].innerText, stopWords)
  114. ) {
  115. jobs[i].style.border = "3px solid red";
  116. newJobs++;
  117. } else if (
  118. jobs[i].style.border == "3px solid red" &&
  119. !hasKeywords(jobsFull[i].innerText, keywords)
  120. ) {
  121. jobs[i].style.border = "";
  122. }
  123. if (jobs[i].style.border == "3px solid red") myJobs++;
  124. }
  125. titleBlock.innerHTML = `<span style="color:red; font-style:italic;">${myJobs}</span> jobs`;
  126. if (newJobs) notifyMe(newJobs);
  127. }
  128. function playSound(url) {
  129. const audio = new Audio(url);
  130. audio.play();
  131. }
  132. // прверяет, есть ли в тексте хотя бы одно ключевое слово
  133. function hasKeywords(text, wordsArr) {
  134. for (let w of wordsArr) {
  135. if (text.toLowerCase().indexOf(w) !== -1) {
  136. return true;
  137. }
  138. }
  139. return false;
  140. }
  141. function notifyMe(count) {
  142. // Проверка поддержки браузером уведомлений
  143. if (!("Notification" in window)) {
  144. alert("This browser does not support desktop notification");
  145. }
  146. // Проверка разрешения на отправку уведомлений
  147. else if (Notification.permission === "granted") {
  148. // Если разрешено, то создаём уведомление
  149. var notification = new Notification(`Найдено подходящих заданий: ${count}`);
  150. if (soundON) playSound(soundFile);
  151. }
  152. // В противном случае, запрашиваем разрешение
  153. else if (Notification.permission !== "denied") {
  154. Notification.requestPermission(function (permission) {
  155. // Если пользователь разрешил, то создаём уведомление
  156. if (permission === "granted") {
  157. var notification = new Notification(
  158. `Найдено подходящих заданий: ${count}`
  159. );
  160. if (soundON) playSound(soundFile);
  161. }
  162. });
  163. }
  164. }