2024-05-21 17:59:04 +00:00
|
|
|
import { PaymentHelper } from "@spt/helpers/PaymentHelper";
|
|
|
|
import { IRagfairOffer } from "@spt/models/eft/ragfair/IRagfairOffer";
|
|
|
|
import { ISearchRequestData, OfferOwnerType } from "@spt/models/eft/ragfair/ISearchRequestData";
|
|
|
|
import { MemberCategory } from "@spt/models/enums/MemberCategory";
|
|
|
|
import { ILogger } from "@spt/models/spt/utils/ILogger";
|
2024-07-23 11:12:53 -04:00
|
|
|
import { inject, injectable } from "tsyringe";
|
2023-03-03 15:23:46 +00:00
|
|
|
|
|
|
|
@injectable()
|
2024-07-23 11:12:53 -04:00
|
|
|
export class RagfairCategoriesService {
|
2023-12-05 20:41:43 +00:00
|
|
|
constructor(
|
2024-05-28 14:04:20 +00:00
|
|
|
@inject("PrimaryLogger") protected logger: ILogger,
|
2023-12-05 20:41:43 +00:00
|
|
|
@inject("PaymentHelper") protected paymentHelper: PaymentHelper,
|
2024-07-23 11:12:53 -04:00
|
|
|
) {}
|
2023-03-03 15:23:46 +00:00
|
|
|
|
|
|
|
/**
|
2023-12-05 20:41:43 +00:00
|
|
|
* Get a dictionary of each item the play can see in their flea menu, filtered by what is available for them to buy
|
|
|
|
* @param offers All offers in flea
|
|
|
|
* @param searchRequestData Search criteria requested
|
|
|
|
* @param fleaUnlocked Can player see full flea yet (level 15 by default)
|
|
|
|
* @returns KVP of item tpls + count of offers
|
2023-03-03 15:23:46 +00:00
|
|
|
*/
|
2024-02-02 13:54:07 -05:00
|
|
|
public getCategoriesFromOffers(
|
|
|
|
offers: IRagfairOffer[],
|
|
|
|
searchRequestData: ISearchRequestData,
|
|
|
|
fleaUnlocked: boolean,
|
2024-07-23 11:12:53 -04:00
|
|
|
): Record<string, number> {
|
2023-12-07 11:57:28 +00:00
|
|
|
// Get offers valid for search request, then reduce them down to just the counts
|
2024-05-17 15:32:41 -04:00
|
|
|
return offers
|
2024-07-23 11:12:53 -04:00
|
|
|
.filter((offer) => {
|
2024-05-17 15:32:41 -04:00
|
|
|
const isTraderOffer = offer.user.memberType === MemberCategory.TRADER;
|
2023-03-03 15:23:46 +00:00
|
|
|
|
2024-05-17 15:32:41 -04:00
|
|
|
// Not level 15 and offer is from player, skip
|
2024-07-23 11:12:53 -04:00
|
|
|
if (!(fleaUnlocked || isTraderOffer)) {
|
2024-05-17 15:32:41 -04:00
|
|
|
return false;
|
|
|
|
}
|
2023-12-05 20:41:43 +00:00
|
|
|
|
2024-05-17 15:32:41 -04:00
|
|
|
// Remove items not for money when `removeBartering` is enabled
|
|
|
|
if (
|
2024-07-23 11:12:53 -04:00
|
|
|
searchRequestData.removeBartering &&
|
|
|
|
(offer.requirements.length > 1 || !this.paymentHelper.isMoneyTpl(offer.requirements[0]._tpl))
|
|
|
|
) {
|
2024-05-17 15:32:41 -04:00
|
|
|
return false;
|
|
|
|
}
|
2023-12-05 20:41:43 +00:00
|
|
|
|
2024-05-17 15:32:41 -04:00
|
|
|
// Remove when filter set to players only + offer is from trader
|
2024-07-23 11:12:53 -04:00
|
|
|
if (searchRequestData.offerOwnerType === OfferOwnerType.PLAYEROWNERTYPE && isTraderOffer) {
|
2024-05-17 15:32:41 -04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove when filter set to traders only + offer is not from trader
|
2024-07-23 11:12:53 -04:00
|
|
|
if (searchRequestData.offerOwnerType === OfferOwnerType.TRADEROWNERTYPE && !isTraderOffer) {
|
2024-05-17 15:32:41 -04:00
|
|
|
return false;
|
|
|
|
}
|
2023-03-03 15:23:46 +00:00
|
|
|
|
2024-05-17 15:32:41 -04:00
|
|
|
// Passed checks, its a valid offer to process
|
|
|
|
return true;
|
|
|
|
})
|
2024-07-23 11:12:53 -04:00
|
|
|
.reduce((acc, offer) => {
|
2024-05-17 15:32:41 -04:00
|
|
|
const itemTpl = offer.items[0]._tpl;
|
|
|
|
// Increment the category or add if doesnt exist
|
|
|
|
acc[itemTpl] = (acc[itemTpl] || 0) + 1;
|
2023-03-03 15:23:46 +00:00
|
|
|
|
2024-05-17 15:32:41 -04:00
|
|
|
return acc;
|
|
|
|
}, {});
|
2023-03-03 15:23:46 +00:00
|
|
|
}
|
2023-11-16 21:42:06 +00:00
|
|
|
}
|