static gboolean parse_review (AsReview *review, const gchar *our_username, JsonNode *node) { JsonObject *object; gint64 star_rating; g_autofree gchar *id_string = NULL; if (!JSON_NODE_HOLDS_OBJECT (node)) return FALSE; object = json_node_get_object (node); if (g_strcmp0 (our_username, json_object_get_string_member (object, "reviewer_username")) == 0) as_review_add_flags (review, AS_REVIEW_FLAG_SELF); as_review_set_reviewer_name (review, json_object_get_string_member (object, "reviewer_displayname")); as_review_set_summary (review, json_object_get_string_member (object, "summary")); as_review_set_description (review, json_object_get_string_member (object, "review_text")); as_review_set_version (review, json_object_get_string_member (object, "version")); star_rating = json_object_get_int_member (object, "rating"); if (star_rating > 0) as_review_set_rating (review, (gint) (star_rating * 20 - 10)); as_review_set_date (review, parse_date_time (json_object_get_string_member (object, "date_created"))); id_string = g_strdup_printf ("%" G_GINT64_FORMAT, json_object_get_int_member (object, "id")); as_review_add_metadata (review, "ubuntu-id", id_string); return TRUE; }
gboolean gs_plugin_review_submit (GsPlugin *plugin, GsApp *app, AsReview *review, GCancellable *cancellable, GError **error) { GsPluginData *priv = gs_plugin_get_data (plugin); g_autofree gchar *data = NULL; g_autofree gchar *uri = NULL; g_autofree gchar *version = NULL; g_autoptr(JsonBuilder) builder = NULL; g_autoptr(JsonGenerator) json_generator = NULL; g_autoptr(JsonNode) json_root = NULL; /* save as we don't re-request the review from the server */ as_review_set_reviewer_name (review, g_get_real_name ()); as_review_add_metadata (review, "app_id", gs_app_get_id (app)); as_review_add_metadata (review, "user_skey", gs_app_get_metadata_item (app, "ODRS::user_skey")); /* create object with review data */ builder = json_builder_new (); json_builder_begin_object (builder); json_builder_set_member_name (builder, "user_hash"); json_builder_add_string_value (builder, priv->user_hash); json_builder_set_member_name (builder, "user_skey"); json_builder_add_string_value (builder, as_review_get_metadata_item (review, "user_skey")); json_builder_set_member_name (builder, "app_id"); json_builder_add_string_value (builder, as_review_get_metadata_item (review, "app_id")); json_builder_set_member_name (builder, "locale"); json_builder_add_string_value (builder, gs_plugin_get_locale (plugin)); json_builder_set_member_name (builder, "distro"); json_builder_add_string_value (builder, priv->distro); json_builder_set_member_name (builder, "version"); version = gs_plugin_odrs_sanitize_version (as_review_get_version (review)); json_builder_add_string_value (builder, version); json_builder_set_member_name (builder, "user_display"); json_builder_add_string_value (builder, as_review_get_reviewer_name (review)); json_builder_set_member_name (builder, "summary"); json_builder_add_string_value (builder, as_review_get_summary (review)); json_builder_set_member_name (builder, "description"); json_builder_add_string_value (builder, as_review_get_description (review)); json_builder_set_member_name (builder, "rating"); json_builder_add_int_value (builder, as_review_get_rating (review)); json_builder_end_object (builder); /* export as a string */ json_root = json_builder_get_root (builder); json_generator = json_generator_new (); json_generator_set_pretty (json_generator, TRUE); json_generator_set_root (json_generator, json_root); data = json_generator_to_data (json_generator, NULL); /* clear cache */ if (!gs_plugin_odrs_invalidate_cache (review, error)) return FALSE; /* POST */ uri = g_strdup_printf ("%s/submit", priv->review_server); return gs_plugin_odrs_json_post (gs_plugin_get_soup_session (plugin), uri, data, error); }
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; }