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"})
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'])
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
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)
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))