static gboolean parse_reviews (GsPlugin *plugin, JsonParser *parser, GsApp *app, GCancellable *cancellable, GError **error) { GsAuth *auth; JsonArray *array; const gchar *consumer_key = NULL; guint i; auth = gs_plugin_get_auth_by_id (plugin, "ubuntuone"); if (auth != NULL) consumer_key = gs_auth_get_metadata_item (auth, "consumer-key"); if (!JSON_NODE_HOLDS_ARRAY (json_parser_get_root (parser))) return FALSE; array = json_node_get_array (json_parser_get_root (parser)); for (i = 0; i < json_array_get_length (array); i++) { g_autoptr(AsReview) review = NULL; /* Read in from JSON... (skip bad entries) */ review = as_review_new (); if (parse_review (review, consumer_key, json_array_get_element (array, i))) gs_app_add_review (app, review); } return TRUE; }
static AsReview * gs_plugin_odrs_parse_review_object (GsPlugin *plugin, JsonObject *item) { AsReview *rev = as_review_new (); /* date */ if (json_object_has_member (item, "date_created")) { gint64 timestamp; g_autoptr(GDateTime) dt = NULL; timestamp = json_object_get_int_member (item, "date_created"); dt = g_date_time_new_from_unix_utc (timestamp); as_review_set_date (rev, dt); } /* assemble review */ if (json_object_has_member (item, "rating")) as_review_set_rating (rev, (gint) json_object_get_int_member (item, "rating")); if (json_object_has_member (item, "score")) { as_review_set_priority (rev, (gint) json_object_get_int_member (item, "score")); } else if (json_object_has_member (item, "karma_up") && json_object_has_member (item, "karma_down")) { gdouble ku = (gdouble) json_object_get_int_member (item, "karma_up"); gdouble kd = (gdouble) json_object_get_int_member (item, "karma_down"); gdouble wilson = 0.f; /* from http://www.evanmiller.org/how-not-to-sort-by-average-rating.html */ if (ku > 0 || kd > 0) { wilson = ((ku + 1.9208) / (ku + kd) - 1.96 * sqrt ((ku * kd) / (ku + kd) + 0.9604) / (ku + kd)) / (1 + 3.8416 / (ku + kd)); wilson *= 100.f; } as_review_set_priority (rev, (gint) wilson); } if (json_object_has_member (item, "user_hash")) as_review_set_reviewer_id (rev, json_object_get_string_member (item, "user_hash")); if (json_object_has_member (item, "user_display")) as_review_set_reviewer_name (rev, json_object_get_string_member (item, "user_display")); if (json_object_has_member (item, "summary")) as_review_set_summary (rev, json_object_get_string_member (item, "summary")); if (json_object_has_member (item, "description")) as_review_set_description (rev, json_object_get_string_member (item, "description")); if (json_object_has_member (item, "version")) as_review_set_version (rev, json_object_get_string_member (item, "version")); /* add extra metadata for the plugin */ if (json_object_has_member (item, "user_skey")) { as_review_add_metadata (rev, "user_skey", json_object_get_string_member (item, "user_skey")); } if (json_object_has_member (item, "app_id")) { as_review_add_metadata (rev, "app_id", json_object_get_string_member (item, "app_id")); } if (json_object_has_member (item, "review_id")) { g_autofree gchar *review_id = NULL; review_id = g_strdup_printf ("%" G_GINT64_FORMAT, json_object_get_int_member (item, "review_id")); as_review_set_id (rev, review_id); } /* don't allow multiple votes */ if (json_object_has_member (item, "vote_id")) as_review_add_flags (rev, AS_REVIEW_FLAG_VOTED); return rev; }