def run(self, streamers: list = [], followers=False): if self.running: logger.error("You can't start multiple sessions of this instance!") else: logger.info(f"Start session: '{self.session_id}'", extra={"emoji": ":bomb:"}) self.running = True self.start_datetime = datetime.now() self.twitch.login() if self.claim_drops_startup is True: self.twitch.claim_all_drops_from_inventory() streamers_name: list = [] streamers_dict: dict = {} for streamer in streamers: username = (streamer.username if isinstance( streamer, Streamer) else streamer.lower().strip()) streamers_name.append(username) streamers_dict[username] = streamer if followers is True: followers_array = self.twitch.get_followers() logger.info( f"Load {len(followers_array)} followers from your profile!", extra={"emoji": ":clipboard:"}, ) for username in followers_array: if username not in streamers_dict: streamers_dict[username] = username.lower().strip() else: followers_array = [] streamers_name = list( OrderedDict.fromkeys(streamers_name + followers_array)) logger.info( f"Loading data for {len(streamers_name)} streamers. Please wait...", extra={"emoji": ":nerd_face:"}, ) for username in streamers_name: time.sleep(random.uniform(0.3, 0.7)) try: if isinstance(streamers_dict[username], Streamer) is True: streamer = streamers_dict[username] else: streamer = Streamer(username) streamer.channel_id = self.twitch.get_channel_id(username) streamer.settings = set_default_settings( streamer.settings, Settings.streamer_settings) streamer.settings.bet = set_default_settings( streamer.settings.bet, Settings.streamer_settings.bet) self.streamers.append(streamer) except StreamerDoesNotExistException: logger.info( f"Streamer {username} does not exist", extra={"emoji": ":cry:"}, ) # Populate the streamers with default values. # 1. Load channel points and auto-claim bonus # 2. Check if streamers is online # 3. Check if the user is a Streamer. In thi case you can't do prediction for streamer in self.streamers: time.sleep(random.uniform(0.3, 0.7)) self.twitch.load_channel_points_context(streamer) self.twitch.check_streamer_online(streamer) self.twitch.viewer_is_mod(streamer) if streamer.viewer_is_mod is True: streamer.settings.make_predictions = False self.original_streamers = copy.deepcopy(self.streamers) # If we have at least one streamer with settings = make_predictions True make_predictions = at_least_one_value_in_settings_is( self.streamers, "make_predictions", True) self.minute_watcher_thread = threading.Thread( target=self.twitch.send_minute_watched_events, args=( self.streamers, at_least_one_value_in_settings_is(self.streamers, "watch_streak", True), ), ) self.minute_watcher_thread.start() self.ws_pool = WebSocketsPool( twitch=self.twitch, streamers=self.streamers, events_predictions=self.events_predictions, ) # Subscribe to community-points-user. Get update for points spent or gains self.ws_pool.submit( PubsubTopic( "community-points-user-v1", user_id=self.twitch.twitch_login.get_user_id(), )) # If we have at least one streamer with settings = claim_drops True # Going to subscribe to user-drop-events. Get update for drop-progress claim_drops = at_least_one_value_in_settings_is( self.streamers, "claim_drops", True) if claim_drops is True: self.ws_pool.submit( PubsubTopic( "user-drop-events", user_id=self.twitch.twitch_login.get_user_id(), )) # Going to subscribe to predictions-user-v1. Get update when we place a new prediction (confirm) if make_predictions is True: self.ws_pool.submit( PubsubTopic( "predictions-user-v1", user_id=self.twitch.twitch_login.get_user_id(), )) for streamer in self.streamers: self.ws_pool.submit( PubsubTopic("video-playback-by-id", streamer=streamer)) if streamer.settings.follow_raid is True: self.ws_pool.submit(PubsubTopic("raid", streamer=streamer)) if streamer.settings.make_predictions is True: self.ws_pool.submit( PubsubTopic("predictions-channel-v1", streamer=streamer)) while self.running: time.sleep(random.uniform(20, 60)) # Do an external control for WebSocket. Check if the thread is running # Check if is not None because maybe we have already created a new connection on array+1 and now index is None for index in range(0, len(self.ws_pool.ws)): if (self.ws_pool.ws[index] is not None and self.ws_pool.ws[index].elapsed_last_ping() > 10): logger.info( f"#{index} - The last PING was sent more than 10 minutes ago. Reconnecting to the WebSocket..." ) WebSocketsPool.handle_reconnection( self.ws_pool.ws[index])
def run(self, streamers: list = [], blacklist: list = [], followers=False): if self.running: logger.error("You can't start multiple sessions of this instance!") else: logger.info(f"Start session: '{self.session_id}'", extra={"emoji": ":bomb:"}) self.running = True self.start_datetime = datetime.now() self.twitch.login() if self.claim_drops_startup is True: self.twitch.claim_all_drops_from_inventory() streamers_name: list = [] streamers_dict: dict = {} for streamer in streamers: username = (streamer.username if isinstance( streamer, Streamer) else streamer.lower().strip()) if username not in blacklist: streamers_name.append(username) streamers_dict[username] = streamer if followers is True: followers_array = self.twitch.get_followers() logger.info( f"Load {len(followers_array)} followers from your profile!", extra={"emoji": ":clipboard:"}, ) for username in followers_array: if username not in streamers_dict and username not in blacklist: streamers_dict[username] = username.lower().strip() else: followers_array = [] streamers_name = list( OrderedDict.fromkeys(streamers_name + followers_array)) streamers_name = [ name for name in streamers_name if name not in blacklist ] logger.info( f"Loading data for {len(streamers_name)} streamers. Please wait...", extra={"emoji": ":nerd_face:"}, ) for username in streamers_name: if username in streamers_name: time.sleep(random.uniform(0.3, 0.7)) try: streamer = (streamers_dict[username] if isinstance( streamers_dict[username], Streamer) is True else Streamer(username)) streamer.channel_id = self.twitch.get_channel_id( username) streamer.settings = set_default_settings( streamer.settings, Settings.streamer_settings) streamer.settings.bet = set_default_settings( streamer.settings.bet, Settings.streamer_settings.bet) if streamer.settings.join_chat is True: streamer.irc_chat = ThreadChat( self.username, self.twitch.twitch_login.get_auth_token(), streamer.username, ) self.streamers.append(streamer) except StreamerDoesNotExistException: logger.info( f"Streamer {username} does not exist", extra={"emoji": ":cry:"}, ) # Populate the streamers with default values. # 1. Load channel points and auto-claim bonus # 2. Check if streamers are online # 3. DEACTIVATED: Check if the user is a moderator. (was used before the 5th of April 2021 to deactivate predictions) for streamer in self.streamers: time.sleep(random.uniform(0.3, 0.7)) self.twitch.load_channel_points_context(streamer) self.twitch.check_streamer_online(streamer) # self.twitch.viewer_is_mod(streamer) self.original_streamers = [ streamer.channel_points for streamer in self.streamers ] # If we have at least one streamer with settings = make_predictions True make_predictions = at_least_one_value_in_settings_is( self.streamers, "make_predictions", True) # If we have at least one streamer with settings = claim_drops True # Spawn a thread for sync inventory and dashboard if (at_least_one_value_in_settings_is( self.streamers, "claim_drops", True) is True): self.sync_campaigns_thread = threading.Thread( target=self.twitch.sync_campaigns, args=(self.streamers, ), ) self.sync_campaigns_thread.name = "Sync campaigns/inventory" self.sync_campaigns_thread.start() time.sleep(30) self.minute_watcher_thread = threading.Thread( target=self.twitch.send_minute_watched_events, args=(self.streamers, self.priority), ) self.minute_watcher_thread.name = "Minute watcher" self.minute_watcher_thread.start() self.ws_pool = WebSocketsPool( twitch=self.twitch, streamers=self.streamers, events_predictions=self.events_predictions, ) # Subscribe to community-points-user. Get update for points spent or gains self.ws_pool.submit( PubsubTopic( "community-points-user-v1", user_id=self.twitch.twitch_login.get_user_id(), )) # Going to subscribe to predictions-user-v1. Get update when we place a new prediction (confirm) if make_predictions is True: self.ws_pool.submit( PubsubTopic( "predictions-user-v1", user_id=self.twitch.twitch_login.get_user_id(), )) for streamer in self.streamers: self.ws_pool.submit( PubsubTopic("video-playback-by-id", streamer=streamer)) if streamer.settings.follow_raid is True: self.ws_pool.submit(PubsubTopic("raid", streamer=streamer)) if streamer.settings.make_predictions is True: self.ws_pool.submit( PubsubTopic("predictions-channel-v1", streamer=streamer)) refresh_context = time.time() while self.running: time.sleep(random.uniform(20, 60)) # Do an external control for WebSocket. Check if the thread is running # Check if is not None because maybe we have already created a new connection on array+1 and now index is None for index in range(0, len(self.ws_pool.ws)): if (self.ws_pool.ws[index].is_reconneting is False and self.ws_pool.ws[index].elapsed_last_ping() > 10 and internet_connection_available() is True): logger.info( f"#{index} - The last PING was sent more than 10 minutes ago. Reconnecting to the WebSocket..." ) WebSocketsPool.handle_reconnection( self.ws_pool.ws[index]) if ((time.time() - refresh_context) // 60) >= 30: refresh_context = time.time() for index in range(0, len(self.streamers)): if self.streamers[index].is_online: self.twitch.load_channel_points_context( self.streamers[index])