From 3faeabb7886cbfaca42659028874d7e5e74d4a03 Mon Sep 17 00:00:00 2001 From: Wojciech Kwolek Date: Sun, 9 Jan 2022 05:07:28 +0100 Subject: [PATCH] extract links from messages --- main.py | 33 ++++++++++++++++++++++++++++++--- models.py | 3 +-- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/main.py b/main.py index 3642d62..bbaf429 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,15 @@ -from pprint import pprint import logging import os +import re import sqlite3 from dataclasses import dataclass from datetime import datetime +from pprint import pprint from dotenv import load_dotenv -from telegram import Update -from telegram.ext import CallbackContext, CommandHandler, Updater +from telegram import Update, user +from telegram.ext import (CallbackContext, CommandHandler, MessageHandler, + Updater) from models import Link @@ -15,6 +17,8 @@ load_dotenv() logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') +link_regex = re.compile( + '((https?):((//)|(\\\\))+([\w\d:#@%/;$()~_?\+-=\\\.&](#!)?)*)', re.DOTALL) @dataclass @@ -31,6 +35,7 @@ class Bot: self.updater = Updater(token=self.settings.token, use_context=True) self.dispatcher = self.updater.dispatcher self._register_commands() + self._register_handlers() def _register_commands(self): for f in dir(self): @@ -38,6 +43,11 @@ class Bot: self.dispatcher.add_handler( CommandHandler(f[4:], getattr(self, f))) + def _register_handlers(self): + self.dispatcher.add_handler(MessageHandler( + filters=None, + callback=self.message)) + @property def db(self): return sqlite3.connect(self.settings.db, detect_types=sqlite3.PARSE_DECLTYPES) @@ -75,6 +85,23 @@ class Bot: links = Link.get_unread(db, user_id) pprint(list(links)) + def _natural_count(self, n, singular, plural): + if abs(n) == 1: + return f"{n} {singular}" + return f"{n} {plural}" + + def message(self, update: Update, context: CallbackContext): + user_id = update.effective_user.id + links = re.findall(link_regex, update.message.text) + with self.db as db: + for link in links: + l = Link( + user_id=user_id, + link=link[0], + ) + l.create(db) + context.bot.send_message( + update.effective_chat.id, f"Added {self._natural_count(len(links), 'link', 'links')} to your list.") def run(self): self.updater.start_polling() diff --git a/models.py b/models.py index 21ed878..9a82585 100644 --- a/models.py +++ b/models.py @@ -1,4 +1,3 @@ -from os import read import sqlite3 from dataclasses import dataclass from datetime import datetime @@ -32,7 +31,7 @@ class Link: return cls( id=id, link=link, - user_id=user_id, + user_id=useredid, read_at=read_at, added_at=added_at )