def __init__(self, config, args): self.config = config self.nickname = config['main']['nickname'] self.password = config['main']['password'] self.default_settings['broadcaster'] = config['main']['streamer'] try: self.sqlconn = pymysql.connect(unix_socket=config['sql']['unix_socket'], user=config['sql']['user'], passwd=config['sql']['passwd'], charset='utf8mb4') self.sqlconn.select_db(config['sql']['db']) except pymysql.err.OperationalError as e: error_code, error_message = e.args if error_code == 1045: log.error('Access denied to database with user \'{0}\'. Review your config file.'.format(config['sql']['user'])) elif error_code == 1044: log.error('Access denied to database \'{0}\' with user \'{1}\'. Make sure the database \'{0}\' exists and user \'{1}\' has full access to it.'.format(config['sql']['db'], config['sql']['user'])) else: log.error(e) sys.exit(1) self.sqlconn.autocommit(True) update_database(self.sqlconn) self.load_default_phrases() self.reactor = irc.client.Reactor() self.connection_manager = ConnectionManager(self.reactor, self, TMI.message_limit) client_id = None oauth = None if 'twitchapi' in self.config: if 'client_id' in self.config['twitchapi']: client_id = self.config['twitchapi']['client_id'] if 'oauth' in self.config['twitchapi']: oauth = self.config['twitchapi']['oauth'] self.twitchapi = TwitchAPI(client_id, oauth) self.reactor.add_global_handler('all_events', self._dispatcher, -10) if 'wolfram' in config['main']: Dispatch.wolfram = wolframalpha.Client(config['main']['wolfram']) else: Dispatch.wolfram = None self.whisper_manager = None TyggBot.instance = self self.is_online = False self.ascii_timeout_duration = 120 self.msg_length_timeout_duration = 120 self.base_path = os.path.dirname(os.path.realpath(__file__)) self.data = {} self.data_cb = {} self.data_cb['status_length'] = self.c_status_length self.data_cb['stream_status'] = self.c_stream_status self.data_cb['time_norway'] = self.c_time_norway self.data_cb['bot_uptime'] = self.c_uptime self.data_cb['time_since_latest_deck'] = self.c_time_since_latest_deck self.ignores = [] self.start_time = datetime.now() if 'streamer' in config['main']: self.streamer = config['main']['streamer'] self.channel = '#' + self.streamer elif 'target' in config['main']: self.channel = config['main']['target'] self.streamer = self.channel[1:] self.kvi = KVIData(self.sqlconn) self.tbm = TBMath() self.last_sync = time.time() self.users = UserManager(self.sqlconn) self.emotes = EmoteManager(self.sqlconn) self.emotes.load() self.silent = False self.dev = False if 'flags' in config: self.silent = True if 'silent' in config['flags'] and config['flags']['silent'] == '1' else self.silent self.dev = True if 'dev' in config['flags'] and config['flags']['dev'] == '1' else self.dev self.silent = True if args.silent else self.silent if self.dev: try: current_branch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).decode('utf8').strip() latest_commit = subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode('utf8').strip()[:8] commit_number = subprocess.check_output(['git', 'rev-list', 'HEAD', '--count']).decode('utf8').strip() self.version = '{0} DEV ({1}, {2}, commit {3})'.format(self.version, current_branch, latest_commit, commit_number) log.info(current_branch) except: log.exception('what') if self.silent: log.info('Silent mode enabled') self.reconnection_interval = 5 # Initialize MOTD-printing self.motd_iterator = 0 self.motd_minute = 0 self.motd_messages = [] self.execute_every(60, self.motd_tick) self.load_all() self.whisper_manager = WhisperConnectionManager(self.reactor, self, self.streamer, TMI.whispers_message_limit, TMI.whispers_limit_interval) self.whisper_manager.start(accounts=[{'username': self.nickname, 'oauth': self.password}]) self.num_offlines = 0 self.execute_every(20, self.refresh_stream_status) self.twitter_stream = False if 'twitter' in config: self.use_twitter_stream = 'streaming' in config['twitter'] and config['twitter']['streaming'] == '1' self.init_twitter() else: self.twitter = None # Actions in this queue are run in a separate thread. # This means actions should NOT access any database-related stuff. self.action_queue = ActionQueue() self.action_queue.start() """ For actions that need to access the main thread, we can use the mainthread_queue. """ self.mainthread_queue = ActionQueue() self.execute_every(1, self.mainthread_queue.parse_action) self.link_checker = LinkChecker(self, self.execute_delayed) self.link_tracker = LinkTracker(self.sqlconn) self.pyramid_parser = PyramidParser(self) self.websocket_manager = WebSocketManager(self) """ Update chatters every `update_chatters_interval' minutes. By default, this is set to run every 5 minutes. """ self.execute_every(self.update_chatters_interval * 60, self.action_queue.add, (self.update_chatters_stage1, )) try: if self.config['twitchapi']['update_subscribers'] == '1': self.execute_every(30 * 60, self.action_queue.add, (self.update_subscribers_stage1, )) except: pass
def __init__(self, config, args): self.config = config self.sqlconn = pymysql.connect(unix_socket=config['sql']['unix_socket'], user=config['sql']['user'], passwd=config['sql']['passwd'], db=config['sql']['db'], charset='utf8') self.sqlconn.autocommit(True) update_database(self.sqlconn) self.load_default_phrases() self.reactor = irc.client.Reactor() self.connection = self.reactor.server() self.twitchapi = TwitchAPI(type='api') self.reactor.add_global_handler('all_events', self._dispatcher, -10) if 'wolfram' in config['main']: Dispatch.wolfram = wolframalpha.Client(config['main']['wolfram']) else: wolfram = None self.whisper_conn = None TyggBot.instance = self self.base_path = os.path.dirname(os.path.realpath(__file__)) self.data = {} self.data_cb = {} self.data_cb['status_length'] = self.c_status_length self.data_cb['stream_status'] = self.c_stream_status self.data_cb['time_norway'] = self.c_time_norway self.data_cb['bot_uptime'] = self.c_uptime self.data_cb['time_since_latest_deck'] = self.c_time_since_latest_deck self.ignores = [] self.start_time = datetime.now() if 'streamer' in config['main']: self.streamer = config['main']['streamer'] self.channel = '#' + self.streamer elif 'target' in config['main']: self.channel = config['main']['target'] self.streamer = self.channel[1:] self.kvi = KVIData(self.sqlconn) self.tbm = TBMath() self.last_sync = time.time() self.users = UserManager(self.sqlconn) if 'flags' in config: self.silent = True if 'silent' in config['flags'] and config['flags']['silent'] == '1' else self.silent self.dev = True if 'dev' in config['flags'] and config['flags']['dev'] == '1' else self.dev self.silent = True if args.silent else self.silent if self.silent: log.info('Silent mode enabled') self.sync_from() self.nickname = config['main']['nickname'] self.password = config['main']['password'] self.reconnection_interval = 5 self.load_all() self.whisper_conn = WhisperConn(self.streamer, self.nickname, self.password, self.reactor) self.whisper_conn.connect() self.num_commands_sent = 0 self.connection.execute_every(30, self.reset_command_throttle) self.twitter_stream = False if 'twitter' in config: self.use_twitter_stream = 'streaming' in config['twitter'] and config['twitter']['streaming'] == '1' self.init_twitter() else: self.twitter = None self.connection.execute_every(1, self.shift_emotes) self.ws_clients = [] if 'websocket' in config and config['websocket']['enabled'] == '1': self.init_websocket_server() self.execute_every(1, self.refresh_emote_data) self.urls_to_check = queue.Queue() self.connection.execute_every(1, self.check_urls)