presence.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. const presence = new Presence({
  2. clientId: "1247668968395903030",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. const enum Assets {
  6. Logo = "https://cdn.rcd.gg/PreMiD/websites/L/LiveATC/assets/logo.png",
  7. }
  8. presence.on("UpdateData", async () => {
  9. const presenceData: PresenceData = {
  10. type: ActivityType.Listening,
  11. largeImageKey: Assets.Logo,
  12. startTimestamp: browsingTimestamp,
  13. },
  14. { pathname, href, hostname } = document.location;
  15. switch (hostname.split(".")[0]) {
  16. case "www": {
  17. switch (pathname.split("/")[1].replace(".php", "")) {
  18. case "": {
  19. presenceData.details = "Viewing homepage";
  20. break;
  21. }
  22. case "index": {
  23. presenceData.details = "Viewing homepage";
  24. break;
  25. }
  26. case "search": {
  27. const params = new URL(href).searchParams;
  28. presenceData.details = "Searching";
  29. presenceData.state = `${
  30. params.get("freq")
  31. ? "Frequency: "
  32. : params.get("icao")
  33. ? "ICAO: "
  34. : ""
  35. }${params.get("freq") || params.get("icao")?.toUpperCase() || ""}`;
  36. break;
  37. }
  38. case "hlisten": {
  39. const radioInfo = document
  40. .querySelector("h1")
  41. .childNodes.item(2)
  42. .textContent.split(" - ");
  43. presenceData.details = radioInfo[0];
  44. presenceData.state = radioInfo[1];
  45. presenceData.largeImageText = document
  46. .querySelector("font")
  47. .textContent.trim();
  48. presenceData.smallImageKey = Assets.Live;
  49. presenceData.buttons = [
  50. {
  51. url: href,
  52. label: "Listen to Feed",
  53. },
  54. ];
  55. break;
  56. }
  57. case "archive": {
  58. if (document.querySelector("audio")) {
  59. const audio = document.querySelector("audio");
  60. presenceData.details = "Listening to archive";
  61. presenceData.state = audio
  62. .querySelector("source")
  63. .src.split("/")[4]
  64. .split(".")[0];
  65. presenceData.smallImageKey = audio.paused
  66. ? Assets.Pause
  67. : Assets.Play;
  68. presenceData.smallImageText = audio.paused ? "Paused" : "Playing";
  69. if (!audio.paused) {
  70. [presenceData.startTimestamp, presenceData.endTimestamp] =
  71. presence.getTimestampsfromMedia(audio);
  72. }
  73. } else presenceData.details = "Searching archive";
  74. break;
  75. }
  76. case "recordings": {
  77. presenceData.details = "Browsing recordings";
  78. break;
  79. }
  80. case "feedindex": {
  81. presenceData.details = "Browsing feeds";
  82. presenceData.state = document.querySelector("h1 > font");
  83. break;
  84. }
  85. case "topfeeds": {
  86. presenceData.details = "Browsing top 50 feeds";
  87. break;
  88. }
  89. case "map": {
  90. presenceData.details = "Viewing feed map";
  91. break;
  92. }
  93. case "badwxfeeds": {
  94. presenceData.details = "Viewing bad weather airports";
  95. break;
  96. }
  97. case "coverage": {
  98. presenceData.details = "Viewing coverage guide";
  99. break;
  100. }
  101. default: {
  102. presenceData.details = pathname.split("/")[1].replace(".php", "");
  103. break;
  104. }
  105. }
  106. break;
  107. }
  108. case "forums": {
  109. const pageURL = document.querySelector<HTMLAnchorElement>(
  110. ".navigate_section .last a"
  111. ).href;
  112. presenceData.details = "Browsing the forums";
  113. presenceData.state = document.querySelector(
  114. ".navigate_section .last span"
  115. );
  116. if (new URL(pageURL).pathname.split("/")[1] !== "index.php") {
  117. presenceData.buttons = [
  118. {
  119. url: pageURL,
  120. label: "View page",
  121. },
  122. ];
  123. }
  124. }
  125. }
  126. presence.setActivity(presenceData);
  127. });