TweetCraft – Twitter-клиент, встроенный в World of Warcraft
Опубликовано 2 июля 2009 в 01:18:00 | Coding4Fun
TweetCraft (EN) — это расширение для игры World of Warcraft, позволяющее отправлять и получать сообщения Twitter не выходя из игры, автоматически выгружать и публиковать снимки экрана с помощью TwitPic (EN), а также автоматически создавать твиты о событиях, происходящих в игре, например о своих успехах и перемещениях в мире Azeroth. TweetCraft предоставляет собственный пользовательский интерфейс World of Warcraft, добавляя свой фрейм, напоминающий стандартные (такие как Quest Log). Вы можете переключиться на него посредством кнопки, расположенной рядом с мини-картой, с помощью слеш-команд или своего любимого средства запуска (например, ChocolateBar).
Готовая программа:Загрузить
Исходный текст: Загрузить
Сложность: средняя
Необходимое время: 3-5 часов
Цена: $19.99 за World of Warcraft; $14.99 ежемесячная плата
Необходимое ПО: AddOn Studio for World of Warcraft (EN), Visual Studio Standard (или более развитая версия), однако можно использовать и Visual C# Express.
Оборудование: нет.
Как работает TweetCraft
Давайте бегло ознакомимся с TweetCraft по части интеграции Twitter и World of Warcraft.
Обзор
Благодаря расширениям (add-on) разработчики могут придавать пользовательскому интерфейсу World of Warcraft такой вид, на который у них только хватает фантазии. Расширения могут взаимодействовать с игрой, отслеживать происходящие там события, изменять стандартный интерфейс пользователя или добавлять совершенно новые, но при этом их возможности весьма ограничены в отношении взаимодействия World of Warcraft с внешним миром. Они не могут читать или записывать файлы, обращаться к веб-службам или выполнять другие потенциально опасные операции. Поэтому TweetCraft работает совместно с Windows-приложением, доступным в области уведомлений, которое выполняет все основные функции и передает расширению TweetCraft лишь данные для отображения, такие как тексты твитов, ответы и картинки пользователей. Обращение же к веб-службе Twitter, выгрузку снимков экранов и защиту выполняет упомянутое приложение. Давайте посмотрим как.
Резидентное приложение TweetCraft
Резидентная программа TweetCraft, доступная через панель задач, – это WPF-приложение, которое периодически проверяет поступление новых твитов, загружает и преобразует картинки пользователей авторов твитов и записывает их в файл, который может использоваться расширением World of Warcraft. Оно также собирает все дожидающиеся в очереди исходящие твиты и по одному отправляет их с помощью службы Twitter. Программа следит за появлением снимков экрана World of Warcraft и сразу же передает их с помощью TwitPic.
Чтобы все это работало, надо настроить несколько параметров. Для новичков замечу: надо, чтобы ваши параметры в Twitter допускали отправку твитов и публикацию картинок от вашего имени. Также необходимо знать реквизиты учетной записи World of Warcraft, которую вы собираетесь использовать для игры совместно с обменом твитами. И наконец, вы можете отказаться от автоматической передачи снимков экрана, получаемых в процессе игры. На рис. 1 показано окно настройки параметров TweetCraft, отображаемое при первом запуске программы после ее установки или при щелчке правой кнопкой значка программы в области уведомлений (рис. 2).
Рис. 1. Окно настройки параметров TweetCraft
Рис. 2. Значок TweetCraft в области уведомлений
Получение данных от Twitter
Для отправки и получения твитов с помощью API Twitter в TweetCraft используется библиотека с открытым исходным текстом TwitterLib. TwitterLib — это часть WittyTwitter (EN), Twitter-клиента для WPF с открытым исходным текстом, которая предоставляет удобную оболочку в виде библиотеки классов .NET для веб-служб Twitter. В TweetCraft в качестве оболочки для этой библиотеки используется простой класс TwitterClient, на котором базируются все службы. Одна из таких служб, TwitterBackgroundService, периодически опрашивает Twitter на предмет поступления новых твитов. По умолчанию это делается раз в пять минут. При наличии новых твитов или ответов генерируется событие, которое могут обслуживать другие компоненты TweetCraft, обрабатывая твиты, загружая картинки пользователей и т. д. На рис. 3 показаны три класса, реализующие загрузку поступивших твитов и ответов, а также уведомляющие другие классы об этих событиях.
Рис . 3. TwitterBackgroundService, TwitterClient и TwitterNet (TwitterLib)
Динамическое создание изображений формата TGA
В World of Warcraft достаточно ограничений, относящихся к визуализации изображений (или на жаргоне WoW — текстур). Они касаются типов файлов и их местоположения. Во-первых, World of Warcraft поддерживает лишь форматы файлов TGA и BLP. TGA — это формат Truevision Targa, а BLP — собственный формат изображений Blizzard. Кроме того, изображения должны быть квадратными (32×32, 64×64 пикселов и т. д.), иначе они не будут отображаться. В свою очередь картинки пользователей Twitter могут иметь размер 48×48 или 75×75 и представляются в различных популярных форматах, включая JPG, PNG и даже GIF. TweetCraft должен преобразовать эти картинки в файлы TGA размером 64×64для нормальной работы с ними в World of Warcraft. Это делается со всеми картинками пользователей твитов, которые показываются в World of Warcraft. Преобразованные картинки необходимо поместить в папку Interface игры World of Warcraft, где хранятся и ее расширения. TwitterUserPictureService получает картинку пользователя и преобразует ее TGA-файл размером 64×64, содержащий картинку пользователя 48×48 в середине, и помещает этот файл в ту же папку, где установлено расширение TweetCraft. Файлы именуются в соответствии с именем пользователей, и если TwitterUserPictureService обнаруживает, что файл с таким именем уже существует, он не конвертирует картинку заново, экономя немного времени и ресурсов.
TwitterUserPictureService и два вспомогательных класса, осуществляющих собственно загрузку и преобразование, показаны на рис. 4. Метод GetUserPicturePath возвращает путь получившегося TGA-файла, совместимого с World of Warcraft для одного пользователя.
Рис. 4. TwitterUserPictureService и вспомогательные классы
Сериализация твитов в Lua
Мы еще не коснулись вопроса о том, как обойти ограничения World of Warcraft и позволить TweetCraft читать и выводить данные. Мы уже говорили, что расширения не могут читать и записывать файлы, но у них должен быть способ сохранения своих параметров и других данных при выходе пользователя из игры и повторном входе в нее. Хотя расширения и не могут выполнять запись и чтение файлов, они могут просить World of Warcraft сохранить и загрузить некоторые свои глобальные переменные при перезагрузке игроком интерфейса пользователя, входе и выходе из игры. Для этого применяются файлы SavedVariables. После того как TweetCraft загрузил твиты, преобразовал картинки пользователей и пр., он сохраняет их с использованием точно того формата и именно в том файле, который World of Warcraft использует для работы с расширением TweetCraft. Элегантно, не правда ли? То ли еще будет… :)
Для сохранения переменных по запросу нашего расширения используется тот самый файл Lua, который разработчики используют для своих расширений. По сути, World of Warcraft создает файл, содержащий операторы присваивания (типа a = 5), которые выполняются каждый раз, когда требуются значения соответствующих переменных. Более сложные структуры данных также можно описать подобным способом с помощью таблиц Lua, которые являются универсальным вспомогательным средством.
Кажется привлекательной идея собрать все данные, которые мы хотим использовать для TweetCraft, но все, что у нас есть, это объекты, массивы и словари .NET. К счастью, все эти структуры данных могут быть представлены простыми типами и таблицами Lua. В TweetCraft есть класс LuaSerializer , генерирующий Lua-код для любых .NET-объектов (с некоторыми ограничениями, разумеется), подобно тому, как это делает XmlSerializer.
Для еще большей простоты, в TweetCraft реализована концепция канала переменных SavedVariablesChannel, на вход которого вы помещаете объекты, а на выходе извлекаете их в нужном виде, в нашем случае в виде переменных Lua. Что особенно интересно, это работает в обоих направлениях. Расширение TweetCraft сохраняет все готовые к передаче твиты в некоторой переменой и выдает World of Warcraft запрос на ее сохранение в файле SavedVariables. SavedVariablesChannel обнаруживает это, поскольку отслеживает изменения в SavedVariables с помощью FileSystemWatcher. Он уведомляет другие компоненты приложения TweetCraft, которые могут извлечь нужные данные из файла и отправить твиты.
SavedVariablesChannel и его базовый класс ValueChannelBase, отслеживающий все поступающие объекты, показаны на рис. 5.
Рис . 5. SavedVariablesChannel и ValueChannelBase
Обновление данных в World of Warcraft
Осталась последняя проблема в реализации двунаправленного взаимодействия между расширением TweetCraft и резидентным приложением. Если модифицировать файл SavedVariables во время работы World of Warcraft, последний не заметит сделанных изменений. Если же изменить файл, а затем выйти из игры, World of Warcraft поменяет данные. Придется сделать такой фокус: расширение TweetCraft может инициировать перезагрузку интерфейса пользователя, в результате чего все расширения будут выгружены, их переменные сохранены, а затем загружены вновь. В промежутке между очередным сохранением и загрузкой файла SavedVariables у TweetCraft есть время для чтения файла с очередью твитов и перезаписи его новыми данными. Это делается при щелчке кнопки Refresh в фрейме TweetCraft.
Передача твитов и снимков экрана
Твиты, подготовленные пользователем, не отправляются сразу, а помещаются в структуру данных, которая записывается в файл SavedVariables. Мы обнаруживаем их, когда пользователь или выходит из игры или щелкает кнопку Refresh. Обновления в файле SavedVariables обнаруживаются SavedVariablesChannel и генерируется событие ChannelUpdated. Когда резидентное приложение TweetCraft обрабатывает это событие, оно не может сразу приступить к отправке обнаруженных твитов, поскольку на это требуется несколько секунд, а выше мы говорили о том, что у нас совсем немного времени на обработку всех данных. Поэтому обнаруженные с помощью SavedVariablesChannel в SavedVariables твиты быстро передаются службе TwitterDispatcherService, которая затем пересылает их по очереди в фоновом режиме. Чтобы гарантировать обработку всех подготовленных к сохранению в файле твитов, в SavedVariablesChannel используется свойство AutoFlush , которое по умолчанию включено.
Мы не обсудили одну вещь: TwitterDispatcherService может также передавать и публиковать изображения с помощью TwitPic. Программа просматривает папку Screenshots в каталоге World of Warcraft на наличие новых файлов, и если AutoTweeting для снимков экрана включено, немедленно ставит изображение в очередь на отправку и публикацию. Таким образом вам не надо ждать выхода пользователя или щелчка им кнопки Refresh для публикации снимков. Они немедленно будут появляться в фиде Twitter.
TwitterDispatcherService использует TwitterClient (и TwitterLib) для отправки твитов, но это не связано с быстрым чтением и записью файла SavedVariables, о которых мы говорили ранее. Он также использует TwitPicClient для передачи и публикации изображений. TwitterDispatcherService, TwitterClient и TwitPicClient показаны на рис. 6.
Рис . 6. TwitterDispatcherService, TwitterClient и TwitPicClient
Цельная картина
Мы рассмотрели компоненты TweetCraft, в которых реализованы определенные части нашего приложения: извлечение и отправка твитов, преобразование картинок пользователей и предоставление всех этих данных расширению TweetCraft. Между тем есть важный класс, объединяющий все это и содержащий логику взаимодействия компонентов между собой. Нам также нужно иметь возможность определять установки World of Warcraft, выяснять доступные учетные записи и местоположение файлов SavedVariables и преобразованных картинок пользователей. Необходимая для этого логика реализована в классе TweetCraft, а в классе WorldOfWarcraft — все, что связано с World of Warcraft.
На рис. 7 классы TweetCraft и WorldOfWarcraft показаны рядом один с другим.
Рис. 7. TweetCraft и WorldOfWarcraft
Заключение
Хотя это лишь общий обзор TweetCraft, он дает представление о возможностях применения игроками World of Warcraft технологий Twitter для отправки и приема сообщений, передачи снимков экрана и представления своих достижений непосредственно в игре. Если у вас установлен World of Warcraft, попробуйте поработать с TweetCraft, а если вам интересно, загрузите исходный код (EN) этой программы.
Габор Ратки (Gabor Ratky, блог (EN), Twitter (EN)) — ведущий разработчик ПО и Coding4Fun-ниндзя из EPAM Systems (EN).
Габор разработал TweetCraft и участвует в проектах Coding4Fun почти два года. Он также руководит разработкой AddOn Studio for World of Warcraft (EN), основанной на Visual Studio интегрированной среды разработки для создания расширений World of Warcraft, и является соавтором посвященной ей главы в книге Coding4Fun (EN). Он VSX Insider и неоднократно выступал на различных мероприятиях, посвященных Visual Studio Extensibility. В свободное от работы над проектами Coding4Fun время Габор участвует в масштабных разработках с применением новейших технологий Microsoft. Он живет в столице Венгрии Будапеште, любит путешествовать, ценит хорошее вино и смотрит Channel9.