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-30 18:46:35 +0200
commit0d38743d484ad0860587975c9c77415d3d30d560 (patch)
tree2263fe18e8e3b805ae79367a36fe871d054d95c1
parent52460225e45b4f9583062047d6f1465738a0d061 (diff)
downloadbitlbee-facebook-0d38743d484ad0860587975c9c77415d3d30d560.tar.gz
bitlbee-facebook-0d38743d484ad0860587975c9c77415d3d30d560.tar.bz2
bitlbee-facebook-0d38743d484ad0860587975c9c77415d3d30d560.tar.xz
Add root command `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.c107
1 files changed, 107 insertions, 0 deletions
diff --git a/facebook/facebook.c b/facebook/facebook.c
index 459ede9..d3e9422 100644
--- a/facebook/facebook.c
+++ b/facebook/facebook.c
@@ -1148,6 +1148,112 @@ fb_cmd_fbjoin(irc_t *irc, char **args)
irc_rootmsg(irc, "Joining channel %s", chan);
}
+static gboolean
+fb_buddy_by_name(irc_t *irc, struct im_connection *ic, const gchar *name, FbId *id)
+{
+ irc_user_t *iu;
+ iu = irc_user_by_name(irc, name);
+ if (iu == NULL) {
+ return FALSE;
+ }
+
+ if (g_strcmp0(iu->bu->ic->acc->tag, ic->acc->tag) != 0) {
+ 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, ic, 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);
@@ -1188,4 +1294,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);
}