27 июля 2009 г.

Управляем Gajim из командной строки

Gajim — это популярный и активно развивающийся Jabber-клиент, написанный на Python. К слову, он обладает очень неплохой поддержкой всевозможных вкусностей и полезностей Jabber по сравнению со многими другими клиентами. Одной из таких полезностей является возможность управления им из командной строки при помощи D-Bus — системы межпроцессного взаимодействия.

Управление из командной строки не означает, что Gajim имеет консольный интерфейс. Он по-прежнему будет располагаться на рабочем столе в виде окошка. Просто из консоли можно будет отправлять ему какие-либо команды. Собственно, команд поддерживается немного, но для каких-то простейших действий должно хватить.

В состав пакета с Gajim входит консольная утилитка gajim-remote, которая как раз и предназначена для отправки команд основной программе. Если вызвать её без параметров, она покажет список поддерживаемых действий. Вот наиболее интересные:
  • check_gajim_running — проверить, запущен ли Gajim (результат — True или False),
  • list_accounts — список учётных записей,
  • list_contacts [учётные записи] — список контактов в учётных записях,
  • contact_info <jid> — информация о пользователе с указанным JID,
  • account_info <учётная запись> — показать информацию об одной из учётных записей Gajim,
  • add_contact <jid> [учётные записи] — добавить контакт в ростер,
  • remove_contact <jid> [учётные записи] — удалить учётную запись из ростера,
  • change_status <статус> [сообщение] [учётные записи] — изменить статус с возможностью указания сообщения и учётной записи (если не указать — будет изменен статус всех учётных записей),
  • get_status [учётные записи] — получить статус указанных учётных записей,
  • get_status_message [учётные записи] — получить сообщение статуса указанных учётных записей,
  • get_unread_msgs_number — количество непрочитанных сообщений,
  • handle_uri <uri> [учётные записи] — обработать ссылку вида «xmpp://»,
  • join_room <комната> [ник] [пароль:] [учётные записи] — присоединиться к конференции,
  • send_chat_message <jid> <сообщение> [PGP-ключ] [учётные записи] — отправить сообщение в чат,
  • send_file <файл> <jid> [учётные записи] — отправить файл,
  • send_groupchat_message <jid> <сообщение> [учётные записи] — отправить сообщение в конференцию,
  • send_single_message <jid> <тема> <сообщение> [PGP-ключ] [учётные записи] — отправить одиночное сообщение,
  • open_chat <jid> [учётные записи] — открыть чат с указанным контактом,
  • start_chat <учётные записи> — открыть чат для заданной учётной записи (появится окно ввода JID),
  • toggle_roster_appearance — показать/скрыть окошко ростера.
Попробуем теперь применить это на практике. Напишем скрипт, меняющий сообщение статуса на случайную цитату из fortunes. (Для тех, кто ещё не знает, fortunes — это консольная программа, выдающая случайную цитату из довольно объемной базы.)

Для этого в бесконечном цикле будем вызывать gajim-remote, передавая ему при помощи обратных кавычек результат выполнения команды fortunes. Между вызовами поставим паузу 5 минут (5×60=300 с).
while true; do gajim-remote change_status "online" "`fortune`"; sleep 300; done
У этой команды есть небольшой недостаток — нужно всё время держать терминал открытым. Для того, чтобы решить эту проблему, можно просто записать команду в текстовый файл, а потом запустить следующим образом:
bash changestatus.sh &
Амперсанд в конце запустит выполнение скрипта в фоне. Можно также создать правило для cron — тогда вообще не придется что-либо запускать.

Другое возможное применение — отправка кому-то сообщения по расписанию. Например, при помощи такой команды:
echo "gajim-remote send_chat_message user@example.com 'Hello'" | at 10:00
Ровно в 10:00 пользователю будет отправлено сообщение «Hello» (если, конечно, Gajim будет в этот момент запущен).

Итак, даже этот небольшой набор команд в сочетании с инструментами командной строки позволяет сделать что-то полезное.

Если работа gajim-remote покажется слишком медленной, можно воспользоваться, например, командой dbus-send или qdbus для отправки сообщения напрямую через D-Bus.

Список предоставляемых функций можно посмотреть при помощи команды
qdbus org.gajim.dbus /org/gajim/dbus/RemoteObject
Вызвать же функцию можно так:
qdbus org.gajim.dbus /org/gajim/dbus/RemoteObject toggle_roster_appearance
Работает намного быстрее gajim-remote, но приходится явно указывать, кому мы шлём команды.

Комментариев нет:

Отправить комментарий