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 logging
import os import os
import re
import sqlite3 import sqlite3
from dataclasses import dataclass from dataclasses import dataclass
from datetime import datetime from datetime import datetime
from pprint import pprint
from dotenv import load_dotenv from dotenv import load_dotenv
from telegram import Update from telegram import Update, user
from telegram.ext import CallbackContext, CommandHandler, Updater from telegram.ext import (CallbackContext, CommandHandler, MessageHandler,
Updater)
from models import Link from models import Link
@ -15,6 +17,8 @@ load_dotenv()
logging.basicConfig(level=logging.DEBUG, logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
link_regex = re.compile(
'((https?):((//)|(\\\\))+([\w\d:#@%/;$()~_?\+-=\\\.&](#!)?)*)', re.DOTALL)
@dataclass @dataclass
@ -31,6 +35,7 @@ class Bot:
self.updater = Updater(token=self.settings.token, use_context=True) self.updater = Updater(token=self.settings.token, use_context=True)
self.dispatcher = self.updater.dispatcher self.dispatcher = self.updater.dispatcher
self._register_commands() self._register_commands()
self._register_handlers()
def _register_commands(self): def _register_commands(self):
for f in dir(self): for f in dir(self):
@ -38,6 +43,11 @@ class Bot:
self.dispatcher.add_handler( self.dispatcher.add_handler(
CommandHandler(f[4:], getattr(self, f))) CommandHandler(f[4:], getattr(self, f)))
def _register_handlers(self):
self.dispatcher.add_handler(MessageHandler(
filters=None,
callback=self.message))
@property @property
def db(self): def db(self):
return sqlite3.connect(self.settings.db, detect_types=sqlite3.PARSE_DECLTYPES) return sqlite3.connect(self.settings.db, detect_types=sqlite3.PARSE_DECLTYPES)
@ -75,6 +85,23 @@ class Bot:
links = Link.get_unread(db, user_id) links = Link.get_unread(db, user_id)
pprint(list(links)) 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): def run(self):
self.updater.start_polling() self.updater.start_polling()

View File

@ -1,4 +1,3 @@
from os import read
import sqlite3 import sqlite3
from dataclasses import dataclass from dataclasses import dataclass
from datetime import datetime from datetime import datetime
@ -32,7 +31,7 @@ class Link:
return cls( return cls(
id=id, id=id,
link=link, link=link,
user_id=user_id, user_id=useredid,
read_at=read_at, read_at=read_at,
added_at=added_at added_at=added_at
) )