support updates

This commit is contained in:
Wojciech Kwolek 2021-10-16 18:19:12 +02:00
parent f243b8cfc7
commit 8f2ec2c3f9
3 changed files with 60 additions and 12 deletions

View File

@ -1,3 +1,4 @@
SZYNOWO_TOKEN=
SZYNOWO_CHAT=
SZYNOWO_FORWARD_TO=
SZYNOWO_FORWARD_TO=
SZYNOWO_DB=

BIN
db.sqlite3 Normal file

Binary file not shown.

69
main.py
View File

@ -1,9 +1,11 @@
from datetime import datetime
import sqlite3
from typing import Optional, Tuple
from telegram.ext import Updater, CommandHandler, CallbackContext
from telegram import Update, ParseMode
import os
import logging
import random
from dotenv import load_dotenv
load_dotenv()
@ -13,21 +15,37 @@ logging.basicConfig(level=logging.DEBUG,
class Bot:
def __init__(self, token, chat, forward_to=None):
def __init__(self, token, db, chat, forward_to=None):
self.chat = chat
self.db_path = db
self._init_db()
self.forward_to = forward_to or []
self.updater = Updater(token=token, use_context=True)
self.dispatcher = self.updater.dispatcher
self._lastid = None
for f in dir(self):
if f.startswith("cmd_"):
self.dispatcher.add_handler(
CommandHandler(f[4:], getattr(self, f)))
def db(self):
return sqlite3.connect(self.db_path)
def _init_db(self):
with self.db() as db:
cur = db.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
calendar_id TEXT,
telegram_poll_id TEXT);
""")
def cmd_start(self, update: Update, context: CallbackContext):
context.bot.send_message(chat_id=update.effective_chat.id,
text=f'Hi! effective_chat.id={update.effective_chat.id}')
def send_event(self, date: datetime, header: str, description: str, location: str, latlong: Optional[Tuple[float, float]] = None, is_new: bool = True):
def send_event(self, id: str, date: datetime, header: str, description: str, location: str, latlong: Optional[Tuple[float, float]] = None, is_new: bool = True):
messages = []
d = date.strftime("%Y-%m-%d %H:%M")
text = f"""\
@ -42,24 +60,52 @@ _{d}, {location}_
m = self.updater.bot.send_location(
self.chat, latitude=latlong[0], longitude=latlong[1])
messages.append(m)
m = self.updater.bot.send_poll(
self.chat,
f'Wpadasz? ({header})',
['Będę', 'Nie będę', '🍆'],
is_anonymous=False,
allows_multiple_answers=False,
)
messages.append(m)
poll_id = None
if is_new:
m = self.updater.bot.send_poll(
self.chat,
f'Wpadasz? ({header})',
['Będę', 'Nie będę', '🍆'],
is_anonymous=False,
allows_multiple_answers=False,
)
poll_id = m.message_id
with self.db() as db:
cur = db.cursor()
cur.execute(
"INSERT INTO events(calendar_id, telegram_poll_id) VALUES (?, ?)", (str(id), str(poll_id)))
else:
with self.db() as db:
cur = db.cursor()
rows = list(cur.execute(
"SELECT * FROM events WHERE calendar_id = ?;", (str(id),)))
if len(rows) != 1:
raise Exception(
f"None/multiple events with id {id} found in the database")
id, calendar_id, telegram_poll_id = rows[0]
poll_id = telegram_poll_id
for chat in self.forward_to:
for msg in messages:
msg.forward(chat)
self.updater.bot.forward_message(
chat_id=chat, from_chat_id=self.chat, message_id=poll_id)
def cmd_test(self, update: Update, context: CallbackContext):
context.bot.send_message(chat_id=self.chat, text="Test")
self.send_event(datetime.now(), "Header",
id = str(random.randrange(2137, 19823198))
self._lastid = id
self.send_event(id, datetime.now(), "Header",
"Description", "Szynowa 18", (51.060938, 17.057193))
def cmd_update(self, update: Update, context: CallbackContext):
context.bot.send_message(chat_id=self.chat, text="Test")
id = self._lastid
self.send_event(id, datetime.now(), "Header2",
"Description2", "new location", (51.060938, 10), is_new=False)
def cmd_location(self, update: Update, context: CallbackContext):
print(type(update))
context.bot.send_location(
@ -76,6 +122,7 @@ if __name__ == '__main__':
b = Bot(
token=os.environ['SZYNOWO_TOKEN'],
chat=os.environ['SZYNOWO_CHAT'],
db=os.environ['SZYNOWO_DB'],
forward_to=[s.strip() for s in os.environ.get(
'SZYNOWO_FORWARD_TO', '').split(',')],
)