Форум сайта python.su
Всем добрый вечер.
Самостоятельно изучаю Python и решил для нашей группы по английскому написать маленький телеграмь бот. Суть - это диктант, то есть комьютер рандомно задаёт цифру от 0 до 100, а пользователь должен написать её на Английском. По итогу бот должен проверить количество правильных ответов
[code python]import telebot
from random import randrange, choice
from num2words import num2words
answer_positive = ['Отлично, ты молоцед', 'Супер, продолжай в том же духе', 'Хорошая работа', 'Отлично', 'Супер', 'Мне нравится, продолжай']
answer_negative = ['Не совсем так', 'Не верно', 'Печально, но нет', 'Ох....', 'No', 'Нет']
text = 'Меня зовут Матадор. Сегодня у нас будет диктант. Я называю тебе цифры, а тебе потребуется написать их прописью на английском языке. Диктант будет состоят из 10 строк. Если готов напиши мне чате: Yes'
bot = telebot.TeleBot('...................')
@bot.message_handler(commands =['start'])
def start(message):
mess = f'Привет {message.from_user.first_name}'
bot.send_message(message.chat.id, mess, parse_mode='html')
bot.send_message(message.chat.id, text, parse_mode='html')
@bot.message_handler()
def get_user_text(message):
if message.text == 'Yes' or message.text == 'yes':
total = 0
for _ in range(10):
number = randrange(0, 101)
bot.send_message(message.chat.id, number, parse_mode='html')
@bot.message_handler(content_types=['text'])
def after_text(message):
after_text = message.text
if after_text.lower() == num2words(number):
g = f'choice(answer_positive)'
bot.send_message(message.chat.id, g, parse_mode='html')
total += 1
else:
h = f'{choice(answer_negative)}. Верный ответ будет: {num2words(number)}'
bot.send_message(message.chat.id, h, parse_mode='html')
bot.polling(none_stop=True)
[/code]
Офлайн
@bot.message_handler()
def get_user_text(message):
if message.text == 'Yes' or message.text == 'yes':
total = 0
for _ in range(10):
number = randrange(0, 101)
bot.send_message(message.chat.id, number, parse_mode='html')
@bot.message_handler(content_types=['text'])
def after_text(message):
after_text = message.text
if after_text.lower() == num2words(number):
g = f'choice(answer_positive)'
bot.send_message(message.chat.id, g, parse_mode='html')
total += 1
else:
h = f'{choice(answer_negative)}. Верный ответ будет: {num2words(number)}'
bot.send_message(message.chat.id, h, parse_mode='html')
Офлайн
indiwiduumТак он же должен ждать ввода пользователя. То есть у бота должны быть состояния. Состояние, когда он пишет приветствие. Состояние, когда он ждёт. Состояние, когда он получил ответ от пользователя. Вот он между ними переходит постоянно. Также там есть проблема двух пользователей одновременных. Одному пользователю он должен отвечать одно, а другому пользователю он должен отвечать другое. Один пользователь может находиться на приветствии, а другой пользователь в это время может уже получать ответ от бота.
после должен дать шанс ввести пользователю на английском, а по факту выводит весь цикл разом
indiwiduumА, и начал с асинхронных ботов. Начинать надо с того, с чего все начинают. Ты же не начинаешь изучение английского с пьесы Шекспира. Надо начинать с алфавита хотя бы, с простейших конструкций, с простейших слов.
Самостоятельно изучаю Python и решил для нашей группы по английскому написать маленький телеграмь бот.
Офлайн
я бы сначала сделал регистрацию пользователя
потом привязал sql базу и помечал бы что пользователь уже прошел
и это и будет состояние бота
Состояние, когда он пишет приветствие. Состояние, когда он ждёт. Состояние, когда он получил ответ от пользователя. Вот он между ними переходит постоянно.не путайте человека это стандартные функции бото которые есть во всех исходниках их ненужно пистать
Отредактировано Genabox (Янв. 23, 2023 01:44:24)
Офлайн
GenaboxМожно в базе хранить состояние. Главное, чтобы оно было и бот знал, в каком он состоянии находится в данный момент. Если в состоянии приветствия он не ждёт никакого ввода от пользователя, то что бы пользователь не вводил, бот ему сначала приветствие напишет, а весь его ввод просто отбросит. А если бот приветствие пользователю написал уже, то писать приветствие повторно не надо. И чтобы это определить, нужно ли писать приветствие или не нужно писать приветствие, бот должен переходить между своими состояниями. То же самое касается вопросов пользователю. Бот может ждать введения каких-то команд или каких-то данных, а может ждать ответа на вопрос, который он задал пользователю на предыдущем этапе. Так вот и там и там пользователю нужно что просто ввести и отправить боту, при этом бот должен различить, ему ввели команду или ответ на вопрос. А для этого бот должен знать свои состояния “жду команду” и “жду ответ на вопрос”.
потом привязал sql базу и помечал бы что пользователь уже прошел
и это и будет состояние бота
GenaboxНичего нет, ему придётся заново всё делать это. Может, оно и есть где-то готовое в каком-то виде, но взять чужое и написать самому с нуля - это две разные вещи. Это хорошо, пока что-то чужое находится и оно ещё и бесплатное, но как только ты не найдёшь ничего вообще или когда ты напишешь что-то коммерческое, а хозяин этого чужого придёт к тебе и потребует плату с тебя за коммерческое использование его интеллектуальной собственности, то тут-то и окажется, что тебе надо это с нуля самому писать, а писать ты не умеешь ничего, потому что ты всегда чужим пользовался.
не путайте человека это стандартные функции бото которые есть во всех исходниках их ненужно пистать
Отредактировано py.user.next (Янв. 23, 2023 02:33:31)
Офлайн
И чтобы это определить, нужно ли писать приветствие или не нужно писать приветствие, бот должен переходить между своими состояниями.я это и имел ввиду в базе стоит пометка на чем бот остановился
Отредактировано Genabox (Янв. 23, 2023 19:26:02)
Офлайн
GenaboxЯ понял, но я-то беру выше. Концепция состояний, между которыми переходит бот, даёт возможность очертить их, найти их все, рассмотреть каждое в отдельности и спроектировать всю модель в конечном виде. Когда модель бота построена, тогда можно и выбирать, через что эту модель реализовывать, через СУБД с SQL или через простые файлы, например, для которых дополнительные установки каких-то СУБД не требуются.
я это и имел ввиду в базе стоит пометка на чем бот остановился
GenaboxПрекрасная система. Но вот что я тебе скажу. Сначала я поставил Slack и пользовался им, там я написал несколько ботов. Потом я всем этим пользовался и поставил Telegram. И я подумал “а что, если этих Slack'овских ботов перенести и в Telegram ещё?”, так я практически без изменений перенёс одного бота из Slack в Telegram. Немного на это времени ушло. Сейчас у меня ещё Discord добавился и я думаю “переносить мне этого бота в Discord или нет?”. Потом Heroku накрылся (бесплатный стал платным) и боты, которые запускались на нём, отвалились у меня. Я тогда вообще этого бота переписал полностью на смартфон в виде приложения под Android. С Python на Java переписал с дополнительной обработкой Android'ных нюансов. Так вот бота из Slack в Telegram я переносил практически без изменений. Перенести этого бота из Slack в Discord или из Telegram в Discord тоже можно было бы без изменений. Если бы боты продолжали работать на бесплатном хостинге, я бы так и сделал и приложение для Android не писал бы это, пользовался бы ботами на смартфоне.
писать самому
ну вот мануал к nextcord
GenaboxДа, и будешь сто таких вариантов искать и писать под каждый мессенджер. Потом будешь плакать “ой, вот у меня в Discord'е есть такой бот, а в Telegram'е нету; где бы мне взять библиотечку под Telegram, почему её нет? для Discrod'а ведь есть, это несправедливо!”. Так ты и будешь побираться и собирать системы в виде костыль на костыле костылём погоняет, пока не научишься себе сам всё писать сразу в чистом виде с хорошей кроссплатформенностью. У программ должна быть высокая когезия (cohesion) и низкий каплинг (coupling). Ты же, привязываясь кодом к nextcord'у, повышаешь каплинг бота, что потом будет требовать наличия nextcord'а на другом мессенджере. А там его не будет.
то можно готовые сурсы брать и своим функционалом обвешивать
GenaboxОн изучает питон
а если для работы как мне понадобился или этому джентельмену
indiwiduumЭто значит, что ему нужно научиться, а не сделать одну прогу какую-то нужную и забыть о языке после этого.
Самостоятельно изучаю Python
Отредактировано py.user.next (Янв. 24, 2023 01:24:49)
Офлайн
да я подумываю переписать его потом на сокет на андроиде
но я в андроиде не 1но приложение еще не создавал
закончу с дискордом перепешу на андроид как приложение, а пока сейчас этот дискорд бот закончить нужно потому что он мне для маркета нужен - отслеживать цены по апи
я на питоне еще совсем теряюсь, раньше на дэлфи писал даже очки с лампочками через ком порт, классно мозг расслабляет, там есть форма есть таймеры все классно а тут нихрена нету но зато море офигенных библиотек. еще в этом gui теряюсь, просто небыло времени на это, пока дос окно меня устроит. даже дос окно закрыть не могу вот пришлось даже новую тему открывать
а построение пакетов я так и не понял логики как с 4-5 уровня глубины папок вызывать основной скрипт или соседние если вообще такое можно
Офлайн
GenaboxЯ сначала пишу консольную версию на Java, отлаживаю её. Потом уже это идёт в Android, когда оно работает. Но заморочки там всё равно есть. Например, в консольной версии можно загружать страницы из Интернета синхронно, а в Android такой загрузчик вываливает приложение без объяснения причины, потому что там требуется асинхронная загрузка. Приходится вот так переделывать даже консольную программу, написанную на Java, которая работает в консоли прекрасно. Но с опытом всё больше и больше этих моментов знаешь, поэтому уже подолгу не сидишь, пытаясь выяснить причину выпадения приложения.
но я в андроиде не 1но приложение еще не создавал
GenaboxУ меня два приложения. Одно за транспортом в городе следит, другое за банками и другими подобными организациями. Хочу ещё аптечное приложение написать, так как аптечная сеть сильно варьирует цены на лекарства внутри своих же точек. Иногда приходишь в точку той же сети и видишь, что лекарство дешевле на пятьдесят рублей, хотя производитель тот же и лекарство то же самое. Какая-то муть вот такая. Поставил их приложение, которое они навязывали упорно, там вообще цены подменяет оно, вместо реальных цен показывает скидочные, потом продавщицы говорят “мы не знаем, как оно работает, но цена у нас выше сегодня, будете брать?”. А с учётом того, что для просто полечиться немного врач обычно выписывает лекарств тысяч на пять, которые ещё и не помогут вообще никак, так можно сэкономить рублей пятьсот или даже тысячу, просто зная, где и в какой точке самое дешёвое из этих одинаковых лекарств находится сегодня (каждый день ещё цены переписывают). В консоли-то у меня это есть уже, оно на питоне наскоряк написано, а для Android надо время выбрать, так как сначала надо консольное на Java написать, а потом ещё переносить консольное на Android. Консольные сразу напрямую туда не переносятся, надо адаптировать, иначе оно просто выпадает и всё.
потому что он мне для маркета нужен - отслеживать цены по апи
Отредактировано py.user.next (Янв. 24, 2023 02:28:31)
Офлайн
Одно за транспортом в городе следит, другое за банками и другими подобными организациямиу меня на будущее стоит задачка написать автомобильную операционнцю систему для логистической фуры
Офлайн