=== Заметки злого админа » ircgw – шлюз из Jabber в IRC === По просьбам выкладываю старую статью с мертвого сайта pclovers.ru В настоящее время разработка шлюза не ведется, но есть планы полностью переписать его на C++ и выложить код на гитхаб. ---------------------------------------------------------------------- Несколько месяцев назад мы с In_Flight вспомнили старую добрую игру Мафия, в которую когда-то играли через IRC. Оказалось, что эта игра до сих пор существует, но людей там осталось мало. Так и возникла идея сделать вход в эту игру через Jabber. Существующий софт нас не устраивал из-за необходимости регистрироваться на транспорте, а также сложностями в общении с IRC сервисами (NickServ и ChanServ). Так и родилась идея написать собственный сервис  ircgw. Что это вообще за штука Наша разработка предназначена для владельцев небольших IRC сетей, которые хотят предоставить доступ к каналам и приватам через еще один протокол, набирающий популярность. Это не бот и не обычный транспорт, а штука, которая одним концом подключается к Jabber серверу, как внешний компонент (XEP-0114), а другим концом линкуется к IRC сети, как сервер. Реализован межсерверный протокол популярного IRC сервера UnrealIRCd. Для пользователя Jabber сервис ircgw видится, как обычный сервер конференций. Зайдя в конференцию #chan@ircgw.server.org, пользователь попадает в канал #chan прикрепленной IRC сети. Также возможно приватное общение с пользователями и сервисами IRC сети (vasya@ircgw.server.org, ChanServ@ircgw.server.org). Пользователь может находиться в нескольких каналах одновременно. Что реализовано * возможность полноценной линковки к сетям, основанным на сервере UnrealIRCd (не модифицированном) * возможность подключения к XMPP серверу, поддерживающему XEP-0114 (протестировано на ejabberd) * поддержка XEP-0045 (Multi-User Chat) с некоторыми ограничениями, связанными с протоколом IRC. Например, не поддерживается affiliations, вместо этого предлагается использовать IRC сервисы. Также не поддерживается передача вошедшему пользователю истории предыдущей беседы. * просмотр списка каналов при помощи стандартного service discovery * стандартные режимы каналов и пользователей RFC 1459 преобразовываются в соответствующие режимы XEP-0045. Пользователь Jabber, получив режим +o, становится модератором конференции и может выполнять большинство функций оператора канала. Поддерживаются модерируемые, секретные и приватные каналы, баны и исключения, приглашения. * расширенные баны и исключения UnrealIRCd. Их нельзя установить из Jabber клиента, но они обрабатываются при входе пользователя Jabber в канал. * иерархия операторов канала UnrealIRCd (режимы +h, +a, +q). В Jabber клиенте они отображаются, как обычный модератор, но пользователь с более низким статусом не может кикнуть более высокого. * приватное общение с пользователями IRC * работа с сервисами. Если пользователь входит в канал под зарегистрированным ником, ему вываливается приват от NickServ с предложением ввести пароль. * возможность забанить на канале Jabber пользователя по нику, JID или их части. * прозрачная перекодировка сообщений, ников и прочего из UTF-8, принятой в стандартах XMPP, в основную кодировку IRC сети (например, windows-1251). Эта настройка устанавливается администратором и едина для всех пользователей. Что пока не реализовано, но будет * поддержка G:Line (глобальный бан пользователя по JID, домену или их части) * поддержка цветовых кодов mIRC с преобразованием в HTML и обратно. В настоящее время эти коды просто удаляются. Реализована поддержка передачи цветов из IRC в Jabber. Обратная передача весьма затруднительна, потому что каждый клиент делает разметку по-своему. Что под вопросом * антифлуд * скрытие JID пользователя (cloaking). Пользователь с ником Vasya и JID vasiliy@xmpp.org отображается пользователям IRC как Vasya!jabber@vasiliy.xmpp.org Прочие ограничения Когда пользователь входит в первую конференцию транспорта, имитируется его вход в IRC сеть, а когда покидает последнюю конференцию, имитируется выход из IRC. То есть, нельзя общаться в привате, не находясь ни на одном канале. В принципе, эту проблему можно решить путем некого подобия регистрации в транспорте, но это усложнение и отход от сложившихся принципов Jabber конференций. Пользователь с одним JID не может находиться в разных конференциях (каналах) под разными никами, это ограничение IRC. При попытке входа в конференцию с другим ником, вход будет произведен под ником, который был у данного JID в других конференциях. При смене ника в одной конференции он будет изменен во всех. Имя конференции может начинаться только с символа #. Иначе сервис будет пытаться интерпретировать имя, как ник пользователя. IRC notices при передаче в Jabber преобразуются в обычные сообщения. Технические детали Программа написана на PHP без использования сторонних библиотек. Требуется поддержка сокетов и XML parser. По ресурсоемкости скромная, в настоящее время крутится вместе с IRC сервером и сервисами на виртуалке под FreeBSD с 256 Мб памяти, процессор почти не потребляет. Должна без проблем работать под Linux, а может быть и под Windows. Где все это можно пощупать IRC сервер irc.pclovers.ru связан с Jabber сервисом ircgw.pclovers.ru. То есть, при входе в конференцию #chat@ircgw.pclovers.ru производится вход в канал #chat. А при написании сообщения на JID Peace_Death@ircgw.pclovers.ru оно будет доставлено в приват соответствующему пользователю IRC. Приветствуется всяческое издевательство над сервером, потому что я уверен, что что-то где-то упустил, и косяки неизбежны. Самые вопиющие глюки возможны при работе с клиентом QIP, потому что он как-то неадекватно реагирует на 100% соответствующие стандартам XML пакеты. В любом случае будем пытаться как-то это обойти. Исходники этого изделия будут выложены после предварительного тестирования и после того, как я их немного причешу, уберу нецензурные комментарии и тому подобное. Баг-репорты и прочие комментарии можно скидывать в комменты. Конференция: chat@conference.pclovers.ru .