-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
168 lines (134 loc) Β· 6.88 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import asyncio
import logging
import sys
import os
import datetime
import requests
from aiogram.utils.chat_action import ChatActionSender
from aiogram import Bot, Dispatcher, types, F
from aiogram.enums import ParseMode
from aiogram.filters import CommandStart, StateFilter
from aiogram.types import Message, CallbackQuery
from aiogram.utils.markdown import hbold
from aiogram.fsm.context import FSMContext
import states
from buttons import menuButtons, btn1, btn2, designButtons, regionsButtons, taqvimButtons, back, taqvimButtonToday_text, \
taqvimButtonTomorrow_text, channelsButtons
from states import GiftState
from images import create_image
from models.mics import User, Taqvim
from models.base import db
from context import duo_text
from filters import ChatTypeFilter
import config
from utils import is_channel
dp = Dispatcher()
bot = Bot(config.TOKEN, parse_mode=ParseMode.HTML)
@dp.message(CommandStart())
async def command_start_handler(message: Message) -> None:
await message.answer(f"Assalomu alaykum, {hbold(message.from_user.full_name)}! \nRamazon oyingiz muborak bo'lsin "
f"dindoshim!π₯³ \n\nBu bot sizga tabrik uchun rasmlar va ramazon taqvimini ko'rsata oladi. "
f"\n\nRo'zamiz qabul bo'lsinπ",
reply_markup=menuButtons)
User.get_or_create(chat_id=message.chat.id)
@dp.message(F.text == btn1, StateFilter(None))
async def one_handler(message: types.Message, state: FSMContext) -> None:
is_ch = await is_channel(bot, message.from_user.id, config.CHANNELS)
if not is_ch:
await message.answer("β Kechirasiz botimizdan foydalanishdan oldin ushbu kanallarga a'zo bo'lishingiz kerak.",
reply_markup=channelsButtons())
return
await message.answer("π¨ Bizda 3 xil dizayn bor, qaysini tanlaysiz?", reply_markup=designButtons)
await state.set_state(GiftState.design)
@dp.message(F.text == btn2, StateFilter(None))
async def two_handler(message: types.Message, state: FSMContext) -> None:
await state.clear()
is_ch = await is_channel(bot, message.from_user.id, config.CHANNELS)
if not is_ch:
await message.answer("β Kechirasiz botimizdan foydalanishdan oldin ushbu kanallarga a'zo bo'lishingiz kerak.",
reply_markup=channelsButtons())
return
await message.answer("π
Ramazon taqvimini ko'rish uchun manzilingizni yozing:", reply_markup=types.ReplyKeyboardRemove())
await state.set_state(states.OneState.first)
@dp.callback_query(F.data.startswith('design_'), GiftState.design)
async def handler(query: CallbackQuery, state: FSMContext) -> None:
if query.data == "design_back":
await query.message.delete()
await query.message.answer("π Asosiy menyuga qaytib keldik.", reply_markup=menuButtons)
await state.clear()
return
await state.update_data(design=query.data)
await query.message.answer("π Tabrik noma uchun ismingizni kiriting:", reply_markup=types.ReplyKeyboardRemove())
await state.set_state(GiftState.name)
@dp.callback_query(F.data.startswith('region_'))
async def handler(query: CallbackQuery) -> None:
region = query.data.split('_')[1]
User.update(region=region).where(User.chat_id == query.message.chat.id).execute()
await query.message.answer("Joylashuv qabul qilindi. Taqvimni ko'rish uchun tugmalardan foydalaning.",
reply_markup=taqvimButtons)
await query.message.delete()
@dp.callback_query(F.data == 'confirm')
async def inline_query_handler(query: types.CallbackQuery):
is_ch = await is_channel(bot, query.from_user.id, config.CHANNELS)
if is_ch:
await query.message.delete()
await query.message.answer("π Asosiy menyuga qaytib keldik.", reply_markup=menuButtons)
else:
await query.answer("β Kechirasiz botimizdan foydalanishdan oldin ushbu kanallarga a'zo bo'lishingiz kerak.",
show_alert=True)
@dp.message(GiftState.name, F.text)
async def handler(message: types.Message, state: FSMContext) -> None:
await state.update_data(name=message.text)
await message.answer("π Tabrik noma beruvchining ismini kiriting:", reply_markup=types.ReplyKeyboardRemove())
await state.set_state(GiftState.author)
@dp.message(GiftState.author, F.text)
async def handler(message: types.Message, state: FSMContext) -> None:
data = await state.get_data()
loader_message = await message.answer("π Tabrik noma tayyorlanmoqda, iltimos kuting...")
create_image(data['name'], message.text, data['design'])
photo = types.FSInputFile(f"{data['name']}.jpg")
await message.answer_photo(photo=photo,
caption=f"π Tabrik noma tayyor! \n\nπ€ Ism: {data['name']} \nπ₯ Tabrik noma beruvchi: {message.text}",
reply_markup=menuButtons)
await loader_message.delete()
await state.clear()
os.remove(f"{data['name']}.jpg")
@dp.message(F.text, states.OneState.first)
async def taqvim_handler(message: types.Message, state: FSMContext) -> None:
response = requests.get(f"https://islomapi.uz/api/present/day?region={message.text}")
data = response.json()
status = response.status_code
if status == 404:
await message.answer("π€·ββοΈ Bunday joylashuv mavjud emas. Qaytadan urinib ko'ring.", reply_markup=menuButtons)
await state.clear()
return
if status != 200:
await message.answer("π€·ββοΈ Nimadir notoβgβri keti.", reply_markup=menuButtons)
await state.clear()
return
try:
tong_saharlik = datetime.datetime.strptime(data['times']['tong_saharlik'], "%H:%M")
shom_iftor = datetime.datetime.strptime(data['times']['shom_iftor'], "%H:%M")
await message.answer(
f"Mintaqa: {data['region']} \nSahar va Iftar vaqtlari: \n\nπ Sahar: {tong_saharlik.time()} \nπ Iftar: {shom_iftor.time()} \n\nπ
Bugungi sanasi: {data['date']} \n\n {duo_text}",
reply_markup=menuButtons)
await state.clear()
except KeyError:
await message.answer("β Xatolik yuz berdi. Qaytadan urinib ko'ring.", reply_markup=menuButtons)
await state.clear()
except Exception as e:
await message.answer(f"β Xatolik yuz berdi: {e}", reply_markup=menuButtons)
await state.clear()
@dp.message(F.text == back, StateFilter(None))
async def back_handler(message: types.Message) -> None:
await message.answer("π Asosiy menyuga qaytib keldik.", reply_markup=menuButtons)
@dp.message(ChatTypeFilter("private"))
async def not_handler(message: types.Message) -> None:
await message.answer("π€·ββοΈ Nimadir notoβgβri keti.")
async def main() -> None:
db.connect()
db.create_tables([User, Taqvim])
await dp.start_polling(bot)
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
asyncio.run(main())