From ef878d73306c85496e5c0f9e5f020595667ece25 Mon Sep 17 00:00:00 2001 From: bleakgrey Date: Sat, 2 Jun 2018 11:37:28 +0300 Subject: [PATCH] Handle toot links in the app --- src/Views/AccountView.vala | 13 ++++++------- src/Views/StatusView.vala | 26 +++++++++++++++++++++++--- src/Widgets/RichLabel.vala | 7 ++++++- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/Views/AccountView.vala b/src/Views/AccountView.vala index 70aa331..196c87d 100644 --- a/src/Views/AccountView.vala +++ b/src/Views/AccountView.vala @@ -237,9 +237,9 @@ public class Tootle.AccountView : TimelineView { var url = "%s/api/v1/accounts/%lld".printf (Tootle.accounts.formal.instance, id); var msg = new Soup.Message("GET", url); msg.priority = Soup.MessagePriority.HIGH; - Tootle.network.queue(msg, (sess, mess) => { + network.queue (msg, (sess, mess) => { try{ - var root = Tootle.network.parse (mess); + var root = network.parse (mess); var acc = Account.parse (root); Tootle.window.open_view (new AccountView (acc)); } @@ -254,19 +254,18 @@ public class Tootle.AccountView : TimelineView { var url = "%s/api/v1/accounts/search?limit=1&q=%s".printf (Tootle.accounts.formal.instance, name); var msg = new Soup.Message("GET", url); msg.priority = Soup.MessagePriority.HIGH; - Tootle.network.queue(msg, (sess, mess) => { + network.queue (msg, (sess, mess) => { try{ - var node = Tootle.network.parse_array (mess).get_element (0); + var node = network.parse_array (mess).get_element (0); var object = node.get_object (); if (object != null){ var acc = Account.parse(object); - Tootle.window.open_view (new AccountView (acc)); + window.open_view (new AccountView (acc)); } else - warning ("No results found for account: "+name); //TODO: toast notifications + app.toast (_("User not found")); } catch (GLib.Error e) { - warning ("Can't update feed"); warning (e.message); } }); diff --git a/src/Views/StatusView.vala b/src/Views/StatusView.vala index a0fe03a..0950b12 100644 --- a/src/Views/StatusView.vala +++ b/src/Views/StatusView.vala @@ -33,7 +33,7 @@ public class Tootle.StatusView : AbstractView { public Soup.Message request_context (){ var url = "%s/api/v1/statuses/%lld/context".printf (Tootle.accounts.formal.instance, root_status.id); var msg = new Soup.Message("GET", url); - Tootle.network.queue(msg, (sess, mess) => { + network.queue (msg, (sess, mess) => { try{ var root = Tootle.network.parse (mess); @@ -65,6 +65,26 @@ public class Tootle.StatusView : AbstractView { return msg; } + public static void open_from_link (string q){ + var url = "%s/api/v1/search?q=%s&resolve=true".printf (accounts.formal.instance, q); + var msg = new Soup.Message("GET", url); + msg.priority = Soup.MessagePriority.HIGH; + network.queue (msg, (sess, mess) => { + try{ + var root = network.parse (mess); + var statuses = root.get_array_member ("statuses"); + var object = statuses.get_element (0).get_object (); + if (object != null){ + var st = Status.parse (object); + window.open_view (new StatusView (ref st)); + } + else + app.toast (_("Toot not found")); + } + catch (GLib.Error e) { + warning (e.message); + } + }); + } + } - - diff --git a/src/Widgets/RichLabel.vala b/src/Widgets/RichLabel.vala index 9cec8ec..45921fd 100644 --- a/src/Widgets/RichLabel.vala +++ b/src/Widgets/RichLabel.vala @@ -40,7 +40,12 @@ public class Tootle.RichLabel : Gtk.Label { if ("/@" in url){ var uri = new Soup.URI (url); var username = url.split("/@")[1]; - AccountView.open_from_name ("@" + username + "@" + uri.get_host ()); + + if ("/" in username) + StatusView.open_from_link (url); + else + AccountView.open_from_name ("@" + username + "@" + uri.get_host ()); + return true; }