Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
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       
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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)