+24
-3
src/commands/utilities/ai.ts
+24
-3
src/commands/utilities/ai.ts
···
390
390
const client = await pool.connect();
391
391
try {
392
392
await client.query('BEGIN');
393
+
394
+
const voteCheck = await client.query(
395
+
`SELECT vote_timestamp FROM votes
396
+
WHERE user_id = $1
397
+
AND vote_timestamp > NOW() - INTERVAL '24 hours'
398
+
ORDER BY vote_timestamp DESC
399
+
LIMIT 1`,
400
+
[userId]
401
+
);
402
+
403
+
const hasVotedRecently = voteCheck.rows.length > 0;
404
+
const effectiveLimit = hasVotedRecently ? limit + 10 : limit;
405
+
393
406
await client.query('INSERT INTO users (user_id) VALUES ($1) ON CONFLICT (user_id) DO NOTHING', [
394
407
userId,
395
408
]);
409
+
396
410
const res = await client.query(
397
-
`INSERT INTO ai_usage (user_id, usage_date, count) VALUES ($1, $2, 1)
398
-
ON CONFLICT (user_id, usage_date) DO UPDATE SET count = ai_usage.count + 1 RETURNING count`,
411
+
`INSERT INTO ai_usage (user_id, usage_date, count)
412
+
VALUES ($1, $2, 1)
413
+
ON CONFLICT (user_id, usage_date)
414
+
DO UPDATE SET count = ai_usage.count + 1
415
+
RETURNING count`,
399
416
[userId, today],
400
417
);
418
+
401
419
await client.query('COMMIT');
402
-
return res.rows[0].count <= limit;
420
+
421
+
return res.rows[0].count <= effectiveLimit;
422
+
403
423
} catch (err) {
404
424
await client.query('ROLLBACK');
425
+
console.error('Error in incrementAndCheckDailyLimit:', err);
405
426
throw err;
406
427
} finally {
407
428
client.release();
+1
-1
src/utils/topgg.ts
+1
-1
src/utils/topgg.ts
···
6
6
const now = new Date();
7
7
const nextVote = new Date(now.getTime() + VOTE_COOLDOWN_HOURS * 60 * 60 * 1000);
8
8
9
-
console.log(`Vote recorded for user ${userId}. Next vote available at ${nextVote.toISOString()}`);
9
+
console.log(`Vote check for user ${userId}. Next vote available at ${nextVote.toISOString()}`);
10
10
11
11
return {
12
12
hasVoted: true,
+77
-18
src/utils/voteManager.ts
+77
-18
src/utils/voteManager.ts
···
150
150
151
151
await client.query(
152
152
`INSERT INTO message_credits (user_id, credits_remaining, last_reset)
153
-
VALUES ($1, $2, NOW())
154
-
ON CONFLICT (user_id) WHERE server_id IS NULL
155
-
DO UPDATE SET
156
-
credits_remaining = message_credits.credits_remaining + $2,
157
-
last_reset = NOW()
158
-
RETURNING credits_remaining`,
153
+
VALUES ($1, $2, NOW())
154
+
ON CONFLICT (user_id)
155
+
DO UPDATE SET
156
+
credits_remaining = message_credits.credits_remaining + EXCLUDED.credits_remaining,
157
+
last_reset = NOW()
158
+
RETURNING credits_remaining`,
159
159
[userId, VOTE_CREDITS],
160
160
);
161
+
162
+
console.log(`Added ${VOTE_CREDITS} credits to user ${userId} (global)`);
161
163
162
164
const clientBot = new Client({
163
165
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers],
···
179
181
await client.query(
180
182
`INSERT INTO message_credits (user_id, server_id, credits_remaining, last_reset)
181
183
VALUES ($1, $2, $3, NOW())
182
-
ON CONFLICT (user_id, server_id) WHERE server_id IS NOT NULL
184
+
ON CONFLICT (user_id, server_id)
183
185
DO UPDATE SET
184
186
credits_remaining = message_credits.credits_remaining + $3,
185
187
last_reset = NOW()
186
188
RETURNING credits_remaining`,
187
189
[userId, guild.id, VOTE_CREDITS],
188
190
);
191
+
console.log(`Added ${VOTE_CREDITS} credits to user ${userId} in server ${guild.id}`);
189
192
}
190
193
} catch (error) {
191
194
console.error(`Error processing guild ${guild.id}:`, error);
···
199
202
clientBot.destroy().catch(console.error);
200
203
}
201
204
205
+
await client.query(
206
+
`INSERT INTO ai_usage (user_id, usage_date, count)
207
+
VALUES ($1, CURRENT_DATE, 10)
208
+
ON CONFLICT (user_id, usage_date)
209
+
DO UPDATE SET
210
+
count = GREATEST(0, ai_usage.count) + 10
211
+
RETURNING count`,
212
+
[userId]
213
+
);
214
+
215
+
console.log(`Added 10 AI usage credits to user ${userId}`);
216
+
217
+
try {
218
+
const clientBot = new Client({
219
+
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.MessageContent],
220
+
});
221
+
222
+
await clientBot.login(process.env.TOKEN);
223
+
const user = await clientBot.users.fetch(userId);
224
+
225
+
if (user) {
226
+
const nextVoteTime = Math.floor((Date.now() + 12 * 60 * 60 * 1000) / 1000);
227
+
await user.send(
228
+
`🎉 **Thank you for voting for Aethel!**\n` +
229
+
`\n` +
230
+
`You've received **+10 AI message credits** for today!\n` +
231
+
`\n` +
232
+
`You can vote again <t:${nextVoteTime}:R>\n` +
233
+
`\n` +
234
+
`Thank you for your support! ❤️`
235
+
).catch(console.error);
236
+
}
237
+
238
+
clientBot.destroy().catch(console.error);
239
+
} catch (error) {
240
+
console.error('Failed to send vote thank you DM:', error);
241
+
}
242
+
202
243
await client.query('COMMIT');
203
244
204
245
return {
···
242
283
243
284
export async function canUseAIFeature(
244
285
userId: string,
245
-
serverId?: string,
286
+
_serverId?: string, // Prefix with underscore to indicate intentionally unused
246
287
): Promise<{ canUse: boolean; remainingCredits: number }> {
288
+
const client = await pool.connect();
247
289
try {
248
-
const credits = await getRemainingCredits(userId, serverId);
249
-
if (credits.remaining > 0) {
250
-
const updateQuery = serverId
251
-
? 'UPDATE message_credits SET credits_remaining = credits_remaining - 1 WHERE user_id = $1 AND server_id = $2 RETURNING credits_remaining'
252
-
: 'UPDATE message_credits SET credits_remaining = credits_remaining - 1 WHERE user_id = $1 AND server_id IS NULL RETURNING credits_remaining';
253
-
254
-
const result = await pool.query(updateQuery, [userId, serverId].filter(Boolean));
255
-
290
+
await client.query('BEGIN');
291
+
292
+
const result = await client.query(
293
+
`SELECT count FROM ai_usage
294
+
WHERE user_id = $1 AND usage_date = CURRENT_DATE
295
+
FOR UPDATE`,
296
+
[userId]
297
+
);
298
+
299
+
if (result.rows.length > 0 && result.rows[0].count > 0) {
300
+
const updateResult = await client.query(
301
+
`UPDATE ai_usage
302
+
SET count = count - 1
303
+
WHERE user_id = $1 AND usage_date = CURRENT_DATE
304
+
RETURNING count`,
305
+
[userId]
306
+
);
307
+
308
+
await client.query('COMMIT');
309
+
256
310
return {
257
311
canUse: true,
258
-
remainingCredits: result.rows[0]?.credits_remaining || 0,
312
+
remainingCredits: updateResult.rows[0]?.count || 0,
259
313
};
260
314
}
261
-
315
+
316
+
await client.query('COMMIT');
317
+
262
318
return {
263
319
canUse: false,
264
320
remainingCredits: 0,
265
321
};
266
322
} catch (error) {
323
+
await client.query('ROLLBACK');
267
324
console.error('Error checking AI feature usage:', error);
268
325
throw new Error('Failed to check AI feature usage');
326
+
} finally {
327
+
client.release();
269
328
}
270
329
}