Pull to refresh

Шлюз между IRC и Google Hangouts

Reading time 4 min
Views 7.5K
Преамбула

Так уж получилось, что «по долгу службы» мне каждый день нужен IRC. Используемый клиент — irssi в tmux'е на Debian'овском сервере. В 99% случаев я подключаюсь по ssh (putty) к серверу, там перехожу в окно irssi и читаю/пишу в нужные мне каналы. Оставшийся 1% — это подключение к проксируемым каналам irssi с помощью Mirand'ы.

Для отдельных каналов у меня настроена отправка по электронной почте сообщений, удовлетворяющих определённым критериям. Эта штука продолжает работать и сейчас.

Но не так давно, в связи с некоторым изменением образа жизни, мирандой я перестал пользоваться, и возникла необходимость чтения/записи в один канал со смартфона.

Смартфон у меня на Android, поэтому логично, что я сначала попытался найти родное приложение, которое бы позволило работать с проксёй irssi. Не нашёл. Если забыть про проксю, то родные IRC-клиенты таки есть, но это «не то пальто». Так для того, чтобы не пропустить нужное сообщение, нужно постоянно быть в онлайне. Да и новый аккаунт нужен, а это не всегда возможно. В общем с таким подходом тогда уж проще подключиться к серверу через ssh и работать с irssi там. Собственно, я иногда так и поступал, когда уж очень надо было. Но ssh-клиенты для Android оставляют желать лучшего — в принципе реально, но совсем неудобно (особенно на 4-дюймовом экране моего старенького Samsung Galaxy S).

С другой стороны я очень привык к Google Hangouts. Можете плеваться, кидать в меня камнями, вспоминать WhatsApp и другие IM-клиенты, но меня уже сложно переубедить. Hangouts действительно удобная вещь. Поэтому меня не переставала бередить мысль о шлюзе между IRC и Google Hangouts. Гугление давало ноль информации. Разве что пару раз я натыкался на связку слов irssi+bitlbee. Я уже слышал о bitlbee раньше, но не хотелось поднимать на сервере ещё одну службу.

Я уже согласился просто отправлять содержимое сообщений на свой аккаунт Hangouts (по аналогии с почтовыми уведомлениями). Почти получилось (через sendxmpp). Сообщения вроде как доходили, но появлялись они только в стороннем клиенте (Miranda), но не в родном Hangouts. Причём отправка удавалась только с негуглового jabber-аккаунта (jabber.org, jabber.kiev.ua). Для гуглового аккаунта sendxmpp упорно выдавал ошибку, как бы я не бился с параметрами. А переписывать эту софтинку мне совсем не хотелось.

В итоге я решил попробовать связку irssi+bitlbee. Чего уж там? Если не заработает, всегда смогу снести это дело.

И вы знаете, получилось!

Собственно, решение

Для удобства заводим новый гугловый аккаунт, который будет выполнять роль бота. Весь обмен сообщениями с IRC будет вестись через этот аккаунт. Можно, конечно, попробовать использовать в качестве отправителя аккаунт-получатель, т.е. писать самому себе, но я решил не извращаться. Просто добавил новый аккаунт в Google Apps своего домена. Можно также добавить alias вместо полноценной учётной записи, но я решил, что так будет безопаснее.

Добавляем аккаунт бота в bitlbee:
acc add jabber БОТ@ДОМЕН ПАРОЛЬ
set 0 set server talk.google.com
acc 0 on

Теперь важный момент. Нужно авторизовать между собой аккаунт бота и личный аккаунт. Средствами Hangouts мне это не удалось сделать. Обмен сообщениями в родном клиенте шёл, но по факту это были учётные записи типа <набор_символов>@public.talk.google.com.

Итого я нашёл ничего лучше, как добавить оба аккаунта в миранду и авторизовать их там между собой. После этого мой личный аккаунт в списке контактов бота (blist all) в bitlbee стал отображаться со статусом Online.

Теперь достаём «швейцарский нож» irssi — trigger.pl. Чтобы описать достоинства этого богатого по возможностям плагина, потребуется отдельная статья. Здесь я ограничусь сугубо своей задачей.

Общая логика работы следующая:
  • все сообщения, публикуемые в канале X, пересылаем от имени бота на личный аккаунт;
  • все сообщения, полученные ботом с личного аккаунта, публикуем в канале X.

В файле ~/.irssi/triggers это описывается двумя триггерами:
  • -publics -channels '#chanX' -command 'msg -localhost -nick ЛИЧНЫЙ_АКК $N: $M'
  • -privmsgs -masks ЛИЧНЫЙ_АКК -command 'msg -СЕРВЕР -channel #chanX $M'

Для опытных пользователей irssi и trigger.pl всё должно быть понятно. Для новичков опишу подробнее:
  • для всего, что публикуется в публичном (-publics) канале (-channels) с названием #chanX, выполнить команду (-command): отправить сообщение (msg) пользователю (-nick) с именем ЛИЧНЫЙ_АКК на сервере localhost, где сообщение состоит из имени отправителя ($N) на канале и текста сообщения ($M);
  • для всех личных сообщений (-privmsgs), полученных от пользователя (-masks) с именем ЛИЧНЫЙ_АКК, выполнить команду (-command): отправить сообщение (msg) в канал (-channel) с названием #chanX на сервере СЕРВЕР с текстом сообщения $M.

Здесь используются следующие допущения:
  • в irssi установлены подключения к нескольким серверам;
  • подключение к bitlbee установлено как к серверу localhost (bitlbee запущен на 127.0.0.1, так как я не хочу выставлять в мир порт 6667);
  • имя пользователя на канале #chanX совпадает с именем пользователя на канале &bitlbee;
  • ЛИЧНЫЙ_АКК — это имя пользователя в списке контактов бота в bitlbee, которое можно изменить (help rename);
  • СЕРВЕР — это название сервера, в канал которого нужно публиковать сообщения.

Результат

После получения первого сообщения (неважно от кого — от бота или с личного аккаунта) в irssi откроется новое окно с личной перепиской этих двух аккаунтов. Ну и, соответственно, в Google Hangouts будут приходить сообщения с канала, и можно будет отправлять сообщения в канал.

Также я отказался от прокси на irssi (за ненадобностью).

Эпилог

Возможности trigger.pl очень широкие. Здесь вскользь рассмотрено, наверное, менее 10% возможностей. Триггеры можно настроить более гибко, а с помощью регулярных выражений можно «изрисовать вообще всё» ©

Так, помимо переменных $N и $M доступно ещё много других переменных. Можно пересылать сообщения из нескольких каналов, только от определённых пользователей или содержащие определённые ключевые слова, в зависимости от ключевого слова публиковать сообщение в тот или иной канал, транслировать всю личную переписку и др. Подробности см. в справке /trigger help.
Tags:
Hubs:
+24
Comments 13
Comments Comments 13

Articles