您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
onlineusers iii
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.gf.qytechs.cn/scripts/546042/1642849/onlineusers.js
Tabs.OnlineUsers = { name: 'OnlineUsers', tabColor: 'green', refreshTimer: null, autoRefreshInterval: 30000, // 30 seconds onlineMembers: [], allMembers: [], show: function(init) { var t = this; if (init) { t.createInterface(); t.fetchAllianceMembers(); } t.startAutoRefresh(); }, hide: function() { var t = this; t.stopAutoRefresh(); }, createInterface: function() { var t = this; var div = ById('OnlineUsersDiv'); if (!div) return; var html = '<div style="padding: 10px;">' + '<div style="margin-bottom: 15px;">' + '<h3 style="color: #4CAF50; margin: 0 0 10px 0;">Alliance Online Users</h3>' + '<div style="display: flex; gap: 10px; align-items: center;">' + '<button id="refreshOnlineUsers" class="buttonv2 std" style="background: #4CAF50; color: white;">Refresh Now</button>' + '<label style="display: flex; align-items: center; gap: 5px;">' + '<input type="checkbox" id="autoRefreshOnline" checked> Auto-refresh (30s)' + '</label>' + '<span id="onlineUsersStatus" style="color: #666; font-size: 12px;"></span>' + '</div>' + '</div>' + '<div id="onlineUsersContent" style="background: #f9f9f9; border: 1px solid #ddd; border-radius: 5px; padding: 10px;">' + '<div style="text-align: center; color: #666;">Loading alliance members...</div>' + '</div>' + '</div>'; div.innerHTML = html; // Add event listeners ById('refreshOnlineUsers').addEventListener('click', function() { t.fetchOnlineStatus(); }); ById('autoRefreshOnline').addEventListener('change', function() { if (this.checked) { t.startAutoRefresh(); } else { t.stopAutoRefresh(); } }); }, fetchAllianceMembers: function() { var t = this; t.setStatus('Fetching alliance members...'); // Use existing alliance functionality if available if (Tabs.Alliance && Tabs.Alliance.fetchAllianceMemberList) { Tabs.Alliance.fetchAllianceMemberList(true, function() { if (Tabs.Alliance.alliancemembers) { t.allMembers = Tabs.Alliance.alliancemembers; t.fetchOnlineStatus(); } else { t.setStatus('Error: Could not fetch alliance members'); } }); } else { // Fallback: try to get alliance info from seed if (Seed && Seed.alliance && Seed.alliance.members) { t.allMembers = Object.values(Seed.alliance.members); t.fetchOnlineStatus(); } else { t.setStatus('Error: Alliance information not available'); } } }, fetchOnlineStatus: function() { var t = this; if (t.allMembers.length === 0) { t.setStatus('No alliance members found'); return; } t.setStatus('Checking online status...'); // Extract user IDs var userIds = []; for (var i = 0; i < t.allMembers.length; i++) { var member = t.allMembers[i]; var userId = member.userId || member[6] || member.id; if (userId) userIds.push(userId); } if (userIds.length === 0) { t.setStatus('Error: Could not extract user IDs'); return; } // Use the existing getOnline function getOnline(userIds, function(result) { if (result.ok && result.data) { t.processOnlineData(result.data); } else { t.setStatus('Error: Could not fetch online status'); } }); }, processOnlineData: function(onlineData) { var t = this; t.onlineMembers = []; // Process each member for (var i = 0; i < t.allMembers.length; i++) { var member = t.allMembers[i]; var userId = member.userId || member[6] || member.id; var userName = member.displayName || member[0] || member.name; var might = member.might || member[1] || 0; var cities = member.cities || member[3] || 0; var officerType = member.officerType || member[2] || 0; if (userId && onlineData[userId]) { t.onlineMembers.push({ userId: userId, name: userName, might: might, cities: cities, officerType: officerType, isOnline: true }); } } // Sort by might (highest first) t.onlineMembers.sort(function(a, b) { return b.might - a.might; }); t.displayOnlineUsers(); t.setStatus('Last updated: ' + new Date().toLocaleTimeString()); }, displayOnlineUsers: function() { var t = this; var contentDiv = ById('onlineUsersContent'); if (!contentDiv) return; if (t.onlineMembers.length === 0) { contentDiv.innerHTML = '<div style="text-align: center; color: #666; padding: 20px;">No alliance members currently online</div>'; return; } var html = '<div style="margin-bottom: 10px; font-weight: bold; color: #4CAF50;">' + t.onlineMembers.length + ' member' + (t.onlineMembers.length !== 1 ? 's' : '') + ' online' + '</div>' + '<table style="width: 100%; border-collapse: collapse;">' + '<thead>' + '<tr style="background: #e8e8e8; border-bottom: 2px solid #ccc;">' + '<th style="padding: 8px; text-align: left; border-right: 1px solid #ccc;">Name</th>' + '<th style="padding: 8px; text-align: right; border-right: 1px solid #ccc;">Might</th>' + '<th style="padding: 8px; text-align: center; border-right: 1px solid #ccc;">Cities</th>' + '<th style="padding: 8px; text-align: center;">Rank</th>' + '</tr>' + '</thead>' + '<tbody>'; for (var i = 0; i < t.onlineMembers.length; i++) { var member = t.onlineMembers[i]; var rowColor = i % 2 === 0 ? '#ffffff' : '#f5f5f5'; var rankText = t.getOfficerRankText(member.officerType); html += '<tr style="background: ' + rowColor + '; border-bottom: 1px solid #eee;">' + '<td style="padding: 8px; border-right: 1px solid #eee;">' + '<div style="display: flex; align-items: center; gap: 5px;">' + '<div style="width: 8px; height: 8px; background: #4CAF50; border-radius: 50%; flex-shrink: 0;"></div>' + '<span style="font-weight: bold;">' + member.name + '</span>' + '</div>' + '</td>' + '<td style="padding: 8px; text-align: right; border-right: 1px solid #eee;">' + t.formatNumber(member.might) + '</td>' + '<td style="padding: 8px; text-align: center; border-right: 1px solid #eee;">' + member.cities + '</td>' + '<td style="padding: 8px; text-align: center;">' + rankText + '</td>' + '</tr>'; } html += '</tbody></table>'; contentDiv.innerHTML = html; }, getOfficerRankText: function(officerType) { var ranks = { 0: 'Member', 1: 'Officer', 2: 'Leader' }; return ranks[officerType] || 'Member'; }, formatNumber: function(num) { if (num >= 1000000) { return (num / 1000000).toFixed(1) + 'M'; } else if (num >= 1000) { return (num / 1000).toFixed(1) + 'K'; } return num.toString(); }, setStatus: function(message) { var statusDiv = ById('onlineUsersStatus'); if (statusDiv) { statusDiv.textContent = message; } }, startAutoRefresh: function() { var t = this; t.stopAutoRefresh(); var checkbox = ById('autoRefreshOnline'); if (checkbox && checkbox.checked) { t.refreshTimer = setInterval(function() { t.fetchOnlineStatus(); }, t.autoRefreshInterval); } }, stopAutoRefresh: function() { var t = this; if (t.refreshTimer) { clearInterval(t.refreshTimer); t.refreshTimer = null; } } };
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址