MediaWiki:Citizen.js:修订间差异
MediaWiki界面页面
更多操作
小无编辑摘要 |
售票亭统计JS:自动计算车票总数与最近更新日期 标签:已被回退 |
||
| 第109行: | 第109行: | ||
mw.hook('wikipage.content').add(start); | mw.hook('wikipage.content').add(start); | ||
})(); | })(); | ||
/* === 售票亭统计 === */ | |||
$(function() { | |||
if (mw.config.get('wgPageName') !== '售票亭') return; | |||
var $stats = $('#ticket-stats'); | |||
if (!$stats.length) return; | |||
var totalPassed = 0, totalFailed = 0; | |||
var latestDate = ''; | |||
// Parse all date blocks | |||
$('.mw-parser-output').find('h3, h4').each(function() { | |||
var text = $(this).text().trim(); | |||
var dateMatch = text.match(/(\d+月\d+日)\s*发车/); | |||
if (!dateMatch) return; | |||
if (!latestDate) latestDate = dateMatch[1]; | |||
var $table = $(this).nextAll('table').first(); | |||
if (!$table.length) return; | |||
var $passedRows = $table.find('td:contains("已售出车票")').closest('tr').nextAll('tr').first().find('td'); | |||
var $failedRows = $table.find('td:contains("未能登车")').closest('tr').nextAll('tr').first().find('td'); | |||
// Count passed - each "* Name [等级]" line | |||
var passedText = $passedRows.text(); | |||
var passedMatches = passedText.match(/\S+\s*\[.+?\]/g); | |||
if (passedMatches) totalPassed += passedMatches.length; | |||
else { | |||
// Count bare names (3月 data without ratings) | |||
var bareMatches = passedText.match(/\S+/g); | |||
if (bareMatches) totalPassed += bareMatches.length; | |||
} | |||
// Count failed | |||
var failedText = $failedRows.text(); | |||
var failedMatches = failedText.match(/—\s*未能登车/g); | |||
if (failedMatches) totalFailed += failedMatches.length; | |||
}); | |||
$stats.html( | |||
'🎫 已发放车票 <strong>' + totalPassed + '</strong> 张 | ' + | |||
'✗ 未能登车 <strong>' + totalFailed + '</strong> 人 | ' + | |||
'📅 最近更新 <strong>' + latestDate + '</strong>' | |||
); | |||
}); | |||
2026年5月14日 (四) 21:11的版本
/* 服务器状态查询 - 柠檬树服务器 */
console.log('[LTS] 状态查询脚本已加载');
(function() {
var STARTED = false;
var servers = [
{ id: 'lts-status-platform', address: 'platform.lts.ink', title: '月台', subtitle: '重度机械症 · 1服 · 离线正版都可进' },
{ id: 'lts-status-journey', address: 'journey.lts.ink', title: '启程', subtitle: '重度机械症 · 2服 · 已开启正版验证' },
{ id: 'lts-status-promised', address: 'promised.lts.ink', title: '应许', subtitle: '创造/体验服 · 已开启正版验证' },
{ id: 'lts-status-voyage', address: '45.125.45.195', title: '远行', subtitle: '你好!新蒸程·远行服·已开启正版验证', port: '25565' }
];
var API = 'https://wiki.suanlemon.cc/api/server-status/';
var allData = {};
var timer = null;
function buildCard(server, data) {
var color = data.online ? '#3a971e' : '#bf3c2c';
var statusText = data.online ? '在线' : '离线';
var html = '<div style="padding:6px 0;border-bottom:1px solid #eee;display:flex;align-items:center;gap:8px;flex-wrap:wrap;">';
html += '<b>' + server.title + '</b>';
html += '<span style="font-size:0.8em;color:#888;">' + server.subtitle + '</span>';
html += '<span style="margin-left:auto;font-weight:bold;color:' + color + ';font-size:0.85em;">' + statusText + '</span>';
html += '</div>';
if (data.online && data.players) {
html += '<div style="padding:4px 0 0;display:flex;align-items:center;gap:12px;flex-wrap:wrap;">';
html += '<span style="font-size:0.85em;">' + data.players.online + ' / ' + data.players.max + ' 人</span>';
html += '<span style="font-size:0.8em;color:#888;">' + (data.latency || '?') + 'ms</span>';
if (data.version) html += '<span style="font-size:0.8em;color:#888;">' + data.version + '</span>';
html += '</div>';
if (data.players.list && data.players.list.length > 0) {
html += '<div style="margin-top:4px;display:flex;flex-wrap:wrap;gap:4px;align-items:center;">';
data.players.list.forEach(function(name) {
html += '<span style="font-size:0.75em;background:#f0f0f0;padding:1px 5px;display:inline-flex;align-items:center;gap:2px;">';
html += '<img src="https://mineskin.eu/helm/' + name + '/24" width="14" height="14" style="image-rendering:pixelated;" onerror="this.style.display=\'none\'">';
html += name;
html += '</span>';
});
html += '</div>';
}
}
return html;
}
function updateSummary() {
var el = document.getElementById('lts-status-summary');
if (!el) return;
var onlineCount = 0, totalPlayers = 0;
servers.forEach(function(s) {
var d = allData[s.id];
if (d && d.online) {
onlineCount++;
if (d.players) totalPlayers += d.players.online || 0;
}
});
el.innerHTML = '<div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;">' +
'<span style="font-size:1.1em;font-weight:bold;color:#3a971e;">' + onlineCount + ' / ' + servers.length + ' 台在线</span>' +
'<span style="font-size:0.95em;">共 ' + totalPlayers + ' 人在线</span>' +
'<span style="margin-left:auto;font-size:0.8em;"><a href="/index.php/服务器信息">查看详情</a></span>' +
'</div>';
}
function doFetch() {
var firstEl = document.getElementById('lts-status-platform');
if (!firstEl) return;
servers.forEach(function(server) {
var el = document.getElementById(server.id);
if (!el) return;
var addr = server.port ? server.address + ':' + server.port : server.address;
fetch(API + addr)
.then(function(r) { return r.json(); })
.then(function(data) {
allData[server.id] = data;
el.innerHTML = buildCard(server, data);
updateSummary();
})
.catch(function() {
allData[server.id] = { online: false };
el.innerHTML = '<div style="color:#bf3c2c;padding:4px 0;">查询失败</div>';
updateSummary();
});
});
}
function start() {
if (STARTED) return;
var firstEl = document.getElementById('lts-status-platform');
if (!firstEl) return;
STARTED = true;
console.log('[LTS] 找到容器,开始查询');
doFetch();
timer = setInterval(doFetch, 15000);
}
if (document.readyState === 'complete' || document.readyState === 'interactive') {
start();
} else {
document.addEventListener('DOMContentLoaded', start);
}
mw.hook('wikipage.content').add(start);
})();
/* === 售票亭统计 === */
$(function() {
if (mw.config.get('wgPageName') !== '售票亭') return;
var $stats = $('#ticket-stats');
if (!$stats.length) return;
var totalPassed = 0, totalFailed = 0;
var latestDate = '';
// Parse all date blocks
$('.mw-parser-output').find('h3, h4').each(function() {
var text = $(this).text().trim();
var dateMatch = text.match(/(\d+月\d+日)\s*发车/);
if (!dateMatch) return;
if (!latestDate) latestDate = dateMatch[1];
var $table = $(this).nextAll('table').first();
if (!$table.length) return;
var $passedRows = $table.find('td:contains("已售出车票")').closest('tr').nextAll('tr').first().find('td');
var $failedRows = $table.find('td:contains("未能登车")').closest('tr').nextAll('tr').first().find('td');
// Count passed - each "* Name [等级]" line
var passedText = $passedRows.text();
var passedMatches = passedText.match(/\S+\s*\[.+?\]/g);
if (passedMatches) totalPassed += passedMatches.length;
else {
// Count bare names (3月 data without ratings)
var bareMatches = passedText.match(/\S+/g);
if (bareMatches) totalPassed += bareMatches.length;
}
// Count failed
var failedText = $failedRows.text();
var failedMatches = failedText.match(/—\s*未能登车/g);
if (failedMatches) totalFailed += failedMatches.length;
});
$stats.html(
'🎫 已发放车票 <strong>' + totalPassed + '</strong> 张 | ' +
'✗ 未能登车 <strong>' + totalFailed + '</strong> 人 | ' +
'📅 最近更新 <strong>' + latestDate + '</strong>'
);
});