From df4dbf8df88bdcb0ba47a9090f08339685c7309b Mon Sep 17 00:00:00 2001 From: Johnny Gear Date: Thu, 13 Nov 2025 22:03:20 -0600 Subject: [PATCH] Telegram --- generate.py | 2 +- orders.py | 75 +++++++++++++++++++++++++++++++++++---------------- scheduling.py | 6 ++--- settings.py | 3 +++ telegram.py | 35 ++++++++++++++++++++++++ util.py | 14 ++++++++++ 6 files changed, 108 insertions(+), 27 deletions(-) create mode 100644 telegram.py diff --git a/generate.py b/generate.py index 850b371..a701514 100644 --- a/generate.py +++ b/generate.py @@ -59,7 +59,7 @@ def generate_order(): orders_config = read_config() - if orders_config['orders_probability'] > random.random(): + if orders_config['orders_probability'] < random.random(): # No orders today return { } diff --git a/orders.py b/orders.py index 581dd0a..eeaa74b 100644 --- a/orders.py +++ b/orders.py @@ -5,36 +5,58 @@ from util import make_session from generate import generate_order, generate_punishment from db import Database from mastodon import Mastodon +from telegram import Telegram from settings import MASTODON_USERNAME, ORDER_TIMEOUT +from util import order_time logger = logging.getLogger(__name__) async def order_issue(): - orders_info = generate_order() - - if 'orders' not in orders_info: - logger.info("No orders for today") - return - - post = "Here are today's orders for @%s - \n\n" % MASTODON_USERNAME - if "count" in orders_info and orders_info['count'] > 1: - post += f"These are the same orders from the last {orders_info['count']} days\n\n" - post += "\n".join(orders_info['orders']) - async with make_session() as session: - m = Mastodon(session) - status = await m.statusPost(post) - db = Database() + orders_info = generate_order() - db.order_status_put( - status['id'], - status['created_at'], - post - ) + if 'orders' not in orders_info: + logger.info("No orders for today") + return + + orders_str = "\n".join(orders_info['orders']) + + due_by = "Proof of compliance is due by %s" % ( + (datetime.datetime.combine( + datetime.datetime.today(), + order_time() + ) + ORDER_TIMEOUT + ).strftime("%H:%M %p") + ) + + m_post = "Here are today's orders for @%s -\n\n" % MASTODON_USERNAME + if "count" in orders_info and orders_info['count'] > 1: + m_post += f"These are the same orders from the last {orders_info['count']} days\n\n" + m_post += orders_str + "\n\n" + m_post += due_by + + m = Mastodon(session) + m_status = await m.statusPost(m_post) + + t_post = "Here are your orders -\n\n" + t_post += orders_str + "\n\n" + t_post += due_by + "\n\n" + t_post += m_status['url'] + + t = Telegram(session) + await t.message_send(t_post) + + db = Database() + db.order_status_put( + m_status['id'], + m_status['created_at'], + m_post + ) async def order_check(): async with make_session() as session: m = Mastodon(session) + t = Telegram(session) db = Database() outstanding_orders = db.order_status_outstanding() @@ -61,17 +83,24 @@ async def order_check(): logger.info('Time to issue a punishment for %s' % outstanding_order['created_at']) punishment = generate_punishment() + punishment_str = "\n".join(punishment) - post = "@%s has failed to post proof of compliance. Punishment is as follows -\n\n" % MASTODON_USERNAME - post += "\n".join(punishment) + m_post = "@%s has failed to post proof of compliance. Here is the punishment -\n\n" % MASTODON_USERNAME + m_post += punishment_str punishment_status = await m.statusPost( - post, + m_post, in_reply_to_id=outstanding_order['mastodon_id'] ) + + t_post = "You failed to show proof of compliance. Here is your punishment -\n\n" + t_post += punishment_str + "\n\n" + t_post += punishment_status['url'] + await t.message_send(t_post) + db.punishment_status_put( outstanding_order['id'], punishment_status['id'], punishment_status['created_at'], - post + m_post ) diff --git a/scheduling.py b/scheduling.py index 948d236..d9490f3 100644 --- a/scheduling.py +++ b/scheduling.py @@ -7,6 +7,7 @@ from scheduler.asyncio import Scheduler from settings import TIMEZONE, ORDER_TIME, ORDER_TIMEOUT from orders import order_issue, order_check from db import Database +from util import order_time logger = logging.getLogger(__name__) @@ -19,9 +20,8 @@ class OrderScheduler(): self.scheduler = Scheduler(loop=loop, tzinfo=self.tz) - order_time_arr = list(map(int, ORDER_TIME.split(':'))) - order_time = datetime.time(hour=order_time_arr[0], minute=order_time_arr[1], tzinfo=self.tz) - self.scheduler.daily(order_time, self.scheduled_order) + order_time_dt = order_time() + self.scheduler.daily(order_time_dt, self.scheduled_order) logger.info(self.scheduler) diff --git a/settings.py b/settings.py index e4dcd5f..b521324 100644 --- a/settings.py +++ b/settings.py @@ -10,6 +10,9 @@ MASTODON_USERNAME = os.environ.get('MASTODON_USERNAME') MASTODON_INSTANCE = os.environ.get("MASTODON_INSTANCE") MASTODON_ACCESS_TOKEN = os.environ.get('MASTODON_ACCESS_TOKEN') +TELEGRAM_API_TOKEN = os.environ.get('TELEGRAM_API_TOKEN') +TELEGRAM_CHAT_ID = os.environ.get('TELEGRAM_CHAT_ID') + SQLITE_DB = os.environ.get('SQLITE_DB', 'db.sqlite3') ORDERS_YML = os.environ.get('ORDERS_YML', 'orders.yml') diff --git a/telegram.py b/telegram.py new file mode 100644 index 0000000..dae3523 --- /dev/null +++ b/telegram.py @@ -0,0 +1,35 @@ +import json +import logging + +from settings import TELEGRAM_API_TOKEN, TELEGRAM_CHAT_ID + +logger = logging.getLogger(__name__) + +TELEGRAM_API_URL = 'https://api.telegram.org/bot' + +class Telegram: + def __init__(self, aiosession): + if TELEGRAM_API_TOKEN is None: + raise Exception("TELEGRAM_API_TOKEN is required") + + self.aiosession = aiosession + + async def post(self, request, data): + async with self.aiosession.post('{}{}/{}'.format( + TELEGRAM_API_URL, + TELEGRAM_API_TOKEN, + request + ), json=data) as response: + if not response.ok: + logger.error('{} {}'.format(request, response.status)) + raise Exception('{} {}'.format(request, response.status)) + + return await response.json() + + async def message_send(self, text): + data = { + 'chat_id': TELEGRAM_CHAT_ID, + 'text': text + } + + return await self.post('sendMessage', data=data) diff --git a/util.py b/util.py index a92f5b2..61197b0 100644 --- a/util.py +++ b/util.py @@ -1,4 +1,18 @@ import aiohttp +import pytz +import datetime + +from settings import TIMEZONE, ORDER_TIME def make_session(): return aiohttp.ClientSession() + +def order_time(): + tz = pytz.timezone(TIMEZONE) + + order_time_arr = list(map(int, ORDER_TIME.split(':'))) + return datetime.time( + hour=order_time_arr[0], + minute=order_time_arr[1], + tzinfo=tz + )