from datetime import datetime, timedelta from PIL import Image from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, ConversationHandler, MessageHandler, Filters from telegram import InlineKeyboardMarkup, InlineKeyboardButton, ReplyKeyboardMarkup from conf import TOKEN, DB_NAME from db_helper import DBHelper STATE_REGION = 1 STATE_CALENDAR = 2 user_region = dict() db = DBHelper(DB_NAME) BTN_TODAY, BTN_TOMORROW, BTN_MONTH, BTN_REGION, BTN_DUA, RESTART = '⏳ Bugun', '🕰 Ertaga', '📆 To`liq taqvim', '🇺🇿 Mintaqa tanlash', '🤲 Ruzadagi Duolar', '🔄 Yangilash' main_buttons = ReplyKeyboardMarkup([ [BTN_TODAY], [BTN_TOMORROW, BTN_MONTH], [BTN_DUA], [RESTART] ], resize_keyboard=True) def region_button(): regions = db.get_regions() buttons = [] tmp_b = [] for region in regions: tmp_b.append(InlineKeyboardButton(region['region'], callback_data=region['id'])) if len(tmp_b) == 2: buttons.append(tmp_b) tmp_b = [] return buttons def start(update, context): user = update.message.from_user user_region[user.id] = None buttons = region_button() update.message.reply_html( f'Assalomu Alaykum, <b>{user.first_name}!</b>\n\nRamazon oyi muborak bo`lsin!\n\nMintaqani tanlang!', reply_markup=InlineKeyboardMarkup(buttons) ) return STATE_REGION def inline_callback(update, context): try: query = update.callback_query user_id = query.from_user.id user_region[user_id] = int(query.data) query.message.delete() query.message.reply_html( text='<b>Ramazon taqvimi 2022🌙1443 </b>\n\nQuidagilardan birini tanlang!👇', reply_markup=main_buttons ) return STATE_CALENDAR except Exception as e: print('Error: ', e) def calendar_today(update, context): try: user_id = update.message.from_user.id if not user_region[user_id]: return STATE_REGION region_id = user_region[user_id] region = db.get_region(region_id) today = str(datetime.now().date()) if db.get_calendar(today): calendar = db.get_calendar(today) time_str = str(calendar['saharlik']) time_str2 = str(calendar['iftorlik']) date_format = '%H:%M' given_time = datetime.strptime(time_str, date_format) given_time2 = datetime.strptime(time_str2, date_format) inter = int(region['interval']) if str(region['interval']) in '-': final_time = given_time - timedelta(minutes=inter) final_time2 = given_time2 - timedelta(minutes=inter) else: final_time = given_time + timedelta(minutes=inter) final_time2 = given_time2 + timedelta(minutes=inter) final_time_str = final_time.strftime('%H:%M') final_time_str2 = final_time2.strftime('%H:%M') message = f"✨Ramazon taqvimi🌙\n\n{today} kungi <b>{region['region']}</b> hududi uchun\n\n\nSaharlik:\t <b>{final_time_str}</b>\n\nIftorlik:\t <b>{final_time_str2}</b>\n\n\n||@ramazon_taqvimi_ruza_bot||" update.message.reply_text(message, parse_mode='HTML', reply_markup=main_buttons) else: message = f"✨Ramazon taqvimi🌙\n\nBugungi sana <b>{today}</b>\n\n\n🙃Hozir Ramazon oyi emas🙃\nTaqvimni to`liq olishingiz mumkin!\n\n\n||@ramazon_taqvimi_ruza_bot||" update.message.reply_text(message, parse_mode='HTML', reply_markup=main_buttons) except Exception as e: print('Calendar today function error: ', str(e)) def calendar_tomorow(update, context): try: user_id = update.message.from_user.id if not user_region[user_id]: return STATE_REGION region_id = user_region[user_id] region = db.get_region(region_id) today = str(datetime.now().date() + timedelta(days=1)) if db.get_calendar(today): calendar = db.get_calendar(today) time_str = str(calendar['saharlik']) time_str2 = str(calendar['iftorlik']) date_format = '%H:%M' given_time = datetime.strptime(time_str, date_format) given_time2 = datetime.strptime(time_str2, date_format) inter = int(region['interval']) if str(region['interval']) in '-': final_time = given_time - timedelta(minutes=inter) final_time2 = given_time2 - timedelta(minutes=inter) else: final_time = given_time + timedelta(minutes=inter) final_time2 = given_time2 + timedelta(minutes=inter) final_time_str = final_time.strftime('%H:%M') final_time_str2 = final_time2.strftime('%H:%M') message = f"✨Ramazon taqvimi🌙\n\n{today} kungi <b>{region['region']}</b> hududi uchun\n\n\nSaharlik:\t<b>{final_time_str}</b>\n\nIftorlik:\t <b>{final_time_str2}</b>\n\n\n||@ramazon_taqvimi_ruza_bot||" update.message.reply_text(message, parse_mode='HTML', reply_markup=main_buttons) else: message = f"✨Ramazon taqvimi🌙\n\nErtangi sana <b>{today}</b>\n\n\n🙃Bu kun Ramazon oyi emas🙃\nTaqvimni to`liq olishingiz mumkin!\n\n\n||@ramazon_taqvimi_ruza_bot||" update.message.reply_text(message, parse_mode='HTML', reply_markup=main_buttons) except Exception as e: print('Calendar tomorrow function error: ', str(e)) def calendar_month(update, context): try: user_id = update.message.from_user.id if not user_region[user_id]: return STATE_REGION region_id = user_region[user_id] region = db.get_region(region_id) photo_url = f"taqvim/{region['id']}.jpg" message = f"✨Ramazon taqvimi🌙\n\n<b>{region['region']}</b> uchun taqvim 2022\n\n||@ramazon_taqvimi_ruza_bot||" update.message.reply_photo(open(photo_url, 'rb'), caption=message, parse_mode='HTML', reply_markup=main_buttons) except Exception as e: print('Calendar month function error: ', str(e)) def select_dua(update, context): try: photo_path = "taqvim/dua/dua.jpg" message = f"✨Ramazon taqvimi🌙\n\n<b> 🌞 saharlik va 🌚 iftorlik duolari 🤲</b>\n\n||@ramazon_taqvimi_ruza_bot||" update.message.reply_photo(open(photo_path, 'rb'), caption=message, parse_mode='HTML', reply_markup=main_buttons) except Exception as e: print('Select_dua function error: ', str(e)) def main(): updater = Updater(TOKEN, use_context=True) dispatcher = updater.dispatcher conv_handler = ConversationHandler( entry_points=[CommandHandler('start', start)], states={ STATE_REGION: [ CallbackQueryHandler(inline_callback), MessageHandler(Filters.regex('^(' + BTN_TODAY + ')$'), calendar_today), MessageHandler(Filters.regex('^(' + BTN_TOMORROW + ')$'), calendar_tomorow), MessageHandler(Filters.regex('^(' + BTN_MONTH + ')$'), calendar_month), MessageHandler(Filters.regex('^(' + BTN_DUA + ')$'), select_dua), MessageHandler(Filters.regex('^(' + RESTART + ')$'), start), ], STATE_CALENDAR: [ MessageHandler(Filters.regex('^(' + BTN_TODAY + ')$'), calendar_today), MessageHandler(Filters.regex('^(' + BTN_TOMORROW + ')$'), calendar_tomorow), MessageHandler(Filters.regex('^(' + BTN_MONTH + ')$'), calendar_month), MessageHandler(Filters.regex('^(' + BTN_DUA + ')$'), select_dua), MessageHandler(Filters.regex('^(' + RESTART + ')$'), start), ], }, fallbacks=[CommandHandler('start', start)] ) dispatcher.add_handler(conv_handler) updater.start_polling() updater.idle() if __name__ == '__main__': main()