Better Hydro

Improve the Hydro interface with custom settings!

目前为 2024-10-06 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Better Hydro
  3. // @namespace http://tampermonkey.net/
  4. // @version 3.1
  5. // @description Improve the Hydro interface with custom settings!
  6. // @author Cheerimy
  7. // @match *://hydro.ac/*
  8. // @match *://goj.wiki/*
  9. // @match *://oiclass.com/*
  10. // @match *://www.oiclass.com/*
  11. // @match *://106.53.100.188:10024/*
  12. // @icon https://s21.ax1x.com/2024/08/22/pAi6KDP.png
  13. // @grant none
  14. // @license GPLv3
  15. // ==/UserScript==
  16.  
  17. (function() {
  18. 'use strict';
  19. //Cookies 初始化函数
  20. function setCookieIfNotExists(name, value) {
  21. if (!document.cookie.split('; ').map(cookie => cookie.split('=')[0]).includes(name)) {
  22. document.cookie = `${name}=${encodeURIComponent(value)};path=/;expires=${new Date(Date.now()+365*24*60*60*1000).toUTCString()}`
  23. }
  24. }
  25. //获取 Cookies 模块
  26. function getCookie(name) {
  27. const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
  28. return match ? decodeURIComponent(match[2]) : null
  29. }
  30. //初始化 Cookies 模块
  31. function initCookies() {
  32. setCookieIfNotExists('browserupdateorg', 'pause');
  33. setCookieIfNotExists('background', 'https://api.imlazy.ink/mcapi/mcbg.php');
  34. setCookieIfNotExists('music', '//music.163.com/outchain/player?type=2&id=133567&auto=0&height=66');
  35. console.log('Cookies 模块加载成功!');
  36. }
  37. //基本模块(欢迎栏与 UI 优化)
  38. function loadWelcomeMessage() {
  39. const username = Array.from(document.querySelectorAll('li[data-dropdown-target="#menu-nav-user"]')).map(item => item.querySelector('a')).find(link => link && link.textContent.trim() !== 'Language')?.textContent.trim() || 'Visitor';
  40. const panel = document.getElementById('panel');
  41. panel.style.backgroundImage = `url(${getCookie('background')})`;
  42. panel.style.backgroundSize = 'cover';
  43. panel.style.backgroundPosition = 'center';
  44. const style = document.createElement('style');
  45. style.textContent = `.section{border-radius:8px!important;opacity:0.75!important}.section:hover{opacity:1!important}.section__table-header{border-radius:8px 8px 0 0;opacity:0.75!important}.section__table-header:hover{opacity:1!important}`;
  46. document.head.append(style);
  47. const title=document.title;
  48. const name=title.split(" - ").pop().trim();
  49. const newHTML = `<div class="section visible"><div class="section__header"><h1 class="section__title">欢迎 ${username} 来到 ${name}!</h1><h1 class="section__title"style="text-align: end;">Let's Coding Now!</h1></div></div>`;
  50. const main = panel.querySelector('.main');
  51. const element = main.querySelector('div');
  52. element.insertAdjacentHTML('afterbegin', newHTML);
  53. console.log('基本模块加载成功!');
  54. }
  55. //音乐模块(播放音乐源音乐)
  56. function loadMusicPlayer() {
  57. const musicURL = getCookie('music');
  58. const musicHTML = `<div class="section side visible"><div class="section__header"><h1 class="section__title">一首歌曲</h1></div><div class="section__body typo"><iframe frameborder="no"border="0"marginwidth="0"marginheight="0"width="100%"height="86"src="${musicURL}"></iframe></div></div>`;
  59. const row = document.getElementById('panel').querySelector('.main').querySelector('.row');
  60. const divs = row.querySelectorAll(':scope > div');
  61. divs.forEach(div => {
  62. const className = div.className;
  63. if (className.includes('medium-3') && className.includes('columns')) {
  64. div.insertAdjacentHTML('afterbegin', musicHTML)
  65. }
  66. });
  67. console.log('音乐播放器加载成功!')
  68. }
  69. //个性化面板模块
  70. function loadSettingsPanel() {
  71. const settingDiv = document.createElement('div');
  72. settingDiv.id = 'setting';
  73. settingDiv.innerHTML = `<div class="section side visible"><div class="section__header"><h1 class="section__title">设置</h1></div><style>.input-group{display:flex;flex-direction:column;gap:10px;max-width:400px;margin:0 auto}.input-group label{font-size:14px;color:#333}.input-group input[type="text"]{padding:8px;font-size:14px;border:1px solid#ccc;border-radius:4px;width:100%;box-sizing:border-box}.input-group input[type="text"]::placeholder{color:#999}</style><div class="section__body typo"><div class="input-group"><label for="background-url">背景图片:</label><input type="text"id="background-url"placeholder="输入背景图片地址"><button id="save-background">保存背景</button><label for="music-url">音乐地址:</label><input type="text"id="music-url"placeholder="输入音乐播放器地址"><button id="save-music">保存音乐</button></div></div></div>`;
  74. const omnibarContent = document.getElementById('omnibar-content');
  75. omnibarContent.insertAdjacentElement('afterend', settingDiv);
  76. const setCookie = (name, value, days = 365) => {
  77. const expires = new Date(Date.now() + days * 24 * 60 * 60 * 1000).toUTCString();
  78. document.cookie = `${name}=${value};expires=${expires};path=/`
  79. };
  80. const saveInput = (inputId, cookieName) => {
  81. const input = document.getElementById(inputId);
  82. if (input) {
  83. setCookie(cookieName, input.value)
  84. } else {
  85. console.error(`Element#${inputId}not found`)
  86. }
  87. };
  88. document.getElementById('save-background').onclick = () => saveInput('background-url', 'background');
  89. document.getElementById('save-music').onclick = () => saveInput('music-url', 'music');
  90. console.log('个性化面板模块加载成功!')
  91. }
  92. //尝试加载 Cookies 模块
  93. try {
  94. initCookies();
  95. } catch (error) {
  96. console.error('Cookies 模块加载失败,错误::', error);
  97. }
  98. //尝试加载基础模块
  99. try {
  100. loadWelcomeMessage();
  101. } catch (error) {
  102. console.error('基础模块加载失败,错误::', error);
  103. }
  104. //尝试加载音乐模块
  105. try {
  106. loadMusicPlayer();
  107. } catch (error) {
  108. console.error('音乐模块加载失败,错误::', error);
  109. }
  110. //尝试个性化面板面板模块
  111. setTimeout(function() {
  112. try {
  113. loadSettingsPanel();
  114. } catch (error) {
  115. console.error('个性化面板模块加载失败,错误::', error);
  116. }
  117. }, 2000);
  118. })();