feat: race leaderboards #1314
@ -34,23 +34,26 @@ export const getLeaderboard = async (
 | 
				
			|||||||
    guildId?: string,
 | 
					    guildId?: string,
 | 
				
			||||||
    pivotId?: string
 | 
					    pivotId?: string
 | 
				
			||||||
): Promise<ILeaderboardEntryClient[]> => {
 | 
					): Promise<ILeaderboardEntryClient[]> => {
 | 
				
			||||||
 | 
					    const filter: { leaderboard: string; guildId?: string } = { leaderboard };
 | 
				
			||||||
 | 
					    if (guildId) {
 | 
				
			||||||
 | 
					        filter.guildId = guildId;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let entries: TLeaderboardEntryDocument[];
 | 
					    let entries: TLeaderboardEntryDocument[];
 | 
				
			||||||
    let r: number;
 | 
					    let r: number;
 | 
				
			||||||
    if (pivotId) {
 | 
					    if (pivotId) {
 | 
				
			||||||
        const pivotDoc = await Leaderboard.findOne({ leaderboard, guildId, ownerId: pivotId });
 | 
					        const pivotDoc = await Leaderboard.findOne({ ...filter, ownerId: pivotId });
 | 
				
			||||||
        if (!pivotDoc) {
 | 
					        if (!pivotDoc) {
 | 
				
			||||||
            return [];
 | 
					            return [];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        const beforeDocs = await Leaderboard.find({
 | 
					        const beforeDocs = await Leaderboard.find({
 | 
				
			||||||
            leaderboard,
 | 
					            ...filter,
 | 
				
			||||||
            guildId,
 | 
					 | 
				
			||||||
            score: { $gt: pivotDoc.score }
 | 
					            score: { $gt: pivotDoc.score }
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
            .sort({ score: 1 })
 | 
					            .sort({ score: 1 })
 | 
				
			||||||
            .limit(before);
 | 
					            .limit(before);
 | 
				
			||||||
        const afterDocs = await Leaderboard.find({
 | 
					        const afterDocs = await Leaderboard.find({
 | 
				
			||||||
            leaderboard,
 | 
					            ...filter,
 | 
				
			||||||
            guildId,
 | 
					 | 
				
			||||||
            score: { $lt: pivotDoc.score }
 | 
					            score: { $lt: pivotDoc.score }
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
            .sort({ score: -1 })
 | 
					            .sort({ score: -1 })
 | 
				
			||||||
@ -58,12 +61,11 @@ export const getLeaderboard = async (
 | 
				
			|||||||
        entries = [...beforeDocs.reverse(), pivotDoc, ...afterDocs];
 | 
					        entries = [...beforeDocs.reverse(), pivotDoc, ...afterDocs];
 | 
				
			||||||
        r =
 | 
					        r =
 | 
				
			||||||
            (await Leaderboard.countDocuments({
 | 
					            (await Leaderboard.countDocuments({
 | 
				
			||||||
                leaderboard,
 | 
					                ...filter,
 | 
				
			||||||
                guildId,
 | 
					 | 
				
			||||||
                score: { $gt: pivotDoc.score }
 | 
					                score: { $gt: pivotDoc.score }
 | 
				
			||||||
            })) - beforeDocs.length;
 | 
					            })) - beforeDocs.length;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        entries = await Leaderboard.find({ leaderboard, guildId })
 | 
					        entries = await Leaderboard.find(filter)
 | 
				
			||||||
            .sort({ score: -1 })
 | 
					            .sort({ score: -1 })
 | 
				
			||||||
            .skip(before)
 | 
					            .skip(before)
 | 
				
			||||||
            .limit(after - before);
 | 
					            .limit(after - before);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user