Общайтесь по IRC с помощью IRC.NET

Грэг Дункан

Вы полагаете, что IRC – старая школа, не так ли? Что она относится к 90-ым или 00-ым? Я тоже так считал. Пока немного не осмотрелся кругом. И не обнаружил, что технология IRC и сейчас жива и прекрасно себя чувствует и используется в различных официальных, деловых и любительских целях.

Например, одна из моих любимых сетей, Twit (как и This Week in Tech, Windows Weekly и другие замечательные шоу) используют IRC во время прямых трансляций для взаимодействия с аудиторией в реальном времени. Использование IRC позволяет направить эти шоу в места, где никогда не может пойти «традиционное» шоу. И это лишь один пример того, что IRC по-прежнему важна сегодня.

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

Ответом будет IRC.Net. Есть версия для .NET 4, Silverlight 4 и ветки для WP7 и др…

IRC.NET

IRC.NET – это полная клиентская библиотека IRC (Internet Relay Chat) для .NET Framework 4.0 и Silverlight 4.0. Ее цель – дать полную и эффективную реализацию протокола, описанного в RFCs 1459 и 2812, а также обеспечить современные возможности этого прокола. Версия библиотеки для .NET Framework также предназначена для компиляции и запуска под управлением Mono 2.6 и более поздних версий.

Зеркало GitHub – <https://github.com/alexreg/ircdotnet>.

Пакет NuGet – <https://nuget.org/List/Packages/IrcDotNet>.
Пакет примеров NuGet – <https://nuget.org/List/Packages/IrcDotNet.Sample>.

Для обсуждения использования или развития библиотеки IRC.NET, присоединяйтесь к каналу ##irc.net на FreeNode.

Как можно видеть, библиотека IRC.Net доступна в исходных кодах и, что еще лучше, как пакет NuGet.

Решение для библиотеки IRC.Net включает версии .Net and SL4;

clip_image002

Вот снимок версии .Net 4;

clip_image004

Также в отдельном решении доступны два примера;

Проекты примеров предназначены для ознакомления с библиотекой IRC.NET и ее API. Содержащийся код иллюстрирует стандартные методы выполнения различных общих задач, с привлечением библиотеки.

Примеры
=======

* `MarkovChainTextBox`
Бот IRC, работающий как генератор текстовых цепочек Маркова. Он тренируется на сообщениях, полученных по многим каналам из множества IRC-сетей и генерирует случайные предложения из них.

* `TwitterBot`
Бот IRC, который работает как сервис для взаимодействия с Твиттером через веб-API. Он способен публиковать твиты, посланные ему от произвольных пользователей, а также выдавать предупреждения, когда новый твит от следующего пользователя будет виден.

clip_image006

Фрагмент кода из TwitterBot:

 protected override void InitializeChatCommandProcessors()
 {
     base.InitializeChatCommandProcessors();
     this.ChatCommandProcessors.Add("lusers", ProcessChatCommandListUsers);
     this.ChatCommandProcessors.Add("login", ProcessChatCommandLogIn);
     this.ChatCommandProcessors.Add("logout", ProcessChatCommandLogOut);
     this.ChatCommandProcessors.Add("send", ProcessChatCommandSend);
     this.ChatCommandProcessors.Add("home", ProcessChatCommandHome);
     this.ChatCommandProcessors.Add("mentions", ProcessChatCommandMentions);
 }
 private void ProcessChatCommandListUsers(IrcClient client, IIrcMessageSource source,
 IList<IIrcMessageTarget> targets, string command, IList<string> parameters)
 {
     var sourceUser = (IrcUser)source;
     if (parameters.Count != 0)
         throw new InvalidCommandParametersException(1);
     // List all currently logged-in twitter users.
     var replyTargets = GetDefaultReplyTarget(client, sourceUser, targets);
     client.LocalUser.SendMessage(replyTargets, "Currently logged-in Twitter users ({0}):",
     this.twitterUsers.Count);
     foreach (var tu in this.twitterUsers)
     {
         client.LocalUser.SendMessage(replyTargets, "{0} / {1} ({2} @ {3})",
         tu.TwitterUser.ScreenName, tu.TwitterUser.Name, tu.IrcUser.NickName, tu.IrcUser.Client.ServerName);
     }
 }
 private void ProcessChatCommandMentions(IrcClient client, IIrcMessageSource source,
 IList<IIrcMessageTarget> targets, string command, IList<string> parameters)
 {
     var sourceUser = (IrcUser)source;
     var twitterBotUser = GetTwitterBotUser(sourceUser);
     if (parameters.Count != 0)
         throw new InvalidCommandParametersException(1);
     // List tweets on Home timeline of user.
     var replyTargets = GetDefaultReplyTarget(client, sourceUser, targets);
     client.LocalUser.SendMessage(replyTargets, "Recent tweets mentioning '{0}':",
     twitterBotUser.TwitterUser.ScreenName);
     foreach (var tweet in twitterBotUser.ListTweetsMentioningMe())
     {
         SendTweetInfo(client, replyTargets, tweet);
     }
 }
 private void SendTweetInfo(IrcClient client, IList<IIrcMessageTarget> targets, TwitterStatus tweet)
 {
     client.LocalUser.SendMessage(targets, "@{0}: {1}", tweet.User.ScreenName,
     SanitizeTextForIrc(tweet.Text));
 }
 private void SendGreeting(IrcLocalUser localUser, IIrcMessageTarget target)
 {
     localUser.SendNotice(target, "This is the {0}, welcome.", ProgramInfo.AssemblyTitle);
     localUser.SendNotice(target, "Message me with '.help' for instructions on how to use me.");
     localUser.SendNotice(target, "Remember to log in via a private message and not via the channel.");
 }
 private TwitterBotUser GetTwitterBotUser(IrcUser ircUser)
 {
     var twitterUser = this.twitterUsers.SingleOrDefault(tu => tu.IrcUser == ircUser);
     if (twitterUser == null)
         throw new InvalidOperationException(string.Format(
         "User '{0}' is not logged in to Twitter.", ircUser.NickName));
     return twitterUser;
 }

Есть пара классных штучек, также включенных в проект. Документация, в формате Help Library (т.е. новой справки VS2010);

clip_image008

clip_image010

И включенная диаграмма классов (да, мелочь, но забавно как быстро мелочи приводят к крупным изменениям…)

clip_image012

Короче, если вам интересен протокол IRC и создание серверных или клиентских IRC-приложений на .NET, библиотека IRC.NET – прекрасное место для начала работы.