Лучше всего то, что это было менее 10 долларов.

У меня есть младший брат. Когда мне было чуть больше 20, у меня было много времени, чтобы усовершенствовать свою игру с домогательствами. Одна из моих любимых игр, в которые я люблю играть со своим братом, - это игра «Сколько времени я могу заставить тебя открыть свои рождественские подарки».

Это веселая игра для всей семьи, кроме моего брата, конечно. Игра проста:

  • Купи для брата кучу подарков.
  • Выясните, в каком порядке они должны открываться.
  • Пометьте каждый подарок чем-нибудь загадочным.
  • Попросите брата определить порядок, основываясь на расплывчатых намеках и неоднозначных образах.

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

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

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

Я решил поднять его на ступеньку выше в этом году.

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

После быстрого мозгового штурма я пришел к плану. Я собирался присвоить каждому подарку номер телефона, и ему нужно было позвонить или написать SMS, чтобы выяснить, пора ли открывать. Подарок отвечал на его звонок / текст и говорил ему «да», «нет» или какую-то ерунду вне контекста. Чтобы подняться на другой уровень, я собирался заставить его по ходу отвечать на мелкие вопросы.

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

Когда начать?

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

Непрерывно было три компонента:

1. Отправка / получение звонков и текстовых сообщений.

2. Конечный автомат

3. Хранение файлов (для некоторых звуковых фрагментов я хотел воспроизвести)

С архитектурной точки зрения это был довольно простой процесс:

1. Входит звонок или текст.

2. Детали звонка / текста направляются в веб-службу, которая управляет состоянием.

3. Служба обрабатывает сообщение в ответ на состояние и возвращает сообщение, звук или флаг для отслеживания, чтобы получить дополнительную информацию.

4. Сообщение или продолжение возвращается пользователю.

Обмен сообщениями

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

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

Я собрал общий поток, который передает тип контакта (звонок или текст), номер телефона и сообщение в API, который я собирался написать. В зависимости от ответа он выполнит одно из трех действий:

1. Произнесите / отправьте текстовое сообщение из ответа API.

2. Включите звук

3. Задайте вопрос и узнайте мнение моего брата.

Вместо того, чтобы вдаваться в подробности рабочего процесса, вот JSON потока из Twilio Studio.

Номера телефонов

Затем мне нужно было получить несколько телефонных номеров. Я пошел в Twilio и купил восемь телефонных номеров, по одному на каждый подарок. С Twilio телефонные номера стоят всего 1 доллар в месяц за номер, поэтому я чувствовал, что меня украли.

После того, как номера были куплены, мне пришлось привязать их к моему Flow. Итак, я подошел к приборной панели для каждого номера телефона, сказал ему использовать мой Рождественский поток, а затем бум. Выполнено.

Интернет-хранилище

Было несколько звуковых фрагментов, которые я хотел воспроизвести, когда звонили по некоторым телефонным номерам. Я решил пойти с AWS и использовать S3 (Simple Storage Service) для размещения файлов. С учетом количества файлов, которые я хотел разместить, это не будет стоить ни копейки.

Я загрузил звуковые файлы в S3, сделал их общедоступными и записал URL-адреса.

Государственный автомат

Это была самая сложная часть проекта. Я хотел что-то элегантное, но как можно меньше. И не поднял шума, когда пошел развертываться.

Войдите в OutSystems.

OutSystems - это компания, ориентированная на разработку без кода и без кода, которая управляет всем за вас. Они избавляют вас от хлопот, связанных с развертыванием, написанием постороннего кода и манипулированием HTML, предоставляя вам богатый опыт через свою сервисную студию и дизайнера. Кроме того, его можно использовать бесплатно, если вы занимаетесь непроизводственной разработкой. Беспроигрышный вариант!

Это определенно то место, где вы можете свернуть с пути, по которому я пошел, и пойти с полным решением AWS. Первоначально я думал об этом, но хотел свести время разработки к минимуму, поэтому вместо этого выбрал OutSystems.

Ниже представлена ​​диаграмма "сущность-связь" для конечного автомата.

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

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

Номер - номер телефона, присвоенный подарку.

ContactType - жестко запрограммированный список, ВЫЗОВ или ТЕКСТ.

Состояние - показывает, на каком подарке был мой брат. В это Рождество ему посчастливилось получить восемь подарков, то есть было восемь штатов.

Прогресс - это синглтон, который представляет текущий прогресс в конечном автомате. Он отвечал за поиск соответствующего NumberState с учетом параметров, переданных в службу.

Логика конечного автомата

Для правильной работы конечного автомата мне нужно было создать две конечные точки: Attempt и FollowUp.

Попытка была основным входом в систему. Вот логический процесс для конечной точки.

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

NumberState затем предоставит информацию вроде: «Ожидаю ли я определенного значения? Какую ценность я ожидаю увидеть? Мне нужно задать дополнительный вопрос? »

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

Вопросы возвращаются в ответе, который мы отправляем в Twilio Flow. Flow знает, как воспроизвести звук, продиктовать сообщение или выполнить ответ.

Говоря о последующих действиях, давайте посмотрим на эту логику.

Как видите, логика очень похожа, за исключением того, что здесь мы можем сделать некоторые предположения. Мы предполагаем, что прогресс уже начался, что означает, что это не самый первый контакт за всю историю, и мы знаем, что больше не будет. Это просто правило, которое я установил для этой игры. Кроме того, LookupMatchingNumberState теперь ищет флаг FollowUp, который должен быть установлен на NumberState. В остальном довольно идентичная логика.

Теперь у нас есть вся логика для лучшего рождественского подарка. Пора собрать NumberStates.

Создание государства, известное как The Grind

Я сделал простую веб-страницу, которая позволила мне быстро и легко добавлять свои состояния.

Этап - Какой подарок сейчас открывает мой брат?

Номер - По какому номеру он звонит?

Тип контакта - это ответ на звонок или текст?

Сообщение - Что будет отвечать номер телефона?

Требуется дополнительная информация - мне нужны дополнительные данные и я звоню в конечную точку отслеживания.

Is Follow-up - означает, что это состояние является ответом на последующие действия?

Соответствующее значение - что должно быть во входящем сообщении (т.е. ответ на мои викторины) :)

Сообщение об отклонении - что телефонный номер отвечает, если входящее сообщение не соответствует значению.

URL-адрес звука - URL-адрес звукового фрагмента для воспроизведения. Если это установлено, оно превосходит все остальное.

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

Мониторинг

У меня есть свои недостатки. Я знаю, что, несмотря на то, как хорошо проходят все мои тестовые прогоны, в рождественское утро будет появляться ошибка. Любой разработчик скажет вам это. Печально известная поговорка «работает на моей машине» кусает нас чаще, чем мы хотели бы признаться.

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

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

Заверните (хе-хе, поняли?)

На момент написания этой статьи Рождества все еще не было, но я собираюсь вернуться и рассказать всем, как все прошло.

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

  • Конечный автомат хоста в OutSystems - БЕСПЛАТНО
  • Размещение звуковых файлов в S3 - БЕСПЛАТНО
  • Все тексты для разработки и устранения неполадок - 0,89 $
  • Все призывы к разработке и устранению неполадок - 0,68 доллара США.
  • Номера телефонов на декабрь - 8 долларов США.

Итого: 9,57 $

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

Счастливого Рождества!

ОБНОВЛЕНИЕ ЗА ЯНВАРЬ

У моего брата было много эмоций в день Рождества. Он варьировался от «ваша система нелепа». Всем удачи! " до того, что в итоге «вам действительно нужно разместить это на Reddit, чтобы люди могли увидеть, как сильно я пострадал».

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

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

В любом случае, ему в целом понравился опыт. Теперь мне просто нужно решить, что делать в следующем году….