forked from BigMichi1/IdleCodeRedeemer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcodeManager.ts
More file actions
130 lines (112 loc) · 3.63 KB
/
Copy pathcodeManager.ts
File metadata and controls
130 lines (112 loc) · 3.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import { db } from './db';
interface RedeemedCode {
code: string;
discordId?: string;
status?: string;
lootDetail?: string;
isPublic?: boolean;
expiresAt?: string;
}
interface RedeemedCodeRow {
id: number;
code: string;
discord_id: string;
redeemed_at: string;
status: string;
loot_detail: string;
is_public: number;
expires_at: string | null;
}
class CodeManager {
async addRedeemedCode(
code: string,
discordId: string,
status: string,
lootDetail?: string,
isPublic: boolean = false
): Promise<void> {
await db.run(
`INSERT OR REPLACE INTO redeemed_codes (code, discord_id, status, loot_detail, is_public)
VALUES (?, ?, ?, ?, ?)`,
[code, discordId, status, lootDetail ? JSON.stringify(lootDetail) : null, isPublic ? 1 : 0]
);
}
async isCodeRedeemed(code: string): Promise<boolean> {
const result = await db.get('SELECT code FROM redeemed_codes WHERE code = ?', [code]);
return result !== undefined;
}
async getRedeemedCodes(discordId: string): Promise<string[]> {
const results = await db.all<{ code: string }>(
'SELECT code FROM redeemed_codes WHERE discord_id = ? ORDER BY redeemed_at DESC LIMIT 100',
[discordId]
);
return results.map((r) => r.code);
}
async getRedeemedCodeDetails(discordId: string, limit: number = 10): Promise<RedeemedCodeRow[]> {
const results = await db.all<RedeemedCodeRow>(
`SELECT id, code, discord_id, redeemed_at, status, loot_detail, is_public, expires_at
FROM redeemed_codes
WHERE discord_id = ?
ORDER BY redeemed_at DESC
LIMIT ?`,
[discordId, limit]
);
return results;
}
async getPublicUnexpiredCodes(): Promise<RedeemedCodeRow[]> {
const results = await db.all<RedeemedCodeRow>(
`SELECT id, code, discord_id, redeemed_at, status, loot_detail, is_public, expires_at
FROM redeemed_codes
WHERE is_public = 1
AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
AND status = 'success'
ORDER BY redeemed_at DESC`,
[]
);
return results;
}
async isCodeExpired(code: string): Promise<boolean> {
const result = await db.get('SELECT code FROM redeemed_codes WHERE code = ? AND status = ?', [
code,
'Code Expired',
]);
return result !== undefined;
}
async markCodeAsExpired(code: string): Promise<void> {
await db.run(
"UPDATE redeemed_codes SET status = 'expired', expires_at = CURRENT_TIMESTAMP WHERE code = ?",
[code]
);
}
async markCodeAsPublic(code: string): Promise<void> {
await db.run('UPDATE redeemed_codes SET is_public = 1 WHERE code = ?', [code]);
}
async addPendingCode(code: string, discordId?: string): Promise<void> {
await db.run('INSERT INTO pending_codes (code, discord_id) VALUES (?, ?)', [
code,
discordId || null,
]);
}
async getPendingCodes(discordId?: string): Promise<string[]> {
let sql = 'SELECT code FROM pending_codes';
let params: any[] = [];
if (discordId) {
sql += ' WHERE discord_id = ?';
params = [discordId];
}
sql += ' ORDER BY found_at ASC';
const results = await db.all<{ code: string }>(sql, params);
return results.map((r) => r.code);
}
async removePendingCode(code: string): Promise<void> {
await db.run('DELETE FROM pending_codes WHERE code = ?', [code]);
}
async clearPendingCodes(discordId?: string): Promise<void> {
if (discordId) {
await db.run('DELETE FROM pending_codes WHERE discord_id = ?', [discordId]);
} else {
await db.run('DELETE FROM pending_codes');
}
}
}
export const codeManager = new CodeManager();