Skip to content

Commit bc8ea1a

Browse files
authored
Merge pull request #38 from gnatykdm/Sending-Automatically-Messages
Sending automatically messages
2 parents f2c637a + 278a5f8 commit bc8ea1a

File tree

12 files changed

+129
-11
lines changed

12 files changed

+129
-11
lines changed

telegram_bot_project/.idea/dictionaries/project.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

telegram_bot_project/bot/buttons.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# bot/buttons.py
12
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, ReplyKeyboardMarkup, KeyboardButton
23
from messages import *
34

@@ -152,4 +153,4 @@ def evening_routine_keyboard() -> ReplyKeyboardMarkup:
152153
keyboard=keyboard,
153154
resize_keyboard=True,
154155
row_width=2
155-
)
156+
)

telegram_bot_project/bot/callbacks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
# bot/callbacks.py
12
from typing import Optional
2-
from aiogram import types
33
from aiogram.fsm.context import FSMContext
44

55
from bot.buttons import *

telegram_bot_project/bot/commands.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1+
# bot/commands.py
12
from typing import List
2-
from aiogram import types
33
from aiogram.fsm.context import FSMContext
44

55
from bot.utills import format_date, calculate_awake_hours
66
from service.idea import IdeaService
7-
from service.routine import RoutineService
87
from service.task import TaskService
9-
from service.user import UserService
108
from bot.buttons import *
119
from states import DialogStates
1210
from service.myday import MyDayService

telegram_bot_project/bot/fallbacks.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import aiogram.types as types
2-
1+
# bot/fallbacks.py
32
from bot.handlers import *
43
from states import DialogStates
54

telegram_bot_project/bot/handlers.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
1+
# bot/handlers.py
12
from aiogram.fsm.context import FSMContext
23
from aiogram.types import Message
34
from datetime import datetime
45

56
from service.smtp import SmtpService
67
from bot.buttons import *
7-
from messages import MESSAGES
8+
from messages import *
89
from service.idea import IdeaService
910
from service.task import TaskService
1011
from service.user import UserService
1112
from states import DialogStates
1213
from service.routine import RoutineService
1314
from bot.utills import check_valid_time, validate_text
1415
from service.myday import MyDayService
16+
from bot.scheduler import update_user_job
1517

1618
async def process_idea_save(message: Message, state: FSMContext) -> None:
1719
user_id = message.from_user.id
@@ -334,6 +336,7 @@ async def process_set_wake_time(message: Message, state: FSMContext):
334336

335337
print(f"[INFO] - User with id: {user_id} set wake time to: {new_wake_time}")
336338
await UserService.update_wake_time(user_id, time_obj)
339+
update_user_job(user_id, time_obj, message.bot, job_type="wake")
337340
await message.answer(
338341
MESSAGES[language]['TIMER_SET'].format(new_wake_time),
339342
reply_markup=routine_time_keyboard()
@@ -369,6 +372,7 @@ async def process_set_sleep_time(message: Message, state: FSMContext):
369372

370373
print(f"[INFO] - User with id: {user_id} set sleep time to: {new_sleep_time}")
371374
await UserService.update_sleep_time(user_id, time_obj)
375+
update_user_job(user_id, time_obj, message.bot, job_type="sleep")
372376
await message.answer(
373377
MESSAGES[language]['TIMER_SET'].format(new_sleep_time),
374378
reply_markup=routine_time_keyboard()
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# bot/scheduler.py
2+
from datetime import time
3+
from aiogram import Bot
4+
from apscheduler.schedulers.asyncio import AsyncIOScheduler
5+
from apscheduler.triggers.cron import CronTrigger
6+
from messages import send_morning_message, send_evening_message
7+
from service.user import UserService
8+
9+
scheduler: AsyncIOScheduler = AsyncIOScheduler()
10+
11+
def initialize_scheduler():
12+
scheduler.start()
13+
return scheduler
14+
15+
def update_user_job(user_id: int, when: time, bot: Bot, job_type: str):
16+
job_id = f"{job_type}_message_{user_id}"
17+
18+
if scheduler.get_job(job_id):
19+
scheduler.remove_job(job_id)
20+
21+
scheduler.add_job(
22+
send_morning_message if job_type == "wake" else send_evening_message,
23+
trigger=CronTrigger(hour=when.hour, minute=when.minute),
24+
args=[bot, user_id],
25+
id=job_id,
26+
replace_existing=True
27+
)
28+
29+
print(f"[INFO] - User with id: {user_id} updated job, {job_id}")
30+
31+
async def schedule_all_users_jobs(bot: Bot):
32+
users = await UserService.get_all_users()
33+
for user in users:
34+
if user["wake_time"]:
35+
update_user_job(user["id"], user["wake_time"], bot, job_type="wake")
36+
if user["sleep_time"]:
37+
update_user_job(user["id"], user["sleep_time"], bot, job_type="sleep")

telegram_bot_project/bot/utills.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# bot/utills.py
12
from datetime import datetime, timedelta
23

34
def format_date(dt: datetime) -> str:

telegram_bot_project/main.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
from aiogram.filters import Command
44
from aiogram.fsm.storage.memory import MemoryStorage
55
from aiogram.types import CallbackQuery
6+
from apscheduler.schedulers.asyncio import AsyncIOScheduler
67

78
from config import TOKEN
8-
9+
from bot.scheduler import initialize_scheduler, schedule_all_users_jobs
910
from bot.commands import *
1011
from bot.callbacks import *
1112
from bot.fallbacks import *
13+
from messages import *
1214

1315
storage: MemoryStorage = MemoryStorage()
1416
dp = Dispatcher(storage=storage)
@@ -184,6 +186,16 @@ async def process_fallback(message: Message, state: FSMContext):
184186
# Main Function
185187
async def main():
186188
bot = Bot(token=TOKEN)
189+
190+
scheduler: AsyncIOScheduler = initialize_scheduler()
191+
scheduler.add_job(
192+
MyDayService.create_stats_for_all_users,
193+
trigger='cron',
194+
hour='0',
195+
minute='0'
196+
)
197+
198+
await schedule_all_users_jobs(bot)
187199
await dp.start_polling(bot)
188200

189201
# Start point

telegram_bot_project/messages.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
from typing import Any
2+
from aiogram import types, Bot
3+
from service.user import UserService
4+
from service.routine import RoutineService
25

36
MESSAGES: Any = {
47
"UKRANIAN": {
@@ -96,6 +99,8 @@
9699
"ROUTINE_TIME": "⏰ Прокидаєшся о {}, лягаєш спати о {}, загальний час дня: {}. Чудовий план! 😊",
97100
"TIMER_INVALID": "❌ Неправильний формат часу (потрібно 10:00). Спробуй ще раз! 😌",
98101
"IDEA_EXIST": "⚠️ Ідея з такою назвою вже є. Придумай нову, ти ж креативний! 😊",
102+
"SEND_MORNING_MSG": "Доброго ранку, {}",
103+
"SEND_EVENING_MSG": "Доброго вечора, {}",
99104
"LANGUAGE_ASK": (
100105
"🌐 Яку мову обереш, друже? \n"
101106
"Тисни кнопку нижче, і поїхали! 😄"
@@ -199,6 +204,8 @@
199204
"TIMER_INVALID": "❌ Wrong time format (use 10:00). Try again! 😌",
200205
"ROUTINE_TIME": "⏰ Wake up at {}, sleep at {}, total day time: {}. Great plan! 😊",
201206
"IDEA_EXIST": "⚠️ An idea with that name already exists. Got another creative one? 😊",
207+
"SEND_MORNING_MSG": "Good morning, {}!",
208+
"SEND_EVENING_MSG": "Good evening, {}!",
202209
"LANGUAGE_ASK": (
203210
"🌐 What language would you like, friend? \n"
204211
"Pick one below, and let’s roll! 😄"
@@ -209,10 +216,10 @@
209216
}
210217

211218
# Buttons
219+
BUTTON_SETTINGS = "⚙️ Settings"
212220
BUTTON_ADD_TASK: str = "📝 Add a Task"
213221
BUTTON_IDEA: str = "💾 Save an Idea"
214222
BUTTON_MYDAY: str = "📅 My Day"
215-
BUTTON_SETTINGS: str = "⚙️ Settings"
216223
BUTTON_HELP: str = "❓ Help"
217224
BUTTON_UA_LANG: str = "🇺🇦 Українська"
218225
BUTTON_EN_LANG: str = "🇬🇧 English"
@@ -284,4 +291,38 @@ def generate_daily_stats_message(language: str, created_ideas: int, completed_ta
284291
f"📝 *Tasks added*: {created_tasks}\n\n"
285292
"🔄 Updates every day at 00:00.\n\n"
286293
"You’re absolutely crushing it! Keep shining! 🌟"
287-
)
294+
)
295+
296+
async def send_morning_message(bot: Bot, user_id: int):
297+
language = await UserService.get_user_language(user_id) or "ENGLISH"
298+
morning_routine = await RoutineService.get_user_routines(user_id, routine_type="morning")
299+
300+
print(f"[INFO] - Sending morning routine to user with id, {user_id}")
301+
if not morning_routine:
302+
await bot.send_message(
303+
user_id,
304+
MESSAGES[language]['SEND_MORNING_MSG'].format("👤") + '\n' + MESSAGES[language]['NO_MORNING_ROUTINE']
305+
)
306+
return
307+
308+
dividers: str = "\n" + ("-" * int(len(MESSAGES[language]['MORNING_ROUTINE_SHOW']) * 1.65))
309+
formatted_routine_items = "\n".join(
310+
f"# {idx}. {routine['routine_name']}"
311+
for idx, routine in enumerate(morning_routine, start=1)
312+
)
313+
formatted_morning_routine = (
314+
MESSAGES[language]['MORNING_ROUTINE_SHOW'] +
315+
dividers +
316+
"\n" +
317+
formatted_routine_items
318+
)
319+
320+
await bot.send_message(user_id, formatted_morning_routine)
321+
322+
async def send_evening_message(bot: Bot, user_id: int):
323+
language = await UserService.get_user_language(user_id) or "ENGLISH"
324+
print(f"[INFO] - Sending evening routine to user with id, {user_id}")
325+
await bot.send_message(
326+
user_id,
327+
MESSAGES[language]['SEND_EVENING_MSG'].format("👤")
328+
)

0 commit comments

Comments
 (0)