LINUX.ORG.RU
ФорумTalks

[ХС]Jabber клиент - демон


0

0

вот, что-то захотелось жаббер клиент

а)независимый от иксов

б)к которому можно прилепить любую морду

короче, а-ля mpd, только для жабира

★★★★★

По описанию похоже на сервер Jabberа.

x3al ★★★★★
()
Ответ на: комментарий от Zenom

отдельного демона - да, а вот совместно с мордой - почему бы и нет?

ведь можно, например, при отсоединении морды устанавливать нужный статус (Extended Away, например)

lazyklimm ★★★★★
() автор топика

> вот, что-то захотелось жаббер клиент

> а)независимый от иксов

> б)к которому можно прилепить любую морду

man telepathy

bizanine
()
Ответ на: комментарий от Zenom

>Реализация подобного в виде именно демона лишена смысла.
смотря как реализовывать.
проходила как-то идея сделать 2-х составный jabber-клиент:
демон коннектится к jabber-серверу, ловит входящие мессаги и складывает их в файл;
а отправка собственных мессаг через cli морду к этому демону.
правда, потом я понял что это несколько похоже на обычную почту =]
так что, если скорость общения некритична, то вместо джаббера можно пользоваться почтой, повесив проверку почты в cron с периодичностью, например, раз в минуту =]

saahriktu ★★★★★
()

Годная идея. Я даже как-то хотел реализовать, но стало лень.

anonymous
()
Ответ на: комментарий от Zenom

> Реализация подобного в виде именно демона лишена смысла.

Совсем наоборот. После знакомства с telepathy на современные клиенты смотришь как на defective by design, не имеющие будущего. У каждого свой ростер, чат клиент, muc-клиент, своя поддержка протоколов, своё хранилище логов, своя интеграция с системой, своя обработка xmpp://. Все свое. Это огромное велосипедостроительство. Велосипедостроительный завод!

libpurple решает только маленькую часть проблемы, а telepathy решает всю проблему. Больше не надо мечтать о клиенте, где ростер как у XXX, чат как у YYY, поиск как у ZZZ, а интеграция как у ... кто там остался. С telepathy можно будет подобрать любую часть по вкусу.

Зайдите на http://telepathy.freedesktop.org/wiki/ сейчас и получите скидку 35% (тридцать пять!) на все продукты! Предложение действует только сегодня. Спешите!

bizanine
()

emacs --daemon + jabber.el

anonymous
()
Ответ на: комментарий от anonymous

> Ваш d-bus - говно и я его не использую.

И что же ты используешь?

> ссылки от спонсора http://vitus-wagner.livejournal.com/293683.html http://vitus-wagner.livejournal.com/289017.html

Прочитал. Смысл есть, но отказываться от телепати из-за это я не собираюсь, так как конкурентов на кошерных-по-Вагнеру IPC я не знаю :)

anonymous
()
Ответ на: комментарий от Komintern

>mcabber+screen, чем не демон с cli-интерфейсом :)

это первое что попробовал, не очень удобен, хочется чтобы возможно было прикрутить другую морду, к морде настраиваемый редактор сообщений (для коротких однострочных неактуально, но зачастую приходится писать людям достаточно внушительные, в рамках IM, конечно, талмуды), итп

да, чтобы было с минимум зависимостей.

lazyklimm ★★★★★
() автор топика
Ответ на: комментарий от lazyklimm

Вот тебе патч добавляет три команды /esay /esay_to и /buffer edit.
/esay - аналог /say только для редактирования вызывается внешний редактор прописанный в переменной окружения EDITOR
/esay_to - аналогично /say_to
/buffer edit - весь лог переписки передает внешнему редактору.


diff -Naur mcabber-0.9.9.orig/src/commands.c mcabber-0.9.9/src/commands.c
--- mcabber-0.9.9.orig/src/commands.c	2008-12-31 20:30:41.000000000 +0300
+++ mcabber-0.9.9/src/commands.c	2008-12-31 20:25:59.000000000 +0300
@@ -23,6 +23,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <glib/gstdio.h>
 
 #include "commands.h"
 #include "help.h"
@@ -60,6 +61,8 @@
 static void do_say(char *arg);
 static void do_msay(char *arg);
 static void do_say_to(char *arg);
+static void do_esay(char *arg);
+static void do_esay_to(char *arg);
 static void do_buffer(char *arg);
 static void do_clear(char *arg);
 static void do_info(char *arg);
@@ -156,6 +159,9 @@
   cmd_add("say", "Say something to the selected buddy", 0, 0, &do_say);
   cmd_add("say_to", "Say something to a specific buddy", COMPL_JID, 0,
           &do_say_to);
+  cmd_add("esay", "External editor say something to the selected buddy", 0, 0, &do_esay);
+  cmd_add("esay_to", "External editor say something to a specific buddy", COMPL_JID, 0,
+          &do_esay_to);
   cmd_add("screen_refresh", "Redraw mcabber screen", 0, 0, &do_screen_refresh);
   //cmd_add("search");
   cmd_add("set", "Set/query an option value", 0, 0, &do_set);
@@ -217,6 +223,7 @@
   compl_add_category_word(COMPL_BUFFER, "scroll_toggle");
   compl_add_category_word(COMPL_BUFFER, "list");
   compl_add_category_word(COMPL_BUFFER, "save");
+  compl_add_category_word(COMPL_BUFFER, "edit");
 
   // Group category
   compl_add_category_word(COMPL_GROUP, "fold");
@@ -1239,6 +1246,90 @@
   do_say_internal(arg, 1);
 }
 
+void mcabber_mktemp(gchar *s)
+{
+	sprintf(s, "%s/mcabber-%s-%d-%d", g_get_tmp_dir(), g_get_host_name(), getuid(), getpid());
+	g_unlink(s);
+}
+
+static void do_external_say(char *arg, void (*say)(char *arg))
+{
+	GError *err = NULL;
+	gchar *argv[] = { NULL, NULL };
+
+	argv[0] = (gchar*)g_getenv("EDITOR");
+	if (argv[0] == NULL)
+	{
+		scr_LogPrint(LPRINT_NORMAL, "Environment variable \"EDITOR\" don't setted");
+		return;
+	}
+
+	gchar tmp_file[_POSIX_PATH_MAX];
+	mcabber_mktemp(tmp_file);
+	gint tfile = g_open(tmp_file, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
+	if (tfile == -1)
+	{
+		scr_LogPrint(LPRINT_NORMAL, "Cannot create tmp file \"%s\": %s.", tmp_file, strerror(errno));
+		return;
+	}
+	close(tfile);
+	argv[1] = tmp_file;
+
+	gint exit_status = 0;
+	if (!g_spawn_sync(NULL, argv, NULL, G_SPAWN_CHILD_INHERITS_STDIN, NULL, NULL, NULL, NULL, &exit_status, &err))
+		scr_LogPrint(LPRINT_NORMAL, err->message);
+	else if (WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == EXIT_SUCCESS)
+	{
+		GMappedFile *mfile = g_mapped_file_new(argv[1], FALSE, &err);
+
+		if (mfile == NULL)
+			scr_LogPrint(LPRINT_NORMAL, err->message);
+		else
+		{
+			gint mfile_size = g_mapped_file_get_length(mfile);
+
+			if (mfile_size == 0)
+				scr_LogPrint(LPRINT_NORMAL, "Message is empty and don't sended.");
+			else
+			{
+				gint arg_len = strlen(arg);
+				gint mess_len = arg_len + mfile_size + 2;
+				gchar *mess = g_new0(gchar, mess_len);
+
+				g_memmove(mess, arg, arg_len);
+				mess[arg_len] = ' ';
+				g_memmove(mess+arg_len+1, g_mapped_file_get_contents(mfile), mfile_size);
+				mess[mess_len-1] = '\0';
+
+				if (arg_len == 0)
+					say(mess+1);
+				else
+					say(mess);
+
+				g_free(mess);
+			}
+
+			g_mapped_file_free (mfile);
+		}
+	}
+	else
+		scr_LogPrint(LPRINT_NORMAL, "External editor don't normal exited(%d).", WEXITSTATUS(exit_status));
+
+	g_unlink(argv[1]);
+
+	do_screen_refresh(NULL);
+}
+
+static void do_esay(char *arg)
+{
+	do_external_say(arg, do_say);
+}
+
+static void do_esay_to(char *arg)
+{
+	do_external_say(arg, do_say_to);
+}
+
 static void do_msay(char *arg)
 {
   /* Parameters: begin verbatim abort send send_to */
@@ -1638,6 +1729,32 @@
     buffer_percent(subcmd+1, arg);
   } else if (!strcasecmp(subcmd, "save")) {
     scr_BufferDump(arg);
+  } else if (!strcasecmp(subcmd, "edit")) {
+	GError *err = NULL;
+	gchar *argv[] = { NULL, NULL };
+
+	argv[0] = (gchar*)g_getenv("EDITOR");
+	if (argv[0] == NULL)
+	{
+		scr_LogPrint(LPRINT_NORMAL, "Environment variable \"EDITOR\" don't setted");
+		return;
+	}
+
+	gchar tmp_file[_POSIX_PATH_MAX];
+	mcabber_mktemp(tmp_file);
+	argv[1] = tmp_file;
+
+    scr_BufferDump(argv[1]);
+
+	gint exit_status = 0;
+	if (!g_spawn_sync(NULL, argv, NULL, G_SPAWN_CHILD_INHERITS_STDIN, NULL, NULL, NULL, NULL, &exit_status, &err))
+		scr_LogPrint(LPRINT_NORMAL, err->message);
+	else if (!(WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == EXIT_SUCCESS))
+		scr_LogPrint(LPRINT_NORMAL, "External editor don't normal exited(%d).", WEXITSTATUS(exit_status));
+
+	do_screen_refresh(NULL);
+
+	g_unlink(argv[1]);
   } else if (!strcasecmp(subcmd, "list")) {
     scr_BufferList();
   } else {

Devix
()
Ответ на: комментарий от lazyklimm

> возможно было прикрутить другую морду

emacs --daemon + jabber.el

> настраиваемый редактор сообщений

emacs --daemon + jabber.el

> с минимум зависимостей

emacs --daemon + jabber.el

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.