diff options
| author | jgeboski <jgeboski@gmail.com> | 2015-08-25 15:51:33 -0400 | 
|---|---|---|
| committer | jgeboski <jgeboski@gmail.com> | 2015-08-25 16:33:27 -0400 | 
| commit | a4fdfe5a96383258df28b2f756eb0d8f3165090a (patch) | |
| tree | d71a0712962f04dcecdae98edcd543bfc5a577df /facebook/facebook-api.c | |
| parent | d7583c3d34b286c535e00e9c54fca1a5aa4e1e6a (diff) | |
| download | bitlbee-facebook-a4fdfe5a96383258df28b2f756eb0d8f3165090a.tar.gz bitlbee-facebook-a4fdfe5a96383258df28b2f756eb0d8f3165090a.tar.bz2 bitlbee-facebook-a4fdfe5a96383258df28b2f756eb0d8f3165090a.tar.xz  | |
Implemented group chat topic change events
Diffstat (limited to 'facebook/facebook-api.c')
| -rw-r--r-- | facebook/facebook-api.c | 58 | 
1 files changed, 51 insertions, 7 deletions
diff --git a/facebook/facebook-api.c b/facebook/facebook-api.c index 9ba01ec..7a698b0 100644 --- a/facebook/facebook-api.c +++ b/facebook/facebook-api.c @@ -1064,6 +1064,36 @@ fb_api_event_parse(FbApi *api, FbApiEvent *event, GSList *events,          }      }; +    values = fb_json_values_new(root); +    fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE, "$.log_message_type"); +    fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE, "$.author"); +    fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE, +                       "$.log_message_data.name"); +    fb_json_values_update(values, &err); + +    if (G_UNLIKELY(err != NULL)) { +        g_propagate_error(error, err); +        g_object_unref(values); +        return events; +    } + +    str = fb_json_values_next_str(values, NULL); + +    if (g_strcmp0(str, "log:thread-name") == 0) { +        str = fb_json_values_next_str(values, ""); +        str = strrchr(str, ':'); + +        if (str != NULL) { +            devent = fb_api_event_dup(event, FALSE); +            devent->type = FB_API_EVENT_TYPE_THREAD_TOPIC; +            devent->uid = FB_ID_FROM_STR(str + 1); +            devent->text = fb_json_values_next_str_dup(values, NULL); +            events = g_slist_prepend(events, devent); +        } +    } + +    g_object_unref(values); +      for (i = 0; i < G_N_ELEMENTS(evtypes); i++) {          values = fb_json_values_new(root);          fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$"); @@ -1074,7 +1104,7 @@ fb_api_event_parse(FbApi *api, FbApiEvent *event, GSList *events,              str = strrchr(str, ':');              if (str != NULL) { -                devent = fb_api_event_dup(event); +                devent = fb_api_event_dup(event, FALSE);                  devent->type = evtypes[i].type;                  devent->uid = FB_ID_FROM_STR(str + 1);                  events = g_slist_prepend(events, devent); @@ -1093,7 +1123,7 @@ fb_api_event_parse(FbApi *api, FbApiEvent *event, GSList *events,  }  static void -fb_api_cb_mercury(FbApi *api, GByteArray *pload) +fb_api_cb_publish_mercury(FbApi *api, GByteArray *pload)  {      const gchar *str;      FbApiEvent event; @@ -1112,7 +1142,7 @@ fb_api_cb_mercury(FbApi *api, GByteArray *pload)      fb_json_values_set_array(values, FALSE, "$.actions");      while (fb_json_values_update(values, &err)) { -        fb_api_event_reset(&event); +        fb_api_event_reset(&event, FALSE);          str = fb_json_values_next_str(values, "0");          event.tid = FB_ID_FROM_STR(str); @@ -1518,7 +1548,7 @@ fb_api_cb_mqtt_publish(FbMqtt *mqtt, const gchar *topic, GByteArray *pload,          void (*func) (FbApi *api, GByteArray *pload);      } parsers[] = {          {"/mark_thread_response", fb_api_cb_publish_mark}, -        {"/mercury", fb_api_cb_mercury}, +        {"/mercury", fb_api_cb_publish_mercury},          {"/orca_typing_notifications", fb_api_cb_publish_typing},          {"/t_ms", fb_api_cb_publish_ms},          {"/t_p", fb_api_cb_publish_p} @@ -2782,19 +2812,32 @@ fb_api_typing(FbApi *api, FbId uid, gboolean state)  }  FbApiEvent * -fb_api_event_dup(const FbApiEvent *event) +fb_api_event_dup(const FbApiEvent *event, gboolean deep)  { +    FbApiEvent *ret; +      if (event == NULL) {          return g_new0(FbApiEvent, 1);      } -    return g_memdup(event, sizeof *event); +    ret = g_memdup(event, sizeof *event); + +    if (deep) { +        ret->text = g_strdup(event->text); +    } + +    return ret;  }  void -fb_api_event_reset(FbApiEvent *event) +fb_api_event_reset(FbApiEvent *event, gboolean deep)  {      g_return_if_fail(event != NULL); + +    if (deep) { +        g_free(event->text); +    } +      memset(event, 0, sizeof *event);  } @@ -2802,6 +2845,7 @@ void  fb_api_event_free(FbApiEvent *event)  {      if (G_LIKELY(event != NULL)) { +        g_free(event->text);          g_free(event);      }  }  | 
