Как я продолжил дело Дота-лиги

Предыдущие части (не за моим авторством):
habrahabr.ru/post/316540
habrahabr.ru/post/316620

Возвышение Хоруса


Тимс был автором бота, а я был тем самым «прошаренным админом», который допиливал его код.

Можно долго спорить, кому что принадлежало, кто прав и кто виноват, но факт остается фактом — одна лига раскололась на две. Владелец бренда say-plz и спонсор поставил меня админом sP Dota League, а Тимс в тот же момент развернул RIHL (Russian In-House League. Между лигами была война за игроков, без применения разве что ядерного оружия.

Как произошел развал с моей точки зрения
Владельцем домена и хостинга say-plz был менеджер команды и спонсор под ником Матрикс. Он не знал, что происходит на лиге и не особо вникался в подробности. И после того, как Тимсу были предъявлены обвинения в неадекватном поведении и продаже модераторского доступа за деньги, у него был диалог со спонсором, в котором Тимс заявил примерно следующее: «это моя лига, что хочу, то и делаю». После чего Матрикс спрашивает меня — смогу ли я потянуть всё без участия Тимса? Я отвечаю ему — да. Ну, а потом Матрикс снимает права доступа с Тимса, сделав меня новым СЕО.

После того, как админом стал я, были внесены некоторые изменения в политику лиги.
1. Никаких необоснованных банов по личной неприязни.
2. Равные наказания и для известных игроков, и для новичков. Бан на 14 дней за намеренный выход из игры.
3. Моментальный демоут (из модеров в юзеры) тех, кто злоупотребляет своими правами — разбанивал друзей, или например пытался продать воучи (доступ к лиге) за деньги.

Продолжение жизни в Garena


В то время у нас было два дивизиона — SP1 и SP2. На первом играли самые продвинутые и скилловые игроки. С этим была проблема, потому что игроков SP1 было мало, многие не хотели ждать, пока соберется игра на первом дивизионе и шли играть на SP2. Сначала проблема была решена таким способом — прежде чем пойти на сп2, надо сыграть на сп1 хотя бы один раз за день. А с переездом в IRC комнаты были объединены, об это будет чуть позже.

Бот, в отличие от обычных игр в первой доте, учитывал всю твою статистику. И это были не только победы-поражения-очки, но и такая вещь как «стрик», т.е. победы подряд. И если 2–3 или даже 5 побед подряд в доте — нормальная ситуация, то 10, 20 — это уже что-то из разряда вон выходящее. На нашей лиге был такой легендарный игрок Vigoss, который побил абсолютно все рекорды, у него было 60 (!!!) побед подряд.

А самое интересное, что при победе над игроком со стриком, победителям давали бонусные очки. Все с нетерпением ждали момента, когда же Вигосс потеряет корону, и это всё-таки случилось.

Я даже нашел лог бота этой легендарной игры длительностью всего 23 минуты:

Game 4629.
Scourges won-63/+63.Mode: chall 3×3 ggc, Length 23min Draw/Sent/Scou results: 0/0/4PLZ4629.
Sentinels: vigoss sahka Sp- >
Scourges: Traffic-Roger Traffic|Dark Traffic|Tunes.
Scourges got 382 BONUS points for breaking streak of vigoss; streak of sahka;

Стрик был настолько большим (+55/60 у вигосса и сашки), что даже не показывалось его название. В боте тимса названия были определены только до 50, всё что выше +10 называлось просто Holy Shit. Никто даже представить не мог, что у кого-то будет стрик 50+.

Разработка бота под IRC


Garena была не просто глючной, а невероятно глючной. Например, там можно было запускать одного и того же бота в двух комнатах, он отвечал на сообщения и работал вполне нормально. Однажды лига подверглась нападению бешеного хакера из Казахстана, который каким-то образом мог «ресетить» всю комнату, у всех вылетали игры и случались дисконнекты. Это сейчас если тебя выкинуло, ты можешь просто зайти заново и начать играть, но не в первой доте. Дисконнект — это всё, конец. Обычно игра или продолжала идти 4×5, или же загружался предварительно сделанный сейв.

Использовать не совсем надежный StealthBot (знали бы вы, как Тимс прикрутил его к Garena!) и Visual Basic Script не было никакого желания, поэтому было решено переводить лигу на IRC, и писать бота под него. Именно так работала лига IHCS, которая была эталоном на тот момент. Я начал заниматься любимым делом всех программистов, которые однажды пытались разбираться в чужом коде — ПЕРЕПИСАТЬ ВСЁ С НУЛЯ, уж сам-то сделаешь идеально!

Итак, мне нужно было сделать бота для IRC, каким-то образом прикрутить к нему MySQL и заставить работать на сервере Quakenet в IRC. Это был путь, полный боли и страданий. Наверное, именно так и становятся программистами, самостоятельно решая какую-то новую проблему, когда даже гугл не в силах дать тебе ответ.

Для IRC платформы я взял Eggdrop, по дефолту в нем не было почти ничего, но мне нужна была лишь поддержка скриптов, которые писались на языке TCL. Язык был хоть и новый для меня, но достаточно простой, без излишеств. Он был приятнее, чем VBS, и разработка в целом шла нормально. Вот только Eggdrop отказывался компилироваться на VPS. Превозмогая, пришлось как-то править исходники, чтобы заставить его работать. Это была победа. Мой первый IRC бот завелся и написал на канале первые фразы.

Переезд в IRC на сервер Quakenet


Сначала был сделан бот для тестгеймов. Это для тех, кто еще не имел доступа на лигу, но очень хотел туда попасть. Игроки заходили на канал, ждали модератора, который начинает игру, а потом принимает решение, кому дать инвайт. Обычно этот канал заспамливался фразами «ГО ТГ!» и игрокам было нечем заняться. В дальнейшем именно этот канал стал широко известной в узких кругах лигой «сп3», на которой можно было играть и получать очки (напомню, что именно из-за статистики побед-поражений игроки предпочитали лиги, в первой доте не было никакой встроенной статистики вообще). В конце месяца среди лучших игроков проводился суперфинал, в котором можно было сразу попасть на основную лигу. Сп3 была достаточно ламповой, и на ней играли даже некоторые игроки с основных дивизионов, когда не хотелось особо напрягаться.

Затем и основной бот был переведен на платформу IRC. Вместо двух отдельных дивизионов с разными чатами, было решено сделать один общий чат, но с градацией игроков. Игроки SP1 подсвечивались синим цветом, SP2 цвета не имели.

Кроме этого, я значительно обновил систему ролей. Вместо иерархии вида Игрок → Хост → Модератор → Воучер → Админ, я сделал 3 ветки — игроки, модераторы и воучеры. Каждый мог иметь абсолютно разный доступ, и это было очень удобно. Воучеры перестали быть «крутыми модераторами», и в их обязанности не входило рассмотрение жалоб, они занимались только инвайтами новых игроков.

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

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

О цензурах и репутации
На лиге была такая штука — censure. С помощью бота и команды .censure <ник> <причина> его мог выдать любой игрок кому угодно, даже просто так. Если ты его выдаешь, и у тебя и у цели снимаются очки репутации. Если ты начнешь выдавать их всем подряд — рискуешь сам потерять её.

Репутация изначально не влияла ни на что, ее было около 50 единиц, и цензур снимал 3. Если она заканчивалась, ты получал бан на 3 дня, и репутация снова становилась равна 50. Следующий бан был уже на 6 дней, и так далее по +3 за каждый.

Затем я ввел некоторые коэффициенты, если у тебя было мало репутации — количество получаемых очков за победу уменьшались вплоть до 40%. Игроки стали гораздо тщательнее следить за своим поведением.

Хотя, и приколы с этим были тоже. Была одна легендарная личность под ником MarcoDeLacrosso, он писал смесью каПСЛОКа иОБЫЧНОГОтекста и ИНОГДАБЕЗпробелов. Называл всех школьниками, еще до того как это вообще стало считаться оскорблением. При этом Марко вел себя достаточно адекватно, но после игры КАЖДЫЙ считал своим долгом дать ему цензур. Когда он улетал в бан из-за отсутствия репутации, то ждал несколько недель, чтобы снова начать играть. За это время по нему уже многие успели соскучиться, спрашивали, когда же его разбанят.


По сравнению с ботом в Garena, который то и дело отваливался, и лига просто вставала, Eggdrop был надежен как автомат Калашникова. Бот был на канале 24 часа в сутки, 7 дней в неделю. Никто и никогда не мог его положить. За небольшим исключением.

Один особо резвый игрок получил бан и начал угрожать нас положить. И если айпи бота был скрыт, то сайт лиги был в открытом доступе. Хостинг мне любезно предоставил друг, потому что много ресурсов нам было не надо. В общем, после 10-гигабитного ДДОСа, я остался без хостинга. Как и мой друг, которого просто послал хостер.

Я нашел какой-то недорогой VPS на американском сайте, самое смешное, что через месяц они не стали требовать оплаты, всё работало как раньше. Так продолжалось целый год, пока они в один момент не отрубили сервер. Я предполагал, что рано или поздно это должно случиться, и просто восстановил бэкапы на другом сервере.

Веб-проекты


Т.к. на лиге по сути все команды выводились через бота в текстовом виде, иногда это было неудобно. Например, надо посмотреть все игры конкретного игрока, и с кем он играл. Через бота это бы занимало вечность — вывести список игр, затем вывести каждую и так далее. Благодаря тому, что данные хранились в MySQL, было достаточно легко отобразить всё это на сайте. Первую версию на Perl делал один из администраторов под ником Tycooon.

Но после того, как я переписал бота, требовалось переписать и сайт. Tycooon взял модный на тот момент Ruby on Rails, но сайт так и не доделал. Я понял, что надо браться самому. Начинать учить Rails как первый web-фреймворк (без опыта с PHP) было гораздо сложнее, чем написать IRC бота. Я ещё зачем-то заботился о юзерах с выключенным javascript, мой код выглядел максимально ужасно. Мне было совершенно непонятно, как работают ассоциации, когда писать includes: people, а когда includes: person. Но всё это я успешно решил, и сайт был запущен на радость игрокам.

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

Закат лиги


Под моим руководством лига просуществовала примерно 4–5 лет. Вплоть до выхода доты 2, а в ней, как известно, статистика была уже в клиенте. Меня самого к тому времени уже практически перестали интересовать игры, я занимался этим проектом потому что мне было интересно. Большинство игроков перешли на вторую доту, и лига стала просто не нужна. Это были очень веселые и интересные времена, и я совершенно не жалею, что потратил на неё время.

Не знаю, как бы повернулась моя судьба, если бы дота прошла мимо меня. В том числе благодаря ей я сейчас я Ruby on Rails разработчик в одной из московских компаний, и мне очень нравится то, чем я занимаюсь. На этом я и закончу рассказ, надеюсь, читать было интересно :)

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

  • 6 декабря 2016 в 15:56

    0

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

    Это не баг, это фича. Можно, конечно, и запретить такое программно…, но зачем, если моджно просто банить тех кто злоупотребляет техническими возможностями?

© Habrahabr.ru