Skip to content

Commit b562428

Browse files
committed
Include tracking of current players in the queue descriptor.
This should allow us to hit the max player limit and automatically remove the queue descriptor and start bringing in team arrays. For now, let's just assume teams are randomized always with no captains.
1 parent ef7cbf8 commit b562428

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

src/routes/queue.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,10 +329,20 @@ router.put('/:slug', Utils.ensureAuthenticated, async (req, res) => {
329329
const action: string = req.body[0].action ? req.body[0].action : 'join';
330330

331331
try {
332+
let currentQueueCount: number = await QueueService.getCurrentQueuePlayerCount(slug);
333+
let maxQueueCount: number = await QueueService.getCurrentQueueMaxCount(slug);
332334
if (action === 'join') {
333335
await QueueService.addUserToQueue(slug, req.user?.steam_id!);
336+
if (currentQueueCount == maxQueueCount) {
337+
// TODO: Add in logic to create teams, or create a new queue with users' steam IDs and queue ID
338+
// to get ready to shuffle teams.
339+
}
334340
} else if (action === 'leave') {
335341
await QueueService.removeUserFromQueue(slug, req.user?.steam_id!, req.user?.steam_id!);
342+
if (currentQueueCount == 0) {
343+
// If no users are left in the queue, delete it.
344+
await QueueService.deleteQueue(slug, req.user?.steam_id!, 'admin');
345+
}
336346
} else {
337347
return res.status(400).json({ error: 'Invalid action. Must be "join" or "leave".' });
338348
}

src/services/queue.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const DEFAULT_TTL_SECONDS: number = config.get("server.queueTTL") == 0 ? 3600 :
99

1010
export class QueueService {
1111

12-
static async createQueue(ownerId?: string, maxPlayers: number = 10, isPrivate: boolean = false, ttlSeconds: number = DEFAULT_TTL_SECONDS): Promise<QueueDescriptor> {
12+
static async createQueue(ownerId: string, maxPlayers: number = 10, isPrivate: boolean = false, ttlSeconds: number = DEFAULT_TTL_SECONDS): Promise<QueueDescriptor> {
1313
let slug: string;
1414
let key: string;
1515
let attempts: number = 0;
@@ -37,13 +37,16 @@ export class QueueService {
3737
expiresAt,
3838
ownerId,
3939
maxSize: maxPlayers,
40-
isPrivate: isPrivate
40+
isPrivate: isPrivate,
41+
currentPlayers: 1
4142
};
4243

4344
await redis.sAdd('queues', slug);
4445
await redis.expire(key, ttlSeconds);
4546
await redis.set(`queue-meta:${slug}`, JSON.stringify(descriptor), { EX: ttlSeconds });
4647

48+
await this.addUserToQueue(slug, ownerId);
49+
4750
return descriptor;
4851
}
4952

@@ -100,6 +103,7 @@ export class QueueService {
100103
};
101104

102105
await redis.rPush(key, JSON.stringify(item));
106+
meta.currentPlayers += 1;
103107
}
104108

105109
static async removeUserFromQueue(
@@ -125,6 +129,7 @@ export class QueueService {
125129
const parsed = JSON.parse(item);
126130
if (parsed.steamId === steamId) {
127131
await redis.lRem(key, 1, item);
132+
meta.currentPlayers -= 1;
128133
return true;
129134
}
130135
}
@@ -169,6 +174,16 @@ export class QueueService {
169174
throw new Error('You do not have permission to remove other users from this queue.');
170175
}
171176

177+
static async getCurrentQueuePlayerCount(slug: string): Promise<number> {
178+
const meta = await getQueueMetaOrThrow(slug);
179+
return meta.currentPlayers;
180+
}
181+
182+
static async getCurrentQueueMaxCount(slug: string): Promise<number> {
183+
const meta = await getQueueMetaOrThrow(slug);
184+
return meta.maxSize;
185+
}
186+
172187
}
173188

174189
async function getQueueMetaOrThrow(slug: string): Promise<QueueDescriptor> {

src/types/queues/QueueDescriptor.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export interface QueueDescriptor {
33
createdAt: number; // Timestamp (ms) when queue was created
44
expiresAt: number; // Timestamp (ms) when queue will expire
55
ownerId?: string; // Optional user ID of the queue creator
6-
maxSize?: number; // Optional max number of users allowed
6+
maxSize: number; // Max number of players allowed in the queue
77
isPrivate?: boolean; // Optional flag for visibility
8+
currentPlayers: number; // Current number of players in the queue
89
}

0 commit comments

Comments
 (0)