Greasy Fork

来自缓存

Greasy Fork is available in English.

妖火网增强脚本Plus

让妖火再次变得伟大(手动狗头.jpg)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name            妖火网增强脚本Plus
// @namespace       https://www.yaohuo.me/
// @version         1.8.3
// @description     让妖火再次变得伟大(手动狗头.jpg)
// @author          柠檬没有汁@27894
// @match           *://yaohuo.me/*
// @match           *://*.yaohuo.me/*
// @icon            https://yaohuo.me/css/favicon.ico
// @run-at          document-body
// @license         MIT
// @grant           none
// @noframes
// @homepage        https://www.yaohuo.me/bbs/userinfo.aspx?touserid=27894
// @supportURL      https://www.yaohuo.me/bbs/userinfo.aspx?touserid=27894
// ==/UserScript==

/* ================================================== 变量开始 ================================================== */

// 脚本默认设置
const defaultSetting = {
  version: "1.8.3", // 脚本版本
  checkVersion: false, // 检查更新

  firstLoadScript: true, // 第一次加载脚本
  showSettingIcon: true, // 显示设置 logo
  settingIconSize: 50, // 设置 logo 大小
  showTopAndDownBtn: true, // 显示一键回到顶部/底部
  hideXunzhang: false, // 隐藏勋章

  showBookViewUbb: false, // 发帖 ubb 展开
  showBookViewEmoji: false, // 发帖表情展开
  // autoCloseBookViewUbb:false,// 发帖 ubb 点击后自动关闭
  autoCloseBookViewEmoji: false, // 发帖表情点击后自动关闭

  showHuifuUbb: false, // 回帖 ubb 展开
  showHuifuEmoji: false, // 回帖表情展开
  showMsgUbb: false,// 信箱 ubb 展开
  showMsgEmoji: false,// 信箱表情展开
  // autoCloseHuifuUbb:false,// 发帖 ubb 点击后自动关闭
  autoCloseHuifuEmoji: false, // 发帖表情点击后自动关闭
  bookviewEmojiPage: 1, // 发帖表情分页页码
  huifuEmojiPage: 1, // 回帖表情分页页码
  msgEmojiPage: 1, // 信箱表情分页页码

  imgBlur: false, // 图片模糊
  imgThumbWidth: 200, // 图片缩小后显示宽度
  useRight: false, // 下一页显示在右边
  autoLoadMoreBookList: false, // 帖子列表自动加载更多
  autoLoadMoreHuifuList: false, // 回复列表自动加载更多
  openLayerForBook: false, // pc 端帖子在弹窗中打开

  imgUploadApiUrl: ["https://mtbed.netsons.org/upload.php", "https://img.ink/api/upload", 'https://tc.qdqqd.com/uploadmt'],
  imgUploadSelOpt: 0, // 使用图床
  suimoToken: "", // 水墨图床 token
  textareaAutoFocus: true, // 输入框自动获取焦点

  showMoreSetting: true, // 高级设置
  oneClickCollectMoney: false, // 一键吃肉
  showChuiniuHistory: false, // 显示吹牛发布者历史
  showHuifuCopy: false, // 复读机(回复+1)
  huifuCopyAutoSubmit: false, // 复读机自动提交
  useUserBlackList: false, // 使用用户黑名单
  userBlackList: "", // 黑名单,填入用户ID即可屏蔽帖子和回复
  userCustomEmojiList: "" // 自定义表情,填入表情代码即可使用
};
// 自定义样式
const customCSS = `
  .v2jun-reset{
    margin:0;
    padding:0;
  }
  /* 设置弹出框 样式 */
  .v2jun-setting-div ul li{
    display:flex;
    margin:10px auto;
    justify-content: center;
    align-items: center;
  }
  .v2jun-setting-div ul li + .setting-li-between{
    padding:0 10px;
    justify-content: space-between;
  }
  .v2jun-setting-div ul li + .setting-li-tips{
    font-size: 12px;
    line-height: 14px;
    display: block;
    padding: 0 10px;
    margin: -10px 0 0;
    color: red;
    text-align: left;
  }
  .v2jun-setting-li-title hr{
    flex:1;
  }
  .v2jun-setting-li-title hr:nth-of-type(1){
    margin-right:10px;
  }
  .v2jun-setting-li-title hr:nth-of-type(2){
    margin-left:10px;
  }
  .v2jun-setting-cancel-btn {
    background-color: #999;
    color: #fff;
    border-radius:5px;
    padding: 5px 10px;
  }
  .v2jun-setting-confirm-btn {
    background-color: #1677ff;
    color: #fff;
    border-radius:5px;
    padding: 5px 10px;
    margin-left: 10px;
  }
  .v2jun-setting-confirm-btn{
    width:50px;
    padding-left:10px;
    height:15px;
  }
  .v2jun-setting-li-input{
    width:50px;
    padding-left:10px;
    height:15px;
  }
  .v2jun-setting-div ::-webkit-input-placeholder {
    font-size:12px;
  }
  .v2jun-setting-div ::-moz-placeholder {
    font-size:12px;
  }

  /* 开关 样式 */
  .v2jun-switch {
    position: relative;
    float: left;
    width: 60px;
    margin: 0;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
  }
  .v2jun-switch-checkbox {display: none;}
  .switch-label {
    display: block;
    overflow: hidden;
    cursor: pointer;
    border: 2px solid #999999;
    border-radius: 20px;
  }
  .v2jun-switch-inner {
    display: block;
    width: 200%;
    margin-left: -100%;
  }
  .v2jun-switch-inner::before,
  .v2jun-switch-inner::after {
    display: block;
    float: right;
    width: 50%;
    height: 20px;
    line-height: 20px;
    padding: 0;
    font-size: 14px;
    color: white;
    font-family: Trebuchet, Arial, sans-serif;
    font-weight: bold;
    box-sizing: border-box;
  }
  .v2jun-switch-inner::after {
    content: attr(data-on);
    padding-left: 10px;
    background-color: #00e500;
    color: #FFFFFF;
    text-align:left;
  }
  .v2jun-switch-inner::before {
    content: attr(data-off);
    padding-right: 10px;
    background-color: #EEEEEE;
    color: #999999;
    text-align: right;
  }
  .v2jun-switch-handle {
    position: absolute;
    top: 0;
    bottom: 0;
    /*right: 72px;*/
    display: block;
    width: 14px;
    height: 14px;
    margin: 3px;
    background: #FFFFFF;
    border: 2px solid #999999;
    border-radius: 50%;
  }
  .v2jun-switch-checkbox:checked + .switch-label .v2jun-switch-inner {
    margin-left: 0;
  }
  .v2jun-switch-checkbox:checked + .switch-label .v2jun-switch-handle {
    right: 0px;
  }
  /* 复读机按钮 样式 */
  .v2jun-huifu-copy{
    display: inline-block;
    height:22px;
    line-height:22px;
    padding:0 10px;
    text-align:center;
    color:#fff;
    margin:0 10px 0 5px;
    background-color: #407088;
    border-radius: 5px;
    white-space:nowrap;
  }

  .v2jun-custom-toggle-btn{
    background-image: linear-gradient(#f4f4f4,#ececec);
    display: inline-block;
    overflow: visible;
    margin: 0 5px 7px;
    padding: .5em 1em;
    outline: 0;
    border: 1px solid #d4d4d4;
    color: orangered;
    text-decoration: none;
    white-space: nowrap;
    font: 11px/normal sans-serif;
    cursor: pointer;
    border-radius: 5px;
  }
  /* 表情增强 样式 */
  .v2jun-emojilist-div{
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(50px, 1fr));
    grid-gap: 2px;
    /*display: flex;
    justify-content: space-between;
    flex-wrap: wrap;*/
    padding: 5px;
    margin-bottom:5px;
    font-size: 12px;
    border: 1px solid #d4d4d4;
    border-radius: 5px 5px 0 0;
  }
  .v2jun-emojilist-img{
    width:50px;
    height:50px;
  }
  .v2jun-huifu-emoji{
    margin:0 1% 5px;
    border-color:#d4d4d4;
  }
  /* ubb 增强 样式 */
  .v2jun-ubblist-div{
    display:flex;
    flex-wrap: wrap;
    gap: 4px 4px;
    justify-content: space-between;
    margin-bottom:5px;
    padding:5px;
    font-size:12px;
    border: 1px solid #eee;
    border-radius: 5px;
  }
  .v2jun-ubb-item{
    height:25px;
    line-height:25px;
    /*margin:0 5px 5px 0;*/
    padding:0 10px;
    display:inline-block;
    border: 1px solid #1abc9c;
    color: #333;
    text-decoration: none;
    border-radius:30px;
  }
  .v2jun-huifu-ubb{
    margin:0 1% 5px;
    border-color:#d4d4d4;
  }

  .v2jun-clear-setting{
    color:#3d68a8;
    margin-left:-4px;
  }

  /* 等待提示框 样式 */
  .v2jun-wait-box-overlay {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background: rgba(0, 0, 0, 0.6);
      display: flex;
      justify-content: center;
      align-items: center;
      z-index: 1000;
  }
  .v2jun-wait-box-modal {
    background: white;
    padding: 20px 20px 10px;
    border-radius: 10px;
    text-align: center;
  }
  .v2jun-wait-box-spinner {
    border: 4px solid rgba(0, 0, 0, 0.1);
    width: 36px;
    height: 36px;
    border-radius: 50%;
    border-left-color: #09f;
    animation: spin 1s linear infinite;
    margin: 0 auto;
  }
  @keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }

  .v2jun-huifu-ubb-list-div{
    margin: 0 1%;
    padding:10px;
    font-size:12px;
    border: 1px solid #d4d4d4;
    border-radius: 8px;
  }
  .v2jun-huifu-ubb-list-title{
    height:14px;
    display:flex;
    justify-content: center;
    align-items: center;
    color:red;
  }
  .v2jun-huifu-ubb-list-title hr{
    flex:1;
  }
  .v2jun-huifu-ubb-list-title hr:nth-of-type(1){
    margin-right:10px;
  }
  .v2jun-huifu-ubb-list-title hr:nth-of-type(2){
    margin-left:10px;
  }
  .v2jun-huifu-ubb-box{
    display:flex;
    flex-wrap: wrap;
    gap: 4px 4px;
    justify-content: space-between;
    margin:6px 0;
  }

  .v2jun-input-popup-mask {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.5);
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 9999;
  }
  .v2jun-input-popup {
    background-color: white;
    padding: 20px;
    border-radius: 5px;
    width: 600px;
    max-width:80%;
  }
  .v2jun-input-popup-label {
    display: block;
    font-weight: bold;
  }
  .v2jun-input-popup-textarea {
    width: 100%;
    min-height: 40px;
    resize: vertical;
  }
  .v2jun-input-popup-buttons {
    text-align: center;
  }
  .v2jun-input-popup-submit-btn, .v2jun-input-popup-cancel-btn {
    margin: 0 10px;
    border:0;
  }
  .v2jun-input-popup-submit-btn{
    background-color: #1677ff;
    color: #fff;
    border-radius: 5px;
    padding: 5px 10px;
    margin-left: 10px;
  }
  .v2jun-input-popup-cancel-btn {
    background-color: #999;
    color: #fff;
    border-radius: 5px;
    padding: 5px 10px;
  }
  .v2jun-popup-setting-import,.v2jun-popup-setting-export{
    background-color: #666;
    color: #fff;
    border-radius: 5px;
    padding: 5px 30px;
    letter-spacing: 2px;
  }
`;
// 表情
const emojiList = [
  // 论坛自带表情
  "face/踩.gif",
  "face/狂踩.gif",
  "face/淡定.gif",
  "face/囧.gif",
  "face/不要.gif",
  "face/重拳出击.gif",
  "face/砳砳.gif",
  "face/滑稽砳砳.gif",
  "face/沙发.gif",
  "face/汗.gif",
  "face/亲亲.gif",
  "face/太开心.gif",
  "face/酷.gif",
  "face/思考.gif",
  "face/发呆.gif",
  "face/得瑟.gif",
  "face/哈哈.gif",
  "face/泪流满面.gif",
  "face/放电.gif",
  "face/困.gif",
  "face/超人.gif",
  "face/害羞.gif",
  "face/呃.gif",
  "face/哇哦.gif",
  "face/要死了.gif",
  "face/谢谢.gif",
  "face/抓狂.gif",
  "face/无奈.gif",
  "face/不好笑.gif",
  "face/呦呵.gif",
  "face/感动.gif",
  "face/喜欢.gif",
  "face/疑问.gif",
  "face/委屈.gif",
  "face/你不行.gif",
  "face/流口水.gif",
  "face/潜水.gif",
  "face/咒骂.gif",
  "face/耶耶.gif",
  "face/被揍.gif",
  "face/抱走.gif",

  // 自定义表情
  "http://static2.51gonggui.com/FhBfMfl4sGC3QJVTMaLqEKkE90Ia#.gif",
  "http://static2.51gonggui.com/FoKvdu89eiq0q-24IfOM2mFB0vIq#.gif",
  "http://static2.51gonggui.com/FmNyrjU8Wq0m3PiwHQJwDhHdv-EJ#.gif",
  "http://static2.51gonggui.com/FrZ6GDJiOAz3pp4e5_8uSShSXXXk#.gif",
  "http://static2.51gonggui.com/FiZiSSyXSa8eCzwOXmIfOOpfA_7a#.gif",
  "http://static2.51gonggui.com/FqNDzswUNJ-AsSHXyxXB4Qm1X0y-#.gif",
  "http://static2.51gonggui.com/Fsq-HyBc5lP6vZY_qeWofOM9mRVH#.gif",
  "http://static2.51gonggui.com/FkEHwSlEfQ7bWya6-wg366Xy91qW#.gif",
  "http://static2.51gonggui.com/Fi2hY7M9DPgD9s0aCWemwk2iYUDW#.gif",
  "http://static2.51gonggui.com/Fhry6EpdUBqFCt3OOyQTkLZMZGFR#.gif",
  "http://static2.51gonggui.com/FhgYnWJ-apnyjSXOpInJhLbfUQFY#.gif",
  "http://static2.51gonggui.com/FvSxOEIhyA7ID1J8emIME7tBT7Io#.gif",
  "https://pic2.ziyuan.wang/2023/10/05/yaohuo007_6d248534e18f5.gif",
  "http://static2.51gonggui.com/FunDHky9UKkB-4zj-bfSb82u81Xg#.gif",
  "http://static2.51gonggui.com/FgXUeACmKWWMDT9hrpVAnQp4dCqF#.gif",
  "http://static2.51gonggui.com/Fg_qtra3abNozPxaoEMVKO7VIsuX#.gif",
  "http://static2.51gonggui.com/Fj7WAkv87tpL1I26WQgSaXlsyYBL#.gif",
  "http://static2.51gonggui.com/FgwFBazeUavJcw-SL7FS6wUkcUTk#.gif",
  "https://pic2.ziyuan.wang/2023/05/02/17a86bd7372d8.GIF",
  "https://pic2.ziyuan.wang/2023/05/17/177e4e0e2f28d.gif",
  "https://pic2.ziyuan.wang/2023/06/19/f50dc2fbf34ac.gif",
  "https://pic2.ziyuan.wang/user/13530769942/2023/12/yaohuo.me_694810949_5f454a4387b2d.png",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/FkyiMRaJI1BfuA6T3w4Z9mJh1qbg_3e38409950af1.gif",
  "https://pic2.ziyuan.wang/2023/05/16/5152d0749ff41.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/FpZEifxiFGs1BWtHjFsk5tJJNKSE_8b6f63437539d.gif",
  "https://pic2.ziyuan.wang/2023/06/15/5640689a44056.GIF",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/FvMXbnIX8RavSBAhflxf1zomD1ov_902abba24378b.gif",
  "https://pic2.ziyuan.wang/2023/07/11/30aff1eed1845.GIF",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/FkeVK5icB5-Pc7mbZitDTX1AqfNO_3a687a8c7683f.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/Fit100hjJ-T5RwQxeNdoVWplvNvU_96758df767a69.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/v2-568bb2311e00c3ecbc4dd49ab0709f09_b_5215574668d2f.gif",
  "https://pic2.ziyuan.wang/user/sub/2024/04/458ed8da862d4a71bc5ab4c2435711fd_088c2fc6f5680.png",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_76964470c8b1b.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_0318a6f925fbc.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_4629d7fff2f0a.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_99ab94aa14e58.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_4917d00f77b70.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_7b42669bad9e0.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_3cb79bd54abd2.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_ae29120dd414c.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_d729e16f5178a.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_f17b227dc0b65.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_32ca0d60dcdcc.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_f524ab469146c.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_f72a3922675d8.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_a1114209167b6.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_91e15b0079ada.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_38a61440b1cd3.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_933c24257fae8.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_f0f73185a8b01.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_a56ac656a1148.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_f0562dacf1bfd.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_eff33afa00163.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_070ec2f5a6118.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_dc0b98359052f.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_163be41a06cf1.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_fa50e82d42778.png",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_4b51d01f83ef7.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_a14862d0f2c7d.png",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_34e4ae7e3abeb.png",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_c42a350bb7511.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_846823994eb82.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_b166edaec1bc4.png",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_e22a601c90e31.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_233e5e38d4d5d.png",
  "https://pic2.ziyuan.wang/2023/06/15/fb73ec52bc113.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_6453568bc84d7.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_609d4a06138ec.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_59e60f0a98da8.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_6723d2f29219d.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_0c538a929de62.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_05208a26bf538.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_80e3cbbc106d8.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_7a85e377185b6.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_17024a36c62c1.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_aa11042623721.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_0b17ce20017e5.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_0b3366c8e4f2c.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_f5e49c8b9fb10.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_d7784aa75cade.png",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_da4d598a0038a.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_e1edb813037b0.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_acce220dbe392.gif",
  "https://pic2.ziyuan.wang/2023/06/15/e628d8c01dd31.GIF",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_4abf7bfdc60ed.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_4917c90348a0c.gif",
  "https://pic2.ziyuan.wang/user/88188/2024/03/QM_724126154_ffebe99093e79.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_15011a3805a09.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_a5da11000111e.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_f7c611250e4e6.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_bd955625f4702.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_f5220e0315e71.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_f0f3d2cc907db.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_f19bf2b6e968a.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_2bd43160ac0cf.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_0bcb8ff61e176.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_effdc1e5a1e10.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_8085686380b77.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_152a3a2d7791f.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_3a12a51f39ed7.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_3e3226766d24a.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_e73e9290ffab5.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_16e30d4d3f3e5.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_abf0a9b35e852.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_8fb59450d49d9.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_42e17b796952b.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_88413a40a35ef.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_b4510e0dcbf3e.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_bfa59025dd9bb.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_ab35a6fb3b639.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_c898a991dc3c7.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_ba74bfaaba2d5.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_bd689ae345566.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_3e36a00ccf9ca.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_b7b2a740a113d.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_6ac3667255a25.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_6ca265686c4ce.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_ec62db88c67ff.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_91d73e0e153c0.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_8009629f69f1b.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_b0fce121024b6.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_1c888990cdaac.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_77a3d33dd7534.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_73033c37f782c.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_1fac97d23d1a5.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_fc8aae05e2ae1.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_52af195cce943.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_78c1938f0e5cb.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/webwxgetmsgimg_254f5d90c59fc.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/04/6ba11b67f84c108d4b83a0c60717f24_b41624539f24e.jpg"
];
// ubb
const ubbList = [
  {
    ubbType: "input",
    name: "超链接",
    inputTitle: ["网址", "网址说明"],
    ubbHandle: (inputValues) => `[url=${inputValues[0]}]${inputValues[1]}[/url]`
  },
  {
    ubbType: "input",
    name: "红字",
    inputTitle: ["红字内容"],
    ubbHandle: (inputValues) => `[forecolor=red]${inputValues[0]}[/forecolor]`
  },
  {
    ubbType: "input",
    name: "加粗",
    inputTitle: ["加粗内容"],
    ubbHandle: (inputValues) => `[b]${inputValues[0]}[/b]`
  },
  {
    ubbType: "input",
    name: "斜体",
    inputTitle: ["斜体内容"],
    ubbHandle: (inputValues) => `[i]${inputValues[0]}[/i]`
  },
  {
    ubbType: "input",
    name: "下划线",
    inputTitle: ["下划线内容"],
    ubbHandle: (inputValues) => `[u]${inputValues[0]}[/u]`
  },
  {
    ubbType: "input",
    name: "删除线",
    inputTitle: ["删除线内容"],
    ubbHandle: (inputValues) => `[strike]${inputValues[0]}[/strike]`
  },
  {
    ubbType: "input",
    name: "分割线",
    inputTitle: ["不需要输入内容,直接点击确定即可"],
    ubbHandle: (inputValues) => `[hr]`
  },
  {
    ubbType: "input",
    name: "代码",
    inputTitle: ["代码内容"],
    ubbHandle: (inputValues) => `[code]${inputValues[0]}[/code]`
  }, {
    ubbType: "input",
    name: "MarkDown",
    inputTitle: ["内容"],
    ubbHandle: (inputValues) => `[md]\n\n${inputValues[0]}\n\n[/md]`
  },
  {
    ubbType: "input",
    name: "拨号",
    inputTitle: ["手机号码"],
    ubbHandle: (inputValues) => `[call]${inputValues[0]}[/call]`
  },
  {
    ubbType: "input",
    name: "发短信",
    inputTitle: ["手机号码", "短信内容"],
    ubbHandle: (inputValues) => `[url=sms:${inputValues[0]}?body=${inputValues[0]}]点此发送[/url]`
  },
  {
    ubbType: "input",
    name: "当前时间",
    inputTitle: ["不需要输入内容,直接点击确定即可"],
    ubbHandle: (inputValues) => `[now]`
  },
  {
    ubbType: "input",
    name: "倒计时天数",
    inputTitle: ["需要倒计时的日期(格式:2030-01-01)"],
    ubbHandle: (inputValues) => `[codo]${inputValues[0]}[/codo]`
  },
  {
    ubbType: "input",
    name: "QQ音乐",
    inputTitle: ["QQ音乐歌曲链接或ID"],
    ubbHandle: (inputValues) => `[qqmusic]${inputValues[0]}[/qqmusic]`
  },
  {
    ubbType: "input",
    name: "网易云音乐",
    inputTitle: ["网易云音乐歌曲链接或ID"],
    ubbHandle: (inputValues) => `[wymusic]${inputValues[0]}[/wymusic]`
  },
  {
    ubbType: "input",
    name: "图片(外链)",
    inputTitle: ["图片链接"],
    ubbHandle: (inputValues) => `[img]${inputValues[0]}[/img]`
  },
  {
    ubbType: "uploadImg",
    name: "图片(上传)",
    ubbHandle: (inputValues) => `[img]${inputValues[0]}[/img]\n`,
    upload: {
      type: "img",
      accept: "image/*"
    }
  },
  {
    ubbType: "input",
    name: "视频(外链)",
    inputTitle: ["视频外链(未能找到合适的文件站,如有可提供给我)"],
    ubbHandle: (inputValues) => `[movie]${inputValues[0]}[/movie]`
  },
  {
    ubbType: "uploadVideo",
    name: "视频(上传)",
    ubbHandle: (inputValues) => `[movie]${inputValues[0]}[/movie]`,
    upload: {
      type: "movie",
      accept: "video/*"
    },
  },
  {
    ubbType: "input",
    name: "音频(外链)",
    inputTitle: ["音频外链(未能找到合适的文件站,如有可提供给我)"],
    ubbHandle: (inputValues) => `[audio]${inputValues[0]}[/audio]`,
  },
  {
    ubbType: "uploadAudio",
    name: "音频(上传)",
    ubbHandle: (inputValues) => `[audio]${inputValues[0]}[/audio]`,
    upload: {
      type: "audio",
      accept: "audio/*"
    }
  },
  {
    ubbType: "jxVideo",
    name: "抖音解析",
    inputTitle: ["链接(不需要去除中文和多余字符)"],
    ubbHandle: (inputValues) => `[movie]${inputValues}[/movie]`
  },
  {
    ubbType: "jxVideo",
    name: "快手解析",
    inputTitle: ["链接(不需要去除中文和多余字符)"],
    ubbHandle: (inputValues) => `[movie]${inputValues}[/movie]`
  },
  {
    ubbType: "jxVideo",
    name: "TikTok解析",
    inputTitle: ["链接(不需要去除中文和多余字符)"],
    ubbHandle: (inputValues) => `[movie]${inputValues}[/movie]`
  },
  {
    ubbType: "jxZb",
    name: "抖音直播解析",
    inputTitle: ["链接(不需要去除中文和多余字符)"],
    ubbHandle: (inputValues) => `[movie]${inputValues}[/movie]`
  },
  {
    ubbType: "jxZb",
    name: "快手直播解析",
    inputTitle: ["链接(不需要去除中文和多余字符)"],
    ubbHandle: (inputValues) => `[movie]${inputValues}[/movie]`
  }
  // { ubbType:'jxVideo',name: "B站解析", inputTitle: ["链接(不需要去除中文和多余字符)"], ubbHandle: (inputValues) => `[movie]${inputValues[0]}[/movie]` },
  // { name: "皮皮虾解析", inputTitle: ["链接(不需要去除中文和多余字符)"], ubbHandle: (inputValues) => `[movie]${inputValues[0]}[/movie]` },
  // { name: "屋舍文件" },
];
// 设置图标
const settingIconBase64 =
  "data:image/png;base64,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";
/* ================================================== 变量结束 ================================================== */

(async function () {
  if (!checkLocation()) return;

  const jqueryIsLoad = await loadAndExecuteScript("https://code.jquery.com/jquery-3.7.1.min.js", "jquery-3.7.1.min");
  if (!jqueryIsLoad) { notifyBox("未知错误,JQuery 加载失败,请刷新重试", false); return; }


  const setttingIsInit = await initSetting();
  if (!setttingIsInit) { notifyBox("未知错误,初始化设置失败,请刷新重试", false); return; }


  if (!userSettingCache) { notifyBox("未知错误,加载用户设置失败", false); return; }

  if (userSettingCache?.firstLoadScript) {
    alert("请合理/合法使用本脚本,不要影响论坛正常看帖/回帖!!!如因使用本脚本而被封号/小黑屋,雨我无瓜(免责声明.jpg)");
    saveUserSetting("firstLoadScript", false);
  }

  userSettingCache?.checkVersion && checkVersion();
  addCustomStyle();
  // 页面解析完成后再执行代码,否则 jquery 可能会获取不到 document 内容导致脚本执行失败
  $(document).ready(() => {
    createScriptSetting();
    userSettingCache?.showTopAndDownBtn && addTopAndDown();
    // userSettingCache?.showChuiniuHistory && executeFunctionForURL("/games/chuiniu/doit.aspx", chuiniuHistory);
    userSettingCache?.oneClickCollectMoney && executeFunctionForURL(/^(\/bbs-.*\.html(\?.*)?|\/bbs\/book_view\.aspx\?.*id=\d+.*)$/i, speedEatMoney);
    userSettingCache?.hideXunzhang && executeFunctionForURL(/^(\/bbs-.*\.html(\?.*)?|\/bbs\/book_view\.aspx\?.*id=\d+.*)$/i, hideXunzhang);
    userSettingCache?.openLayerForBook && executeFunctionForURL("/bbs/book_list.aspx", openLayer);
  });
  // 页面加载完成后再执行代码,否则页面资源可能会获取不到,导致玄学bug,比如图片等
  $(window).on("load", () => {
    executeFunctionForURL(/^\/bbs\/book_view_.*\.aspx(\?.*)?$/i, bookViewBetter);
    executeFunctionForURL(/^(\/bbs-.*\.html(\?.*)?|\/bbs\/book_view\.aspx\?.*id=\d+.*)$/i, huifuBetter);
    userSettingCache?.autoLoadMoreBookList && executeFunctionForURL("/bbs/book_list.aspx", autoLoadMoreBookList);
    userSettingCache?.autoLoadMoreHuifuList && executeFunctionForURL(/^(\/bbs-.*\.html(\?.*)?|\/bbs\/book_view\.aspx\?.*id=\d+.*)$/i, autoLoadMoreHuifuList);
    userSettingCache?.useRight && executeFunctionForURL(/^\/bbs\/book.*$/i, useRightNextBtn);
    executeFunctionForURL("/bbs/messagelist_view.aspx", messageBetter);
    listenRecontentLoad();
  });
})();
// 黑名单
const checkBlackUserIDReqCache = JSON.parse(sessionStorage.getItem("checkBlackUserIDReqCache")) || {}; // 缓存请求结果
function handleUserBlacklist() {
  // 生成拉黑按钮
  executeFunctionForURL(/^(\/bbs-.*\.html(\?.*)?|\/bbs\/book_view\.aspx\?id=\d+.*|\/bbs\/book_re\.aspx\?.*)$/i, _add_black_btn);

  // console.log("开始处理黑名单");
  const userWhiteIdList = ["1000", "36787", "11637"]; // 管理员白名单
  const userBlackIdListStr = getUserSetting("userBlackList");
  if (!userBlackIdListStr || userBlackIdListStr.length === 0) return;
  let userBlackIdList = userBlackIdListStr.split(",").filter((id) => id.trim() !== "" && !userWhiteIdList.includes(id));
  if (!Array.isArray(userBlackIdList)) userBlackIdList = [];

  // 处理帖子列表
  _handleBookList();
  // 处理评论区
  executeFunctionForURL(/^(\/bbs-.*\.html(\?.*)?|\/bbs\/book_view\.aspx\?id=\d+.*|\/bbs\/book_re\.aspx\?.*)$/i, _handleComments);

  // 生成拉黑按钮
  function _add_black_btn() {
    // console.log("开始添加黑名单按钮");

    // 处理楼主
    const lzBlackBtnEle = $("<span style='color:red;margin-left:10px;'>(加入黑名单)</span>");
    const louzhuEle = $(".louzhuxinxi.subtitle .louzhu .online");
    if (louzhuEle.data('v2jun-data-louzhu-black-processed') !== true) {
      louzhuEle.after(lzBlackBtnEle);
      lzBlackBtnEle.click(() => {
        // console.log("点击了加入黑名单按钮");
        if (!confirm("确定要将该用户加入黑名单吗?")) return;
        const userHref = $(".louzhuxinxi.subtitle .louzhu").find(".louzhunicheng a").attr("href");
        // console.log('获取到的用户ID:', _extractUserId(userHref));
        _addToStorage(_extractUserId(userHref));
      });
      louzhuEle.data("v2jun-data-louzhu-black-processed", true);
    }


    // 处理评论区
    const isNewHuifu = $(".recontent .forum-post").length > 0;
    if (isNewHuifu) {
      // 新版回帖
      $(".recontent .forum-post .post-header .user-name").each(function () {
        // 检查是否已处理过
        if ($(this).data("v2jun-black-btn-processed") === true) return;

        const blackBtnEle = $("<span style='color:red;margin-left:10px;'>(加入黑名单)</span>");
        blackBtnEle.click(() => {
          if (!confirm("确定要将该用户加入黑名单吗?")) return;
          const userHref = $(this).closest(".forum-post .post-header .user-name").find(".user-id a").attr("href");
          _addToStorage(_extractUserId(userHref));
        });
        $(this).append(blackBtnEle);
        // 标记为已处理
        $(this).data("v2jun-black-btn-processed", true);
      });
    } else {
      // 旧版回帖
      $(".recontent .list-reply .renick").each(function () {
        // 检查是否已处理过
        if ($(this).data("v2jun-black-btn-processed") === true) return;

        const blackBtnEle = $("<span style='color:red;margin-left:10px;'>(加入黑名单)</span>");
        blackBtnEle.click(() => {
          // console.log("点击了加入黑名单按钮");
          if (!confirm("确定要将该用户加入黑名单吗?")) return;
          // 获取父级下类名为 renick 里的 a 标签的 href
          const userHref = $(this).closest(".reline.list-reply").find(".renick a").attr("href");
          // console.log('获取到的用户ID:', _extractUserId(userHref));
          _addToStorage(_extractUserId(userHref));
        });
        $(this).after(blackBtnEle);
        // 标记为已处理
        $(this).data("v2jun-black-btn-processed", true);
      });
    }

    function _addToStorage(userid) {
      const cacheBlackList = getUserSetting("userBlackList");
      if (!cacheBlackList) saveUserSetting("userBlackList", userid);
      else saveUserSetting("userBlackList", `${cacheBlackList},${userid}`);
      notifyBox("已将用户ID: " + userid + " 加入黑名单", "success");
      // location.reload();
    }
  }
  // 处理帖子列表(首页、版块列表、帖子详情页)
  function _handleBookList() {
    // console.log("开始处理帖子列表");
    const bookList = $(".list, .listdata.line1, .listdata.line2");
    bookList.each(function () {
      const bookItem = $(this);
      // console.log("解析到帖子列表:", bookItem);
      const bookLink = bookItem.find('a[href^="/bbs-"]');
      const bookIDArr = [];
      bookLink.each(function () {
        const bookId = $(this)
          .attr("href")
          .match(/\/bbs-(\d+)\.html/)?.[1];
        // console.log("解析到帖子ID:", bookId);
        if (!bookId) return;
        bookIDArr.push(bookId);
      });
      // 请求每个帖子的管理信息,以拿到用户id
      const requests = bookIDArr.map((id) => {
        // 检查缓存,如果有缓存就直接返回,大幅提升性能,降低开销
        if (checkBlackUserIDReqCache[id]) {
          return Promise.resolve(checkBlackUserIDReqCache[id]);
        }

        return $.get(`/bbs/Book_View_admin.aspx?id=${id}`).then((res) => {
          // 缓存结果,避免二次请求造成的性能浪费
          checkBlackUserIDReqCache[id] = res;
          try {
            sessionStorage.setItem("checkBlackUserIDReqCache", JSON.stringify(checkBlackUserIDReqCache));
          } catch (e) {
            if (e.name === "QuotaExceededError") {
              sessionStorage.removeItem("checkBlackUserIDReqCache");
              console.warn("存储空间已满,以移除左右旧缓存");
              sessionStorage.setItem("checkBlackUserIDReqCache", JSON.stringify(checkBlackUserIDReqCache));
            }
          }
          return res;
        });
      });
      Promise.all(requests).then((reqRes) => {
        reqRes.forEach((resItem, resItemindex) => {
          const $linksWithUserID = $(resItem).find('a[href*="touserid="]');
          $linksWithUserID.each(function () {
            const bookUserId = _extractUserId($(this).attr("href"));
            // console.log("解析到的用户ID:", bookUserId);
            if (bookUserId && userBlackIdList.includes(bookUserId)) {
              console.log("发现此评论作者在黑名单中,用户ID:", bookUserId);
              if ($(bookItem).hasClass("listdata")) {
                // 新帖列表页
                $(bookItem).remove();
              } else {
                // 首页
                // console.log("要移除的帖子序号:", resItemindex + 1);
                $(bookItem)
                  .contents()
                  .filter(function () {
                    const removeIndex = resItemindex + 1;
                    return this.nodeType === 3 && this.textContent.trim() === removeIndex + ".";
                  })
                  .remove();
                // 移除对应的a标签,br标签
                $(bookItem).find('a[href^="/bbs-"]').eq(resItemindex).remove();
                $(bookItem).find("br").eq(resItemindex).remove();
              }
            }
          });
        });
      });
    });
  }
  // 处理评论区
  function _handleComments() {
    // console.log("开始处理评论区");
    const selector = $(`
      .recontent .forum-post,
      .recontent .list-reply,
      .recontent .recontent .forum-post,
      .recontent .recontent .list-reply`);
    const userLinkSelector = ".user-nick a, .renick a";
    // 一次性查询所有评论,减少DOM操作
    $(selector).not(function () {
      return $(this).data("v2jun-check-blocklist-processed") === true;
    }).each(function () {
      const $userLink = $(this).find(userLinkSelector);
      // 如果找到了用户链接
      if ($userLink.length && $userLink.length > 0) {
        const userHref = $userLink.attr("href");
        const userId = _extractUserId(userHref);
        // console.log("解析到评论区用户ID:", userId);
        // 如果用户ID在黑名单中,移除评论
        if (userId && userBlackIdList.includes(userId)) {
          // console.log("发现此评论作者在黑名单中,用户ID:", userId);
          $(this).remove();
        }
      }
      $(this).data("v2jun-check-blocklist-processed", true);
      // console.log('元素已处理:', $(this).data('v2jun-check-blocklist-processed'));
    });
  }

  // 提取用户ID
  function _extractUserId(url) {
    if (!url) return null;
    // 匹配两种可能的格式:
    // 1. touserid=数字
    // 2. mainuserid=数字
    const match = url.match(/[to|main]userid=(\d+)/);
    return match ? match[1] : null;
  }
}
// 导入导出配置
function importWithExportSetting() {
  // 导出JSON配置文件
  function exportJson() {
    const userCacheSetting = JSON.parse(localStorage.getItem("yaohuoBetterPlusSetting"));
    // console.log("导出配置:", userCacheSetting); return;
    const jsonString = JSON.stringify(userCacheSetting, null, 2);
    const blob = new Blob([jsonString], { type: "application/json" });
    const url = URL.createObjectURL(blob);
    const a = document.createElement("a");
    a.href = url;
    a.download = "yaohuoBetterPlusSetting.json";
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
  }
  // 导入JSON配置文件
  function importJson() {
    const fileInput = document.createElement("input");
    fileInput.type = "file";
    fileInput.accept = "application/json";

    fileInput.addEventListener("change", (event) => {
      const file = event.target.files[0];
      if (!file) return;
      const reader = new FileReader();
      reader.onload = (e) => {
        try {
          const importConfig = JSON.parse(e.target.result);
          // console.log('导入的配置:', importConfig);
          const userCacheSetting = JSON.parse(localStorage.getItem("yaohuoBetterPlusSetting"));
          // console.log("当前配置:", userCacheSetting);
          const mergedConfig = { ...userCacheSetting, ...importConfig }; // 合并配置
          // console.log('合并后的配置:', mergedConfig);
          localStorage.setItem("yaohuoBetterPlusSetting", JSON.stringify(mergedConfig)); // 保存合并后的配置

          notifyBox("导入成功", "success", 1000);
          setTimeout(() => {
            location.reload();
          }, 1500);
        } catch (error) {
          // console.error('解析JSON失败:', error);
          notifyBox("未知错误,导入失败,请检查配置文件格式是否正确", false, 3000);
        }
      };
      reader.readAsText(file);
    });

    document.body.appendChild(fileInput);
    fileInput.click();
    document.body.removeChild(fileInput);
  }
  return {
    exportJson,
    importJson
  };
}
// 检查更新
function checkVersion() {
  sessionStorage.removeItem("canUpdate");
  sessionStorage.removeItem("newVersion");
  myAjax("http://greasyfork.icu/scripts/504289.json").then((data) => {
    const { version } = data;
    if (version <= defaultSetting.version) return;
    notifyBox("已有新版本,请自行更新。如不需要更新,可在设置里关闭", false, 3000);
    sessionStorage.setItem("canUpdate", true);
    sessionStorage.setItem("newVersion", version);
  });
}
// PC端点击帖子弹窗打开
function openLayer(url) {
  if (!isPC()) return;
  // 监听点击事件
  $(document)
    .off("click", ".listdata .topic-link")
    .on("click", ".listdata .topic-link", function (event) {
      event.preventDefault(); // 阻止默认链接行为
      const url = $(this).attr("href"); // 获取链接的 href 属性
      openLayer(url);
    });
  if (!url || url.length < 1) return;
  // 创建背景层
  let background_layer = $("<div>").css({
    display: "none",
    position: "fixed",
    top: "0",
    left: "0",
    width: "100%",
    height: "100%",
    backgroundColor: "gray",
    zIndex: "1001",
    opacity: "0.8"
  });
  // 创建弹出层
  let open_layer = $("<div>").css({
    display: "none",
    position: "fixed",
    top: "50%",
    left: "50%",
    transform: "translate(-50%, -50%)",
    width: "80%",
    maxWidth: "720px",
    height: "96%",
    border: "1px solid lightblue",
    borderRadius: "10px",
    boxShadow: "4px 4px 10px #171414",
    backgroundColor: "white",
    zIndex: "1002",
    overflow: "auto",
    margin: "0",
    padding: "0"
  });
  // 创建 iframe
  let iframe = $("<iframe>")
    .attr("src", url || "")
    .css({
      width: "100%",
      height: "100%",
      border: "0",
      display: "block"
    });

  // 将 iframe 添加到弹出层
  open_layer.append(iframe);
  // 将弹出层和背景层添加到 body
  $("body").append(open_layer).append(background_layer);
  // 显示弹出层和背景层
  open_layer.show();
  background_layer.show();
  // 点击背景层时关闭弹出层
  background_layer.on("click", function () {
    open_layer.remove();
    background_layer.remove();
  });
}
// 回复列表自动加载更多
function autoLoadMoreHuifuList() {
  // 获取加载更多按钮
  const loadMoreButton = $(".viewContent .more a:contains('加载更多')");
  // 设置一个标志位,用于判断是否已经触发过点击事件
  let hasTriggered = false;

  // 监听滚动事件
  $(window).scroll(function () {
    // 获取页面滚动的位置和文档高度
    const scrollTop = $(this).scrollTop();
    const windowHeight = $(this).height();
    const documentHeight = $(document).height();
    // 检查是否滚动到距离底部400px,并且还没有触发过点击事件
    if (documentHeight - (scrollTop + windowHeight) <= 500 && !hasTriggered) {
      // 自动点击加载更多按钮
      // console.log("%c ===> [ 自动点击加载回复 ] <===", "font-size:13px; background:pink; color:#bf2c9f;");
      loadMoreButton.click();
      // 设置标志位为已触发
      hasTriggered = true;
    } else if (documentHeight - (scrollTop + windowHeight) > 500) {
      // 如果滚动距离超过200px,重置标志位
      hasTriggered = false;
    }
  });
}
// 帖子列表自动加载更多
function autoLoadMoreBookList() {
  // 获取加载更多按钮
  const loadMoreButton = $(".btBox .bt1 a:contains('加载更多')");
  // 设置一个标志位,用于判断是否已经触发过点击事件
  let hasTriggered = false;

  // 监听滚动事件
  $(window).scroll(function () {
    // 获取页面滚动的位置和文档高度
    const scrollTop = $(this).scrollTop();
    const windowHeight = $(this).height();
    const documentHeight = $(document).height();
    // 检查是否滚动到距离底部200px,并且还没有触发过点击事件
    if (documentHeight - (scrollTop + windowHeight) <= 500 && !hasTriggered) {
      // 自动点击加载更多按钮
      console.log("%c ===> [ 自动点击加载帖子 ] <===", "font-size:13px; background:pink; color:#bf2c9f;");
      loadMoreButton.click();
      // 设置标志位为已触发
      hasTriggered = true;
    } else if (documentHeight - (scrollTop + windowHeight) > 500) {
      // 如果滚动距离超过200px,重置标志位
      hasTriggered = false;
    }
  });
}
// 上一页,下一页按钮互换位置
function useRightNextBtn() {
  waitForElement(".btBox .bt2", () => {
    const btBox = $(".btBox .bt2");
    const links = btBox.children("a");
    // 检查是否为上一页和下一页按钮,避免其他按钮被误操作
    const firstBtnText = links.eq(0).text().trim();
    const secondBtnText = links.eq(1).text().trim();
    if (firstBtnText !== "下一页" || secondBtnText !== "上一页") {
      setTimeout(() => _executeWithRetry(retryCount + 1), 500);
      return;
    }
    // 克隆元素以保留事件绑定
    const clonedLinks = links.map(function () {
      return $(this).clone(true)[0];
    }).get();
    // 清空容器并按相反顺序添加克隆的元素
    btBox.empty().append(clonedLinks.reverse());
  });
}
// 信箱增强
function messageBetter() {
  waitForElement(".content .upload-image-btn", () => {
    const ubbToggleEle = $(`<span class="v2jun-custom-toggle-btn v2jun-msg-ubb-toggle">${getUserSetting("showMsgUbb") ? "UBB 折叠" : "UBB 展开"}</span>`);
    $(".content .upload-image-btn").before(ubbToggleEle);
    ubbToggleEle.click(function () {
      $(".v2jun-ubblist-div").toggle();
      const showMsgUbb = getUserSetting("showMsgUbb");
      if (showMsgUbb) {
        saveUserSetting("showMsgUbb", false);
        $(this).text("UBB 展开");
      } else {
        saveUserSetting("showMsgUbb", true);
        $(this).text("UBB 折叠");
      }
    });

    const emojiToggleEle = $(`<span class='v2jun-custom-toggle-btn v2jun-msg-emoji-toggle'>${getUserSetting("showMsgEmoji") ? "表情 折叠" : "表情 展开"}</span>`);
    $(".content .upload-image-btn").before(emojiToggleEle);
    emojiToggleEle.click(function () {
      $(".v2jun-emojilist-div").toggle();
      const showMsgEmoji = getUserSetting("showMsgEmoji");
      if (showMsgEmoji) {
        saveUserSetting("showMsgEmoji", false);
        $(this).text("表情 展开");
      } else {
        saveUserSetting("showMsgEmoji", true);
        $(this).text("表情 折叠");
      }
    });

    $(".mmscontent").before('<div class="v2jun-ubblist-div v2jun-msg-ubb"></div>');
    createUbbHtml(".centered-container textarea[name='content']");
    $(".mmscontent").before('<div class="v2jun-emojilist-div v2jun-msg-emoji"></div>');
    createEmojiHtml(".centered-container textarea[name='content']");

    !getUserSetting("showMsgUbb") && $(".v2jun-ubblist-div.v2jun-msg-ubb").css("display", "none");
    !getUserSetting("showMsgEmoji") && $(".v2jun-emojilist-div.v2jun-msg-emoji").css("display", "none");
  });
}
// 回帖 增强
function huifuBetter() {
  waitForElement([".viewContent .centered-container", ".viewContent .ulselect"], () => {
    // 移除帖子快速回复旁“文件回帖”按钮
    $(".kuaisuhuifu a").remove();
    // 移除默认表情展开按钮及弹出内容区域
    $(".viewContent .ulselect").remove();
    $(".viewContent .emoticon-popup").remove();

    const ubbToggleEle = $(`<span class="v2jun-custom-toggle-btn v2jun-huifu-ubb-toggle">${getUserSetting("showHuifuUbb") ? "UBB 折叠" : "UBB 展开"}</span>`);
    ubbToggleEle.click(function () {
      $(".v2jun-ubblist-div").toggle();
      const showHuifuUbb = getUserSetting("showHuifuUbb");
      if (showHuifuUbb) {
        saveUserSetting("showHuifuUbb", false);
        $(this).text("UBB 展开");
      } else {
        saveUserSetting("showHuifuUbb", true);
        $(this).text("UBB 折叠");
      }
    });
    $(".viewContent .kuaisuhuifu").append(ubbToggleEle);

    const emojiToggleEle = $(`<span class='v2jun-custom-toggle-btn v2jun-huifu-emoji-toggle'>${getUserSetting("showHuifuEmoji") ? "表情 折叠" : "表情 展开"}</span>`);
    emojiToggleEle.css({ "margin-left": "10px", "padding": "2px 10px" });
    emojiToggleEle.insertBefore(".viewContent .tongzhi");
    emojiToggleEle.click(function () {
      $(".v2jun-emojilist-div").toggle();
      const showHuifuEmoji = getUserSetting("showHuifuEmoji");
      if (showHuifuEmoji) {
        saveUserSetting("showHuifuEmoji", false);
        $(this).text("表情 展开");
      } else {
        saveUserSetting("showHuifuEmoji", true);
        $(this).text("表情 折叠");
      }
    });

    $(".viewContent .centered-container").before('<div class="v2jun-emojilist-div v2jun-huifu-emoji"></div>');
    createEmojiHtml(".viewContent .centered-container textarea.retextarea[name='content']");
    $(".viewContent form .kuaisuhuifu").after('<div class="v2jun-ubblist-div v2jun-huifu-ubb"></div>');
    createUbbHtml(".viewContent .centered-container textarea.retextarea[name='content']");

    !getUserSetting("showHuifuEmoji") && $(".v2jun-emojilist-div.v2jun-huifu-emoji").css("display", "none");
    !getUserSetting("showHuifuUbb") && $(".v2jun-ubblist-div.v2jun-huifu-ubb").css("display", "none");
  });
}
// 发帖/修改帖 增强
function bookViewBetter() {
  waitForElement([".upload-container .form-group .textarea-actions", ".content .textarea-actions #saveDraftButton"], () => {
    const isBookViewMod = window.location.pathname == "/bbs/book_view_mod.aspx" ? true : false; // 判断是否是修改帖子页面

    // 生成按钮
    const toggleEle = $(`<span class="v2jun-custom-toggle-btn view-ubb-btn" style="font-size:10px;margin-right:0;">
      ${getUserSetting("showBookViewUbb") ? "UBB 折叠" : "UBB 展开"}</span>
      <span class="v2jun-custom-toggle-btn view-emoji-btn" style="font-size:10px;margin-left:0;">
      ${getUserSetting("showBookViewEmoji") ? "表情 折叠" : "表情 展开"}</span>
    `);

    if (isBookViewMod) {// 修改帖子
      $(".upload-container .form-group .textarea-actions").append(toggleEle);
    } else {// 发布帖子
      $(".content .textarea-actions #saveDraftButton").before(toggleEle);
    }
    // ubb 展开按钮
    $(".v2jun-custom-toggle-btn.view-ubb-btn").click(function () {
      $(".v2jun-ubblist-div").toggle();
      const showBookViewUbb = getUserSetting("showBookViewUbb");
      if (showBookViewUbb) {
        saveUserSetting("showBookViewUbb", false);
        $(this).text("UBB 展开");
      } else {
        saveUserSetting("showBookViewUbb", true);
        $(this).text("UBB 折叠");
      }
    });
    // 表情展开按钮
    $(".v2jun-custom-toggle-btn.view-emoji-btn").click(function () {
      $(".v2jun-emojilist-div").toggle();
      const showBookViewEmoji = getUserSetting("showBookViewEmoji");
      if (showBookViewEmoji) {
        saveUserSetting("showBookViewEmoji", false);
        $(this).text("表情 展开");
      } else {
        saveUserSetting("showBookViewEmoji", true);
        $(this).text("表情 折叠");
      }
    });

    let contentHeader = $(".upload-container .form-group .content-header"); // 发布帖子
    if (isBookViewMod) contentHeader = $(".upload-container .form-group .content-header");
    // 向页面内注入区域
    contentHeader.after('<div class="v2jun-emojilist-div bookview-emoji"></div>');
    createEmojiHtml(".upload-container .form-group [name='book_content']");
    contentHeader.after('<div class="v2jun-ubblist-div bookview-ubb"></div>');
    createUbbHtml(".upload-container .form-group [name='book_content']");

    // 读取设置,当折叠时隐藏
    !getUserSetting("showBookViewEmoji") && $(".v2jun-emojilist-div.bookview-emoji").css("display", "none");
    !getUserSetting("showBookViewUbb") && $(".v2jun-ubblist-div.bookview-ubb").css("display", "none");
  });
}
// ubb 节点
function createUbbHtml(insertEle) {
  // 生成 ubb 按钮
  const ubbListHtml = [];
  ubbList.forEach((ubbItem) => {
    const { name, upload } = ubbItem;
    let ubbSpanEle = null;
    if (upload?.type?.length > 0) {
      ubbSpanEle = $(`
            <input type="file" id="upload-${upload.type}" style="display: none;" accept="${upload.accept}" multiple/>
            <span class="v2jun-ubb-item">${name}</span>
        `);
    } else {
      ubbSpanEle = $(`<span class="v2jun-ubb-item">${name}</span>`);
    }
    ubbListHtml.push(ubbSpanEle);
  });
  $(".v2jun-ubblist-div").append(ubbListHtml);
  // 设置 ubb 点击功能,生成时设置会导致某些ubb点击无法生效
  ubbList.forEach((ubbItem) => {
    const { ubbType, name, inputTitle, ubbHandle, upload } = ubbItem;
    $(`.v2jun-ubblist-div .v2jun-ubb-item:contains("${name}")`).click(() => {
      if (ubbType == "input") {
        // 输入域
        showInputPopup(inputTitle, (inputResult) => inputResult && insetCustomContent(ubbHandle(inputResult), insertEle));
      } else if (ubbType == "jxVideo") {
        // 外链解析
        showInputPopup(inputTitle, (inputResult) => {
          if (!inputResult || !inputResult[0]) return;

          showWaitBox("解析中…");
          // 从分享文本中提取链接
          const urlRegex = /(https?:\/\/[^\s]+)/;
          const match = inputResult[0].match(urlRegex);
          if (!match || !match[0]) {
            notifyBox("啥链接都没有,你解析个 der~", false);
            $(".v2jun-wait-box-overlay").remove();
            return;
          }

          getVideoPlayUrl(match[0], (videoUrl) => {
            if (!videoUrl) return;

            insetCustomContent(ubbHandle(videoUrl), insertEle);
            $(".v2jun-wait-box-overlay").remove();
            notifyBox("解析成功~");
          });
        });
      } else if (ubbType == "jxZb") {
        // 外链解析
        showInputPopup(inputTitle, (inputResult) => {
          if (!inputResult || !inputResult[0]) return;

          showWaitBox("解析中…");
          // 从分享文本中提取链接
          const urlRegex = /(https?:\/\/[^\s]+)/;
          const match = inputResult[0].match(urlRegex);
          if (!match || !match[0]) {
            notifyBox("啥链接都没有,你解析个 der~", false);
            $(".v2jun-wait-box-overlay").remove();
            return;
          }

          getZbPlayUrl(match[0], (zbUrl) => {
            if (!zbUrl) return;

            insetCustomContent(ubbHandle(zbUrl), insertEle);
            $(".v2jun-wait-box-overlay").remove();
            notifyBox("解析成功~");
          });
        });
      } else if (ubbType == "uploadImg") {
        // 点击隐藏的上传选择文件按钮
        $(`.v2jun-ubblist-div #upload-${upload.type}`).off("click").click();
        // 文件选择回调事件
        $(`.v2jun-ubblist-div #upload-${upload.type}`)
          .off("input")
          .on("input", function () {
            const fileInput = this;
            const tempFiles = this.files;
            if (!tempFiles || tempFiles.length === 0) {
              notifyBox("请选择图片", false);
              return;
            }
            if (tempFiles?.length > 20) {
              notifyBox("一次最多选择 20 张图片", false);
              return;
            }

            showWaitBox("上传中…"); // 上传等待提示
            let currentIndex = 0; // 当前上传的文件索引
            let successCount = 0; // 成功上传的文件数量
            let failCount = 0; // 失败上传的文件数量
            const uploadResults = []; // 存储每个文件的上传结果,按原始顺序
            const retryCounts = []; // 存储每个文件的重试次数
            let nextInsertIndex = 0; // 下一个应该插入的索引位置
            const MAX_RETRY_COUNT = 1; // 最大重试次数 - 只重试一次

            const uploadNextImage = () => {
              if (currentIndex >= tempFiles.length) {
                // 检查是否所有文件都已处理完成(包括重试)
                const allProcessed = uploadResults.every((result, index) =>
                  result !== undefined || (retryCounts[index] !== undefined && retryCounts[index] >= MAX_RETRY_COUNT)
                );

                if (allProcessed) {
                  // 所有图片上传完成
                  setTimeout(() => {
                    $(".v2jun-wait-box-overlay").remove(); // 关闭等待提示
                  }, 1000);
                  setTimeout(() => notifyBox(`已成功上传 ${successCount} 个文件,失败 ${failCount} 个文件`));
                  $(fileInput).val(""); // 上传完成后清空文件选择,解决某些浏览器上出现的重复上传及选择相同文件时不上传问题
                }
                return;
              }

              // 初始化重试次数
              if (retryCounts[currentIndex] === undefined) {
                retryCounts[currentIndex] = 0;
              }

              const currentImg = tempFiles[currentIndex];
              // 检查文件大小是否超过20MB
              if (currentImg.size > 20 * 1024 * 1024) {
                notifyBox(`第 ${currentIndex + 1} 张图片文件过大,已跳过`, false, 1000);
                failCount++;
                uploadResults[currentIndex] = { success: false, index: currentIndex, retryCount: retryCounts[currentIndex] };
                currentIndex++;
                setTimeout(() => uploadNextImage(), 500);
                return;
              }

              performUpload(false);
            };

            // 执行上传操作的统一函数
            const performUpload = (isRetry = false) => {
              const url = defaultSetting.imgUploadApiUrl[getUserSetting("imgUploadSelOpt")];
              const options = {};
              if (getUserSetting("imgUploadSelOpt") == 1) {
                options.headers = {
                  token: getUserSetting("suimoToken")
                };
              }

              const currentImg = tempFiles[currentIndex];
              const data = new FormData();
              if (getUserSetting("imgUploadSelOpt") == 2) data.append("file", currentImg);
              else data.append("image", currentImg);

              uploadFiles({
                url,
                data,
                options,
                success: (res) => handleUploadResponse(res, isRetry),
                error: (err) => handleUploadFailure(isRetry ? "重试失败" : "网络错误")
              });
            };
            // 标准化上传响应格式
            const normalizeUploadResponse = (res) => {
              // 水墨图床特殊处理:当 data 是字符串时,转换为标准格式
              if (getUserSetting("imgUploadSelOpt") == 2 && typeof res?.data === "string" && res?.data?.length > 0) {
                return {
                  ...res,
                  code: 200,
                  data: { url: res.data }
                };
              }

              // 标准格式直接返回,保留原始响应中的所有字段
              return res;
            };
            // 统一的响应处理函数
            const handleUploadResponse = (res, isRetry = false) => {
              // 统一处理响应格式
              const { code, data } = normalizeUploadResponse(res);

              if (code == 200) {
                successCount++;
                uploadResults[currentIndex] = { success: true, url: data.url, index: currentIndex, retryCount: retryCounts[currentIndex] };
                notifyBox(`第 ${currentIndex + 1} 张图片已上传成功`, true, 1000);

                tryInsertContent();
                currentIndex++;
                setTimeout(() => uploadNextImage(), 500);
              } else {
                handleUploadFailure(isRetry ? "重试失败" : "上传失败");
              }
            };
            // 处理上传失败的函数
            const handleUploadFailure = (errorType) => {
              retryCounts[currentIndex]++;

              if (retryCounts[currentIndex] < MAX_RETRY_COUNT) {
                // 还有重试机会
                notifyBox(`第 ${currentIndex + 1} 张图片${errorType},正在重试`, false, 1000);
                // 延迟后重试
                setTimeout(() => performUpload(true), 1000);
              } else {
                // 重试次数用完,放弃上传
                failCount++;
                uploadResults[currentIndex] = { success: false, index: currentIndex, retryCount: retryCounts[currentIndex] };
                notifyBox(`第 ${currentIndex + 1} 张图片上传失败,已放弃`, false, 1000);
                // 即使失败也要尝试插入,确保顺序
                tryInsertContent();

                // 继续上传下一张
                currentIndex++;
                setTimeout(() => uploadNextImage(), 500);
              }
            };
            // 尝试按顺序插入内容
            const tryInsertContent = () => {
              // 从 nextInsertIndex 开始,按顺序检查并插入已完成的内容
              while (nextInsertIndex < uploadResults.length && uploadResults[nextInsertIndex] !== undefined) {
                const result = uploadResults[nextInsertIndex];
                if (result.success) {
                  insetCustomContent(ubbHandle([result.url]), insertEle);
                }
                nextInsertIndex++;
              }
            };
            // 开始上传第一张图片
            uploadNextImage();
          });
      } else if (ubbType == "uploadVideo" || ubbType == "uploadAudio") {
        // 点击隐藏的上传选择文件按钮
        $(`.v2jun-ubblist-div #upload-${upload.type}`).click();
        // 文件选择回调事件
        $(`.v2jun-ubblist-div #upload-${upload.type}`)
          .off("input")
          .on("input", function () {
            const fileInput = this;
            const tempFiles = this.files;
            if (tempFiles.length == 0) {
              notifyBox("请选择文件", false);
              return;
            }
            if (tempFiles.length > 10) {
              notifyBox("一次最多选择 10 个文件", false);
              return;
            }

            showWaitBox("上传中…"); // 上传等待提示
            let uploadCount = { currentIndex: 0, success: 0, fail: 0 }; // 存储上传结果数量
            const uploadNextFile = () => {
              if (uploadCount.currentIndex >= tempFiles.length) {
                // 所有图片上传完成
                setTimeout(() => {
                  $(".v2jun-wait-box-overlay").remove(); // 关闭等待提示
                }, 1000);
                setTimeout(() => notifyBox(`已成功上传 ${uploadCount.success} 个文件,失败 ${uploadCount.fail} 个文件`), 1500);
                $(fileInput).val(""); // 上传完成后清空文件选择,解决某些浏览器上出现的重复上传及选择相同文件时不上传问题
                return;
              }

              const url = defaultSetting.imgUploadApiUrl[2];
              const currentFile = tempFiles[uploadCount.currentIndex];
              // 检查文件大小是否超过20MB
              if (currentFile.size > 20 * 1024 * 1024) {
                notifyBox(`第 ${uploadCount.currentIndex + 1} 个文件过大,已跳过`, false, 300);
                uploadCount.fail++;
                uploadCount.currentIndex++;
                setTimeout(() => uploadNextFile(), 500);
                return;
              }

              const data = new FormData();
              data.append("file", currentFile);

              uploadFiles({
                url,
                data,
                success: (res) => {
                  if (res?.data?.length > 0) {
                    uploadCount.success++;
                    insetCustomContent(ubbHandle([res.data]), insertEle);

                    if (tempFiles.length > 1) {
                      notifyBox(`第 ${uploadCount.currentIndex + 1} 个文件已上传成功`, true, 200);
                    }
                  } else {
                    uploadCount.fail++;
                    notifyBox(`第 ${uploadCount.currentIndex + 1} 个文件上传失败`, false, 300);
                  }
                  uploadCount.currentIndex++;
                  setTimeout(() => uploadNextFile(), 500);
                },
                error: () => {
                  notifyBox(`第 ${uploadCount.currentIndex + 1} 个文件上传失败`, false, 300);
                  uploadCount.currentIndex++;
                  uploadCount.fail++;
                  setTimeout(() => uploadNextFile(), 500);
                }
              });
            };
            uploadNextFile();
          });
      }
    });
  });
}
// 表情 节点
function createEmojiHtml(insertEle) {
  let userCacheEmojiList = getUserSetting("userCustomEmojiList")
    .split(",")
    .filter((item) => item.trim() !== "");
  if (!Array.isArray(userCacheEmojiList)) userCacheEmojiList = [];
  const allEmojiList = [...emojiList, ...userCacheEmojiList];
  // console.log("allEmojiList:", allEmojiList);
  // 计算每行能放几个表情
  const containerWidth = $(".v2jun-emojilist-div").width();
  const emojiWidth = 50; // 表情宽度(包含间距)
  const emojisPerRow = Math.floor(containerWidth / emojiWidth);
  const rowsPerPage = 5; // 每页显示5行
  const pageSize = emojisPerRow * rowsPerPage; // 每页显示数量
  // 获取缓存的页码
  let pageSettingKey = "huifuEmojiPage"; // 默认回帖表情页码
  if (insertEle.includes("book_content")) {
    pageSettingKey = "bookviewEmojiPage"; // 发帖表情页码
  } else if (insertEle.includes("mmscontent")) {
    pageSettingKey = "msgEmojiPage"; // 信箱表情页码
  }
  let currentPage = parseInt(getUserSetting(pageSettingKey)) || 1;
  const totalPages = Math.ceil(allEmojiList.length / pageSize); // 总页数
  currentPage = Math.min(Math.max(currentPage, 1), totalPages); // 确保页码在有效范围内

  function loadEmojis(page) {
    const start = (page - 1) * pageSize;
    const end = start + pageSize;
    const currentEmojis = allEmojiList.slice(start, end);

    const emojiListHtml = [];
    currentEmojis.forEach((faceitem) => {
      const img = $("<img/>", {
        class: "v2jun-emojilist-img",
        src: faceitem
      });
      $(img).click(() => insetCustomContent(`[img]${faceitem}[/img]`, insertEle));
      emojiListHtml.push(img);
    });

    // 清空内容并添加新表情
    $(".v2jun-emojilist-div").empty().append(emojiListHtml);
    // 更新分页按钮
    updatePaginationButtons();
    // 缓存当前页码
    saveUserSetting(pageSettingKey, page);
  }

  // 创建分页按钮
  function createPaginationButtons() {
    // 判断是否为发帖/修改帖页面
    const isBookView = window.location.pathname.includes("book_view");
    const paginationDiv = $("<div/>", {
      class: "emoji-pagination",
      style: `text-align:center;border: 1px solid #d4d4d4;border-bottom-left-radius:5px;border-bottom-right-radius:5px;
              ${isBookView ? "margin:-6px auto 10px;" : "margin:-6px 1% 10px;"}
      `
    });

    const prevBtn = $("<span/>", {
      class: "emoji-page-btn",
      text: "上一页",
      style: "margin:0 10px;cursor:pointer;color:#999;" // 第一页时默认置灰
    }).click(() => {
      if (currentPage > 1) {
        currentPage--;
        loadEmojis(currentPage);
      }
    });

    const nextBtn = $("<span/>", {
      class: "emoji-page-btn",
      text: "下一页",
      style: "margin:0 10px;cursor:pointer;color:#1ABCAF;"
    }).click(() => {
      if (currentPage < totalPages) {
        currentPage++;
        loadEmojis(currentPage);
      }
    });

    const pageInfo = $("<span/>", {
      class: "emoji-page-info",
      style: "margin:0 10px;"
    }).text(`${currentPage}/${totalPages}`); // 初始化时就设置页码

    paginationDiv.append(prevBtn, pageInfo, nextBtn);
    $(".v2jun-emojilist-div").after(paginationDiv);
  }
  // 更新分页按钮状态
  function updatePaginationButtons() {
    const pageInfo = $(".emoji-page-info");
    pageInfo.text(`${currentPage}/${totalPages}`);

    const prevBtn = $(".emoji-page-btn:contains('上一页')");
    const nextBtn = $(".emoji-page-btn:contains('下一页')");

    // 修复按钮颜色逻辑
    prevBtn.css("color", currentPage <= 1 ? "#999" : "#1ABCAF");
    nextBtn.css("color", currentPage >= totalPages ? "#999" : "#1ABCAF");
  }

  // 初始化
  loadEmojis(currentPage);
  createPaginationButtons();
  updatePaginationButtons(); // 确保初始化时按钮颜色正确

  // 监听表情区域显示状态变化,让页码显示区域跟随显示/隐藏
  const observer = new MutationObserver((mutations) => {
    mutations.forEach((mutation) => {
      if (mutation.type === "attributes" && mutation.attributeName === "style") {
        const isVisible = $(".v2jun-emojilist-div").is(":visible");
        $(".emoji-pagination").css("display", isVisible ? "block" : "none");
      }
    });
  });
  observer.observe($(".v2jun-emojilist-div")[0], {
    attributes: true
  });
}
// 处理页面中图片
function imgCustomProcess() {
  const imgThumbWidth = getUserSetting("imgThumbWidth"); // 读取用户设置缩放值
  // 监测所有图片
  $("body img").each(function () {
    if (this.complete) {
      handleImageLoad(this); // 如果图片已经加载完成
    } else {
      $(this).on("load", function () {
        handleImageLoad(this);
      });
    }
  });
  // 排除不需要处理的图片
  function shouldExclude(img) {
    const excludedClasses = []; // 需要排除的 class
    const excludedIds = ["settingICon"]; // 需要排除的 id
    // 判断是否包含排除的 class 或 id
    return excludedClasses.some((cls) => $(img).hasClass(cls)) || excludedIds.includes($(img).attr("id"));
  }
  // 图片加载完成
  function handleImageLoad(img) {
    if ($(img).width() <= 100) return; // 排除宽度过小的图片,不处理,基本上都是表情包或者logo啥的小图片
    if (shouldExclude(img)) return; // 跳过指定 class 或 id 的图片

    // 处理图片
    _handleThumb();
    getUserSetting("imgBlur") && _handleBlur();

    function _handleThumb() {
      if ($(img).data("v2jun-img-thumb-processed")) return; // 跳过已处理的图片
      if (!imgThumbWidth) return; // 设置缩放宽度为 0 时,不缩放

      $(img).addClass("img-thumb"); // 为img标签添加class,修改显示大小

      $(img).click(function (e) {
        e.preventDefault(); // 取消默认点击行为,避免进入预览窗口
        $(this).toggleClass("img-thumb"); // 给图片添加点击事件,添加/移除指定class,以实时修改图片大小
      });

      $(img).data("v2jun-img-thumb-processed", true); // 标记图片已处理// 添加点击事件
    }
    function _handleBlur() {
      if ($(img).data("v2jun-img-blur-processed")) return; // 跳过已处理的图片

      $(img).css({ filter: "blur(15px)", transition: "filter 0.3s ease" }); // 添加模糊效果
      $(img).click(function (e) {
        e.preventDefault(); // 取消默认点击行为,避免进入预览窗口
        const currentFilter = $(this).css("filter");
        if (currentFilter === "none") {
          $(this).css("filter", "blur(15px)"); // 恢复模糊效果
        } else {
          $(this).css("filter", "none"); // 移除模糊效果
        }
      });
      // 设置已处理标识
      $(img).data("v2jun-img-blur-processed", true);
    }
  }
}
// 复读机(回帖+1)
function huifuCopy() {
  waitForElement([".recontent .forum-post .post-content .retext", ".recontent .list-reply .retext"], () => {
    const isNewHuifu = $(".recontent .forum-post .admin-actions").length > 0;
    if (isNewHuifu) {
      // 新版回帖
      $(".recontent .forum-post .post-content .retext").each(function () {
        // 检查是否已经处理过,如果处理过则跳过
        if ($(this).attr("v2jun-data-huifu-copy-processed")) return;

        const copySpanEle = $("<span class='v2jun-huifu-copy'>+1</span>");
        $(this).after(copySpanEle);
        copySpanEle.click((e) => {
          e.stopPropagation();
          const copyText = _handleHtml($(this).closest(".forum-post").find(".retext").html());
          insetCustomContent(copyText, ".centered-container .retextarea");
          scrollToEle(".centered-container .retextarea", 80);
          setTimeout(() => {
            getUserSetting("huifuCopyAutoSubmit") && $(".kuaisuhuifu input").trigger("click");
          }, 150);
        });
        // 添加标识,标记为已处理
        $(this).attr("v2jun-data-huifu-copy-processed", "true");
      });
    } else {
      // 旧版回帖
      $(".recontent .list-reply .retext").each(function () {
        // 检查是否已经处理过,如果处理过则跳过
        if ($(this).attr("v2jun-data-huifu-copy-processed")) return;

        const copySpanEle = $("<span class='v2jun-huifu-copy'>+1</span>");
        $(this).after(copySpanEle);
        copySpanEle.click((e) => {
          e.stopPropagation();
          const copyText = _handleHtml($(this).closest(".reline.list-reply").find(".retext").html());
          insetCustomContent(copyText, ".centered-container .retextarea");
          scrollToEle(".centered-container .retextarea", 80);
          setTimeout(() => {
            getUserSetting("huifuCopyAutoSubmit") && $(".kuaisuhuifu input").trigger("click");
          }, 150);
        });
        // 标记为已处理
        $(this).attr("v2jun-data-huifu-copy-processed", "true");
      });
    }
    function _handleHtml(retextHtml) {
      // 创建一个临时的 div 来解析 HTML 内容
      const tempDiv = document.createElement("div");
      tempDiv.innerHTML = retextHtml;
      // 缓存标签处理方法
      const tagHandlers = new Map([
        ["img", (node) => `[img]${node.getAttribute("src")}[/img]`],
        ["audio", (node) => `[audio]${node.getAttribute("src")}[/audio]`],
        ["video", (node) => `[movie]${node.getAttribute("src")}[/movie]`],
        [
          "a",
          (node) => {
            const href = node.getAttribute("href");
            const text = node.textContent.trim();
            // 如果链接文本和URL相同,只输出URL
            return href === text ? text : `[url=${href}]${text}[/url]`;
          }
        ]
      ]);
      // 节点处理
      const processNode = (node) => {
        // 文本节点直接返回内容
        if (node.nodeType === Node.TEXT_NODE) {
          return node.textContent;
        }
        // 元素节点处理
        if (node.nodeType === Node.ELEMENT_NODE) {
          const tagName = node.tagName.toLowerCase();
          const handler = tagHandlers.get(tagName);
          // 如果有对应的处理器,直接处理
          if (handler) {
            return handler(node);
          }
          // 其他元素,字符串拼接
          if (node.childNodes.length) {
            return Array.from(node.childNodes).map(processNode).join("");
          }
        }
        return "";
      };
      // 字符串拼接
      return Array.from(tempDiv.childNodes).map(processNode).join("");
    }
  });
}
// 隐藏楼主勋章
function hideXunzhang() {
  $(".xunzhang").remove();
}
// 一键吃肉
function speedEatMoney() {
  const vBtn = $("<span class='v2jun-custom-toggle-btn'>一键吃肉</span>");
  vBtn.click(() => {
    const isPaibi = $("div").hasClass("paibi");
    if (isPaibi) {
      const shengyuNum = $(".paibi .yushuzi").text();
      if (shengyuNum > 0) {
        const eatWordsArr = [
          "吃",
          "吃吃",
          "吃吃.",
          "吃吃。",
          "吃吃..",
          "吃吃。。",
          "吃了",
          "吃肉",
          "来吃肉",
          "吃.",
          "吃。",
          "吃了.",
          "吃了。",
          "吃肉.",
          "吃肉。",
          "来吃肉.",
          "来吃肉。",
          "吃..",
          "吃。。",
          "吃了..",
          "吃了。。",
          "吃肉..",
          "先吃肉"
        ];
        const index = Math.floor(Math.random() * eatWordsArr.length);
        insetCustomContent(eatWordsArr[index], ".centered-container .retextarea", true);
        setTimeout(() => {
          $(".kuaisuhuifu input").trigger("click");
        }, 300);
      } else {
        notifyBox("已经没有肉了,错过了一个亿~", false);
      }
    } else {
      notifyBox("不是派币贴,你吃个 der", false);
    }
  });
  $(".viewContent .kuaisuhuifu").append(vBtn);
}
// 查询吹牛发布者历史大话选项
async function chuiniuHistory() {
  const elementsWithText = $("body").find(":contains('自己挑战的只能由其它友友应战!')");
  if (elementsWithText.length > 0) return;

  // 创建胜率结果显示容器,写入提示信息
  $(`<p id="chuiniuWinningEle" style="background:#f0f9eb;color:gray;text-align:center;margin:0 auto;padding:0 20px;">历史记录获取中...</p>`).insertBefore($(".subtitle"));

  const userinfoEle = $('a[href*="userinfo.aspx"]');
  const chuiniuQueUserId = getUrlParam("touserid", userinfoEle.attr("href")); // 发布者ID
  const chuiniuQueUserNickname = userinfoEle.text(); // 发布者昵称
  const queHistoryArr = Array.from(await getQueUserHistoryArr(chuiniuQueUserId)); // 发布者历史大话ID

  if (queHistoryArr.length > 0) {
    //  获取成功
    const queHistoryAnswers = await Promise.all(queHistoryArr.map(getChuiniuAnswer));
    const countAnswer1 = queHistoryAnswers.filter((v) => v === "1").length;
    const countAnswer2 = queHistoryAnswers.filter((v) => v === "2").length;
    $("#chuiniuWinningEle")
      .css({
        "text-align": "left"
      })
      .html(
        `“<span style="color:#3d68a8;">${chuiniuQueUserNickname}</span>”最近<span style="color:blue;font-weight:bold;">${queHistoryAnswers.length}</span>次已完成大话选项:答案<span style="color:blue;font-weight:bold;">1</span>次数:<span style="color:red;font-weight:bold;">${countAnswer1}</span>,答案<span style="color:blue;font-weight:bold;">2</span>次数: <span style="color:red;font-weight:bold;">${countAnswer2}</span>`
      );
  } else {
    // 获取失败
    $("#chuiniuWinningEle").html(`<span style="color:red;">未知错误,获取历史数据失败,请私信反馈</span>`);
  }

  // 获取指定大话答案
  async function getChuiniuAnswer(chuiniuId) {
    const chuiniuRes = await getPageContent(`/games/chuiniu/book_view.aspx?id=${chuiniuId}`);
    const ansRule1 = chuiniuRes.match(/挑战方出的是\[答案1\]/);
    const ansRule2 = chuiniuRes.match(/挑战方出的是\[答案2\]/);
    if (ansRule1) return "1";
    if (ansRule2) return "2";
  }
  // 获取对方大话指定条数历史记录ID
  async function getQueUserHistoryArr(toUserId, computeTotal = 15) {
    return new Promise(async (resolve, reject) => {
      const idArr = new Set(); // 存放大话ID,利用Set特性去重(翻页时会有重复项出现,非本脚本bug)
      let historyPage = 1; // 翻页,达到预设值时停止

      const historyText = await getPageContent(`/games/chuiniu/book_list.aspx?type=0&touserid=${toUserId}`);
      const userHistoryTotal = historyText.slice(historyText.indexOf("页,共 ") + 4, historyText.indexOf(" 条")); // 吹牛历史总条数

      const getQueUserHistoryid = async () => {
        const tempElements = $(historyText).filter(".line1, .line2");
        for (const line of tempElements) {
          const idLink = line.querySelector('a[href*="book_view.aspx"]');
          if (idLink && !line.textContent.includes("进行中")) {
            const dahuaId = getUrlParam("id", idLink.href);
            if (dahuaId) idArr.add(dahuaId);
            if (idArr.length >= computeTotal) break;
          }
        }
        if (idArr.length < 15 && userHistoryTotal > 15) {
          historyPage++;
          getQueUserHistoryid();
        } else {
          resolve(idArr);
        }
      };
      getQueUserHistoryid();
    });
  }
}
// 一键回到顶部/底部,在原作者基础上做了删减、改动,原作者发布地址:http://greasyfork.icu/zh-CN/scripts/38899-回到顶部-底部
function addTopAndDown() {
  if (window.self != window.top) return;

  function ce(n) {
    return document.createElement(n);
  }

  function addStyle(css) {
    let head = document.head || document.getElementsByTagName("head")[0];
    if (head) {
      let style = ce("style");
      style.type = "text/css";
      style.appendChild(document.createTextNode(css));
      head.appendChild(style);
    }
  }

  let el = navigator.userAgent.indexOf("Firefox") != -1 || navigator.userAgent.indexOf("MSIE") != -1 ? document.documentElement : document.body,
    t1,
    t2,
    speed_by_click = 200,
    zIindex = 1001;

  function getDocumentHeight() {
    return document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight;
  }

  function get_scroll(a) {
    let d = document,
      b = d.body,
      e = d.documentElement,
      c = "client" + a,
      f = "scroll" + a;
    return /CSS/.test(d.compatMode) ? e[c] < e[f] : b[c] < b[f];
  }

  function scrollTo(element, to, duration) {
    (start = document.documentElement.scrollTop || document.body.scrollTop),
      (change = to - start),
      (currentTime = 0),
      (increment = 20),
      (newDuration = typeof duration === "undefined" ? 500 : duration);

    let animateScroll = function () {
      currentTime += increment;
      let val = Math.easeInOutQuad(currentTime, start, change, newDuration);
      window.scrollTo(0, val);
      if (currentTime < newDuration) {
        setTimeout(animateScroll, increment);
      }
    };
    animateScroll();
  }

  Math.easeInOutQuad = function (t, b, c, d) {
    t /= d / 2;
    if (t < 1) return (c / 2) * t * t + b;
    t--;
    return (-c / 2) * (t * (t - 2) - 1) + b;
  };

  function shareCSS() {
    let s = "",
      img_up,
      img_dn;

    img_up =
      "data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAUCAYAAACAl21KAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAB+SURBVDhPY1i1atV/amAGahgCMoNhaIGlS5cKAp19BoRBbLJcj2QILDJINwzoAmMgfoclIkBixkS5DI8hMJcRNgxoSBoOl6CnNZBhaVhdBjWE1MSJahjQkA4KEmYH2GUrV66cSYEhYB+AzKBtFiHkQqKiH6Ro1CDCQTWgYQQAs81DU0G/83sAAAAASUVORK5CYII=";
    img_dn =
      "data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAUCAYAAACAl21KAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACPSURBVDhPY2DAAlatWvUfH8amB6vYqEGEg2pgw4iQ7cTKM6xcuXImsYpxqQOZAQ4woIIOCgzrQAl1oEFpZBiWhitFgwx7R4SBIDXYDYGZDFRgTMAwkCHGhBMRJMxwGUa8ITCbli5dKgg08AySN8+AxIhyCboiJMPIN4Qsm6miiYioxltawvSDYogohYTUAQC80UNTOht/YwAAAABJRU5ErkJggg==";
    s +=
      "#play_btn_up { position:fixed; right:0; top:54%;z-index:" +
      zIindex +
      "; height:40px; width:36px; cursor:pointer; background:url(" +
      img_up +
      ") no-repeat scroll 50% 50% rgba(0, 0, 0, 0.7); border-radius:5px 0 0 5px; margin-top:-24px; }";
    s +=
      "#play_btn_dn { position:fixed; right:0; top:60%;   z-index:" +
      zIindex +
      "; height:40px; width:36px; cursor:pointer; background:url(" +
      img_dn +
      ") no-repeat scroll 50% 50% rgba(0, 0, 0, 0.7); border-radius:5px 0 0 5px; margin-top:-24px; }";

    s +=
      ".play_btn { -webkit-transition-duration:0.5s linear; -o-transition-duration:0.5s linear; -moz-transition-duration:0.5s linear; transition-duration:0.5s linear; opacity:0.65; }";
    s += ".play_btn:hover { opacity:1; }";

    addStyle("" + s);
  }

  function create_btn_element() {
    let up,
      dn,
      scrolled,
      h = get_scroll("Height");
    if (!h) {
      return;
    }
    shareCSS();

    if (el) {
      up = ce("span");
      dn = ce("span");
      up.setAttribute("id", "play_btn_up");
      dn.setAttribute("id", "play_btn_dn");
      up.className = "play_btn";
      dn.className = "play_btn";
      document.body.appendChild(up);
      document.body.appendChild(dn);

      scrolled = window.pageYOffset || document.documentElement.scrollTop;
      up.style.display = scrolled > 0 ? "" : "none";

      up.addEventListener(
        "mouseout",
        function () {
          clearTimeout(t1);
        },
        false
      );
      dn.addEventListener(
        "mouseout",
        function () {
          clearTimeout(t2);
        },
        false
      );
      up.addEventListener(
        "click",
        function () {
          scrollTo(el, 0, speed_by_click);
        },
        false
      );
      dn.addEventListener(
        "click",
        function () {
          scrollTo(el, getDocumentHeight(), speed_by_click);
        },
        false
      );

      window.onscroll = function () {
        let scrolled = document.documentElement.scrollTop,
          diffHeight = document.body.scrollHeight - window.innerHeight;
        up.style.display = scrolled > 0 ? "" : "none";
        dn.style.display = diffHeight > scrolled ? "" : "none";
      };
    }
  }

  create_btn_element();
}

// 生成设置相关内容
function createScriptSetting() {
  createIcon();

  // 关闭设置弹框
  function closePopupContainer() {
    // 恢复body内容滚动
    $("body").css("overflow", "auto");
    // 移除蒙版和弹出内容容器
    $(".v2jun-popup-overlay").remove();
  }
  // 设置弹框
  function createPopupContainer() {
    // 蒙版
    const overlay = $("<div>").addClass("v2jun-popup-overlay").appendTo("body").click(closePopupContainer);
    // 弹出内容容器
    const container = $("<div>")
      .addClass("v2jun-popup-container")
      .appendTo(overlay)
      .click((event) => {
        event.stopPropagation(); // 阻止事件冒泡
      });

    // 设置蒙版的样式
    overlay.css({
      "background-color": "rgba(0, 0, 0, 0.6)",
      "position": "fixed",
      "top": 0,
      "left": 0,
      "width": "100%",
      "height": "100%",
      "z-index": 9999,
      "display": "flex",
      "justify-content": "center",
      "align-items": "center"
    });

    // 设置弹出内容容器的样式
    container.css({
      "background-color": "white",
      "width": "80%",
      "max-width": "400px",
      "max-height": "80%",
      "overflow-y": "auto",
      "padding": "20px",
      "text-align": "center",
      "border-radius": "5px"
    });

    // 添加弹出内容
    const vSettingEle = `
      <form name="settingForm">
      <div class="v2jun-setting-div">
        <h2 class="v2jun-reset setting-title">妖火增强插件Plus</h2>
        <p class="v2jun-reset" style="font-size:12px;">
          Author:<a href="/bbs/userinfo.aspx?touserid=27894" style="font-size:12px;">柠檬没有汁@27894</a>
        </p>
        <p class="v2jun-reset" style="font-size:12px;margin-top:-15px;">
          Version:${defaultSetting.version}
        </p>
        <p style="font-size:12px;margin-top:-15px;color:red;${sessionStorage.getItem("canUpdate") ? "" : "display:none;"}">
          已有新版本:<span style="color:green;">${sessionStorage.getItem("newVersion")}</span>,请及时更新
        </p>
        <ul style="margin:0;padding:0;">
          <li class="v2jun-setting-li-title"><hr><b>关于脚本</b><hr></li>
          <li class="setting-li-between">
            <span>脚本安装/升级</span>
            <span>
              <a href="http://greasyfork.icu/zh-CN/scripts/504289-妖火网增强脚本plus" target="_blank">GreasyFork 直达</a>
            </span>
          </li>
          <li class="setting-li-between">
            <span>开源地址</span>
            <span>
              <a href="https://github.com/v2jun/yaohuo_better_plus" target="_blank">Github</a>
            </span>
          </li>
          <li class="setting-li-between">
            <span>重置设置</span>
            <span class='v2jun-clear-setting'>点击运行</span>
          </li>
          <li class="setting-li-tips">
            <span>如出现玄学bug,可尝试重置脚本设置</span>
          </li>

          <li class="v2jun-setting-li-title"><hr><b>设置</b><hr></li>
          <li class="setting-li-between">
            <span>设置图标大小(px)</span>
            <input name="settingIconSize" class="v2jun-setting-li-input" type="number" value="${getUserSetting("settingIconSize")}"/>
          </li>
          <li class="setting-li-tips">
            <span>设置入口图标大小,设置为 0 时不显示</span>
          </li>
          <li class="setting-li-between">
            <span>检查更新</span>
            <div class="v2jun-switch">
              <input name="checkVersion" value="true" ${getUserSetting("checkVersion") ? "checked" : ""}  class="v2jun-switch-checkbox" id="checkVersion" type="checkbox">
              <label class="switch-label" for="checkVersion">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between">
            <span>一键回到顶部/底部</span>
            <div class="v2jun-switch">
              <input name="showTopAndDownBtn" value="true" ${getUserSetting("showTopAndDownBtn") ? "checked" : ""
      }  class="v2jun-switch-checkbox" id="showTopAndDownBtn" type="checkbox">
              <label class="switch-label" for="showTopAndDownBtn">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between">
            <span>隐藏楼主勋章</span>
            <div class="v2jun-switch">
              <input name="hideXunzhang" value="true" ${getUserSetting("hideXunzhang") ? "checked" : ""}  class="v2jun-switch-checkbox" id="hideXunzhang" type="checkbox">
              <label class="switch-label" for="hideXunzhang">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between">
            <span>图片自动模糊</span>
            <div class="v2jun-switch">
              <input name="imgBlur" value="true" ${getUserSetting("imgBlur") ? "checked" : ""}  class="v2jun-switch-checkbox" id="imgBlur" type="checkbox">
              <label class="switch-label" for="imgBlur">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-tips">开启后图片会自动添加模糊效果,点击图片取消,再次点击恢复,可与下方图片缩放搭配使用(再也不用担心点开帖子,突然社死了)</li>
          <li class="setting-li-between">
            <span>图片宽度(px)</span>
            <input name="imgThumbWidth" class="v2jun-setting-li-input" type="number" value="${getUserSetting("imgThumbWidth")}"/>
          </li>
          <li class="setting-li-tips">缩放页面中图片到指定宽度,设置为 0 时不缩放</li>
          <li class="setting-li-between">
            <span>图床选择</span>
            <select name='imgUploadSelOpt' class="v2jun-reset" style="font-size: 12px;width:116px;padding-left:8px;height:25px;">
              <option value="0" ${getUserSetting("imgUploadSelOpt") == 0 ? "selected" : ""}>美团图床</option>
              <option value="1" ${getUserSetting("imgUploadSelOpt") == 1 ? "selected" : ""}>水墨图床</option>
              <option value="2" ${getUserSetting("imgUploadSelOpt") == 2 ? "selected" : ""}>柯艺云图床</option>
            </select>
          </li>
          <li class="setting-li-between sel-suimo">
            <span><a href="https://img.ink/user/settings.html" target="_blank">水墨图床token</a></span>
            <input style="width:100px;" class="v2jun-setting-li-input" value="${getUserSetting(
        "suimoToken"
      )}" name="suimoToken" id="suimoToken" type="text" placeholder="为空则不会上传…"/>
          </li>
          <li class="setting-li-between">
            <span>我要用右手</span>
            <div class="v2jun-switch">
              <input name="useRight" value="true" ${getUserSetting("useRight") ? "checked" : ""}  class="v2jun-switch-checkbox" id="useRight" type="checkbox">
              <label class="switch-label" for="useRight">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-tips">将帖子列表的下一页按钮显示在右边</li>
          <li class="setting-li-between">
            <span>帖子自动加载</span>
            <div class="v2jun-switch">
              <input name="autoLoadMoreBookList" value="true" ${getUserSetting("autoLoadMoreBookList") ? "checked" : ""
      }  class="v2jun-switch-checkbox" id="autoLoadMoreBookList" type="checkbox">
              <label class="switch-label" for="autoLoadMoreBookList">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between">
            <span>回复自动加载</span>
            <div class="v2jun-switch">
              <input name="autoLoadMoreHuifuList" value="true" ${getUserSetting("autoLoadMoreHuifuList") ? "checked" : ""
      }  class="v2jun-switch-checkbox" id="autoLoadMoreHuifuList" type="checkbox">
              <label class="switch-label" for="autoLoadMoreHuifuList">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between">
            <span>帖子在弹窗中打开</span>
            <div class="v2jun-switch">
              <input name="openLayerForBook" value="true" ${getUserSetting("openLayerForBook") ? "checked" : ""
      }  class="v2jun-switch-checkbox" id="openLayerForBook" type="checkbox">
              <label class="switch-label" for="openLayerForBook">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-tips">仅在PC端生效,且弹窗中无法使用脚本</li>
          <li class="setting-li-between">
            <span>发帖表情自动收起</span>
            <div class="v2jun-switch">
              <input name="autoCloseBookViewEmoji" value="true" ${getUserSetting("autoCloseBookViewEmoji") ? "checked" : ""
      }  class="v2jun-switch-checkbox" id="autoCloseBookViewEmoji" type="checkbox">
              <label class="switch-label" for="autoCloseBookViewEmoji">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between">
            <span>回帖表情自动收起</span>
            <div class="v2jun-switch">
              <input name="autoCloseHuifuEmoji" value="true" ${getUserSetting("autoCloseHuifuEmoji") ? "checked" : ""
      }  class="v2jun-switch-checkbox" id="autoCloseHuifuEmoji" type="checkbox">
              <label class="switch-label" for="autoCloseHuifuEmoji">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between">
            <span>输入框自动聚焦</span>
            <div class="v2jun-switch">
              <input name="textareaAutoFocus" value="true" ${getUserSetting("textareaAutoFocus") ? "checked" : ""
      }  class="v2jun-switch-checkbox" id="textareaAutoFocus" type="checkbox">
              <label class="switch-label" for="textareaAutoFocus">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-tips">开启后在输入框光标位置插入内容,关闭则追加到末尾</li>


          <li class="v2jun-setting-li-title more-setting more-setting-click" style="margin-bottom:0;"><hr><b>高级设置</b><hr></li>
          <li class="more-setting" style="font-size:12px;text-align:center;margin:-16px 0;color:red;">使用以下功能前请先熟读并背诵版规(手动狗头.jpg)</li>
          <li class="setting-li-between more-setting">
            <span>一键吃肉</span>
            <div class="v2jun-switch">
              <input name="oneClickCollectMoney" value="true" ${getUserSetting("oneClickCollectMoney") ? "checked" : ""
      }  class="v2jun-switch-checkbox" id="oneClickCollectMoney" type="checkbox">
              <label class="switch-label" for="oneClickCollectMoney">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between more-setting">
            <span>自定义表情包</span>
            <textarea style="width:60%; min-height:50px;resize:vertical" class="v2jun-setting-li-input" name="userCustomEmojiList" id="userCustomEmojiList" placeholder="输入表情包链接,以英文逗号(,)分隔…">${getUserSetting(
        "userCustomEmojiList"
      )}</textarea>
          </li>
          <!--<li class="setting-li-between more-setting">
            <span>吹牛历史查询</span>
            <div class="v2jun-switch">
              <input name="showChuiniuHistory" value="true" ${getUserSetting("showChuiniuHistory") ? "checked" : ""
      }  class="v2jun-switch-checkbox" id="showChuiniuHistory" type="checkbox">
              <label class="switch-label" for="showChuiniuHistory">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>-->
          <li class="setting-li-between extra-setting" style="display:none;">
            <span>复读机(回帖+1)</span>
            <div class="v2jun-switch">
              <input name="showHuifuCopy" value="true" ${getUserSetting("showHuifuCopy") ? "checked" : ""}  class="v2jun-switch-checkbox" id="showHuifuCopy" type="checkbox">
              <label class="switch-label" for="showHuifuCopy">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between extra-setting" style="display:none;">
            <span>复读机自动提交</span>
            <div class="v2jun-switch">
              <input name="huifuCopyAutoSubmit" value="true" ${getUserSetting("huifuCopyAutoSubmit") ? "checked" : ""
      }  class="v2jun-switch-checkbox" id="huifuCopyAutoSubmit" type="checkbox">
              <label class="switch-label" for="huifuCopyAutoSubmit">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between extra-setting" style="display:none;">
            <span>黑名单增强</span>
            <div class="v2jun-switch">
              <input name="useUserBlackList" value="true" ${getUserSetting("useUserBlackList") ? "checked" : ""
      }  class="v2jun-switch-checkbox" id="useUserBlackList" type="checkbox">
              <label class="switch-label" for="useUserBlackList">
                <span class="v2jun-switch-inner" data-on="开" data-off="关"></span>
                <span class="v2jun-switch-handle"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between extra-setting use-black-list" style="display:none;">
            <span>黑名单ID</span>
            <textarea style="width:60%; min-height:50px;resize:vertical" class="v2jun-setting-li-input" name="userBlackList" id="userBlackList" placeholder="输入用户ID,以英文逗号(,)分隔,已自动将论坛管理员加入白名单,为空则不会屏蔽任何人…">${getUserSetting(
        "userBlackList"
      )}</textarea>
          </li>
        </ul>
        <footer>
          <hr style='margin-bottom:6px;'>
          <span class="v2jun-popup-setting-import">导入配置</span>
          <span class="v2jun-popup-setting-export">导出配置</span>
          <hr style='margin-top:6px;'>
          <span class="v2jun-setting-cancel-btn">取消</span>
          <span class="v2jun-setting-confirm-btn">保存</span>
        </footer>
      </form>
      </div>
    `;
    container.append(vSettingEle);
    // 监听下拉选择,改变其他元素状态
    $('form[name="settingForm"]')
      .find("select, input[type='checkbox']")
      .on("change", function () {
        const changeEventName = $(this).attr("name");
        const changeEventValue = $(this).val();
        console.log(changeEventName, changeEventValue);

        if (changeEventName === "imgUploadSelOpt") {
          if (changeEventValue == 1) $(".v2jun-setting-div .sel-suimo").show();
          else $(".v2jun-setting-div .sel-suimo").css("display", "none");
        } else if (changeEventName === "useUserBlackList") {
          $(".v2jun-setting-div .use-black-list").css("display", $(this).prop("checked") ? "flex" : "none");
        }
      });
    // 禁止蒙版下的body内容滚动
    $("body").css("overflow", "hidden");
    // 高级设置——额外设置
    // $(".v2jun-setting-div .extra-setting").toggle();
    $(".v2jun-setting-div .more-setting-click").click(
      clickCounter(
        ".v2jun-setting-div .more-setting-click",
        () => {
          $(".v2jun-setting-div .extra-setting").toggle();
        },
        3,
        3
      )
    );
    // 清除缓存
    $(".v2jun-setting-div .v2jun-clear-setting").click((e) => {
      localStorage.removeItem("yaohuoBetterPlusSetting");
      localStorage.removeItem("jquery-3.7.1.min");
      sessionStorage.removeItem("checkBlackUserIDReqCache");

      notifyBox("重置成功");

      setTimeout(() => {
        window.location.reload();
      }, 300);
    });
    // 导入配置
    $(".v2jun-setting-div .v2jun-popup-setting-import").click((e) => {
      // console.log('导入配置');
      importWithExportSetting().importJson();
    });
    // 导出配置
    $(".v2jun-setting-div .v2jun-popup-setting-export").click((e) => {
      // console.log('导出配置');
      importWithExportSetting().exportJson();
    });
    // 取消按钮
    $(".v2jun-setting-div .v2jun-setting-cancel-btn").click(closePopupContainer);
    // 提交按钮
    $(".v2jun-setting-div .v2jun-setting-confirm-btn").click(() => {
      const formData = {};
      $('form[name="settingForm"]')
        .find("input, select, textarea")
        .each(function () {
          // 根据不同输入方式格式化值,否则全部为字符串
          if ($(this).is(":checkbox")) {
            formData[this.name] = this.checked;
          } else if ($(this).is(":radio")) {
            const checkedValue = $('form[name="settingForm"]')
              .find('[name="' + this.name + '"]:checked')
              .val();
            formData[this.name] = checkedValue !== undefined ? checkedValue : null;
          } else if ($(this).attr("type") === "number") {
            formData[this.name] = parseFloat(this.value);
          } else if ($(this).attr("type") === "date") {
            formData[this.name] = new Date(this.value);
          } else if ($(this).is("select")) {
            formData[this.name] = parseFloat(this.value);
          } else {
            if (this.name == "userBlackList") {
              // 对字符串进行处理,将中文","替换为英文",",防止误输入中文逗号导致的解析错误
              formData[this.name] = this.value.replace(/,/g, ",");
            } else if (this.name == "userCustomEmojiList") {
              formData[this.name] = this.value.replace(/,/g, ",");
            } else {
              formData[this.name] = this.value;
            }
          }
        });
      // console.log(formData);
      const cacheSetting = JSON.parse(localStorage.getItem("yaohuoBetterPlusSetting"));
      for (const key of Object.keys(formData)) {
        cacheSetting[key] = formData[key];
      }
      try {
        localStorage.setItem("yaohuoBetterPlusSetting", JSON.stringify(cacheSetting));
        notifyBox("保存成功");
      } catch (error) {
        notifyBox("保存失败", false);
      }
      // 刷新页面以应用新设置
      setTimeout(() => {
        window.location.reload();
      }, 300);
    });
    // 根据用户设置决定是否显示水墨图床 token 设置
    if (getUserSetting("imgUploadSelOpt") != 1) $(".v2jun-setting-div .sel-suimo").css("display", "none");
    // 根据用户设置决定是否显示黑名单输入框
    if (!getUserSetting("useUserBlackList")) $(".v2jun-setting-div .use-black-list").css("display", "none");
  }
  // 设置 icon
  function createIcon() {
    // 页面内设置按钮,避免icon被设置为 0 时无法重置设置
    $(".subtitle2")
      .append("<span style='color:red;margin-left:15px;font-weight:bold;'>脚本设置</span>")
      .find("span")
      .click(() => {
        createPopupContainer();
      });

    const windowWidth = $(window).width();
    const bodyContentWidth = $("body").width();
    const iconSize = getUserSetting("settingIconSize") + "px";
    $("<img>")
      .attr("id", "settingICon")
      .attr("src", `${settingIconBase64}`)
      .css({
        "position": "fixed",
        "top": "10px",
        "right": "10px",
        "width": iconSize,
        "height": iconSize,
        "z-index": 9998
      })
      .appendTo("body")
      .click(() => {
        createPopupContainer();
      });
    // PC端设置右偏移量
    if (windowWidth > bodyContentWidth) {
      const rightOffset = (windowWidth - bodyContentWidth) / 2 + 10;
      $("#settingICon").css("right", rightOffset + "px");
    }
  }
}

// 初始化本地设置文件(存放于localStorage,清除浏览器缓存会让设置失效)
let userSettingCache = null;
function initSetting() {
  return new Promise((resolve) => {
    const localSetting = JSON.parse(localStorage.getItem("yaohuoBetterPlusSetting")) || {};
    userSettingCache = {
      ...defaultSetting,
      ...localSetting
    }; // 合并设置,自定义项覆盖默认选项,避免添加新功能时已缓存设置没有新功能相关从而产生bug
    try {
      localStorage.setItem("yaohuoBetterPlusSetting", JSON.stringify(userSettingCache));
      console.log("======> [ 已成功初始化设置 ]");
      resolve(true);
    } catch (error) {
      notifyBox("未知错误,初始化设置失败,请联系作者反馈bug…");
      resolve(false);
    }
  });
}

// 判断是否是在网站中(有些手机端浏览器无法识别油猴 @match 标识,导致在所有网站都会执行脚本)
function checkLocation() {
  const currentHost = window.location.host;
  const targetHostArr = ["yaohuo.me", "www.yaohuo.me"];
  return targetHostArr.includes(currentHost);
}

/* ================================================== 自定义方法开始 ================================================== */
/**
 * 元素检测函数 - 检测指定元素是否存在,存在时执行回调函数
 * @param {string} selector - 元素选择器
 * @param {function} callback - 元素存在时要执行的回调函数
 * @param {number} maxRetries - 最大重试次数,默认10次
 * @param {number} interval - 重试间隔时间(毫秒),默认300ms
 * @param {number} currentRetry - 当前重试次数(内部使用)
 */
function waitForElement(selector, callback, maxRetries = 10, interval = 300, currentRetry = 0) {
  if (currentRetry >= maxRetries) {
    // console.log(`元素检测失败: ${selector} 在 ${maxRetries} 次重试后仍未找到`);
    return;
  }
  // 支持多个选择器(数组或逗号分隔的字符串)
  const selectors = Array.isArray(selector) ? selector : selector.split(',').map(s => s.trim());
  // 检查是否有任何一个元素存在
  const foundElement = selectors.some(sel => $(sel).length > 0);

  if (foundElement) {
    // 元素存在,执行回调函数
    // console.log(`元素检测成功: 在 ${currentRetry + 1} 次检测时找到符合条件的元素`);
    callback();
  } else {
    // 元素不存在,继续重试
    // console.log(`元素检测重试: 第 ${currentRetry + 1}/${maxRetries} 次检测`);
    setTimeout(() => {
      waitForElement(selector, callback, maxRetries, interval, currentRetry + 1);
    }, interval);
  }
}
// 监听评论区加载
function listenRecontentLoad() {
  // 监听新 .recontent 元素加载,以此判断评论区加载更多是否完成
  const observer = new MutationObserver(function (mutations) {
    mutations.forEach(function (mutation) {
      const addedNodes = $(mutation.addedNodes);
      if (addedNodes.hasClass("recontent") ||
        addedNodes.find(".recontent").length ||
        addedNodes.hasClass("reline list-reply") ||
        addedNodes.find(".reline.list-reply").length) {
        // console.log("======> [ 评论区加载更多完成  ]");
        _waitFunc();
      }
    });
  });
  observer.observe(document.body, {
    childList: true,
    subtree: true
  });
  // 需要执行的函数
  function _waitFunc() {
    getUserSetting("useUserBlackList") && handleUserBlacklist();
    executeFunctionForURL(/^(\/bbs-.*\.html(\?.*)?|\/bbs\/book_view\.aspx\?.*id=\d+.*)$/i, imgCustomProcess);
    getUserSetting("showHuifuCopy") && executeFunctionForURL(/^(\/bbs-.*\.html(\?.*)?|\/bbs\/book_view\.aspx\?.*id=\d+.*)$/i, huifuCopy);
  }
  _waitFunc();
}
// 加载并执行远程js文件,将其存入 localstorage
function loadAndExecuteScript(url, loaclStorageKey) {
  return new Promise((resolve) => {
    // 对于jQuery,先检查window.jQuery对象是否已存在
    if (/jquery/i.test(url) && window.jQuery) {
      console.log('======> [ jQuery 已存在,无需重复加载 ]');
      resolve(true);
      return;
    }

    const cacheScript = localStorage.getItem(loaclStorageKey);
    if (cacheScript?.length > 0) {
      _executeScript(cacheScript); // 执行缓存 js
      resolve(true);
    } else {
      fetch(url) // 加载远程 js
        .then((response) => response.text())
        .then((fetchScriptContent) => {
          _executeScript(fetchScriptContent);
          localStorage.setItem(loaclStorageKey, fetchScriptContent);
          resolve(true);
        })
        .catch((err) => {
          notifyBox("未知错误,Jquery 加载失败,请刷新重试…", false);
          resolve(false);
        });
    }
  });

  // 执行指定内容 js 代码
  function _executeScript(scriptContent) {
    const script = document.createElement("script"); // 创建script元素
    script.text = scriptContent; // 设置脚本内容
    document.head.appendChild(script); // 执行脚本
    // console.log('jQuery 成功加载');
  }
}
// 解析直播url
async function getZbPlayUrl(url, callback) {
  if (url.includes("douyin")) {
    const res = await myAjax("https://i.qdqqd.com/", {
      dyzbjx: url
    });
    if (res?.HD?.length > 0) callback(res.HD);
    else if (res?.LD?.length > 0) callback(res.LD);
    else callback(false);
  } else if (url.includes("kuaishou")) {
    const res = await myAjax("https://i.qdqqd.com/", {
      kszbjx: url
    });
    if (res?.HD?.length > 0) callback(res.HD);
    else if (res?.LD?.length > 0) callback(res.LD);
    else callback(false);
  } else {
    notifyBox("不支持的链接", false);
    callback(false);
  }
}
// 解析视频url
async function getVideoPlayUrl(url, callback) {
  if (url.includes("douyin")) {
    const res = await myAjax("https://i.qdqqd.com/", {
      dyjx: url
    });
    if (res?.video?.length > 0) callback(res.video);
    else callback(false);
  } else if (url.includes("kuaishou")) {
    const res = await myAjax("https://i.qdqqd.com/", {
      ksjx: url
    });
    if (res?.video?.length > 0) callback(res.video);
    else callback(false);
  } else if (url.includes("bilibili")) {
    const res = await myAjax("https://i.qdqqd.com/", {
      dyjx: url
    });
    if (res?.video?.length > 0) callback(res.video);
    else callback(false);
  } else if (url.includes("tiktok")) {
    const res = await myAjax("https://i.qdqqd.com/", {
      tiktokjx: url
    });
    if (res?.video?.length > 0) callback(res.video);
    else callback(false);
  } else {
    notifyBox("不支持的链接", false);
    callback(false);
  }
}

/**
 * 上传文件到指定api
 * @param {*} url api地址
 * @param {*} type 请求方法
 * @param {*} data 上传文件数据
 * @param {*} success 成功回调
 * @param {*} error 失败回调
 * @param {*} options 其他参数
 */
function uploadFiles({ url, type = "POST", data, success = () => { }, error = () => { }, options = {} } = {}) {
  $.ajax({
    url,
    type,
    data,
    contentType: false,
    processData: false,
    dataType: "json",
    ...options,
    success,
    error
  });
}

// 生成输入内容域
function showInputPopup(inputTitle, callback) {
  // 创建蒙版
  const mask = $('<div class="v2jun-input-popup-mask"></div>');
  mask.click(function (event) {
    if (event.target === mask[0]) {
      mask.remove();
      callback(null);
    }
  });
  // 创建弹出框
  const popup = $('<div class="v2jun-input-popup"></div>');
  // 创建输入框
  for (let i = 0; i < inputTitle.length; i++) {
    const inputBox = $(
      '<div class="v2jun-input-popup-input"><label class="v2jun-input-popup-label">' +
      inputTitle[i] +
      ':</label><textarea class="v2jun-input-popup-textarea" rows="2" placeholder="请输入..."></textarea></div>'
    );
    popup.append(inputBox);
  }
  // 创建按钮容器
  const buttonsContainer = $('<div class="v2jun-input-popup-buttons"></div>');
  // 创建取消按钮
  const cancelBtn = $('<button class="v2jun-input-popup-cancel-btn">取消</button>');
  cancelBtn.click(function () {
    mask.remove();
    callback(null);
  });
  // 创建确定按钮
  const submitBtn = $('<button class="v2jun-input-popup-submit-btn">确定</button>');
  submitBtn.click(function () {
    const inputs = $(".v2jun-input-popup-textarea");
    const inputValues = [];
    inputs.each(function () {
      inputValues.push($(this).val());
    });
    mask.remove();
    callback(inputValues);
  });
  // 将按钮添加到按钮容器
  buttonsContainer.append(cancelBtn);
  buttonsContainer.append(submitBtn);
  // 将按钮容器添加到弹出框
  popup.append(buttonsContainer);
  // 将弹出框添加到蒙版
  mask.append(popup);

  // 将蒙版添加到页面
  $("body").append(mask);
}

// 判断是否为pc端浏览器打开
function isPC() {
  let userAgentInfo = navigator.userAgent;
  let mobileAgents = ["Android", "iPhone", "iPad", "iPod", "Windows Phone"];
  let isPC = true;
  for (let i = 0; i < mobileAgents.length; i++) {
    if (userAgentInfo.indexOf(mobileAgents[i]) > -1) {
      isPC = false;
      break;
    }
  }
  return isPC;
}

// 滚动页面到指定标签,并显示在屏幕中间
function scrollToEle(toEle, animateTime = 500) {
  const targetElement = $(toEle); // 使用适当的选择器选择目标元素
  const windowHeight = $(window).height(); // 获取窗口的高度
  const elementOffset = targetElement.offset().top; // 获取目标元素相对于文档顶部的偏移量
  const offset = elementOffset - windowHeight / 2; // 计算滚动的偏移量

  $("html, body").animate(
    {
      scrollTop: offset
    },
    animateTime
  ); // 平滑滚动到计算的偏移量位置
}

// Ajax 请求
function myAjax(url, data, options, type = "get") {
  return new Promise((resolve, reject) => {
    $.ajax({
      url,
      type,
      data,
      ...options,
      success: (response) => {
        resolve(response);
      },
      error: (error) => {
        reject(error);
      }
    });
  });
}

// 生成指定长度随机字符串
function generateRandomString(length) {
  let characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  let randomString = "";

  for (let i = 0; i < length; i++) {
    let randomIndex = Math.floor(Math.random() * characters.length);
    randomString += characters[randomIndex];
  }

  return randomString;
}

/**
 * 指定元素被点击*次后执行指定函数
 * @param {*} clickEle 指定元素
 * @param {*} callback 回调函数
 * @param {*} clickLimit 点击次数
 * @param {*} timeLimit 连续点击限制时间,单位/s
 */
function clickCounter(clickEle, callback, clickLimit = 3, timeLimit = 1) {
  $(clickEle).on("click", function () {
    let $button = $(this);
    let clickCount = $button.data("clickCount") || 0; // 获取点击次数,如果不存在则默认为0
    clickCount++; // 点击次数加1
    $button.data("clickCount", clickCount); // 存储点击次数

    if (clickCount === 1) {
      // 如果是第一次点击
      $button.data(
        "timeout",
        setTimeout(function () {
          $button.removeData("clickCount"); // 超时后移除点击次数数据
        }, timeLimit * 1000)
      ); // 设置时间窗口,单位为毫秒
    } else if (clickCount === clickLimit) {
      // 如果点击次数达到设定的限制
      clearTimeout($button.data("timeout")); // 清除超时
      $button.removeData("clickCount"); // 清除点击次数数据
      callback(); // 执行指定的回调函数
    }
  });
}
// 向页面中添加指定样式
function addCustomStyle() {
  // console.log("%c ===> [ 添加自定义样式 ] <===", "font-size:13px; background:pink; color:#bf2c9f;");
  $("<style>").text(customCSS).appendTo("head");

  $("head").append(`<style>.img-thumb{max-width:${getUserSetting("imgThumbWidth")}px;display: block;}`); // 将图片缩小样式添加到页面中
}
/**
 * 防抖
 * @param {*} func
 * @param {*} delay
 * @returns
 */
function debounce(func, delay = 800) {
  console.log("%c ===> [ 防抖函数开始运行 ] <===", "font-size:13px; background:pink; color:#bf2c9f;");
  let timeoutId;

  return function () {
    clearTimeout(timeoutId);

    timeoutId = setTimeout(() => {
      func.apply(this, arguments);
    }, delay);
  };
}

/**
 * 在指定textarea/input当前光标处插入内容
 * @param {*} content 插入内容
 * @param {String} targetEle 插入目标 element(jquery可使用的选择器)
 * @param {Boolean} notFocus 忽略用户设置,强行不聚焦
 */
function insetCustomContent(content, targetEle, notFocus = false) {
  const textarea = $(targetEle); // 获取目标元素
  const textareaContent = textarea.val(); // 获取当前内容
  if (getUserSetting("textareaAutoFocus") && !notFocus) {
    const cursorPosition = textarea[0].selectionStart; // 获取当前光标位置
    const newValue = textareaContent.slice(0, cursorPosition) + content + textareaContent.slice(cursorPosition); // 将内容插入当前光标处。如果未选择输入框则插入最后
    textarea.val(newValue); // 写入完整内容
    // 将光标移到插入内容的最后
    textarea[0].selectionStart = cursorPosition + content.length;
    textarea[0].selectionEnd = cursorPosition + content.length;
    textarea.focus();

    console.log("autoCloseBookViewEmoji", getUserSetting("autoCloseBookViewEmoji"));
    console.log("autoCloseHuifuEmoji", getUserSetting("autoCloseHuifuEmoji"));
    getUserSetting("autoCloseBookViewEmoji") &&
      $(".v2jun-emojilist-div.bookview-emoji").css("display", "none") &&
      $(".v2jun-custom-toggle-btn.view-emoji-toggle").text("表情 展开") &&
      saveUserSetting("showBookViewEmoji", false);
    getUserSetting("autoCloseHuifuEmoji") &&
      $(".v2jun-emojilist-div.v2jun-huifu-emoji").css("display", "none") &&
      $(".v2jun-custom-toggle-btn.v2jun-huifu-emoji-toggle").text("表情 展开") &&
      saveUserSetting("showHuifuEmoji", false);
  } else {
    textarea.val(textareaContent + content); // 追加到文本末尾
  }
}

/**
 * 当前页面为指定 url 时执行函数
 * @param {*} targetPath 指定 url,可为正则表达式
 * @param {Function} executeFunction 执行函数
 */
function executeFunctionForURL(targetPath, executeFunction) {
  if (!targetPath || targetPath.length === 0) throw new Error("传入路径无效!");
  if (typeof executeFunction !== "function") throw new Error("传入函数无效!");

  const currentPath = window.location.pathname + window.location.search;
  if (targetPath instanceof RegExp) {
    targetPath.test(currentPath) && executeFunction();
  } else {
    currentPath.includes(targetPath) && executeFunction();
  }
}

// 从指定url获取get参数`
function getUrlParam(paramName, targetUrl = window.location.href) {
  try {
    let urlObj = new URL(targetUrl, window.location.origin);
    return urlObj.searchParams.get(paramName);
  } catch (error) {
    console.error("无效的URL:", targetUrl, error);
    return null;
  }
}
// 获取指定页面内容
function getPageContent(path, method = "GET") {
  const url = `${window.location.origin}${path}`;
  return new Promise((resolve, reject) => {
    $.ajax({
      url,
      method,
      dataType: "html",
      success: (response) => {
        resolve(response);
      },
      error: (error) => {
        reject(error);
      }
    });
  });
}

// 设置保存
function saveUserSetting(setName, setValue) {
  userSettingCache[setName] = setValue;
  try {
    localStorage.setItem("yaohuoBetterPlusSetting", JSON.stringify(userSettingCache));
    // notifyBox(successMsg);
  } catch (error) {
    // notifyBox(errorMsg, false);
    throw new Error("未知错误,保存设置失败");
  }
}
// 设置获取
function getUserSetting(name) {
  try {
    return (userSettingCache ?? defaultSetting)[name] ?? defaultSetting[name];
  } catch (error) {
    notifyBox("未知错误,获取用户设置失败", false);
    throw new Error("未知错误,获取设置失败");
  }
}
// 等待提示框
function showWaitBox(msg) {
  const overlay = $('<div class="v2jun-wait-box-overlay"></div>');
  const modal = $('<div class="v2jun-wait-box-modal"></div>');
  modal.append('<div class="v2jun-wait-box-spinner"></div>');
  modal.append(`<span class="wait-box-text">${msg}</span>`);
  overlay.append(modal);
  $("body").append(overlay);
  overlay.on("click", function (e) {
    e.stopPropagation();
  });
  return overlay;
}

/**
 * 弹出提示
 * @param {String} message 提示内容
 * @param {Boolean} status 提示状态,true成功,false失败,默认true
 * @param {Number} delayTime 提示时间/ms,默认1500ms
 */
let offsetY = 0; // 消息框初始垂直偏移量
function notifyBox(message, status = true, delayTime = 1500) {
  // 消息父容器
  const containerDiv = $("<div>")
    .css({
      "position": "fixed",
      "top": `calc(100px + ${offsetY}px)`,
      "left": "50%",
      "transform": "translateX(-50%)",
      "width": "350px",
      "max-width": "80%",
      "text-align": "center",
      "z-index": 9999
    })
    .appendTo("body");
  // 消息框创建
  const messageDiv = $("<div>")
    .text(message)
    .css({
      "background": status ? "#f0f9eb" : "#fef0f0",
      "color": status ? "#67c23a" : "#f56c6c",
      "padding": "5px 20px",
      "box-shadow": "0 2px 4px rgba(0, 0, 0, 0.2)",
      "white-space": "normal",
      "wordWrap": "break-word",
      "overflowWrap": "break-word",
      "hyphens": "auto",
      "border-radius": "5px",
      "max-width": "100%" // 设置消息框的最大宽度
    })
    .appendTo(containerDiv);
  // 延迟后消息框销毁
  messageDiv
    .fadeIn()
    .delay(delayTime)
    .fadeOut(function () {
      containerDiv.remove();
      offsetY -= 50; // 删除后减少50px的垂直偏移量
    });

  offsetY += 50; // 增加消息框的高度和间距
}

/* ================================================== 自定义方法结束 ================================================== */