Pull to refresh
6
0
Евгений @mambastick

C# Разработчик

Send message

Потихоньку пишу вторую часть, там буду подробно рассказывать про оплату, получение данных от пользователя и так далее...

А это напрямую зависит от того, как вы хотите запускать (и хостить) свой бот.

Домашний сервак на убунте, в отдельном скрине как обычное консольное приложение крутится там и все, заливаю туда напрямую из IDE Rider, до этого через SMB.

То есть ваши боты на сервере в продакшне крутятся как интерактивное консольное приложение? Серьезно?

Да, серьезно. Я только начинаю свой путь и делаю, как знаю. Как я увидел в интернете: в других статьях, форумах и других ресурсах - так и делаю. К сожалению, больше мне не откуда брать знания, которые были бы проверены всякими профессорами и прочими умными людьми.

Может быть тогда не стоит использовать в статьях, где вы учите других, то, что вы еще не знаете?

Как пользоваться токеном я в курсе, и для правильной (да, его можно не указывать, но так лучше не делать, иначе могут быть проблемы при следующих запусках бота) работы метода StartReceiving он необходим.

Нам ничего не нужно. За цикл поллинга отвечает библиотека, которую вы используете.

Она не блокирует основной поток, если не ставить никакие блокирующие циклы, то код запуститься и тут же завершится. А вот эта часть кода:

var task = _botClient.ReceiveAsync(UpdateHandler, ErrorHandler, _receiverOptions, cts.Token);
// [...]
await task;

вообще работать не будет, так как методStartReceiving (в вашем случае ReceiveAsync, и это важно, дальше поймете почему, я не просто придираюсь) имеет тип void , и как нам тогда ожидать завершения этого метода ?

Слушайте. Типовое решение такого "админ-меню" - это

В чем проблема написать свой хендлер с консольными командами или тупо взять мой код и заменить мое бесконечное ожидание, на вот это ?

В этой статье я учу писать ботов . Я рассказываю про то, какие бывают типы приходящих обновлений, какие есть методы и как с ними работать. Если же видите замечания по коду, что он написан неверно, лучше бы рассказали, что конкретно не так и помогли улучшить, нежели тупо строить из себя самого умного и тупо критиковать.

...что конкретно?

Ну вы говорите, что я делаю неправильно, я спрашиваю: как сделать правильно ?

И когда ваш бот крутится на сервере, там он тоже закрывается по Ctrl-C?..

Да, а про graceful shutdown я вообще впервые слышу, как бы печально это не было.

Кажется, вы не особо работали с cooperative cancellation.

Верно, я вообще по сути новичок, и учусь на всяких бесплатных ресурсах.

По крайней мере, вы так не будете бесполезно тратить ресурсы в заблокированном потоке.

Ну так здесь бот запуститься и тут же выключится. Мы же используем поллинг, а значит нам нужно создать бесконечный цикл, иначе бот не будет получать сообщения. Можно, конечно, переписать на вебхуках, но я, к сожалению, так не умею.

По какой? Где?

Можно сделать консольные команды. Можно сделать админ-меню (админ-команду) в самом боте.

А как ? Я всегда использую ctrl + c :D

Вместо await Task.Delay(-1); ставим этот цикл и по какой-нибудь команде используем cts.Cancel . Про сам source я понял, спасибо.

Зачем создавать CancellationTokenSource, если вы его никогда не активируете?

Он используется в старте бота, в обработчике апдейтов и ошибок, а также его можно использовать, чтобы остановить бота, например, поставить while(!cts.Token.IsCancellationRequested)

В смысле вяжется с ИИ ? Немного не понял вопроса. Продолжение обязательно будет.

В целом есть немного замечаний по коду, так как чувствуется немного универских винформ, но для начала пойдет.

Честно говоря, в универе меня учили только C и после C++, C# я учу сам, используя разные ресурсы (книги, видеоуроки, статьи, интернет-материалы), поэтому я был бы очень рад получать критику моему коду, чтобы совершенствоваться!

Также вопрос насколько система будет работать с полным потоком пользователей? Были ли мысли об этом на этапе разработки?

Конкретно этот пример работает в последовательном режиме, параллельности тут нет, но ее легко добавить. В следующей статье обязательно рассмотрим этот пример. Насчет пользователей, за моей спиной уже несколько ботов и пока полеты отличные, пользователей не так много, где-то 500-1000 на бота и все отлично. Может, при увеличении пользователей где-то будут провалы, но пока все стабильно.

Этот проект не рассчитывался как что-то большое, для большой аудитории. В начале статьи сказано, что в этой статье я даю необходимую базу, чтобы вы писали своих ботов, используя эту базу. Поэтому здесь идет акцент больше на теоретических знаний, что, куда и почему.

В данном коде все будет работать последовательно, параллельной работы программы нет. Чтобы код работал в параллельном режиме, нужно использовать треды (thread) или таски (task), я предпочитаю таски, ставлю Task.Run в UpdateHandler и все работает прекрасно.

Благодарю! Это моя первая статья, боялся, что будет что-то непонятно)
Скоро выпущу вторую часть этой статьи :З

Да, я изначально так и писал, но потом передумал, так как проект показался мне простым. В следующей статье (она будет продолжением этой), я уже буду использовать разные классы и методы, например, хендлер (обработчик) inline-клавиатуры, хендлер сообщений и т.д.

Приветствую. Спасибо за критику, ваши замечания действительно верны, просто изначально я хотел написать кучу методов и классов, а потом передумал, так как посчитал это неуместным для первой статьи, вот и забыл некоторые моменты подправить. Еще раз спасибо за критику, во второй статье (она будет продолжением этой) я поправлю код.

...а выходить из программы не надо?

Ctrl+C или простое закрытие консоли уже не работает ?

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity

Specialization

Software Developer, Backend Developer
Junior
C#
MySQL
Linux
Git
OOP
English