Showbot
Empower your Twitch chat to submit ideas, show titles,
questions and more, then vote the best to the top.
Empower your Twitch chat to submit ideas, show titles,
questions and more, then vote the best to the top.


Chat can get busy, and important questions and ideas can scroll past without you ever seeing them leaving your chat to feel ignored. Showbot gives your chat a place to sumbit their ideas and qustions so you can quickly and easily view them.
Showbot integrates with a chatbot, such as NightBot, Streamlabs or many others, and allows your fans to submit show titles, quotes, song requests, ideas, questions or anything else you can think of, then lets anyone vote, bringing the best of the best to the top.

Showbot was originally built to collect possible episode titles for live recordings of Podcasts. After the show, everyone could vote on their favorite title and the hosts would choose one as the title of that episode, often the crowd favorite.
But Showbot can be used for any number of things. Have a guest on for a Q and A? Use Showbot to collect questions. Do you stream live music? Collect song requests. Even if you're a gamer, ask your chat what game you should stream next and let them vote on the results.
Figure out new and unique ways you can use it for your stream.

Showbot keeps important stats and figures which you can view on your Dashboard. Which of your followers submitted the most titles? What was your most upvoted title? These stats and more are available on your Showbot Dashboard. You can also go back in time and view a past list by choosing a specific date.
Showbot also allows for customized settings:
Showbot can be up and running in just 5 minutes.
Nothing else can make such a difference in the way you stream so quickly.
oauth url is $oauthURL"; $ch = curl_init(); /* curl_setopt_array($ch, array( CURLOPT_HTTPHEADER => array( 'Client-ID: ' . $clientId ), CURLOPT_RETURNTRANSFER => true, CURLOPT_URL => $oauthURL )); */ curl_setopt($ch,CURLOPT_URL, $oauthURL ); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $thisThing = curl_exec($ch); curl_close($ch); // print "
Thing for is $thisThing"; return $thisThing; } function tGetUserInfo($access_token) { // possible fields are: // broadcaster_type description display_name email id login offline_image_url profile_image_url type view_count global $twitchClientId, $twitchSecret, $redirUri, $scope; $userURL = "https://api.twitch.tv/helix/users"; // print "
oauth url is $oauthURL"; $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_HTTPHEADER => array( 'Authorization: Bearer ' . $access_token, 'Client-ID: ' . $twitchClientId ), CURLOPT_RETURNTRANSFER => true, CURLOPT_URL => $userURL )); $thisThing = curl_exec($ch); curl_close($ch); $userInfo = json_decode($thisThing, true); $toReturn = $userInfo; return $toReturn; } function tGetChannelInfo($_twitchID,$access_token) { // possible fields are: global $twitchClientId, $twitchSecret, $redirUri, $scope; $userURL = "https://api.twitch.tv/helix/channels?broadcaster_id=" . $_twitchID; $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_HTTPHEADER => array( 'Authorization: Bearer ' . $access_token, 'Client-ID: ' . $twitchClientId ), CURLOPT_RETURNTRANSFER => true, CURLOPT_URL => $userURL )); $thisThing = curl_exec($ch); curl_close($ch); $userInfo = json_decode($thisThing, true); $toReturn = $userInfo; return $toReturn; } function tGetUserInfoField($access_token,$field) { // possible fields are: // broadcaster_type description display_name email id login offline_image_url profile_image_url type view_count global $twitchClientId, $twitchSecret, $redirUri, $scope; $userURL = "https://api.twitch.tv/helix/users"; // print "
oauth url is $oauthURL"; $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_HTTPHEADER => array( 'Authorization: Bearer ' . $access_token, 'Client-ID: ' . $twitchClientId ), CURLOPT_RETURNTRANSFER => true, CURLOPT_URL => $userURL )); $thisThing = curl_exec($ch); curl_close($ch); $userInfo = json_decode($thisThing, true); $toReturn = $userInfo['data'][0][$field]; //die("
user email $userEmail"); return $toReturn; } function tChannelModerators($access_token, $userId) { // takes user ID and returns JSON of channel's moderators global $twitchClientId, $twitchSecret, $redirUri, $scope; $modsURL = "https://api.twitch.tv/helix/moderation/moderators?broadcaster_id=$userId"; // print "
oauth url is $oauthURL"; $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_HTTPHEADER => array( 'Authorization: Bearer ' . $access_token, 'Client-ID: ' . $twitchClientId ), CURLOPT_RETURNTRANSFER => true, CURLOPT_URL => $modsURL )); $thisThing = curl_exec($ch); curl_close($ch); // $userInfo = json_decode($thisThing, true); // $toReturn = $userInfo['data'][0][$field]; $toReturn = $thisThing; //die("
user email $userEmail"); return $toReturn; } function tIsUserModerator($access_token, $channelId, $channel, $loggedInUser) { // hack for super mods if( strtolower($loggedInUser) == 'biocow' or strtolower($loggedInUser) == 'foo bar blah') { return true; } global $mysqli; $channelMods = tChannelModerators($access_token, $channelId); $channelModsJson = json_decode($channelMods, true); // $refreshToken = tGetUserInfoField($access_token,'twitchRefreshToken'); if($channelModsJson['error']){ // Think the access token is bad. Let's renew it $sql=" SELECT twitchRefreshToken FROM channelKeys WHERE channel = '$channel' "; $result = mysqli_query($mysqli, $sql); if( $result ) { $channelInfo = mysqli_fetch_array($result); $refreshToken = $channelInfo['twitchRefreshToken']; } else { return false; } $renewInfoJson = tRenewAccessToken($refreshToken); $renewInfoArray = json_decode($renewInfoJson, true); if( $renewInfoArray['error'] OR $renewInfoArray['status'] == "400" ) { // we are still getting an error. Give up return false; } else { // hey, we got some renewed info. Let's update the database. $twitchAccessToken = $renewInfoArray['access_token']; $twitchRefreshToken = $renewInfoArray['refresh_token']; $sql = " UPDATE channelKeys SET twitchAccessToken = '$twitchAccessToken', twitchRefreshToken = '$twitchRefreshToken' WHERE twitchId = '$channelId' "; if( $twitchAccessToken AND $twitchAccessToken ) { $result = mysqli_query($mysqli, $sql); } if( $result ) { // updated, now try again. $channelMods = tChannelModerators($twitchAccessToken, $channelId); $channelModsJson = json_decode($channelMods, true); } else { // error updating database return false; } } } if($channelModsJson['error']){ // still failed. return false; } // print $channelMods; if( $channelModsJson['data'] ) { foreach( $channelModsJson['data'] as $data ) { if( strtolower( $data['user_name'] ) == strtolower($loggedInUser) ) { return true; } else if( strtolower($channel) == strtolower($loggedInUser) ) { return true; } } } return false; } function tRenewAccessToken($refreshToken) { global $twitchClientId, $twitchSecret, $redirUri, $scope; $userURL = "https://id.twitch.tv/oauth2/token?grant_type=refresh_token&refresh_token=$refreshToken&client_id=$twitchClientId&client_secret=$twitchSecret"; // print "
oauth url is $oauthURL"; $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt_array($ch, array( CURLOPT_HTTPHEADER => array( 'Authorization: Bearer ' . $access_token, 'Client-ID: ' . $twitchClientId ), CURLOPT_RETURNTRANSFER => true, CURLOPT_URL => $userURL )); $toReturn = curl_exec($ch); curl_close($ch); return $toReturn; } function tIsChannelLive ($_twitchId2){ // calls Twitch to see if channel is on air // returns stream info in JSON format global $twitchClientId, $twitchSecret, $redirUri, $scope, $mysqli; $userURL = "https://api.twitch.tv/kraken/streams/$_twitchId2"; $ch = curl_init(); //curl_setopt($ch, CURLOPT_POST, 1); curl_setopt_array($ch, array( CURLOPT_HTTPHEADER => array( 'Accept: application/vnd.twitchtv.v5+json', 'Client-ID: ' . $twitchClientId ), CURLOPT_RETURNTRANSFER => true, CURLOPT_URL => $userURL )); $toReturn = curl_exec($ch); curl_close($ch); $streamInfo = json_decode($toReturn, true); if($streamInfo['stream']) { // if the stream is live log the stream info for later and return true $sqlInert = mysqli_real_escape_string($mysqli,$toReturn); $sql = " UPDATE channelKeys SET streamInfo = '$sqlInert' WHERE twitchId = '$_twitchId2' "; $result = mysqli_query($mysqli, $sql); return true; } else { // not live, return false //logit($_twitchId2 . " - " . $toReturn); return false; } // default return false return false; } ?>