example-live

   1 /*
   2  * This example shows the live-functionality of libsoylent, e.g. starting a
   3  * chat with someone or getting the online-presence of a person.
   4  */
   5 
   6 #include "example.h"
   7 #include <libsoylent/soylent.h>
   8 
   9 static void print_person_with_presence (SlPerson *person);
  10 static gboolean start_random_chat (gpointer data);
  11 static void person_presence_changed (SlBook *book, SlPerson *person, gpointer user_data);
  12 
  13 /*
  14  * Prints a person in the form:
  15  *  * [presence] name
  16  * e.g.:
  17  *  * [on] Tim
  18  */
  19 static void
  20 print_person_with_presence (SlPerson *person)
  21 {
  22   g_return_if_fail (person != NULL && SL_IS_PERSON (person));
  23 
  24   gchar *presence_string = NULL;
  25 
  26   /* get a printable name and the online-presence of this person */
  27   gchar *name = sl_person_get_string (person);
  28   McPresence presence = sl_person_get_presence (person);
  29   
  30   /* print presence as on(line), aw(ay) or of(fline) */
  31   if (presence == MC_PRESENCE_UNSET || presence == MC_PRESENCE_OFFLINE ||
  32       presence == MC_PRESENCE_HIDDEN)
  33     {
  34       presence_string = "of";
  35     }
  36   if (presence == MC_PRESENCE_EXTENDED_AWAY || presence == MC_PRESENCE_AWAY ||
  37       presence == MC_PRESENCE_DO_NOT_DISTURB)
  38     {
  39       presence_string = "aw";
  40     }
  41   if (presence == MC_PRESENCE_AVAILABLE)
  42     {
  43       presence_string = "on";
  44     }
  45   
  46   /* print person with presence */
  47   g_print ("[%s] %s\n", presence_string, name);
  48 }
  49 
  50 /*
  51  * Starts a chat with a randomly choosen person that is currently online. This
  52  * is a timeout-function, i.e. returning TRUE means that the function should be
  53  * called again after 5 seconds.
  54  */
  55 static gboolean
  56 start_random_chat (gpointer data)
  57 {
  58   GError *error = NULL;
  59   int index = 0;
  60   SlPerson *person = NULL;
  61   
  62   /* get a list of people that are online */
  63   GList *online_people = sl_book_get_online_people (SL_BOOK_DEFAULT);
  64   
  65   /* if nobody is online, retry in 5 seconds */
  66   if (online_people == NULL)
  67     {
  68       return TRUE;
  69     }
  70   
  71   /* choose a person randomly */
  72   index = g_random_int_range (0, g_list_length (online_people));
  73   person = g_list_nth_data (online_people, index);
  74   
  75   /* launch a chat with the chosen person */
  76   g_print ("launching a random chat with %s\n", sl_person_get_string (person));
  77   if (!sl_person_communicate_chat (person, &error))
  78     {
  79       example_error (error);
  80     }
  81   
  82   g_list_free (online_people);
  83   return FALSE;
  84 }
  85 
  86 static void
  87 person_presence_changed (SlBook *book, SlPerson *person, gpointer user_data)
  88 {
  89   print_person_with_presence (person);
  90 }
  91 
  92 void
  93 live (void)
  94 {
  95   GError *error = NULL;
  96   GMainLoop *main_loop = NULL;
  97   GList *people = NULL;
  98   
  99   /* initialize libsoylent */
 100   if (!sl_init (&error))
 101     {
 102       example_error (error);
 103     }
 104   
 105   /* get notified when the presence of someone changed */
 106   g_signal_connect (SL_BOOK_DEFAULT, "person-presence-changed", G_CALLBACK (person_presence_changed), NULL);
 107   
 108   /* print the name and presence of all people... */
 109   people = sl_book_get_people (SL_BOOK_DEFAULT);
 110   for (; people != NULL; people = people->next)
 111     {
 112       SlPerson *person = people->data;
 113       
 114       /* ... but only where this information is available */
 115       if (sl_person_has_iminfo (person))
 116         {
 117           print_person_with_presence (person);
 118         }
 119     }
 120   
 121   /* add \"Tom Beatle\" to the addressbook */
 122   SlPerson *tom = sl_person_new (g_strdup ("Tom"), g_strdup ("Beatle"));
 123   if (!sl_book_add_person (SL_BOOK_DEFAULT, tom, &error))
 124     {
 125       example_error (error);
 126     }
 127   
 128   /* Set Tom's Jabber account. Now online-information of Tom should be
 129    * available.*/
 130   sl_person_add (tom, SL_ATTR_JABBER, "foobar@jabber.org");
 131   
 132   /* Launch a random chat with someone. If no-one is online, retry every 5
 133    * seconds. */
 134   g_timeout_add_seconds (5, start_random_chat, NULL);
 135   
 136   /* run... */
 137   main_loop = g_main_loop_new (NULL, FALSE);
 138   g_main_loop_run (main_loop);
 139   
 140   sl_cleanup ();
 141 }

Projects/Soylent/libsoylent/example-live (last edited 2013-11-22 19:18:57 by WilliamJonMcCann)