state.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. import { getLikeButton, getDislikeButton, getButtons } from "./buttons";
  2. import { createRateBar } from "./bar";
  3. import { getBrowser, getVideoId, cLog, numberFormat } from "./utils";
  4. import { sendVideoIds } from "./events";
  5. const LIKED_STATE = "LIKED_STATE";
  6. const DISLIKED_STATE = "DISLIKED_STATE";
  7. const NEUTRAL_STATE = "NEUTRAL_STATE";
  8. const DISLIKES_DISABLED_TEXT = "DISLIKES DISABLED";
  9. let extConfig = {
  10. disableVoteSubmission: false,
  11. };
  12. let storedData = {
  13. likes: 0,
  14. dislikes: 0,
  15. previousState: NEUTRAL_STATE,
  16. };
  17. let likesDisabledState = true;
  18. function isMobile() {
  19. return location.hostname == "m.youtube.com";
  20. }
  21. function isVideoLiked() {
  22. if (isMobile()) {
  23. return (
  24. getLikeButton().querySelector("button").getAttribute("aria-label") ==
  25. "true"
  26. );
  27. }
  28. return getLikeButton().classList.contains("style-default-active");
  29. }
  30. function isVideoDisliked() {
  31. if (isMobile()) {
  32. return (
  33. getDislikeButton().querySelector("button").getAttribute("aria-label") ==
  34. "true"
  35. );
  36. }
  37. return getDislikeButton().classList.contains("style-default-active");
  38. }
  39. function getState(storedData) {
  40. if (isVideoLiked()) {
  41. return { current: LIKED_STATE, previous: storedData.previousState };
  42. }
  43. if (isVideoDisliked()) {
  44. return { current: DISLIKED_STATE, previous: storedData.previousState };
  45. }
  46. return { current: NEUTRAL_STATE, previous: storedData.previousState };
  47. }
  48. //--- Sets The Likes And Dislikes Values ---//
  49. function setLikes(likesCount) {
  50. getButtons().children[0].querySelector("#text").innerText = likesCount;
  51. }
  52. function setDislikes(dislikesCount) {
  53. if (!likesDisabledState) {
  54. if (isMobile()) {
  55. getButtons().children[1].querySelector(
  56. ".button-renderer-text"
  57. ).innerText = dislikesCount;
  58. return;
  59. }
  60. getButtons().children[1].querySelector("#text").innerText = dislikesCount;
  61. } else {
  62. cLog("likes count diabled by creator");
  63. if (isMobile()) {
  64. getButtons().children[1].querySelector(
  65. ".button-renderer-text"
  66. ).innerText = DISLIKES_DISABLED_TEXT;
  67. return;
  68. }
  69. getButtons().children[1].querySelector("#text").innerText =
  70. DISLIKES_DISABLED_TEXT;
  71. }
  72. }
  73. function getLikeCountFromButton() {
  74. let likesStr = getLikeButton()
  75. .querySelector("button")
  76. .getAttribute("aria-label")
  77. .replace(/\D/g, "");
  78. return likesStr.length > 0 ? parseInt(likesStr) : false;
  79. }
  80. function processResponse(response, storedData) {
  81. const formattedDislike = numberFormat(response.dislikes);
  82. setDislikes(formattedDislike);
  83. storedData.dislikes = parseInt(response.dislikes);
  84. storedData.likes = getLikeCountFromButton() || parseInt(response.likes);
  85. createRateBar(storedData.likes, storedData.dislikes);
  86. }
  87. function setState(storedData) {
  88. storedData.previousState = isVideoDisliked()
  89. ? DISLIKED_STATE
  90. : isVideoLiked()
  91. ? LIKED_STATE
  92. : NEUTRAL_STATE;
  93. let statsSet = false;
  94. getBrowser().runtime.sendMessage(
  95. {
  96. message: "set_state",
  97. videoId: getVideoId(window.location.href),
  98. state: getState(storedData).current,
  99. likeCount: getLikeCountFromButton() || null,
  100. },
  101. function (response) {
  102. cLog("response from api:");
  103. cLog(JSON.stringify(response));
  104. likesDisabledState =
  105. numberFormat(response.dislikes) == 0 &&
  106. numberFormat(response.likes) == 0 &&
  107. numberFormat(response.viewCount) == 0;
  108. if (response !== undefined && !("traceId" in response) && !statsSet) {
  109. processResponse(response, storedData);
  110. }
  111. }
  112. );
  113. }
  114. function setInitialState() {
  115. setState(storedData);
  116. setTimeout(() => {
  117. sendVideoIds();
  118. }, 1500);
  119. }
  120. function initExtConfig() {
  121. initializeDisableVoteSubmission();
  122. }
  123. function initializeDisableVoteSubmission() {
  124. getBrowser().storage.sync.get(["disableVoteSubmission"], (res) => {
  125. if (res.disableVoteSubmission === undefined) {
  126. getBrowser().storage.sync.set({ disableVoteSubmission: false });
  127. } else {
  128. extConfig.disableVoteSubmission = res.disableVoteSubmission;
  129. }
  130. });
  131. }
  132. export {
  133. isMobile,
  134. isVideoDisliked,
  135. isVideoLiked,
  136. getState,
  137. setState,
  138. setInitialState,
  139. setLikes,
  140. setDislikes,
  141. getLikeCountFromButton,
  142. LIKED_STATE,
  143. DISLIKED_STATE,
  144. NEUTRAL_STATE,
  145. extConfig,
  146. initExtConfig,
  147. storedData,
  148. likesDisabledState,
  149. };