Пишем полезного Telegram бота на Golang | Урок #5 - пишем EventProcessor

Sdílet
Vložit
  • čas přidán 31. 05. 2024
  • В этом уроке мы напишем EventProcessor, который реализует интерфейсы Fetcher и Processor.
    Также разберем несколько интересных и полезных моментов. Например, как сделать общее поле типа, которое будет выглядеть по разному для разных частных реализаций. Также обсудим, как сократить длинные цепочки вызовов функций с помощью замыканий.
    Ссылка на итоговый проект на гитхабе: github.com/JustSkiv/read-advi...
    На коммиты по урокам не разбито, так как изначально собирался записать один большой урок.
    Картинка на превью добавлена с разрешения её автора, за что ему большое спасибо.
    Его профиль на Хабре: habr.com/ru/users/oWart/
    Тайм-коды:
    00:00 Вступление
    00:15 Доделываем функцию New()
    00:42 Вспоминаем как выглядит интерфейсы Fetcher/Processor
    00:54 Метод Fetch()
    01:35 Функция event()
    02:11 Определяем объект IncomingMessage
    03:57 Доделываем функцию event()
    04:34 Общее поле Meta
    05:53 Снова доделываем event()
    06:18 Доделываем Fetch()
    08:16 Метод Process()
    09:31 Функция meta()
    10:05 Команды
    10:47 Функция doCmd()
    14:01 Функция isAddCmd()
    15:22 Команда savePage()
    16:35 Тексты ответов бота
    18:19 Добавляем в ответы смайлики
    19:05 Доделываем savePage()
    19:26 Совет: как сократить длинные строчки вызовов с помощью замыканий
    21:49 Команда sendRandom()
    22:24 Fix: переносим ошибку ErrNoSavedPages в пакет storage
    23:00 Доделываем sendRandom()
    23:30 Команды sendHelp() и sendHello()
    23:44 Расставляем команды в роутере
    24:49 Доделываем processMessage()
    25:20 Смотрим, что сделали
    25:41 Заключение

Komentáře • 26

  • @AleksandrPopov-te8tq
    @AleksandrPopov-te8tq Před měsícem +1

    вообще суперский "видекурс", было бы славно посмотреть еще что-нибудь подобное. Совсем начинающим самое то)

  • @user-pt4iz2py6k
    @user-pt4iz2py6k Před 2 lety +5

    Опять же - автор проговаривая свои мысли и действия при создании комманд не только даёт понять, что он имеет богатый опыт в сфере разработки и его решения являются взвешенными, но и таким новичкам как я помогает думать о том, что нужно иногда думать прежде чем везте интерфейсы интерфейсничать
    12:10 - а если НЕ ПИШУТ, то скоро ПОПЛЯШУТ *бадам-тссс*
    19:30 создаём новые переменные err (52 и 56 строки)? Это чем-то обосновано или можно просто через = перезаписывать значение имеющейся переменной err?
    24:28 Давайте уж расставим 😉 😃
    25:10 Я сделяль - потому что теперь знаю, что делать))
    Спасибо за ещё один урок!)

    • @nikolay_tuzov
      @nikolay_tuzov  Před 2 lety +1

      > создаём новые переменные
      Мы создаём переменную с минимально возможным контекстом - она доступна только в пределах блока if, и именно в нём мы её и используем. А если мы не хотим её использовать за её пределами, то зачем расширять контекст? :) Жаль, это не всегда возможно.

    • @nikolay_tuzov
      @nikolay_tuzov  Před 2 lety

      @Semen Sporysh я понимаю, да. Не важно, что она там уже есть. Важно, что у нас есть выбор - использовать общий контекст функции, или ограничиться блоком if. И нам достаточно последнего.

  • @user-yh8eb8bx6m
    @user-yh8eb8bx6m Před rokem

    Видео понравилось, автору респект)

  • @annonymous8220
    @annonymous8220 Před 3 měsíci

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

    • @nikolay_tuzov
      @nikolay_tuzov  Před 3 měsíci

      Это нормально, понимание часто приходит не сразу

  • @evgen_sr
    @evgen_sr Před rokem +1

    Если команд будет много, можно как то запускать функции автоматом, без switch case? например в мапе хранить имя функции = команда из телеграм клиента. Вот только как вызывать функции по имени?

  • @evgenyvlasov851
    @evgenyvlasov851 Před 2 lety

    25:13 "вы уже знаете что делать?" - Что же? :) про closures было тоже интересно урок. Спасибо.

    • @nikolay_tuzov
      @nikolay_tuzov  Před 2 lety +2

      Я до этого момента уже показывал - вынести обработку ошибки в defer =)

  • @ik7122012
    @ik7122012 Před 4 měsíci

    Спасибо за видео! Возник вопрос по поводу оффсета, если у нас серьезное приложение, а не простенький бот, нужно ли оффсет хранить в бд? Ведь если у нас по какой то причине крашнется приложение и мы его рестартанем, то оффсет снова будет нулевым, а значит уже обработанные сообщения снова обработаются, не так ли? В случае с ботами, в которых есть какие то финансовые операции это довольно критично получается. Но с другой стороны на каждый апдейт дергать базу, чтобы положить одно значение тоже не комильфо 🤔

  • @user-vl3np9ck3v
    @user-vl3np9ck3v Před 2 lety +1

    Подскажи пжлста, что за комбо, когда ты выделяешь текс и создаешь функцию с именем выделенного текста? Или это макрос? ( есть ли подобное на VSC)? Спасибо.

    • @nikolay_tuzov
      @nikolay_tuzov  Před 2 lety

      Я пишу код в GoLand.
      Если там написать вызов несуществующей функции, то можно нажатием Alt + Enter создать её. При этом, у неё будет правильная сигнатура (т.е. набор аргументов и возвращаемые значения), довольно удобно.
      Но, на самом деле, я часто просто вырезаю некоторые моменты, когда что-то печатаю, т.к. это смотрится скучно.
      Поэтому, лучше покажи конкретный момент на видео, и я скажу, что я там использовал :)

    • @user-vl3np9ck3v
      @user-vl3np9ck3v Před 2 lety

      @@nikolay_tuzov там видно, что это не вырезанный процесс печати, а создание, т.к. выскакивает окно выбора действий. Благодарю)

    • @chmod1010
      @chmod1010 Před rokem

      в vs code ctrl+.

  • @surt16
    @surt16 Před rokem +1

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

    • @eamarc
      @eamarc Před rokem +1

      с текстом заморачиваться смысла особо нет (при логировании caller доведет до нужного места), но если дальнейшая логика обработки от этого зависит (например за мету хочется вернуть 500ю, а за команду 400ю), то есть смысл ввести типы ошибок ExternalError, UserError...

  • @stylizedworld8601
    @stylizedworld8601 Před 2 lety +1

    Используется го на фрилансе, в маленьких проектах? Или в основном только в крупных компаниях типо озона?

    • @nikolay_tuzov
      @nikolay_tuzov  Před 2 lety +2

      Точно не знаю, т.к. работал на Го только в крупных компаниях. Но могу сказать так - он точно используется в мелких проектах крупных компаний.

    • @stylizedworld8601
      @stylizedworld8601 Před 2 lety +2

      @@nikolay_tuzov Спасибо за ответ. Го у меня как первый язык, но слышал что в го идут уже миддлы+ с других языков и типо джунов в го не бывает. Действительно так все, и лучше идти на какой нибудь пайтон, потом уже на го пересаживаться.

  • @Hande_hoch
    @Hande_hoch Před rokem

    3:48 не понял, какая разница. Что будет, если придёт нил, а там поле не ссылка?

    • @Hande_hoch
      @Hande_hoch Před rokem +1

      а, кажись понял, если не ссылка, то нельзя сравнить на нил

  • @xpascalabcd
    @xpascalabcd Před 2 lety +2

    Что с гофером? Он стал такой худой

    • @nikolay_tuzov
      @nikolay_tuzov  Před 2 lety

      Который из них? =)

    • @xpascalabcd
      @xpascalabcd Před 2 lety

      @@nikolay_tuzov в самом начале. Робогофер

    • @nikolay_tuzov
      @nikolay_tuzov  Před 2 lety +1

      @@xpascalabcd да вроде обычный..