aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Halden <marius.h@lden.org>2016-03-19 17:10:15 +0100
committerMarius Halden <marius.h@lden.org>2016-03-19 17:10:15 +0100
commitd9862d75391e421649e75d2b96e5b21fae3a46dd (patch)
tree5a9d4a8a553099896dbfc815806b819400f78a29
parent205d2edcfc2494dbff4bba1dde368b77a961eb86 (diff)
downloadbitlbee-facebook-d9862d75391e421649e75d2b96e5b21fae3a46dd.tar.gz
bitlbee-facebook-d9862d75391e421649e75d2b96e5b21fae3a46dd.tar.bz2
bitlbee-facebook-d9862d75391e421649e75d2b96e5b21fae3a46dd.tar.xz
Add root command `fbmark`fbmark
New root command `fbmark` which takes a buddy, a channel or a chat index as an argument. Any messages from this buddy or in this chat will be marked as read when the command `fbmark` is used.
-rw-r--r--facebook/facebook.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/facebook/facebook.c b/facebook/facebook.c
index 5982512..0ba4b01 100644
--- a/facebook/facebook.c
+++ b/facebook/facebook.c
@@ -1055,6 +1055,108 @@ fb_cmd_fbjoin(irc_t *irc, char **args)
irc_rootmsg(irc, "Joining channel %s", chan);
}
+static gboolean
+fb_buddy_by_name(irc_t *irc, const gchar *name, FbId *id)
+{
+ irc_user_t *iu;
+ iu = irc_user_by_name(irc, name);
+ if (iu == NULL) {
+ return FALSE;
+ }
+
+ *id = FB_ID_FROM_STR(iu->bu->handle);
+ return TRUE;
+}
+
+static gboolean
+fb_chat_by_channel(irc_t *irc, struct im_connection *ic, const gchar *name, FbId *id)
+{
+ const gchar *tag;
+ const gchar *room;
+ GSList *l;
+ irc_channel_t *ich;
+
+ for (l = irc->channels; l != NULL; l = l->next) {
+ ich = l->data;
+
+ tag = set_getstr(&ich->set, "account");
+ if (g_strcmp0(tag, ic->acc->tag) != 0) {
+ continue;
+ }
+
+ if (g_strcmp0(ich->name, name) != 0) {
+ continue;
+ }
+
+ room = set_getstr(&ich->set, "room");
+ *id = FB_ID_FROM_STR(room);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+fb_chat_by_index(FbData *fata, const gchar *name, FbId *id)
+{
+ guint i;
+ FbId tid;
+
+ i = g_ascii_strtoll(name, NULL, 10);
+ tid = fb_data_get_thread(fata, i - 1);
+
+ if ((i < 1) || (tid == 0)) {
+ return FALSE;
+ }
+
+ *id = tid;
+ return TRUE;
+}
+
+static void
+fb_cmd_fbmark(irc_t *irc, char **args)
+{
+ account_t *acct;
+ FbApi *api;
+ FbData *fata;
+ FbId id;
+ gchar *name;
+ guint oset;
+ guint i;
+ gboolean is_gc;
+ struct im_connection *ic;
+
+ acct = fb_cmd_account(irc, args, 1, &oset);
+
+ if (acct == NULL) {
+ return;
+ }
+
+ fata = acct->ic->proto_data;
+ api = fb_data_get_api(fata);
+ ic = fb_data_get_connection(fata);
+
+ name = args[oset];
+
+ if (fb_buddy_by_name(irc, name, &id)) {
+ irc_rootmsg(irc, "Found user %d", id); // XXX
+ is_gc = FALSE;
+ } else if (fb_chat_by_channel(irc, ic, name, &id)) {
+ irc_rootmsg(irc, "Found chat %d", id); // XXX
+ is_gc = TRUE;
+ } else if (fb_chat_by_index(fata, name, &id)) {
+ irc_rootmsg(irc, "Found chat %d", id); // XXX
+ is_gc = TRUE;
+ } else {
+ irc_rootmsg(irc, "Unknown buddy/chat %s", name);
+ return;
+ }
+
+ fb_api_read(api, id, is_gc);
+ irc_rootmsg(irc, "Marked messages %s %s as read", ((is_gc)?"in chat":"from"), name);
+}
+
G_MODULE_EXPORT void
init_plugin(void);
@@ -1095,4 +1197,5 @@ init_plugin(void)
root_command_add("fbchats", 0, fb_cmd_fbchats, 0);
root_command_add("fbcreate", 0, fb_cmd_fbcreate, 0);
root_command_add("fbjoin", 0, fb_cmd_fbjoin, 0);
+ root_command_add("fbmark", 0, fb_cmd_fbmark, 0);
}