61 lines
2.8 KiB
TypeScript

import { Server, Station, Train } from '@simrail/types';
import { MLog } from '../mongo/logs.js';
import { IPlayer } from '../types/player.js';
import { SimrailClientEvents } from '../util/SimrailClient.js';
import { v4 } from 'uuid';
import { getVehicle } from '../util/contants.js';
import { MProfile } from '../mongo/profile.js';
import { MTrainLog } from '../mongo/trainLogs.js';
export class TrainsModule {
public static load() {
client.on(SimrailClientEvents.TrainLeft, async (server: Server, train: Train, player: IPlayer, joinedAt: number, leftAt: number, points: number, distance: number, vehicle: string) => {
if (distance) {
const time = joinedAt ? (leftAt - joinedAt) : 0;
const userProfile = await MProfile.findOne({ steam: player.steamid }) ?? await MProfile.create({ steam: player.steamid, id: v4(), steamName: player.personaname });
const vehicleName = getVehicle(vehicle) ?? vehicle;
if (!userProfile.trainStats) userProfile.trainStats = {};
if (userProfile.trainStats[vehicleName]) {
userProfile.trainStats[vehicleName].distance = userProfile.trainStats[vehicleName].distance + distance;
userProfile.trainStats[vehicleName].score = userProfile.trainStats[vehicleName].score + points;
userProfile.trainStats[vehicleName].time = userProfile.trainStats[vehicleName].time + time;
} else {
userProfile.trainStats[vehicleName] = {
distance, score: points, time
}
}
if (!userProfile.trainTime) userProfile.trainTime = 0;
userProfile.trainTime = userProfile.trainTime + time;
if (!userProfile.trainPoints) userProfile.trainPoints = 0;
userProfile.trainPoints = userProfile.trainPoints + points;
if (!userProfile.trainDistance) userProfile.trainDistance = 0;
userProfile.trainDistance = userProfile.trainDistance + distance;
await MProfile.findOneAndUpdate({ id: userProfile.id }, { trainStats: userProfile.trainStats, trainTime: userProfile.trainTime, trainPoints: userProfile.trainPoints, trainDistance: userProfile.trainDistance });
}
MTrainLog.create({
id: v4(),
userSteamId: player.steamid,
userAvatar: player.avatarfull,
userUsername: player.personaname,
joinedDate: joinedAt,
leftDate: leftAt,
trainNumber: train.TrainNoLocal,
server: server.ServerCode,
distance, points,
trainName: train.TrainName
});
})
}
}