lastmsg/lastmsg.c
changeset 12 3b30c879c8cc
parent 11 573a48de8ee1
child 13 efe544108ca1
equal deleted inserted replaced
11:573a48de8ee1 12:3b30c879c8cc
    43         .next           = NULL,
    43         .next           = NULL,
    44 };
    44 };
    45 
    45 
    46 static GSList *lastmsg_list;
    46 static GSList *lastmsg_list;
    47 
    47 
       
    48 static guint last_message_hid, last_status_hid;
       
    49 
    48 struct lastm_T {
    50 struct lastm_T {
    49     gchar *mucname;
    51     gchar *mucname;
    50     gchar *nickname;
    52     gchar *nickname;
    51     gchar *msg;
    53     gchar *msg;
    52 };
    54 };
    69   }
    71   }
    70   g_slist_free(lastmsg_list);
    72   g_slist_free(lastmsg_list);
    71   lastmsg_list = NULL;
    73   lastmsg_list = NULL;
    72 }
    74 }
    73 
    75 
    74 static void last_message_hh(guint32 hid, hk_arg_t *args, gpointer userdata)
    76 static guint last_message_hh(const gchar *hookname, hk_arg_t *args,
       
    77                              gpointer userdata)
    75 {
    78 {
    76   enum imstatus status;
    79   enum imstatus status;
    77   const gchar *bjid, *res, *msg;
    80   const gchar *bjid, *res, *msg;
    78   gboolean muc = FALSE, urgent = FALSE;
    81   gboolean muc = FALSE, urgent = FALSE;
    79 
    82 
    80   status = xmpp_getstatus();
    83   status = xmpp_getstatus();
    81 
    84 
    82   if (status != notavail && status != away)
    85   if (status != notavail && status != away)
    83     return;
    86     return HOOK_HANDLER_RESULT_ALLOW_MORE_HOOKS;
    84 
    87 
    85   bjid = res = NULL;
    88   bjid = res = NULL;
    86   msg = NULL;
    89   msg = NULL;
    87 
    90 
    88   for ( ; args->name; args++) {
    91   for ( ; args->name; args++) {
   108     lastm_item->mucname  = g_strdup(bjid);
   111     lastm_item->mucname  = g_strdup(bjid);
   109     lastm_item->nickname = g_strdup(res);
   112     lastm_item->nickname = g_strdup(res);
   110     lastm_item->msg      = g_strdup(msg);
   113     lastm_item->msg      = g_strdup(msg);
   111     lastmsg_list = g_slist_append(lastmsg_list, lastm_item);
   114     lastmsg_list = g_slist_append(lastmsg_list, lastm_item);
   112   }
   115   }
       
   116   return HOOK_HANDLER_RESULT_ALLOW_MORE_HOOKS;
   113 }
   117 }
   114 
   118 
   115 static void last_status_hh(guint32 hid, hk_arg_t *args, gpointer userdata)
   119 static guint last_status_hh(const gchar *hookname, hk_arg_t *args,
       
   120                             gpointer userdata)
   116 {
   121 {
   117   gboolean not_away = FALSE;
   122   gboolean not_away = FALSE;
   118 
   123 
   119   for ( ; args->name; args++) {
   124   for ( ; args->name; args++) {
   120     if (!g_strcmp0(args->name, "new_status")) {
   125     if (!g_strcmp0(args->name, "new_status")) {
   124         not_away = TRUE;
   129         not_away = TRUE;
   125         break;
   130         break;
   126       }
   131       }
   127     }
   132     }
   128   }
   133   }
   129   if (!not_away || !lastmsg_list) return;
   134   if (!not_away || !lastmsg_list)
       
   135     return HOOK_HANDLER_RESULT_ALLOW_MORE_HOOKS;
   130 
   136 
   131   scr_log_print(LPRINT_NORMAL, "Looks like you're back...");
   137   scr_log_print(LPRINT_NORMAL, "Looks like you're back...");
   132   scr_log_print(LPRINT_NORMAL, "I've got news for you, use /lastmsg to "
   138   scr_log_print(LPRINT_NORMAL, "I've got news for you, use /lastmsg to "
   133                 "read your messages!");
   139                 "read your messages!");
       
   140   return HOOK_HANDLER_RESULT_ALLOW_MORE_HOOKS;
   134 }
   141 }
   135 
   142 
   136 /* Initialization */
   143 /* Initialization */
   137 static void lastmsg_init(void)
   144 static void lastmsg_init(void)
   138 {
   145 {
   139   /* Add command */
   146   /* Add command */
   140   cmd_add("lastmsg", "Display last missed messages", 0, 0, do_lastmsg, NULL);
   147   cmd_add("lastmsg", "Display last missed messages", 0, 0, do_lastmsg, NULL);
   141 
   148 
   142   hk_add_handler(last_message_hh, HOOK_MESSAGE_IN, NULL);
   149   last_message_hid = hk_add_handler(last_message_hh, HOOK_POST_MESSAGE_IN,
   143   hk_add_handler(last_status_hh, HOOK_MY_STATUS_CHANGE, NULL);
   150                                     G_PRIORITY_DEFAULT_IDLE, NULL);
       
   151   last_status_hid  = hk_add_handler(last_status_hh, HOOK_MY_STATUS_CHANGE,
       
   152                                     G_PRIORITY_DEFAULT_IDLE, NULL);
   144 }
   153 }
   145 
   154 
   146 /* Uninitialization */
   155 /* Uninitialization */
   147 static void lastmsg_uninit(void)
   156 static void lastmsg_uninit(void)
   148 {
   157 {
   149   /* Unregister command */
   158   /* Unregister command */
   150   cmd_del("lastmsg");
   159   cmd_del("lastmsg");
   151   hk_del_handler(last_message_hh, NULL);
   160   hk_del_handler(HOOK_POST_MESSAGE_IN, last_message_hid);
   152   hk_del_handler(last_status_hh, NULL);
   161   hk_del_handler(HOOK_MY_STATUS_CHANGE, last_status_hid);
   153 
   162 
   154   for (GSList *li = lastmsg_list; li ; li = g_slist_next(li)) {
   163   for (GSList *li = lastmsg_list; li ; li = g_slist_next(li)) {
   155     struct lastm_T *lastm_item = li->data;
   164     struct lastm_T *lastm_item = li->data;
   156     g_free(lastm_item->mucname);
   165     g_free(lastm_item->mucname);
   157     g_free(lastm_item->nickname);
   166     g_free(lastm_item->nickname);