G2A Many GEOs
SHARE
TWEET

Untitled

a guest Apr 10th, 2020 132 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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()
RAW Paste Data
Ledger Nano X - The secure hardware wallet
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top