forked from OpenWF/SpaceNinjaServer
		
	feat: view clan contributions (#1340)
Reviewed-on: OpenWF/SpaceNinjaServer#1340
This commit is contained in:
		
							parent
							
								
									36c7b6f8f8
								
							
						
					
					
						commit
						d9b944175a
					
				@ -1,4 +1,4 @@
 | 
			
		||||
import { TGuildDatabaseDocument } from "@/src/models/guildModel";
 | 
			
		||||
import { GuildMember, TGuildDatabaseDocument } from "@/src/models/guildModel";
 | 
			
		||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
 | 
			
		||||
import {
 | 
			
		||||
    getDojoClient,
 | 
			
		||||
@ -10,7 +10,7 @@ import {
 | 
			
		||||
} from "@/src/services/guildService";
 | 
			
		||||
import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService";
 | 
			
		||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
			
		||||
import { IDojoContributable } from "@/src/types/guildTypes";
 | 
			
		||||
import { IDojoContributable, IGuildMemberDatabase } from "@/src/types/guildTypes";
 | 
			
		||||
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
			
		||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
			
		||||
import { RequestHandler } from "express";
 | 
			
		||||
@ -35,6 +35,10 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    const guild = await getGuildForRequestEx(req, inventory);
 | 
			
		||||
    const guildMember = (await GuildMember.findOne(
 | 
			
		||||
        { accountId, guildId: guild._id },
 | 
			
		||||
        "RegularCreditsContributed MiscItemsContributed"
 | 
			
		||||
    ))!;
 | 
			
		||||
    const request = JSON.parse(String(req.body)) as IContributeToDojoComponentRequest;
 | 
			
		||||
    const component = guild.DojoComponents.id(request.ComponentId)!;
 | 
			
		||||
 | 
			
		||||
@ -45,7 +49,7 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r
 | 
			
		||||
            throw new Error("attempt to contribute to a deco in an unfinished room?!");
 | 
			
		||||
        }
 | 
			
		||||
        const meta = Object.values(ExportDojoRecipes.rooms).find(x => x.resultType == component.pf)!;
 | 
			
		||||
        processContribution(guild, request, inventory, inventoryChanges, meta, component);
 | 
			
		||||
        processContribution(guild, guildMember, request, inventory, inventoryChanges, meta, component);
 | 
			
		||||
        // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
 | 
			
		||||
        if (component.CompletionTime) {
 | 
			
		||||
            setDojoRoomLogFunded(guild, component);
 | 
			
		||||
@ -55,12 +59,13 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r
 | 
			
		||||
        if (request.DecoId) {
 | 
			
		||||
            const deco = component.Decos!.find(x => x._id.equals(request.DecoId))!;
 | 
			
		||||
            const meta = Object.values(ExportDojoRecipes.decos).find(x => x.resultType == deco.Type)!;
 | 
			
		||||
            processContribution(guild, request, inventory, inventoryChanges, meta, deco);
 | 
			
		||||
            processContribution(guild, guildMember, request, inventory, inventoryChanges, meta, deco);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    await guild.save();
 | 
			
		||||
    await inventory.save();
 | 
			
		||||
    await guildMember.save();
 | 
			
		||||
    res.json({
 | 
			
		||||
        ...(await getDojoClient(guild, 0, component._id)),
 | 
			
		||||
        InventoryChanges: inventoryChanges
 | 
			
		||||
@ -69,6 +74,7 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r
 | 
			
		||||
 | 
			
		||||
const processContribution = (
 | 
			
		||||
    guild: TGuildDatabaseDocument,
 | 
			
		||||
    guildMember: IGuildMemberDatabase,
 | 
			
		||||
    request: IContributeToDojoComponentRequest,
 | 
			
		||||
    inventory: TInventoryDatabaseDocument,
 | 
			
		||||
    inventoryChanges: IInventoryChanges,
 | 
			
		||||
@ -80,6 +86,9 @@ const processContribution = (
 | 
			
		||||
        component.RegularCredits += request.RegularCredits;
 | 
			
		||||
        inventoryChanges.RegularCredits = -request.RegularCredits;
 | 
			
		||||
        updateCurrency(inventory, request.RegularCredits, false);
 | 
			
		||||
 | 
			
		||||
        guildMember.RegularCreditsContributed ??= 0;
 | 
			
		||||
        guildMember.RegularCreditsContributed += request.RegularCredits;
 | 
			
		||||
    }
 | 
			
		||||
    if (request.VaultCredits) {
 | 
			
		||||
        component.RegularCredits += request.VaultCredits;
 | 
			
		||||
@ -133,6 +142,9 @@ const processContribution = (
 | 
			
		||||
                ItemType: ingredientContribution.ItemType,
 | 
			
		||||
                ItemCount: ingredientContribution.ItemCount * -1
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            guildMember.MiscItemsContributed ??= [];
 | 
			
		||||
            guildMember.MiscItemsContributed.push(ingredientContribution);
 | 
			
		||||
        }
 | 
			
		||||
        addMiscItems(inventory, miscItemChanges);
 | 
			
		||||
        inventoryChanges.MiscItems = miscItemChanges;
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,4 @@
 | 
			
		||||
import { GuildMember } from "@/src/models/guildModel";
 | 
			
		||||
import { getGuildForRequestEx } from "@/src/services/guildService";
 | 
			
		||||
import { addFusionTreasures, addMiscItems, addShipDecorations, getInventory } from "@/src/services/inventoryService";
 | 
			
		||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
			
		||||
@ -8,23 +9,34 @@ export const contributeToVaultController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const accountId = await getAccountIdForRequest(req);
 | 
			
		||||
    const inventory = await getInventory(accountId);
 | 
			
		||||
    const guild = await getGuildForRequestEx(req, inventory);
 | 
			
		||||
    const guildMember = (await GuildMember.findOne(
 | 
			
		||||
        { accountId, guildId: guild._id },
 | 
			
		||||
        "RegularCreditsContributed MiscItemsContributed ShipDecorationsContributed"
 | 
			
		||||
    ))!;
 | 
			
		||||
    const request = JSON.parse(String(req.body)) as IContributeToVaultRequest;
 | 
			
		||||
 | 
			
		||||
    if (request.RegularCredits) {
 | 
			
		||||
        guild.VaultRegularCredits ??= 0;
 | 
			
		||||
        guild.VaultRegularCredits += request.RegularCredits;
 | 
			
		||||
 | 
			
		||||
        guildMember.RegularCreditsContributed ??= 0;
 | 
			
		||||
        guildMember.RegularCreditsContributed += request.RegularCredits;
 | 
			
		||||
    }
 | 
			
		||||
    if (request.MiscItems.length) {
 | 
			
		||||
        guild.VaultMiscItems ??= [];
 | 
			
		||||
        guildMember.MiscItemsContributed ??= [];
 | 
			
		||||
        for (const item of request.MiscItems) {
 | 
			
		||||
            guild.VaultMiscItems.push(item);
 | 
			
		||||
            guildMember.MiscItemsContributed.push(item);
 | 
			
		||||
            addMiscItems(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (request.ShipDecorations.length) {
 | 
			
		||||
        guild.VaultShipDecorations ??= [];
 | 
			
		||||
        guildMember.ShipDecorationsContributed ??= [];
 | 
			
		||||
        for (const item of request.ShipDecorations) {
 | 
			
		||||
            guild.VaultShipDecorations.push(item);
 | 
			
		||||
            guildMember.ShipDecorationsContributed.push(item);
 | 
			
		||||
            addShipDecorations(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -38,6 +50,7 @@ export const contributeToVaultController: RequestHandler = async (req, res) => {
 | 
			
		||||
 | 
			
		||||
    await guild.save();
 | 
			
		||||
    await inventory.save();
 | 
			
		||||
    await guildMember.save();
 | 
			
		||||
    res.end();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,4 @@
 | 
			
		||||
import { GuildMember } from "@/src/models/guildModel";
 | 
			
		||||
import { getDojoClient, getGuildForRequestEx, hasAccessToDojo, scaleRequiredCount } from "@/src/services/guildService";
 | 
			
		||||
import { getInventory, updateCurrency } from "@/src/services/inventoryService";
 | 
			
		||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
			
		||||
@ -48,6 +49,12 @@ export const dojoComponentRushController: RequestHandler = async (req, res) => {
 | 
			
		||||
 | 
			
		||||
    await guild.save();
 | 
			
		||||
    await inventory.save();
 | 
			
		||||
 | 
			
		||||
    const guildMember = (await GuildMember.findOne({ accountId, guildId: guild._id }, "PremiumCreditsContributed"))!;
 | 
			
		||||
    guildMember.PremiumCreditsContributed ??= 0;
 | 
			
		||||
    guildMember.PremiumCreditsContributed += request.Amount;
 | 
			
		||||
    await guildMember.save();
 | 
			
		||||
 | 
			
		||||
    res.json({
 | 
			
		||||
        ...(await getDojoClient(guild, 0, component._id)),
 | 
			
		||||
        InventoryChanges: inventoryChanges
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										18
									
								
								src/controllers/api/getGuildContributionsController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/controllers/api/getGuildContributionsController.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,18 @@
 | 
			
		||||
import { GuildMember } from "@/src/models/guildModel";
 | 
			
		||||
import { getInventory } from "@/src/services/inventoryService";
 | 
			
		||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
			
		||||
import { RequestHandler } from "express";
 | 
			
		||||
 | 
			
		||||
export const getGuildContributionsController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const accountId = await getAccountIdForRequest(req);
 | 
			
		||||
    const guildId = (await getInventory(accountId, "GuildId")).GuildId;
 | 
			
		||||
    const guildMember = (await GuildMember.findOne({ guildId, accountId: req.query.buddyId }))!;
 | 
			
		||||
    res.json({
 | 
			
		||||
        _id: { $oid: req.query.buddyId },
 | 
			
		||||
        RegularCreditsContributed: guildMember.RegularCreditsContributed,
 | 
			
		||||
        PremiumCreditsContributed: guildMember.PremiumCreditsContributed,
 | 
			
		||||
        MiscItemsContributed: guildMember.MiscItemsContributed,
 | 
			
		||||
        ConsumablesContributed: [], // ???
 | 
			
		||||
        ShipDecorationsContributed: guildMember.ShipDecorationsContributed
 | 
			
		||||
    });
 | 
			
		||||
};
 | 
			
		||||
@ -21,7 +21,7 @@ import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
			
		||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
			
		||||
import { config } from "@/src/services/configService";
 | 
			
		||||
import { GuildPermission, ITechProjectClient, ITechProjectDatabase } from "@/src/types/guildTypes";
 | 
			
		||||
import { TGuildDatabaseDocument } from "@/src/models/guildModel";
 | 
			
		||||
import { GuildMember, TGuildDatabaseDocument } from "@/src/models/guildModel";
 | 
			
		||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
 | 
			
		||||
import { logger } from "@/src/utils/logger";
 | 
			
		||||
 | 
			
		||||
@ -90,6 +90,12 @@ export const guildTechController: RequestHandler = async (req, res) => {
 | 
			
		||||
            res.status(400).send("-1").end();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const guildMember = (await GuildMember.findOne(
 | 
			
		||||
            { accountId, guildId: guild._id },
 | 
			
		||||
            "RegularCreditsContributed MiscItemsContributed"
 | 
			
		||||
        ))!;
 | 
			
		||||
 | 
			
		||||
        const contributions = data;
 | 
			
		||||
        const techProject = guild.TechProjects!.find(x => x.ItemType == contributions.RecipeType)!;
 | 
			
		||||
 | 
			
		||||
@ -106,6 +112,9 @@ export const guildTechController: RequestHandler = async (req, res) => {
 | 
			
		||||
        }
 | 
			
		||||
        techProject.ReqCredits -= contributions.RegularCredits;
 | 
			
		||||
 | 
			
		||||
        guildMember.RegularCreditsContributed ??= 0;
 | 
			
		||||
        guildMember.RegularCreditsContributed += contributions.RegularCredits;
 | 
			
		||||
 | 
			
		||||
        if (contributions.VaultMiscItems.length) {
 | 
			
		||||
            for (const miscItem of contributions.VaultMiscItems) {
 | 
			
		||||
                const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType);
 | 
			
		||||
@ -133,6 +142,9 @@ export const guildTechController: RequestHandler = async (req, res) => {
 | 
			
		||||
                    ItemType: miscItem.ItemType,
 | 
			
		||||
                    ItemCount: miscItem.ItemCount * -1
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                guildMember.MiscItemsContributed ??= [];
 | 
			
		||||
                guildMember.MiscItemsContributed.push(miscItem);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        addMiscItems(inventory, miscItemChanges);
 | 
			
		||||
@ -151,6 +163,7 @@ export const guildTechController: RequestHandler = async (req, res) => {
 | 
			
		||||
 | 
			
		||||
        await guild.save();
 | 
			
		||||
        await inventory.save();
 | 
			
		||||
        await guildMember.save();
 | 
			
		||||
        res.json({
 | 
			
		||||
            InventoryChanges: inventoryChanges,
 | 
			
		||||
            Vault: getGuildVault(guild)
 | 
			
		||||
 | 
			
		||||
@ -215,7 +215,11 @@ const guildMemberSchema = new Schema<IGuildMemberDatabase>({
 | 
			
		||||
    accountId: Types.ObjectId,
 | 
			
		||||
    guildId: Types.ObjectId,
 | 
			
		||||
    status: { type: Number, required: true },
 | 
			
		||||
    rank: { type: Number, default: 7 }
 | 
			
		||||
    rank: { type: Number, default: 7 },
 | 
			
		||||
    RegularCreditsContributed: Number,
 | 
			
		||||
    PremiumCreditsContributed: Number,
 | 
			
		||||
    MiscItemsContributed: { type: [typeCountSchema], default: undefined },
 | 
			
		||||
    ShipDecorationsContributed: { type: [typeCountSchema], default: undefined }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
guildMemberSchema.index({ accountId: 1, guildId: 1 }, { unique: true });
 | 
			
		||||
 | 
			
		||||
@ -42,6 +42,7 @@ import { genericUpdateController } from "@/src/controllers/api/genericUpdateCont
 | 
			
		||||
import { getAllianceController } from "@/src/controllers/api/getAllianceController";
 | 
			
		||||
import { getDailyDealStockLevelsController } from "@/src/controllers/api/getDailyDealStockLevelsController";
 | 
			
		||||
import { getFriendsController } from "@/src/controllers/api/getFriendsController";
 | 
			
		||||
import { getGuildContributionsController } from "@/src/controllers/api/getGuildContributionsController";
 | 
			
		||||
import { getGuildController } from "@/src/controllers/api/getGuildController";
 | 
			
		||||
import { getGuildDojoController } from "@/src/controllers/api/getGuildDojoController";
 | 
			
		||||
import { getGuildLogController } from "@/src/controllers/api/getGuildLogController";
 | 
			
		||||
@ -139,6 +140,7 @@ apiRouter.get("/drones.php", dronesController);
 | 
			
		||||
apiRouter.get("/getDailyDealStockLevels.php", getDailyDealStockLevelsController);
 | 
			
		||||
apiRouter.get("/getFriends.php", getFriendsController);
 | 
			
		||||
apiRouter.get("/getGuild.php", getGuildController);
 | 
			
		||||
apiRouter.get("/getGuildContributions.php", getGuildContributionsController);
 | 
			
		||||
apiRouter.get("/getGuildDojo.php", getGuildDojoController);
 | 
			
		||||
apiRouter.get("/getGuildLog.php", getGuildLogController);
 | 
			
		||||
apiRouter.get("/getIgnoredUsers.php", getIgnoredUsersController);
 | 
			
		||||
 | 
			
		||||
@ -58,12 +58,7 @@ export const getGuildClient = async (guild: TGuildDatabaseDocument, accountId: s
 | 
			
		||||
        if (guildMember.accountId.equals(accountId)) {
 | 
			
		||||
            missingEntry = false;
 | 
			
		||||
        } else {
 | 
			
		||||
            member.DisplayName = (await Account.findOne(
 | 
			
		||||
                {
 | 
			
		||||
                    _id: guildMember.accountId
 | 
			
		||||
                },
 | 
			
		||||
                "DisplayName"
 | 
			
		||||
            ))!.DisplayName;
 | 
			
		||||
            member.DisplayName = (await Account.findById(guildMember.accountId, "DisplayName"))!.DisplayName;
 | 
			
		||||
            await fillInInventoryDataForGuildMember(member);
 | 
			
		||||
        }
 | 
			
		||||
        members.push(member);
 | 
			
		||||
 | 
			
		||||
@ -88,6 +88,10 @@ export interface IGuildMemberDatabase {
 | 
			
		||||
    guildId: Types.ObjectId;
 | 
			
		||||
    status: number;
 | 
			
		||||
    rank: number;
 | 
			
		||||
    RegularCreditsContributed?: number;
 | 
			
		||||
    PremiumCreditsContributed?: number;
 | 
			
		||||
    MiscItemsContributed?: IMiscItem[];
 | 
			
		||||
    ShipDecorationsContributed?: ITypeCount[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface IGuildMemberClient {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user