Twitch and hitbox announcer

By mlky on Dec 22, 2014

Announces when twitch or hitbox streams go live

Requires this script to work http://www.mircscripts.org/showdoc.php?type=code&id=4407

Start announcer with .announce on

Add stream with .addstream twitch.tv/channelname

Remove stream with .delstream hitbox.tv/channelname

Get a list of added streams with .liststreams

Get a list of currently live streams with number of viewers with .streams

Get a the a list of the top10 streamers of a specific game with .topstreams starcraft II (only works on twitch)

Get information about a specific channel with .chaninfo hitbox.tv/channelname

Works with multiple ircchannels.

Enjoy and please report any bugs you may find.

on *:TEXT:*:#: {
  if ($nick isop #) {
    if ($1 == .announce) {
      if ($2 == off) {
        timerstreamannouncer off
        describe # Announcer deactivated.
      }
      elseif ($2 == on) {
        timerstreamannouncer 0 30 streamannouncer
        describe # Announcer activated.
      }
      else {
        if ($timer(streamannouncer)) {
          describe # Checking api in $timer(streamannouncer).secs seconds.
        }
        else { describe # Announcer not active. }
      }
    }
    if ($1 == .addstream) && ($2) {
      var %kanal = $remove($2,http://,https://)
      if ($left(%kanal,9) == twitch.tv) {
        var %kanal = $remove(%kanal,twitch.tv/)
        if ($istok($readini(streams.ini,streams,%kanal),#,59)) { describe # %kanal is already added. | halt }
        writeini streams.ini streams %kanal $addtok($readini(streams.ini,streams,%kanal),#,59)
        describe # %kanal added.
        if ($timer(streamannouncer).secs > 5) {
          streamannouncer
          timerstreamannouncer 0 30 streamannouncer
        }
      }
      elseif ($left(%kanal,9) == hitbox.tv) {
        var %kanal = $remove(%kanal,hitbox.tv/)
        if ($istok($readini(streams.ini,hitboxstreams,%kanal),#,59)) { describe # %kanal is already added. | halt }
        writeini streams.ini hitboxstreams %kanal $addtok($readini(streams.ini,hitboxstreams,%kanal),#,59)
        describe # %kanal added.
        if ($timer(streamannouncer).secs > 5) {
          streamannouncer
          timerstreamannouncer 0 30 streamannouncer
        }
      }
      else {
        describe # Example: .addstream twitch.tv/channel or .addstream hitbox.tv/channel
      }
    }
    if ($1 == .delstream) && ($2) {
      var %kanal = $remove($2,http://,https://)
      if ($left(%kanal,9) == twitch.tv) {
        var %kanal = $remove(%kanal,twitch.tv/)
        if (!$istok($readini(streams.ini,streams,%kanal),#,59)) { describe # %kanal is not added. | halt }
        var %numtok = $findtok($readini(streams.ini,streams,%kanal),#,1,59)
        if (%numtok == 1) {
          remini streams.ini streams %kanal
          remini streams.ini viewers %kanal
        }
        else {
          writeini streams.ini streams %kanal $deltok($readini(streams.ini,streams,%kanal),%numtok,59)
        }
        describe # %kanal removed.
      }
      elseif ($left(%kanal,9) == hitbox.tv) {
        var %kanal = $remove(%kanal,hitbox.tv/)
        if (!$istok($readini(streams.ini,hitboxstreams,%kanal),#,59)) { describe # %kanal is not added. | halt }
        var %numtok = $findtok($readini(streams.ini,hitboxstreams,%kanal),#,1,59)
        if (%numtok == 1) {
          remini streams.ini hitboxstreams %kanal
          remini streams.ini hitboxviewers %kanal
        }
        else {
          writeini streams.ini hitboxstreams %kanal $deltok($readini(streams.ini,hitboxstreams,%kanal),%numtok,59)
        }
        describe # %kanal removed.
      }
      else {
        describe # Example: .delstream twitch.tv/channel or .delstream hitbox.tv/channel
      }
    }
  }
  if ($1 == .chaninfo) {
    var %kanal = $remove($2,http://,https://)
    if ($left(%kanal,9) == hitbox.tv) {
      var %kanal = $remove(%kanal,hitbox.tv/)
      var %url = $+(http://api.hitbox.tv/media/live/,%kanal,?embed=true)
      noop $clearjsoncache(%url)
      var %islive = $json(%url,livestream,0,media_is_live)
      if (%islive == 1) {
        var %chanurl = http://hitbox.tv/ $+ %kanal
        var %viewers = $json(%url,livestream,0,media_views)
        if ($json(%url,livestream,0,category_name)) {
          var %game = $v1
        }
        else { var %game = unknown game }
        var %title = " $+ $json(%url,livestream,0,media_status) $+ "
        var %followers = $json(%url,livestream,0,channel,followers)
        describe # %chanurl is playing %game with title %title
        describe # %chanurl has %followers followers and %viewers viewers.
      }
      else {
        var %chanurl = http://hitbox.tv/ $+ %kanal
        describe # %chanurl is offline.
      }
    }
    elseif ($left(%kanal,9) == twitch.tv) {
      var %kanal = $remove(%kanal,twitch.tv/)
      var %url = $+(https://api.twitch.tv/kraken/streams/,%kanal)
      noop $clearjsoncache(%url)
      var %viewers = $json(%url,stream,viewers)
      if (%viewers >= 0) {
        var %chanurl = http://twitch.tv/ $+ %kanal
        if ($json(%url,stream,game)) {
          var %game = $v1
        }
        else { var %game = unknown game }
        var %title = " $+ $json(%url,stream,channel,status) $+ "
        var %followers = $json(%url,stream,channel,followers)
        describe # %chanurl is playing %game with title %title
        describe # %chanurl has %followers followers and %viewers viewers.
      }
      else {
        var %chanurl = http://twitch.tv/ $+ %kanal
        describe # %chanurl is offline.
      }
    }
    else {
      describe # Example: .chaninfo twitch.tv/channel or .chaninfo hitbox.tv/channel
    }
  }
  if ($1 == .topstreams) {
    if (!$2) { describe # Example: .topstreams Counter-Strike: Global Offensive | halt }
    var %gamename = $remove($replace($2-,$chr(32),$chr(43)),$chr(36),$chr(38),$chr(59),$chr(44))
    var %url = $+(https://api.twitch.tv/kraken/search/streams?q=,%gamename,&limit=10)
    var %c = 0
    while ($json(%url,streams,%c,channel,display_name)) {
      var %displayname = $v1
      var %viewers = $json(%url,streams,%c,viewers)
      if (%c <= 5) {
        var %output = %output $+(http://twitch.tv/,%displayname,$chr(32),$chr(40),%viewers,$chr(41),$chr(32),$chr(45))
      }
      else {
        var %output2 = %output2 $+(http://twitch.tv/,%displayname,$chr(32),$chr(40),%viewers,$chr(41),$chr(32),$chr(45))
      }
      inc %c
    }
    var %lm1 = $calc($len(%output) - 1)
    var %output = $left(%output,%lm1)
    describe # Top 10 $json(%url,streams,0,game) streams on twitch: %output
    if (%output2) {
      var %lm1 = $calc($len(%output2) - 1)
      var %output2 = $left(%output2,%lm1)
      describe # %output2
    }
  }
  if ($1 == .liststreams) {
    var %lstreams 1
    while (%lstreams <= $ini(streams.ini,streams,0)) {
      if ($istok($readini(streams.ini,streams,$ini(streams.ini,streams,%lstreams)),#,59)) {
        var %chans %chans $+(http://twitch.tv/,$ini(streams.ini,streams,%lstreams))
      }
      inc %lstreams
    }
    var %lstreams 1
    while (%lstreams <= $ini(streams.ini,hitboxstreams,0)) {
      if ($istok($readini(streams.ini,hitboxstreams,$ini(streams.ini,hitboxstreams,%lstreams)),#,59)) {
        var %chans %chans $+(http://hitbox.tv/,$ini(streams.ini,hitboxstreams,%lstreams))
      }
      inc %lstreams
    }
    describe # Added streams: %chans
  }
  if ($1 == .streams) {
    if ($getCurrentStreamsWithViewers(#)) {
      describe # Live streams: $v1
    }
    else {
      describe # No streams are currently live.
    }
  }
}

alias getCurrentStreamsWithViewers {
  var %target = $1
  var %c = 1
  var %limit = $ini(streams.ini,viewers,0)
  while (%c <= %limit) {
    var %chan = $ini(streams.ini,viewers,%c)
    var %viewers = $readini(streams.ini,viewers,%chan)
    if ($istok($readini(streams.ini,streams,%chan),%target,59)) {
      var %output = %output $+(http://twitch.tv/,%chan,$chr(32),$chr(40),%viewers,$chr(41),$chr(32),$chr(45))
    }
    inc %c
  }
  var %c = 1
  var %limit = $ini(streams.ini,hitboxviewers,0)
  while (%c <= %limit) {
    var %chan = $ini(streams.ini,hitboxviewers,%c)
    var %viewers = $readini(streams.ini,hitboxviewers,%chan)
    if ($istok($readini(streams.ini,hitboxstreams,%chan),%target,59)) {
      var %output = %output $+(http://hitbox.tv/,%chan,$chr(32),$chr(40),%viewers,$chr(41),$chr(32),$chr(45))
    }
    inc %c
  }
  var %lm1 = $calc($len(%output) - 1)
  var %output = $left(%output,%lm1)
  return %output
}

alias streamannouncer {
  var %c = 1
  var %limit = $ini(streams.ini,streams,0)
  while (%c <= %limit) {
    var %chan = $ini(streams.ini,streams,%c)
    var %url = $+(https://api.twitch.tv/kraken/streams/,%chan)
    noop $clearjsoncache(%url)
    var %viewers = $json(%url,stream,viewers)
    if (%viewers >= 0) {
      if ($readini(streams.ini,viewers,%chan) !>= 0) {
        var %title = $json(%url,stream,channel,status)
        writeini streams.ini viewers %chan %viewers
        var %targets = $readini(streams.ini,streams,%chan)
        .describe $replace(%targets,$chr(59),$chr(44)) %chan is now live playing %game with title " $+ %title $+ "
      }
    }
    else {
      if ($readini(streams.ini,viewers,%chan) >= 0) {
        remini streams.ini viewers %chan
      }
    }
    inc %c
  }

  var %c = 1
  var %limit = $ini(streams.ini,hitboxstreams,0)
  while (%c <= %limit) {
    var %chan = $ini(streams.ini,hitboxstreams,%c)
    var %url = $+(http://api.hitbox.tv/media/live/,%chan,?embed=true)
    noop $clearjsoncache(%url)
    var %islive = $json(%url,livestream,0,media_is_live)
    if (%islive == 1) {
      if ($readini(streams.ini,hitboxviewers,%chan) !>= 0) {
        var %chanurl = http://hitbox.tv/ $+ %kanal
        var %viewers = $json(%url,livestream,0,media_views)
        writeini streams.ini hitboxviewers %chan %viewers
        if ($json(%url,livestream,0,category_name)) {
          var %game = $v1
        }
        else { var %game = unknown game }
        var %title = " $+ $json(%url,livestream,0,media_status) $+ "
        var %targets = $readini(streams.ini,hitboxstreams,%chan)
        .describe $replace(%targets,$chr(59),$chr(44)) %chan is now live playing %game with title " $+ %title $+ "
      }
    }
    else {
      if ($readini(streams.ini,hitboxviewers,%chan) >= 0) {
        remini streams.ini hitboxviewers %chan
      }
    }
    inc %c
  }
}

Comments

Sign in to comment.
TUSK3N   -  Mar 25, 2016

This doesn't seem to work anymore, the twitch chaninfo does not work it just says all the streams are offline when they are not. And it doesnt announces when a stream goes live.

mlky  -  Apr 06, 2016

Thanks for letting me know, i'll fix it if i get around to it, but its low on my list of priorities.

Sign in to comment

mlky   -  Dec 23, 2014

If anyone knows how to get a list of the top streamers of a specific game on hitbox.tv, please let me know.

 Respond  
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.