2023-03-03 16:23:46 +01:00
|
|
|
import { inject, injectable } from "tsyringe";
|
|
|
|
|
|
|
|
import { HttpServerHelper } from "../helpers/HttpServerHelper";
|
2023-08-10 15:29:09 +02:00
|
|
|
import { ProfileHelper } from "../helpers/ProfileHelper";
|
|
|
|
import { PreAkiModLoader } from "../loaders/PreAkiModLoader";
|
2023-03-03 16:23:46 +01:00
|
|
|
import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData";
|
|
|
|
import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData";
|
|
|
|
import { IRegisterData } from "../models/eft/launcher/IRegisterData";
|
2023-08-10 15:29:09 +02:00
|
|
|
import { Info, ModDetails } from "../models/eft/profile/IAkiProfile";
|
2023-03-15 15:18:55 +01:00
|
|
|
import { IConnectResponse } from "../models/eft/profile/IConnectResponse";
|
2023-03-03 16:23:46 +01:00
|
|
|
import { ConfigTypes } from "../models/enums/ConfigTypes";
|
|
|
|
import { ICoreConfig } from "../models/spt/config/ICoreConfig";
|
2023-08-10 15:29:09 +02:00
|
|
|
import { IPackageJsonData } from "../models/spt/mod/IPackageJsonData";
|
2023-03-03 16:23:46 +01:00
|
|
|
import { ConfigServer } from "../servers/ConfigServer";
|
|
|
|
import { DatabaseServer } from "../servers/DatabaseServer";
|
|
|
|
import { SaveServer } from "../servers/SaveServer";
|
2023-03-15 15:18:55 +01:00
|
|
|
import { LocalisationService } from "../services/LocalisationService";
|
2023-03-03 16:23:46 +01:00
|
|
|
import { HashUtil } from "../utils/HashUtil";
|
|
|
|
|
|
|
|
@injectable()
|
|
|
|
export class LauncherController
|
|
|
|
{
|
|
|
|
protected coreConfig: ICoreConfig;
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
@inject("HashUtil") protected hashUtil: HashUtil,
|
|
|
|
@inject("SaveServer") protected saveServer: SaveServer,
|
|
|
|
@inject("HttpServerHelper") protected httpServerHelper: HttpServerHelper,
|
2023-08-10 15:29:09 +02:00
|
|
|
@inject("ProfileHelper") protected profileHelper: ProfileHelper,
|
2023-03-03 16:23:46 +01:00
|
|
|
@inject("DatabaseServer") protected databaseServer: DatabaseServer,
|
2023-03-15 15:18:55 +01:00
|
|
|
@inject("LocalisationService") protected localisationService: LocalisationService,
|
2023-08-10 15:29:09 +02:00
|
|
|
@inject("PreAkiModLoader") protected preAkiModLoader: PreAkiModLoader,
|
2023-03-03 16:23:46 +01:00
|
|
|
@inject("ConfigServer") protected configServer: ConfigServer
|
|
|
|
)
|
|
|
|
{
|
|
|
|
this.coreConfig = this.configServer.getConfig(ConfigTypes.CORE);
|
|
|
|
}
|
|
|
|
|
2023-03-15 15:18:55 +01:00
|
|
|
public connect(): IConnectResponse
|
2023-03-03 16:23:46 +01:00
|
|
|
{
|
|
|
|
return {
|
|
|
|
backendUrl: this.httpServerHelper.getBackendUrl(),
|
2023-03-15 15:18:55 +01:00
|
|
|
name: this.coreConfig.serverName,
|
|
|
|
editions: Object.keys(this.databaseServer.getTables().templates.profiles),
|
|
|
|
profileDescriptions: this.getProfileDescriptions()
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get descriptive text for each of the profile edtions a player can choose
|
|
|
|
* @returns
|
|
|
|
*/
|
|
|
|
protected getProfileDescriptions(): Record<string, string>
|
|
|
|
{
|
|
|
|
return {
|
|
|
|
"Standard": this.localisationService.getText("launcher-profile_standard"),
|
|
|
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
|
|
"Left Behind": this.localisationService.getText("launcher-profile_leftbehind"),
|
|
|
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
|
|
"Prepare To Escape": this.localisationService.getText("launcher-profile_preparetoescape"),
|
|
|
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
|
|
"Edge Of Darkness": this.localisationService.getText("launcher-edgeofdarkness"),
|
|
|
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
|
|
"SPT Easy start": this.localisationService.getText("launcher-profile_spteasystart"),
|
|
|
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
|
|
"SPT Zero to hero": this.localisationService.getText("launcher-profile_sptzerotohero"),
|
|
|
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
|
|
"SPT Developer": this.localisationService.getText("launcher-profile_sptdeveloper")
|
2023-03-03 16:23:46 +01:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
public find(sessionIdKey: string): Info
|
|
|
|
{
|
|
|
|
if (sessionIdKey in this.saveServer.getProfiles())
|
|
|
|
{
|
|
|
|
return this.saveServer.getProfile(sessionIdKey).info;
|
|
|
|
}
|
|
|
|
|
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
|
|
|
|
public login(info: ILoginRequestData): string
|
|
|
|
{
|
|
|
|
for (const sessionID in this.saveServer.getProfiles())
|
|
|
|
{
|
|
|
|
const account = this.saveServer.getProfile(sessionID).info;
|
|
|
|
if (info.username === account.username)
|
|
|
|
{
|
|
|
|
return sessionID;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
public register(info: IRegisterData): string
|
|
|
|
{
|
|
|
|
for (const sessionID in this.saveServer.getProfiles())
|
|
|
|
{
|
|
|
|
if (info.username === this.saveServer.getProfile(sessionID).info.username)
|
|
|
|
{
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.createAccount(info);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected createAccount(info: IRegisterData): string
|
|
|
|
{
|
|
|
|
const sessionID = this.hashUtil.generate();
|
|
|
|
const newProfileDetails: Info = {
|
|
|
|
id: sessionID,
|
2023-10-10 13:03:20 +02:00
|
|
|
aid: this.hashUtil.generateAccountId(),
|
2023-03-03 16:23:46 +01:00
|
|
|
username: info.username,
|
|
|
|
password: info.password,
|
|
|
|
wipe: true,
|
|
|
|
edition: info.edition
|
|
|
|
};
|
|
|
|
this.saveServer.createProfile(newProfileDetails);
|
|
|
|
|
|
|
|
this.saveServer.loadProfile(sessionID);
|
|
|
|
this.saveServer.saveProfile(sessionID);
|
|
|
|
return sessionID;
|
|
|
|
}
|
|
|
|
|
|
|
|
public changeUsername(info: IChangeRequestData): string
|
|
|
|
{
|
|
|
|
const sessionID = this.login(info);
|
|
|
|
|
|
|
|
if (sessionID)
|
|
|
|
{
|
|
|
|
this.saveServer.getProfile(sessionID).info.username = info.change;
|
|
|
|
}
|
|
|
|
|
|
|
|
return sessionID;
|
|
|
|
}
|
|
|
|
|
|
|
|
public changePassword(info: IChangeRequestData): string
|
|
|
|
{
|
|
|
|
const sessionID = this.login(info);
|
|
|
|
|
|
|
|
if (sessionID)
|
|
|
|
{
|
|
|
|
this.saveServer.getProfile(sessionID).info.password = info.change;
|
|
|
|
}
|
|
|
|
|
|
|
|
return sessionID;
|
|
|
|
}
|
|
|
|
|
|
|
|
public wipe(info: IRegisterData): string
|
|
|
|
{
|
|
|
|
const sessionID = this.login(info);
|
|
|
|
|
|
|
|
if (sessionID)
|
|
|
|
{
|
|
|
|
const profile = this.saveServer.getProfile(sessionID);
|
|
|
|
profile.info.edition = info.edition;
|
|
|
|
profile.info.wipe = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return sessionID;
|
|
|
|
}
|
|
|
|
|
|
|
|
public getCompatibleTarkovVersion(): string
|
|
|
|
{
|
|
|
|
return this.coreConfig.compatibleTarkovVersion;
|
|
|
|
}
|
2023-08-10 15:29:09 +02:00
|
|
|
|
2023-08-10 15:30:29 +02:00
|
|
|
/**
|
|
|
|
* Get the mods the server has currently loaded
|
|
|
|
* @returns Dictionary of mod name and mod details
|
|
|
|
*/
|
2023-08-10 15:29:09 +02:00
|
|
|
public getLoadedServerMods(): Record<string, IPackageJsonData>
|
|
|
|
{
|
|
|
|
return this.preAkiModLoader.getImportedModDetails();
|
|
|
|
}
|
|
|
|
|
2023-08-10 15:30:29 +02:00
|
|
|
/**
|
|
|
|
* Get the mods a profile has ever loaded into game with
|
|
|
|
* @param sessionId Player id
|
|
|
|
* @returns Array of mod details
|
|
|
|
*/
|
2023-08-10 15:29:09 +02:00
|
|
|
public getServerModsProfileUsed(sessionId: string): ModDetails[]
|
|
|
|
{
|
|
|
|
const profile = this.profileHelper.getFullProfile(sessionId);
|
2023-10-10 13:03:20 +02:00
|
|
|
|
2023-10-10 18:01:29 +02:00
|
|
|
if (profile?.aki?.mods)
|
|
|
|
{
|
|
|
|
return this.preAkiModLoader.getProfileModsGroupedByModName(profile?.aki?.mods);
|
|
|
|
}
|
|
|
|
|
|
|
|
return [];
|
2023-08-10 15:29:09 +02:00
|
|
|
}
|
2023-03-03 16:23:46 +01:00
|
|
|
}
|