presence.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import languageStrings from "./strings";
  2. const presence = new Presence({
  3. clientId: "1233147201559990292",
  4. }),
  5. browsingTimestamp = Math.floor(Date.now() / 1000);
  6. const enum PresenceAssets {
  7. Logo = "https://cdn.rcd.gg/PreMiD/websites/K/Kotobade%20Asobou/assets/logo.png",
  8. }
  9. presence.on("UpdateData", async () => {
  10. const language = await presence.getSetting<number>("displayLanguage"),
  11. strings = languageStrings[["en", "ja"][language] as "en" | "ja"],
  12. presenceData: PresenceData = {
  13. largeImageKey: PresenceAssets.Logo,
  14. startTimestamp: browsingTimestamp,
  15. name: strings.title,
  16. },
  17. rows = [...document.querySelectorAll<HTMLDivElement>(".grid > div")],
  18. nextIndex = rows.findIndex(row =>
  19. [...row.children].every(
  20. tile =>
  21. !tile.querySelector<HTMLDivElement>(".letter-container").textContent
  22. )
  23. ),
  24. lastRow: HTMLDivElement = rows[nextIndex - 1],
  25. isComplete = !!(
  26. (lastRow?.children.length &&
  27. [...lastRow.children].every(tile =>
  28. tile.classList.contains("correct")
  29. )) ||
  30. nextIndex === -1
  31. );
  32. if (isComplete) {
  33. const finalScore = nextIndex === -1 ? 12 : nextIndex;
  34. let outcome = "";
  35. for (let i = 0; i < finalScore; i++) {
  36. outcome += getRowEmojis(rows[i]);
  37. outcome += " | ";
  38. }
  39. presenceData.details = nextIndex === -1 ? strings.failure : strings.victory;
  40. presenceData.state = `${finalScore}/12 - ${getRowEmojis(
  41. rows[finalScore - 1]
  42. )}`;
  43. presenceData.smallImageKey = Assets.Question;
  44. presenceData.smallImageText = outcome;
  45. presenceData.buttons = [
  46. { url: document.location.href, label: strings.play },
  47. ];
  48. } else {
  49. presenceData.details = strings.guessing;
  50. presenceData.state = `${nextIndex}/12 - ${getRowEmojis(lastRow)}`;
  51. }
  52. presence.setActivity(presenceData);
  53. });
  54. function getRowEmojis(row: HTMLDivElement): string {
  55. const darkMode = document.documentElement.classList.contains("dark");
  56. if (!row) return darkMode ? "⬛".repeat(4) : "⬜".repeat(4);
  57. let emojis = "";
  58. for (let i = 0; i < row.children.length; i++) {
  59. const tile = row.children[i];
  60. if (tile.classList.contains("correct")) emojis += "🟩";
  61. else if (tile.classList.contains("present")) emojis += "🟨";
  62. else if (tile.classList.contains("vowel")) emojis += "↔️";
  63. else if (tile.classList.contains("consonant")) emojis += "↕️";
  64. else if (tile.classList.contains("close")) emojis += "🟢";
  65. else emojis += darkMode ? "⬛" : "⬜";
  66. }
  67. return emojis;
  68. }