import * as twitch from "../twitch"; import { log, LogLevel } from "../logging" import db from "../db"; export async function processFollows(streamer: twitch.StreamerUserIdTokenPair) { var dbconn = await db.connect(); try { await dbconn.query('BEGIN'); await dbconn.query("DELETE FROM follows"); // Insert the streamer as a follower await dbconn.query({text: "INSERT INTO follows (userid) VALUES ($1)", values: [streamer.userid]}) var response = await twitch.streamerApiRequest(streamer, `/users/follows?to_id=${streamer.userid}&first=100`); log(LogLevel.DEBUG,"Follows API response:") log(LogLevel.DEBUG,JSON.stringify(response,null,2)); while (true) { var insertFollowQuery = "INSERT INTO follows (userid) VALUES "; var followRow = 0; // Used for $1, $2, etc. in parameterized query var followsArray: number[] = []; if (Object.keys(response.data).length > 0) { for (var follow of response.data) { followRow++; insertFollowQuery += `($${followRow}), `; followsArray.push(follow.from_id as number); } insertFollowQuery = insertFollowQuery.slice(0,-2); // Cut last `, ` off of the end var followQueryConfig = { text: insertFollowQuery, values: followsArray }; log(LogLevel.DEBUG,"followQueryConfig object:") log(LogLevel.DEBUG,JSON.stringify(followQueryConfig,null,2)) await dbconn.query(followQueryConfig); } if (response.pagination.cursor) { response = await twitch.streamerApiRequest(streamer, `/users/follows?to_id=${streamer.userid}&after=${response.pagination.cursor}&first=100`); log(LogLevel.DEBUG,"Follow 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.processFollows: Exception thrown; rolling back"); await dbconn.query('ROLLBACK'); throw(e); } finally { await dbconn.release(); } }