def test_nonjson_response(self):
    mock_urlopen = get_opener(b'<html>404</html>')

    with patch('twitchcancer.utils.twitchapi.urllib.request.urlopen', mock_urlopen):
      result = TwitchApi._load_json("")

      self.assertEqual(result, None)
  def test_json_response(self):
    mock_urlopen = get_opener(b'{"data": "foo"}')

    with patch('twitchcancer.utils.twitchapi.urllib.request.urlopen', mock_urlopen):
      result = TwitchApi._load_json("")

      self.assertEqual(result, {"data": "foo"})
Exemple #3
0
    async def autojoin(self):
        """ Join any channel over n viewers
        Leave any channel under n viewers (including offline ones)
        """
        # synchronous HTTP request, fine because we'd sleep otherwise
        data = TwitchApi.stream_list()
        if not data:
            # ignore the error, we'll try again next cycle
            return

        # leave any channel out of the top 100 (offline or just further down the list)
        online_channels = [
            '#' + stream['channel']['name'] for stream in data['streams']
        ]

        for channel in self.channels:
            if channel not in online_channels:
                await self.leave(channel)

        # join channels over n viewers, leave channels under n viewers
        for stream in data['streams']:
            if stream['viewers'] > self.viewers:
                await self.join('#' + stream['channel']['name'])
            else:
                await self.leave('#' + stream['channel']['name'])
Exemple #4
0
  def autojoin(self):
    # get a list of channels from Twitch
    # join any channel over n viewers
    # leave any channel under n viewers (including offline ones)
    try:
      data = TwitchApi.stream_list()

      if not data:
        return

      # extract a list of channels from Twitch's API response
      online_channels = ['#'+stream['channel']['name'] for stream in data['streams']]

      # ignore Twitch's data if it looks buggy (no streams online is unlikely)
      if (len(online_channels) == 0):
        return

      # leave any channel out of the top 100 (offline or just further down the list)
      for channel in self.channels:
        if channel not in online_channels:
          self.leave(channel)

      # join channels over n viewers, leave channels under n viewers
      for stream in data['streams']:
        if stream['viewers'] > self.viewers:
          self.join('#'+stream['channel']['name'])
        else:
          self.leave('#'+stream['channel']['name'])
    except KeyError as e:
      logger.warning("got an empty json response to a stream list request %s", e)
      return
Exemple #5
0
  def find_server(self, channel):
    try:
      result = TwitchApi.chat_properties(channel)

      if result:
        return random.choice(result['chat_servers'])
    except KeyError as e:
      logger.warning("got an empty json response to a chat properties request %s", e)

    return None
  def test_default(self, _load_json):
    TwitchApi.stream_list()

    self.assertEqual(_load_json.call_count, 1)
  def test_channel_striping(self, _load_json):
    TwitchApi.chat_properties('#channel')

    self.assertEqual(_load_json.call_count, 1)
    self.assertIn('channel', _load_json.call_args[0][0].split('/'))
  def test_http_exception(self, urlopen):
    result = TwitchApi._load_json("")

    self.assertEqual(result, None)
Exemple #9
0
from twitchcancer.utils.twitchapi import TwitchApi

if __name__ == '__main__':
    store = PersistentStore()
    leaderboards = store.db.leaderboard.find({'channel': {
        '$regex': '#.*'
    }},
                                             limit=100)
    names = [
        leaderboard['channel'].replace('#', '') for leaderboard in leaderboards
    ]
    if not names:
        print('Nothing to migrate')
        sys.exit()

    users = TwitchApi.request('https://api.twitch.tv/kraken/users?login='******','.join(names))["users"]
    for user in users:
        channel_name = user['name']
        channel_id = user['_id']

        query = {'channel': '#' + channel_name}
        update = {'$set': {'channel': channel_name, 'channel_id': channel_id}}
        print('Migrating {} to {}'.format(channel_name, channel_id))

        store.db.daily_leaderboard.update_one(query, update)
        store.db.monthly_leaderboard.update_one(query, update)
        store.db.leaderboard.update_one(query, update)
        names.remove(channel_name)

    for name in names:
        print('Failed to find channel id for channel {}'.format(name))