rce.js
Version:
A wrapper for Rust Console Edition (RCE) that allows you to use RCON to create integrations.
453 lines (398 loc) • 10.5 kB
text/typescript
import type { WebSocket } from "ws";
import { type PlayerKillType } from "./data/playerKill";
import { QuickChat, QuickChatChannel } from "./data/quickChat";
import SocketManager from "./socket/socketManager";
export interface IOptions {
logger: {
level?: LogLevel;
instance?: ILogger;
file?: string;
};
}
/*
Intents - v4.6.0
*/
export enum RCEIntent {
ServerInfo = "ServerInfo",
PlayerList = "PlayerList",
Frequencies = "Frequencies",
Gibs = "Gibs",
Kits = "Kits",
CustomZones = "CustomZones",
Teams = "Teams",
RoleInfo = "RoleInfo",
}
/*
Servers
*/
interface IServerRCON {
host: string;
port: number;
password: string;
}
export interface IServerOptions {
identifier: string;
rcon: IServerRCON;
state: any[];
reconnection?: {
enabled?: boolean;
interval?: number; // in milliseconds, default 5000
maxAttempts?: number; // -1 for infinite, default -1
};
intents: RCEIntent[];
intentTimers?: {
[key in RCEIntent]?: number; // in milliseconds
};
}
interface IServerIntervals {
serverInfoInterval?: NodeJS.Timeout;
playerListInterval?: NodeJS.Timeout;
frequenciesInterval?: NodeJS.Timeout;
gibsInterval?: NodeJS.Timeout;
kitsInterval?: NodeJS.Timeout;
customZonesInterval?: NodeJS.Timeout;
teamsInterval?: NodeJS.Timeout;
}
export interface IServer {
identifier: string;
socket: WebSocket;
socketManager?: SocketManager;
flags: string[];
intents: RCEIntent[];
intentTimers: {
[key in RCEIntent]?: number;
};
intervals: IServerIntervals;
state: any[];
players?: IPlayer[];
frequencies?: number[];
teams?: ITeam[];
kits?: IServerKit[];
customZones?: IServerZone[];
info?: IRustServerInformation;
}
export interface IRustServerInformation {
Hostname: string;
MaxPlayers: number;
Players: number;
Queued: number;
Joining: number;
EntityCount: number;
GameTime: string;
Uptime: number;
Map: "Procedural Map";
Framerate: number;
Memory: number;
Collections: number;
NetworkIn: number;
NetworkOut: number;
Restarting: boolean;
SaveCreatedTime: string;
}
/*
Events
*/
interface EventPayload {
server: IServer;
}
export interface IReadyEventPayload extends EventPayload {}
export interface IMessageEventPayload extends EventPayload {
message: string;
}
export interface IExecutingCommandEventPayload extends EventPayload {
command: string;
}
export interface IVendingMachineNameEventPayload extends EventPayload {
player: IPlayer;
oldName: string;
newName: string;
}
export interface IQuickChatEventPayload extends EventPayload {
type: QuickChatChannel;
player: IPlayer;
message: QuickChat;
}
export interface IPlayerSuicideEventPayload extends EventPayload {
player: IPlayer;
}
export interface IPlayerRespawnedEventPayload extends EventPayload {
player: IPlayer;
platform: GamePlatform;
}
export interface ICustomZoneCreatedEventPayload extends EventPayload {
zone: string;
}
export interface ICustomZoneRemovedEventPayload extends EventPayload {
zone: string;
}
export interface IPlayerRoleAddEventPayload extends EventPayload {
admin?: IPlayer;
player: IPlayer;
role: string;
}
export interface IPlayerRoleRemoveEventPayload extends EventPayload {
admin?: IPlayer;
player: IPlayer;
role: string;
}
export interface IPlayerBannedEventPayload extends EventPayload {
admin?: IPlayer;
player: IPlayer;
}
export interface IPlayerUnbannedEventPayload extends EventPayload {
admin?: IPlayer;
player: IPlayer;
}
export interface IIitemSpawnEventPayload extends EventPayload {
player: IPlayer;
item: string;
quantity: number;
}
export interface INoteEditEventPayload extends EventPayload {
player: IPlayer;
oldContent: string;
newContent: string;
}
export interface ITeamCreatedEventPayload extends EventPayload {
team: ITeam;
}
export interface ITeamJoinEventPayload extends EventPayload {
team: ITeam;
player: IPlayer;
}
export interface ITeamLeaveEventPayload extends EventPayload {
team: ITeam;
player: IPlayer;
}
export interface ITeamInviteEventPayload extends EventPayload {
team: ITeam;
player: IPlayer;
}
export interface ITeamInviteCancelEventPayload extends EventPayload {
team: ITeam;
player: IPlayer;
}
export interface ITeamPromotedEventPayload extends EventPayload {
team: ITeam;
oldOwner: IPlayer;
newOwner: IPlayer;
}
export interface IKitSpawnEventPayload extends EventPayload {
player: IPlayer;
admin?: IPlayer;
kit: string;
}
export interface IPlayerJoinedEventPayload extends EventPayload {
player: IPlayer;
}
export interface IPlayerLeftEventPayload extends EventPayload {
player: IPlayer;
}
export interface IEventStartEventPayload extends EventPayload {
event:
| "Airdrop"
| "Cargo Ship"
| "Chinook"
| "Patrol Helicopter"
| "Halloween"
| "Christmas"
| "Small Oil Rig"
| "Oil Rig"
| "Bradley APC Debris"
| "Patrol Helicopter Debris";
special: boolean;
}
export interface IPlayerKillEVentPayload extends EventPayload {
victim: IKillPlayer;
killer: IKillPlayer;
}
export interface IPlayerListUpdatedEventPayload extends EventPayload {
players: IPlayer[];
joined: IPlayer[];
left: IPlayer[];
}
export interface IFrequencyGainedEventPayload extends EventPayload {
frequency: number;
coordinates: number[];
range: number;
}
export interface IFrequencyLostEventPayload extends EventPayload {
frequency: number;
}
export interface IServerSavingEventPayload extends EventPayload {
entities: number;
}
export interface IServerInfoUpdateEventPayload extends EventPayload {
info: IRustServerInformation;
}
export interface IErrorEventPayload {
server?: IServer;
error: string;
}
export interface IKillPlayer {
id: string;
name: string;
type: PlayerKillType;
player?: IPlayer;
}
export enum RCEEvent {
Ready = "ready",
Message = "message",
ExecutingCommand = "executingCommand",
VendingMachineName = "vendingMachineName",
QuickChat = "quickChat",
PlayerSuicide = "playerSuicide",
PlayerRespawned = "playerRespawned",
CustomZoneCreated = "customZoneCreated",
CustomZoneRemoved = "customZoneRemoved",
PlayerRoleAdd = "playerRoleAdd",
PlayerRoleRemove = "playerRoleRemove",
PlayerBanned = "playerBanned",
PlayerUnbanned = "playerUnbanned",
ItemSpawn = "itemSpawn",
NoteEdit = "noteEdit",
TeamCreated = "teamCreated",
TeamJoin = "teamJoin",
TeamLeave = "teamLeave",
TeamInvite = "teamInvite",
TeamInviteCancel = "teamInviteCancel",
TeamPromoted = "teamPromoted",
KitSpawn = "kitSpawn",
PlayerJoined = "playerJoined",
PlayerLeft = "playerLeft",
EventStart = "eventStart",
PlayerKill = "playerKill",
PlayerListUpdated = "playerListUpdated",
FrequencyGained = "frequencyGained",
FrequencyLost = "frequencyLost",
ServerSaving = "serverSaving",
Error = "error",
ServerInfoUpdated = "serverInfoUpdate",
}
export interface IPlayer {
ign: string;
ping?: number;
timeConnected?: number;
health?: number;
team?: ITeam | null;
platform?: GamePlatform;
role?: GameRole;
state: any[];
isOnline: boolean;
lastSeen?: Date;
}
export interface ITeam {
id: number;
leader: IPlayer;
members: IPlayer[];
}
export interface IEvent {
[RCEEvent.Ready]: IReadyEventPayload;
[RCEEvent.Message]: IMessageEventPayload;
[RCEEvent.ExecutingCommand]: IExecutingCommandEventPayload;
[RCEEvent.VendingMachineName]: IVendingMachineNameEventPayload;
[RCEEvent.QuickChat]: IQuickChatEventPayload;
[RCEEvent.PlayerSuicide]: IPlayerSuicideEventPayload;
[RCEEvent.PlayerRespawned]: IPlayerRespawnedEventPayload;
[RCEEvent.CustomZoneCreated]: ICustomZoneCreatedEventPayload;
[RCEEvent.CustomZoneRemoved]: ICustomZoneRemovedEventPayload;
[RCEEvent.PlayerRoleAdd]: IPlayerRoleAddEventPayload;
[RCEEvent.PlayerRoleRemove]: IPlayerRoleRemoveEventPayload;
[RCEEvent.PlayerBanned]: IPlayerBannedEventPayload;
[RCEEvent.PlayerUnbanned]: IPlayerUnbannedEventPayload;
[RCEEvent.ItemSpawn]: IIitemSpawnEventPayload;
[RCEEvent.NoteEdit]: INoteEditEventPayload;
[RCEEvent.TeamCreated]: ITeamCreatedEventPayload;
[RCEEvent.TeamJoin]: ITeamJoinEventPayload;
[RCEEvent.TeamLeave]: ITeamLeaveEventPayload;
[RCEEvent.TeamInvite]: ITeamInviteEventPayload;
[RCEEvent.TeamInviteCancel]: ITeamInviteCancelEventPayload;
[RCEEvent.TeamPromoted]: ITeamPromotedEventPayload;
[RCEEvent.KitSpawn]: IKitSpawnEventPayload;
[RCEEvent.PlayerJoined]: IPlayerJoinedEventPayload;
[RCEEvent.PlayerLeft]: IPlayerLeftEventPayload;
[RCEEvent.EventStart]: IEventStartEventPayload;
[RCEEvent.PlayerKill]: IPlayerKillEVentPayload;
[RCEEvent.PlayerListUpdated]: IPlayerListUpdatedEventPayload;
[RCEEvent.FrequencyGained]: IFrequencyGainedEventPayload;
[RCEEvent.FrequencyLost]: IFrequencyLostEventPayload;
[RCEEvent.ServerSaving]: IServerSavingEventPayload;
[RCEEvent.Error]: IErrorEventPayload;
[RCEEvent.ServerInfoUpdated]: IServerInfoUpdateEventPayload;
}
export enum GamePlatform {
Playstation = "PS",
XBOX = "XBL",
}
export enum GameRole {
None = "None",
VIP = "VIP",
Moderator = "Moderator",
Admin = "Admin",
Owner = "Owner",
}
/*
Command Handling
*/
export interface ICommandRequest {
identifier: string;
command: string;
uniqueId?: number;
resolve: (value: string) => void;
reject: (reason?: any) => void;
timeout?: ReturnType<typeof setTimeout>;
}
/*
Logger
*/
export interface ILogger {
error: (message: string) => void;
warn: (message: string) => void;
info: (message: string) => void;
debug: (message: string) => void;
}
export interface ILogType {
prefix: string;
emoji: string;
color: string;
}
export enum LogLevel {
None = 0,
Error = 1,
Warn = 2,
Info = 3,
Debug = 4,
}
/*
4.6.0 - Kit & Zone Caching
*/
interface IServerKitItem {
shortName: string;
quantity: number;
condition: number;
container: "Main" | "Belt" | "Wear";
}
export interface IServerKit {
name: string;
items: IServerKitItem[];
}
interface IServerZoneConfig {
position: [number, number, number];
size: number;
type: "Sphere" | "Box";
playerDamage: boolean;
npcDamage: boolean;
radiationDamage: number;
playerBuildingDamage: boolean;
allowBuilding: boolean;
showArea: boolean;
color: [number, number, number];
showChatMessage: boolean;
enterMessage: string;
leaveMessage: string;
}
export interface IServerZone {
name: string;
enabled: boolean;
config: IServerZoneConfig;
}