onlineusers iii
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/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;
}
}
};