Общайтесь по 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 (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;
Вот снимок версии .Net 4;
Также в отдельном решении доступны два примера;
Проекты примеров предназначены для ознакомления с библиотекой IRC.NET и ее API. Содержащийся код иллюстрирует стандартные методы выполнения различных общих задач, с привлечением библиотеки.
Примеры
=======* `MarkovChainTextBox`
Бот IRC, работающий как генератор текстовых цепочек Маркова. Он тренируется на сообщениях, полученных по многим каналам из множества IRC-сетей и генерирует случайные предложения из них.* `TwitterBot`
Бот IRC, который работает как сервис для взаимодействия с Твиттером через веб-API. Он способен публиковать твиты, посланные ему от произвольных пользователей, а также выдавать предупреждения, когда новый твит от следующего пользователя будет виден.
Фрагмент кода из 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);
И включенная диаграмма классов (да, мелочь, но забавно как быстро мелочи приводят к крупным изменениям…)
Короче, если вам интересен протокол IRC и создание серверных или клиентских IRC-приложений на .NET, библиотека IRC.NET – прекрасное место для начала работы.