const fetch = require('node-fetch'); async function request( endpoint: EndPointTypes, info: { channel?: string; user?: string; req?: string }, ) { const { channel, user, req } = info; if (!channel && !user) throw new SyntaxError('No "channel" or "user" was given as a parameter.'); return new Promise(async (resolve, reject): Promise => { if (channel && user) { if (req) return fetch(`https://api.crunchprank.net/twitch/${endpoint}/${req}`) .then((res: any) => resolve(res.text())) .catch((e: any) => reject(e)); return fetch(`https://api.crunchprank.net/twitch/${endpoint}/${channel}/${user}`) .then((res: any) => resolve(res.text())) .catch((e: any) => reject(e)); } else if ((channel && !user) || (!channel && user)) { return fetch( `https://api.crunchprank.net/twitch/${endpoint}/${channel ? channel : user}`, ) .then((res: any) => resolve(res.text())) .catch((e: any) => reject(e)); } else throw new SyntaxError('No "channel" or "user" was given as a parameter.'); }); } const account_age = (user: string) => new Promise(async (resolve, reject) => request('accountage', { user }).then(resolve).catch(reject), ); const avatar = (user: string) => new Promise(async (resolve, reject) => request('avatar', { user }).then(resolve).catch(reject)); const creation = (user: string) => new Promise(async (resolve, reject) => request('creation', { user }).then(resolve).catch(reject), ); const follow_age = (channel: string, user: string) => new Promise(async (resolve, reject) => request('followage', { user, channel, req: `${channel}/${user}` }) .then(resolve) .catch(reject), ); const follow_count = (channel: string) => new Promise(async (resolve, reject) => request('followcount', { channel }).then(resolve).catch(reject), ); const followed = (user: string, channel: string) => new Promise(async (resolve, reject) => request('followed', { user, channel }).then(resolve).catch(reject), ); const followers = (channel: string) => new Promise(async (resolve, reject) => request('followers', { channel }).then(resolve).catch(reject), ); const following = (user: string) => new Promise(async (resolve, reject) => request('following', { user }).then(resolve).catch(reject), ); const game = (channel: string) => new Promise(async (resolve, reject) => request('game', { channel }).then(resolve).catch(reject), ); const help = (search: string) => new Promise(async (resolve, reject) => request('help', { req: search }).then(resolve).catch(reject), ); const highlight = (channel: string) => new Promise(async (resolve, reject) => request('highlight', { channel }).then(resolve).catch(reject), ); const highlight_random = (channel: string) => new Promise(async (resolve, reject) => request('highlight_random', { channel }).then(resolve).catch(reject), ); const hosts = (channel: string) => new Promise(async (resolve, reject) => request('hosts', { channel }).then(resolve).catch(reject), ); const hosts_count = (channel: string) => new Promise(async (resolve, reject) => request('hostscount', { channel }).then(resolve).catch(reject), ); const id = (user: string) => new Promise(async (resolve, reject) => request('id', { user }).then(resolve).catch(reject)); const ingests = () => new Promise(async (resolve, reject) => request('ingests', { req: '' }).then(resolve).catch(reject), ); const latest_sub = (channel: string) => new Promise(async (resolve, reject) => request('latest_sub', { channel }).then(resolve).catch(reject), ); const multi = (stream: string) => new Promise(async (resolve, reject) => request('multi', { req: stream }).then(resolve).catch(reject), ); const random_sub = (channel: string) => new Promise(async (resolve, reject) => request('random_sub', { channel }).then(resolve).catch(reject), ); const random_user = (channel: string) => new Promise(async (resolve, reject) => request('random_user', { channel }).then(resolve).catch(reject), ); const sub_age = (channel: string, user: string) => new Promise(async (resolve, reject) => request('subage', { user, channel, req: `${channel}/${user}` }) .then(resolve) .catch(reject), ); const sub_count = (channel: string) => new Promise(async (resolve, reject) => request('subcount', { channel }).then(resolve).catch(reject), ); const sub_points = (channel: string) => new Promise(async (resolve, reject) => request('subpoints', { channel }).then(resolve).catch(reject), ); const sub_emotes = (channel: string) => new Promise(async (resolve, reject) => request('subscriber_emotes', { channel }).then(resolve).catch(reject), ); const status = (channel: string) => new Promise(async (resolve, reject) => request('status', { channel }).then(resolve).catch(reject), ); const title = (channel: string) => new Promise(async (resolve, reject) => request('title', { channel }).then(resolve).catch(reject), ); const team_members = (team_id: string) => new Promise(async (resolve, reject) => request('team_members', { req: team_id }).then(resolve).catch(reject), ); const total_views = (channel: string) => new Promise(async (resolve, reject) => request('total_views', { channel }).then(resolve).catch(reject), ); const upload = (channel: string) => new Promise(async (resolve, reject) => request('upload', { channel }).then(resolve).catch(reject), ); const uptime = (channel: string) => new Promise(async (resolve, reject) => request('uptime', { channel }).then(resolve).catch(reject), ); const viewer_count = (channel: string) => new Promise(async (resolve, reject) => request('viewercount', { channel }).then(resolve).catch(reject), ); const videos = (channel: string) => new Promise(async (resolve, reject) => request('videos', { channel }).then(resolve).catch(reject), ); const vod_replay = (channel: string) => new Promise(async (resolve, reject) => request('vod_replay', { channel }).then(resolve).catch(reject), ); export type EndPointTypes = | 'accountage' | 'avatar' | 'creation' | 'followage' | 'followcount' | 'followed' | 'followers' | 'following' | 'game' | 'help' | 'highlight' | 'highlight_random' | 'hosts' | 'hostscount' | 'id' | 'ingests' | 'latest_sub' | 'multi' | 'random_sub' | 'random_user' | 'subage' | 'subcount' | 'subpoints' | 'subscriber_emotes' | 'status' | 'title' | 'team_members' | 'total_views' | 'upload' | 'uptime' | 'viewercount' | 'videos' | 'vod_replay'; export default { account_age, avatar, creation, follow_age, follow_count, followed, followers, following, game, help, highlight, highlight_random, hosts, hosts_count, id, ingests, latest_sub, multi, random_sub, random_user, status, sub_age, sub_count, sub_emotes, sub_points, team_members, title, total_views, upload, uptime, videos, viewer_count, vod_replay, };