Пошаговое руководство по созданию команд Twitch

ПРИМЕЧАНИЕ. Эта статья по-прежнему отлично справляется с задачей, но есть серия более компактных размеров, которую вы можете найти здесь, где большая часть ненужного текста была удалена, а статьи более сфокусированы на тема.

Вы, наверное, пришли сюда, потому что хотите сделать команду Twitch. Крутая небольшая функция, которая оживляет ваш видеочат или, в моем случае, чей-то еще.

Люди, которые наткнулись на это, думают: «Подождите, что? Команды Twitch? » - Команда Twitch - это триггер, установленный в чате зрителя, который при вызове обычно возвращает автоматическое сообщение.

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

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

Время предыстории!

За пару месяцев я подружился с очень крутым стримером на Twitch: theSlychemist.

Увидев время и усилия, которые этот парень вкладывает в свою работу, и общее доброе поведение, я решил сделать своей личной целью помочь ему расширить свой канал.

Как .NET-разработчик по профессии, я предложил свои услуги, и он спросил меня, смогу ли я создать для него команду. Я подумал, что это не может быть так сложно, просто немного поиграть в Google и программировать на Python, ничего страшного. Итак, я сказал: «Конечно!»

Надеюсь, вы прочитали это с голосом за кадром Моргана Фримена в своей голове.

Я был наполовину прав (или наполовину неправ?), Потому что есть некоторая документация, но ее недостаточно, чтобы заставить вас взяться за дело.

Не бойся! Этот пост - моя попытка помочь вам в этом, поэтому вам не придется испытывать то, через что я прошел, когда запускал и запускал свою самую первую команду Twitch.

Сообщение может показаться большим, но примерно половина его является дополнительным бонусным материалом, размещенным в Приложении A и B.

Необходимости

Чтобы продолжить, вам понадобится следующее:

  • Учетная запись Twitch - для тестирования ваших команд перед выпуском. Вероятно, он у вас уже есть, иначе зачем вам быть здесь?
  • Streamlabs Chatbot - он будет обрабатывать и запускать ваши команды, а также обеспечивать ведение журнала для отладки, которая вам наверняка понадобится. Войдите в свою учетную запись Twitch как для бота, так и для стримера.
  • IDE, которая может компилировать Python. Я использую Jetbrains PyCharm Community Edition, потому что он бесплатный и очень хороший. Он имеет встроенный IntelliSense, он знает правила стилей PEP 8, которые помогают поддерживать ваш код в чистоте, и вы можете легко протестировать свои методы, если вам нужно. Не стесняйтесь использовать любой редактор кода, если он может компилировать Python. Это избавит вас от множества глупых ошибок по сравнению с кодированием в Блокноте.
  • Python 2.7.13. Да, Python находится на версии 3.7.4 на момент написания, но чат-бот Streamlabs работает с компилятором, который работает с 2.7.13. Не стреляйте в посланника. После этого откройте чат-бот Streamlabs и перейдите в раздел Скрипты. Щелкните значок настроек в правом верхнем углу и добавьте путь к папке Python27\Lib (не Libs). Если вы позволите Python установить себя с настройками по умолчанию, он должен быть в C:\Python27\Lib:

  • По крайней мере, в этом посте предполагается наличие некоторых базовых навыков программирования. Это сообщение о создании команд Twitch, поэтому я не буду углубляться в переменные, вызовы методов / функций и то, как они работают. Прежде чем продолжить, вам должно быть комфортно с этими условиями.

Что мы строим?

Так что да, очевидно, мы собираемся написать код, но что мы на самом деле создаем?

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

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

Базовая настройка

У всех команд Streamlabs Chatbot (SC) есть некоторые основы, которые вам необходимо правильно реализовать, чтобы они даже отображались как запускаемый скрипт в их пользовательском интерфейсе, не говоря уже о его запуске.

Эти:

Именование файлов

Чтобы сценарий Python можно было подобрать как сценарий для SC, формат должен быть command_StreamlabsSystem.py.

Итак, давайте начнем с создания каталога mulder, а внутри этого каталога создадим mulder_StreamlabsSystem.py.

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

Совет от профессионалов: если вы создадите его во внутреннем каталоге сценариев SC на своем компьютере, он сэкономит много работы, импортируя и обновляя, когда мы дойдем до этапа тестирования / выпуска.

В Windows его можно найти по адресу:

C:\Users\USERNAME\AppData\Roaming\Streamlabs\Streamlabs Chatbot\Services\Scripts.

Базовая структура

SC не будет отображать ваш скрипт в разделе скриптов, если он не содержит хотя бы следующего:

  • Информация о скрипте - это набор глобальных переменных, которые SC использует для заполнения некоторых полей в разделе Scripts. Давайте добавим это в наш пустой скрипт:

  • Инициализатор скрипта - метод Init() запускается SC каждый раз, когда скрипт (повторно) загружается в раздел Scripts. Добавьте следующее под Script Information (сначала добавьте новую строку для чистоты):

  • Выполнение скрипта: метод Execute(data) запускается SC каждый раз, когда вводится какая-либо команда в видеочате Twitch. Мы немного поговорим о том, как отфильтровать только команду mulder. Параметр data передается SC автоматически и содержит информацию об отправителе и сообщении. Давайте добавим это в наш скрипт:

  • Логика итерации скрипта: метод Tick() запускается каждый раз, когда скрипт выполняется, то есть каждый тик, как следует из названия. Это логика, которая работает, даже если в чате нет входящих данных или чего-либо еще. Он просто работает непрерывно. Добавим в наш скрипт:

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

Если ваш файл выглядит иначе, обязательно внесите необходимые изменения.

Загрузка скрипта

Если вы воспользовались советом профессионала ранее, это будет совсем несложно. Просто откройте SC, перейдите в раздел Scripts и он там уже должен быть:

Вы можете увидеть команду Mulder и некоторые другие мои команды (чтобы увидеть их вживую, зарегистрируйтесь в потоке theSlychemist).

Все они находятся в одной SC Scripts папке, поэтому они появлялись автоматически, когда я их создавал.

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

Если вы не последовали совету профессионала, вам придется пройти долгий путь:

  • Используйте предпочитаемый вами инструмент, чтобы заархивировать каталог mulder.
  • Перейдите в раздел Scripts в SC и нажмите кнопку импорт в правом верхнем углу (вторая кнопка слева).
  • Перейдите туда, где был сохранен .zip файл, и выберите его для импорта.
  • Теперь он должен появиться в списке.

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

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

Реализация логики

Теперь, когда у нас есть фундамент, пришло время добавить в наш сценарий некоторые функции или логику.

Наша командная логика заключается в методе Execute(data), который вызывается SC, когда сообщение публикуется в чате.

Есть кое-что, о чем стоит подумать, но я расскажу вам, как это сделать, так что давайте перейдем к делу!

Помните, как я сказал, что любая команда (или сообщение, если на то пошло) в чате вызовет наш Execute(data) метод?

Поскольку мы хотим ответить только на команду “!mulder”, мы должны убедиться, что это действительно сказано в первой части сообщения. Мы используем переданный для этого параметр data, поскольку он содержит некоторые свойства и методы, которые мы можем использовать.

Одним из таких методов является data.GetParam(int id). Мы будем использовать его, чтобы получить первую информацию в сообщении и проверить, равно ли оно “!mulder”. Если нет, мы ничего не делаем. Но хватит разговоров, давайте реализуем это:

Наше командование должно утверждать, является ли кто-то инопланетянином или нет, основываясь на вероятности.

Давайте представим эту вероятность и дадим ей значение около 10%, так что каждый из десяти человек на самом деле инопланетянин. Ну блин.

Кроме того, принятие решения о том, является ли кто-то инопланетянином, - это отдельная микро-ответственность, которую мы можем делегировать вспомогательному методу is_alien().

Давайте добавим этот метод к методу Tick() и добавим к нему вероятность:

Теперь нам нужно усилить это и вернуть 28_, если кто-то пришелец, и False, если нет.

В Python есть собственные методы случайного выбора, но они, похоже, плохо работают с SC. Мы собираемся использовать случайную функциональность, предоставляемую SC, а именно Parent.GetRandom(int min, int max ), чтобы вернуть значение от 0 до 100.

Если мы получаем значение ниже или равное нашей вероятности, мы возвращаем True, в противном случае мы возвращаем False (вы можете игнорировать ошибку Parent):

В зависимости от результата мы отправим в чат одно из двух сообщений.

Чтобы упростить чтение, давайте представим еще один служебный метод, который будет обрабатывать отправку сообщений за нас: send_message(message). Вы можете добавить в метод is_alien() следующее:

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

Поскольку нам нужно получить это из параметра data и мы не хотим нарушать принцип DRY (не повторяйтесь), давайте введем переменную, которая будет содержать это имя пользователя для нас:

Теперь нам нужно отправить сообщения на основе ответа is_alien(). Добавление этой логики завершает нашу командную логику:

Пробовать это

Во-первых, перейдите в раздел Scripts SC, перезагрузите скрипты, как раньше, и убедитесь, что вы включили команду Mulder, установив флажок справа.

Когда вы закончите, это должно выглядеть так:

Теперь перейдите в раздел Консоль SC (вверху слева), введите !mulder в чате и нажмите Enter.

Наступает магия! Малдер судит о твоей природе. Потребовалось несколько попыток, но ему наконец удалось выяснить, что я не с этой планеты:

Могу я поздравить вас с написанием вашего первого командного скрипта Twitch? Это моя основная процедура создания команд для Слихимика. Вы можете остановиться здесь, сбежать и создать набор команд, и вы можете это сделать.

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

Приложение A: Отладка

Знаю, знаю, не самая сексуальная тема, о которой можно говорить.

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

Даже в приведенном выше примере проекта мне потребовалось несколько доработок, потому что случаются глупые ошибки (не волнуйтесь, сценарий работает, как показано, мне просто нужно было сначала исправить мой). Итак, давайте погрузимся в отладку с помощью SC.

логирование

Это практически все, что мне нужно вам показать. Регистрация того, что и когда делает ваш скрипт, - это самый быстрый способ узнать, где может скрываться ошибка (приготовьте эти мухобойки).

К счастью, у SC есть собственный метод журнала: Parent.Log(string command, string message), и мы собираемся его использовать.

Давай перейдем к делу.

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

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

Я заметил, что мы используем буквальное имя команды в двух разных местах, и это нарушает принцип DRY, так что давайте это исправим.

Добавьте глобальную переменную к уже имеющимся и замените все экземпляры “!mulder” этой переменной:

Теперь давайте добавим несколько операторов журнала к используемым нами методам:

Здесь происходят хорошие вещи. Перезагрузите скрипт в SC, а затем перейдите в окно журнала, щелкнув средний значок в правом верхнем углу:

Очистите окно с символом перезагрузки в правом верхнем углу и перейдите в раздел Консоль SC. Введите !mulder еще раз и вернитесь в окно журнала.

Он должен показать вам журналы, как они проходят через различные методы:

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

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

С журналами можно многое сделать.

Приложение Б. Приятно иметь

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

Добавление периода восстановления

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

Вот тут и пригодятся кулдауны. У SC есть несколько ручек, которые можно добавить и проверить на кулдауны для пользователя или команды. Я собираюсь показать здесь время восстановления, зависящее от пользователя.

Он предполагает два небольших дополнения:

Добавьте время восстановления пользователя в конце метода Execute(data), используя data.User, чтобы получить идентификатор пользователя средства просмотра, и укажите 30 секунд в качестве времени восстановления:

Теперь в начале метода Execute(data) в проверке команды включите дополнительную проверку на время восстановления пользователя.

Если пользователь вызовет эту команду еще раз во время восстановления, мы не захотим выполнять нашу логику. Добавим немного логики:

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

Теперь вы знаете, как добавить время восстановления для пользователя.

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

Добавление пользовательского интерфейса

Возможно, вы видели или не видели интерфейс в SC для некоторых команд, где контроллер может изменять значения, используемые в сценарии. Выглядит это примерно так:

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

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

Я хочу это для нашего сценария, так что давайте погрузимся в него:

Прежде всего, давайте создадим файл UI_Config.json в той же папке, что и наш файл Python. Получите правильное именование, создайте его и откройте в своей среде IDE:

SC имеет формат и параметры файла, задокументированные на их странице GitHub Wiki. Во-первых, мы должны выбрать имя и тип файла, в который будут сохраняться наши значения для использования в нашем скрипте.

Добавьте в файл следующее:

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

Давайте добавим их и заполним поля:

Сохраните файл, вернитесь в раздел Скрипты в SC и перезагрузите скрипты.

Когда вы теперь нажмете на команду Mulder, отобразится наш новый интерфейс:

Мы еще не там, друг. Помните выходной файл, который мы определили? Нажмите Сохранить настройки в пользовательском интерфейсе и вернитесь в свою среду IDE.

Вы должны увидеть два новых файла:

Нас интересует settings.json файл, который мы определили. Если вы откроете его, вы увидите наши определенные значения и их данные:

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

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

Прежде чем загружать файл, нам нужно что-то для хранения этих переменных. Давайте создадим для этого объект глобальных настроек:

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

Какой метод запускается только один раз при (повторной) загрузке? Ты запомнил! Это метод Init(). Давайте начнем постепенно добавлять к нему логику.

Во-первых, нам нужно сообщить Python, что мы собираемся изменить наш объект глобальных настроек:

Нам понадобится доступ к файлу settings.json.

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

Ладно! Теперь перейдем к самому интересному: чтение файла и сохранение его содержимого в нашем объекте настроек.

Мы собираемся построить полный путь к файлу с рабочим каталогом, который мы определили ранее, и соединить его с фактическим именем файла. Убедитесь, что имя файла точно такое же, как имя файла, определенное в UI_Config.json:

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

Давайте заменим жестко запрограммированные значения динамической ссылкой на их аналог (убедитесь, что написание совпадает с написанием в файле UI_Config.json):

Время теста! Направляйтесь к SC, перейдите в раздел Scripts и перезагрузите скрипты.

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

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

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

Вот как вы включаете пользовательский интерфейс!

Конец

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

Это был «основной» шаг за шагом для создания командного сценария Twitch.

Это все, что нужно сделать? Да и нет. Да, это то, как вы настраиваете командный сценарий, и нет, вы можете сделать гораздо больше в Python.

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

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

Спасибо за чтение и помните: правда где-то рядом ...