diff options
author | Marius Halden <marius.h@lden.org> | 2016-03-19 17:10:15 +0100 |
---|---|---|
committer | Marius Halden <marius.h@lden.org> | 2016-03-19 17:10:15 +0100 |
commit | d9862d75391e421649e75d2b96e5b21fae3a46dd (patch) | |
tree | 5a9d4a8a553099896dbfc815806b819400f78a29 /facebook | |
parent | 205d2edcfc2494dbff4bba1dde368b77a961eb86 (diff) | |
download | bitlbee-facebook-fbmark.tar.gz bitlbee-facebook-fbmark.tar.bz2 bitlbee-facebook-fbmark.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.
Diffstat (limited to 'facebook')
-rw-r--r-- | facebook/facebook.c | 103 |
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); } |