aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjgeboski <jgeboski@gmail.com>2015-09-13 16:19:48 -0400
committerjgeboski <jgeboski@gmail.com>2015-09-13 16:19:48 -0400
commit073a946ffd188dbce9abf95633c4d9108401e533 (patch)
tree6cbc90324fe117822ccae8ba19a59ff7d822e169
parent881cb974236dd1db4d679005876369eb48c731ca (diff)
downloadbitlbee-facebook-073a946ffd188dbce9abf95633c4d9108401e533.tar.gz
bitlbee-facebook-073a946ffd188dbce9abf95633c4d9108401e533.tar.bz2
bitlbee-facebook-073a946ffd188dbce9abf95633c4d9108401e533.tar.xz
facebook: implemented auto-joining for incoming group chat messages
This adds a setting, group_chat_open, which if set to true, will allow the plugin to open added channels upon an incoming message. This also addresses: - Improper message printing for root commands - The fbchats command not joining existing channels
-rw-r--r--facebook/facebook.c78
1 files changed, 61 insertions, 17 deletions
diff --git a/facebook/facebook.c b/facebook/facebook.c
index 2f31305..909b512 100644
--- a/facebook/facebook.c
+++ b/facebook/facebook.c
@@ -25,6 +25,45 @@
static void
fb_cb_api_messages(FbApi *api, GSList *msgs, gpointer data);
+static gboolean
+fb_channel_join(struct im_connection *ic, FbId tid, const gchar **channel)
+{
+ const gchar *room;
+ const gchar *tag;
+ FbId rid;
+ GSList *l;
+ irc_t *irc = ic->acc->bee->ui_data;
+ 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;
+ }
+
+ room = set_getstr(&ich->set, "room");
+ rid = FB_ID_FROM_STR(room);
+
+ if (rid != tid) {
+ continue;
+ }
+
+ if (!(ich->flags & IRC_CHANNEL_JOINED) && (ich->f != NULL)) {
+ ich->f->join(ich);
+ }
+
+ if (channel != NULL) {
+ *channel = ich->name;
+ }
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static void
fb_cb_api_auth(FbApi *api, gpointer data)
{
@@ -256,6 +295,7 @@ fb_cb_api_messages(FbApi *api, GSList *msgs, gpointer data)
FbApiMessage *msg;
FbData *fata = data;
gboolean mark;
+ gboolean open;
gchar tid[FB_ID_STRMAX];
gchar uid[FB_ID_STRMAX];
GSList *l;
@@ -265,6 +305,7 @@ fb_cb_api_messages(FbApi *api, GSList *msgs, gpointer data)
ic = fb_data_get_connection(fata);
acct = ic->acc;
mark = set_getbool(&acct->set, "mark_read");
+ open = set_getbool(&acct->set, "group_chat_open");
for (l = msgs; l != NULL; l = l->next) {
msg = l->data;
@@ -293,6 +334,11 @@ fb_cb_api_messages(FbApi *api, GSList *msgs, gpointer data)
FB_ID_TO_STR(msg->tid, tid);
gc = bee_chat_by_title(ic->bee, ic, tid);
+ if ((gc == NULL) && open) {
+ fb_channel_join(ic, msg->tid, NULL);
+ gc = bee_chat_by_title(ic->bee, ic, tid);
+ }
+
if (gc != NULL) {
if (mark) {
fb_api_read(api, msg->tid, TRUE);
@@ -493,7 +539,7 @@ fb_cb_api_typing(FbApi *api, FbApiTyping *typg, gpointer data)
}
static struct groupchat *
-fb_data_groupchat_new(struct im_connection *ic, FbId tid, const gchar *name)
+fb_groupchat_new(struct im_connection *ic, FbId tid, const gchar *name)
{
FbApi *api;
FbData *fata = ic->proto_data;
@@ -504,6 +550,7 @@ fb_data_groupchat_new(struct im_connection *ic, FbId tid, const gchar *name)
FB_ID_TO_STR(tid, stid);
if (bee_chat_by_title(ic->bee, ic, stid) != NULL) {
+ imcb_error(ic, "Failed to create chat: %" FB_ID_FORMAT, tid);
return NULL;
}
@@ -564,6 +611,7 @@ fb_init(account_t *acct)
s = set_add(&acct->set, "uid", NULL, NULL, acct);
s->flags = SET_NULL_OK | SET_HIDDEN;
+ set_add(&acct->set, "group_chat_open", "false", set_eval_bool, acct);
set_add(&acct->set, "mark_read", "false", set_eval_bool, acct);
set_add(&acct->set, "show_unread", "false", set_eval_bool, acct);
set_add(&acct->set, "sync_interval", "30", set_eval_int, acct);
@@ -750,17 +798,9 @@ fb_chat_join(struct im_connection *ic, const char *room, const char *nick,
const char *password, set_t **sets)
{
FbId tid;
- struct groupchat *gc;
tid = FB_ID_FROM_STR(room);
- gc = fb_data_groupchat_new(ic, tid, NULL);
-
- if (gc == NULL) {
- imcb_error(ic, "Failed to join chat: %" FB_ID_FORMAT, tid);
- return NULL;
- }
-
- return gc;
+ return fb_groupchat_new(ic, tid, NULL);
}
static void
@@ -878,7 +918,6 @@ fb_cmd_fbcreate(irc_t *irc, char **args)
GSList *uids = NULL;
guint oset;
guint i;
- struct im_connection *ic;
acct = fb_cmd_account(irc, args, 2, &oset);
@@ -887,7 +926,6 @@ fb_cmd_fbcreate(irc_t *irc, char **args)
}
fata = acct->ic->proto_data;
- ic = fb_data_get_connection(fata);
for (i = oset; args[i] != NULL; i++) {
iu = irc_user_by_name(irc, args[i]);
@@ -900,7 +938,7 @@ fb_cmd_fbcreate(irc_t *irc, char **args)
}
if (uids == NULL) {
- imcb_error(ic, "No valid users specified");
+ irc_rootmsg(irc, "No valid users specified");
return;
}
@@ -912,12 +950,15 @@ fb_cmd_fbcreate(irc_t *irc, char **args)
static void
fb_cmd_fbjoin(irc_t *irc, char **args)
{
+ const gchar *chan;
account_t *acct;
FbData *fata;
FbId tid;
gchar *name;
guint i;
guint oset;
+ irc_channel_t *ich;
+ struct groupchat *gc;
struct im_connection *ic;
acct = fb_cmd_account(irc, args, 2, &oset);
@@ -934,14 +975,17 @@ fb_cmd_fbjoin(irc_t *irc, char **args)
tid = fb_data_get_thread(fata, i - 1);
if ((i < 1) || (tid == 0)) {
- imcb_error(ic, "Invalid index: %u", i);
+ irc_rootmsg(irc, "Invalid index: %u", i);
return;
}
- if (fb_data_groupchat_new(ic, tid, name) == NULL) {
- imcb_error(ic, "Failed to join chat: %s (%" FB_ID_FORMAT ")",
- name, tid);
+ if (!fb_channel_join(ic, tid, &chan)) {
+ gc = fb_groupchat_new(ic, tid, name);
+ ich = gc->ui_data;
+ chan = ich->name;
}
+
+ irc_rootmsg(irc, "Joining channel %s", chan);
}
G_MODULE_EXPORT void