Aethel Bot OSS repository! aethel.xyz
bot fun ai discord discord-bot aethel

sure

Changed files
+102 -22
src
commands
utilities
utils
+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
··· 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
··· 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 }