forked from BigMichi1/IdleCodeRedeemer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetup.ts
More file actions
169 lines (152 loc) · 6.24 KB
/
setup.ts
File metadata and controls
169 lines (152 loc) · 6.24 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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import {
SlashCommandBuilder,
ChatInputCommandInteraction,
EmbedBuilder,
MessageFlags,
} from 'discord.js';
import { userManager } from '../database/userManager';
import { codeManager } from '../database/codeManager';
import IdleChampionsApi from '../api/idleChampionsApi';
export const data = new SlashCommandBuilder()
.setName('setup')
.setDescription('Save your Idle Champions credentials securely')
.addStringOption((option) =>
option.setName('user_id').setDescription('Your Idle Champions User ID').setRequired(true)
)
.addStringOption((option) =>
option.setName('user_hash').setDescription('Your Idle Champions User Hash').setRequired(true)
);
export async function execute(interaction: ChatInputCommandInteraction) {
try {
console.log('[SETUP] Deferring reply...');
await interaction.deferReply({ flags: MessageFlags.Ephemeral });
console.log('[SETUP] Reply deferred');
const userId = interaction.options.getString('user_id', true);
const userHash = interaction.options.getString('user_hash', true);
console.log('[SETUP] Got credentials from options:', { userId, userHash });
// Save credentials
console.log('[SETUP] Saving credentials...');
await userManager.saveCredentials({
discordId: interaction.user.id,
userId,
userHash,
});
console.log('[SETUP] Credentials saved');
const embed = new EmbedBuilder()
.setColor(0x00ff00)
.setTitle('✅ Credentials Saved')
.setDescription('Your Idle Champions credentials have been saved securely.')
.addFields(
{
name: 'User ID',
value: userId.substring(0, 4) + '***' + userId.substring(userId.length - 4),
inline: true,
},
{
name: 'Hash',
value: userHash.substring(0, 4) + '***' + userHash.substring(userHash.length - 4),
inline: true,
}
)
.setFooter({ text: 'Your credentials are stored securely in our database.' });
// Try to auto-redeem public codes
console.log('[SETUP] Checking for public codes to auto-redeem...');
try {
const publicCodes = await codeManager.getPublicUnexpiredCodes();
if (publicCodes.length > 0) {
console.log(`[SETUP] Found ${publicCodes.length} public codes, attempting redemption...`);
// Get server
const server = await IdleChampionsApi.getServer();
if (!server) {
console.warn('[SETUP] Could not get server for auto-redemption');
} else {
await userManager.updateServer(interaction.user.id, server);
// Get user details to get instance_id
const userResult = await IdleChampionsApi.getUserDetails({
server,
user_id: userId,
hash: userHash,
});
const userData = userResult as any;
if (userData && userData.details) {
let successCount = 0;
const failedCodes: string[] = [];
// Try to redeem each public code
for (const publicCode of publicCodes) {
try {
const result = await IdleChampionsApi.submitCode({
server,
code: publicCode.code,
user_id: userId,
hash: userHash,
instanceId: userData.details.instance_id,
});
const redeemResult = result as any;
// Check if success (CodeSubmitResponse with codeStatus = 0, or success field)
const isSuccess =
(redeemResult.codeStatus !== undefined && redeemResult.codeStatus === 0) ||
(redeemResult.success && redeemResult.okay) ||
(redeemResult.status !== 1 && !redeemResult.codeStatus);
if (isSuccess) {
// Success - get loot details
const lootDetails = redeemResult.lootDetails || redeemResult.loot_detail;
await codeManager.addRedeemedCode(
publicCode.code,
interaction.user.id,
'success',
lootDetails,
false // Mark as private for this user
);
successCount++;
console.log(`[SETUP] Successfully redeemed public code: ${publicCode.code}`);
} else {
// Failed
const statusMsg =
redeemResult?.message ||
(redeemResult?.codeStatus !== undefined
? `Status ${redeemResult.codeStatus}`
: 'Unknown error');
if (statusMsg.toLowerCase().includes('expired')) {
await codeManager.markCodeAsExpired(publicCode.code);
}
failedCodes.push(publicCode.code);
console.log(
`[SETUP] Failed to redeem public code ${publicCode.code}: ${statusMsg}`
);
}
} catch (err) {
console.error(`[SETUP] Error redeeming public code ${publicCode.code}:`, err);
failedCodes.push(publicCode.code);
}
}
if (successCount > 0) {
embed.addFields({
name: '🎁 Auto-Redeemed Public Codes',
value: `Successfully redeemed ${successCount} public code${successCount === 1 ? '' : 's'}!`,
inline: false,
});
}
if (failedCodes.length > 0) {
embed.addFields({
name: '⚠️ Could Not Redeem',
value: `${failedCodes.length} code${failedCodes.length === 1 ? '' : 's'} could not be redeemed (expired or already used).`,
inline: false,
});
}
}
}
}
} catch (err) {
console.error('[SETUP] Error during auto-redemption:', err);
// Don't fail the setup if auto-redemption fails
}
console.log('[SETUP] Sending reply...');
await interaction.editReply({ embeds: [embed] });
console.log('[SETUP] Reply sent');
} catch (error) {
console.error('[SETUP COMMAND] Error:', error);
await interaction.editReply({
content: '❌ An error occurred while saving your credentials.',
});
}
}