mirror of
https://github.com/Spythere/stacjownik.git
synced 2026-05-03 05:18:11 +00:00
nowe pobieranie i przetwarzanie statusów dyżurnych
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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": {
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
@@ -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();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user