Tooth/src/API/Status.vala

227 lines
8.4 KiB
Vala
Raw Normal View History

2020-05-29 12:19:35 +00:00
using Gee;
2020-06-03 15:06:11 +00:00
public class Tootle.API.Status : GLib.Object, Widgetizable {
2020-05-29 12:19:35 +00:00
2020-05-30 09:21:50 +00:00
public int64 id { get; construct set; } //TODO: IDs are no longer guaranteed to be numbers. Replace with strings.
2020-05-29 12:19:35 +00:00
public API.Account account { get; construct set; }
public string uri { get; set; }
public string? url { get; set; default = null; }
public string? spoiler_text { get; set; default = null; }
public string? in_reply_to_id { get; set; default = null; }
public string? in_reply_to_account_id { get; set; default = null; }
public string content { get; set; default = ""; }
public int64 replies_count { get; set; default = 0; }
public int64 reblogs_count { get; set; default = 0; }
public int64 favourites_count { get; set; default = 0; }
public string created_at { get; set; default = "0"; }
public bool reblogged { get; set; default = false; }
public bool favorited { get; set; default = false; }
public bool sensitive { get; set; default = false; }
public bool muted { get; set; default = false; }
public bool pinned { get; set; default = false; }
public API.Visibility visibility { get; set; default = API.Visibility.PUBLIC; }
public API.Status? reblog { get; set; default = null; }
public ArrayList<API.Mention>? mentions { get; set; default = null; }
public ArrayList<API.Attachment>? attachments { get; set; default = null; }
public Status formal {
get { return reblog ?? this; }
2018-04-14 12:09:06 +00:00
}
2019-03-11 14:14:37 +00:00
2020-05-29 12:19:35 +00:00
public bool has_spoiler {
get {
return formal.spoiler_text != null || formal.sensitive;
}
}
public Status (Json.Object obj) {
Object (
id: int64.parse (obj.get_string_member ("id")),
account: new Account (obj.get_object_member ("account")),
uri: obj.get_string_member ("uri"),
created_at: obj.get_string_member ("created_at"),
content: Html.simplify ( obj.get_string_member ("content")),
sensitive: obj.get_boolean_member ("sensitive"),
visibility: Visibility.from_string (obj.get_string_member ("visibility")),
in_reply_to_id: obj.get_string_member ("in_reply_to_id") ?? null,
in_reply_to_account_id: obj.get_string_member ("in_reply_to_account_id") ?? null,
replies_count: obj.get_int_member ("replies_count"),
reblogs_count: obj.get_int_member ("reblogs_count"),
favourites_count: obj.get_int_member ("favourites_count")
);
2019-03-11 14:14:37 +00:00
2018-07-08 00:47:35 +00:00
if (obj.has_member ("url"))
2020-05-29 12:19:35 +00:00
url = obj.get_string_member ("url");
2018-07-08 00:47:35 +00:00
else
2020-05-29 12:19:35 +00:00
url = obj.get_string_member ("uri").replace ("/activity", "");
2019-03-11 14:14:37 +00:00
2018-05-04 20:57:31 +00:00
var spoiler = obj.get_string_member ("spoiler_text");
if (spoiler != "")
2020-05-29 12:19:35 +00:00
spoiler_text = Html.simplify (spoiler);
2019-03-11 14:14:37 +00:00
2018-05-22 13:18:39 +00:00
if (obj.has_member ("reblogged"))
2020-05-29 12:19:35 +00:00
reblogged = obj.get_boolean_member ("reblogged");
2018-05-22 13:18:39 +00:00
if (obj.has_member ("favourited"))
2020-05-29 12:19:35 +00:00
favorited = obj.get_boolean_member ("favourited");
2018-05-22 13:18:39 +00:00
if (obj.has_member ("muted"))
2020-05-29 12:19:35 +00:00
muted = obj.get_boolean_member ("muted");
if (obj.has_member ("pinned"))
2020-05-29 12:19:35 +00:00
pinned = obj.get_boolean_member ("pinned");
2019-03-11 14:14:37 +00:00
2018-05-22 13:18:39 +00:00
if (obj.has_member ("reblog") && obj.get_null_member("reblog") != true)
2020-05-29 12:19:35 +00:00
reblog = new Status (obj.get_object_member ("reblog"));
2019-03-11 14:14:37 +00:00
2018-04-28 16:27:10 +00:00
obj.get_array_member ("mentions").foreach_element ((array, i, node) => {
2020-05-29 12:19:35 +00:00
var entity = node.get_object ();
if (entity != null) {
if (mentions == null)
mentions = new ArrayList<API.Mention> ();
mentions.add (new API.Mention (entity));
}
2018-04-28 16:27:10 +00:00
});
2019-03-11 14:14:37 +00:00
2018-05-04 20:57:31 +00:00
obj.get_array_member ("media_attachments").foreach_element ((array, i, node) => {
2020-05-29 12:19:35 +00:00
var entity = node.get_object ();
if (entity != null) {
if (attachments == null)
attachments = new ArrayList<API.Attachment> ();
attachments.add (new API.Attachment (entity));
}
2018-05-04 20:57:31 +00:00
});
2020-05-29 12:19:35 +00:00
}
2019-03-11 14:14:37 +00:00
2020-05-29 12:19:35 +00:00
public Status.empty () {
2020-06-01 00:54:20 +00:00
Object (
id: 0,
visibility: settings.default_post_visibility
);
2018-04-14 12:09:06 +00:00
}
2019-03-11 14:14:37 +00:00
2020-05-29 12:19:35 +00:00
public Status.from_account (API.Account account) {
Object (
id: 0,
account: account,
created_at: account.created_at
);
if (account.note == "")
content = "";
else if ("\n" in account.note)
content = Html.remove_tags (account.note.split ("\n")[0]);
else
content = Html.remove_tags (account.note);
}
2020-06-03 15:06:11 +00:00
public override Gtk.Widget to_widget () {
var w = new Widgets.Status (this);
w.button_press_event.connect (w.open);
return w;
}
2018-10-30 15:57:37 +00:00
public Json.Node? serialize () {
var builder = new Json.Builder ();
builder.begin_object ();
builder.set_member_name ("id");
builder.add_string_value (id.to_string ());
builder.set_member_name ("uri");
builder.add_string_value (uri);
builder.set_member_name ("url");
builder.add_string_value (url);
builder.set_member_name ("content");
builder.add_string_value (content);
builder.set_member_name ("created_at");
builder.add_string_value (created_at);
builder.set_member_name ("visibility");
builder.add_string_value (visibility.to_string ());
builder.set_member_name ("sensitive");
builder.add_boolean_value (sensitive);
builder.set_member_name ("sensitive");
builder.add_boolean_value (sensitive);
builder.set_member_name ("replies_count");
builder.add_int_value (replies_count);
builder.set_member_name ("favourites_count");
builder.add_int_value (favourites_count);
builder.set_member_name ("reblogs_count");
builder.add_int_value (reblogs_count);
builder.set_member_name ("account");
builder.add_value (account.serialize ());
2019-03-11 14:14:37 +00:00
2018-10-30 15:57:37 +00:00
if (spoiler_text != null) {
builder.set_member_name ("spoiler_text");
builder.add_string_value (spoiler_text);
}
if (reblog != null) {
builder.set_member_name ("reblog");
builder.add_value (reblog.serialize ());
}
if (attachments != null) {
builder.set_member_name ("media_attachments");
builder.begin_array ();
2019-03-11 14:14:37 +00:00
foreach (API.Attachment attachment in attachments)
2018-10-30 15:57:37 +00:00
builder.add_value (attachment.serialize ());
builder.end_array ();
}
if (mentions != null) {
builder.set_member_name ("mentions");
builder.begin_array ();
2019-03-11 14:14:37 +00:00
foreach (API.Mention mention in mentions)
2018-10-30 15:57:37 +00:00
builder.add_value (mention.serialize ());
builder.end_array ();
}
2019-03-11 14:14:37 +00:00
2018-10-30 15:57:37 +00:00
builder.end_object ();
return builder.get_root ();
}
2019-03-11 14:14:37 +00:00
2018-05-21 15:23:31 +00:00
public bool is_owned (){
2020-05-29 12:19:35 +00:00
return formal.account.id == accounts.active.id;
2019-03-12 08:12:53 +00:00
}
2018-06-06 14:49:13 +00:00
public string get_reply_mentions () {
var result = "";
2020-05-29 12:19:35 +00:00
if (account.acct != accounts.active.acct)
2018-06-06 14:49:13 +00:00
result = "@%s ".printf (account.acct);
2019-03-11 14:14:37 +00:00
2018-06-06 14:49:13 +00:00
if (mentions != null) {
2018-07-11 17:13:52 +00:00
foreach (var mention in mentions) {
2020-05-29 12:19:35 +00:00
var equals_current = mention.acct == accounts.active.acct;
2018-07-11 17:13:52 +00:00
var already_mentioned = mention.acct in result;
2019-03-11 14:14:37 +00:00
2018-07-11 17:13:52 +00:00
if (!equals_current && ! already_mentioned)
2018-06-06 14:49:13 +00:00
result += "@%s ".printf (mention.acct);
2018-07-11 17:13:52 +00:00
}
2018-06-06 14:49:13 +00:00
}
2019-03-11 14:14:37 +00:00
2018-06-06 14:49:13 +00:00
return result;
}
2019-03-11 14:14:37 +00:00
2020-05-29 12:19:35 +00:00
public void action (string action, owned Network.ErrorCallback? err = network.on_error) {
new Request.POST (@"/api/v1/statuses/$(formal.id)/$action")
.with_account (accounts.active)
.then_parse_obj (obj => {
var status = new API.Status (obj).formal;
formal.reblogged = status.reblogged;
formal.favorited = status.favorited;
formal.muted = status.muted;
formal.pinned = status.pinned;
})
.on_error ((status, reason) => err (status, reason))
.exec ();
}
2020-05-29 12:19:35 +00:00
public void poof (owned Soup.SessionCallback? cb = null, owned Network.ErrorCallback? err = network.on_error) {
new Request.DELETE (@"/api/v1/statuses/$id")
.with_account (accounts.active)
.then ((sess, msg) => {
2020-05-30 10:31:02 +00:00
streams.force_delete (id);
2020-05-29 12:19:35 +00:00
cb (sess, msg);
})
.on_error ((status, reason) => err (status, reason))
.exec ();
2018-05-22 12:47:25 +00:00
}
2018-04-14 12:09:06 +00:00
}