Ejemplo n.º 1
0
    def __init__(self, token, owner_id):
        # create folder for audio storage
        create_directory(self.FILES_DIRECTORY)

        self._mongo = MongoClientWrapper(MONGO)
        super(GatherValidateBot, self).__init__(
            token,
            [
                # Handler for the chat actions
                pave_event_space()(per_chat_id_except([owner_id]),
                                   create_open,
                                   GatherValidateChatHandler,
                                   self._mongo,
                                   timeout=1000000),
                pave_event_space()(per_chat_id_in([owner_id]),
                                   create_open,
                                   OwnerHandler,
                                   self._mongo,
                                   timeout=1000000),

                # download voice file
                (self._is_voice, custom_thread(call(self._download_and_store))
                 ),

                # announce to all users
                (self._is_announce, custom_thread(call(self._announce)))
            ])
Ejemplo n.º 2
0
	def __init__(self,token):
		self.adminconfig()
		self.timeconfig()
		x.loadConfig()
		config1.read('telebot.ini')
		idadmin = config1.get('admin','chatid')
		x.camStart()
		super(ChatBox, self).__init__(token, [
			include_callback_query_chat_id(pave_event_space())(per_chat_id_in([int(idadmin)],types='private'), create_open, SmartRoomChat, timeout=90),
			pave_event_space()(per_chat_id_except([int(idadmin)],types='private'), create_open, NonAdmin, timeout=10),
				])
Ejemplo n.º 3
0
    def __init__(self, token, owner_id):
        self._owner_id = owner_id
        self._seen = set()
        self._store = UnreadStore()

        super(ChatBox, self).__init__(token, [
            # Here is a delegate to specially handle owner commands.
            (per_chat_id_in([owner_id]), create_open(OwnerHandler, 20, self._store)),

            # Seed is always the same, meaning only one MessageSaver is ever spawned for entire application.
            (lambda msg: 1, create_open(MessageSaver, self._store, exclude=[owner_id])),

            # For senders never seen before, send him a welcome message.
            (self._is_newcomer, custom_thread(call(self._send_welcome))),
        ])
Ejemplo n.º 4
0
    def __init__(self, token, owner_id):
        self._owner_id = owner_id
        self._seen = set()
        self._store = UnreadStore()

        super(ChatBox, self).__init__(token, [
            # Here is a delegate to specially handle owner commands.
            pave_event_space()(
                per_chat_id_in([owner_id]), create_open, OwnerHandler, self._store, timeout=20),

            # Only one MessageSaver is ever spawned for entire application.
            (per_application(), create_open(MessageSaver, self._store, exclude=[owner_id])),

            # For senders never seen before, send him a welcome message.
            (self._is_newcomer, custom_thread(call(self._send_welcome))),
        ])
Ejemplo n.º 5
0
    def __init__(self, token, owner_id):
        self._owner_id = owner_id
        self._seen = set()
        self._store = UnreadStore()

        super(ChatBox, self).__init__(token, [
            # Here is a delegate to specially handle owner commands.
            pave_event_space()(
                per_chat_id_in([owner_id]), create_open, OwnerHandler, self._store, timeout=20),

            # Only one MessageSaver is ever spawned for entire application.
            (per_application(), create_open(MessageSaver, self._store, exclude=[owner_id])),

            # For senders never seen before, send him a welcome message.
            (self._is_newcomer, custom_thread(call(self._send_welcome))),
        ])
Ejemplo n.º 6
0
def main():
    global bot, authorized_users, verbose, scheduler, owm, owm_api_key, city_list
    config_filename = 'weatherbot-config.json'
    try:
        with open(config_filename, 'r') as config_file:
            config = json.load(config_file)
    except FileNotFoundError:
        print('Error: config file "{}" not found: {}'.format(config_filename))
        return
    except ValueError as e:
        print('Error: invalid config file "{}": {}'.format(config_filename, e))
        return
    telegram_bot_token = config.get('telegram_bot_token')
    if not telegram_bot_token:
        print('Error: config file doesn’t contain a `telegram_bot_token`')
        return
    authorized_users = config.get('authorized_users')
    if type(authorized_users) is not list or len(authorized_users) == 0:
        print('Error: config file doesn’t contain an `authorized_users` list')
        return
    verbose = config.get('verbose', True)
    owm_api_key = config.get('openweathermap', {}).get('api_key')
    owm = OpenWeatherMap(owm_api_key) if owm_api_key else None

    city_list_filename = config.get('openweathermap', {}).get('city_list')
    city_list = CityList()
    if city_list_filename:
        city_list.read(
            city_list_filename, lambda p: print(
                '\rLoading city list ... {:d}%'.format(p), end='', flush=True))
        print()

    bot = telepot.DelegatorBot(telegram_bot_token, [
        include_callback_query_chat_id(pave_event_space())(per_chat_id_in(
            authorized_users, types='private'),
                                                           create_open,
                                                           ChatUser,
                                                           timeout=3600)
    ])
    scheduler.start()
    try:
        bot.message_loop(run_forever='Bot listening ...')
    except KeyboardInterrupt:
        pass
    if verbose:
        print('Exiting ...')
    scheduler.shutdown()
Ejemplo n.º 7
0
 def __init__(self, config, on_idle_timeout=None):
     self.config = config
     if on_idle_timeout is not None:
         self.on_idle_timeout = on_idle_timeout
     else:
         self.on_idle_timeout = config.ON_IDLE_TIMEOUT
     super(TwitterBotDelegatorBot, self).__init__(
         config.TELEGRAM_BOT_TOKEN,
         [
             # Here is a delegate to specially handle owner commands.
             delegate.pave_event_space()(
                 delegate.per_chat_id_in(config.AUTHORIZED_USERS,
                                         types='private'),
                 delegate.create_open,
                 TwitterBotChatHandler,
                 # Add handler arguments here
                 config=config,
                 timeout=self.on_idle_timeout)
         ])
Ejemplo n.º 8
0
    def __init__(self, token):
        self._seen = set()
        self._store = MongoStore()

        super(ChatBox, self).__init__(
            token,
            [
                # Here is a delegate to specially handle owner commands.
                pave_event_space()(per_chat_id_in(self._store.getUsers()),
                                   create_open,
                                   CommandsBrain,
                                   self._store,
                                   timeout=100),

                # Only one MessageSaver is ever spawned for entire application.
                (per_application(),
                 create_open(MessageSaver, self._store, exclude=[])),

                # For senders never seen before, send him a welcome message.
                (self._is_newcomer, print('Welcome mate!')),
            ])
Ejemplo n.º 9
0
def main():
    global bot, authorized_users, cameras, verbose, settings, \
        scheduler, cronsched, \
        encodings, path_to_ffmpeg, max_photo_size, \
        snapshot_queue, snapshooter, copy_to, \
        do_send_text, text_queue, max_text_file_size, \
        do_send_documents, document_queue, \
        do_send_videos, video_queue, video_processor, \
        audio_on, audio_volume, voice_queue, voice_processor, upload_folder, \
        do_send_photos, photo_queue, photo_processor
    config_filename = 'smarthomebot-config.json'
    shelf = shelve.open('.smarthomebot.shelf')
    if APPNAME in shelf.keys():
        settings = easydict(shelf[APPNAME])
    try:
        with open(config_filename, 'r') as config_file:
            config = json.load(config_file)
    except FileNotFoundError as e:
        print('Error: config file not found: {}'.format(e))
        return
    except ValueError as e:
        print('Error: invalid config file "{}": {}'.format(config_filename, e))
        return
    telegram_bot_token = config.get('telegram_bot_token')
    if not telegram_bot_token:
        print('Error: config file doesn\'t contain a `telegram_bot_token`')
        return
    authorized_users = config.get('authorized_users')
    if type(authorized_users) is not list or len(authorized_users) == 0:
        print('Error: config file doesn\'t contain an `authorized_users` list')
        return
    cameras = config.get('cameras')
    if type(cameras) is not dict:
        print('Error: config file doesn\'t define any `cameras`')
        return
    timeout_secs = config.get('timeout_secs', 10 * 60)
    upload_folder = config.get('image_folder', '/home/ftp-upload')
    event_handler = UploadDirectoryEventHandler(ignore_directories=True)
    observer = Observer()
    observer.schedule(event_handler, upload_folder, recursive=True)
    try:
        observer.start()
    except OSError as e:
        import pwd
        print(
            'ERROR: Cannot start observer. Make sure the folder {:s} exists and is writable for {:s}.'
            .format(upload_folder,
                    pwd.getpwuid(os.getuid()).pw_name))
        return
    path_to_ffmpeg = config.get('path_to_ffmpeg')
    max_photo_size = config.get('max_photo_size', TELEGRAM_MAX_PHOTO_DIMENSION)
    verbose = config.get('verbose', False)
    do_send_photos = config.get('send_photos', False)
    do_send_videos = config.get('send_videos', True)
    do_send_text = config.get('send_text', False)
    copy_to = config.get('copy_to', None)
    if isinstance(copy_to, str):
        if not os.path.isdir(copy_to):
            print('Error: {:s} (`copy_to`) doesn\'t point to a directory.'.
                  format(copy_to))
            return
        if not os.access(copy_to, os.W_OK):
            print('Error: {:s} (`copy_to`) is not writable.'.format(copy_to))
            return
        if verbose:
            print('All received surveillance files will be backed up to {:s}'.
                  format(copy_to))

    max_text_file_size = config.get('max_text_file_size',
                                    10 * TELEGRAM_MAX_MESSAGE_SIZE)
    do_send_documents = config.get('send_documents', False)
    audio_on = config.get('audio', {}).get('enabled', False)
    audio_volume = config.get('audio', {}).get('volume', 1.0)
    bot = telepot.DelegatorBot(telegram_bot_token, [
        include_callback_query_chat_id(pave_event_space())(
            per_chat_id_in(authorized_users, types='private'),
            create_open,
            ChatUser,
            timeout=timeout_secs)
    ])
    snapshot_queue = queue.Queue()
    snapshooter = threading.Thread(target=take_snapshot_thread)
    snapshooter.start()
    if do_send_text:
        text_queue = queue.Queue()
        text_processor = threading.Thread(target=process_text_thread)
        text_processor.start()
        if verbose:
            print('Enabled text processing.')
    if do_send_documents:
        document_queue = queue.Queue()
        document_processor = threading.Thread(target=process_document_thread)
        document_processor.start()
        if verbose:
            print('Enabled document processing.')
    if do_send_photos:
        photo_queue = queue.Queue()
        photo_processor = threading.Thread(target=process_photo_thread)
        photo_processor.start()
        if verbose:
            print('Enabled photo processing.')
    if do_send_videos:
        video_queue = queue.Queue()
        video_processor = threading.Thread(target=process_video_thread)
        video_processor.start()
        if verbose:
            print('Enabled video processing.')
    if audio_on:
        try:
            pygame.mixer.pre_init(frequency=TELEGRAM_AUDIO_BITRATE,
                                  size=-16,
                                  channels=2,
                                  buffer=4096)
            pygame.mixer.init()
        except:
            print("\nWARNING: Cannot initialize audio.\n"
                  "*** See above warnings for details.\n"
                  "*** Consider deactivating audio in your \n"
                  "*** SurveillanceBot config file.\n")
            audio_on = False
        else:
            voice_queue = queue.Queue()
            voice_processor = threading.Thread(target=process_voice_thread)
            voice_processor.start()
            if verbose:
                print('Enabled audio processing.')
    if verbose:
        print('Monitoring {} ...'.format(upload_folder))
    scheduler.start()
    scheduler.add_job(garbage_collector, 'cron', hour=0)
    try:
        bot.message_loop(
            run_forever='Bot listening ... (Press Ctrl+C to exit.)')
    except KeyboardInterrupt:
        pass
    if verbose:
        print('Exiting ...')
    observer.stop()
    observer.join()
    shelf[APPNAME] = settings
    shelf.sync()
    shelf.close()
    scheduler.shutdown()

    snapshot_queue.put(None)
    snapshooter.join()
    if do_send_videos:
        video_queue.put(None)
        video_processor.join()
    if do_send_photos:
        photo_queue.put(None)
        photo_processor.join()
    if do_send_text:
        text_queue.put(None)
        text_processor.join()
    if do_send_documents:
        document_queue.put(None)
        document_processor.join()
    if audio_on:
        voice_queue.put(None)
        voice_processor.join()