import * as twitch from "../twitch"; import { log, LogLevel } from "../logging" import db from "../db"; export async function processSubscriptions(streamer: twitch.StreamerUserIdTokenPair) { var dbconn = await db.connect(); try { await dbconn.query('BEGIN'); await dbconn.query("DELETE FROM subscriptions"); var response = await twitch.streamerApiRequest(streamer, `/subscriptions?broadcaster_id=${streamer.userid}&first=100`); log(LogLevel.DEBUG,"Subscriptions API response:") log(LogLevel.DEBUG,JSON.stringify(response,null,2)); while (true) { var insertSubscriptionQuery = "INSERT INTO subscriptions (userid) VALUES "; var subscriptionRow = 0; // Used for $1, $2, etc. in parameterized query var subscriptionsArray: number[] = []; if (Object.keys(response.data).length > 0) { for (var subscription of response.data) { subscriptionRow++; insertSubscriptionQuery += `($${subscriptionRow}), `; subscriptionsArray.push(subscription.user_id as number); } insertSubscriptionQuery = insertSubscriptionQuery.slice(0,-2); // Cut last `, ` off of the end insertSubscriptionQuery += " ON CONFLICT DO NOTHING"; // Deal with broken endpoint returning dupes var subscriptionQueryConfig = { text: insertSubscriptionQuery, values: subscriptionsArray }; log(LogLevel.DEBUG,"subscriptionQueryConfig object:") log(LogLevel.DEBUG,JSON.stringify(subscriptionQueryConfig,null,2)) await dbconn.query(subscriptionQueryConfig); } if (response.pagination.cursor) { var oldFirstUserid = response.data[0].user_id; response = await twitch.streamerApiRequest(streamer, `/subscriptions?broadcaster_id=${streamer.userid}&after=${response.pagination.cursor}&first=100`); if (oldFirstUserid == response.data[0].user_id) break; log(LogLevel.DEBUG,"Subscription API response:"); log(LogLevel.DEBUG,JSON.stringify(response,null,2)); } else { break; } } await dbconn.query("CALL update_scores()"); await dbconn.query('COMMIT'); } catch (e) { log(LogLevel.ERROR,"cronjobs.processSubscriptions: Exception thrown; rolling back"); await dbconn.query('ROLLBACK'); throw(e); } finally { await dbconn.release(); } }