Advertisement
nikitttttta

Untitled

Dec 3rd, 2018
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.63 KB | None | 0 0
  1. import asyncio
  2. import logging
  3. import aiohttp
  4. import sqlite3
  5. from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
  6. from aiogram import Bot
  7. from aiogram.dispatcher import Dispatcher
  8. from aiogram.utils.executor import start_polling
  9. #токен бота
  10. API_TOKEN = '557867522:AAFYFp1K2ZAbIqIUTPDnPKlJxyqoLVEH-R4'
  11. #прокси
  12. PROXY_URL = 'http://54.38.137.173:8080'
  13.  
  14. #вроде тоже для прокси
  15. logging.basicConfig(level=logging.INFO)
  16. loop = asyncio.get_event_loop()
  17.  
  18. #необходимо для более удобной работы с ботов
  19. bbot = Bot(token=API_TOKEN, loop=loop, proxy=PROXY_URL)
  20. dp = Dispatcher(bbot)
  21.  
  22. #создаётся база данных и курсор (необходим для работы с таблицей)
  23. conn = sqlite3.connect("bd.db")
  24. cursor = conn.cursor()
  25.  
  26. #создаётся столбцы в таблице и таблица try необходим тк при повторном создании таблицы выдаётся ошибка (можешь заменить Exception)
  27. try:
  28. cursor.execute("CREATE TABLE bd (id integer, clas integer)")
  29. except Exception:
  30. pass
  31.  
  32. #присоединение к прокси
  33. async def fetch(url, proxy=None, proxy_auth=None):
  34. async with aiohttp.ClientSession() as session:
  35. async with session.get(url, proxy=proxy, proxy_auth=proxy_auth) as response:
  36. return await response.text()
  37.  
  38. #что надо делать боту при команде start
  39. @dp.message_handler(commands=['start'])
  40. async def cmd_start(message):
  41.  
  42. #создание клавиатуры
  43. klava = ReplyKeyboardMarkup()
  44.  
  45. #создание кнопок для клавы
  46. kl_7 = KeyboardButton('7 класс')
  47. kl_8 = KeyboardButton('8 класс')
  48. kl_9 = KeyboardButton('9 класс')
  49. kl_10 = KeyboardButton('10 класс')
  50. kl_11 = KeyboardButton('11 класс')
  51.  
  52. #добавление кнопок к клаве
  53. klava.add(kl_7,kl_8,kl_9,kl_10,kl_11)
  54.  
  55. #отправка сообщения человеку и отправка клавы(для более удобной работы человека
  56. await bbot.send_message(message.chat.id,text="в каком вы классе?",reply_markup=klava)
  57. #можно сделать карутину и тогда можно будет уменьшить и украсить код, но это по желанию
  58.  
  59. # отсоединение от базы
  60. conn.close()
  61.  
  62. #обработка остальных сообщений
  63. @dp.message_handler()
  64. async def cats(message):
  65.  
  66. #берём id из сообшения
  67. id_user = message['from'].id
  68.  
  69. #берём такст сообщения
  70. fraza = str(message.text)
  71.  
  72. #разбиваем фразу по пробемам при желании можно через запятую добавить другие символы
  73. fraza = fraza.split(' ')
  74.  
  75. #создание клавы как при команде старт осталось добавить кнопки и добавить в тест
  76. klava = ReplyKeyboardMarkup()
  77.  
  78. #дальше идут костыли и говнокод, но я не особо знаю как его исправить
  79.  
  80. #поиск в таблице по id класс человека (тут создание такста запроса)
  81. sql = "SELECT clas FROM bd WHERE id=?"
  82.  
  83. #сам запрос
  84. cursor.execute(sql, [(id_user)])
  85.  
  86. #сохранение результатов запроса
  87. clas = cursor.fetchone()
  88.  
  89. #если класса по id нет (человека нет в базе)
  90. if clas == None:
  91.  
  92. #ждём пока 1 слово фразы человека будет числом (пробует преобразовать в число и если это не цифры то получаем ошибку)
  93. try:
  94.  
  95. #если у нас тут возникае ошибка (1 слово не число), то мы переходим к исключению, иначе смотрим что за класс он написал
  96. if (int(fraza[0]) == 7) or (int(fraza[0]) == 8) or (int(fraza[0]) == 9) or (int(fraza[0]) == 10) or (int(fraza[0]) == 11):
  97.  
  98. #если класс соответствует нашим запросам, то добавляем человеку в базу
  99. cursor.execute("INSERT INTO bd VALUES ('%i', '%i')" % (id_user, int(fraza[0])))
  100.  
  101. #созраняем изменения в базе
  102. conn.commit()
  103.  
  104. #чисто для красоты пишем человеку
  105. await bbot.send_message(message.chat.id, text="запомнил")
  106.  
  107. #что мы делаем если человк вписал не нужное нам число
  108. else:
  109.  
  110. #просим ввести в каком он классе (суда надо добавит отправку клавы)
  111. await bbot.send_message(message.chat.id, text="в каком вы классе? (7-11)")
  112.  
  113. #если это не число, то возникает ошибка и в таком случае мы снова просим ввести в каком он классе (сюда надо добавит клавиатуру как после start)
  114. except Exception:
  115. await bbot.send_message(message.chat.id, text="в каком вы классе? (7-11)")
  116.  
  117. #что мы делаем если человек есть в базе
  118. else:
  119.  
  120. #тк по 1 id может быть только 1 человек мы берём из списка только 1 значение (оно там и так 1)
  121. clas = clas[0]
  122.  
  123. #создаём переменнум максимум для того что-бы потом опредилить какая из теорем собрала больше совпадений
  124. maximum = None
  125.  
  126. #количество совпадений по каждой из теорем
  127. sovp_teorema_1 = 0
  128. sovp_teorema_2 = 0
  129. sovp_teorema_3 = 0
  130.  
  131. #ключевые слова по теоремам
  132. teorema_1 = ["q", "r", "1"]
  133. teorema_2 = ["t", "f", "o", "2"]
  134. teorema_3 = ["0", "e", "i", "3"]
  135.  
  136. #в цикле for смотрим сколько совкадений в между ключевыми словами каждой теоремы и словами которые мы получили при разбиении фразы
  137. for i in fraza:
  138. for ss in teorema_1:
  139. if ss == i:
  140. sovp_teorema_1 += 1
  141. for ss in teorema_2:
  142. if ss == i:
  143. sovp_teorema_2 += 1
  144. for ss in teorema_3:
  145. if ss == i:
  146. sovp_teorema_3 += 1
  147.  
  148. #пример проверки на превыение класса(запрет на показ теорем которые превышают его класс)
  149. if clas < 10:
  150. sovp_teorema_3 = 0
  151.  
  152. #тут начинается трэшь, а именно проверка на случай если количество совпадений окажется одинакомым (в теории это можно сделать в цикле for, но это как мне кажется трудновато)
  153. #проверка на случай если совпадений нет, надо заменить на "какая теорема вам нужна?" естественно с клавой где 1 кнопка это 1 теорема
  154. if sovp_teorema_1 == 0 and sovp_teorema_2 == 0 and sovp_teorema_3 == 0:
  155. await bbot.send_message(message.chat.id, text="не коректный запрос")
  156.  
  157. #тут и дальше надо в фразы добавить клаву где человек сможет выбрать 1 из 2 теорем
  158. elif (sovp_teorema_1 == sovp_teorema_2) and (sovp_teorema_1 != 0):
  159. await bbot.send_message(message.chat.id, text="вам нужна 1 или 2 теорема?")
  160. elif (sovp_teorema_3 == sovp_teorema_2) and (sovp_teorema_3 != 0):
  161. await bbot.send_message(message.chat.id, text="вам нужна 3 или 2 теорема?")
  162. elif (sovp_teorema_1 == sovp_teorema_3) and (sovp_teorema_1 != 0):
  163. await bbot.send_message(message.chat.id, text="вам нужна 1 или 3 теорема?")
  164. elif (sovp_teorema_1 == sovp_teorema_3) and (sovp_teorema_3 == sovp_teorema_2) and (sovp_teorema_1 != 0):
  165. await bbot.send_message(message.chat.id, text="вам нужна 1, 2 или 3 теорема?")
  166.  
  167. #если совпадений не одинаковое количество, то мы находим максимум
  168. else:
  169. maximum = max(sovp_teorema_1, sovp_teorema_2, sovp_teorema_3)
  170.  
  171. #отправляем текст теорем
  172. if maximum == sovp_teorema_1:
  173. await bbot.send_message(message.chat.id, text="вот вам 1 теорема")
  174. elif maximum == sovp_teorema_2:
  175. await bbot.send_message(message.chat.id, text="вот вам 2 теорема")
  176. elif maximum == sovp_teorema_3:
  177. await bbot.send_message(message.chat.id, text="вот вам 3 теорема")
  178.  
  179. # отсоединение от базы
  180. conn.close()
  181.  
  182.  
  183.  
  184. if __name__ == '__main__':
  185. start_polling(dp, loop=loop, skip_updates=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement