nowe pobieranie i przetwarzanie statusów dyżurnych

This commit is contained in:
2023-11-07 20:16:58 +01:00
parent edad5306f2
commit cbce9af00b
18 changed files with 1621 additions and 13639 deletions
+4 -2
View File
@@ -96,11 +96,13 @@ export default defineComponent({
computed: { computed: {
onlineTrainsCount() { onlineTrainsCount() {
return this.store.trainList.filter((train) => train.online).length; return this.store.trainList.filter((train) => train.region == this.store.region.id).length;
}, },
onlineDispatchersCount() { onlineDispatchersCount() {
return this.store.onlineSceneryList.length; return this.store.onlineSceneryList.filter(
(scenery) => scenery.region == this.store.region.id
).length;
}, },
factorU() { factorU() {
+5 -6
View File
@@ -67,16 +67,15 @@ export default defineComponent({
selectedItem() { selectedItem() {
return this.regionList[this.selectedItemIndex] || null; return this.regionList[this.selectedItemIndex] || null;
}, },
regionList() { regionList() {
return regionsJSON.map((region) => { return regionsJSON.map((region) => {
const regionStationCount = const regionStationCount = this.store.onlineSceneryList.filter(
this.store.apiData.stations?.filter( (scenery) => scenery.region == region.id
(station) => station.region == region.id && station.isOnline ).length;
).length || 0;
const regionTrainCount = const regionTrainCount =
this.store.apiData.trains?.filter((train) => train.region == region.id && train.online) this.store.trainList.filter((train) => train.region == region.id).length || 0;
.length || 0;
return { return {
id: region.id, id: region.id,
+46 -15
View File
@@ -1,7 +1,7 @@
<template> <template>
<span class="status-badge" :class="statusID" v-if="isOnline"> <span class="status-badge" :class="statusName" v-if="isOnline">
{{ $t(`status.${statusID}`) }} {{ $t(`status.${statusName}`) }}
{{ statusID == 'online' ? timestampToString(statusTimestamp!) : '' }} {{ dispatcherStatus && dispatcherStatus > 5 ? timestampToString(dispatcherStatus) : '' }}
</span> </span>
<span class="status-badge free" v-else> <span class="status-badge free" v-else>
@@ -10,22 +10,52 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { PropType, defineComponent } from 'vue';
import dateMixin from '../../mixins/dateMixin'; import dateMixin from '../../mixins/dateMixin';
import { DispatcherStatus } from '../../scripts/enums/DispatcherStatus';
export default defineComponent({ export default defineComponent({
props: { props: {
statusID: { dispatcherStatus: {
type: String type: Number as PropType<DispatcherStatus | number>
},
statusTimestamp: {
type: Number
}, },
isOnline: { isOnline: {
type: Boolean type: Boolean
} }
}, },
mixins: [dateMixin] mixins: [dateMixin],
computed: {
statusName() {
if (!this.dispatcherStatus) return 'free';
switch (this.dispatcherStatus) {
case DispatcherStatus.AFK:
return 'afk';
case DispatcherStatus.ENDING:
return 'ending';
case DispatcherStatus.INVALID:
return 'invalid';
case DispatcherStatus.NOT_LOGGED_IN:
return 'not-signed';
case DispatcherStatus.NO_SPACE:
return 'no-space';
case DispatcherStatus.UNAVAILABLE:
return 'unavailable';
case DispatcherStatus.UNKNOWN:
return 'unknown';
default:
return 'online';
}
}
}
}); });
</script> </script>
@@ -34,10 +64,10 @@ $free: #8a8a8a;
$ending: #e6c300; $ending: #e6c300;
$no-limit: #117fc9; $no-limit: #117fc9;
$unav: #ff3d5d; $unav: #ff3d5d;
$brb: #e6a100; $afk: #e6a100;
$no-space: #222; $no-space: #222;
$online: #09a116; $online: #09a116;
$unknown: rgb(185, 60, 60); $unknown: #b93c3c;
.status-badge { .status-badge {
border-radius: 1rem; border-radius: 1rem;
@@ -69,8 +99,8 @@ $unknown: rgb(185, 60, 60);
font-size: 0.85em; font-size: 0.85em;
} }
&.brb { &.afk {
background-color: $brb; background-color: $afk;
color: black; color: black;
font-size: 0.95em; font-size: 0.95em;
} }
@@ -82,7 +112,8 @@ $unknown: rgb(185, 60, 60);
font-size: 0.85em; font-size: 0.85em;
} }
&.unknown { &.unknown,
&.invalid {
background-color: $unknown; background-color: $unknown;
font-size: 0.95em; font-size: 0.95em;
} }
@@ -22,9 +22,8 @@
</div> </div>
<StationStatusBadge <StationStatusBadge
:statusID="onlineScenery?.statusID"
:isOnline="onlineScenery ? true : false" :isOnline="onlineScenery ? true : false"
:statusTimestamp="onlineScenery?.statusTimestamp" :dispatcherStatus="onlineScenery?.dispatcherStatus"
/> />
</section> </section>
</template> </template>
+1 -2
View File
@@ -108,9 +108,8 @@
<td class="station_status"> <td class="station_status">
<StationStatusBadge <StationStatusBadge
:statusID="station.onlineInfo?.statusID"
:isOnline="station.onlineInfo ? true : false" :isOnline="station.onlineInfo ? true : false"
:statusTimestamp="station.onlineInfo?.statusTimestamp" :dispatcherStatus="station.onlineInfo?.dispatcherStatus"
/> />
</td> </td>
+1438 -13428
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -80,6 +80,7 @@
"unavailable": "UNAVAILABLE", "unavailable": "UNAVAILABLE",
"brb": "AFK", "brb": "AFK",
"no-space": "NO SPACE", "no-space": "NO SPACE",
"invalid": "INVALID HASH",
"unknown": "UNKNOWN" "unknown": "UNKNOWN"
}, },
"options": { "options": {
+1
View File
@@ -68,6 +68,7 @@
"unavailable": "NIEDOSTĘPNY", "unavailable": "NIEDOSTĘPNY",
"brb": "Z/W", "brb": "Z/W",
"no-space": "BRAK MIEJSCA", "no-space": "BRAK MIEJSCA",
"invalid": "NIEWPISANY",
"unknown": "NIEZNANY" "unknown": "NIEZNANY"
}, },
"options": { "options": {
+8 -10
View File
@@ -1,11 +1,9 @@
export enum DispatcherStatusID { export enum DispatcherStatus {
Unknown = 'unknown', INVALID = -2,
Outdated = 'outdated', UNKNOWN = -1,
Unauthorized = 'not-signed', AFK = 1,
OnlineNoLimit = 'no-limit', ENDING = 2,
Afk = 'brb', NO_SPACE = 3,
Ending = 'ending', UNAVAILABLE = 4,
NoSpace = 'no-space', NOT_LOGGED_IN = 5
Unavailable = 'unavailable',
OnlineWithHours = 'online'
} }
@@ -0,0 +1,21 @@
import { DispatcherStatus } from '../../enums/DispatcherStatus';
export default interface ActiveSceneryAPIData {
dispatcherId: number;
dispatcherName: string;
dispatcherIsSupporter: boolean;
stationName: string;
stationHash: string;
region: string;
maxUsers: number;
currentUsers: number;
spawn: number;
lastSeen: number;
dispatcherExp: number;
nameFromHeader: string;
spawnString: string | null;
networkConnectionString: string;
isOnline: number;
dispatcherRate: number;
dispatcherStatus: DispatcherStatus | number;
}
+15 -5
View File
@@ -7,16 +7,25 @@ import { DriverStatsAPIData } from '../api/DriverStatsAPIData';
import { RollingStockGithubData } from '../github_api/StockInfoGithubData'; import { RollingStockGithubData } from '../github_api/StockInfoGithubData';
import Station from '../Station'; import Station from '../Station';
import { ScheduledTrain } from '../ScheduledTrain'; import { ScheduledTrain } from '../ScheduledTrain';
import { DispatcherStatusID } from '../../enums/DispatcherStatus'; import { DispatcherStatus } from '../../enums/DispatcherStatus';
import ActiveSceneryAPIData from '../api/SceneryAPIData';
export type Availability = 'default' | 'unavailable' | 'nonPublic' | 'abandoned' | 'nonDefault'; export type Availability = 'default' | 'unavailable' | 'nonPublic' | 'abandoned' | 'nonDefault';
export interface RegionCounters {
stationCount: number;
trainsCount: number;
timetablesCount: number;
}
export interface StoreState { export interface StoreState {
stationList: Station[]; stationList: Station[];
apiData: APIData; apiData: APIData;
rollingStockData?: RollingStockGithubData; rollingStockData?: RollingStockGithubData;
lastDispatcherStatuses: { hash: string; statusTimestamp: number; statusID: DispatcherStatusID }[]; regionOnlineCounters: RegionCounters[];
lastDispatcherStatuses: { hash: string; statusTimestamp: number; statusID: DispatcherStatus }[];
sceneryData: any[][]; sceneryData: any[][];
@@ -55,6 +64,8 @@ export interface APIData {
stations?: StationAPIData[]; stations?: StationAPIData[];
dispatchers?: string[][]; dispatchers?: string[][];
trains?: TrainAPIData[]; trains?: TrainAPIData[];
activeSceneries?: ActiveSceneryAPIData[];
connectedSocketCount: number; connectedSocketCount: number;
} }
@@ -113,8 +124,7 @@ export interface OnlineScenery {
dispatcherExp: number; dispatcherExp: number;
dispatcherIsSupporter: boolean; dispatcherIsSupporter: boolean;
statusTimestamp: number; dispatcherStatus: DispatcherStatus | number;
statusID: DispatcherStatusID;
isOnline: boolean; isOnline: boolean;
@@ -125,5 +135,5 @@ export interface OnlineScenery {
all: number; all: number;
confirmed: number; confirmed: number;
unconfirmed: number; unconfirmed: number;
} };
} }
@@ -72,7 +72,6 @@ function filterTrainList(
(searchedDriver.length > 0 (searchedDriver.length > 0
? train.driverName.toLowerCase().startsWith(searchedDriver.toLowerCase()) ? train.driverName.toLowerCase().startsWith(searchedDriver.toLowerCase())
: true) && : true) &&
(!train.timetableData ? train.online : train.timetableData) &&
isFiltered isFiltered
); );
}); });
+14 -14
View File
@@ -1,5 +1,5 @@
import { HeadIdsTypes } from '../data/stationHeaderNames'; import { HeadIdsTypes } from '../data/stationHeaderNames';
import { DispatcherStatusID } from '../enums/DispatcherStatus'; import { DispatcherStatus } from '../enums/DispatcherStatus';
import Filter from '../interfaces/Filter'; import Filter from '../interfaces/Filter';
import Station from '../interfaces/Station'; import Station from '../interfaces/Station';
@@ -19,7 +19,7 @@ export const sortStations = (
break; break;
case 'status': case 'status':
diff = (a.onlineInfo?.statusTimestamp || 0) - (b.onlineInfo?.statusTimestamp || 0); diff = (a.onlineInfo?.dispatcherStatus || 0) - (b.onlineInfo?.dispatcherStatus || 0);
break; break;
case 'dispatcher': case 'dispatcher':
@@ -81,27 +81,27 @@ export const filterStations = (station: Station, filters: Filter) => {
if (!station.onlineInfo && filters['free']) return false; if (!station.onlineInfo && filters['free']) return false;
if (station.onlineInfo) { if (station.onlineInfo) {
const { statusID, statusTimestamp } = station.onlineInfo; const { dispatcherStatus } = station.onlineInfo;
const isEnding = statusID == DispatcherStatusID.Ending && filters['endingStatus']; const isEnding = dispatcherStatus == DispatcherStatus.ENDING && filters['endingStatus'];
const isNotSigned = const isNotSigned =
(statusID == 'not-signed' || statusID == 'unavailable') && filters['unavailableStatus']; (dispatcherStatus == DispatcherStatus.NOT_LOGGED_IN ||
dispatcherStatus == DispatcherStatus.UNAVAILABLE) &&
filters['unavailableStatus'];
const isAFK = statusID == 'brb' && filters['afkStatus']; const isAFK = dispatcherStatus == DispatcherStatus.AFK && filters['afkStatus'];
const isNoSpace = statusID == 'no-space' && filters['noSpaceStatus']; const isNoSpace = dispatcherStatus == DispatcherStatus.NO_SPACE && filters['noSpaceStatus'];
const isOccupied = station.onlineInfo && filters['occupied']; const isOccupied = station.onlineInfo && filters['occupied'];
const isOnlineInBounds = if (isEnding || isNotSigned || isAFK || isNoSpace || isOccupied) return false;
(filters['onlineFromHours'] < 8 &&
statusTimestamp > 0 &&
statusTimestamp <= Date.now() + filters['onlineFromHours'] * 3600000) ||
(filters['onlineFromHours'] > 0 && statusTimestamp <= 0) ||
(filters['onlineFromHours'] == 8 && statusID != 'no-limit');
if (isEnding || isOnlineInBounds || isNotSigned || isAFK || isNoSpace || isOccupied) if (
filters['onlineFromHours'] > 0 &&
dispatcherStatus <= Date.now() + filters['onlineFromHours'] * 3600000
)
return false; return false;
} }
+9 -77
View File
@@ -1,51 +1,15 @@
import { DispatcherStatusID } from '../enums/DispatcherStatus';
import { ScheduledTrain, StopStatus } from '../interfaces/ScheduledTrain'; import { ScheduledTrain, StopStatus } from '../interfaces/ScheduledTrain';
import Station from '../interfaces/Station'; import Station from '../interfaces/Station';
import Train from '../interfaces/Train'; import Train from '../interfaces/Train';
import TrainStop from '../interfaces/TrainStop'; import TrainStop from '../interfaces/TrainStop';
import StationAPIData from '../interfaces/api/StationAPIData'; import ActiveSceneryAPIData from '../interfaces/api/SceneryAPIData';
import { StationTrain, StoreState } from '../interfaces/store/storeTypes'; import { StationTrain } from '../interfaces/store/storeTypes';
export const getLocoURL = (locoType: string): string => export const getLocoURL = (locoType: string): string =>
`https://rj.td2.info.pl/dist/img/thumbnails/${ `https://rj.td2.info.pl/dist/img/thumbnails/${
locoType.includes('EN') ? locoType + 'rb' : locoType locoType.includes('EN') ? locoType + 'rb' : locoType
}.png`; }.png`;
export const getStatusID = (
stationStatus: any[] | undefined,
isSWDROnline: boolean
): DispatcherStatusID => {
if (isSWDROnline && !stationStatus) return DispatcherStatusID.Unauthorized;
if (!stationStatus) return DispatcherStatusID.Unknown;
// if (stationStatus == -1) return DispatcherStatusID.Unauthorized;
const statusCode = stationStatus[2];
const statusTimestamp = stationStatus[3];
switch (statusCode) {
case 0:
if (statusTimestamp - Date.now() > 21000000) return DispatcherStatusID.OnlineNoLimit;
return DispatcherStatusID.OnlineWithHours;
case 1:
return DispatcherStatusID.Afk;
case 2:
if (statusTimestamp == 0) return DispatcherStatusID.Ending;
break;
case 3:
return DispatcherStatusID.NoSpace;
default:
break;
}
return DispatcherStatusID.Unavailable;
};
export const getStatusTimestamp = (stationStatus: any): number => { export const getStatusTimestamp = (stationStatus: any): number => {
if (!stationStatus) return -2; if (!stationStatus) return -2;
@@ -218,40 +182,12 @@ export function getCheckpointTrain(
}; };
} }
export function getDispatcherStatus(state: StoreState, onlineStationData: StationAPIData) {
const { dispatchers } = state.apiData;
const prevDispatcherStatus = state.lastDispatcherStatuses.find(
(dispatcher) => dispatcher.hash === onlineStationData.stationHash
);
const stationStatus = dispatchers?.find(
(status: string[]) => status[0] == onlineStationData.stationHash && status[1] == state.region.id
);
const statusTimestamp =
prevDispatcherStatus && !dispatchers
? prevDispatcherStatus.statusTimestamp
: getStatusTimestamp(stationStatus);
const statusID =
prevDispatcherStatus && !dispatchers
? prevDispatcherStatus.statusID
: getStatusID(stationStatus, onlineStationData.isOnline === 1);
return {
hash: onlineStationData.stationHash,
statusID,
statusTimestamp
};
}
export function getScheduledTrains( export function getScheduledTrains(
trainList: Train[], trainList: Train[],
stationAPIData: StationAPIData, sceneryData: ActiveSceneryAPIData,
stationGeneralInfo: Station['generalInfo'] stationGeneralInfo: Station['generalInfo']
): ScheduledTrain[] { ): ScheduledTrain[] {
const stationName = stationAPIData.stationName.toLocaleLowerCase(); const stationName = sceneryData.stationName.toLocaleLowerCase();
stationGeneralInfo?.checkpoints.forEach((cp) => (cp.scheduledTrains.length = 0)); stationGeneralInfo?.checkpoints.forEach((cp) => (cp.scheduledTrains.length = 0));
@@ -259,7 +195,7 @@ export function getScheduledTrains(
if (!train.timetableData) return acc; if (!train.timetableData) return acc;
const timetable = train.timetableData; const timetable = train.timetableData;
if (!timetable.sceneries.includes(stationAPIData.stationHash)) return acc; if (!timetable.sceneries.includes(sceneryData.stationHash)) return acc;
const stopInfoIndex = timetable.followingStops.findIndex((stop) => { const stopInfoIndex = timetable.followingStops.findIndex((stop) => {
const stopName = stop.stopNameRAW.toLowerCase(); const stopName = stop.stopNameRAW.toLowerCase();
@@ -277,7 +213,7 @@ export function getScheduledTrains(
if (stopInfoIndex != -1) { if (stopInfoIndex != -1) {
checkpointScheduledTrains.push( checkpointScheduledTrains.push(
getCheckpointTrain(train, stopInfoIndex, stationAPIData.stationName) getCheckpointTrain(train, stopInfoIndex, sceneryData.stationName)
); );
} }
@@ -298,9 +234,7 @@ export function getScheduledTrains(
); );
if (index > -1) if (index > -1)
checkpointScheduledTrains.push( checkpointScheduledTrains.push(getCheckpointTrain(train, index, sceneryData.stationName));
getCheckpointTrain(train, index, stationAPIData.stationName)
);
}); });
acc.push(...checkpointScheduledTrains); acc.push(...checkpointScheduledTrains);
@@ -312,14 +246,12 @@ export function getStationTrains(
trainList: Train[], trainList: Train[],
scheduledTrainList: ScheduledTrain[], scheduledTrainList: ScheduledTrain[],
region: string, region: string,
apiStation: StationAPIData scenery: ActiveSceneryAPIData
): StationTrain[] { ): StationTrain[] {
return trainList return trainList
.filter( .filter(
(train) => (train) =>
train?.region === region && train?.region === region && train.online && train.currentStationName === scenery.stationName
train.online &&
train.currentStationName === apiStation.stationName
) )
.map((train) => ({ .map((train) => ({
driverName: train.driverName, driverName: train.driverName,
+3 -1
View File
@@ -26,7 +26,9 @@ export const useStationFiltersStore = defineStore('stationFiltersStore', {
return store.stationList return store.stationList
.map((station) => ({ .map((station) => ({
...station, ...station,
onlineInfo: store.onlineSceneryList.find((os) => os.name == station.name) onlineInfo: store.onlineSceneryList.find(
(os) => os.name == station.name && os.region == store.region.id
)
})) }))
.filter((station) => filterStations(station, state.filters)) .filter((station) => filterStations(station, state.filters))
.sort((a, b) => sortStations(a, b, state.sorterActive)); .sort((a, b) => sortStations(a, b, state.sorterActive));
+49 -72
View File
@@ -5,12 +5,7 @@ import { DataStatus } from '../scripts/enums/DataStatus';
import StationRoutes from '../scripts/interfaces/StationRoutes'; import StationRoutes from '../scripts/interfaces/StationRoutes';
import Train from '../scripts/interfaces/Train'; import Train from '../scripts/interfaces/Train';
import { URLs } from '../scripts/utils/apiURLs'; import { URLs } from '../scripts/utils/apiURLs';
import { import { parseSpawns, getScheduledTrains, getStationTrains } from '../scripts/utils/storeUtils';
getDispatcherStatus,
parseSpawns,
getScheduledTrains,
getStationTrains
} from '../scripts/utils/storeUtils';
import { import {
APIData, APIData,
@@ -22,7 +17,7 @@ import {
import packageInfo from '../../package.json'; import packageInfo from '../../package.json';
import { RollingStockGithubData } from '../scripts/interfaces/github_api/StockInfoGithubData'; import { RollingStockGithubData } from '../scripts/interfaces/github_api/StockInfoGithubData';
import { ScheduledTrain } from '../scripts/interfaces/ScheduledTrain'; import { ScheduledTrain } from '../scripts/interfaces/ScheduledTrain';
import { DispatcherStatusID } from '../scripts/enums/DispatcherStatus'; import { DispatcherStatus } from '../scripts/enums/DispatcherStatus';
export const useStore = defineStore('store', { export const useStore = defineStore('store', {
state: () => state: () =>
@@ -31,6 +26,7 @@ export const useStore = defineStore('store', {
rollingStockData: undefined, rollingStockData: undefined,
stationList: [], stationList: [],
regionOnlineCounters: [],
routesList: [], routesList: [],
@@ -72,11 +68,7 @@ export const useStore = defineStore('store', {
getters: { getters: {
trainList(): Train[] { trainList(): Train[] {
return (this.apiData?.trains ?? []) return (this.apiData?.trains ?? [])
.filter( .filter((train) => train.online || train.timetable || train.lastSeen > Date.now() - 180000)
(train) =>
train.region === this.region.id &&
(train.online || train.timetable || train.lastSeen > Date.now() - 180000)
)
.map((train) => { .map((train) => {
const stock = train.stockString.split(';'); const stock = train.stockString.split(';');
const locoType = stock ? stock[0] : train.stockString; const locoType = stock ? stock[0] : train.stockString;
@@ -127,75 +119,59 @@ export const useStore = defineStore('store', {
onlineSceneryList(state): OnlineScenery[] { onlineSceneryList(state): OnlineScenery[] {
if (state.isOffline) return []; if (state.isOffline) return [];
if (!state.apiData?.stations) return []; if (!state.apiData?.activeSceneries) return [];
return ( return state.apiData?.activeSceneries.reduce((list, scenery) => {
state.apiData?.stations if (scenery.isOnline !== 1 && Date.now() - scenery.lastSeen > 1000 * 60 * 3) return list;
// ?.filter((apiStation) => apiStation.region == state.region.id) if (scenery.dispatcherStatus == DispatcherStatus.UNKNOWN) return list;
.reduce((list, apiStation) => {
if (apiStation.region != state.region.id) return list;
if (apiStation.isOnline !== 1 && Date.now() - apiStation.lastSeen > 1000 * 60 * 3) const station = this.stationList.find((s) => s.name === scenery.stationName);
return list;
const dispatcherStatus = getDispatcherStatus(state as StoreState, apiStation); const scheduledTrains = getScheduledTrains(this.trainList, scenery, station?.generalInfo);
if (dispatcherStatus.statusID == DispatcherStatusID.Unknown) return list; const stationTrains = getStationTrains(
this.trainList,
scheduledTrains,
this.region.id,
scenery
);
const station = this.stationList.find((s) => s.name === apiStation.stationName); // Remove checkpoint duplicates
const uniqueScheduledTrains = scheduledTrains.reduce(
(uniqueList, sTrain) =>
uniqueList.find((v) => v.trainId === sTrain.trainId)
? uniqueList
: [...uniqueList, sTrain],
[] as ScheduledTrain[]
);
const scheduledTrains = getScheduledTrains( list.push({
this.trainList, name: scenery.stationName,
apiStation, hash: scenery.stationHash,
station?.generalInfo region: scenery.region,
); maxUsers: scenery.maxUsers,
currentUsers: scenery.currentUsers,
spawns: parseSpawns(scenery.spawnString),
dispatcherName: scenery.dispatcherName,
dispatcherRate: scenery.dispatcherRate,
dispatcherId: scenery.dispatcherId,
dispatcherExp: scenery.dispatcherExp,
dispatcherIsSupporter: scenery.dispatcherIsSupporter,
scheduledTrains: scheduledTrains,
stationTrains: stationTrains,
dispatcherStatus: scenery.dispatcherStatus,
const stationTrains = getStationTrains( isOnline: scenery.isOnline == 1,
this.trainList,
scheduledTrains,
this.region.id,
apiStation
);
// Remove checkpoint duplicates scheduledTrainCount: {
const uniqueScheduledTrains = scheduledTrains.reduce( all: uniqueScheduledTrains.length,
(uniqueList, sTrain) => confirmed: uniqueScheduledTrains.filter((train) => train.stopInfo.confirmed).length,
uniqueList.find((v) => v.trainId === sTrain.trainId) unconfirmed: uniqueScheduledTrains.filter((train) => !train.stopInfo.confirmed).length
? uniqueList }
: [...uniqueList, sTrain], });
[] as ScheduledTrain[]
);
list.push({ return list;
name: apiStation.stationName, }, [] as OnlineScenery[]);
hash: apiStation.stationHash,
region: apiStation.region,
maxUsers: apiStation.maxUsers,
currentUsers: apiStation.currentUsers,
spawns: parseSpawns(apiStation.spawnString),
dispatcherName: apiStation.dispatcherName,
dispatcherRate: apiStation.dispatcherRate,
dispatcherId: apiStation.dispatcherId,
dispatcherExp: apiStation.dispatcherExp,
dispatcherIsSupporter: apiStation.dispatcherIsSupporter,
scheduledTrains: scheduledTrains,
stationTrains: stationTrains,
statusTimestamp: dispatcherStatus.statusTimestamp,
statusID: dispatcherStatus.statusID,
isOnline: apiStation.isOnline == 1,
scheduledTrainCount: {
all: uniqueScheduledTrains.length,
confirmed: uniqueScheduledTrains.filter((train) => train.stopInfo.confirmed).length,
unconfirmed: uniqueScheduledTrains.filter((train) => !train.stopInfo.confirmed)
.length
}
});
return list;
}, [] as OnlineScenery[])
);
} }
}, },
actions: { actions: {
@@ -287,6 +263,7 @@ export const useStore = defineStore('store', {
socket.on('UPDATE', (data: APIData) => { socket.on('UPDATE', (data: APIData) => {
this.apiData = data; this.apiData = data;
this.dataStatuses.connection = DataStatus.Loaded; this.dataStatuses.connection = DataStatus.Loaded;
this.setStatuses(); this.setStatuses();
}); });
+3 -1
View File
@@ -134,7 +134,9 @@ export default defineComponent({
onlineSceneryInfo() { onlineSceneryInfo() {
return this.store.onlineSceneryList.find( return this.store.onlineSceneryList.find(
(scenery) => scenery.name === this.station?.toString().replace(/_/g, ' ') (scenery) =>
scenery.name === this.station?.toString().replace(/_/g, ' ') &&
scenery.region == this.store.region.id
); );
} }
}, },
+1 -2
View File
@@ -70,7 +70,7 @@ export default defineComponent({
const computedTrains: ComputedRef<Train[]> = computed(() => { const computedTrains: ComputedRef<Train[]> = computed(() => {
return filteredTrainList( return filteredTrainList(
store.trainList, store.trainList.filter((train) => train.region == store.region.id),
searchedTrain.value, searchedTrain.value,
searchedDriver.value, searchedDriver.value,
sorterActive, sorterActive,
@@ -83,7 +83,6 @@ export default defineComponent({
currentOptionsActive.value = currentOptionsActive.value =
sT.length > 0 || sD.length > 0 || sA.id != 'routeDistance' || areFiltersActive; sT.length > 0 || sD.length > 0 || sA.id != 'routeDistance' || areFiltersActive;
console.log(sA.id);
}); });
return { return {