iudd commited on
Commit
a05246c
·
1 Parent(s): 503f972

Add credit stats fetching and storage

Browse files
Files changed (3) hide show
  1. config.js +1 -0
  2. mindvideo-service.js +29 -20
  3. supabase-client.js +13 -7
config.js CHANGED
@@ -15,6 +15,7 @@ export const CONFIG = {
15
  MINDVIDEO_LOGIN_URL: "https://www.mindvideo.ai/zh/auth/signin/",
16
  MINDVIDEO_CHECKIN_API: "https://api.mindvideo.ai/api/checkin",
17
  MINDVIDEO_USER_INFO_API: "https://api.mindvideo.ai/api/user/info",
 
18
  SIGN_APP_KEY: "s#c_120*AB",
19
  USER_AGENT: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
20
 
 
15
  MINDVIDEO_LOGIN_URL: "https://www.mindvideo.ai/zh/auth/signin/",
16
  MINDVIDEO_CHECKIN_API: "https://api.mindvideo.ai/api/checkin",
17
  MINDVIDEO_USER_INFO_API: "https://api.mindvideo.ai/api/user/info",
18
+ MINDVIDEO_CREDITS_STATS_API: "https://api.mindvideo.ai/api/user/credits/stats",
19
  SIGN_APP_KEY: "s#c_120*AB",
20
  USER_AGENT: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
21
 
mindvideo-service.js CHANGED
@@ -218,17 +218,23 @@ export async function performCheckIn(token, email = 'unknown') {
218
 
219
  if (data.code === 0) {
220
  console.log(`✅ Check-in successful! Credits: ${data.data?.credits}, Days: ${data.data?.current_day}`);
 
 
 
 
221
  await logSystem('info', 'checkin', `Check-in successful for ${email}`, {
222
  credits: data.data?.credits,
223
  total: data.data?.total_credits,
224
- day: data.data?.current_day
 
225
  });
226
 
227
  return {
228
  success: true,
229
  credits: data.data?.credits,
230
  total: data.data?.total_credits,
231
- day: data.data?.current_day
 
232
  };
233
  } else {
234
  console.warn(`⚠️ Check-in failed: ${data.message}`);
@@ -242,14 +248,14 @@ export async function performCheckIn(token, email = 'unknown') {
242
  }
243
 
244
  /**
245
- * Get user information
246
  */
247
- export async function getUserInfo(token, email = 'unknown') {
248
- console.log(`🔍 Getting user info for ${email}...`);
249
 
250
  try {
251
  const signHeader = await generateSign();
252
- const response = await fetch(CONFIG.MINDVIDEO_USER_INFO_API, {
253
  method: 'GET',
254
  headers: {
255
  "accept": "application/json, text/plain, */*",
@@ -269,24 +275,19 @@ export async function getUserInfo(token, email = 'unknown') {
269
  try {
270
  data = JSON.parse(text);
271
  } catch (e) {
272
- console.warn(`⚠️ Invalid user info response`);
273
  return null;
274
  }
275
 
276
  if (data.code === 0 && data.data) {
277
- console.log(`✅ Credits: ${data.data.credits || 0}`);
278
- return {
279
- credits: data.data.credits || 0,
280
- email: data.data.email || null,
281
- nickname: data.data.nickname || null,
282
- avatar: data.data.avatar || null
283
- };
284
  } else {
285
- console.warn(`⚠️ Unable to get user info`);
286
  return null;
287
  }
288
  } catch (error) {
289
- console.warn(`⚠️ User info query failed: ${error.message}`);
290
  return null;
291
  }
292
  }
@@ -312,12 +313,19 @@ export async function refreshAccountToken(email, password) {
312
  return { success: false, email, message: 'Invalid token' };
313
  }
314
 
315
- // Save to database
316
- await updateAccountToken(email, token, tokenInfo.expireAt);
 
 
 
 
 
 
317
 
318
  await logSystem('info', 'refresh', `Token refreshed for ${email}`, {
319
  expireAt: tokenInfo.expireAt,
320
- isExpired: tokenInfo.isExpired
 
321
  });
322
 
323
  console.log(`✅ Token refreshed and saved to database`);
@@ -328,7 +336,8 @@ export async function refreshAccountToken(email, password) {
328
  email,
329
  token,
330
  expireAt: tokenInfo.expireAt,
331
- isExpired: tokenInfo.isExpired
 
332
  };
333
 
334
  } catch (error) {
 
218
 
219
  if (data.code === 0) {
220
  console.log(`✅ Check-in successful! Credits: ${data.data?.credits}, Days: ${data.data?.current_day}`);
221
+
222
+ // Also fetch latest stats to update DB
223
+ const stats = await getUserCreditsStats(token, email);
224
+
225
  await logSystem('info', 'checkin', `Check-in successful for ${email}`, {
226
  credits: data.data?.credits,
227
  total: data.data?.total_credits,
228
+ day: data.data?.current_day,
229
+ stats: stats
230
  });
231
 
232
  return {
233
  success: true,
234
  credits: data.data?.credits,
235
  total: data.data?.total_credits,
236
+ day: data.data?.current_day,
237
+ stats: stats
238
  };
239
  } else {
240
  console.warn(`⚠️ Check-in failed: ${data.message}`);
 
248
  }
249
 
250
  /**
251
+ * Get user credits stats
252
  */
253
+ export async function getUserCreditsStats(token, email = 'unknown') {
254
+ console.log(`🔍 Getting user credits stats for ${email}...`);
255
 
256
  try {
257
  const signHeader = await generateSign();
258
+ const response = await fetch(CONFIG.MINDVIDEO_CREDITS_STATS_API, {
259
  method: 'GET',
260
  headers: {
261
  "accept": "application/json, text/plain, */*",
 
275
  try {
276
  data = JSON.parse(text);
277
  } catch (e) {
278
+ console.warn(`⚠️ Invalid stats response`);
279
  return null;
280
  }
281
 
282
  if (data.code === 0 && data.data) {
283
+ console.log(`✅ Stats retrieved: Total Credits: ${data.data.total_credits}, Used: ${data.data.used_credits}`);
284
+ return data.data;
 
 
 
 
 
285
  } else {
286
+ console.warn(`⚠️ Unable to get stats: ${data.message}`);
287
  return null;
288
  }
289
  } catch (error) {
290
+ console.warn(`⚠️ Stats query failed: ${error.message}`);
291
  return null;
292
  }
293
  }
 
313
  return { success: false, email, message: 'Invalid token' };
314
  }
315
 
316
+ // Fetch latest stats
317
+ const stats = await getUserCreditsStats(token, email);
318
+
319
+ // Save to database (update token + metadata)
320
+ await updateAccountToken(email, token, tokenInfo.expireAt, {
321
+ credits_stats: stats,
322
+ last_check_time: new Date().toISOString()
323
+ });
324
 
325
  await logSystem('info', 'refresh', `Token refreshed for ${email}`, {
326
  expireAt: tokenInfo.expireAt,
327
+ isExpired: tokenInfo.isExpired,
328
+ credits: stats?.total_credits
329
  });
330
 
331
  console.log(`✅ Token refreshed and saved to database`);
 
336
  email,
337
  token,
338
  expireAt: tokenInfo.expireAt,
339
+ isExpired: tokenInfo.isExpired,
340
+ stats
341
  };
342
 
343
  } catch (error) {
supabase-client.js CHANGED
@@ -122,17 +122,23 @@ export async function updateAccountStatus(email, status) {
122
  return data;
123
  }
124
 
125
- export async function updateAccountToken(email, token, expireAt) {
126
  const db = getSupabase();
127
 
 
 
 
 
 
 
 
 
 
 
 
128
  const { data, error } = await db
129
  .from('accounts')
130
- .update({
131
- token,
132
- expire_at: expireAt,
133
- last_login_at: new Date().toISOString(),
134
- updated_at: new Date().toISOString()
135
- })
136
  .eq('email', email)
137
  .select()
138
  .single();
 
122
  return data;
123
  }
124
 
125
+ export async function updateAccountToken(email, token, expireAt, metadata = null) {
126
  const db = getSupabase();
127
 
128
+ const updateData = {
129
+ token,
130
+ expire_at: expireAt,
131
+ last_login_at: new Date().toISOString(),
132
+ updated_at: new Date().toISOString()
133
+ };
134
+
135
+ if (metadata) {
136
+ updateData.metadata = metadata;
137
+ }
138
+
139
  const { data, error } = await db
140
  .from('accounts')
141
+ .update(updateData)
 
 
 
 
 
142
  .eq('email', email)
143
  .select()
144
  .single();