]> git.cworth.org Git - loudgame/blobdiff - lg-echo.c
Document the new say and whisper commands
[loudgame] / lg-echo.c
index 61729ad3481820fa979a2321a2d97bb9114c66bf..c153472bb84f78ce8e1613086d0f90f0f3dcbaa9 100644 (file)
--- a/lg-echo.c
+++ b/lg-echo.c
 /*
- * Copyright (C) 2003-2004 Imendio AB
  * Copyright (C) 2008 Carl Worth
  *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see http://www.gnu.org/licenses/ .
  *
- * Authors: Imendio AB
- *         Carl Worth <cworth@cworth.org>
+ * Author: Carl Worth <cworth@cworth.org>
  */
-#include <glib.h>
-#include <string.h>
-#include <stdlib.h>
-#include <loudmouth/loudmouth.h>
-#ifdef __WIN32__
-#include <winsock2.h>
-#endif
-typedef struct _loudgame {
-    gchar              *server;
-    gchar              *name;
-    gchar              *passwd;
-    LmConnection       *connection;
-    GMainLoop          *main_loop;
-    int                         return_value;
-} loudgame_t;
-
-static void
-loudgame_quit (loudgame_t *lg, int return_value)
-{
-    GError *error;
-
-    lg->return_value = return_value;
-
-    if (! lm_connection_close (lg->connection, &error))
-       g_print ("An error occurred during lm_connection_close: %s\n",
-                error->message);
-
-    lm_connection_unref (lg->connection);
-
-    g_main_loop_quit (lg->main_loop);
-}
-static void
-authentication_cb (LmConnection *connection, gboolean result, gpointer closure)
-{
-    LmMessage *m;
-    loudgame_t *lg = closure;
-
-    if (! result) {
-       g_print ("Authentication for %s failed\n", lg->name);
-       loudgame_quit (lg, 1);
-       return;
-    }
-                 
-    m = lm_message_new_with_sub_type (NULL,
-                                     LM_MESSAGE_TYPE_PRESENCE,
-                                     LM_MESSAGE_SUB_TYPE_AVAILABLE);
-
-    lm_connection_send (connection, m, NULL);
-    lm_message_unref (m);
-}
-static void
-connection_open_cb (LmConnection *connection, gboolean result, loudgame_t *lg)
-{
-    lm_connection_authenticate (connection,
-                               lg->name, lg->passwd, "TestLM",
-                               authentication_cb, lg, FALSE,  NULL);
-}
-
-static void
-send_reply (LmConnection       *connection,
-           const char          *peer,
-           const char          *message,
-           loudgame_t          *lg)
-{
-    LmMessage *reply;
-    gboolean result;
-    GError *error = NULL;
-
-    reply = lm_message_new (peer, LM_MESSAGE_TYPE_MESSAGE);
-
-    lm_message_node_add_child (reply->node, "body", message);
 
-    result = lm_connection_send (connection, reply, &error);
-    lm_message_unref (reply);
+#include "loudgame.h"
 
-    if (! result) {
-       g_error ("lm_connection_send failed: error->message");
-       loudgame_quit (lg, 1);
-    }
-}
+#include <string.h>
+#include <stdlib.h>
 
 static void
-handle_command (LmConnection   *connection,
-               const char      *peer,
-               const char      *command,
-               loudgame_t      *lg)
-{
-    char *error;
-
-    if (strcmp (command, "quit") == 0) {
-       loudgame_quit (lg, 0);
-       return;
-    }
-
-    error = g_strdup_printf ("Unknown command: '%s'", command);
-    send_reply (connection, peer, error, lg);
-    free (error);
-}
-static LmHandlerResult
-handle_messages (LmMessageHandler *handler,
-                 LmConnection     *connection,
-                 LmMessage        *m,
-                 gpointer          closure)
-{
-    loudgame_t *lg = closure;
-    LmMessageNode *body;
-    const char *peer;
-    const char *body_str;
-
-    peer = lm_message_node_get_attribute (m->node, "from");
-
-    body = lm_message_node_get_child (m->node, "body");
-    if (body) {
-       body_str = lm_message_node_get_value (body);
-
-       if (body_str && body_str[0] == '%')
-           handle_command (connection, peer, body_str + 1, lg);
-       else
-           send_reply (connection, peer, body_str, lg);
-    }
-       
-    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
-}
-
-static gboolean
-make_connection (gpointer closure)
+echo_handle_message (loudgame_t *lg,
+                    const char *peer,
+                    const char *message)
 {
-    loudgame_t      *lg;
-    LmMessageHandler *handler;
-    gchar            *jid;
-    GError          *error;
-
-    lg = closure;
-                                                                                
-    lg->connection = lm_connection_new (lg->server);
-
-    jid = g_strdup_printf ("%s@%s", lg->name, lg->server);
-    lm_connection_set_jid (lg->connection, jid);
-    g_free (jid);
-
-    handler = lm_message_handler_new (handle_messages, lg, NULL);
-    lm_connection_register_message_handler (lg->connection,
-                                           handler,
-                                           LM_MESSAGE_TYPE_MESSAGE,
-                                           LM_HANDLER_PRIORITY_NORMAL);
-                                                                                
-    lm_message_handler_unref (handler);
-                                                                                
-    if (! lm_connection_open (lg->connection,
-                             (LmResultFunction) connection_open_cb,
-                             lg, NULL, &error))
-    {
-       g_print ("Opening connection failed: %s\n", error->message);
-       loudgame_quit (lg, 1);
-    }
-
-    /* Return false to not schedule another call. */
-    return 0;
+    loudgame_send (lg, peer, message);
 }
 
 int
 main (int argc, char **argv)
 {
     loudgame_t lg;
+    int err;
 
-    if (argc != 4) {
-       g_print ("Usage: %s <server> <username> <password>\n", argv[0]);
-       return 1;
-    }
-
-    lg.server = argv[1];
-    lg.name = argv[2];
-    lg.passwd = argv[3];
-
-    lg.connection = NULL;
+    err = loudgame_init (&lg, argc, argv);
+    if (err)
+       return err;
 
-    lg.main_loop = g_main_loop_new (NULL, FALSE);
+    lg.handle_message = echo_handle_message;
 
-    g_idle_add (make_connection, &lg);
+    err = loudgame_run (&lg);
+    if (err)
+       return err;
 
-    g_main_loop_run (lg.main_loop);
-
-    g_main_loop_unref (lg.main_loop);
-                                                                                
-    return lg.return_value;
+    return 0;
 }