Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/API/Account.vala
Original file line number Diff line number Diff line change
Expand Up @@ -119,4 +119,9 @@ public class Tuba.API.Account : Entity, Widgetizable {
}
}

public Account.empty (string t_id = "") {
Object (
id: t_id
);
}
}
29 changes: 28 additions & 1 deletion src/API/Entity.vala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ public class Tuba.Entity : GLib.Object, Widgetizable, Json.Serializable {
return true;
}

static bool is_spec_valid (ref ParamSpec spec) {
public static bool is_spec_valid (ref ParamSpec spec) {
return ParamFlags.WRITABLE in spec.flags;
}

Expand Down Expand Up @@ -178,4 +178,31 @@ public class Tuba.Entity : GLib.Object, Widgetizable, Json.Serializable {
return node;
}

public static bool des_map_string_string (out Value val, Json.Node node) {
var map = new Gee.HashMap<string, string> ();
if (!node.is_null ()) {
node.get_object ().foreach_member ((obj, t_key, t_node) => {
map.set (t_key, (string) t_node.get_string ());
});
}
val = map;
return true;
}

public static bool des_map (out Value val, Json.Node node, Type type) {
var map = new Gee.HashMap<string, Entity> ();
if (!node.is_null ()) {
node.get_object ().foreach_member ((obj, t_key, t_node) => {
try {
var t_obj = Entity.from_json (type, t_node);
map.set (t_key, t_obj);
} catch (Error e) {
warning (@"Error getting Entity from json: $(e.message)");
}
});
}
val = map;
return true;
}

}
144 changes: 144 additions & 0 deletions src/API/Misskey.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
public class Tuba.API.Misskey.JSON : Object {
public static Json.Builder get_app (string callback_url) {
var builder = new Json.Builder ();
builder.begin_object ();
builder.set_member_name ("name");
builder.add_string_value (Build.NAME);

builder.set_member_name ("description");
builder.add_string_value ("Browse the Fediverse");

builder.set_member_name ("permission");
builder.begin_array ();
builder.add_string_value ("write:user-groups");
builder.add_string_value ("read:user-groups");
builder.add_string_value ("read:page-likes");
builder.add_string_value ("write:page-likes");
builder.add_string_value ("write:pages");
builder.add_string_value ("read:pages");
builder.add_string_value ("write:votes");
builder.add_string_value ("write:reactions");
builder.add_string_value ("read:reactions");
builder.add_string_value ("write:notifications");
builder.add_string_value ("read:notifications");
builder.add_string_value ("write:notes");
builder.add_string_value ("write:mutes");
builder.add_string_value ("read:mutes");
builder.add_string_value ("read:account");
builder.add_string_value ("write:account");
builder.add_string_value ("read:blocks");
builder.add_string_value ("write:blocks");
builder.add_string_value ("read:drive");
builder.add_string_value ("write:drive");
builder.add_string_value ("read:favorites");
builder.add_string_value ("write:favorites");
builder.add_string_value ("read:following");
builder.add_string_value ("write:following");
builder.add_string_value ("read:messaging");
builder.add_string_value ("write:messaging");
builder.end_array ();

builder.set_member_name ("callbackUrl");
builder.add_string_value (callback_url);

builder.end_object ();

return builder;
}

public static Json.Builder get_session_generate (string secret) {
var builder = new Json.Builder ();
builder.begin_object ();

builder.set_member_name ("appSecret");
builder.add_string_value (secret);

builder.end_object ();

return builder;
}

public static Json.Builder get_session_userkey (string secret, string token) {
var builder = new Json.Builder ();
builder.begin_object ();

builder.set_member_name ("appSecret");
builder.add_string_value (secret);

builder.set_member_name ("token");
builder.add_string_value (token);

builder.end_object ();

return builder;
}

public static Json.Builder get_show_userid (string userid) {
var builder = new Json.Builder ();
builder.begin_object ();

builder.set_member_name ("userId");
builder.add_string_value (userid);

builder.end_object ();

return builder;
}

public static Json.Builder get_timeline (int limit = 20, string? userId = null) {
var builder = new Json.Builder ();
builder.begin_object ();

// builder.set_member_name ("i");
// builder.add_string_value (accounts.active.i);

builder.set_member_name ("limit");
builder.add_int_value (limit);

if (userId != null) {
builder.set_member_name ("userId");
builder.add_string_value (userId);
}

builder.end_object ();

return builder;
}

public static Json.Builder get_children (string noteId) {
var builder = new Json.Builder ();
builder.begin_object ();

// builder.set_member_name ("limit");
// builder.add_int_value (limit);

builder.set_member_name ("noteId");
builder.add_string_value (noteId);

builder.end_object ();

return builder;
}

public static Json.Builder get_delete_note (string noteId) {
var builder = new Json.Builder ();
builder.begin_object ();

builder.set_member_name ("noteId");
builder.add_string_value (noteId);

builder.end_object ();

return builder;
}
}

public class Tuba.API.Misskey.Utils : Object {
public static string generate_i (string secret, string access_token) {
string pre_c = @"$access_token$secret";
Checksum checksum = new Checksum (ChecksumType.SHA256);

checksum.update (pre_c.data, -1);
return checksum.get_string ();
}
}
5 changes: 5 additions & 0 deletions src/API/Misskey/AiChanify.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
public interface Tuba.API.Misskey.AiChanify : GLib.Object, Widgetizable {
public virtual Entity to_mastodon () throws Oopsie {
throw new Tuba.Oopsie.INTERNAL ("Ai Chan didn't provide a Mastodon entity!");
}
}
11 changes: 11 additions & 0 deletions src/API/Misskey/Bookmark.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
public class Tuba.API.Misskey.Bookmark : Entity, Widgetizable, AiChanify {
public API.Misskey.Note note { get; set; }

public override Entity to_mastodon () {
return note.to_mastodon ();
}

public override Gtk.Widget to_widget () {
return to_mastodon ().to_widget ();
}
}
4 changes: 4 additions & 0 deletions src/API/Misskey/Emoji.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
public class Tuba.API.Misskey.Emoji : Entity {
public string name { get; set; }
public string url { get; set; }
}
12 changes: 12 additions & 0 deletions src/API/Misskey/Favorite.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
public class Tuba.API.Misskey.Favorite : Entity, Widgetizable, AiChanify {
public string kind { get; set; }
public API.Misskey.Note note { get; set; }

public override Entity to_mastodon () {
return note.to_mastodon ();
}

public override Gtk.Widget to_widget () {
return to_mastodon ().to_widget ();
}
}
88 changes: 88 additions & 0 deletions src/API/Misskey/Note.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
public class Tuba.API.Misskey.Note : Entity, Widgetizable, Json.Serializable, AiChanify {
~Note () {
message (@"[OBJ] Destroyed $uri");
}

public string id { get; set; }
public string createdAt { get; set; default = ""; }
public string text { get; set; default = ""; }
public string? cw { get; set; default = null; }
public API.Misskey.User user { get; set; }
public string? replyId { get; set; default = null; }
public string visibility { get; set; default = settings.default_post_visibility; }
public Gee.ArrayList<string>? mentions { get; set; default = null; }
public Gee.ArrayList<string>? fileIds { get; set; default = null; }
// public API.Poll? poll { get; set; default = null; }
public Gee.ArrayList<API.Misskey.Emoji>? emojis { get; set; }
public Gee.HashMap<string, string>? reactions { get; set; default = null; }
public int64 renotesCount { get; set; default = 0; }
public int64 repliesCount { get; set; default = 0; }
public string uri { get; set; }
public string url { get; set; }
public API.Misskey.Note? renote { get; set; default = null; }

public static Note from (Json.Node node) throws Error {
return Entity.from_json (typeof (API.Misskey.Note), node) as API.Misskey.Note;
}

public override bool deserialize_property (string prop, out Value val, ParamSpec spec, Json.Node node) {
var success = default_deserialize_property (prop, out val, spec, node);

var type = spec.value_type;
if (val.type () == Type.INVALID) {
val.init (type);
spec.set_value_default (ref val);
type = spec.value_type;
}

if (type.is_a (typeof (Gee.ArrayList))) {
Type contains;

switch (prop) {
case "mentions":
return Entity.des_list_string (out val, node);
case "emojis":
contains = typeof (API.Misskey.Emoji);
break;
case "reactions":
return Entity.des_map_string_string (out val, node);
default:
contains = typeof (Entity);
break;
}
return des_list (out val, node, contains);
}

return success;
}

public override Entity to_mastodon () {
var masto_status = new API.Status.empty ();
masto_status.id = id;
masto_status.account = (API.Account) user.to_mastodon ();
masto_status.spoiler_text = cw;
masto_status.in_reply_to_id = replyId;
masto_status.content = text;
masto_status.replies_count = repliesCount;
masto_status.reblogs_count = renotesCount;
masto_status.visibility = visibility;
masto_status.uri = uri;
masto_status.created_at = createdAt;

if (renote != null) {
var reblog_status = renote.to_mastodon () as API.Status;

if (text == null && (fileIds == null || fileIds.size == 0)) {
masto_status.reblog = reblog_status;
} else {
masto_status.quote = reblog_status;
}
}

return masto_status;
}

public override Gtk.Widget to_widget () {
return to_mastodon ().to_widget ();
}
}
40 changes: 40 additions & 0 deletions src/API/Misskey/User.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
public class Tuba.API.Misskey.User : Entity, Widgetizable, AiChanify, Json.Serializable {
public string id { get; set; }
public string name { get; set; }
public string username { get; set; }
public string host { get; set; }
public string avatarUrl { get; set; }
public string description { get; set; }
public bool isLocked { get; set; }
public string url { get; set; }
public string createdAt { get; set; }
public string bannerUrl { get; set; }
public int64 followersCount { get; set; }
public int64 followingCount { get; set; }
public int64 notesCount { get; set; }

public static User from (Json.Node node) throws Error {
return Entity.from_json (typeof (API.Misskey.User), node) as API.Misskey.User;
}

public override Entity to_mastodon () {
var masto_acc = new API.Account.empty (id);
masto_acc.username = username;
masto_acc.acct = host != null ? @"$username@$host" : username;
masto_acc.note = description ?? "";
masto_acc.locked = isLocked;
masto_acc.header = bannerUrl;
masto_acc.avatar = avatarUrl;
masto_acc.url = url ?? @"$host/@$username";
masto_acc.followers_count = followersCount;
masto_acc.following_count = followingCount;
masto_acc.statuses_count = notesCount;
masto_acc.created_at = createdAt;

return masto_acc;
}

public override Gtk.Widget to_widget () {
return to_mastodon ().to_widget ();
}
}
8 changes: 8 additions & 0 deletions src/API/Misskey/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
sources += files(
'AiChanify.vala',
'Bookmark.vala',
'Favorite.vala',
'Emoji.vala',
'Note.vala',
'User.vala',
)
7 changes: 5 additions & 2 deletions src/API/Status.vala
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,10 @@ public class Tuba.API.Status : Entity, Widgetizable {
}

public Request annihilate () {
return new Request.DELETE (@"/api/v1/statuses/$id")
.with_account (accounts.active);
// return new Request.DELETE (@"/api/v1/statuses/$id")
// .with_account (accounts.active);
return new Request.POST ("/api/notes/delete")
.with_account (accounts.active)
.body_json (API.Misskey.JSON.get_delete_note (id));
}
}
2 changes: 2 additions & 0 deletions src/API/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ sources += files(
'Instance.vala',
'List.vala',
'Mention.vala',
'Misskey.vala',
'Notification.vala',
'PeerTube.vala',
'Pleroma.vala',
Expand All @@ -30,5 +31,6 @@ subdir('Account')
subdir('BookWyrm')
subdir('Funkwhale')
subdir('Instance')
subdir('Misskey')
subdir('PeerTube')
subdir('Status')
Loading