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