rce.js
Version:
A wrapper for Rust Console Edition (RCE) that allows you to use RCON to create integrations.
600 lines (540 loc) • 15.7 kB
text/typescript
import { RCEEvent, type IServer, GamePlatform } from "../types";
import type RCEManager from "../manager";
import { RegularExpressions } from "../data/regularExpressions";
import { QuickChat, QuickChatChannel } from "../data/quickChat";
import { EVENTS } from "../data/events";
import { getKill, PlayerKillType } from "../data/playerKill";
export default class ResponseHandler {
public static handle(manager: RCEManager, server: IServer, message: string) {
// Emit the message event
manager.emit(RCEEvent.Message, {
server,
message,
});
// Event: Vending Machine Name
const vendingMachineNameMatch = message.match(
RegularExpressions.VendingMachineName
);
if (vendingMachineNameMatch) {
const player = manager.upsertPlayer(
server.identifier,
vendingMachineNameMatch[1],
undefined,
false
);
manager.emit(RCEEvent.VendingMachineName, {
server,
player,
oldName: vendingMachineNameMatch[2],
newName: vendingMachineNameMatch[3],
});
}
// Event: Quick Chat
const quickChatMatch = message.match(RegularExpressions.QuickChat);
if (quickChatMatch) {
const player = manager.upsertPlayer(
server.identifier,
quickChatMatch[3],
undefined,
true
);
manager.emit(RCEEvent.QuickChat, {
server,
type: quickChatMatch[2] as QuickChatChannel,
player,
message: quickChatMatch[4] as QuickChat,
});
}
// Event: Player Suicide
if (message.includes("was suicide by Suicide")) {
const ign = message.split(" was suicide by Suicide")[0];
const player = manager.upsertPlayer(
server.identifier,
ign,
undefined,
true
);
manager.emit(RCEEvent.PlayerSuicide, {
server,
player,
});
}
// Event: Player Respawned
if (message.includes("has entered the game")) {
const ign = message.split(" [")[0];
const platform: GamePlatform = message.includes("[SCARLETT]")
? GamePlatform.XBOX
: GamePlatform.Playstation;
// Create or get player and update platform
const player = manager.upsertPlayer(
server.identifier,
ign,
{
platform,
},
true
);
manager.emit(RCEEvent.PlayerRespawned, {
server,
player,
platform,
});
}
// Event: Custom Zone Created
const customZoneCreatedMatch = message.match(
RegularExpressions.CustomZoneCreated
);
if (customZoneCreatedMatch) {
manager.emit(RCEEvent.CustomZoneCreated, {
server,
zone: customZoneCreatedMatch[1],
});
}
// Event: Custom Zone Removed
const customZoneRemovedMatch = message.match(
RegularExpressions.CustomZoneRemoved
);
if (customZoneRemovedMatch) {
manager.emit(RCEEvent.CustomZoneRemoved, {
server,
zone: customZoneRemovedMatch[1],
});
}
// Event: Player Role Add / Player Banned
if (message.includes("Added")) {
const playerRoleAddMatch = message.match(
RegularExpressions.PlayerRoleAdd
);
if (playerRoleAddMatch) {
const admin = manager.upsertPlayer(
server.identifier,
playerRoleAddMatch[1],
undefined,
false
);
const player = manager.upsertPlayer(
server.identifier,
playerRoleAddMatch[2],
undefined,
false
);
manager.emit(RCEEvent.PlayerRoleAdd, {
server,
admin: playerRoleAddMatch[1] === "SERVER" ? undefined : admin,
player,
role: playerRoleAddMatch[3],
});
}
const playerBannedMatch = message.match(RegularExpressions.PlayerBanned);
if (playerBannedMatch) {
const admin = manager.upsertPlayer(
server.identifier,
playerBannedMatch[1],
undefined,
false
);
const player = manager.upsertPlayer(
server.identifier,
playerBannedMatch[2],
undefined,
false
);
manager.emit(RCEEvent.PlayerBanned, {
server,
admin: playerBannedMatch[1] === "SERVER" ? undefined : admin,
player,
});
}
}
// Event: Player Role Remove / Player Unbanned
if (message.includes("Removed")) {
const playerRoleRemoveMatch = message.match(
RegularExpressions.PlayerRoleRemove
);
if (playerRoleRemoveMatch) {
const admin = manager.upsertPlayer(
server.identifier,
playerRoleRemoveMatch[1],
undefined,
false
);
const player = manager.upsertPlayer(
server.identifier,
playerRoleRemoveMatch[2],
undefined,
false
);
manager.emit(RCEEvent.PlayerRoleRemove, {
server,
admin: playerRoleRemoveMatch[1] === "SERVER" ? undefined : admin,
player,
role: playerRoleRemoveMatch[3],
});
}
const playerUnbannedMatch = message.match(
RegularExpressions.PlayerUnbanned
);
if (playerUnbannedMatch) {
const admin = manager.upsertPlayer(
server.identifier,
playerUnbannedMatch[1],
undefined,
false
);
const player = manager.upsertPlayer(
server.identifier,
playerUnbannedMatch[2],
undefined,
false
);
manager.emit(RCEEvent.PlayerUnbanned, {
server,
admin: playerUnbannedMatch[1] === "SERVER" ? undefined : admin,
player,
});
}
}
// Event: Item Spawn
const itemSpawnMatch = message.match(RegularExpressions.ItemSpawn);
if (itemSpawnMatch) {
const player = manager.upsertPlayer(
server.identifier,
itemSpawnMatch[1],
undefined,
true
);
manager.emit(RCEEvent.ItemSpawn, {
server,
player,
item: itemSpawnMatch[3],
quantity: parseInt(itemSpawnMatch[2]),
});
}
// Event: Note Edit
const noteEditMatch = message.match(RegularExpressions.NoteEdit);
if (noteEditMatch) {
const oldContent = noteEditMatch[2].trim().split("\\n")[0];
const newContent = noteEditMatch[3].trim().split("\\n")[0];
if (newContent.length > 0 && newContent !== oldContent) {
const player = manager.upsertPlayer(
server.identifier,
noteEditMatch[1],
undefined,
true
);
manager.emit(RCEEvent.NoteEdit, {
server,
player,
oldContent,
newContent,
});
}
}
// Event: Team Create
const teamCreateMatch = message.match(RegularExpressions.TeamCreate);
if (teamCreateMatch) {
const teamId = parseInt(teamCreateMatch[2]);
const owner = teamCreateMatch[1];
// Create or get player and add team to teams list
const serverData = manager.getServer(server.identifier);
let leaderPlayer;
if (serverData) {
const team = {
id: teamId,
leader: null,
members: [],
};
leaderPlayer = manager.upsertPlayer(
server.identifier,
owner,
{
team,
},
true
);
team.leader = leaderPlayer;
team.members = [leaderPlayer];
serverData.teams.push(team);
manager.updateServer(serverData);
} else {
leaderPlayer = manager.upsertPlayer(
server.identifier,
owner,
undefined,
true
);
}
manager.emit(RCEEvent.TeamCreated, {
server,
team: serverData?.teams.find((t) => t.id === teamId) || {
id: teamId,
leader: leaderPlayer,
members: [leaderPlayer],
},
});
}
// Event: Team Join
const teamJoinMatch = message.match(RegularExpressions.TeamJoin);
if (teamJoinMatch) {
const teamId = parseInt(teamJoinMatch[3]);
const ign = teamJoinMatch[1];
const serverData = manager.getServer(server.identifier);
let joiningPlayer;
if (serverData) {
const team = serverData.teams.find((t) => t.id === teamId);
if (team && !team.members.some((member) => member.ign === ign)) {
joiningPlayer = manager.upsertPlayer(
server.identifier,
ign,
{
team,
},
true
);
team.members.push(joiningPlayer);
manager.updateServer(serverData);
} else {
joiningPlayer = manager.upsertPlayer(
server.identifier,
ign,
undefined,
true
);
}
} else {
joiningPlayer = manager.upsertPlayer(
server.identifier,
ign,
undefined,
true
);
}
const team = serverData?.teams.find((t) => t.id === teamId);
manager.emit(RCEEvent.TeamJoin, {
server,
team: team || {
id: teamId,
leader: joiningPlayer,
members: [joiningPlayer],
},
player: joiningPlayer,
});
}
// Event: Team Leave
const teamLeaveMatch = message.match(RegularExpressions.TeamLeave);
if (teamLeaveMatch) {
const ign = teamLeaveMatch[1];
const teamId = parseInt(teamLeaveMatch[3]);
const serverData = manager.getServer(server.identifier);
if (serverData) {
const team = serverData.teams.find((t) => t.id === teamId);
if (team) {
team.members = team.members.filter((member) => member.ign !== ign);
manager.upsertPlayer(server.identifier, ign, { team: null }, true);
if (team.members.length === 0) {
serverData.teams = serverData.teams.filter((t) => t.id !== teamId);
}
manager.updateServer(serverData);
}
}
const leavingPlayer = manager.upsertPlayer(
server.identifier,
ign,
{
team: null,
},
true
);
const team = serverData?.teams.find((t) => t.id === teamId);
manager.emit(RCEEvent.TeamLeave, {
server,
team: team || {
id: teamId,
leader: leavingPlayer,
members: [],
},
player: leavingPlayer,
});
}
// Event: Team Invite
const teamInviteMatch = message.match(RegularExpressions.TeamInvite);
if (teamInviteMatch) {
const teamId = parseInt(teamInviteMatch[3]);
const player = manager.upsertPlayer(
server.identifier,
teamInviteMatch[2],
undefined,
true
);
const serverData = manager.getServer(server.identifier);
const team = serverData?.teams.find((t) => t.id === teamId);
manager.emit(RCEEvent.TeamInvite, {
server,
team: team || {
id: teamId,
leader: player,
members: [],
},
player,
});
}
// Event: Team Invite Cancel
const teamInviteCancelMatch = message.match(
RegularExpressions.TeamInviteCancel
);
if (teamInviteCancelMatch) {
const teamId = parseInt(teamInviteMatch[3]);
const player = manager.upsertPlayer(
server.identifier,
teamInviteCancelMatch[1],
undefined,
false
);
const serverData = manager.getServer(server.identifier);
const team = serverData?.teams.find((t) => t.id === teamId);
manager.emit(RCEEvent.TeamInviteCancel, {
server,
team: team || {
id: teamId,
leader: player,
members: [],
},
player,
});
}
// Event: Team Promoted
const teamPromotedMatch = message.match(RegularExpressions.TeamPromoted);
if (teamPromotedMatch) {
const teamId = parseInt(teamPromotedMatch[3]);
const oldOwner = teamPromotedMatch[1];
const newOwner = teamPromotedMatch[2];
const serverData = manager.getServer(server.identifier);
if (serverData) {
const team = serverData.teams.find((t) => t.id === teamId);
if (team) {
team.leader = manager.upsertPlayer(
server.identifier,
newOwner,
{
team,
},
false
);
manager.updateServer(serverData);
}
}
const oldOwnerPlayer = manager.upsertPlayer(
server.identifier,
oldOwner,
undefined,
true
);
const newOwnerPlayer = manager.upsertPlayer(
server.identifier,
newOwner,
undefined,
false
);
const team = serverData?.teams.find((t) => t.id === teamId);
manager.emit(RCEEvent.TeamPromoted, {
server,
team: team || {
id: teamId,
leader: newOwnerPlayer,
members: [],
},
oldOwner: oldOwnerPlayer,
newOwner: newOwnerPlayer,
});
}
// Event: Kit Spawn
const kitSpawnMatch = message.match(RegularExpressions.KitSpawn);
if (kitSpawnMatch) {
const player = manager.upsertPlayer(
server.identifier,
kitSpawnMatch[1],
undefined,
true
);
manager.emit(RCEEvent.KitSpawn, {
server,
admin: undefined,
player,
kit: kitSpawnMatch[2],
});
}
// Event: Kit Give
const kitGiveMatch = message.match(RegularExpressions.KitGive);
if (kitGiveMatch) {
const player = manager.upsertPlayer(
server.identifier,
kitGiveMatch[2],
undefined,
true
);
const admin = manager.upsertPlayer(
server.identifier,
kitGiveMatch[1],
undefined,
false
);
manager.emit(RCEEvent.KitSpawn, {
server,
admin,
player,
kit: kitGiveMatch[3],
});
}
// Event: Event Start
if (message.startsWith("[EVENT")) {
for (const [key, options] of Object.entries(EVENTS)) {
if (message.includes(key)) {
manager.emit(RCEEvent.EventStart, {
server,
event: options.name as any,
special: options.special,
});
}
}
}
// Event: Player Kill
if (message.includes(" was killed by ")) {
const [victim, killer] = message
.split(" was killed by ")
.map((str) => str.trim());
const victimData = getKill(victim);
const killerData = getKill(killer);
if (victimData.type === PlayerKillType.Player) {
victimData.player = manager.upsertPlayer(
server.identifier,
victimData.name,
undefined,
false
);
}
if (killerData.type === PlayerKillType.Player) {
killerData.player = manager.upsertPlayer(
server.identifier,
killerData.name,
undefined,
true
);
}
manager.emit(RCEEvent.PlayerKill, {
server,
victim: victimData,
killer: killerData,
});
}
// Event: Server Saving
if (message.startsWith("[ SAVE ]")) {
const serverSavingMatch = message.match(RegularExpressions.ServerSaving);
if (serverSavingMatch) {
manager.emit(RCEEvent.ServerSaving, {
server,
entities: parseInt(serverSavingMatch[1]),
});
}
}
}
}