返回提交历史
Modified
src/services/serversideVendorsService.ts
+27
-4
XFEstudio/SpaceNinjaServer
chore: retroactively populate vendor to hide that it was just generated (#2168)
For example, debt-bonds at ticker always expire in at least 2 hours so visiting him, you'd never see an offer with an expiry less than that. The solution here is simply generating offers for the last few hours. Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2168 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
b98a88b7
代码差异
1 个文件
+27
-4
@@ -216,6 +216,22 @@ const toRange = (value: IRange | number): IRange => {
216
216
return value;
217
217
};
218
218
219
const getCycleDurationRange = (manifest: IVendor): IRange | undefined => {
220
const res: IRange = { minValue: Number.MAX_SAFE_INTEGER, maxValue: 0 };
221
for (const offer of manifest.items) {
222
if (offer.durationHours) {
223
const range = toRange(offer.durationHours);
224
if (res.minValue > range.minValue) {
225
res.minValue = range.minValue;
226
}
227
if (res.maxValue < range.maxValue) {
228
res.maxValue = range.maxValue;
229
}
230
}
231
}
232
return res.maxValue != 0 ? res : undefined;
233
};
234
219
235
const vendorManifestCache: Record<string, IVendorManifest> = {};
220
236
221
237
const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorManifest => {
@@ -232,10 +248,16 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
232
248
}
233
249
const cacheEntry = vendorManifestCache[vendorInfo.TypeName];
234
250
const info = cacheEntry.VendorInfo;
235
if (Date.now() >= parseInt(info.Expiry.$date.$numberLong)) {
251
const manifest = ExportVendors[vendorInfo.TypeName];
252
const cycleDurationRange = getCycleDurationRange(manifest);
253
let now = Date.now();
254
if (cycleDurationRange && cycleDurationRange.minValue != cycleDurationRange.maxValue) {
255
now -= (cycleDurationRange.maxValue - 1) * unixTimesInMs.hour;
256
}
257
while (Date.now() >= parseInt(info.Expiry.$date.$numberLong)) {
236
258
// Remove expired offers
237
259
for (let i = 0; i != info.ItemManifest.length; ) {
238
if (Date.now() >= parseInt(info.ItemManifest[i].Expiry.$date.$numberLong)) {
260
if (now >= parseInt(info.ItemManifest[i].Expiry.$date.$numberLong)) {
239
261
info.ItemManifest.splice(i, 1);
240
262
} else {
241
263
++i;
@@ -246,9 +268,8 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
246
268
const vendorSeed = parseInt(vendorInfo._id.$oid.substring(16), 16);
247
269
const cycleOffset = vendorInfo.cycleOffset ?? 1734307200_000;
248
270
const cycleDuration = vendorInfo.cycleDuration;
249
const cycleIndex = Math.trunc((Date.now() - cycleOffset) / cycleDuration);
271
const cycleIndex = Math.trunc((now - cycleOffset) / cycleDuration);
250
272
const rng = new SRng(mixSeeds(vendorSeed, cycleIndex));
251
const manifest = ExportVendors[vendorInfo.TypeName];
252
273
const offersToAdd: IVendorOffer[] = [];
253
274
if (!manifest.isOneBinPerCycle) {
254
275
const remainingItemCapacity: Record<string, number> = {};
@@ -371,6 +392,8 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
371
392
}
372
393
}
373
394
info.Expiry.$date.$numberLong = soonestOfferExpiry.toString();
395
396
now += unixTimesInMs.hour;
374
397
}
375
398
return cacheEntry;
376
399
};