Главная > Софт, Технический изврат > ircgw – шлюз из Jabber в IRC

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

  1. Пока что нет комментариев.

*