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; }
static gboolean gs_plugin_odrs_vote (GsPlugin *plugin, AsReview *review, const gchar *uri, GError **error) { GsPluginData *priv = gs_plugin_get_data (plugin); const gchar *tmp; g_autofree gchar *data = NULL; g_autoptr(JsonBuilder) builder = NULL; g_autoptr(JsonGenerator) json_generator = NULL; g_autoptr(JsonNode) json_root = NULL; /* create object with vote 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")); tmp = as_review_get_id (review); if (tmp != NULL) { gint64 review_id; json_builder_set_member_name (builder, "review_id"); review_id = g_ascii_strtoll (tmp, NULL, 10); json_builder_add_int_value (builder, review_id); } 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); if (data == NULL) return FALSE; /* clear cache */ if (!gs_plugin_odrs_invalidate_cache (review, error)) return FALSE; /* send to server */ if (!gs_plugin_odrs_json_post (gs_plugin_get_soup_session (plugin), uri, data, error)) return FALSE; /* mark as voted */ as_review_add_flags (review, AS_REVIEW_FLAG_VOTED); /* success */ return TRUE; }
gboolean gs_plugin_review_downvote (GsPlugin *plugin, GsApp *app, AsReview *review, GCancellable *cancellable, GError **error) { const gchar *review_id; /* Can only modify Ubuntu reviews */ review_id = as_review_get_metadata_item (review, "ubuntu-id"); if (review_id == NULL) return TRUE; if (!set_review_usefulness (plugin, review_id, FALSE, cancellable, error)) return FALSE; as_review_add_flags (review, AS_REVIEW_FLAG_VOTED); return TRUE; }
gboolean gs_plugin_review_report (GsPlugin *plugin, GsApp *app, AsReview *review, GCancellable *cancellable, GError **error) { const gchar *review_id; g_autofree gchar *reason = NULL; g_autofree gchar *text = NULL; g_autofree gchar *path = NULL; guint status_code; /* Can only modify Ubuntu reviews */ review_id = as_review_get_metadata_item (review, "ubuntu-id"); if (review_id == NULL) return TRUE; /* Create message for reviews.ubuntu.com */ reason = soup_uri_encode ("FIXME: gnome-software", NULL); text = soup_uri_encode ("FIXME: gnome-software", NULL); path = g_strdup_printf ("/api/1.0/reviews/%s/recommendations/?reason=%s&text=%s", review_id, reason, text); if (!send_review_request (plugin, SOUP_METHOD_POST, path, NULL, TRUE, &status_code, NULL, cancellable, error)) return FALSE; if (status_code != SOUP_STATUS_CREATED) { g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, "Failed to report review, server returned status code %u", status_code); return FALSE; } as_review_add_flags (review, AS_REVIEW_FLAG_VOTED); 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; }