import * as twitch from "../twitch"; import { log, LogLevel } from "../logging" import db from "../db"; export async function processBans(streamer: twitch.StreamerUserIdTokenPair) { var dbconn = await db.connect(); try { await dbconn.query('BEGIN'); await dbconn.query("DELETE FROM bans"); var response = await twitch.streamerApiRequest(streamer, `/moderation/banned?broadcaster_id=${streamer.userid}&first=100`); log(LogLevel.DEBUG,"Ban API response:") log(LogLevel.DEBUG,JSON.stringify(response,null,2)); while (true) { var insertBanQuery = "INSERT INTO bans (userid) VALUES "; var banRow = 0; // Used for $1, $2, etc. in parameterized query var bansArray: number[] = []; if (Object.keys(response.data).length > 0) { for (var ban of response.data) { if (ban.expires_at == '') { banRow++; insertBanQuery += `($${banRow}), `; bansArray.push(ban.user_id as number); } } insertBanQuery = insertBanQuery.slice(0,-2); // Cut last `, ` off of the end insertBanQuery += " ON CONFLICT DO NOTHING"; // Deal with broken endpoint returning dupes var banQueryConfig = { text: insertBanQuery, values: bansArray }; log(LogLevel.DEBUG,"banQueryConfig object:") log(LogLevel.DEBUG,JSON.stringify(banQueryConfig,null,2)) await dbconn.query(banQueryConfig); } if (response.pagination.cursor) { var oldFirstUserid = response.data[0].user_id; response = await twitch.streamerApiRequest(streamer, `/moderation/banned?broadcaster_id=${streamer.userid}&after=${response.pagination.cursor}&first=100`); log(LogLevel.DEBUG,"Ban API response:"); log(LogLevel.DEBUG,JSON.stringify(response,null,2)); // Work around broken api endpoint giving a cursor referring to the // current page, causing an infinite loop if (oldFirstUserid == response.data[0].user_id) break; } else { break; } } await dbconn.query("CALL update_scores()"); await dbconn.query('COMMIT'); } catch (e) { log(LogLevel.ERROR,"cronjobs.processBans: Exception thrown; rolling back"); await dbconn.query('ROLLBACK'); throw(e); } finally { await dbconn.release(); } }