onlineusers

onlineusers iii

当前为 2025-08-16 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @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或关注我们的公众号极客氢云获取最新地址