Exemple #1
0
    def set_grace_mode(self, bot, update, user_data):
        user = user_data['user']
        data = get_settings_file(SETTINGS_FILE)
        days = update.message.text

        if 'grace_mode' in data:
            try:
                data['grace_mode'] = str(timedelta(days=int(days)))
            except ValueError as e:
                self.logger.info(e)
                bot.send_message(chat_id=user.chat_id,
                                 text='Ошибка формата. Введите целое число.')
                return AdminMenu.States.SET_GRACE_MODE
            try:
                write_settings_file(data, SETTINGS_FILE)
                bot.send_message(
                    text='Теперь льготный период установлен на {} дней'.format(
                        int(days)),
                    chat_id=user.chat_id)
            except (TypeError, IOError) as e:
                self.logger.info(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)
Exemple #2
0
    def set_silence_mode(self, bot, update, user_data, job_queue):
        user = user_data['user']
        data = get_settings_file(SETTINGS_FILE)
        text = update.message.text

        try:
            day = int(text)
            if day < 0:
                raise ValueError
            silence_days = timedelta(days=day)
        except ValueError:
            bot.send_message(chat_id=user.chat_id,
                             text="Введите целое положительное число или 0.")

            return AdminMenu.States.SILENCE_MODE

        if 'silence_mode' in data:
            data['silence_mode'] = str(silence_days)
            try:
                write_settings_file(data, SETTINGS_FILE)
                bot.send_message(
                    text=f'Теперь тихий период установлен на {day} дней',
                    chat_id=user.chat_id)
            except (TypeError, IOError) as e:
                self.logger.info(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, job_queue)
Exemple #3
0
    def set_phone(self, bot, update, user_data):
        user = user_data['user']
        data = get_settings_file(SETTINGS_FILE)
        price = data['price']
        try:
            phone_number = update.message.contact.phone_number
        except AttributeError:
            phone_number = update.message.text

        phone_number = "".join(re.findall('\d+', phone_number))
        if len(phone_number) == 12:
            user_data['phone'] = phone_number
        else:
            bot.send_message(chat_id=user.chat_id,
                             text='Введен некорректный номер, попробуйте еще.')
            return BalanceMenu.States.PHONE

        buttons = [[KeyboardButton('Подтвердить')], [KeyboardButton('Назад')]]
        reply_markup = ReplyKeyboardMarkup(buttons, resize_keyboard=True)
        bot.send_message(chat_id=user.chat_id,
                         reply_markup=reply_markup,
                         text="Дней: {0}\n"
                         "Стоимость: {1} грн\n\n"
                         "Вы подтверждаете заказ?".format(
                             user_data["count_days"],
                             user_data["count_days"] * price))
        bot.send_message(chat_id=user.chat_id,
                         text="Нажмите клавишу 'Подтвердить'")

        return BalanceMenu.States.CONFIRMATION
Exemple #4
0
    def deactivate_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 False:
            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()
            data['autopublish']['active'] = False

            try:
                write_settings_file(data, SETTINGS_FILE)
                bot.send_message(chat_id=user.chat_id,
                                 text='Автопубликация отключена успешно.')
                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)
Exemple #5
0
    def set_count_days(self, bot, update, user_data):
        user = user_data['user']
        data = get_settings_file(SETTINGS_FILE)
        price = data['price']

        try:
            count_days = int(update.message.text)
            if count_days <= 0:
                raise ValueError
        except ValueError:
            bot.send_message(chat_id=user.chat_id,
                             text='Введите целое число больше нуля.')
            return BalanceMenu.States.COUNT_DAYS

        user_data['count_days'] = count_days
        user_data['final_price'] = count_days * price

        if user.balance > 0:
            buttons = [[
                KeyboardButton("Оплатить с карты"),
                KeyboardButton("Оплатить часть с баланса")
            ], [KeyboardButton("Назад")]]
            reply_markup = ReplyKeyboardMarkup(buttons, resize_keyboard=True)
            bot.send_message(
                chat_id=user.chat_id,
                text=
                f"К оплате {user_data['final_price']} грн. Выберите способ оплаты. У вас на счету {user.balance} грн.",
                reply_markup=reply_markup)
            return BalanceMenu.States.CHOOSE
        else:
            self.confirmation(bot, update, user_data)

        return BalanceMenu.States.CONFIRMATION
Exemple #6
0
    def set_price(self, bot, update, user_data, job_queue):
        user = user_data['user']
        data = get_settings_file(SETTINGS_FILE)
        price = update.message.text

        if 'price' in data:
            try:
                data['price'] = int(price)
            except ValueError:
                bot.send_message(chat_id=user.chat_id,
                                 text='Ошибка формата. Введите целое число.')
                return AdminMenu.States.SET_PRICE
            try:
                write_settings_file(data, SETTINGS_FILE)
                bot.send_message(
                    text=f'Теперь цена за 1 день доступа к чату = {price} грн',
                    chat_id=user.chat_id)
            except (TypeError, IOError) as e:
                self.logger.info(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, job_queue)
Exemple #7
0
    def save_text_autopublish(self, bot, update, user_data):
        user = user_data['user']
        text = update.message.text

        data = get_settings_file(SETTINGS_FILE)
        if 'autopublish' in data and data['autopublish']['text']:
            data['autopublish']['text'] = text
            try:
                write_settings_file(data, SETTINGS_FILE)
                bot.send_message(chat_id=user.chat_id,
                                 text=f'Теперь публикация с текстом: "{text}"')
            except (TypeError, IOError) as e:
                self.logger.error(e)
                bot.send_message(chat_id=user.chat_id,
                                 text="Не удалось сохранить настройки :("
                                 "Попробуйте еще раз.")
                return self.entry_text_autopublish(bot, update, user_data)
        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='Это меню пустое.')

        buttons = [[KeyboardButton("Да")], [KeyboardButton("Нет")]]
        reply_markup = ReplyKeyboardMarkup(buttons, resize_keyboard=True)

        bot.send_message(
            chat_id=user.chat_id,
            text=
            "Чтобы изменения вступили в силу необходимо перезапустить публикацию."
            "Перезапустить автопубликацию сейчас?",
            reply_markup=reply_markup)

        return AutopublishMenu.States.ANSWER
Exemple #8
0
    def get_chat_link(self, bot, update, user_data):
        user = user_data['user']
        data = get_settings_file(SETTINGS_FILE)
        chat_link = data['chat_link']
        bot.send_message(text=f"Ссылка на чат {chat_link}",
                         chat_id=user.chat_id)

        return StartMenu.States.ACTION
Exemple #9
0
 def autopublish_message(self, bot, job):
     data = get_settings_file(SETTINGS_FILE)
     group_id = data['autopublish']['group_id']
     text_message = data['autopublish']['text']
     try:
         bot.send_message(chat_id=group_id, text=text_message)
     except TelegramError as e:
         self.logger.error(e)
Exemple #10
0
def goodbye(bot, update):
    data = get_settings_file(SETTINGS_FILE)
    message = update.message
    group_id = data['autopublish']['group_id']
    left_user = message.left_chat_member
    user = DBSession.query(User).filter(User.chat_id == left_user.id).first()
    user.active = False
    add_to_db(user, session=DBSession)
    bot.delete_message(chat_id=group_id, message_id=message.message_id)
Exemple #11
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
Exemple #12
0
    def entry_interval_reminders(self, bot, update, user_data):
        user = user_data['user']
        reply_markup = ReplyKeyboardMarkup([[KeyboardButton("Назад")]],
                                           resize_keyboard=True)
        data = get_settings_file(SETTINGS_FILE)
        bot.send_message(
            chat_id=user.chat_id,
            text=f"Сейчас установлен срок в {data['reminders']['term']} " +
            "Введите через запятую дни когда должно приходить оповещение об днях оплаты. Числа не должны быть больше чем срок. \nНапример, 15,10,5, 1",
            reply_markup=reply_markup)

        return RemindersMenu.States.SET_INTERVAL
Exemple #13
0
 def entry_set_silence_mode(self, bot, update, user_data):
     user = user_data['user']
     data = get_settings_file(SETTINGS_FILE)
     days = data['silence_mode']
     reply_markup = ReplyKeyboardMarkup([[KeyboardButton("Назад")]],
                                        resize_keyboard=True)
     bot.send_message(
         text=f'Сейчас тихий период установлен на {days}  дней.' +
         ' Чтобы изменить, введите новое кол-во дней.',
         chat_id=user.chat_id,
         reply_markup=reply_markup)
     return AdminMenu.States.SILENCE_MODE
Exemple #14
0
    def entry_set_price(self, bot, update, user_data):
        user = user_data['user']
        data = get_settings_file(SETTINGS_FILE)

        reply_markup = ReplyKeyboardMarkup([[KeyboardButton("Назад")]],
                                           resize_keyboard=True)
        bot.send_message(
            text=f"Сейчас цена за 1 день доступа к чату = {data['price']} грн."
            'Чтобы изменить, введите новую цену(целое число).',
            chat_id=user.chat_id,
            reply_markup=reply_markup)

        return AdminMenu.States.SET_PRICE
Exemple #15
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
Exemple #16
0
    def save_days_autopublish(self, bot, update, user_data):
        user = user_data['user']
        text = update.message.text
        reply_markup = ReplyKeyboardMarkup([[KeyboardButton("Назад")]],
                                           resize_keyboard=True)
        try:
            day = int(text)
            if day > 31 or day <= 0:
                raise ValueError
            time_to_publish = timedelta(days=day)

        except ValueError:
            bot.send_message(
                chat_id=user.chat_id,
                text="Неверные данные! Введите число от 1 до 31(включительно):",
                reply_markup=reply_markup)
            return AutopublishMenu.States.SET_DAYS
        data = get_settings_file(SETTINGS_FILE)
        if 'autopublish' in data and data['autopublish']['time']:
            data['autopublish']['time'] = str(time_to_publish)
            try:
                write_settings_file(data, SETTINGS_FILE)
                bot.send_message(
                    chat_id=user.chat_id,
                    text=
                    f'Теперь публикация с периодом в {time_to_publish} дней')
            except (TypeError, IOError) as e:
                self.logger.error(e)
                bot.send_message(chat_id=user.chat_id,
                                 text="Не удалось сохранить настройки :("
                                 "Попробуйте еще раз.")
                return self.entry_days_autopublish(bot, update, user_data)
        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='Это меню пустое.')

        buttons = [[KeyboardButton("Да")], [KeyboardButton("Нет")]]
        reply_markup = ReplyKeyboardMarkup(buttons, resize_keyboard=True)

        bot.send_message(
            chat_id=user.chat_id,
            text=
            "Чтобы изменения вступили в силу необходимо перезапустить публикацию."
            "Перезапустить автопубликацию сейчас?",
            reply_markup=reply_markup)

        return AutopublishMenu.States.ANSWER
Exemple #17
0
    def set_fondy_token(self, bot, update, user_data):
        user = user_data['user']
        data = get_settings_file(SETTINGS_FILE)
        token = update.message.text

        data['fondy_token'] = token
        try:
            write_settings_file(data, SETTINGS_FILE)
            bot.send_message(chat_id=user.chat_id, text=f"Токен установлен")
        except (TypeError, IOError) as e:
            logger.info(e)
            bot.send_message(chat_id=user.chat_id,
                             text='''Не удалось сохранить настройки :(
                                Попробуйте еще раз.''')

        self.entry_change_chat(bot, update, user_data)
        return AdminMenu.States.CHANGE_CHAT
Exemple #18
0
    def set_hello_message(self, bot, update, user_data, job_queue):
        user = user_data['user']
        data = get_settings_file(SETTINGS_FILE)
        data['hello_message'] = update.message.text
        try:
            write_settings_file(data, SETTINGS_FILE)
            bot.send_message(
                chat_id=user.chat_id,
                text=f"Теперь приветствие с сообщением  {data['hello_message']}"
            )
        except (TypeError, IOError) as e:
            logger.info(e)
            bot.send_message(chat_id=user.chat_id,
                             text="Не удалось сохранить настройки :("
                             "Попробуйте еще раз.")

        return self.entry(bot, update, user_data, job_queue)
Exemple #19
0
    def entry_count_days(self, bot, update, user_data):
        user = user_data['user']
        data = get_settings_file(SETTINGS_FILE)

        if user.balance > 0.0:
            self.balance_check(bot, update, user_data)

        buttons = [[KeyboardButton('Назад')]]
        reply_markup = ReplyKeyboardMarkup(buttons, resize_keyboard=True)

        bot.send_message(
            chat_id=user.chat_id,
            text="Введите количество дней, которое хотите оплатить.\n"
            f"Цена за один день: {data['price']} грн",
            reply_markup=reply_markup)

        return BalanceMenu.States.COUNT_DAYS
Exemple #20
0
    def answer_yes(self, bot, update, user_data, job_queue):
        user = user_data['user']
        data = get_settings_file(SETTINGS_FILE)
        for job in job_queue.get_jobs_by_name('autopublish'):
            job.schedule_removal()

        data['autopublish']['active'] = False
        try:
            write_settings_file(data, SETTINGS_FILE)
            self.logger.debug('Включили автопубликацию')
        except (TypeError, IOError) as e:
            self.logger.error(e)
            bot.send_message(chat_id=user.chat_id,
                             text="Не удалось сохранить настройки :("
                             "Попробуйте еще раз.")

        self.activate_autopublish(bot, update, user_data, job_queue)
        return AutopublishMenu.States.AUTOPUBLISH
Exemple #21
0
    def answer_yes(self, bot, update, user_data, job_queue):
        user = user_data['user']
        args = user_data['args']
        link = args['link']
        group_id = args['group_id']

        data = get_settings_file(SETTINGS_FILE)
        data['chat_link'] = link
        data['autopublish']['group_id'] = group_id
        data['autopublish']['active'] = False
        try:
            write_settings_file(data, SETTINGS_FILE)
            bot.send_message(chat_id=user.chat_id,
                text=f"Теперь вступили в силу следующие изменения" \
                +f"Следующие изменения: ID = {group_id}" + "\n" \
                +f"Ссылка : {link}")
        except (TypeError, IOError) as e:
            logger.info(e)
            bot.send_message(chat_id=user.chat_id,
                             text='''Не удалось сохранить настройки :(
                                Попробуйте еще раз.''')

        for job in job_queue.get_jobs_by_name('autopublish'):
            job.schedule_removal()

        for job in job_queue.get_jobs_by_name('restricted_users'):
            job.schedule_removal()
        job_queue.run_repeating(restricted_users,
                                PERIOD,
                                first=1,
                                name="restricted_users")

        for job in job_queue.get_jobs_by_name('kicked_users'):
            job.schedule_removal()
        job_queue.run_repeating(kicked_users,
                                PERIOD,
                                first=1,
                                name="kicked_users")

        users_from_chat()

        self.entry_change_chat(bot, update, user_data)
        return AdminMenu.States.CHANGE_CHAT
Exemple #22
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       
Exemple #23
0
    def change_chat_link(self, bot, update, user_data):
        user = user_data['user']
        data = get_settings_file(SETTINGS_FILE)
        link = update.message.text
        args = user_data['args']
        group_id = args['group_id']
        args['link'] = link

        bot.send_message(
            chat_id=user.chat_id,
            text=f"Следующие изменения: ID = {group_id}" + "\n" \
                +f"Ссылка : {link}"
        )

        buttons = [[KeyboardButton("Да")], [KeyboardButton("Нет")]]
        reply_markup = ReplyKeyboardMarkup(buttons, resize_keyboard=True)
        bot.send_message(chat_id=user.chat_id,
                         text='Подтвердите изменения',
                         reply_markup=reply_markup)
        return AdminMenu.States.CHANGE_LINK
Exemple #24
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)
Exemple #25
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)
Exemple #26
0
def kicked_users(bot, job):
    today = date.today()
    data = get_settings_file(SETTINGS_FILE)
    chat_id = data['autopublish']['group_id']

    users = (DBSession.query(User)
                        .filter(User.active == True)
                        .filter(User.expiration_date == today)
                        .all())
    
    for user in users:
        try:
            bot.kick_chat_member(
                chat_id=chat_id,
                user_id=user.chat_id
            )
            user.active = False
            add_to_db(user, DBSession)
        except (TelegramError, BadRequest) as e:
            logger.error(e)
        sleep(1)
Exemple #27
0
    def save_term_reminders(self, bot, update, user_data):
        user = user_data['user']
        text = update.message.text

        try:
            time = int(text)
            if 0 < time <= 31:
                term_date = timedelta(days=time)
            else:
                raise ValueError
        except ValueError:
            bot.send_message(chat_id=user.chat_id,
                             text='''
                                  Неверные данные! Число в интервале от 1 до 31(включительно):
                                  ''')
            return RemindersMenu.States.SET_TERM
        data = get_settings_file(SETTINGS_FILE)
        if 'reminders' in data and data['reminders']['term']:
            data['reminders']['term'] = str(term_date)
            try:
                write_settings_file(data, SETTINGS_FILE)
                bot.send_message(
                    chat_id=user.chat_id,
                    text=
                    f'Теперь напоминание будет приходить за {time} дней до окончания подписки'
                )

            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
Exemple #28
0
    def ukrainian_payment_system(self, bot, update, user_data, job_queue):
        user = user_data['user']
        data = get_settings_file(SETTINGS_FILE)

        final_price = user_data['final_price']
        days = user_data['count_days']

        description = f"Оплата за {days} в чате без мута"

        response = make_payment(final_price * 100, description)

        if not response:
            return self.conv_fallback(user_data)

        context = {
            "amount": final_price,
            "order_id": response['order_id'],
            "user_data": user_data,
            "update": update,
            "silence_mode": data['silence_mode'],
            "days": days,
            "group_id": data["autopublish"]["group_id"]
        }

        bot.send_message(
            chat_id=user.chat_id,
            text=
            f"Подтвердите оплату переходя по ссылке: {response['checkout_url']} "
        )

        # запускаємо ф-цію, яка буде перевіряти чи оплата пройшла успішно
        for job in job_queue.get_jobs_by_name("checking_pay"):
            job.schedule_removal()
        job_queue.run_repeating(self.checking_pay,
                                3,
                                name="checking_pay",
                                context=context)
        return BalanceMenu.States.ACTION
Exemple #29
0
def users_from_chat(bot=None, job=None):

    data = get_settings_file(SETTINGS_FILE)
    day, month, year = data['transition'].split('.')
    transition = date(int(year), int(month), int(day))

    with client:
        entity = client.get_entity(data['chat_link'])
        users_in_chat = client.get_participants(entity)
        for user_chat in users_in_chat:
            user = DBSession.query(User).filter(User.chat_id == user_chat.id).first()
            if user is None:
                user = User()
                user.chat_id = user_chat.id
                user.name = user_chat.first_name
                user.username = user_chat.username
                user.active = True
                user.join_date = date.today()
                user.expiration_date = transition

                DBSession.add(user)
                DBSession.commit()
                logger.info(f"Added {user.username}")
            else: pass
Exemple #30
0
def restricted_users(bot, job):
    today = date.today()
    data = get_settings_file(SETTINGS_FILE)
    chat_id = data['autopublish']['group_id']
    silence_days = timedelta_from_str(data['silence_mode'])
    # Запит вибирає челіків, яких треба замутити, якщо дата бану - к-сть 
    # днів муту і сьогодні співпадають
    users = (DBSession.query(User)
             .filter(User.active == True)
             .filter(User.expiration_date - silence_days == today)
             .all())
    for user in users:
        # Поки що це не хай буде закомічене
        try:
            bot.restrict_chat_member(
                chat_id=chat_id,
                user_id=user.chat_id,
                can_send_messages=False,
                can_send_media_messages=False,
                can_send_other_messages=False,
                can_add_web_page_previews=False
            )
        except BadRequest as e:
            logger.error(e)