aw.ts 3.0 KB

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