def channels_management(bot: Bot, user_data: dict): bot.send_message(chat_id=user_data["chat_id"], text="Управление заданиями. Выберите тип задания:", reply_markup=ReplyKeyboardMarkup( [["Подписка на канал"], ["Назад"]], resize_keyboard=True)) return -2
def error_during_delay_parsing(bot: Bot, user_data: dict): bot.send_message( chat_id=user_data["chat_id"], text="Пожалуйста, соблюдайте формат:\n" "[% Количество дней % д] [% Колисество часов % ч] [% Количество минут % м]\n" ) return -13
def error_during_channel_deleting(bot: Bot, user_data: dict, next_callable): bot.send_message( chat_id=user_data["chat_id"], text= "Ошибка при удалении канала. Возможные причины: канал не существует, ссылка введена " "неправильно или он уже был удален ранее. Попробуйте снова:") return next_callable(bot, user_data)
def error_during_adlink_deleting(bot: Bot, user_data: dict): bot.send_message( chat_id=user_data["chat_id"], text= "Ссылок с таким ключевым словом не найдено. Проверьте правильность написания." ) return -12
def callback_query_constructor_callback(bot: Bot, update: Update, user_data: dict): prepare_user_data(update, user_data) delete_keyboard = True new_state = None if user_data["node"] == -10: if update.callback_query.data == "add_buttons": new_state = adding_inline_keyboard_hint(bot, user_data) elif update.callback_query.data == "del_buttons": save_post_draft(user_data, update.callback_query.message.to_json()) new_state = post_preview(bot, user_data) elif user_data["node"] == -11: if update.callback_query.data == "cancel": new_state = post_preview(bot, user_data) elif user_data["node"] == -12: if update.callback_query.data == "publish": save_post(user_data, 0) broadcast_post(bot, copy.deepcopy(user_data), *parse_post_to_send(user_data["post_id"])) del user_data["post_id"] destruct_constructor_handlers(user_data) new_state = broadcast_post_hint(bot, user_data) elif update.callback_query.data == "delay": new_state = delay_post_broadcasting(bot, user_data) elif update.callback_query.data == "go_back": new_state = post_preview(bot, user_data) if new_state is not None: set_state(user_data["id"], user_data, new_state) if delete_keyboard: bot.edit_message_reply_markup(message_id=update.callback_query.message.message_id, chat_id=user_data["chat_id"]) bot.answer_callback_query(update.callback_query.id) raise DispatcherHandlerStop
def broadcast_post_hint(bot: Bot, user_data: dict): bot.send_message( chat_id=user_data["chat_id"], text="Рассылка началась или начнется в запланированное время. Ввиду ограничения telegram на" "рассылку сообщений ботами, процесс может проходить не так быстро, как вы ожидаете. После" "окончания рассылки вы получите уведомление." ) return admin_welcome(bot, user_data)
def error_during_channel_adding(bot: Bot, user_data: dict, next_callable): bot.send_message( chat_id=user_data["chat_id"], text= "Ошибка при добавлении канала. Возможные причины: канал не существует, ссылка введена " "неправильно, он уже был добавлен ранее или бот не имеет прав администратора в канале. Попробуйте снова:" ) return next_callable(bot, user_data)
def delete_ad_link(bot: Bot, user_data: dict): bot.send_message(chat_id=user_data["chat_id"], text="Удаление ссылки. Введите ключевое слово:", reply_markup=ReplyKeyboardMarkup( [["Назад"]], resize_keyboard=True, )) return -12
def empty_msg(bot: Bot, user_data: dict, next_state, additional_text=""): assert type(additional_text) == str bot.send_message( chat_id=user_data["chat_id"], text=f"< < Пустое сообщение > >\n{additional_text}" ) return next_state
def admin_welcome(bot: Bot, user_data: dict): bot.send_message( chat_id=user_data["chat_id"], text="Добро пожаловать в интерфейс администратора, выберите действие:", reply_markup=ReplyKeyboardMarkup( [["Статистика"], ["Рассылка", 'Задания'], ["Рекламная рефералка"], ["Загрузить ключи"], ["Выход из админки"]], resize_keyboard=True)) return -1
def ad_link_added(bot: Bot, user_data: dict, adlink_id): adlink = get_adlink(adlink_id) href = get_adlink_href(adlink.uuid) bot.send_message( chat_id=user_data["chat_id"], text=f'<a href="{href}">{adlink.keyword}</a>\n' f'"Сырая" ссылка: {href}', parse_mode=ParseMode.HTML, ) return admin_welcome(bot, user_data)
def delay_post_broadcasting(bot: Bot, user_data: dict): bot.send_message( chat_id=user_data["chat_id"], text="На сколько задержать рассылку поста?\n" "Отправьте сообщение в формате:\n" "[% Количество дней % д] [% Колисество часов % ч] [% Количество минут % м]\n" "Например: 2 д 3 ч 30 м -- задержка на 2 дня и 3,5 часа\n" "90 м -- задержка на 90 минут (эквивалент 1 ч 30 м)" ) return -13
def sending_post_settings(bot: Bot, user_data: dict): bot.send_message( chat_id=user_data["chat_id"], text="Сообщение готово к публикации, хотите начать рассылку прямо сейчас или отложить?", reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton(text="Опубликовать", callback_data="publish"), InlineKeyboardButton(text="Отложить", callback_data="delay")], [InlineKeyboardButton(text="<< Назад", callback_data="go_back")] ]) ) return -12
def adding_inline_keyboard_hint(bot: Bot, user_data: dict): bot.send_message( chat_id=user_data["chat_id"], text="Чтобы добавить inline-клавиатуру к сообщению, отправьте ссылки в следующем формате:\n" "Название кнопки 1 - ссылка 1\n" "Название кнопки 2 - ссылка 2\n" "И так далее...\n\n" "Например:\n" "YouTube - https://youtube.com/\n", reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="Отмена", callback_data="cancel")]]) ) return -11
def ad_link_menu(bot: Bot, user_data: dict): adlinks = get_adlinks() if len(adlinks) == 0: text = "Список реферальных рекламных ссылок пуст" else: text = markup_adlinks(adlinks) bot.send_message(chat_id=user_data["chat_id"], text=text, parse_mode=ParseMode.HTML, reply_markup=ReplyKeyboardMarkup( [["Добавить"], ["Удалить"], ["Назад"]], resize_keyboard=True)) return -10
def post_constructor_first_step(bot: Bot, user_data: dict): prepare_constructor_handlers(user_data) bot.send_message( chat_id=user_data["chat_id"], text="Отправьте боту то, что хотите опубликовать. Это может быть всё, что угодно --" "текст, фото, видео, даже стикеры. Однако, из-за ограничений telegram в сообщении может быть" "не более одного вложения (фото + текст, видео + текст, и т. д.), причем в некоторых случаях" "(стикеры) может быть ТОЛЬКО вложение, без текста.", reply_markup=ReplyKeyboardMarkup([ ["Очистить", "Предпросмотр"], ["Отменить", "Далее"], ], resize_keyboard=True) ) return -9
def admin_statistics(bot: Bot, user_data: dict): bot.send_message( chat_id=user_data["chat_id"], text= "Всего пользователей: {all_users}\nАктивных (за прошедшую неделю): {active}\n" "Приглашенных через систему рефералов: {ref_count}\n" "Ключей осталось: {keys_active}\nКлючей раздали: {keys_gets}".format( all_users=get_all_users_count(), active=get_active_users_count(), ref_count=get_referral_links_count(), keys_active=get_count_keys(), keys_gets=0) + "\n\nРекламные ссылки:\n" + adlinks_statistics_markup(), parse_mode=ParseMode.HTML) return -1
def check_subscription(bot: Bot, user_data: dict, channel_id: int): try: result = bot.get_chat_member(chat_id=channel_id, user_id=user_data["id"]) except err.TelegramError as e: return False return result.status != result.LEFT and result.status != result.KICKED
def try_delete_channel(bot: Bot, candidate: str, channel_model_class): if candidate[0] != "@": candidate = "@" + candidate try: channel = bot.get_chat(chat_id=candidate) except err.TelegramError as e: return False if channel.type != "channel": return False session = db.Session() if session.query(channel_model_class).filter_by( id=channel.id).count() == 0: # already deleted session.close() return False if channel_model_class is ChannelToSubscribe: session.query(channel_model_class).get(channel.id).enabled = False else: session.query(channel_model_class).filter_by(id=channel.id).delete() session.commit() session.close() return True
def channels_for_subscription_list(bot: Bot, user_data: dict): channels = get_channels_for_subscription() if len(channels) == 0: bot.send_message(chat_id=user_data["chat_id"], text="Список каналов для подписки пуст.", reply_markup=ReplyKeyboardMarkup( [["Добавить канал"], ["Назад"]], resize_keyboard=True)) else: bot.send_message( chat_id=user_data["chat_id"], text="Каналы для подписки:\n\n" "{channels_repr}".format( channels_repr=markup_channels_list(bot, channels)), reply_markup=ReplyKeyboardMarkup([ ["Добавить канал"], ["Удалить канал"], ["Назад"], ], resize_keyboard=True)) return -6
def try_add_channel(bot: Bot, candidate: str, channel_model_class): if candidate[0] != "@": candidate = "@" + candidate try: channel = bot.get_chat(chat_id=candidate) except err.TelegramError: return False if channel.type != "channel": return False chat_member = bot.get_chat_member(chat_id=candidate, user_id=bot.id) if chat_member.status not in (chat_member.ADMINISTRATOR, chat_member.CREATOR): return False session = db.Session() if session.query(channel_model_class).filter_by(id=channel.id).count() > 0: if channel_model_class is ChannelToSubscribe: session.query(channel_model_class).get(channel.id).enabled = True session.commit() session.close() return True # already exists session.close() return False new_channel = channel_model_class(id=channel.id) session.add(new_channel) session.commit() session.close() return True
def error_during_buttons_adding(bot: Bot, user_data: dict): bot.send_message( chat_id=user_data["chat_id"], text="Ошибка при добавлении кнопок. Проверьте соблюдение формата и/или корректность ссылок\n\n" ) return -11
def ad_keys(bot: Bot, user_data: dict): bot.send_message(chat_id=user_data["chat_id"], text="Отправьте боту файл с ключами", reply_markup=ReplyKeyboardMarkup([["Отмена"]], resize_keyboard=True)) return -16
def delete_channel_for_subscription_first_step(bot: Bot, user_data: dict): bot.send_message( chat_id=user_data["chat_id"], text="Отправьте сюда адрес канала (@example или просто example)", reply_markup=ReplyKeyboardMarkup([["Отмена"]], resize_keyboard=True)) return -8
from telegram.utils.request import Request from telegram.ext.messagequeue import MessageQueue from telegram.ext import Updater from settings import REQUEST_KWARGS, TOKEN from queued_bot import Bot if REQUEST_KWARGS is not None: request = Request(con_pool_size=16, **REQUEST_KWARGS) else: request = Request(con_pool_size=16) bot = Bot(token=TOKEN, mqueue=MessageQueue(all_burst_limit=26, all_time_limit_ms=1100), request=request) updater = Updater(bot=bot, workers=16) dispatcher = updater.dispatcher job_queue = updater.job_queue
def channel_deleted_succsessfully(bot: Bot, user_data: dict, next_callable): bot.send_message( chat_id=user_data["chat_id"], text="Канал успешно удален.", ) return next_callable(bot, user_data)
def kek(bot: Bot, user_data: dict, text): bot.send_message( chat_id=user_data["chat_id"], text='Не работает или работает? {text}'.format(text=repr(text)))
def ad_link_deleted(bot: Bot, user_data: dict): bot.send_message(chat_id=user_data["chat_id"], text="Ссылка удалена.") return ad_link_menu(bot, user_data)