extract links from messages

This commit is contained in:
Wojciech Kwolek 2022-01-09 05:07:28 +01:00
parent 4c678da1fe
commit 3faeabb788
2 changed files with 31 additions and 5 deletions

33
main.py
View File

@ -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()

View File

@ -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
)