UNPKG

rce.js

Version:

A wrapper for Rust Console Edition (RCE) that allows you to use RCON to create integrations.

105 lines (88 loc) 2.97 kB
import { RegularExpressions } from "./regularExpressions"; import { ITeam, IPlayer } from "../types"; /** * Parses the team info response from relationshipmanager.teaminfoall command * @param teamInfoResponse The raw response from the team info command * @param players List of currently connected players to filter out disconnected ones * @returns Object containing team list with player team references set */ export function parseTeamInfo( teamInfoResponse: string, players: IPlayer[] = [] ): { teams: ITeam[]; } { const teams: ITeam[] = []; if ( !teamInfoResponse || RegularExpressions.TeamInfoNoTeams.test(teamInfoResponse) ) { return { teams }; } // Create a map of player names to Player objects for quick lookup const playerMap = new Map<string, IPlayer>(); players.forEach((player) => { playerMap.set(player.ign, player); }); // Split the response into lines for processing const lines = teamInfoResponse.split("\n").filter((line) => line.trim()); let currentTeamId: number | null = null; let currentTeamMembers: IPlayer[] = []; let currentTeamLeader: IPlayer | null = null; for (const line of lines) { // Check if this line is a team header const teamHeaderMatch = line.match(RegularExpressions.TeamInfoTeamHeader); if (teamHeaderMatch) { // Save the previous team if we have one if (currentTeamId !== null && currentTeamLeader !== null) { if (currentTeamMembers.length > 0) { const team: ITeam = { id: currentTeamId, leader: currentTeamLeader, members: currentTeamMembers, }; // Set team reference on all team members currentTeamMembers.forEach((player) => { player.team = team; }); teams.push(team); } } // Start new team currentTeamId = parseInt(teamHeaderMatch[1]); currentTeamMembers = []; currentTeamLeader = null; continue; } // Check if this line is a player entry const playerMatch = line.match(RegularExpressions.TeamInfoPlayer); if (playerMatch && currentTeamId !== null) { const playerName = playerMatch[1].trim(); const player = playerMap.get(playerName); // Only process connected players if (player) { currentTeamMembers.push(player); // Check if this player is the leader if (line.includes("(LEADER)")) { currentTeamLeader = player; } } } } // Save the last team if (currentTeamId !== null && currentTeamLeader !== null) { if (currentTeamMembers.length > 0) { const team: ITeam = { id: currentTeamId, leader: currentTeamLeader, members: currentTeamMembers, }; // Set team reference on all team members currentTeamMembers.forEach((player) => { player.team = team; }); teams.push(team); } } return { teams }; }