Начну с того, что я написал на Rust консольный клиент для WoW. В текущий момент он работает в режиме прослушки пакетов и может быть использован, как бот. В дальнейшем планируется усовершенствовать ручную отправку пакетов. Что именно на данный момент реализовано...


...вы можете узнать уже в этом абзаце. Вход на сервер, вход в мир, поддержка конфига, парсер UpdatePacket и MovementPacket, поддержка чата - это то, что работает на данный момент.

Рассказал - "что", теперь расскажу - "как". После подключения все приходящие с сервера пакеты считываются в очередь и отправляются специальным процессорам. Каждый процессор представляет собой группу обработчиков (handler), привязанных к определенным опкодам. Каждый опкод - это информация в заголовке пакета, которая определяет, что это за пакет, какое действие он выполняет. Результат обработки в процессоре затем отправляется в исходящую очередь и, далее - на сервер в виде ответа (на самом деле, результат может быть нескольких типов, но об этом можно будет узнать, более подробно ознакомившись с проектом, т.е. - не здесь).

По сути своей, отправка пакетов из процессоров - это автоматическая реакция на запросы с сервера. Но есть и второй способ отправки: реализация специального менеджера, который уже сам будет решать, какие пакеты отправлять и когда. Таким образом, можно написать поведения для бота (AI).

Если вы заинтересованы, вот мой проект на гитхабе.

Проект будет полезен так же тем, кто изучает Rust.

Комментарии (11)


  1. AlexeyK77
    16.07.2022 14:19
    +5

    Раз уж тэг Rust поставлен, то горзадо интереснее почитать не про бота как такового, а применение Rust-а при написании бота. Какой опыт, с чем столкнулись, что понравилось\не понраивлось.


    1. ivanuzzo Автор
      16.07.2022 14:42
      +5

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

      Собственно, перед тем, как приступать к проекту я где-то месяц сидел над этим учебником. И, думаю, правильно сделал, поскольку часто бывает, когда пришедшие в Rust с другого языка пишут код так, будто они его пишут на привычном языке.

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


      1. ivanuzzo Автор
        16.07.2022 14:49
        +1

        Говоря откровенно, нравится практически все. Есть просто нюансы, которые надо знать (ну или придется узнать). Как например, `as u32` и `u32::from` - ведут себя по-разному (as - в случае чего просто молча обрежет, а from - выдаст ошибку, поэтому рекомендуется использовать именно from).


      1. mxr
        16.07.2022 14:59

        Для удовлетворения моего интереса, на каких язык еще Вы писали коммерческий код?
        Пишу на крестах в основном, хоть убейте, не понимаю и не вижу преимущества Rust.
        P.S. Вопрос ни в коем случае не для разжигания срача, действительно интересно.


        1. ivanuzzo Автор
          16.07.2022 15:10

          начинал с JavaScript (до сих пор является основным стэком в форме React.js), так же несколько лет был PHP (в основном в виде Symfony2) и Python. На этих языках писал и коммерческий код, и код для своих личных проектов. На Rust боюсь писать коммерческий. Боюсь, что заставят писать какую-то гадость и разочаруюсь, как это уже было с Python.

          Так же добавлю (тоже не в целях разжигания), что хотя и не использую плюсы, но регулярно приходится разбираться в коде на C++ (конкретно, проект mangos и его производные). И я бы не назвал код на плюсах самым читабельным. Хотя, может, это конкретно там он такой.


          1. ivanuzzo Автор
            16.07.2022 15:11

            P.S. пора писать статью "Rust как форма эскапизма"


          1. KanuTaH
            16.07.2022 16:31

            Боюсь, что заставят писать какую-то гадость и разочаруюсь, как это уже было с Python.

            Хм-м, а как это связано? :) Если так рассуждать, то, поскольку говно можно написать на абсолютно любом языке, то нужно априори разочароваться во всех языках :)


            1. ivanuzzo Автор
              16.07.2022 18:53
              +1

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

              Мне нравится мой код (да, я понимаю, что это - временно), но когда я пойму, что в нем что-то не так - я его перепишу, если надо - с нуля. Но не буду продолжать писать то, что не нравится.

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


        1. DarkEld3r
          17.07.2022 12:25
          +7

          Пишу на крестах в основном, хоть убейте, не понимаю и не вижу преимущества Rust.

          Попробую поделиться опытом, как человек, который шесть лет писал на С++ и любил этот язык, а потом перешёл на раст и спустя пять лет "возвращаться" совсем не тянет. Скорее имеет место быть обратный процесс: поначалу я активно защищал кресты перед коллегами, которые были в восторге от раста, потом думал, что если с растом не пойдёт, то всегда без проблем снова буду писать на С++. Но позже пришёл к понимаю, что даже за большие деньги не готов переключиться назад. Хотя за новыми стандартами до сих пор стараюсь следить. К слову, последний плюсовый проект, над которым я работал, был вполне зрелым в техническом плане: опытные коллеги, нормальный процесс ревью, валгринд и санитайзеры на CI.


          Преимущества Rust я бы разделил на несколько (размытых) категорий:


          • Инфраструктура. Тут я ничего нового не скажу — карго хвалят все подряд. Могу разве что обратиться к плюсовому опыту — в своё время сильно радовался переходу на CMake, но на нескольких последних проектах поверх CMake было написано куча своего кода. В итоге каждый раз приходилось разбираться заново. Казалось бы, небольшая проблема, но теперь я вижу, что можно лучше: просто иметь декларативный конфиг для подавляющего большинства случаев. Тут обычно возражают, что каждый плюсовый проект сильно особенный. Не согласен, но раст вполне себе позволяет для особых случаев писать билд-скрипты. Причём на самом расте, а не на отдельном языке.


          • Правильные умолчания. Это когда при доступе к элементу массива/вектора у нас будет паника, а не UB, если мы вышли за границы. При этом есть get_unchecked альтернативы позволяющие избежать лишних проверок в горячем коде, если оно действительно нужно. При этом данная функция и unsafe и писать длиннее, так что просто так ты это делать не будешь. Сразу хочется комментарий написать почему оно тут нужно, иначе на ревью всё равно спросят. Да, я понимаю, что в С++ для новых сущностей просто поступали последовательно, но от этого не легче.


          • unsafe. Отчасти пересекается с предыдущим пунктом, но хочется выделить отдельно. Собственно, частый аргумент, что на расте ничего без ансейфа не написать. У меня несколько (если не сказать совершенно) другой опыт. Зачастую даже написание новой библиотеки начинается с ![deny(unsafe_code)] в корне. И очень часто оно так и остаётся. В любом случае, цель не избегать "небезопасного" кода любой ценой, цель — не размазывать его по всей кодовой базе, а завернуть в безопасную абстракцию. А явный маркер весьма помогает при обзоре кода.


          • Бороу чекер. Да, он запрещает некоторые корректные программы, да иногда воевать с ним достаточно больно. И те кто говорит, что он бьёт по рукам только новичкам "немного" лукавят. Но писать на языке без бороу чекра (и без GC, разумеется) мне сейчас просто некомфортно.


          • Макросы, особенно процедурные (и derive). Опять же, в плане написания это далеко не верх удобства, но пользоваться готовым весьма приятно. Для сериализации в С++ пользовался cereal, так вот просто добавить структуре атрибуты Serialize/Deserialize намного проще. Или можно сравнить clap с монструозным boost::program_option.


          • Это просто современный язык со всякими штуками вроде паттерн матчинга, нормальных тип-сумм, "всё выражение", константности по умолчанию, простой семантики перемещения и т.д.



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


  1. windymindy
    16.07.2022 21:17
    +2

    Тоже прочитал rust_book и async_book и принялся заменить wowchat на rust. Пока ничего не готово буду смотреть Ваш код.
    https://github.com/fjaros/wowchat


    1. ivanuzzo Автор
      16.07.2022 21:36

      спасибо за ссылку, похоже, там есть код, который и в моем проекте пригодится.