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); |