Игровой бот для MUD на баше
Как я упоминал в одном из своих постов, в свое время я убил кучу времени играя в текстовую MMORPG.
На сегодняшний день времени на игры нет совсем. Вот прям совсем совсем, однако с ребятами с игры я нет-нет общаюсь.
Но это все лирика. Теперь к сути.
А суть в том, что сидел я на работе. Таски сделаны, делать нечего, сижу учусь, слушаю курсы, читаю документацию. В этот момент возникает ощущение, что я чем-то не тем занимаюсь.
В такие моменты надо себя чем-нибудь занять. Чем-нибудь, чем обычно не занимаешься – отвлечься в общем.
И решил я покодить.
А что кодить то?
Самое сложное – придумать задачу. Ведь, в ситуации, когда нет заказчика – надо его найти или стать самому себе заказчиком. И вот сидел я думу думал и вспомнил, что на неделе ко мне в скайп стучался один мой бывший соклановец с просьбой повесить бота на основе клиента игры под винду на моем VPS.
В тот раз я ему отказал, VPS у меня откровенно слабенький, ну что еще за 1 доллар возьмешь то. А тут вот вспомнил и подумал, а почему бы не залепить бота без клиента, да еще под линух, чтобы можно было на амазоне на год бесплатно повесить и всем стало хорошо.
Сказано – сделано. Задача придумана.
На чем кодить?
Самое простое – кодить на том, что ты знаешь. В данном случае на Bash.
Потом можно уже будет перекодить на том, чего пока не знаешь. Вдруг я начну учить Python или Go, вот и будет готовая задачка.
Как кодить?
Вторая часть решения любой задачи – это ее разбор и расклад.
По сути игра – клиент-серверное приложение. Сервер есть, нужен клиент. По сути бот сам по себе и будет клиентом.
Хорошо. Идем дальше.
Протокол. Игра шлет данные плейн-текстом, следовательно нам надо читать поток и на основе паттернов писать в поток.
Супер. С этим определились. Теперь с вариантами.
Читать и писать в поток можно по разному. Например, можно использовать пайпы или со-процессы. Выбрал второй вариант.
Устанавливать tcp соединение можно тоже по разному – через netcat или через /dev/tcp. А тут решил использовать первый 🙂 для разнообразия
Отладка
Это страшное слово отладка.
Везде где можно лепим printf, лишним не будет. Когда не нужно – убираем.
По итогу – 10 итераций.
Костыли
Куда же без них родимых. Суть в том, что в строке передаваемого паттерна есть оконечник. Выглядит он так ‘.
Ичсх, мне надо было ответить обратно без него, хз почему ${parameter#word} не хотел урезаться, хоть ты убей. Возможно просто руки кривые.
Пришлось заюзать дополнительную переменную (это не есть хорошо, зато работает)
Итог
Код тут – https://github.com/nickpoida/newzerkalo_mud_bot
Чсх, пока писал пост – нашел что можно поправить в коде 🙂
Чсх 2, пост писал примерно столько же времени сколько и бота.