├── README.md └── LDStatus.user.js /README.md: -------------------------------------------------------------------------------- 1 | # LDStatus 2 | 3 | LDStatus 是一个油猴脚本,用于在浏览 Linux.do 网站时显示用户的信任级别进度。通过这个脚本,您可以实时查看自己的信任级别进度,而无需频繁切换到 connect.linux.do 页面。 4 | 5 | ## 功能特点 6 | 7 | - **浮动窗口**:在 Linux.do 页面左侧显示一个可拖动的浮动窗口 8 | - **实时数据**:从 connect.linux.do 自动获取信任级别数据 9 | - **清晰展示**:以"目标: 已完成数 / 需要完成数"的形式展示数据,并显示24小时内的活动数据 10 | - **折叠功能**:支持窗口折叠为小图标,不影响浏览体验 11 | - **自动刷新**:每五分钟自动刷新数据,保持信息最新 12 | - **可拖动**:支持拖动调整窗口位置,放置在您喜欢的位置 13 | - **直观颜色**:绿色数字表示已达成目标,红色数字表示未达成目标 14 | - **主题切换**:支持深色和亮色两种主题,可根据个人喜好随时切换 15 | - **自动更新**:支持脚本自动更新,无需手动重新安装即可获取最新版本 16 | - **状态记忆**:自动记忆窗口位置和折叠状态,下次访问时自动恢复 17 | 18 | ## 安装方法 19 | 20 | ### 前提条件 21 | 22 | 在安装脚本之前,您需要先安装一个用户脚本管理器扩展。推荐使用 Tampermonkey,它支持大多数主流浏览器: 23 | 24 | - [Chrome 版 Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo) 25 | - [Firefox 版 Tampermonkey](https://addons.mozilla.org/en-US/firefox/addon/tampermonkey/) 26 | - [Edge 版 Tampermonkey](https://microsoftedge.microsoft.com/addons/detail/tampermonkey/iikmkjmpaadaobahmlepeloendndfphd) 27 | - [Safari 版 Tampermonkey](https://apps.apple.com/app/apple-store/id1482490089) 28 | 29 | ### 方法一:直接安装(推荐) 30 | 31 | 1. 确保您已经安装了 Tampermonkey 或其他用户脚本管理器 32 | 2. 点击以下链接直接安装脚本: 33 | - [安装 LDStatus 脚本](https://github.com/1e0n/LinuxDoStatus/raw/master/LDStatus.user.js) 34 | 3. Tampermonkey 将自动检测并提示您安装脚本 35 | 4. 点击"安装"按钮完成安装 36 | 5. 安装后,脚本将自动检测更新,无需手动重新安装 37 | 38 | ### 方法二:手动安装 39 | 40 | 1. 安装 Tampermonkey 浏览器扩展 41 | 2. 访问 [LDStatus.user.js 文件](https://github.com/1e0n/LinuxDoStatus/blob/master/LDStatus.user.js) 42 | 3. 点击"Raw"按钮查看原始文件 43 | 4. Tampermonkey 应该会自动检测并提示安装 44 | 5. 如果没有自动提示,请手动复制文件内容 45 | 46 | ### 方法三:手动复制粘贴 47 | 48 | 1. 安装 Tampermonkey 浏览器扩展 49 | 2. 点击浏览器工具栏中的 Tampermonkey 图标 50 | 3. 选择"添加新脚本" 51 | 4. 删除编辑器中的所有默认代码 52 | 5. 将 [LDStatus.user.js](https://github.com/1e0n/LinuxDoStatus/blob/master/LDStatus.user.js) 的内容复制并粘贴到编辑器中 53 | 6. 点击"文件"菜单,然后选择"保存" 54 | 55 | ## 使用方法 56 | 57 | 安装脚本后,访问 [Linux.do](https://linux.do) 网站,脚本将自动运行并在页面左侧显示信任级别浮动窗口。 58 | 59 | - **展开/折叠**:点击窗口右上角的箭头按钮可以展开/折叠窗口 60 | - **刷新数据**:点击刷新按钮可以手动刷新数据(脚本也会每五分钟自动刷新) 61 | - **切换主题**:点击主题切换按钮(🌙/☀️)可以在深色和亮色主题之间切换 62 | - **移动窗口**:拖动窗口标题栏可以调整窗口位置 63 | - **查看进度**:绿色数字表示已达成目标,红色数字表示未达成目标 64 | - **变化标识**:当目标完成数有变化时,会显示黄色的⬆(增加)或蓝色的⬇(减少)标识及变化数值,即使刷新后数值没有变化也会保留标识 65 | - **活动统计**:在窗口底部显示24小时内的活动数据,包括浏览话题数、回复话题数、已读帖子数、获赞数和点赞数 66 | 67 | ## 注意事项 68 | 69 | - 脚本需要您已经登录 Linux.do 账号 70 | - 如果数据加载失败,请确保您已登录并刷新页面 71 | - 脚本仅在 Linux.do 域名下运行,不会在其他网站上激活 72 | 73 | ## 自动更新 74 | 75 | LDStatus 脚本支持自动更新功能。当 GitHub 仓库中的脚本版本更新后,您的浏览器将自动检测并提示您更新到最新版本。这意味着您无需手动重新安装脚本即可获得最新功能和修复。 76 | 77 | 自动更新的工作原理: 78 | 1. 脚本每天会自动检查是否有新版本 79 | 2. 如果发现新版本,Tampermonkey 会提示您更新 80 | 3. 点击更新按钮即可完成更新,无需重新访问 GitHub 81 | 82 | ## 更新日志 83 | ### v1.12 84 | - 删除了面板下方"近期的活动"显示区域,简化界面 85 | - 新增进度指示条功能:在每行数据下方添加3像素高的进度条 86 | - 进度条颜色逻辑:正常项目已完成显示绿色/未完成显示红色,举报相关项目颜色相反 87 | - 清理了相关的localStorage缓存数据 88 | 89 | ### v1.11 90 | - 文本优化,“获赞:单日最高数量”按照原始英文解释,这里应该指的是"获得过赞的总天数" 91 | 92 | ### v1.10 93 | - 完全重构时间统计逻辑,改用自然日计算替代相对时间窗口 94 | - "今天"一栏现在显示今天0点到现在的数据变化 95 | - "昨天"一栏现在显示昨天一整天(0-24点)的数据变化 96 | - 优化数据存储机制,每天只保留首末两个数据点,显著减少存储压力 97 | - 自动刷新间隔保持为5分钟 98 | 99 | ### v1.9 100 | - "近期的活动"区块支持显示最近两天(昨天/今天)的数据,并以列形式展示,增加趋势箭头和变化数值,便于对比每日活跃度。 101 | - 所有数字列和表头均右对齐,视觉更整齐。 102 | - 新增表头,明确每列含义(昨天/今天/变化)。 103 | - 亮色和暗色主题下,所有下部(近期的活动)文本和数值颜色与上部保持一致,风格统一。 104 | - 优化暗色主题下昨天数值的颜色,提升可读性。 105 | - 优化亮色主题下昨天和今天的数值颜色,提升对比度和一致性。 106 | - 数据自动刷新时间从两分钟改为五分钟,减少服务器压力。 107 | - 主题切换、面板拖动、折叠、刷新、自动更新等功能保持兼容。 108 | 109 | ### v1.8 110 | - 添加了亮色和深色两种主题,可以根据个人喜好切换 111 | - 在标题栏添加了主题切换按钮(🌙/☀️图标) 112 | - 修复了点赞帖子数据显示不正确的问题 113 | - 优化了数据处理逻辑,提高了数据准确性 114 | 115 | ### v1.7 116 | - 在窗口标题添加了当前脚本的版本号 117 | - 在窗口右上角添加了一个检查更新按钮(🔎图标) 118 | - 修复了之前自动更新会失败的问题 119 | 120 | ### v1.6 121 | - 添加窗口状态记忆功能,自动记忆窗口位置和折叠状态 122 | 123 | ### v1.5 124 | - 添加自动更新功能,脚本现在可以自动检测并更新到最新版本 125 | 126 | ### v1.4 127 | - 添加24小时内活动数据统计功能 128 | - 在浮动窗口底部显示用户24小时内的浏览话题数、回复话题数、已读帖子数、获赞数和点赞数 129 | 130 | ### v1.3 131 | - 修复帖子界面按钮消失的问题 132 | - 使用更特定的CSS选择器避免与网站原有元素冲突 133 | 134 | ### v1.2 135 | - 改进目标完成数变化的标识功能,即使刷新后数值没有变化也会保留标识 136 | - 增加变化标识的颜色:黄色表示增加,蓝色表示减少 137 | 138 | ### v1.1 139 | - 将数据刷新时间从每分钟改为每两分钟 140 | - 添加目标完成数变化的标识功能(⬆表示增加,⬇表示减少) 141 | 142 | ### v1.0 143 | - 初始版本发布 144 | - 实现基本的信任级别数据获取和显示 145 | - 添加浮动窗口和折叠功能 146 | - 支持自动刷新和手动刷新 147 | 148 | ## 反馈与贡献 149 | 150 | 如果您有任何问题、建议或反馈,请在 [GitHub Issues](https://github.com/1e0n/LinuxDoStatus/issues) 上提交。 151 | 152 | 欢迎通过 Pull Requests 贡献代码改进脚本。 153 | -------------------------------------------------------------------------------- /LDStatus.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name LDStatus 3 | // @namespace http://tampermonkey.net/ 4 | // @version 1.12 5 | // @description 在 Linux.do 页面显示信任级别进度 6 | // @author 1e0n 7 | // @match https://linux.do/* 8 | // @grant GM_xmlhttpRequest 9 | // @grant GM_setValue 10 | // @grant GM_getValue 11 | // @grant GM_info 12 | // @connect connect.linux.do 13 | // @connect github.com 14 | // @connect raw.githubusercontent.com 15 | // @updateURL https://raw.githubusercontent.com/1e0n/LinuxDoStatus/master/LDStatus.user.js 16 | // @downloadURL https://raw.githubusercontent.com/1e0n/LinuxDoStatus/master/LDStatus.user.js 17 | // ==/UserScript== 18 | 19 | (function() { 20 | 'use strict'; 21 | 22 | // 创建样式 - 使用更特定的选择器以避免影响帖子界面的按钮 23 | const style = document.createElement('style'); 24 | style.textContent = ` 25 | /* 深色主题 */ 26 | #ld-trust-level-panel.ld-dark-theme { 27 | background-color: #2d3748; 28 | color: #e2e8f0; 29 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.4); 30 | } 31 | 32 | #ld-trust-level-panel.ld-dark-theme #ld-trust-level-header { 33 | background-color: #1a202c; 34 | color: white; 35 | } 36 | 37 | #ld-trust-level-panel.ld-dark-theme .ld-trust-level-item.ld-success .ld-value { 38 | color: #68d391; 39 | } 40 | 41 | #ld-trust-level-panel.ld-dark-theme .ld-trust-level-item.ld-fail .ld-value { 42 | color: #fc8181; 43 | } 44 | 45 | #ld-trust-level-panel.ld-dark-theme .ld-loading { 46 | color: #a0aec0; 47 | } 48 | 49 | 50 | 51 | #ld-trust-level-panel.ld-dark-theme .ld-version { 52 | color: #a0aec0; 53 | } 54 | 55 | /* 亮色主题 - 提高对比度 */ 56 | #ld-trust-level-panel.ld-light-theme { 57 | background-color: #ffffff; 58 | color: #1a202c; 59 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); 60 | border: 1px solid #e2e8f0; 61 | } 62 | 63 | #ld-trust-level-panel.ld-light-theme #ld-trust-level-header { 64 | background-color: #3182ce; /* 更深的蓝色 */ 65 | color: #ffffff; 66 | border-bottom: 1px solid #2c5282; /* 添加底部边框 */ 67 | } 68 | 69 | #ld-trust-level-panel.ld-light-theme .ld-trust-level-item.ld-success .ld-value { 70 | color: #276749; /* 更深的绿色 */ 71 | font-weight: bold; 72 | } 73 | 74 | #ld-trust-level-panel.ld-light-theme .ld-trust-level-item.ld-fail .ld-value { 75 | color: #c53030; 76 | font-weight: bold; 77 | } 78 | 79 | /* 亮色主题下的文本颜色 */ 80 | #ld-trust-level-panel.ld-light-theme .ld-name { 81 | color: #2d3748; /* 深灰色 */ 82 | } 83 | 84 | #ld-trust-level-panel.ld-light-theme .ld-loading { 85 | color: #4a5568; 86 | } 87 | 88 | 89 | 90 | #ld-trust-level-panel.ld-light-theme .ld-version { 91 | color: #e2e8f0; 92 | } 93 | 94 | /* 共用样式 */ 95 | #ld-trust-level-panel { 96 | position: fixed; 97 | left: 10px; 98 | top: 100px; 99 | width: 210px; 100 | border-radius: 8px; 101 | z-index: 9999; 102 | font-family: Arial, sans-serif; 103 | transition: all 0.3s ease; 104 | overflow: hidden; 105 | font-size: 12px; 106 | } 107 | 108 | #ld-trust-level-header { 109 | padding: 8px 10px; 110 | cursor: move; 111 | display: flex; 112 | justify-content: space-between; 113 | align-items: center; 114 | user-select: none; 115 | } 116 | 117 | .ld-header-content { 118 | display: flex; 119 | width: 100%; 120 | align-items: center; 121 | justify-content: space-between; 122 | white-space: nowrap; 123 | } 124 | 125 | .ld-header-content > span:first-child { 126 | margin-right: auto; 127 | font-weight: bold; 128 | } 129 | 130 | #ld-trust-level-content { 131 | padding: 10px; 132 | max-height: none; 133 | overflow-y: visible; 134 | } 135 | 136 | .ld-trust-level-item { 137 | margin-bottom: 6px; 138 | display: block; 139 | width: 100%; 140 | } 141 | 142 | .ld-item-content { 143 | display: flex; 144 | white-space: nowrap; 145 | width: 100%; 146 | justify-content: space-between; 147 | } 148 | 149 | .ld-trust-level-item .ld-name { 150 | flex: 0 1 auto; 151 | overflow: hidden; 152 | text-overflow: ellipsis; 153 | max-width: 60%; 154 | } 155 | 156 | .ld-trust-level-item .ld-value { 157 | font-weight: bold; 158 | flex: 0 0 auto; 159 | text-align: right; 160 | min-width: 70px; 161 | } 162 | 163 | /* 这些样式已移动到主题特定样式中 */ 164 | 165 | .ld-toggle-btn, .ld-refresh-btn, .ld-update-btn, .ld-theme-btn { 166 | background: none; 167 | border: none; 168 | color: white; 169 | cursor: pointer; 170 | font-size: 14px; 171 | margin-left: 5px; 172 | } 173 | 174 | .ld-version { 175 | font-size: 10px; 176 | color: #a0aec0; 177 | margin-left: 5px; 178 | font-weight: normal; 179 | } 180 | 181 | .ld-collapsed { 182 | width: 40px !important; 183 | height: 40px !important; 184 | min-width: 40px !important; 185 | max-width: 40px !important; 186 | border-radius: 8px; 187 | overflow: hidden; 188 | transform: none !important; 189 | } 190 | 191 | .ld-collapsed #ld-trust-level-header { 192 | justify-content: center; 193 | width: 40px !important; 194 | height: 40px !important; 195 | min-width: 40px !important; 196 | max-width: 40px !important; 197 | padding: 0; 198 | display: flex; 199 | align-items: center; 200 | } 201 | 202 | .ld-collapsed #ld-trust-level-header > div { 203 | justify-content: center; 204 | width: 100%; 205 | height: 100%; 206 | } 207 | 208 | .ld-collapsed #ld-trust-level-content { 209 | display: none !important; 210 | } 211 | 212 | .ld-collapsed .ld-header-content > span, 213 | .ld-collapsed .ld-refresh-btn, 214 | .ld-collapsed .ld-update-btn, 215 | .ld-collapsed .ld-theme-btn, 216 | .ld-collapsed .ld-version { 217 | display: none !important; 218 | } 219 | 220 | .ld-collapsed .ld-toggle-btn { 221 | margin: 0; 222 | font-size: 16px; 223 | display: flex; 224 | justify-content: center; 225 | align-items: center; 226 | width: 100%; 227 | height: 100%; 228 | } 229 | 230 | .ld-loading { 231 | text-align: center; 232 | padding: 10px; 233 | } 234 | 235 | /* 深色主题下的变化指示器 */ 236 | .ld-dark-theme .ld-increase { 237 | color: #ffd700; /* 黄色 */ 238 | } 239 | 240 | .ld-dark-theme .ld-decrease { 241 | color: #4299e1; /* 蓝色 */ 242 | } 243 | 244 | /* 亮色主题下的变化指示器 */ 245 | .ld-light-theme .ld-increase { 246 | color: #d69e2e; /* 深黄色 */ 247 | font-weight: bold; 248 | } 249 | 250 | .ld-light-theme .ld-decrease { 251 | color: #2b6cb0; /* 深蓝色 */ 252 | font-weight: bold; 253 | } 254 | 255 | 256 | 257 | 258 | /* 进度条样式 */ 259 | .ld-progress-bar { 260 | height: 3px; 261 | width: 100%; 262 | margin-top: 2px; 263 | margin-bottom: 4px; 264 | border-radius: 1px; 265 | overflow: hidden; 266 | background-color: transparent; 267 | position: relative; 268 | } 269 | 270 | .ld-progress-fill { 271 | height: 100%; 272 | border-radius: 1px; 273 | transition: width 0.3s ease; 274 | position: relative; 275 | } 276 | 277 | /* 正常项目:已完成绿色,未完成红色 */ 278 | .ld-progress-normal .ld-progress-fill { 279 | background-color: #68d391; /* 绿色 - 已完成部分 */ 280 | } 281 | 282 | .ld-progress-normal { 283 | background-color: #fc8181; /* 红色 - 未完成部分 */ 284 | } 285 | 286 | /* 反向项目(被举报帖子、发起举报用户):已完成红色,未完成绿色 */ 287 | .ld-progress-reverse .ld-progress-fill { 288 | background-color: #fc8181; /* 红色 - 已完成部分 */ 289 | } 290 | 291 | .ld-progress-reverse { 292 | background-color: #68d391; /* 绿色 - 未完成部分 */ 293 | } 294 | 295 | /* 深色主题下的进度条颜色调整 */ 296 | .ld-dark-theme .ld-progress-normal .ld-progress-fill { 297 | background-color: #68d391; /* 绿色 */ 298 | } 299 | 300 | .ld-dark-theme .ld-progress-normal { 301 | background-color: #fc8181; /* 红色 */ 302 | } 303 | 304 | .ld-dark-theme .ld-progress-reverse .ld-progress-fill { 305 | background-color: #fc8181; /* 红色 */ 306 | } 307 | 308 | .ld-dark-theme .ld-progress-reverse { 309 | background-color: #68d391; /* 绿色 */ 310 | } 311 | 312 | /* 亮色主题下的进度条颜色调整 */ 313 | .ld-light-theme .ld-progress-normal .ld-progress-fill { 314 | background-color: #276749; /* 深绿色 */ 315 | } 316 | 317 | .ld-light-theme .ld-progress-normal { 318 | background-color: #c53030; /* 深红色 */ 319 | } 320 | 321 | .ld-light-theme .ld-progress-reverse .ld-progress-fill { 322 | background-color: #c53030; /* 深红色 */ 323 | } 324 | 325 | .ld-light-theme .ld-progress-reverse { 326 | background-color: #276749; /* 深绿色 */ 327 | } 328 | 329 | `; 330 | document.head.appendChild(style); 331 | 332 | // 定义存储键 333 | const STORAGE_KEY_POSITION = 'ld_panel_position'; 334 | const STORAGE_KEY_COLLAPSED = 'ld_panel_collapsed'; 335 | const STORAGE_KEY_THEME = 'ld_panel_theme'; 336 | 337 | // 创建面板 338 | const panel = document.createElement('div'); 339 | panel.id = 'ld-trust-level-panel'; 340 | 341 | // 设置默认主题 342 | const currentTheme = GM_getValue(STORAGE_KEY_THEME, 'dark'); 343 | panel.classList.add(currentTheme === 'dark' ? 'ld-dark-theme' : 'ld-light-theme'); 344 | 345 | // 获取脚本版本号 346 | const scriptVersion = GM_info.script.version; 347 | 348 | // 创建面板头部 349 | const header = document.createElement('div'); 350 | header.id = 'ld-trust-level-header'; 351 | header.innerHTML = ` 352 |