async def main():
    if len(sys.argv) > 1 and sys.argv[1] == 'auth':
        # TODO: perform logout in the code, in case the user use `auth` argument
        logging.critical(
            'You successfully authorized, please, run the same command without `auth` argument to '
            'start monitoring your messages. If you want to log-out, remove the file `db/user.session`, '
            'to log-out and re-execute this command')
        exit(0)

    if not await client.is_user_authorized():
        logging.critical(
            'Please, execute `auth` command before starting the daemon (see `README.md` file)'
        )
        exit(1)

    if bool(os.getenv('NOTIFY_ONGOING_MESSAGES', '1')):
        new_message_event = events.NewMessage()
    else:
        new_message_event = events.NewMessage(incoming=True, outgoing=False)

    client.add_event_handler(on_new_message, new_message_event)
    client.add_event_handler(get_on_message_deleted(client),
                             events.MessageDeleted())

    await cycled_clean_old_messages()
Example #2
0
    async def set_event_handlers(self, channel, origin, messages_map):
        @self.client.on(events.NewMessage(chats=origin))
        async def channeller_new(new_message_event: NewMessage.Event):
            message = new_message_event.message
            if type(message) == MessageService:
                print(message)
                return

            print(message.text)
            # Unlike `JalaliDateTime`, `JalaliDate` doesn't need timestamp-converting
            date_stamp = f'`{en_to_fa(JalaliDate(message.date).strftime("%Y/%m/%d"))}`'
            await self.send_message(date_stamp, message, messages_map, channel,
                                    origin)

        # noinspection PyShadowingNames
        @self.client.on(events.MessageEdited(chats=origin))
        async def channeller_edit(edit_event: MessageEdited.Event):
            print('Message', edit_event.id, 'changed at', edit_event.date)
            message = edit_event.message
            if type(message
                    ) == MessageService or message.id not in messages_map:
                print(message)
                return

            print(message.text)

            # old_message = await self.client.get_messages(channel, ids=messages_map[message.id])

            new_text = message.text
            stamp = f'`{en_to_fa(JalaliDate(message.date).strftime("%Y/%m/%d"))}`'
            message.text = new_text + '\n\n' + stamp

            max_allowed_message_size = 1024 if message.media else 4096
            if len(message.raw_text) > max_allowed_message_size:
                message.text = new_text
            # message.id = messages_map[message.id]
            await self.client.edit_message(
                channel,
                messages_map[message.id],
                text=message.text,
                parse_mode=message.client.parse_mode,
                link_preview=message.web_preview,
                file=message.file,
                # force_document=message.force_document,
                buttons=message.buttons,
                # schedule=message.schedule,
            )

        # noinspection PyShadowingNames
        @self.client.on(events.MessageDeleted(chats=origin))
        async def channeller_delete(delete_event: MessageDeleted.Event):
            message_ids = []
            for msg_id in delete_event.deleted_ids:
                message_ids.append(messages_map[msg_id])
                print('Message', msg_id, 'was deleted in',
                      delete_event.chat_id)

            print(delete_event)

            await self.client.delete_messages(channel, message_ids)
Example #3
0
async def wait_for_updates(saver):
    """
    :type saver: DialogSaver
    """
    client = saver.client

    @client.on(events.NewMessage())
    @client.on(events.MessageEdited())
    async def message_updated_handler(event):
        await event.get_chat()
        await event.get_sender()
        if await filter_event(event):
            saver.save_dialog(event.chat.id,
                              get_display_name(event.chat))  # the dialog
            await saver.process_message(message=event.message,
                                        dialog_id=event.chat_id)

    @client.on(events.MessageRead())
    async def message_read_handler(event):
        if await filter_event(event):
            read_time = datetime.utcnow()
            message_ids = event._message_ids or [event._message_id]
            for message_id in message_ids:
                saver.set_message_attributes(message_id,
                                             {"read_time": read_time},
                                             commit=False)
            saver.commit()

    @client.on(events.MessageDeleted())
    async def message_delete_handler(event):
        if await filter_event(event):
            for message_id in event.deleted_ids:
                saver.set_message_attributes(message_id, {"deleted": True},
                                             commit=False)
            saver.commit()

    while True:
        try:
            logger.info("Catching up")
            await client.catch_up()

            logger.info("Waiting for updates...")
            await client.run_until_disconnected()
        except ConnectionError:
            await sleep(10)
class Command(BaseCommand):
    help = 'Just testing stuff'

    def add_arguments(self, parser):
        #Positional arg example
        parser.add_argument('nothing', nargs='+', type=int)

        # Named (optional) arguments
        parser.add_argument(
            '--delete',
            action='store_true',
            help='Delete poll instead of closing it',
        )

    def handle(self, *args, **options):
        with client:
            client.run_until_disconnected()

    @client.on(events.MessageDeleted())
    async def deletedMessageHandler(event):
        #THIS IS INCOMING DELETE:
        #DeletedEvent: MessageDeleted.Event(original_update=UpdateDeleteChannelMessages(channel_id=1256178279, messages=[133], pts=135, pts_count=1), deleted_id=133, deleted_ids=[133])
        try:
            process_deleted_message(event)
        except AttributeError as e:
            logging.warning("AttributeError: %s" % e)
            pass
        except Exception as e:
            logging.warning("Caught exception: %s" % e)
            pass

    #@client.on(events.NewMessage(pattern=r'(?is).*(entry|closing|close|buy|sell).*', forwards=False))
    @client.on(events.NewMessage())
    async def my_event_handler(event):
        #THIS IS INCOMING MESSAGE:
        #NewMessage.Event(original_update=UpdateNewChannelMessage(message=Message(id=133, to_id=PeerChannel(channel_id=1256178279), date=datetime.datetime(2019, 11, 4, 20, 22, 46, tzinfo=datetime.timezone.utc), message='USDJPY SELL \nEntry 108.533\nSL 109.150\nTp 107.100', out=True, mentioned=False, media_unread=False, silent=False, post=True, from_scheduled=False, legacy=False, edit_hide=False, from_id=None, fwd_from=None, via_bot_id=None, reply_to_msg_id=None, media=None, reply_markup=None, entities=[], views=1, edit_date=None, post_author=None, grouped_id=None, restriction_reason=[]), pts=134, pts_count=1), pattern_match=<re.Match object; span=(0, 48), match='USDJPY SELL \nEntry 108.533\nSL 109.150\nTp 107.1>, message=Message(id=133, to_id=PeerChannel(channel_id=1256178279), date=datetime.datetime(2019, 11, 4, 20, 22, 46, tzinfo=datetime.timezone.utc), message='USDJPY SELL \nEntry 108.533\nSL 109.150\nTp 107.100', out=True, mentioned=False, media_unread=False, silent=False, post=True, from_scheduled=False, legacy=False, edit_hide=False, from_id=None, fwd_from=None, via_bot_id=None, reply_to_msg_id=None, media=None, reply_markup=None, entities=[], views=1, edit_date=None, post_author=None, grouped_id=None, restriction_reason=[]))
        try:
            process_new_message(event)
        except AttributeError as e:
            logging.warning("AttributeError: %s" % e)
            pass
        except Exception as e:
            logging.warning("Caught exception: %s" % e)
            pass
Example #5
0
        ignored_ids = [1234902837]
        if type(
                event.message.to_id
        ) is PeerChannel and event.message.to_id.channel_id in ignored_ids:

            return

        c.execute(
            "INSERT INTO messages (message_id, message, created) VALUES (?, ?, ?)",
            (event.message.id,
             sqlite3.Binary(SerializableMessage.serialize(
                 event.message)), str(datetime.now())))
        conn.commit()

    @client.on(events.MessageDeleted())
    async def handler(event: events.MessageDeleted.Event):
        db_result = c.execute(
            "SELECT message_id, message FROM messages WHERE message_id IN ({0})"
            .format(",".join(str(e) for e in event.deleted_ids))).fetchall()

        messages = [SerializableMessage.deseriaze(i[1]) for i in db_result]

        log_deleted_usernames = []

        for message in messages:
            user_request = await client(GetFullUserRequest(message.from_id))
            user = user_request.user

            if user.first_name or user.last_name:
                mention_username = \
def main():
    logging.basicConfig(level=logging.ERROR)
    extract_configs()
    setup_telegram_connection()
    setup_sqlite_connection('logs.sqlite')

    @CLIENT.on(events.NewMessage())
    async def handlerNewMessage(event):
        try:
            await record_message(event.message, CLIENT)
        except KeyboardInterrupt:
            raise
        except Exception as e:
            print(e)

    @CLIENT.on(events.ChatAction())
    async def handlerChatAction(event):
        event_name = type(event.original_update.message.action).__name__
        date = event.original_update.message.date
        date = date.strftime('%Y.%d.%m %H:%M:%S %a')
        attributes = event.original_update.message.action.__dict__
        attributes['id'] = event.original_update.message.id
        attributes['to_id'] = list(
            event.original_update.message.to_id.__dict__.values())[
                0]  ###########
        attributes['event_name'] = event_name
        attributes['date'] = date
        for k, v in attributes.items():
            if type(v) == list:
                attributes[k] = str(v)
        columns = ','.join(str(e) for e in list(attributes.keys()))
        placeholders = ':' + ', :'.join(
            str(e) for e in list(attributes.keys()))
        CURSOR.execute(
            "INSERT INTO ChatActions (%s) VALUES (%s)" %
            (columns, placeholders), attributes)
        CONN.commit()

    @CLIENT.on(events.MessageEdited())
    async def handlerMessageEdited(event):
        _id = event.message.id
        _to_id = list(event.message.to_id.__dict__.values())[0]
        _from_id = event.message.from_id
        _message = event.message.message
        _date = event.message.date.strftime('%Y.%d.%m %H:%M:%S %a')
        CURSOR.execute(
            "UPDATE Messages SET edited=1 WHERE to_id=:to_id AND id=:id", {
                'id': _id,
                'to_id': _to_id
            })
        CURSOR.execute(
            "INSERT INTO Edited VALUES (:id, :to_id, :from_id, :message, :date)",
            {
                'id': _id,
                'to_id': _to_id,
                'from_id': _from_id,
                'message': _message,
                'date': _date
            })
        CONN.commit()

    @CLIENT.on(events.MessageDeleted())
    async def handlerMessageDeleted(event):
        print(event)
        for i in range(len(event.deleted_ids)):
            attributes = []
            values = []
            attributes.append("id=" + str(event.deleted_ids[i]))
            values.append(str(event.deleted_ids[i]))
            if isinstance(event.original_update, UpdateDeleteChannelMessages):
                attributes.append("to_id=" +
                                  str(event.original_update.channel_id))
                values.append(str(event.original_update.channel_id))

            CURSOR.execute("UPDATE Messages SET deleted=1 WHERE %s" %
                           ' AND '.join(attributes))
            #for i in range(len(event.deleted_ids)):
            current_time = datetime.datetime.now()
            values.append(current_time.strftime('"%Y.%d.%m %H:%M:%S %a"'))
            CURSOR.execute("INSERT INTO Deleted VALUES (%s)" %
                           ', '.join(values))
        CONN.commit()

    @CLIENT.on(events.UserUpdate())
    async def handlerUserUpdate(event):
        id = event.original_update.user_id
        try:
            user = (await CLIENT(
                GetFullUserRequest(await CLIENT.get_input_entity(id)))).user
            username = user.username
            first_name = user.first_name
            last_name = user.last_name
        except Exception as e:
            print(e)
            username = ""
            first_name = ""
            last_name = ""
        event_name = type(event.original_update).__name__
        attributes = event.original_update.status.__dict__
        if len(list(attributes.values())) > 0:
            date = list(attributes.values())[0]
        else:
            date = [0, 0, 0, 0, 0, 0]
        date = date.strftime('%Y.%d.%m %H:%M:%S %a')
        CURSOR.execute(
            "INSERT INTO UserUpdates VALUES(:id, :username, :firstName, :lastName, :update, :date)",
            {
                'id': id,
                'username': username,
                'firstName': first_name,
                'lastName': last_name,
                'update': event_name,
                'date': date
            })
        CONN.commit()

    CLIENT.start()
    CLIENT.run_until_disconnected()
    CONN.close()
Example #7
0
        return

    logging.info(f"Message deleted in {chat_id}")

    event_uid = EventUid(event)
    fwded_msgs = _stored.get(event_uid)
    if fwded_msgs:
        for msg in fwded_msgs:
            await msg.delete()
        return


ALL_EVENTS = {
    "new": (new_message_handler, events.NewMessage()),
    "edited": (edited_message_handler, events.MessageEdited()),
    "deleted": (deleted_message_handler, events.MessageDeleted()),
}

ALL_EVENTS.update(BOT_EVENTS)

for _, plugin in plugins.items():
    try:
        event_handlers = getattr(plugin, "event_handlers")
        if event_handlers:
            ALL_EVENTS.update(event_handlers)
    except AttributeError:
        pass


def start_sync():
    """Start tgcf live sync."""
Example #8
0
                               url=url,
                               chat_id=share_id,
                               post_time=datetime.fromtimestamp(
                                   event.date.timestamp()),
                               sender=sender)
                self.newest_msg[share_id] = msg
                self._indexer.add_document(msg)

        @self.session.on(events.MessageEdited())
        async def client_message_update_handler(
                event: events.MessageEdited.Event):
            if self._should_monitor(
                    event.chat_id) and (msg_text := self._extract_text(event)):
                share_id = get_share_id(event.chat_id)
                url = f'https://t.me/c/{share_id}/{event.id}'
                self._logger.info(
                    f'Update message {url} to: "{brief_content(msg_text)}"')
                self._indexer.update(url=url, content=msg_text)

        @self.session.on(events.MessageDeleted())
        async def client_message_delete_handler(
                event: events.MessageDeleted.Event):
            if not hasattr(event, 'chat_id') or event.chat_id is None:
                return
            share_id = get_share_id(event.chat_id)
            if event.chat_id and self._should_monitor(event.chat_id):
                for msg_id in event.deleted_ids:
                    url = f'https://t.me/c/{share_id}/{msg_id}'
                    self._logger.info(f'Delete message {url}')
                    self._indexer.delete(url=url)
Example #9
0
    async def handle(self):
        me = await self._client.get_me()
        messages_buffer = MessagesBuffer(limit=self._messages_buffer_size)

        @self._client.on(event=events.NewMessage(incoming=True))
        @self._notify(me=me)
        async def handler_new(event):
            print('Received message: {event}'.format(event=event))

            print('Adding message to buffer...')
            message = event.message
            messages_buffer.add(message=message)
            print(
                'Message with id: {id} added to buffer. Current buffer size: {size}/{capacity}'
                .format(id=message.id,
                        size=messages_buffer.size,
                        capacity=self._messages_buffer_size))

        @self._client.on(event=events.MessageEdited(incoming=True))
        @self._notify(me=me)
        async def handler_edited(event):
            print('Received edit for message: {event}'.format(event=event))
            print('Adding edited message to buffer...')
            message = event.message
            messages_buffer.add(message=message)
            print(
                'Edited message with id: {id} added to buffer. Current buffer size: {size}/{capacity}'
                .format(id=message.id,
                        size=messages_buffer.size,
                        capacity=self._messages_buffer_size))

        @self._client.on(event=events.MessageDeleted())
        @self._notify(me=me)
        async def handler_deleted(event):
            print('Messages deletion event received: {messages}'.format(
                messages=event))
            for deleted_id in event.deleted_ids:
                message = messages_buffer.get(deleted_id)

                if message is not None:
                    print('Message with id: {id} found in messages buffer'.
                          format(id=deleted_id))

                    print(
                        'Forwarding {revisions} revisions of message with id: {id}...'
                        .format(revisions=len(message.revisions),
                                id=deleted_id))

                    for index, revision in enumerate(message.revisions):
                        print('Forwarding revision: {revision}...'.format(
                            revision=revision))
                        await self._resend_message(to=me,
                                                   revision_number=index + 1,
                                                   message=revision)
                        messages_buffer.remove(deleted_id)
                        print('Revision forwarded')

                    print('Message with id: {id} forwarded'.format(
                        id=deleted_id))
                else:
                    print('Message with id: {id} not found in message buffer'.
                          format(id=deleted_id))

        try:
            await self._client.run_until_disconnected()
        finally:
            self._client.disconnect()
Example #10
0
    elif text in cmds:
        await actions[text]


async def download_handler():
    # Referencing to the global variables
    global client, queue, conn, is_downloading

    # Stopping if one media is downloading
    if not is_downloading:
        is_downloading = True
        await download.download(client, queue, conn)
        is_downloading = False


@client.on(events.MessageDeleted(chats=chat))
async def remove_handler(event):
    # Deleting every file which correspond
    #  to a deleted Telegram's message
    for msg_id in event.deleted_ids:
        file = dbm.delete_message(conn, msg_id)
        if (file != ""):
            remove(file)
        else:
            print("The message wasn't in database and thus it isn't deleted")


if __name__ == "__main__":
    # Creating the download folder if it doesn't exist
    if not path.isdir(download_folder):
        mkdir(download_folder)