import logging import os import sqlite3 from dataclasses import dataclass from datetime import datetime from dotenv import load_dotenv from telegram import Update from telegram.ext import CallbackContext, CommandHandler, Updater from models import Link load_dotenv() logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') @dataclass class BotSettings: token: str db: str class Bot: def __init__(self, settings: BotSettings): self.settings = settings self._init_db() self.updater = Updater(token=self.settings.token, use_context=True) self.dispatcher = self.updater.dispatcher self._register_commands() def _register_commands(self): for f in dir(self): if f.startswith("cmd_"): self.dispatcher.add_handler( CommandHandler(f[4:], getattr(self, f))) @property def db(self): return sqlite3.connect(self.settings.db) def _init_db(self): with self.db as db: cur = db.cursor() cur.execute(""" CREATE TABLE IF NOT EXISTS links ( id INTEGER PRIMARY KEY AUTOINCREMENT, link TEXT, user_id TEXT, read_at DATETIME, added_at DATETIME ); """) def cmd_start(self, update: Update, context: CallbackContext): context.bot.send_message(chat_id=update.effective_chat.id, text='Hi!') # TODO: timezones # TODO: ask to set time or something def cmd_test(self, update: Update, context: CallbackContext): l = Link( link="2137", user_id="papiez" ) with self.db as db: l.create(db) def run(self): self.updater.start_polling() if __name__ == '__main__': s = BotSettings( token=os.environ['READLATER_TOKEN'], db=os.environ.get('READLATER_DB', './db.sqlite3'), ) b = Bot(s) b.run()