2025-08-25 13:37:14 -07:00
import { Alliance , AllianceMember , Guild , GuildMember } from "../../models/guildModel.ts" ;
import { getAccountForRequest } from "../../services/loginService.ts" ;
import { GuildPermission } from "../../types/guildTypes.ts" ;
import { parallelForeach } from "../../utils/async-utils.ts" ;
import { logger } from "../../utils/logger.ts" ;
2025-08-24 21:41:20 -07:00
import type { RequestHandler } from "express" ;
2025-04-04 06:03:12 -07:00
export const divvyAllianceVaultController : RequestHandler = async ( req , res ) = > {
// Afaict, there's no way to put anything other than credits in the alliance vault (anymore?), so just no-op if this is not a request to divvy credits.
if ( req . query . credits == "1" ) {
// Check requester is a warlord in their guild
const account = await getAccountForRequest ( req ) ;
const guildMember = ( await GuildMember . findOne ( { accountId : account._id , status : 0 } ) ) ! ;
if ( guildMember . rank > 1 ) {
res . status ( 400 ) . end ( ) ;
return ;
}
// Check guild has treasurer permissions in the alliance
const allianceMember = ( await AllianceMember . findOne ( {
allianceId : req.query.allianceId ,
guildId : guildMember.guildId
} ) ) ! ;
if ( ! ( allianceMember . Permissions & GuildPermission . Treasurer ) ) {
res . status ( 400 ) . end ( ) ;
return ;
}
const allianceMembers = await AllianceMember . find ( { allianceId : req.query.allianceId } ) ;
const memberCounts : Record < string , number > = { } ;
let totalMembers = 0 ;
await parallelForeach ( allianceMembers , async allianceMember = > {
const memberCount = await GuildMember . countDocuments ( {
guildId : allianceMember.guildId
} ) ;
memberCounts [ allianceMember . guildId . toString ( ) ] = memberCount ;
totalMembers += memberCount ;
} ) ;
logger . debug ( ` alliance has ${ totalMembers } members between all its clans ` ) ;
const alliance = ( await Alliance . findById ( allianceMember . allianceId , "VaultRegularCredits" ) ) ! ;
if ( alliance . VaultRegularCredits ) {
let creditsHandedOutInTotal = 0 ;
await parallelForeach ( allianceMembers , async allianceMember = > {
const memberCount = memberCounts [ allianceMember . guildId . toString ( ) ] ;
const cutPercentage = memberCount / totalMembers ;
const creditsToHandOut = Math . trunc ( alliance . VaultRegularCredits ! * cutPercentage ) ;
logger . debug (
` ${ allianceMember . guildId . toString ( ) } has ${ memberCount } member(s) = ${ Math . trunc ( cutPercentage * 100 ) } % of alliance; giving ${ creditsToHandOut } credit(s) `
) ;
if ( creditsToHandOut != 0 ) {
await Guild . updateOne (
{ _id : allianceMember.guildId } ,
{ $inc : { VaultRegularCredits : creditsToHandOut } }
) ;
creditsHandedOutInTotal += creditsToHandOut ;
}
} ) ;
alliance . VaultRegularCredits -= creditsHandedOutInTotal ;
logger . debug (
` handed out ${ creditsHandedOutInTotal } credits; alliance vault now has ${ alliance . VaultRegularCredits } credit(s) `
) ;
}
await alliance . save ( ) ;
}
res . end ( ) ;
} ;