197 lines
6.6 KiB
JavaScript
197 lines
6.6 KiB
JavaScript
(function () {
|
|
'use strict';
|
|
|
|
var METRICS = [
|
|
{ key: 'diamond_earnings', format: 'count' },
|
|
{ key: 'diamond_exchanged', format: 'count' },
|
|
{ key: 'gift_senders', format: 'count' },
|
|
{ key: 'online_duration_ms', format: 'duration' },
|
|
{ key: 'valid_mic_duration_ms', format: 'duration' },
|
|
{ key: 'valid_mic_days', format: 'count' },
|
|
{ key: 'private_message_senders', format: 'count' },
|
|
{ key: 'new_followers', format: 'count' },
|
|
];
|
|
|
|
function params() {
|
|
return new URLSearchParams(window.location.search || '');
|
|
}
|
|
|
|
function settled(promise) {
|
|
return Promise.resolve(promise).then(
|
|
function (value) {
|
|
return { ok: true, value: value };
|
|
},
|
|
function (error) {
|
|
return { ok: false, error: error };
|
|
}
|
|
);
|
|
}
|
|
|
|
function firstBalance(payload, assetType) {
|
|
var items = Array.isArray(payload)
|
|
? payload
|
|
: (payload && (payload.balances || payload.items)) || [];
|
|
for (var i = 0; i < items.length; i += 1) {
|
|
var item = items[i] || {};
|
|
if (
|
|
String(
|
|
item.asset_type || item.assetType || ''
|
|
).toUpperCase() === assetType
|
|
) {
|
|
return item;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function normalizeProfile(payload) {
|
|
var profile =
|
|
(payload && (payload.profile || payload.user)) || payload || {};
|
|
return {
|
|
userId: String(profile.user_id || profile.userId || ''),
|
|
displayUserId: String(
|
|
profile.display_user_id ||
|
|
profile.displayUserId ||
|
|
profile.user_id ||
|
|
''
|
|
),
|
|
name: String(profile.username || profile.name || ''),
|
|
avatar: String(profile.avatar || profile.avatar_url || ''),
|
|
contact: String(profile.contact_info || profile.contactInfo || ''),
|
|
};
|
|
}
|
|
|
|
function normalizeAgency(payload) {
|
|
var agency =
|
|
payload && Object.prototype.hasOwnProperty.call(payload, 'agency')
|
|
? payload.agency
|
|
: payload;
|
|
if (!agency) return null;
|
|
return {
|
|
id: String(agency.agency_id || agency.agencyId || ''),
|
|
shortId: String(
|
|
agency.short_id ||
|
|
agency.shortId ||
|
|
agency.agency_id ||
|
|
agency.agencyId ||
|
|
''
|
|
),
|
|
name: String(agency.name || ''),
|
|
joinedAtMS: Number(agency.joined_at_ms || agency.joinedAtMs || 0),
|
|
};
|
|
}
|
|
|
|
function normalizeStats(payload, range) {
|
|
var source =
|
|
(payload && (payload.metrics || payload.stats)) || payload || {};
|
|
var metrics = {};
|
|
METRICS.forEach(function (definition) {
|
|
var value = source[definition.key];
|
|
metrics[definition.key] =
|
|
value === undefined || value === null ? null : Number(value);
|
|
});
|
|
return {
|
|
range: (payload && payload.range) || range,
|
|
metrics: metrics,
|
|
};
|
|
}
|
|
|
|
function mockData(range) {
|
|
return {
|
|
profile: {
|
|
userId: '163028',
|
|
displayUserId: '163028',
|
|
name: 'dada',
|
|
avatar: '',
|
|
contact: '1586668885',
|
|
},
|
|
agency: {
|
|
id: '163030',
|
|
shortId: '163030',
|
|
name: 'Fami Stars',
|
|
joinedAtMS: new Date(2025, 5, 12, 16, 0).getTime(),
|
|
},
|
|
pointBalance: 5152051511212,
|
|
stats: normalizeStats(
|
|
{
|
|
diamond_earnings: 50000,
|
|
diamond_exchanged: 50000,
|
|
gift_senders: 50000,
|
|
online_duration_ms: 53 * 60 * 1000,
|
|
valid_mic_duration_ms: 53 * 60 * 1000,
|
|
valid_mic_days: 12,
|
|
private_message_senders: 50000,
|
|
new_followers: 50000,
|
|
},
|
|
range
|
|
),
|
|
errors: {},
|
|
};
|
|
}
|
|
|
|
function load(range) {
|
|
if (params().get('mock') === '1') {
|
|
return Promise.resolve(mockData(range));
|
|
}
|
|
var api = window.HyAppAPI || {};
|
|
if (!api.user || !api.hostCenter || !api.wallet) {
|
|
return Promise.reject(new Error('guild_api_unavailable'));
|
|
}
|
|
|
|
return Promise.all([
|
|
settled(api.user.me()),
|
|
settled(api.hostCenter.agency()),
|
|
settled(api.wallet.balances(['POINT'])),
|
|
settled(
|
|
api.hostCenter.stats({
|
|
start_date: range.startDate,
|
|
end_date: range.endDate,
|
|
})
|
|
),
|
|
]).then(function (results) {
|
|
// 资料是页面身份校验的最低要求;其余读模型可以分别降级,不能因统计服务晚发布让联系方式和余额也不可见。
|
|
if (!results[0].ok) throw results[0].error;
|
|
var errors = {};
|
|
if (!results[1].ok) errors.agency = results[1].error;
|
|
if (!results[2].ok) errors.balance = results[2].error;
|
|
if (!results[3].ok) errors.stats = results[3].error;
|
|
var point = results[2].ok
|
|
? firstBalance(results[2].value, 'POINT')
|
|
: null;
|
|
return {
|
|
profile: normalizeProfile(results[0].value),
|
|
agency: results[1].ok
|
|
? normalizeAgency(results[1].value)
|
|
: null,
|
|
pointBalance: point
|
|
? Number(
|
|
point.available_amount || point.availableAmount || 0
|
|
)
|
|
: null,
|
|
stats: results[3].ok
|
|
? normalizeStats(results[3].value, range)
|
|
: normalizeStats({}, range),
|
|
errors: errors,
|
|
};
|
|
});
|
|
}
|
|
|
|
function saveContact(value) {
|
|
if (params().get('mock') === '1') {
|
|
return Promise.resolve({ contact_info: value });
|
|
}
|
|
var api = window.HyAppAPI || {};
|
|
if (!api.user || !api.user.updateContact) {
|
|
return Promise.reject(new Error('guild_api_unavailable'));
|
|
}
|
|
return api.user.updateContact({ contact_info: value });
|
|
}
|
|
|
|
window.HyGuild = window.HyGuild || {};
|
|
window.HyGuild.hostCenter = {
|
|
metrics: Object.freeze(METRICS.slice()),
|
|
load: load,
|
|
saveContact: saveContact,
|
|
};
|
|
})();
|