Две кастрюли борща и одна фотография ног: как мы неделю писали телеграм бота с квестами, чтобы подарить другу айпод

 Публичный пост
22 января 2022  2042
ОХУЕННО ⨯10

Вечером 11-го сентября ко мне зашла подруга, чтобы забрать шторы. Я не видел её пару месяцев и очень хотел посоциализироваться с ней у себя на балконе с винишком, но к этому моменту я уже две недели работал на износ, неделю нормально не спал, а три дня в принципе существовал исключительно на Редбуллах и адреналиновом раше. Когда она позвонила в дверь, я обнял её, извинился и сказал, что шторы с крючков ей придётся снять самой: я не успел и не успеваю, мне очень нужно провести пацанам инструктаж и пройтись с ними по сценарию.

— Какому сценарию?
— Мать, чесслово, я тебе потом всё расскажу, щас вообще нет времени. Нам ещё бота допиливать.
— ???
— 🙃🙃🙃

Подруга пришла как раз в середине объяснения пацанам правил завтрашнего обязательного квеста. Встав на стул, притащенный из кухни, дабы дотянуться до крючков на потолке, она услышала примерно следующее:

— Родион, не забывай, вы — невоспитанные и всеми нелюбимые маргиналы, гопники, бичи и обоссыши. Вы должны быть максимально громкими и отвратительными; вы должны вести себя так, чтобы полиции хотелось к вам подойти и документы попросить, а у Жеки не было варианта не отдать вам все свои деньги.
— Ладно. Колонку для “Узнать за 10 секунд” ты нам выдашь?
— Да, она стоит на столе рядом с тремя Балтиками 9. Список треков с уже проставленными таймкодами я вам тоже скину.
— Понял. Что-то ещё?
— Ещё не знаю, но вроде бы нет. Сумку он получит, если пройдёт все сайд-сайд квесты, мы дадим вам знать. Главное, не попалите её и грамоту раньше времени.
— Хорошо, сделаем. Денис, неси ножницы, пора футболку резать!

Нежно млея от происходящей вокруг ебанистики, подруга забрала шторы и, прощаясь, спросила, не имеет ли это чего-то общего с Днём рождения Жеки. Она оказалась полностью права: второй год подряд креативному агенству “Погнали” в лице меня и Гауза не сиделось на месте, поэтому второй год подряд мы придумывали, чем бы развлечь лучшего друга в день его рождения. Спустя чуть больше суток после того, как подруга зашла за шторами, Жека будет сидеть на крыше жилого дома и, получив все свои подарки, будет выглядеть вот так:

Этому фурору поспособствовали: один телеграм бот, две кастрюли борща, три подарка, четыре сайд-квеста, пять дюжин редбуллов, шесть сайд-сайд квестов, семь дней бессонного ада и восемь человек.

Щас всё расскажу.



💿 Loading Random Access Memories

О том как мы в 2020 году праздновали День рождения Жеки, я рассказывал вот в этом посте. Велики шансы, что вы его не читали, поэтому держите TL;DR:

  • Мы — это я и Гауз, мой лучший друг и [уже] сосед по квартире.
  • Мы несколько с припиздкой.
  • У нас есть друг Жека.
  • Он такой же.
  • В 2020 году мы должны были съездить на пару концертов и здоровски потусить.
  • АХАХАХАХАХАХАХ.
  • Поэтому мы с Гаузом решили подарить Жеке на ДР сюрприз-поездку в Италию на машине через Альпы.
  • Мы всё забронировали и оплатили, но быстро поняли, что “забрать его на машине из общаги и уехать” — недостаточно классный сюрприз.
  • Поэтому мы решили выпроводить его из дома, дабы заехать к нему и собрать в дорогу его вещи. Для этих целей был написан, поднят, протестирован и запущен телеграм бот, который задавал Жене вопросы. За правильные ответы бот выдавал точки на карте, в которые Жене нужно было направляться.
  • Женя успешно отвечал на вопросы, передвигаясь по городу; мы успешно собрали его вещи, после чего не без приключений покатались, вкусно поели и отлично провели время. Получилось на ура. Женя тогда сказал, что не знает, как можно сделать подарок круче и интереснее.

)))))))).

Нужно было повторять. Нет, ладно, кроме нас двоих с Гаузом это никому не было нужно. Хотелось повторять. Хотелось сделать круче и интереснее. Как минимум потому, что у нас уже был работающий бот для интерактивных развлечений, превращающий человека в героя РПГ, которому можно было прописать любые приключения, и он бы без вариантов им следовал. А мы таким целый год не пользовались. Глупости.

Как максимум же, в этом году вечеринка в честь Дня рождения была не просто вечеринкой в честь Дня рождения. Через пару дней после праздника Жека садился на самолёт в Барселону и улетал туда в Bootcamp. Обратно в Мюнхен он оттуда не возвращался: в планах был переезд в Берлин. Получается, что, празднуя ДР, мы заодно прощались с Жекой и со своими четырьмя годами вместе с ним в Мюнхене. Сил об этом думать не было никаких, поэтому нужно было чем-то себя занять, дабы и перед праздником не грустить, и во время праздника не печалиться. Нужно было что-то грандиозное.

Помимо этого, нужно было чем-то кормить допаминовый раш от двигания и закрывания карточек в Trello. В какой-то момент Гауз справедливо заметил, что вся эта движуха каждый год похожа на хакатон: у тебя каникулы, а значит, больше свободного времени, в которое ты после работы собираешься с друзьями, открываешь ноутбук, открываешь пиво, и начинаешь делать каждую вторую идею, которая придёт вам в голову. Гауз любит кодить, я — писать тексты, мы оба любим придумывать праздники. Нужна была очередная возможность расчехлить таск-трекер, напридумывать себе тасков, а потом ночами их хакатонить. Don’t tell me it’s not fun. Как бы я иначе посреди дня радовался купленной письке?

В конце августа мы с Гаузом говорили, что нам нельзя снова делать всё за пять дней как в прошлом году: это слишком стрессово, это слишком тяжело, слишком о многом нужно в этом году думать, чтобы всё получилось. Поэтому мы заранее обзвонили друзей, собрали бюджет для подарков, придумали подарки и несколько раз сказали друг другу: “Нельзя снова делать всё за пять дней. У нас слишком много работы.”

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

How it started
How it started

🎁 Подарки

Ей-боже самая простая часть всего праздника.

Незадолго до Дня рождения мы сидели на балконе с нашим товарищем, который коллекционирует айподы, и шутили, как прикольно было бы превратить айпод в своеобразный аналог Awesome Mix из “Стражей Галактики”: такой себе doomsday music device, для которого нужно будет отобрать сколько-то гигабайт любимой музыки, закинуть её на айпод и забыть о нём на 10 лет. У тебя в любом случае будет праздник, который всегда с собой. Внезапно, Жека заактивничал: “А я тут вот таких пацанов видел, которые с айподами такое делают!”; “А у них вот можно было бы его цветным сделать!”; “А прикиньте я ж в Берлин переезжаю, ваще буду там сразу местным в наушниках бегать белых проводных с айподом и бананкой через плечо ахахах.”

Ахахах. Хахах. Хах. Мы с Гаузом переглянулись и поняли, что нам нужен айпод. На максимум гигабайт, который мы сможем себе позволить. Обязательно Classic, дабы внутри по диску игла бегала, и потом через те же 10 лет вообще неизвестно было, откуда замену брать. Накачаем туда Жене музыки, соберём голосовухи от друзей, сделаем из них аудиопередачу “Юбиляра с юбилеем”, которую закинем в раздел “Подкасты”, и пусть летит себе в свою Барселону слушать местных, поющих на чужом языке.

Мы открыли наш местный Авито/OLX/Wallapop и нашли iPod Classic 7 на 160 ГБ в чудесном матовом сером цвете с чёрным колёсиком за 95 евро. Посмотрели на айпод, посмотрели на свой бюджет и поняли, что можем позволить себе найти хорошие наушники в придачу — у Жеки как раз помирали его древние over-ears.

Выбрав и заказав наушники, мы ещё раз сверились с бюджетом и удивились пуще прежнего: у нас всё ещё остались деньги! Целых 60 евро! Не веря своим глазам, мы подумали, что оставим их для украшений, винишка и еды на стол, дабы не транжирить собранные деньги.

Потом Гауз подумал ещё раз и заказал ему бананку, ведь Жеке предстоял переезд в Берлин, откуда без бананки и депортировать могут. Теперь ему будет, где носить свой айпод и бананы всё остальное, что люди обычно носят в бананках. В конце концов, что это за проект, в котором на всё с первого раза хватило денег?

🗺 Маршрут

Разобравшись с простым, мы приступили к самому сложному. Женя — персонаж игры. Персонажу нужно проделать некоторый путь, по ходу которого нужно выполнить некоторое количество заданий, дабы “заслужить” свой подарок. Так как в этом году игровым миром нашего персонажа были не Альпы и Доломиты, а скучный Мюнхен, для веселья игрока нам нужна была нескучная карта, наполненная квестами и другими персонажами, с которыми можно было взаимодействовать. Таков был изначальный план, вокруг которого всё и строилось. Мы ещё понятия не имели, чем мы будем развлекать Жеку, но мы точно знали, что развлечения будут происходить в дороге. Тем более, раз Жека покидает деревню, нужно дать ему возможность с ней попрощаться. Тем более, что перед отъездом у Жеки был примерно миллион дел, о которых нужно было позаботиться, поэтому сам он вряд ли выкроил бы время для прощальной прогулки.

Сложностей с построением маршрута было несколько. Во-первых, это единственная константа во всей шалости, потому что вокруг прогулки по маршруту придумывались задания, выставлялись персонажи и считалось время. Во-вторых, прогулка не должна была занять всё время мира: [снова] насиловать Женю ранним подъёмом не хотелось, поздно возвращаться ему было нельзя, ибо вечером ему ещё подарки дарить, да и вообще 12-е число выпадало на воскресенье — на следующий день всем было чем заняться. Во-третьих, мы даже приблизительно не могли представить себе сколько времени у Жени займёт выполнение грядущих квестов (как минимум потому что они ещё не были придуманы, да). Из-за этого, мы не понимали, сколько времени закладывать чисто на передвижения по городу. Следовательно, мы не могли умножить это время на два, чтобы понять, сколько шалость действительно будет длится.

Получалось, нам нужно было быстро придумать, утвердить и больше не трогать маршрут, вокруг которого выстраивалась бы вся остальная игра. Маршрут необходим живописный и максимально персонализированный; он должен быть какой-то продолжительности, дабы по пути было увлекательно, но не утомительно, не слишком длинно, но и не вокруг дома обойти, и чтобы по пути успевали выполняться квесты, которых ещё не было, и чтобы по ходу ещё можно было отдохнуть, но не сильно долго, потому что время поджимает.

С другой стороны, у нас были некоторые референсы. Мы точно знали начало и конец приключения: так или иначе это будет дом. Жене стопроцентно нужно было попрощаться с общагой, она рядом с Олимпийским парком: значит, и туда ему обязательно нужно было зайти. Ещё где-то нужно было отдохнуть и попить пивка, потому что тёплый сентябрьский День рождения без пивка — это вообще несерьёзно и нам было всё равно, какого мнения по этому поводу был Жека.

Обязательно нужно было к набережке; в идеале хотелось к Пинакотеке модерна: вокруг неё красиво, а внутри висит парочка любимых Жекой картин, в числе которых полотно Карла Теодора Протцена, с которым у них созвучные фамилии.

Ах да, ещё всеми силами нужно было избегать мюнхенского центрального вокзала. Каждый, кто там был, меня поймёт: оказавшись там, человек чувствует себя чуточку более несчастным даже если только что под экстази трахался адским безудержным сексом с кем-то, за кем ухаживал последние 5 лет. Мы Жеку любим, ему туда не нужно.

С этим уже можно было как-то работать. Мы с Гаузом по отдельности нарисовали свои маршруты; чистое время прохождения маршрута не должно было занять больше четырёх часов. Потом мы их сравнили, нашли точки пересечения, попробовали другие виды транспорта, попробовали те же точки, только в другом порядке, попробовали другие точки, попробовали забить на это всё болт и просто подарить Жене наушники, и в итоге получили рабочий вариант.

🎁💰👾 Квесты

Хорошо, мир создан. Теперь нужно заставить человека по нему передвигаться.

С нашей стороны всё было так, как это зачастую бывает в креативных проектах — адски тяжело от отсутствия внятных идей. Идей было много, но все они были какие-то meh: слишком скучно, слишком пресно, слишком непонятно зачем.

— А что если запретить Жеке тратить деньги?
— Можно. А зачем?
— ¯_(ツ)
— А что если заставить его заплатить за ужин?
— Так у него ж денег не будет.
— А если будет?
— А зачем платить за ужин?
— ¯\
(ツ)_/¯

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

Родилась идея мешочка с мелочью мемшочка с мемлочью: 20€, разменянные монетками по 1€ и положенные в шёлковый мешок.

Взяли фиолетовый
Взяли фиолетовый

— Погоди, но если мы запакуем ему деньги, почему бы нам не запаковать ему и всё остальное?
— И то верно. Что это за игра, в которой персонаж сам решает, какое оборудование у него в рюкзаке?
— А список того, что нужно собрать с собой, ему огласит бот.

Мы бы сделали ему в дорогу еды, собрали бы рюкзак и указали бы от имени бота, что именно ему нужно взять с собой и где это всё найти перед тем, как отправиться в дорогу. Так у всей идеи появилась структура. Задания поделились на три типа:

  • 🎁 Основный квест: задания, которые необходимо пройти, чтобы забрать главный приз. Отказ от их прохождения расценивался бы как поступок, не достойный даже чая и наказывался бы запретом срать.
  • 💰Сайд-квесты: задания, которые проходить необязательно. Их можно пройти, дабы пополнить игровую казну. Эти квесты целиком и полностью проходят в пределах физического мира: нам об их прогрессе в них знать ничего не надо. Если захочет — пусть делает; не захочет — пусть делает, что хочет. Но лучше пусть проходит. Чтобы начать сайд-квест, нужно было взаимодействовать с известными Жеке персонажами открытого мира. (Об этом в разделе 🦄 Магия)
  • 👾 Сайд сайд-квесты: задания, которые проходить ну прям совсем необязательно. За успешное выполнение всех сайд-сайд квестов можно заработать сайд-сайд приз-приз-приз (Бананку. Её он бы получил так или иначе, но приятно было бы вернуться домой не с пустыми руками.)

Чтобы сэкономить самим себе дорогое время и не придумывать сложных заданий, которые Жека в пути мог бы решать часами, основные квесты мы поделили ещё на два типа:

  • Нужно что-то сделать, чтобы получить нужную точку на карте. Например:

    • 🎁 Среди персонажей книги Алана Милна о семи плюшевых зверях есть персонаж-сладкоежка. В каком дереве он жил?
    • 🎁 Выпей в баре. Для успешного завершения задания, пришли мне две фотографии: полного стакана, и пустого.
    • К приказу выпить пива прилагалась картинка
      К приказу выпить пива прилагалась картинка
  • Добраться до нужной точки на карте. Например:

    • 🎁 Садись на 27 трамвай и отправляйся к станции Pinakotheken. Пришли мне свою геолокацию, когда доедешь до станции.
    • 🎁 Отправляйся пешком к ангелу мира.

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

Также нужны были музыкальные задания, раз уж основными подарками у нас были айпод и наушники. Музыкальные квизы мы оставили на те моменты путешествия, где у Жеки было бы время почиллить, и разбили их на три части. Там ему нужно было угадывать разницу между Are You Gonna Be My Girl vs. Lust For Life, угадывать, является ли строчка “Весь мир бардак, все бабы боялись, а солнце ёбаный фонарь” названием песни “самой адекватной группы Украины” и угадывать бас-партии британских пост-панковых песен за 10 секунд.

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

Помимо этого, раз уж Жека улетал в Испанию, нам показалось правильным дать ему способ выучить парочку очень важных фраз на испанском. Благо, у меня был сосед-мадридец:

Но нашему воспалённому воображению и этого показалось мало. Я не буду рассказывать предисторию того, как мы к этому пришли, но мы резко осознали, что нам необходимо заставить Жеку продать за настоящие деньги незнакомцу фотографию своих же ног. Делать фотку ног заранее казалось нам совершенно неправильным; значит, Жеке нужно было ещё и сделать фотку ног. Так родились два наших любимых сайд-квеста.

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

Спойлер: в дороге он её не получил. Но это, как обычно, было только к лучшему.

🍽 Меню

И то верно. С меню разобрались.

🦄 Магия

Дурное дело — нехитрое: придумав маршрут и задания по ходу маршрута мы понимали, что Жека пройдёт его чисто из интереса. Нужно было приправить все эти телодвижения разными приятностями и классностями.

Начали мы с персонажей. Если у нас ещё хватало процентов Джарвиса, чтобы всю нашу ебанистику придумывать, то реализовывать её у нас рук не хватало, да и быть в трёх разных местах мы не могли. Нашему игровому миру нужны были персонажи, которые смогли бы забрать у нас немного работы, а заодно быть Жениными проводниками в мир ебанистики в День Х.

Писал это в 2020 году, напишу и сейчас: к счастью, нам с Гаузом повезло крутиться среди людей, которым не занимать ни слабоумия, ни отваги. Очень приятно работать с людьми, с которыми диалоги проходят примерно следующим образом:

— Когда Жека к тебе подойдёт, тебе нужно с максимально каменным лицом сказать: “Сайд-квест такой-то открыт. Желаешь принять участие? Учти, согласие обязывает к выполнению квеста.”
— А если он скажет нет?
— Развернись и уйди, как персонаж в игре. Двигайся максимально одинаково, как будто у тебя движения прописаны.
— А если скажет да?
— Проведи квест с максимально каменным лицом, вручи денег, попрощайся, развернись и уйди, как персонаж в игре.

Отдельных респектов в этом году заслуживает наш товарищ Родион. Он помогал придумывать вопросы, фотошопил штуки и вечно сорил идеями. Он даже спросил меня, МОЖНО ЛИ ему придумывать своим персонажам костюмы. Персонажам, потому что он был и одним из первых, и последним персонажем в игре. Сначала он должен был исполнить роль валета, который встретит Жеку с кофе, заберёт у него ключи от велосипеда и выдаст ему билетик за парковку (который Жека, конечно же, должен будет оплатить; не бесплатно же в центре Мюнхена парковаться, пф). Потом же человек-видеокарта Родион должен был играть роль гопника, который отберёт у Жени все заработанные деньги.

Зацените блондина. Прикол в том, что с утра он блондином не был! Родион подстроил запланированную покраску волос так, чтобы сделать её ровно в день рождения. Понимаете уровень погружения? ОН ПЕРЕКРАСИЛСЯ В 4 ЧАСА МЕЖДУ ВСТРЕЧАМИ С ЖЕНЕЙ. Глупо говорить, что без него это всё получилось бы намного хуже.

Так как дарили мы айпод и наушники, всё наше представление сопровождалось музыкой в частности и аудио в целом. За полгода до Жениного ДР я сделал для соседа “подкаст” в качестве подарка на День рождения: я собрал голосовые сообщения от друзей, записал подводок, накидал сверху музыки и закинул это себе на сервер вместе с XML’кой так, чтобы этот glorified аудиофайл можно было воспроизвести в подкаст-плеере. Для Жеки такое решение было бы оверкилом, но опыт и эмоция от подарка остались.

Изначальный список вещей бот оглашал Жене под Sunday Morning группы Velvet Underground. Разговаривал бот кожаноублюдочным голосом Бота Алёши. Передвигаясь между точками, Жека то и дело получал от бота голосовухи с музыкой и/или голосовыми поздравлениями от друзей. От родителей, конечно, тоже было сообщение: Женин батя остался в таком восторге от идеи, что заговорил со мной в чате на английском. Любые чувственные моменты мы всегда разбавляли всратым украинским великолепием и всё получалось очень даже празднично.

За выработку остаточных случайных эндорфинов отвечали, конечно же, картинки и мемасы. С самого утра, перед тем, как Женя приехал на дуб, я сходил и повесил на него постер MOST WANTED, который за день до этого на коленке сделал Родион.

Фотографию ног, которую Жека сделал с утра, ему вручил в конверте работник бара, который сидел при входе и проверял QR коды вакцинации. А в бананке Женя обнаружил маленькую ламинированную грамоту, которая, по задумке, должна была бы помещаться в слот для карточек в кошельке. Чтобы всегда иметь с собой подтверждение того, что Женя — молодец.

В общем, приятных мелочей, милостей и приятностей по пути хватало. Естественно, для всего этого цирка бесконечно нужно было что-то печатать, рисовать, править, звонить, просить, перепечатывать, перезванивать и гуглить, но благо у нас были люди, готовые помочь, редбуллы, и Trello-борд, в который записывалось абсолютно всё. Я по ходу этого Дня рождения окончательно разуверился в возможности реализовать хоть один проект без того, чтобы бесконечно записывать всё, что происходило, происходит и будет происходить, но об этом не сейчас. Главное, что за день до Дня рождения, борд выглядел вот так:

Мелкой работы всё ещё хватало, и мы всё ещё не знали, как будем встречать Женю, когда он закончит квест, но в общем и целом сроки не горели. Как обычно в последний день ничего не успевалось, но всё бы успелось.

Пишу это сейчас и думаю, что наивнее нас во всём Мюнхене не было никого. Естественно, ничегошеньки никуда не успелось. Угадайте, из-за чего мы в итоге практически не спали в последнюю ночь?

🤖 Бот

Правильно, из-за киберпанка.

Репозиторий с кодом бота можно найти вот тут.

Убедительная просьба ко всем погромистам, девопсам, тестерам, продакт-, проджект- и пет-проджект менеджерам: мы с радостью примем замечания и советы, но all in all берегите свои фейспалмы, если они у вас будут. Мы понимаем, что строить всю админку на if’ах явно не лучшая идея, но дедлайн был близок. Код наверняка не высшего качества, но он работал, он сработал и задачу свою выполнил с лихвой. Спасибо.

Ещё от бота, сделанного в 2020 году, мы поняли, что у нас есть весьма рабочая схема по автоматизации киберразвлечения Жени: Вопрос → Время на подумать → Ответ → Искромётное сообщение от бота с указаниями к действию → Следующий вопрос → Repeat.

Однако, как уровень вопросов с прошлого года, так и уровень погружения персонажа в игровой мир нас совершенно не устраивали. Тем более, у нас была и амбиция, и возможность сделать лучше, чем в прошлом году, ведь старый бот был совершенно отвратительным. От его имени нельзя было отправлять сообщения; бот не умел принимать в качестве инпута что-то, кроме текста; у нас не было никакой возможности вмешаться в ход событий, если когда что-то пойдёт не так. А что-то явно пошло бы не так, потому что все сообщения были hard-coded! Они триггерились лишь матчингом текста, состоявшего иногда из 6 слов с запятыми и точками.

По факту, у нас была своя кастомная шайтан-машина, чтобы наводить шороху от имени киберпанка, но у неё не было задней, второй и четвертой передачи. Фич было мало недостаточно, а те, которые имелись, были реализованы НЕКОНВЕНЦИОНАЛЬНО. Мы как будто проходили практику у дизайнеров интерьера Renault, когда те думали, где разместить кнопки управления круиз-контролем. Функциональность вроде есть, но кнопки включения круиза почему-то слева от рычага КПП.

По факту, старый бот умел присылать одни сообщения на правильный ответ Жени и другие на неправильный. Всё. В этом же году, весь Женин ДР был завязан на боте, который должен был развлекать, информировать, направлять, корректировать, хвалить и наказывать.

По факту, нам нужен был новый бот.

Что у нас было vs. Что мы хотели бы иметь
Что у нас было vs. Что мы хотели бы иметь

Новый бот™ кишел функциональностью и был круче любого сына любой маминой подруги. Во-первых, в качестве типов отправляемых и принимаемых сообщений он теперь поддерживал всё, что Telegram даёт поддерживать: видео, голосовуха, геолокация — хоть дикпиком в бота брось, он всё переварит и выплюнет. Ground-breaking feature that will enhance the user experience like no other, базарю I’m telling you.

Во-вторых, сообщения больше не были вписаны в исполняемый код. Вместо этого мы использовали сына джаваскрипта: каждое сообщение было JSON-объектом со своим ID, текстом и триггером, который мог это сообщение вызвать. Сечёте, да? Теперь сообщения могли automagically отправляться после правильных ответов, или после картинки, или после отправки [заранее прописанной] геопозиции с нужной там точки. Сообщения также могли триггерить другие сообщения, поэтому мы могли заспамить Женю длинными текстами, но отправлять их поочерёдно и временным интервалом после предыдущего, чтобы дать Жеке возможность спокойно со всем ознакомиться.

[
    {
        "name": "new_message_template",
        "sendAt": {
            "hours": 0,
            "minutes": 0
        },
        "sendAtLocation": {
            "latitude": 0.0,
            "longitude": 0.0
        },
        "sendOnText": "",
        "nextAfter": 0,
        "nextName": "",
        "text": "",
        "image": "",
        "sticker": "",
        "voice": "",
        "keyboard": [
            "",
            ""
        ],
    }
]

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

🎁 Статистика прохождения основного квеста:

  89% ■■■■■■■■■■■■■■■■■■■■■■□□□

👾 Статистика прохождения сайд-сайд квестов:

 • Митець: ✖️
 • [не Мини] Купер: ⭐️
 • Щегол: ⭐️⭐️
 • Шутник: ⭐️⭐️⭐️✖️✖️
 • Хрустики: ⭐️⭐️⭐️⭐️⭐️⭐️✖️
 • Молодец: ⭐️

Однако лучшим улучшайзингом для пользователя в этом году безальтернативно стала 🌈 а д м и н к а 🌈. Если раньше в отдельный админ-чат просто пересылалась переписка Жени с ботом, то теперь из этого же чата в неё можно было вмешиваться. С её помощью можно было делать такие охуевшие вещи как:

  • следить за перепиской Жени и бота;
  • через команду /progress xx обновлять процент прохождения основного квеста;
  • через кнопочки обновлять статус прохождения сайд-сайд квестов;
  • через /send message_name_as_in_json отправлять Жене заранее написанные сообщения;
  • через /forward text отправлять Жене любые другие сообщения от имени бота.

За день до “запуска” мы потестили сообщения. Мы попытались учесть эдж-кейсы. Мы потестили админку и всё, что она умеет. Всё работало, всё было по кайфу. Была лишь одна беда. Наш восхитительный, удобнейший, великолепнейший и умнейший JSON-файл нужно было наполнить JSON-объектами, чтобы боту было, что отправлять.

Сообщений в общей сложности набралось свыше ста штук. Коллаборативного бесплатного онлайн JSON-редактора хипстеры ещё не изобрели, поэтому мы сидели друг рядом с другом и, проговаривая вслух какое сообщение прописываем сейчас, заполняли файл. Получался очень big tehc.

И каждое. Сука. Сообщение. Нужно. Было. Добавить. В. Файл. Прописав айди. Тип сообщения. Пути к файлам, если такие были. Проставить долготу и широту для геопозиций. Не перепутать номера айдишек сообщений. Используя юникод вместо простых советских эмодзи, которые использовались где ни попадя. Ночью. Ааааа.

В общем, помните фотку в начале поста с первого вечера, когда как мы оба сели за работу? В половину третьего ночи дня Х весь этот праздник жизни выглядел вот так:

How it's going
How it's going

Кожаные ублюдки снова сидели и правили жисоны, оставив себе на сон чуть больше пяти часов. Oh what a wonder. Так или иначе, мы закупили продукты, выдали всем монетки и указания, собрали рюкзак Жене в дорогу, заполнили файл и, преисполненные уверенности в себе и всём начинании, пошли спать. Через буквально 6 часов Жека бы отправлялся в путь.

🏃🏻 Погнали

На 12 сентября план был весьма простой. Я просыпаюсь, прихожу в себя, еду вешать на дуб картинку и жду, пока Женя не покинет дом. Гауз следит за ботом и Жениной геолокацией, пока я не приеду. Потом в душ и приходить в себя идёт Гауз; на мне висит mission control. Один из нас едет отдать конверт с фотографией ног бармену в баре, на обратном пути покупает сладость к столу; другой покамест начинает готовить бульон на борщ. Всё это время мы одним глазом мониторим через админку взаимодействия Жени с ботом, но не сильно, потому что там всё автоматизировано и работает само по себе. Потом мы украшаем квартиру и крышу, встречаем гостей и, после того, как Жене пришло бы последнее сообщение от бота, имеем 40 минут до встречи. Мы с Гаузом берём с собой наушники, чай, сладость, стол (да) и устраиваем на троих чаепитие в близлежащем парке, где проводим немножко времени втроём, пока не начнётся вечеринка. Потом мы приходим домой, едим еду, находим предлог чтобы вывести Женю на крышу, вручаем ему айпод, откуда через его новые наушники играет Happy Birthday на испанском, кричим, радуемся, орём и празднуем.

Собственно, мы и поехали. Я к дубу и Гаузу, Женя — навстречу приключениям. Бот запустился и делал ровно то, что должен был; Женя без проблем собрался в дорогу и доехал к месту первого обязательного квеста — BMW Welt. Жене нужно было зайти внутрь, посмотреть на Бэхи и скинуть боту фотографию одного стоящего там мотоцикла. Всё шло хорошо, я отправил Гауза в душ и уселся за пульт управления полётом. Вдруг меня одолело навязчивое чувство тревоги: Женя как-то слишком долго не слал фотографию мотоцикла. Без стука я врываюсь в ванную комнату:

— Гауз, скажи мне, пожалуйста, бот ведь умеет принимать от Жени не только текст?
— Конечно, мы ж это тестили, чо ты паришься.
— А бот умеет пересылать в админ-чат что-то кроме текста?
— 🙂
— 😕
— БЛЯДЬ.

Душ оказался много холоднее, чем Гауз ожидал. Не прошло даже часа после начала приключения, а Гаузу уже пришлось дописывать код в проде и перезапускать бота посреди выполнения первого обязательного квеста. Кла-се-ка. Мы удалили первые сообщения, перезапустили программу иииииииииииии… Всё вроде заработало. Осталось только как-то ненавязчиво попросить Жеку прислать фотку мотоцикла ещё раз, если он её уже сделал.

Crisis averted. Помимо этого же о самом приключении и рассказывать нечего: всё действительно прошло гладко, а по ходу дела всем было ебейше весело. По-настоящему тёплых летних дней в году оставалось не так много, поэтому всем было по кайфу бегать по городу и делать штук. Мы тешились с Жениных ответов и смеялись с его голосовых на испанском; мы топили за него в состязании с гопниками и орали на него в монитор, когда он тупил. Параллельно мы отвечали на звонки всех персонажей сайд-квестов и слушали, как они, смеясь и хохоча, рассказывали нам о реакции Жени.

Один раз, правда, я был очень близок к провалу: я приехал к бару примерно в одно время с Женей, от чего секретность всей шалости была прям на тоненького.

Ещё у Гауза на телефоне пропали кнопки в админке, поэтому все апдейты по сайд-сайд квестам были на мне, но и бог с ним, в следующий раз это пофиксим. Да, нам пришлось понервничать один раз, но всё остальное время мы делали, что должны и получалось, что должно.

Спустя восемь с половиной часов Женя наконец сел на трамвай до парка и получил свою финальную голосовуху с соплями от меня и Гауза о том, как мы его любим, и как нам будет грустно, когда он уедет из Мюнхена. Пока Женя добирался до места встречи, мы, наконец-то выдохнув, попивали под деревом чаёк и объясняли местным баварским женщинам “Nein, es ist doch keine örtliche Gayversammlung, wir gratulieren einfach unseren besten Freund zum Geburtstag. Schönen Abend Ihnen.

После того, как мы подарили наушники, Женя естественно, думал, что на этом с подарками покончено. Но у нас-то ещё оставалась бананка и айпод)))) Хорошо хоть Жеке не нужно было выполнять никаких квестов.

Видимо, правда, то же самое подумал он, поэтому он решил устроить квест нам. Казалось бы, что сложного: положить в бананку iPod → взять с собой наушники → втыкнуть наушники в iPod → вывести Жеку на крышу → ждать его там с тортом и свечками → попросить его закрыть глаза → накинуть ему на шею бананку → накинуть ему на уши наушники → включить ему Happy Birthday на испанском → 🎉🎉🎉.

Ну да, ну да. Мы сделали все приготовления, вывели Жеку на крышу, закрыли ему глаза, надели на уши наушники и, раскрыв рты, стояли в ожидании:

— Кеееек, ребята, спасибо вам! Отличная сумка!
— Пожалуйста!
— Давайте торт жрать.
— Женечка, а иЗ чЕгО мУзЫкА иГраЕт??)))0)0)
— Из наушников.
— Таааааак)) А наушники во что воткнуты, Женечка? 🙃🙃🙃
— В сумку.
— ЖЕНЯ, ТВОЮ МАТЬ, ОТКРОЙ СУМКУ, ЗАЕБАЛ.

Лицо Жеки, когда он наконец открыл сумку и увидел все свои подарки, вы видели в самом начале поста. Шалость снова удалась.

🥱 Чему мы научились?

По ощущениям, примерно пяти тысяче разных вещей. Как это всегда и бывает во время хакатона, опыт, полученный во время хакатониванья помогает тебе тогда, когда ты этого даже не ждёшь. За пару недель мы научились лучше делать то, что умеем, и хоть как-то делать то, чего раньше не умели. Гауз вот стал быстрее собирать воедино свой собственный код, раскиданный по куче других ботов, и стал лучше оценивать, сколько времени у него уходит на написание нового. Я стал меньше бояться неизвестного и понял, что можно начинать что-то делать даже если не знать, как оно будет выглядеть в конце. Можно не ступориться, если не знать каждого шага пути.

Научились работать с бюджетом. Ну как, научились. Скорее, прочувствовали на своей шкуре, что сколько бы денег не было — всё равно не хватит. Поэтому нужно оставить больше, чем кажется нужным, чтобы потом в панике нужно было искать меньшую сумму.

А ещё мы научились готовить борщ. Реально, после какого хакатона ты выходишь со словами "Я научился готовить борщ?" В этом абзаце не будет ни кулстори, ни плот-твистов. Этим абзацом я хочу сказать спасибо пацанам и пацанессам из Вастрик.Кухни за то, что вы есть. Я не состою в вашем чате, но Гауз бесконечно тащит от вас в дом рецепты и лайфхаки, от которых и я стаю умнее и проворнее на кухне, и дома вечно появляется вкусная еда. Если бы Гауз не подпитывался вашим мастерством, у нас вряд ли бы хватило духу на то, чтобы в День рождения приготовить блюдо, которое до этого мы ни разу не делали. Не просто блюдо — борщ. По рецепту мамы Жеки. Получилась страшная пушка. Спасибо вам.

Естественно, мы ещё и сделали об этом выпуск подкаста. Как иначе-то в 2021.

Естественно, теперь нам кажется, что сделать круче и интереснее у нас не получится, но это, естественно, чушь. Всё получится, до 12 сентября ещё есть время.

В связи с этим, дорогой Клуб, у меня есть просьба. Даже две. Во-первых, если у кого-то есть возможность подкинуть нам премиум-аккаунт на Trello – подкиньте, пожалуйста, по-братски? Очень хочется location-based уведомления, очень хочется добавлять ответственных к подзадачам.

Во-вторых, если кто-то вдруг знает, где и как в Берлине можно заполучить в пользование самосвал на день — поделитесь инфой, пожалуйста. У нас есть парочка идей.

Связанные посты
30 комментариев 👇
Гауз , Программист 22 января в 13:17

  Развернуть 1 комментарий

Твоя аватарка сразу вызывает в мозгу эту картинку)

Отлично ваще! Люто завидую вашему другу :)

  Развернуть 1 комментарий

@TiraelSedai, хехе да, спасибо)

  Развернуть 1 комментарий

Ебать вы молодцы

  Развернуть 1 комментарий
Михаил Бубнов , Project manager Команда Клуба 22 января в 11:02

Ребята, вы прекрасные!
Пожалуйста, пишите еще!

  Развернуть 1 комментарий

@m1ke_92, как только будет о чём, так сразу🙃
спасибо)

  Развернуть 1 комментарий

@dani, мне еще твой стиль изложения очень понравился!

  Развернуть 1 комментарий
Oskar Sharipov , дерусь на джсонах 22 января в 13:11

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

  Развернуть 1 комментарий

Гайз, это невероятно крутой опыт! Спасибо что поделились! Текст написан шикарно!

  Развернуть 1 комментарий

Очень круто! Я вспотел, пока читал.

  Развернуть 1 комментарий
Lev Bazarnov , Перекатываюсь в разработку 22 января в 21:33

Абсолютно великие.

  Развернуть 1 комментарий

Завидую другу :)

  Развернуть 1 комментарий

я просто поставлю плюс, потому что у меня радостное ощущение, будто одновременно меня так поздравляли и я это все готовил

  Развернуть 1 комментарий

Пацаны, это бомба, вы такие крутые, супер!!!!

  Развернуть 1 комментарий

Мне нужен сервис для подобных праздников =)

  Развернуть 1 комментарий

@i209, гляди, в комментах есть @gamedozor, возможно он сможет тебе помочь, когда будет нужда 😄

а вообще да, я заметил на это спрос. даже вот за пару дней до того, как я опубликовал пост, @Sciannadev запилила свою 💡 Идею.

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

  Развернуть 1 комментарий

@dani, спасибо) Идею видел, да, но тут что-то большее и масштабнее)

  Развернуть 1 комментарий

@i209, можем помочь. У нас целая система для проведения. Напиши в лс

  Развернуть 1 комментарий

@gamedozor, круто!) Залез уже на сайт, отпишусь)

  Развернуть 1 комментарий

@gamedozor, Так, а лсздесь что?

  Развернуть 1 комментарий

@i209, в телеграм @gamedozor

  Развернуть 1 комментарий
Andrey Frolov , Разработчик Ruby / Rails 25 января в 12:13

Зе грейтест! вандефул солюшн квест архитект!

  Развернуть 1 комментарий
Алесь Жук , Организация квестов, тимбилдингов и интеллектуальных игр 28 января в 07:30

Прикольно. До этого опыта создании квестов не было?
Есть предложение, напишу в лс.

  Развернуть 1 комментарий
Valery , Фронтовик-джаваскриптизёр 28 января в 08:55

  Развернуть 1 комментарий

Блин, оч долго пытался понять что со мной не так после прочтения лонгрида, но где вторая кастрюля борща? Оо

  Развернуть 1 комментарий

@Rustho, так вот же она, на плите :)

  Развернуть 1 комментарий

@dani, господи… тогда зачем? (:

  Развернуть 1 комментарий

@Rustho, зачем что?)

  Развернуть 1 комментарий

@dani, Ну зачем 2 кастрюли? Почему не 1! (Вообще спасибо, спас меня от поиска второй кастрюли по всему лонгриду)

  Развернуть 1 комментарий

@Rustho, мы применили бабулеву логику и вывели прямую зависимость количества кайфов от количества кастрюль борщей. увеличение количества кастрюль в n раз увеличивает кайфы от вечера в те же n раз.

а если не молоть ересь, то потому что нас 8 человек было и их кормить нужно было, а мы больше ничего не готовили, поэтому we went all in on борщ, только и всего)

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб