Geoguessr Custom Emotes

Allows you to use many custom emotes in the Geoguessr chat

当前为 2022-10-19 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Geoguessr Custom Emotes
  3. // @description Allows you to use many custom emotes in the Geoguessr chat
  4. // @version 2.0.0
  5. // @author victheturtle#5159
  6. // @license MIT
  7. // @match https://www.geoguessr.com/*
  8. // @require https://gf.qytechs.cn/scripts/453368-geoguessr-custom-emotes-repository/code/Geoguessr%20Custom%20Emotes%20Repository.js
  9. // @grant GM_addStyle
  10. // @icon https://www.geoguessr.com/_next/static/images/emote-gg-cf17a1f5d51d0ed53f01c65e941beb6d.png
  11. // @namespace https://gf.qytechs.cn/users/967692-victheturtle
  12. // ==/UserScript==
  13.  
  14. const geoguessrCustomEmotes = window.geoguessrCustomEmotes // Imported from the @require link
  15.  
  16. const customEmotesInjectedClass = "custom-emotes-injected";
  17. const getAllNewMessages = () => document.querySelectorAll(`div[class*="chat-message_messageContent__"]:not([class*="${customEmotesInjectedClass}"])`);
  18.  
  19. const _cndic = {};
  20. const hrefset = new Set();
  21. async function scanStyles() {
  22. for (let node of document.querySelectorAll('head link[rel="preload"], head style[data-n-href*=".css"]')) {
  23. const href = node.href || location.origin+node.dataset.nHref;
  24. if (hrefset.has(href)) continue;
  25. hrefset.add(href);
  26. await fetch(href)
  27. .then(res => res.text())
  28. .then(stylesheet => {
  29. for (let className of stylesheet.split(".")) {
  30. const ind = className.indexOf("__");
  31. if (ind != -1) _cndic[className.substr(0, ind+2)] = className.substr(0, ind+7);
  32. };
  33. });
  34. };
  35. }
  36. const cn = (classNameStart) => _cndic[classNameStart]; // cn("status_section__") -> "status_section__8uP8o"
  37.  
  38. const emoteInjectionTemplate = (emoteSrc) => `</span>
  39. <span class="${cn("chat-message_emoteWrapper__")}"><img src="${emoteSrc}" class="${cn("chat-message_messageEmote__")}"></span>
  40. <span class="${cn("chat-message_messageText__")}">`;
  41.  
  42.  
  43. let observer = new MutationObserver((mutations) => {
  44. let newMessages = getAllNewMessages();
  45. if (newMessages.length == 0) return;
  46. scanStyles().then(() => {
  47. for (let message of newMessages) {
  48. let innerHTML = message.innerHTML;
  49. for (let emoteName in geoguessrCustomEmotes) {
  50. innerHTML = innerHTML.replaceAll(emoteName, emoteInjectionTemplate(geoguessrCustomEmotes[emoteName]));
  51. }
  52. message.innerHTML = innerHTML;
  53. message.classList.add(customEmotesInjectedClass);
  54. }})
  55. });
  56.  
  57. observer.observe(document.body, {
  58. characterDataOldValue: false,
  59. subtree: true,
  60. childList: true,
  61. characterData: false
  62. });

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址