koishi-plugin-royale
Version:
114 lines (107 loc) • 4.37 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.playerinfo = playerinfo;
const axios_1 = __importDefault(require("axios"));
const response_1 = require("../../utils/response");
const API_URL = "https://api.clashroyale.com/v1/players/%23";
async function playerinfo(tag, apiKey) {
if (!tag || tag.trim() === "") {
return (0, response_1.formatResponse)((0, response_1.failure)("参数不足", "请输入玩家tag"));
}
if (!apiKey || apiKey.trim() === "") {
return (0, response_1.formatResponse)((0, response_1.failure)("配置错误", "未设置API密钥,请在插件配置中设置 Clash Royale API密钥 (可从 https://developer.clashroyale.com 申请)"));
}
try {
tag = tag.trim();
if (tag.startsWith("#")) {
tag = tag.substring(1);
}
const response = await axios_1.default.get(`${API_URL}${tag}`, {
headers: {
Authorization: `Bearer ${apiKey}`,
Accept: "application/json",
},
});
const player = response.data;
// 格式化并返回玩家信息
const playerData = formatPlayerInfo(player);
return (0, response_1.formatResponse)((0, response_1.success)(`玩家 #${tag} 的信息`, playerData));
}
catch (error) {
console.error("获取玩家信息失败:", error);
if (axios_1.default.isAxiosError(error) && error.response) {
// API错误处理
if (error.response.status === 404) {
return (0, response_1.formatResponse)((0, response_1.failure)("查询失败", `找不到玩家,请检查tag是否正确: #${tag}`));
}
else if (error.response.status === 403) {
return (0, response_1.formatResponse)((0, response_1.failure)("查询失败", "访问API失败,请检查API密钥是否正确或是否已授权"));
}
else {
return (0, response_1.formatResponse)((0, response_1.failure)("查询失败", `错误码: ${error.response.status}, 请稍后再试`));
}
}
return (0, response_1.formatResponse)((0, response_1.failure)("查询失败", "查询玩家信息时发生未知错误,请稍后再试"));
}
}
/**
* 计算胜率百分比
* @param wins 胜利场次
* @param losses 失败场次
* @returns 胜率百分比字符串
*/
function calculateWinRate(wins, losses) {
const totalGames = wins + losses;
if (totalGames === 0)
return "无记录";
const winRate = (wins / totalGames) * 100;
return `${winRate.toFixed(2)}%`;
}
/**
* 计算三冠率百分比
* @param threeCrownWins 三冠胜利场次
* @param wins 胜利总场次
* @returns 三冠率百分比字符串
*/
function calculateThreeCrownRate(threeCrownWins, wins) {
if (wins === 0)
return "0.00%";
const threeCrownRate = (threeCrownWins / wins) * 100;
return `${threeCrownRate.toFixed(2)}%`;
}
function formatPlayerInfo(player) {
// 计算badges总数
const badgesCount = player.badges?.length || 0;
return `
【玩家信息】
名称: ${player.name}
标签: ${player.tag}
奖杯: ${player.trophies}
最高奖杯: ${player.bestTrophies}
等级: ${player.expLevel}
竞技场: ${player.arena?.name || "未知"}
${player.clan ? `部落: ${player.clan.name} (${player.clan.tag})` : "未加入部落"}
${player.role ? `部落角色: ${player.role}` : ""}
【战绩统计】
胜利场次: ${player.wins || 0}
失败场次: ${player.losses || 0}
三冠胜利: ${player.threeCrownWins || 0}
胜率: ${calculateWinRate(player.wins || 0, player.losses || 0)}
三冠率: ${calculateThreeCrownRate(player.threeCrownWins || 0, player.wins || 0)}
【挑战赛】
挑战赛获得卡牌: ${player.challengeCardsWon || 0}
挑战赛最高胜场: ${player.challengeMaxWins || 0}
【锦标赛】
锦标赛获得卡牌: ${player.tournamentCardsWon || 0}
锦标赛对战次数: ${player.tournamentBattleCount || 0}
【部落互动】
捐献次数: ${player.donations || 0}
接收捐献: ${player.donationsReceived || 0}
总捐献数: ${player.totalDonations || 0}
【成就徽章】
徽章总数: ${badgesCount}
`.trim();
}