Як я Доту-ліги відкривав. Частина 2


Початок тут: Як я Доту-ліги відкривав. Частина 1

Кінець 2007-го, знову зима, і знову час розвиватися. Ми успішно перенесли лігу з вмираючого Battle.Net у висхідний Good Game Client (пізніше — Garena). Нові гравці приходять кожен день, ліга зростає, всіх радує відсутність читеров, відмінний пінг і легкий процес початку гри. Гравці закликали своїх друзів в цю платформу з Battle.net з локальних мереж та піратських серверів — всі йшли в Garena. Холодний грудень спонукав людей залишатися вдома і грати. Постійний онлайн гравців Warcraft на цій платформі в СНД-секторі зріс з 1000 до 10 000 гравців. Дуже скоро, Garena стояла в кожному комп'ютерному клубі, а онлайн-турніри проводилися тільки на ній.
Все відмінно, і у нас був єдиний і самий крутий бот на цій планеті платформі…


Good Game Client
Платформа була чудовою і невивченою. Ніхто не знав, як саме вона працює, і що цікавого можна в ній знайти. Так як я був єдиною людиною, що приймає рішення, я починав думати про майбутнє:

— де б знайти грошей і спонсорів? як їх знайти, і де шукати?
— куди далі розвивати лігу?

Проста та геніальна ідея прийшла досить швидко — треба об'єднатися з найкращою і впізнаваною командою, і випускати лігу від їх імені! Їм — піар + спонсори точно зрадіють, а нам — подарунки від спонсорів, щоб нагороджувати переможців! Вибір відразу ліг на найкращу на той момент команду з зухвалим назвою SAY-PLZ, тим більше вона була з Москви. Спільну мову знайшли, схвалення отримали, лігу перейменували. Менеджер цієї команди пообіцяв вибивати кожен сезон (3 місяці) за 1й відеокарті на приз найкращому гравцеві ліги. Це було краще, ніж нічого, і ми погодилися. Тим більше, вони надали свій сайт як майданчик для ведення правил гри, вирішення спорів і відбору гравців.

Ліга отримала нове дихання, гравці відчули новий азарт — не тільки віртуальні окуляри, але і шанс виграти найкращу на той момент відеокарту від спонсора!

Конкуренція
Як повноцінна ліга, ми були в Garena одні. Тут не було конкурентів. Бот був тільки у нас. Це одночасно і добре (всі кращі гравці у нас), і погано (без конкуренції складно ворушитися щось робити). З часом, наші старі друзі з іншої ліги попросили нас дати їм такого ж бота, щоб вони переїхали, нарешті, з Battle.Net Garena. З одного боку це означало б, що у нас стане менше гравців. З іншого боку, це був би цікавий виклик — буде з ким змагатися! У підсумку, після тижня роздумів я дав їм свою програму, під чесне слово нікому більше не давати, адаптував їх бота під Garena, і так у нас з'явився конкурент :). Забігаючи вперед скажу, що слово своє дотримали, такий-же бот ніде не з'являвся, вони його нікому не давали. Частина гравців почала перетікати між двома лігами — якщо гравця забанили на пару годин на одного(наприклад за погану поведінку), то він міг піти грати на другий, і повернутися назад. Ми нічого не стали з цим робити, і дотримувалися нейтралітету по відношенню один до одного — вони не лізли до нас, а ми не лізли до них, кожен робить що хоче, і ніхто не каже іншому, що треба робити. Так можна було брати лише найкращий друг у друга.

Здрастуй, Garena !
Несподівано для всіх, платформу GGC перейменовують в Garena (від Global ARENA) і оголошують масштабний ребрендинг:


Наступні півроку народ плюється і як тільки не називає нову платформу: Гангрена, Говнорена ітд, але з часом всі звикли до такого неблагозвучному назвою. Стиль інтерфейсу змінюється з біло-жовто-металевого на червоно-депресивний.

Настав час поколупати нарешті Garen'у, і подивитися що можна з неї витягти. На жаль, асемблер я не знав від слова зовсім, тому намагався відкрити службові файли, пошукати якісь ресурси платформи. Так мені попався на очі якийсь файл RoomsEN.dat. На перевірку виявився звичайним файлом бази даних SQLITE. Використовуючи програму SQLite Expert, я відкрив файл і виявив цікаві таблиці: [Rooms], [Servers]

В таблиці Rooms я зміг знайти свою кімнату Say-Plz Dota League Room. У цієї кімнати був свій числовий номер, а в сусідній колонці server_id, приймає значення від 1 до 6.

Подивившись таблицю Servers, я виявив ці самі 6 серверів:


Один з них був сервером моєї кімнати й кількох (сотень) інших кімнат. Тобто всі кімнати Garen'и тоді розташовувалися всього на 6 серверах.

Реверс-інжиніринг Garena
Копаємо далі — чому в якості IP-адреси використовується ціле число? Де звичні оку 86.60.90.164? Я провів не один вечір, зрозумівши, що це число (наприклад 243037643) потрібно представити в шістнадцятковому вигляді (hex): 0E7C75CB , а потім дзеркально розгорнути його: CB.75.7 C. 0E і представити їх у десятковому вигляді: 203.117.124.14. Вуаля, ми нарешті зрозуміли як можна конвертувати IP ціле і назад(чесне слово, я гугл, але мабуть підписка на гугл закінчилася). Тому ми беремо наш 127.0.0.1, представляємо в HEX: 7F000001, розгортаємо його задом на перед: 0100007F , отримуємо 16777343, підставляємо в Базу даних, запускаємо клієнт і вуаля! Наша програма-клієнт нарешті отримала загадковий трафік, який клієнт відправляв на сервер!

Тепер я почав отримувати незрозумілі дані в бінарному вигляді. Для удоства представляв їх в HEX, але все одно не міг нічого зрозуміти. Мене охопило бажання розібратися в цьому протоколі, що ж шле клієнт! Для початку я записав пункт відправлення слова «Test» в загальний чат, перехопив ці дані і зберіг їх. Далі я спробував зімітувати відправку цього слова в чат, відправив і… не побачив результату — в загальному чаті моє повідомлення не виднілося. Як з'ясувалося пізніше, повідомлення побачили всі користувачі, крім мене самого — клієнт Garena не відображає надіслані собою ж повідомлення, а показує їх сам в момент відправлення.

Вже було щось. Значить, відправляється в рядку були зашифровані дані! У загальному і цілому я провів 23 години, без перерви на сон, щоб розібратися в цьому протоколі, і нарешті розколов цей горішок, використовуючи AutoIt, калькулятор і папір з ручкою! Раніше я нічого подібного не робив, і ніколи не вивчав мережеві протоколи, тому все було для мене в новинку.

Приблизний склад пакета4 байти — довжина пакету
2 байта — тип даних (вхід в кімнату, вихід з кімнати, нове повідомлення
інші байти — корисне навантаження, в залежності від типу даних. Якщо це повідомлення в чат, то тут був тип повідомлення — публічне, приватне, жирним. Далі йшов ID користувача та текст повідомлення.

Один знайомий потім сказав, що протокол майже повністю повторює протокол у Lineage II.

Був уже обід, а я не спав більше доби. Пора було лягти спати, і гарненько виспатися, я відчував, що стояв на порозі нового прориву!

Спав мало — так сильно було бажання написати нову версію бота, яка працювала б вже без самого клієнта Garena, а спілкувалася б з сервером безпосередньо. Ще 1 день, і в мене вже був робочий прототип. Через 2 дні я перевів бота на нову версію — клієнт Garena вже не був потрібний, бот став відповідати на повідомлення практично миттєво (раніше відповідь займав 2 секунди). Я не залишив спроб вивчення протоколу, і виявилося, що сервери Garena зовсім не перевіряють, від кого прийшли дані. Взагалі. Абсолютно. Можна було відправити пакет, що користувач HeLRa пише в чат: «Hello». А можна було відправити в чат, що користувач змінив іконку у свого ніка (всього було доступно близько 64 різних іконок на вибір). Це наштовхнуло мене на думку прикрасити чат, щоб позначити гравців по їх рангу, або рівнем доступу. Адміністратори були з самими крутими іконками, модератори простіше, а всі інші — з іконкою мінотавра.


Всі користувачі були в шоці, який «бєспрєдєл» твориться в нашій кімнаті(каналі), але це був наш канал, і в цілому всіх все влаштовувало. Приблизно через тиждень, до нас почали вчащати якісь люди з блакитними ніками — виявилося, це глобальні адміністратори Garena. Вони заходили, тихенько перемовлялися, чого це ми тут беспредельничаем, але оскільки такий «злом» був лише в одній кімнаті(а не по всій гарене), то наслідків не виникло, а через пару тижнів вони цей баг пофиксили, разом з вразливістю відправки повідомлення від імені іншого користувача.

Вступ у лігу
Вже березень 2008, наша ліга має найкрутішого бота, у нас постійно проходять гри на дуже високому рівні, а на форумі висить купа Vouch-request'ів(запитів на вступ у лігу).

Раніше, щоб потрапити до нас на лігу, гравець повинен був розмістити своє коротке резюме — в яких командах він грав, як довго грає, хто улюблений герой, і докласти запис зі своєї найкращої гри, де він пітнів і старався. Через якийсь час, його заявку розглядав якийсь модератор і виносив рішення — стоїть він нашої ліги, чи ні. З часом, заявок стало так багато, що модератори вже не справлялися, а набирати більше модераторів — значить втрачати контроль над усім цим. Тому ми змінили схему, і тепер, щоб потрапити на лігу, потрібно було зібратися в певний день в певний час, і битися з іншими бажаючими потрапити на лігу(відбори, test game). За всім цим в прямому ефірі спостерігав модератор, і відзначав найкорисніших гравців, яким варто дати запрошення.

Ця схема дозволила модератору замість перегляду годинного реплея, за один раз розглядати відразу 10 кандидатур, і запрошувати по 1-3 людини(а іноді і нікого). Як зазначалося персональний навик гри, так і гра в команді: іноді якийсь гравець починав виникати: «як же так, я наубивал більше всіх, у мене виявився самий сильний і розгойданий герой, а ви мені не дали запрошення!», на що йому відповіли, що він всю гру спокійно розгойдував героя в сторонці, в той час як вся залишилася команда дещо як відбивалася від нападів противника, і після 30 хвилин спокійної розгойдування — цей герой природно був самим сильним, і якщо б не сильна команда, то вони б програли набагато раніше.

Набір в лігу нагадував вступ в Бійцівський клуб — люди повинні були довести, що варті :)

Як ще іноді відбиралиІноді модератори додавали гравців без тест-гри, особливо коли їх кращі друзі клялися, що цей гравець вартий і ручається за нього!

В доті всі люблять бути самими убивателями, і набагато менше гравців, які люблять грати помічниками (support), які лише допомагають своїм більш грізним героям вбивати. Якщо вся команда буде грати за убивателей, то неодмінно програє, т. к. допомагати їм буде нікому. А оскільки наша ліга була досить сильною, то і гравці найчастіше любили грати за убивателей. З цієї причини, на відборах модератори дуже позитивно ставилися до гравців, які за всю гру дуже сильно допомагали команді, і навіть якщо рахунок вбивств/смертей у цього гравця негативний, то теж могли видавати запрошення, як корисному гравцеві. Досвідчений очей модератора відразу бачить добрих помічників.
Коли ти найголовніший на лізі, і ти дуже молодий, а сотні людей просяться на лігу, а інша просить тебе дати їм адміна, то волею-неволею у тебе з'являється зіркова хвороба. Вона вразила і мене. Соромно про це писати, але без цієї сторони медалі, вся історія вийде не повною: Я став самим злим і нещадним адміном. Коли я сідав пограти в своїй лізі, то зі мною боялися грати. Якщо хтось в команді тупил(навмисно чи ні), то я міг прямо під час гри виписати йому бан(на час), а то й вигнати з ліги! Просто, що він не опинився в потрібний час у потрібному місці. З часом, дійшло навіть до того, що якщо я вступав у гру, то більшість набрали відразу скасували свою реєстрацію, і ніхто не хотів зайти, тому що боялися зайти. Я став трохи хитріше і став використовувати інші облікові записи, під якими мене ніхто не знав, але все одно виписував бани. З одного боку, я створював найкрутішу лігу, а з іншого, сам же її і губив…

Ліга забирала весь мій час — я постійно думав над поліпшенням бота, ліги, правил, і все що міг поліпшити. Ліга була моїм життям, моїм дітищем. Я пив, їв і спав за комп'ютером, читав чат, вивчав поведінку користувачів і їх помилки, і робив бота ще простіше і зрозуміліше.

Про гроші
З часом мене все частіше відвідувала думка: Як можна заробити на цьому? Розбещувати лігу «разбаниванием за гроші», або «запрошення за гроші» я не хотів, тому шукав нові можливості.

Спонсори були досить мізерні, і давали лише відеокарту раз в 3 місяці.

У платформі Garena можна було прокачати свій аккаунт, купивши «Gold Account» — твій нік ставав помаранчевим(золотим), і ти міг заходити майже в будь-яку кімнату, навіть якщо вона заповнена. Ось тільки придбати його можна було тільки через PayPal. В той час у багатьох небуло навіть пластикових карт, а з платіжних систем найпопулярнішою була WebMoney (Яндекс.гроші тільки-тільки з'являлися, тому не в рахунок). Купити Gold Account через WebMoney було не можна, і так я став посередником — купував Gold Account \ ' и в Garena, і продавав їх через WebMoney з націнкою. Я написав другого бота, який ходив по всьому СНД-кімнатах у Garena і давав коротку рекламу про продаж Gold Account \ ' ів. В місяць вдавалося заробити до 2-х тисяч рублів. Різниця між 0 та 2000 була величезною, і я відчув, що можу «легко заробляти в інтернеті». Час від часу мені писали люди, охочі купити Gold Account, але сумніваються — чи можна мені довіряти. Найвагомішим моїм аргументом було те, що я головний адміністратор доту-ліги, і продаю акаунти давно. Люди довіряли, купували, приходили ще.

Вміння продавати віртуальний товар людям у віртуальному онлайн-чаті мені дуже згодилося. Коли я вже закінчив університет, вміння продавати мені дуже стало в нагоді :). Продавати в офлайні виявилося набагато простіше, ніж в безликому чаті ICQ.

Новий постачальник
Вже у всю йде літо 2008-го року, мені пише якийсь хлопчина, який може мені продавати Gold Account \ ' и в 2 рази дешевше. Я не став задавати питання, і просто почав у нього їх закуповувати, збільшивши свій прибуток. Як з'ясувалося пізніше, він купував крадені пластикові карти на хакерських форумах, і купував на них Gold Account \ ' и. І він був такий не один. Адміністрація Garena прийняла міни, і заборонила всім користувачам, крім модераторів секцій розсилати предмети. Тепер ні я, ні він, ніхто не міг відправляти предмети, і лавочка прикрилася (на якийсь час). У мого знайомого був акаунт модератора секції, так що він міг відправляти предмети, і я почав закуповувати GoldAcc як раніше.

Через якийсь час, мені знову пише цей самий постачальник, який непогано нажився на цих махінаціях, і запропонував мені угоду, від якої я не зміг відмовитися — він купить у мене доступи модератора за досить значну для тих часів гроші

скільки?досить багато для студента, але смішно для дорослої людини.

Мені дуже важко це пояснити, але у нас була «ліга джентельменів», у нас не було прийнято щось продавати, наприклад продавати доступи на лігу, або підвищення. У нас був принцип — "якщо гідний — будеш".

Але тут я пішов на порушення цього негласного принципу, і частина модераторів і адміністраторів стали засуджувати цей вчинок, мовляв «продався». Зі свого ж боку я вважав себе мають повне право роздавати доступи тим людям, кому вважав за потрібне, а враховуючи свій внесок, який я вніс в лігу, створивши її з нуля, я не вважав за потрібне перед кимось звітувати. Це було початком кінця…

Доглянь сервером
У той час я крім навчання і ліги, встигав підробляти приходять адміном в невеликій держ. конторі. У них був безлімітний інтернет і невеликий сервачок, на якому я по сусідству і розмістив свого бота. Успішно закривши сесію, я поїхав на канікули в свої рідні краї, в яких з інтернетом було все дуже погано. Щоб ліга жила, я попросив самого технічно-прошаренного адміна B наглядати за ботами, і перезапускати їх.

Літо минуло, я повернувся до Москви. За цей час бот трохи змінився — цей адмін B розібрався в моєму коді, все зрозумів і навіть поліпшив його, зробивши кілька давно очікуваних речей.

— «Ну що ж, чудово!» — подумав я, і зрадів, що тепер у мене є помічник.

Початок кінця
Настав жовтень 2008 року. Суперечності в лізі досягли свого апогею, адміністратори розбилися на 2 табори: «Він має повне право розпоряджатися своєю лігою як хоче!», і: «Ми теж вносили свій внесок у розвиток ліги, і маємо таке ж право на управління лігою!»

У цей критичний момент, раптом з'явився менеджер професійної команди (яка розпалася ще півроку тому). Він був і залишався власником сайту з форумом на якому все крутилося. Йому поскаржився один незадоволений адмін B і пред'явив, в чому я його не влаштовую:

1. Що я протягнув до модератори свого людину, зовсім не придатного на цю роль, і цю роль не виконував (ця людина справді не брав участі в житті і розвитку ліги, а доступи йому потрібні були як звичайній людині ксива для понту)
2. Що є один дуже старий адмін A, який дуже давно не заходив у мережу, і в нього треба відібрати вищі доступи адміна (він просто переїхав в новий будинок, де не було інтернету).
3. Що я взагалі став неадекватним і лазню всіх підряд.

Менеджер пише ці претензії мені в ICQ запитує — «що за справи? що ти твориш на моїй лізі?». Дуже дивно було це читати від людини, який вперше в житті з'явився на лізі, і сказав, що це його ліга.

Він вимагав:

1. зняти повноваження з модератора — «ок, зробимо»
2. бути поадекватнее — «звичайно, не питання, але я баню тільки найгірших гравців! чесне слово!»
3. Прибрати адміна А. — а от цього я зробити не міг. Цей адмін був одним із двох людей, які були зі мною з самого початку у витоків. Саме з ним я промовляв і придумував, як повинна працювати ліга. Він сидів зі мною в безлюдному чаті в 3 години ночі, чекаючи, коли я допишу новий код, і тестуючи його разом зі мною. Він був мені не просто другом, а товаришем. Я не міг зняти з нього доступи. Та й яка взагалі різниця, що у неактивного користувача адмінських права? Я пішов на принцип, і відмовився виконувати цей пункт.

Переворот
Подальші події розгорталися дуже швидко. Спочатку мене забанили на нашому каналі в Garena. Потім забанили мого бота, а адмін B маючи доступ на сервер, завжди мав у себе останню версію бота. База даних на сервері, яким також володів менеджер, тому користувачі нічого не відчули. На форумі мене забанили ще через 15 хвилин. Я залишився без доступів до каналу, без доступу до сайту, без свіжої бази даних користувачів. Єдиний майданчик, де я міг вести суперечку — відносно незалежна продота. Там почалися шалені розбирання, бруд, кров і помідори.

Ті адміністратори, які почали бунтувати проти перевороту, позбулися админства дуже швидко. Деякі модератори, які підтримали переворот отримали довгоочікуване підвищення в адміни. Влада перейшла в інші руки.

Я вважав, що правда на моїй стороні. А раз правда за мною — то народ зрозуміє, що мене кинули, та не буде там грати. Я був занадто наївний. Я не знав, що можна використовуючи хитрі слова і довгий язик перевернути правду з ніг на голову, виставити мене в грязі і виставити винною. Колись мовчазні модератори висловили мені все, що про мене думають, не ризикуючи втратити доступів. Єдиний пункт, з яким я був згоден — це те, що я неадекватно банил людей, але і це був не привід відбирати у мене моє дітище, моє творіння, роки мого життя!

Суперечка на незалежній майданчику ні до чого не привів. Адміністратори Garena намагалися не втручатися активно в конфлікт, але могли передати мені права на кімнату, якщо я доведу, що я власник бота. Їм досить було, щоб бот виголосив в чат: Бот написав Тімс. На жаль, адміни Garena підключилися занадто пізно, я вже втратив усяку владу, а всі гравці були налаштовані проти мене, і мені навіть не хотілося повертати собі лігу. Відтепер у корабля новий капітан!

Я був розчавлений в коржик, я втратив усе, над чим працював, для чого працював. У мене не було більше ліги, у мене не було більше доступів, у мене не було гравців, які користувалися б моїми програмами. В добавок до цього на наступний день контора взяла собі нового постійного адміна(якийсь дивний збіг обставин), і мені по суті не треба було ходити на роботу, а за кілька днів до цих подій я розійшовся з дівчиною.

Що там про долю?
Це був дуже важкий період в моєму житті. Але я хлопець заповзятливий, вірно?
Дивлячись з майбутнього в минуле можу сказати, що ці події розв'язали мені руки, звільнили мене від тяжкої ноші постійно стежити за ботами, за лігою, за адмінами і за гравцями, і дозволили зайнятися нарешті сайтобудування, до якого у мене так і не доходили руки. Тільки кількома роками після я зрозумів, що цей переворот позитивно позначилася на моєму житті, ніж якщо б він не походив. Як шкода, що в той момент я цього не розумів — я заощадив би собі купу нервів.

PS: Багато років потому, я списався з адміном B, ми один одного пробачили, а я його навіть подякував за все це.

Через місяць я зібрався з силами і зробив новий амбіційний проект, там же — в Garena.
Продовження слідує…
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.