Advertisement
Guest User

Untitled

a guest
Apr 10th, 2020
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.30 KB | None | 0 0
  1. from collections import defaultdict
  2. from json import dump, load
  3. import os
  4. import sys
  5. from telegram.ext import Updater
  6. from telegram.ext import Filters
  7. from telegram.ext import CommandHandler, MessageHandler, ConversationHandler
  8. from telegram import ReplyKeyboardMarkup, KeyboardButton
  9.  
  10. from settings import token, help_text, forms_path, marked_forms_path, users_marked_path, log_path, excuse_text, fails_path
  11.  
  12.  
  13. class Bot():
  14.     def __init__(self, token):
  15.         self.forms_path = forms_path
  16.         self.marked_forms_path = marked_forms_path
  17.         self.users_marked_path = users_marked_path
  18.         self.log_path = log_path
  19.  
  20.         forms, marked_forms, users_marked = self.load_data()
  21.         self.forms = forms
  22.         self.marked_forms = marked_forms
  23.         self.users_marked = users_marked
  24.  
  25.         self.fails_path = fails_path
  26.         self.fails = load(open(self.fails_path, encoding='utf-8'))
  27.  
  28.         self.help_text = help_text
  29.         self.excuse_text = excuse_text
  30.  
  31.         MainHandler = ConversationHandler(
  32.             entry_points=[MessageHandler(Filters.text, self.handle_message)],
  33.             states={
  34.                 'start': [MessageHandler(Filters.text, self.handle_message)], # только чтобы из помощи при старте могли вернуться с "начать"
  35.                 'new': [MessageHandler(Filters.text, self.handle_message)]
  36.             },
  37.             fallbacks=[CommandHandler('stop', self.stop)]
  38.         )
  39.  
  40.         self.updater = Updater(token=token)
  41.         self.updater.dispatcher.add_handler(CommandHandler('start', self.start))
  42.         self.updater.dispatcher.add_handler(MainHandler)
  43.  
  44.         self.print_log('Работаем!\n')
  45.  
  46.  
  47.     def load_data(self):
  48.         try:
  49.             os.mkdir('data')
  50.         except OSError:
  51.             pass
  52.  
  53.         forms = load(open(self.forms_path, encoding='utf-8'))
  54.  
  55.         if os.path.isfile(self.marked_forms_path):
  56.             marked_forms = load(open(self.marked_forms_path, encoding='utf-8'))
  57.         else:
  58.             marked_forms = {i: 0 for i in forms}
  59.  
  60.         if os.path.isfile(self.users_marked_path):
  61.             old_users_marked = load(open(self.users_marked_path, encoding='utf-8'))
  62.             users_marked = defaultdict(list)
  63.             for user in old_users_marked:  # сохраняем тип defaultdict
  64.                 users_marked[user] = old_users_marked[user]
  65.         else:
  66.             users_marked = defaultdict(list)  # chat_id: [id размеченных форм]
  67.  
  68.         return forms, marked_forms, users_marked
  69.  
  70.  
  71.     def backup_data(self):
  72.         dump(self.marked_forms, open(self.marked_forms_path, 'w', encoding='utf-8'))
  73.         dump(self.users_marked, open(self.users_marked_path, 'w', encoding='utf-8'))
  74.  
  75.     def print_log(self, *args):
  76.         print(*args)
  77.         stdout = sys.stdout
  78.         logout = open(self.log_path, 'a')
  79.         sys.stdout = logout
  80.         print(*args)
  81.         logout.close()
  82.         sys.stdout = stdout
  83.  
  84.     start_markup = [[KeyboardButton('Начать'), KeyboardButton('Помощь')]]
  85.     start_menu = ReplyKeyboardMarkup(start_markup, resize_keyboard=True, one_time_keyboard=False)
  86.  
  87.     cont_markup = [[KeyboardButton('Дальше'), KeyboardButton('Помощь')]]
  88.     cont_menu = ReplyKeyboardMarkup(cont_markup, resize_keyboard=True, one_time_keyboard=False)
  89.  
  90.     def start(self, bot, update):
  91.         bot.sendMessage(chat_id=update.message.chat_id, text='Здравствуйте! Приступим?)', reply_markup=self.start_menu)
  92.  
  93.     def stop(self):
  94.         return ConversationHandler.END
  95.  
  96.     def suggest_form(self, chat_id):
  97.         user_marked = self.users_marked[str(chat_id)]  # получаем список уже размеченных для пользователя
  98.         self.print_log(chat_id, 'уже размечал', user_marked)
  99.         # определяем, какая форма нуждается в разметке
  100.         forms_in_need = sorted(self.marked_forms, key=self.marked_forms.get)
  101.         self.print_log(self.marked_forms, "\nВ разметке нуждаются", forms_in_need)
  102.         i = 0
  103.         try:
  104.             while forms_in_need[i] in user_marked:
  105.                 i += 1
  106.             form_id = forms_in_need[i]
  107.             form = {'form_id': form_id, 'form_link': self.forms[form_id]}
  108.             self.print_log('Выбрали форму', form)
  109.         except IndexError:
  110.             form = None
  111.  
  112.         return form
  113.  
  114.     def beg_pardon(self, bot, chat_id):  # отправляем человеку правильную ссылку
  115.         fail_id = str(chat_id)
  116.         form_id = self.fails.pop(fail_id)
  117.         print(fail_id, form_id)
  118.         correct_form_link = self.forms[form_id]
  119.         excuse_text = self.excuse_text.format(correct_form_link, correct_form_link)
  120.         bot.sendMessage(chat_id=chat_id, text=excuse_text, parse_mode='Markdown', reply_markup=self.cont_menu)
  121.         self.print_log(chat_id, 'получил новую ссылку на', form_id)
  122.         # dump(self.fails, open(self.fails_path, 'w', encoding='utf-8'))
  123.  
  124.     def handle_message(self, bot, update):
  125.         print(True)
  126.         self.print_log("\nReceived", update.message)
  127.         message_text = update.message.text.lower()
  128.         chat_id = update.message.chat_id
  129.  
  130.         if str(chat_id) in self.fails:
  131.             self.beg_pardon(bot, chat_id)
  132.  
  133.         react_dict = {'начать': 'Сейчас подкинем вам статей на разметку...',
  134.                       'дальше': 'Ещё? Отлично!'}
  135.  
  136.         if message_text == 'начать' or message_text == 'дальше':
  137.             bot.sendMessage(chat_id=chat_id, text=react_dict[message_text])
  138.             form = self.suggest_form(chat_id)
  139.             if form:
  140.                 bot.sendMessage(chat_id=chat_id, text=form['form_link'])
  141.                 self.marked_forms[form['form_id']] += 1
  142.                 self.users_marked[str(chat_id)].append(form['form_id'])  # занесли в список размеченных для пользователя
  143.                 bot.sendMessage(chat_id=chat_id, text='Спасибо за разметку!', reply_markup=self.cont_menu)
  144.                 self.backup_data()
  145.                 self.print_log(chat_id, 'разметил', form['form_id'])
  146.                 return 'new'
  147.  
  148.             else:
  149.                 bot.sendMessage(chat_id=chat_id, text='Вы герой и разметили все наши формы!')
  150.                 self.print_log(chat_id, 'разметил все формы')
  151.                 return ConversationHandler.END
  152.  
  153.         elif update.message.text.lower() == 'помощь':
  154.             bot.sendMessage(chat_id=chat_id, text=self.help_text, parse_mode='Markdown', reply_markup=self.start_menu)
  155.             return 'start'
  156.  
  157.         elif update.message.text.lower() == 'нет':  # нас отвергли Т_Т
  158.             ##
  159.             bot.sendMessage(chat_id=chat_id, text='Спасибо, что попробовали! Простите за доставленные неудобства :с', reply_markup=self.cont_menu)
  160.             self.print_log(chat_id, 'отказался от формы', self.fails[str(chat_id)])
  161.             return 'new'
  162.  
  163.  
  164. if __name__ == "__main__":
  165.     bot = Bot(token)
  166.     bot.updater.start_polling()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement