aw.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import Toast from "toasters";
  2. let gotPong = false;
  3. let pingTries = 0;
  4. let uuid = null;
  5. let enabled = false;
  6. let lastTimeSentVideoDate = 0;
  7. let lastTimeDenied = 0;
  8. let lastTimeCompetitor = 0;
  9. const notConnectedToast = new Toast({
  10. content: "ActivityWatch is not connected yet.",
  11. persistent: true
  12. });
  13. notConnectedToast.hide();
  14. const sendingVideoDataToast = new Toast({
  15. content: "Sending video data to ActivityWatch.",
  16. persistent: true
  17. });
  18. sendingVideoDataToast.hide();
  19. const deniedToast = new Toast({
  20. content:
  21. "Another Musare instance is already sending data to ActivityWatch Musare extension. Please only use 1 active tab for stations and editsong.",
  22. persistent: true
  23. });
  24. deniedToast.hide();
  25. const competitorToast = new Toast({
  26. content:
  27. "Another Musare instance is already sending data to ActivityWatch Musare extension. Please only use 1 active tab for stations and editsong.",
  28. persistent: true
  29. });
  30. competitorToast.hide();
  31. export default {
  32. sendVideoData(videoData) {
  33. if (enabled) {
  34. lastTimeSentVideoDate = Date.now();
  35. this.sendEvent("videoData", videoData);
  36. }
  37. },
  38. sendEvent(type, data) {
  39. if (enabled)
  40. document.dispatchEvent(
  41. new CustomEvent("ActivityWatchMusareEvent", {
  42. detail: {
  43. type,
  44. source: uuid,
  45. data
  46. }
  47. })
  48. );
  49. },
  50. enable() {
  51. if (!enabled) {
  52. uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
  53. /[xy]/g,
  54. function abc(c) {
  55. // eslint-disable-next-line
  56. const r = (Math.random() * 16) | 0;
  57. // eslint-disable-next-line
  58. const v = c == "x" ? r : (r & 0x3) | 0x8;
  59. return v.toString(16);
  60. }
  61. );
  62. document.addEventListener(
  63. "ActivityWatchMusareEvent",
  64. this.eventListener
  65. );
  66. notConnectedToast.show();
  67. this.attemptPing();
  68. enabled = true;
  69. console.log("Enabled AW.");
  70. setInterval(() => {
  71. if (lastTimeDenied + 1000 > Date.now()) {
  72. deniedToast.show();
  73. } else {
  74. deniedToast.hide();
  75. }
  76. if (lastTimeCompetitor + 1000 > Date.now()) {
  77. competitorToast.show();
  78. } else {
  79. competitorToast.hide();
  80. }
  81. if (
  82. !(lastTimeDenied + 1000 > Date.now()) &&
  83. !(lastTimeCompetitor + 1000 > Date.now()) &&
  84. lastTimeSentVideoDate + 1000 > Date.now()
  85. ) {
  86. sendingVideoDataToast.show();
  87. } else {
  88. sendingVideoDataToast.hide();
  89. }
  90. }, 1000);
  91. }
  92. },
  93. disable() {
  94. document.removeEventListener(
  95. "ActivityWatchMusareEvent",
  96. this.eventListener
  97. );
  98. enabled = false;
  99. notConnectedToast.hide();
  100. console.log("Disabled AW.");
  101. },
  102. eventListener(event) {
  103. const data = event.detail;
  104. if (data.type === "pong") {
  105. gotPong = true;
  106. notConnectedToast.hide();
  107. new Toast({
  108. content:
  109. "Got pong, connected to ActivityWatch Musare extension",
  110. timeout: 8000
  111. });
  112. }
  113. if (data.type === "denied") {
  114. lastTimeDenied = Date.now();
  115. }
  116. if (data.type === "competitor") {
  117. if (data.competitor !== uuid) {
  118. lastTimeCompetitor = Date.now();
  119. }
  120. }
  121. },
  122. attemptPing() {
  123. if (!gotPong) {
  124. if (pingTries < 10) {
  125. pingTries += 1;
  126. this.sendEvent("ping", null);
  127. setTimeout(() => {
  128. this.attemptPing.apply(this);
  129. }, 1000);
  130. } else {
  131. new Toast({
  132. content:
  133. "Couldn't connect to ActivityWatch Musare extension.",
  134. timeout: 8000
  135. });
  136. }
  137. }
  138. }
  139. };