Greasy Fork

Greasy Fork is available in English.

generals.io Custom功能增强/聊天记忆

generals.io custom chat enhance and history

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         generals.io Custom功能增强/聊天记忆
// @version       2024.7.30.2
// @description  generals.io custom chat enhance and history
// @author       vasi 2
// @match        https://generals.io/games/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=generals.io
// @grant        none
// @license    MIT
// @namespace http://greasyfork.icu/users/1340112
// @require https://code.jquery.com/jquery-3.7.1.min.js
// ==/UserScript==

(function () {
  "use strict";

  function main() {
    window.onload = function () {
      if (localStorage.getItem("scriptSetting") == null) {
        localStorage.setItem(
          "scriptSetting",
          `{ "visibility": true,"displayTools":false,"lockChat":false }`
        );
      }

      let gameName = window.location.href.split("s/")[1];
      let prevStorage = [];
      $("body").append(`<style id="lockChatCSS"></style>`);

      $("body").append(`<style>
        .history-message::before {
          height: 50px;
          content: "";
          background-color: #555;
          width: 3px;
          height: 18px;
          padding-left: 5px;
          margin-right: 5px;
          margin-top: -9px;
          -webkit-border-radius: 3px;
          -moz-border-radius: 3px;
        }
        .setting {
          left: -36px;
          height: 35.33px;
          width: 36px;
          background-color: #32a3a3;
          position: absolute;
          display: flex;
          align-items: center;
          justify-content: center;
          bottom: 0px;
          transition: 0.3s;
          color: white;
          cursor: pointer;
        }
        .setting:hover {
          background-color: #46d5d5;
          transition: 0.3s;
        }
        #setting:hover {
          background-color: #c62828 !important;
        }
        #setting:hover #tooltip-text1 {
          visibility: visible;
          opacity: 1;
        }
        #setting:hover #setting-avator {
          transform: rotate(180deg);
          transition: 0.3s;
        }
        #dump:hover #tooltip-text3 {
          visibility: visible;
          opacity: 1;
        }
        #lockChat:hover #tooltip-text2 {
          visibility: visible;
          opacity: 1;
        }
        #save:hover #tooltip-text4 {
          visibility: visible;
          opacity: 1;
        }
        #visibility:hover #tooltip-text5 {
          visibility: visible;
          opacity: 1;
        }
        #tools:hover #tooltip-text6 {
          visibility: visible;
          opacity: 1;
        }
        .setting-icon {
          height: 24px;
          color: white;
        }
        #buttonUnit {
          right: 400px;
          position: sticky;
        }
        #visibility:hover {
          background-color: var(--vis-hover-color) !important;
        }
        #slash {
          position: absolute;
          width: var(--slash-width);
          height: 4px;
          background-color: white;
          border-radius: 3px;
          transform: rotate(45deg);
          transition: 0.3s;
        }
        .tooltip-text {
          transition: 0.3s;
          pointer-events: none;
          position: fixed;
          margin-bottom: 70px;
          padding: 3px 5px 3px 5px;
          background-color: #3e9293;
          border-radius: 3px;
          opacity: 0;
          visibility: hidden;
        }
        #tools {
          background-color: #ec4848;
        }
        #tools:hover {
          background-color: #e26c6c;
        }
        #functionPanel {
          width: 400px;
          height: 360px;
          position: fixed;
          background-color: #333333;
          right: 50px;
          top: 150px;
          border: rgb(144 179 179) solid 4px;
        }
        #toolsTitle {
          padding-left: 10px;
          font-size: 24px;
          margin-bottom: 10px;
          margin-top: 10px;
        }
        .toolsUnit {
          height: 50px;
          padding-left: 10px;
          display: flex;
        }
        .toolsInput {
          display: inline-block;
          width: 100px;
          height: 30px;
        }
        .toolsButton {
          height: 30px;
          width: 50px;
          background-color: green;
          color: white;
          text-align: center;
          line-height: 30px;
          display: inline-block;
          margin-left: 10px;
          border-radius: 2px;
          cursor: pointer;
        }
        .toolsText {
          padding: 0px 5px 0px 5px;
          color: white;
          padding-top: 3px;
        }
        #autohello {
          width: 80px;
          font-size: 12px;
          background: #c62828;
          margin-left: 5px;
        }
        #autogoodbye {
          width: 80px;
          font-size: 12px;
          background: #c62828;
          margin-left: 5px;
        }
        .names {
          cursor: pointer;
        }
        .names:hover {
          border-bottom: white solid 2px;
        }
        .stickyNode {
          position: fixed;
          width: 0px;
          display: flex;
          justify-content: center;
          margin :0 auto
        }
        .userProfile {
        z-index:999;
        display:none;
          position: absolute;
          margin: 3px 0px -83px 0px;
          background-color: #606060;
          padding: 4px;
          border-radius: 3px;
        }
        .userProfileLine {
          width: 150px;
          height: 20px;
          border-bottom: white solid;
          padding: 5px 0px 3px 0px;
        }
        .userProfileText {
          display: inline-block;
          position: absolute;
          left: 6px;
          background-color: #388e3c;
          padding: 0px 2px 0px 2px;
          border-radius: 3px;
        }
        .star {
          display: inline-block;
          position: absolute;
          left: 42px;
          line-height: 17px;
        }
        .rank {
          display: inline-block;
          position: absolute;
          right: 10px;
        }
        .ffa {
          position: absolute;
          left: 8px;
          padding: 0px 2px 0px 2px;
          background-color: green;
          border-radius: 3px;
        }
        .duel {
          position: absolute;
          left: 8px;
          padding: 0px 2px 0px 2px;
          background-color: #af9800;
          border-radius: 3px;
              display: flex;
    width: 24px;
    justify-content: center;
        }
        .team {
          position: absolute;
          left: 8px;
          padding: 0px 2px 0px 2px;
          background-color: purple;
          border-radius: 3px;
        }
          .blockedMsg{
          display:none
          }

                              </style>

                `);

      $("body").append(`<div id="functionPanel">
                <p id="toolsTitle">工具箱</p>
                <div class="toolsUnit"><span class="toolsText">当</span><input id="helloInput1" class="toolsInput"><span class="toolsText">加入时发送</span></input><input id="helloInput2" class="toolsInput"></input><div id="helloButton" class="toolsButton">启动</div></div>
                <div class="toolsUnit"><input id="autohelloInput"  class="toolsInput" style="width:90px"><div id="autohello" class="toolsButton">自动欢迎/OFF</div>
                <input id="autogoodbyeInput"  class="toolsInput" style="width: 90px;margin-left: 15px;"><div id="autogoodbye" class="toolsButton">自动告别/OFF</div></div>
                <div class="toolsUnit"><span class="toolsText" style="font-size:14px;padding=0px">注:使用*user*指代加入/退出玩家,*room*指代该房间号</span></div>
                <div class="toolsUnit" style="height:40px"><span class="toolsText">屏蔽玩家发言</span><input id="blockUserInput"  class="toolsInput" style="width: 90px;"><div id="addBlockUser" class="toolsButton" style="width: 40px;background-color:#008ab7;border-radius: 3px 0px 0px 3px;">添加</div><div id="delBlockUser" class="toolsButton" style="background-color: #fd4400;width: 40px;margin-left: 0px;border-radius: 0px 3px 3px 0px;">删除</div><div id="blockUser" class="toolsButton" style="    width: 80px; font-size: 15px;background: #c62828;">block/OFF</div></div>
                <div class="toolsUnit"><span class="toolsText" style="font-size:14px;padding=0px" id="blockedUserList"></span></div>
                </div>`);
      $(".toolsButton").val(0);
      let dict = { 0: false, 1: true };
      let dictT = { true: "block", false: "none" };
      let blockedUser = [];
      function toggleButton(
        ele,
        funcOn,
        funcOff,
        textOn,
        textOff,
        colorOn,
        colorOff
      ) {
        ele.val(1 - ele.val());
        if (dict[ele.val()]) {
          funcOn();
          ele.css("background-color", colorOn);
          ele.html(textOn);
        } else {
          funcOff();
          ele.css("background-color", colorOff);
          ele.html(textOff);
        }
      }
      let hello = (data) => {
        if (
          data.split(" joined the custom game")[0] == $("#helloInput1").val()
        ) {
          socket.emit(
            "chat_message",
            "chat_custom_queue_" + gameName,
            $("#helloInput2").val(),
            ""
          );
        }
      };
      function replaceMsg(str, User, Room) {
        return str.split("*user*").join(User).split("*room*").join(Room);
      }
      let autohello = (data) => {
        if (data.indexOf(" joined the custom game") != -1) {
          socket.emit(
            "chat_message",
            "chat_custom_queue_" + gameName,
            replaceMsg(
              $("#autohelloInput").val(),
              data.split(" joined the custom game")[0],
              gameName
            ),
            ""
          );
        }
      };

      let autogoodbye = (data) => {
        if (data.indexOf(" left the custom game") != -1) {
          socket.emit(
            "chat_message",
            "chat_custom_queue_" + gameName,
            replaceMsg(
              $("#autogoodbyeInput").val(),
              data.split(" left the custom game")[0],
              gameName
            ),
            ""
          );
        }
      };
      let blockUser = (a, data) => {
        blockedUser.forEach((user) => {
          if (data.username == user) {
            $(".chat-message").eq(-1).addClass("blockedMsg");
          }
        });
      };
      $("#helloButton").click(() => {
        toggleButton(
          $("#helloButton"),
          () => {
            socket.on("notify", hello);
            $("#helloInput1").attr("disabled", true);
            $("#helloInput2").attr("disabled", true);
          },
          () => {
            socket.off("notify", hello);
            $("#helloInput1").attr("disabled", false);
            $("#helloInput2").attr("disabled", false);
          },
          "终止",
          "启动",
          "#c62828",
          "green"
        );
      });
      $("#autohello").click(() => {
        toggleButton(
          $("#autohello"),
          () => {
            socket.on("notify", autohello);
            $("#autohelloInput").attr("disabled", true);
            $("#autohelloInput").attr("disabled", true);
          },
          () => {
            socket.off("notify", autohello);
            $("#autohelloInput").attr("disabled", false);
            $("#autohelloInput").attr("disabled", false);
          },
          "自动欢迎/ON",
          "自动欢迎/OFF",
          "green",
          "#c62828"
        );
      });

      $("#autogoodbye").click(() => {
        toggleButton(
          $("#autogoodbye"),
          () => {
            socket.on("notify", autogoodbye);
            $("#autogoodbyeInput").attr("disabled", true);
            $("#autogoodbyeInput").attr("disabled", true);
          },
          () => {
            socket.off("notify", autogoodbye);
            $("#autogoodbyeInput").attr("disabled", false);
            $("#autogoodbyeInput").attr("disabled", false);
          },
          "自动告别/ON",
          "自动告别/OFF",
          "green",
          "#c62828"
        );
      });
      $("#blockUser").click(() => {
        toggleButton(
          $("#blockUser"),
          () => {
            socket.on("chat_message", blockUser);
          },
          () => {
            socket.off("chat_message", blockUser);
          },
          "block/ON",
          "block/OFF",
          "green",
          "#c62828"
        );
      });
      $("#addBlockUser").click(() => {
        if (blockedUser.indexOf($("#blockUserInput").val()) == -1) {
          blockedUser.push($("#blockUserInput").val());
        } else {
          alert("该用户名已存在");
        }
        $("#blockedUserList").text(`已屏蔽玩家:${blockedUser.join(",")}.`);
      });
      $("#delBlockUser").click(() => {
        if (blockedUser.indexOf($("#blockUserInput").val()) != -1) {
          blockedUser.splice(
            blockedUser.indexOf($("#blockUserInput").val()),
            1
          );
        } else {
          alert("该用户名不存在");
        }
        if (blockedUser.length == 0) {
          $("#blockedUserList").text(``);
        } else {
          $("#blockedUserList").text(`已屏蔽玩家:${blockedUser.join(",")}.`);
        }
      });
      function downloadHistory() {
        prevStorage = JSON.parse(localStorage.getItem(gameName));
        for (let item in prevStorage) {
          if (prevStorage[item][1] == 0) {
            $(".chat-messages-container")
              .eq(0)
              .append(
                `<p class="chat-message history-message">${prevStorage[item][0]}</p>`
              );
          } else {
            $(".chat-messages-container")
              .eq(0)
              .append(
                `<p class="chat-message history-message-sys">${prevStorage[item][0]}</p>`
              );
          }
        }
        $(".chat-message").eq(prevStorage.length).css({
          display: "block",
          "border-bottom": "white solid 2px",
          "padding-bottom": "4px",
        });
      }
      function getUsername(name) {
        const contentText = encodeURIComponent(
          name.contents().not(name.children()).text()
        );
        return contentText !== "" ? contentText : name.children().eq(0).text();
      }
      function renewLink() {
        let alist = $(".custom-queue-page-container").children();
        for (let i = 2; i < alist.length; i++) {
          for (let j = 1; j < alist.eq(i).children().length; j++) {
            let name = alist.eq(i).children().eq(j).children().eq(-1);
            name.addClass("names");
            let procName = getUsername(name);
            name.attr(
              "onclick",
              `window.open("https://generals.io/profiles/${procName}",'_blank')`
            );
            name.attr("id", procName.replace(/ /g, "-"));
          }
        }
      }
      socket.on("queue_update", () => {
        renewLink();
        setTimeout(() => {
          loadProfile();
        }, 3000);
      });
      function lockChat() {
        if ($(window).width() >= 1000) {
          $("#lockChatCSS").html(`

              .minimized{opacity:1 !important}
              .chat-messages-container.minimized{
          max-height: 240px !important;
          width: 400px !important;

      }
              `);
        } else {
          $("#lockChatCSS").html(`
              .minimized{opacity:1 !important}
              .chat-messages-container.minimized{
          max-height: 240px !important;
          width: 320px !important;

          }`);
        }
      }
      function lockChatOn() {
        lockChat();
        $(window).on("resize", lockChat);
      }
      function lockChatOff() {
        $(window).off("resize", lockChat);
        $("#lockChatCSS").html(``);
      }
      function generateButton() {
        $(".custom-queue-page-container").css("overflow-x", "hidden");
        $(".chat-messages-container")
          .parent()
          .append(
            `<div id="buttonUnit">
                            <div class="setting" id="setting"><span class="tooltip-text" id="tooltip-text1">设置</span><svg xmlns="http://www.w3.org/2000/svg" class="setting-icon" id="setting-avator"viewBox="0 0 512 512"><path fill="#ffffff" d="M495.9 166.6c3.2 8.7 .5 18.4-6.4 24.6l-43.3 39.4c1.1 8.3 1.7 16.8 1.7 25.4s-.6 17.1-1.7 25.4l43.3 39.4c6.9 6.2 9.6 15.9 6.4 24.6c-4.4 11.9-9.7 23.3-15.8 34.3l-4.7 8.1c-6.6 11-14 21.4-22.1 31.2c-5.9 7.2-15.7 9.6-24.5 6.8l-55.7-17.7c-13.4 10.3-28.2 18.9-44 25.4l-12.5 57.1c-2 9.1-9 16.3-18.2 17.8c-13.8 2.3-28 3.5-42.5 3.5s-28.7-1.2-42.5-3.5c-9.2-1.5-16.2-8.7-18.2-17.8l-12.5-57.1c-15.8-6.5-30.6-15.1-44-25.4L83.1 425.9c-8.8 2.8-18.6 .3-24.5-6.8c-8.1-9.8-15.5-20.2-22.1-31.2l-4.7-8.1c-6.1-11-11.4-22.4-15.8-34.3c-3.2-8.7-.5-18.4 6.4-24.6l43.3-39.4C64.6 273.1 64 264.6 64 256s.6-17.1 1.7-25.4L22.4 191.2c-6.9-6.2-9.6-15.9-6.4-24.6c4.4-11.9 9.7-23.3 15.8-34.3l4.7-8.1c6.6-11 14-21.4 22.1-31.2c5.9-7.2 15.7-9.6 24.5-6.8l55.7 17.7c13.4-10.3 28.2-18.9 44-25.4l12.5-57.1c2-9.1 9-16.3 18.2-17.8C227.3 1.2 241.5 0 256 0s28.7 1.2 42.5 3.5c9.2 1.5 16.2 8.7 18.2 17.8l12.5 57.1c15.8 6.5 30.6 15.1 44 25.4l55.7-17.7c8.8-2.8 18.6-.3 24.5 6.8c8.1 9.8 15.5 20.2 22.1 31.2l4.7 8.1c6.1 11 11.4 22.4 15.8 34.3zM256 336a80 80 0 1 0 0-160 80 80 0 1 0 0 160z"/></svg></div>
                            <div class="setting" id="dump" style= "left:-108px"><span class="tooltip-text" id="tooltip-text3">清空历史</span><svg class="setting-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#ffffff" d="M135.2 17.7L128 32 32 32C14.3 32 0 46.3 0 64S14.3 96 32 96l384 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-96 0-7.2-14.3C307.4 6.8 296.3 0 284.2 0L163.8 0c-12.1 0-23.2 6.8-28.6 17.7zM416 128L32 128 53.2 467c1.6 25.3 22.6 45 47.9 45l245.8 0c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg></div>
                            <div class="setting" id="lockChat" style= "left:-72px"><span class="tooltip-text" id="tooltip-text2">锁定聊天框</span><svg id="lockChatSvg"class="setting-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"></svg></div>
                            <div class="setting" id="save" style= "left:-144px"><span class="tooltip-text" id="tooltip-text4">下载聊天记录</span><svg xmlns="http://www.w3.org/2000/svg" class="setting-icon" viewBox="0 0 512 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#ffffff" d="M288 32c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 242.7-73.4-73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l128 128c12.5 12.5 32.8 12.5 45.3 0l128-128c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L288 274.7 288 32zM64 352c-35.3 0-64 28.7-64 64l0 32c0 35.3 28.7 64 64 64l384 0c35.3 0 64-28.7 64-64l0-32c0-35.3-28.7-64-64-64l-101.5 0-45.3 45.3c-25 25-65.5 25-90.5 0L165.5 352 64 352zm368 56a24 24 0 1 1 0 48 24 24 0 1 1 0-48z"/></svg></div>
                            <div class="setting" id="visibility" style= "left:-184px"><span class="tooltip-text" id="tooltip-text5">显示/隐藏系统消息</span><div id="slash"></div><svg class="setting-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="#ffffff" d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM144 256a144 144 0 1 1 288 0 144 144 0 1 1 -288 0zm144-64c0 35.3-28.7 64-64 64c-7.1 0-13.9-1.2-20.3-3.3c-5.5-1.8-11.9 1.6-11.7 7.4c.3 6.9 1.3 13.8 3.2 20.7c13.7 51.2 66.4 81.6 117.6 67.9s81.6-66.4 67.9-117.6c-11.1-41.5-47.8-69.4-88.6-71.1c-5.8-.2-9.2 6.1-7.4 11.7c2.1 6.4 3.3 13.2 3.3 20.3z"/></svg></div>
                            <div class="setting" id="tools" style= "left:-220px"><span class="tooltip-text" id="tooltip-text6">工具箱</span><svg class="setting-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#ffffff" d="M184 48l144 0c4.4 0 8 3.6 8 8l0 40L176 96l0-40c0-4.4 3.6-8 8-8zm-56 8l0 40L64 96C28.7 96 0 124.7 0 160l0 96 192 0 128 0 192 0 0-96c0-35.3-28.7-64-64-64l-64 0 0-40c0-30.9-25.1-56-56-56L184 0c-30.9 0-56 25.1-56 56zM512 288l-192 0 0 32c0 17.7-14.3 32-32 32l-64 0c-17.7 0-32-14.3-32-32l0-32L0 288 0 416c0 35.3 28.7 64 64 64l384 0c35.3 0 64-28.7 64-64l0-128z"/></svg></div>
                        </div>
                            `
          );
        $("#dump").click(() => {
          $(".chat-messages-container").html("")
          localStorage.setItem(gameName, "[]");
        })

        $("#lockChat").click(() => {
          toggleButton(
            $("#lockChat"),

            () => {
              lockChatOn();
              let setting = JSON.parse(localStorage.getItem("scriptSetting"));
              setting.lockChat = !setting.lockChat;
              localStorage.setItem("scriptSetting", JSON.stringify(setting));
            },
            () => {
              lockChatOff();
              let setting = JSON.parse(localStorage.getItem("scriptSetting"));
              setting.lockChat = !setting.lockChat;
              localStorage.setItem("scriptSetting", JSON.stringify(setting));
            },
            `<span class="tooltip-text" id="tooltip-text3">锁定聊天框</span><svg id="lockChatSvg"class="setting-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#ffffff" d="M144 144l0 48 160 0 0-48c0-44.2-35.8-80-80-80s-80 35.8-80 80zM80 192l0-48C80 64.5 144.5 0 224 0s144 64.5 144 144l0 48 16 0c35.3 0 64 28.7 64 64l0 192c0 35.3-28.7 64-64 64L64 512c-35.3 0-64-28.7-64-64L0 256c0-35.3 28.7-64 64-64l16 0z"/></svg>`,
            `<span class="tooltip-text" id="tooltip-text3">锁定聊天框</span><svg id="lockChatSvg"class="setting-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#ffffff" d="M352 144c0-44.2 35.8-80 80-80s80 35.8 80 80l0 48c0 17.7 14.3 32 32 32s32-14.3 32-32l0-48C576 64.5 511.5 0 432 0S288 64.5 288 144l0 48L64 192c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-192c0-35.3-28.7-64-64-64l-32 0 0-48z"/></svg>`,
            "",
            ""
          );
        });
        $("#save").click(() => {
          $(".chat-messages-container").html("");
          prevStorage = JSON.parse(localStorage.getItem(gameName));
          let text = prevStorage
            .map((item) => {
              return item[0];
            })
            .join("\n");
          let blob = new Blob([text], { type: "text/plain" });
          let url = URL.createObjectURL(blob);
          let a = document.createElement("a");
          a.href = url;
          a.download = "chatHistory.txt";
          document.body.appendChild(a);
          a.click();
          document.body.removeChild(a);
          URL.revokeObjectURL(url);
          downloadHistory();
        });

        $("#visibility").click(() => {
          $(".chat-messages-container").html("");
          downloadHistory();
          let setting = JSON.parse(localStorage.getItem("scriptSetting"));
          setting.visibility = !setting.visibility;
          changeHistoryVisibility(setting.visibility);
          localStorage.setItem("scriptSetting", JSON.stringify(setting));
        });

        $("#tools").click(() => {
          let setting = JSON.parse(localStorage.getItem("scriptSetting"));
          setting.displayTools = !setting.displayTools;
          $("#functionPanel").css("display", dictT[setting.displayTools]);
          localStorage.setItem("scriptSetting", JSON.stringify(setting));
        });
        changeHistoryVisibility(
          JSON.parse(localStorage.getItem("scriptSetting")).visibility
        );
      }

      socket.on("game_over", () => {
        generateButton();
        downloadHistory();
        $("#functionPanel").css("display", "block");
      });
      $("#functionPanel").css(
        "display",
        dictT[JSON.parse(localStorage.getItem("scriptSetting")).displayTools]
      );
      if (localStorage.getItem(gameName) == null) {
        localStorage.setItem(gameName, "[]");
      }
      socket.on("game_start", () => {
        $("#functionPanel").css("display", "none");
      });

      socket.on("chat_message", (a, data) => {
          console.log(data)
        prevStorage = JSON.parse(localStorage.getItem(gameName));
        if (data.username != undefined) {
          prevStorage.push([`${data.username}: ${data.text}`, 1]);
        } else if(data.text.indexOf("join")==-1){
          prevStorage.push([`${data.text}`, 0]);
        }
        if (
          data.text ==
          `${localStorage.getItem(
            "GIO_CACHED_USERNAME"
          )} joined the custom lobby.`
        ) {
          generateButton();
          downloadHistory();
          if (JSON.parse(localStorage.getItem("scriptSetting")).lockChat) {
            lockChatOn();
            $("#lockChatSvg").html(
              `<path fill="#ffffff" d="M144 144l0 48 160 0 0-48c0-44.2-35.8-80-80-80s-80 35.8-80 80zM80 192l0-48C80 64.5 144.5 0 224 0s144 64.5 144 144l0 48 16 0c35.3 0 64 28.7 64 64l0 192c0 35.3-28.7 64-64 64L64 512c-35.3 0-64-28.7-64-64L0 256c0-35.3 28.7-64 64-64l16 0z"/>`
            );
          } else {
            lockChatOff();
            $("#lockChatSvg").html(
              `<path fill="#ffffff" d="M352 144c0-44.2 35.8-80 80-80s80 35.8 80 80l0 48c0 17.7 14.3 32 32 32s32-14.3 32-32l0-48C576 64.5 511.5 0 432 0S288 64.5 288 144l0 48L64 192c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-192c0-35.3-28.7-64-64-64l-32 0 0-48z"/>`
            );
          }
          //setTimeout(loadProfile, 1000)
        }
        localStorage.setItem(gameName, JSON.stringify(prevStorage));
      });
      function changeHistoryVisibility(visibility) {
        if (visibility) {
          $(".history-message").css("display", "block");
          $("#visibility").css("background-color", "green");
          $("#slash").css("--slash-width", "0px");
          $("#visibility").css("--vis-hover-color", "#08a408");
        } else {
          $(".history-message").css("display", "none");
          $("#visibility").css("background-color", "red");
          $("#slash").css("--slash-width", "35px");
          $("#visibility").css("--vis-hover-color", "#fa6363");
        }
      }
      function loadProfile() {
        $(".stickyNode").remove();
        $(".names").each((i) => {
          let ele = $(".names").eq(i);
          const profileID = `${btoa(ele.attr("id") || "")
            .replace(/\+/g, "-")
            .replace(/\//g, "_")
            .replace(/=+$/, "")}-profile`;

          fetch(
            `https://generals.io/api/starsAndRanks?u=${getUsername(
              ele
            )}&client=true`
          )
            .then((data) => data.json())
            .then((json) => {
              $(`#${profileID}`).html(``);
              ele.append(
                `<div class="stickyNode"><div class="userProfile" id=${profileID}></div></div>`
              );
              let k = 0;
              if (json.stars.ffa != undefined && json.stars.ffa != null) {
                $(`#${profileID}`).append(`
                    <div class="userProfileLine" style="padding-top:4px"><div class="ffa">FFA</div><div class="star">⭐${Math.round(json.stars.ffa * 10) / 10
                  }</div><div class="rank">#${json.ranks.ffa}</div></div>
                  `);
                k = 1;
              }
              if (json.stars.duel != undefined && json.stars.duel != null) {
                $(`#${profileID}`).append(`
                    <div class="userProfileLine"><div class="duel">1v1</div><div class="star">⭐${Math.round(json.stars.duel * 10) / 10
                  }</div><div class="rank">#${json.ranks.duel}</div></div>
                  `);
                k = 1;
              }
              if (json.stars["2v2"] != undefined && json.stars["2v2"] != null) {
                $(`#${profileID}`).append(`
                    <div class="userProfileLine" style="border-bottom: none;padding-bottom: 0px;"><div class="team">2v2</div><div class="star">⭐${Math.round(json.stars["2v2"] * 10) / 10
                  }</div><div class="rank">#${json.ranks["2v2"]}</div></div>
                  `);
                k = 1;
              }
              if (k == 0) {
                $(`#${profileID}`).append(`
                    <div class="userProfileLine"><p>无天梯信息</p></div>
                  `);
              }
              $(`#${profileID}`).css(
                "margin-left",
                `${$(`#${profileID}`).parent().parent().width() + 20}px`
              );
              ele.on("mouseover", () =>
                $(`#${profileID}`).css("display", "block")
              );
              ele.on("mouseout", () =>
                $(`#${profileID}`).css("display", "none")
              );
            });
        });
      }
    };
  }


  main();

})();