def checking_pay(self, bot, job): update = job.context['update'] user_data = job.context['user_data'] user = user_data['user'] silence_mode = job.context['silence_mode'] days = job.context['days'] group_id = job.context['group_id'] data = check_payment(job.context['order_id']) if not data or data == 'error': job.schedule_removal() bot.send_message( chat_id=user.chat_id, text= "Произошла ошибка. Вам больше не нужно подтверждать платеж.\n" "Возврат в меню.") self.entry(bot, update, user_data) elif data == "pending": pass elif data == "success": job.schedule_removal() if date.today() < user.expiration_date: user.payment_date = date.today() user.expiration_date = user.expiration_date + timedelta( days=days) else: user.payment_date = date.today() user.expiration_date = (date.today() \ + timedelta_from_str(silence_mode) \ + timedelta(days=days)) user.active = True if 'new_balance' in user_data: user.balance = user_data['new_balance'] if not add_to_db(user, session=DBSession): return self.conv_fallback(user_data) try: bot.unban_chat_member(chat_id=group_id, user_id=user.chat_id) bot.restrict_chat_member(chat_id=group_id, user_id=user.chat_id, can_send_messages=True, can_send_media_messages=True, can_send_other_messages=True, can_add_web_page_previews=True) except (TelegramError, BadRequest) as e: self.logger.error(e) # TODO: прислать пользователю ссылку на чат. # Send referal bonuses to all parents. amount = job.context['amount'] self.apply_referal_bonuses(user.parent_referal_id, amount) bot.send_message(chat_id=user.chat_id, text="Оплата прошла успешно!\n") self.entry(bot, update, user_data)
def welcome(bot, update): data = get_settings_file(SETTINGS_FILE) message = update.message group_id = data['autopublish']['group_id'] new_users = message.new_chat_members previous_add_msg_id = data['previous_add_message'] previous_msg_id = data['previous_welcome_message'] if previous_msg_id is not None and previous_add_msg_id is not None : try: bot.delete_message(chat_id=group_id, message_id=previous_msg_id) bot.delete_message(chat_id=group_id, message_id=previous_add_msg_id) logger.debug(f'Delete {previous_msg_id}') except TelegramError as e: logger.error(f'{e} - wrong previous message id') for new_user in new_users: text = f"{data['hello_message']}, {new_user.first_name}" logger.info(f'{new_user.first_name} joined to chat {group_id}({message.chat.title})') bot.send_message(chat_id=group_id, text=text, reply_to_message_id=message.message_id) data['previous_add_message'] = message.message_id data['previous_welcome_message'] = message.message_id + 1 try: write_settings_file(data, SETTINGS_FILE) logger.debug('Попереднє повідомлення записано') except (TypeError, IOError) as e: logger.error(e) user = DBSession.query(User).filter(User.chat_id == new_user.id).first() if user is None: user = User() user.chat_id = new_user.id user.name = new_user.first_name user.username = new_user.username user.active = True user.join_date = date.today() user.expiration_date = (date.today() + timedelta_from_str(data['grace_mode']) + timedelta_from_str(data['silence_mode'])) add_to_db(user, session=DBSession) else: user.active = True
def entry(self, bot, update, user_data, args=None): self.delete_interface(user_data) tuser = update.effective_user user = DBSession.query(User).filter(User.chat_id == tuser.id).first() data = get_settings_file(SETTINGS_FILE) silent_days = timedelta_from_str(data['silence_mode']) if user is None: user = User() user.join_date = date.today() user.expiration_date = user.join_date + silent_days user.chat_id = tuser.id user.name = tuser.full_name user.username = tuser.username user.active = True if args and args != [] and len(args) == 1: referal_id = args[0] if len(referal_id) and referal_id.isdigit(): if referal_id != user.chat_id and not user.parent_referal_id: parent_user = DBSession.query(User).filter( User.chat_id == referal_id).first() parent_user.referal_count += 1 user.parent_referal_id = referal_id if not add_to_db([user, parent_user], session=DBSession): return self.conv_fallback(user_data) else: self.logger.warning("Referal link is not valid.") else: if not add_to_db(user, session=DBSession): return self.conv_fallback(user_data) else: user.chat_id = tuser.id user.name = tuser.full_name user.username = tuser.username user.active = True if not add_to_db(user, session=DBSession): return self.conv_fallback(user_data) user_data['user'] = user _ = user_data['_'] = generate_underscore(user) buttons = [[KeyboardButton('Баланс')], [KeyboardButton('Пригласить партнера')], [KeyboardButton('Чат')]] reply_markup = ReplyKeyboardMarkup(buttons, resize_keyboard=True) bot.send_message(text='Главное меню', chat_id=user.chat_id, reply_markup=reply_markup) return StartMenu.States.ACTION
def set_price_after_balance(self, bot, update, user_data): user = user_data['user'] text = update.message.text try: from_balance = float(text) if from_balance > user.balance or from_balance < 0: raise ValueError except ValueError: bot.send_message( chat_id=user.chat_id, text= f'Введите число больше нуля или не превышающее {user.balance}') return BalanceMenu.States.CHOOSE final_price = user_data['final_price'] new_balance = user.balance - from_balance user_data['new_balance'] = new_balance days = user_data['count_days'] if final_price - from_balance < 0: bot.send_message( chat_id=user.chat_id, text= f'Минусовая сума к оплате, повторите попытку с другими значениями. {user.balance}' ) self.entry_balance_payment(bot, update, user_data) return BalanceMenu.States.CHOOSE if final_price - from_balance == 0: if date.today() < user.expiration_date: user.payment_date = date.today() user.expiration_date = user.expiration_date + timedelta( days=days) else: user.payment_date = date.today() user.expiration_date = (date.today() \ + timedelta_from_str(silence_mode) \ + timedelta(days=days)) user.balance = user_data['new_balance'] user.active = True add_to_db(user, DBSession) bot.send_message(chat_id=user.chat_id, text="Оплата прошла успешно!\n") self.entry(bot, update, user_data) return BalanceMenu.States.ACTION new_price = final_price - from_balance user_data['final_price'] = new_price self.confirmation(bot, update, user_data) return BalanceMenu.States.CONFIRMATION
def save_interval_reminders(self, bot, update, user_data): user = user_data['user'] data = get_settings_file(SETTINGS_FILE) text = update.message.text try: interval = sorted([int(i) for i in re.findall('\d+', text)], reverse=True) if len(interval) == 0: raise ValueError if interval[0] > timedelta_from_str( data['reminders']['term']).days: bot.send_message( chat_id=user.chat_id, text= f"Число {interval[0]} больше чем установленный срок в {data['reminders']['term']}. " "Введите числа в установленном формате") return RemindersMenu.States.SET_INTERVAL except ValueError: bot.send_message(chat_id=user.chat_id, text=''' Вы ввели букву или отсуствуют цифры в сообщении ''') return RemindersMenu.States.SET_INTERVAL if 'reminders' in data and data['reminders']['interval']: data['reminders']['interval'] = interval try: write_settings_file(data, SETTINGS_FILE) bot.send_message( chat_id=user.chat_id, text= f'Теперь напоминание будет с интервалом {interval} дней до окончания подписки' ) except (TypeError, IOError) as e: self.logger.error(e) bot.send_message(chat_id=user.chat_id, text='''Не удалось сохранить настройки :( Попробуйте еще раз.''') else: self.logger.error( "\nSettings for autopublish are not valid or aren't present. Check settings.json." ) bot.send_message(chat_id=user.chat_id, text='Это меню пустое.') self.entry(bot, update, user_data) return RemindersMenu.States.ACTION
def start_reminders(self, bot, update, user_data, job_queue): user = user_data['user'] data = get_settings_file(SETTINGS_FILE) if not 'reminders' in data and data['reminders']['term'] and data[ 'reminders']['interval']: bot.send_message( chat_id=user.chat_id, text='Приостановка сообщений об окончании подписки') for job in job_queue.get_jobs_by_name('reminders_job'): job.schedule_removal() return self.entry(bot, update, user_data) interval = data['reminders']['interval'] term = timedelta_from_str(data['reminders']['term']) if 0 in interval: bot.send_message( chat_id=user.chat_id, text= 'Уведемления отключены, смените интервал на число больше нуля.' ) for job in job_queue.get_jobs_by_name('reminders_job'): job.schedule_removal() return self.entry(bot, update, user_data) context = { 'message': data['reminders']['text'], 'interval': interval, 'term': term } for job in job_queue.get_jobs_by_name('reminders_job'): job.schedule_removal() # first = 5 - через 5 секунд після запуску job_queue.run_repeating(self.reminders_job, interval=10, first=5, context=context, name='reminders_job') return self.entry(bot, update, user_data)
def activate_autopublish(self, bot, update, user_data, job_queue): user = user_data['user'] data = get_settings_file(SETTINGS_FILE) if 'autopublish' in data and data['autopublish']['active'] is True: bot.send_message(chat_id=user.chat_id, text='Автопубликация уже включена.') return AutopublishMenu.States.AUTOPUBLISH if data['autopublish']['time']: jobs = job_queue.get_jobs_by_name('autopublish') for job in jobs: job.schedule_removal() interval_str = data['autopublish']['time'] interval = timedelta_from_str(interval_str) job_queue.run_repeating(self.autopublish_message, interval, first=1, name='autopublish') data['autopublish']['active'] = True text = data['autopublish']['text'] try: write_settings_file(data, SETTINGS_FILE) bot.send_message( chat_id=user.chat_id, text= f'Автопубликация включена c текстом "{text}" и интервалом {interval}' ) self.logger.debug('Включили автопубликацию') except (TypeError, IOError) as e: self.logger.error(e) bot.send_message(chat_id=user.chat_id, text='''Не удалось сохранить настройки :( Попробуйте еще раз.''') else: self.logger.error( "\nSettings for autopublish are not valid or aren't present. Check settings.json." ) bot.send_message(chat_id=user.chat_id, text='Это меню пустое.') return self.entry(bot, update, user_data)