Merge branch 'develop' into dtluna/pleroma-feature/unfollow-activity
authorRoger Braun <roger@rogerbraun.net>
Sun, 7 May 2017 17:28:23 +0000 (19:28 +0200)
committerRoger Braun <roger@rogerbraun.net>
Sun, 7 May 2017 17:28:23 +0000 (19:28 +0200)
91 files changed:
.credo.exs [new file with mode: 0644]
TODO.txt
config/config.exs
config/test.exs
lib/pleroma/activity.ex
lib/pleroma/application.ex
lib/pleroma/object.ex
lib/pleroma/plugs/authentication_plug.ex
lib/pleroma/upload.ex
lib/pleroma/user.ex
lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/federator/federator.ex [new file with mode: 0644]
lib/pleroma/web/ostatus/activity_representer.ex
lib/pleroma/web/ostatus/feed_representer.ex
lib/pleroma/web/ostatus/ostatus.ex
lib/pleroma/web/ostatus/ostatus_controller.ex
lib/pleroma/web/ostatus/user_representer.ex
lib/pleroma/web/router.ex
lib/pleroma/web/salmon/salmon.ex
lib/pleroma/web/twitter_api/representers/activity_representer.ex
lib/pleroma/web/twitter_api/representers/user_representer.ex
lib/pleroma/web/twitter_api/twitter_api.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex
lib/pleroma/web/web.ex
lib/pleroma/web/web_finger/web_finger.ex
lib/pleroma/web/web_finger/web_finger_controller.ex
lib/pleroma/web/websub/websub.ex
lib/pleroma/web/websub/websub_client_subscription.ex [new file with mode: 0644]
lib/pleroma/web/websub/websub_controller.ex
lib/pleroma/web/xml/xml.ex [new file with mode: 0644]
lib/xml_builder.ex
mix.exs
mix.lock
priv/repo/migrations/20170423154511_add_fields_to_users.exs [new file with mode: 0644]
priv/repo/migrations/20170426154155_create_websub_client_subscription.exs [new file with mode: 0644]
priv/repo/migrations/20170427054757_add_user_and_hub.exs [new file with mode: 0644]
priv/repo/migrations/20170501124823_add_id_contraints_to_activities_and_objects.exs [new file with mode: 0644]
priv/repo/migrations/20170501133231_add_id_contraints_to_activities_and_objects_part_two.exs [new file with mode: 0644]
priv/repo/migrations/20170502083023_add_local_field_to_activities.exs [new file with mode: 0644]
priv/repo/migrations/20170506222027_add_unique_index_to_apid.exs [new file with mode: 0644]
test/activity_test.exs
test/fixtures/23211.atom [new file with mode: 0644]
test/fixtures/favorite.xml [new file with mode: 0644]
test/fixtures/favorite_with_local_note.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/http___gs.example.org_4040_index.php_user_1.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.atom [new file with mode: 0644]
test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/https___shitposter.club_notice_2827873.html [new file with mode: 0644]
test/fixtures/httpoison_mock/https___shitposter.club_user_1.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/https___social.heldscal.la_user_23211.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/https___social.heldscal.la_user_29191.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/nonexistant@social.heldscal.la.xml [new file with mode: 0644]
test/fixtures/httpoison_mock/shp@social.heldscal.la.xml [new file with mode: 0644]
test/fixtures/incoming_note_activity.xml [new file with mode: 0644]
test/fixtures/incoming_note_activity_answer.xml [new file with mode: 0644]
test/fixtures/incoming_reply_mastodon.xml [new file with mode: 0644]
test/fixtures/incoming_websub_gnusocial_attachments.xml [new file with mode: 0644]
test/fixtures/lambadalambda.atom [new file with mode: 0644]
test/fixtures/ostatus_incoming_post.xml [new file with mode: 0644]
test/fixtures/ostatus_incoming_reply.xml [new file with mode: 0644]
test/fixtures/private_key.pem [new file with mode: 0644]
test/fixtures/salmon2.xml [new file with mode: 0644]
test/fixtures/share-gs.xml [new file with mode: 0644]
test/fixtures/share.xml [new file with mode: 0644]
test/fixtures/user_full.xml [new file with mode: 0644]
test/fixtures/user_name_only.xml [new file with mode: 0644]
test/fixtures/webfinger.xml [new file with mode: 0644]
test/support/builders/activity_builder.ex
test/support/factory.ex
test/support/httpoison_mock.ex [new file with mode: 0644]
test/user_test.exs
test/web/activity_pub/activity_pub_test.exs
test/web/ostatus/activity_representer_test.exs
test/web/ostatus/feed_representer_test.exs
test/web/ostatus/ostatus_controller_test.exs
test/web/ostatus/ostatus_test.exs [new file with mode: 0644]
test/web/salmon/salmon_test.exs
test/web/twitter_api/representers/activity_representer_test.exs
test/web/twitter_api/representers/user_representer_test.exs
test/web/twitter_api/twitter_api_controller_test.exs
test/web/twitter_api/twitter_api_test.exs
test/web/web_finger/web_finger_test.exs
test/web/websub/websub_controller_test.exs
test/web/websub/websub_test.exs

diff --git a/.credo.exs b/.credo.exs
new file mode 100644 (file)
index 0000000..b1f2a61
--- /dev/null
@@ -0,0 +1,138 @@
+# This file contains the configuration for Credo and you are probably reading
+# this after creating it with `mix credo.gen.config`.
+#
+# If you find anything wrong or unclear in this file, please report an
+# issue on GitHub: https://github.com/rrrene/credo/issues
+#
+%{
+  #
+  # You can have as many configs as you like in the `configs:` field.
+  configs: [
+    %{
+      #
+      # Run any config using `mix credo -C <name>`. If no config name is given
+      # "default" is used.
+      name: "default",
+      #
+      # These are the files included in the analysis:
+      files: %{
+        #
+        # You can give explicit globs or simply directories.
+        # In the latter case `**/*.{ex,exs}` will be used.
+        included: ["lib/", "src/", "web/", "apps/"],
+        excluded: [~r"/_build/", ~r"/deps/"]
+      },
+      #
+      # If you create your own checks, you must specify the source files for
+      # them here, so they can be loaded by Credo before running the analysis.
+      requires: [],
+      #
+      # Credo automatically checks for updates, like e.g. Hex does.
+      # You can disable this behaviour below:
+      check_for_updates: true,
+      #
+      # If you want to enforce a style guide and need a more traditional linting
+      # experience, you can change `strict` to `true` below:
+      strict: false,
+      #
+      # If you want to use uncolored output by default, you can change `color`
+      # to `false` below:
+      color: true,
+      #
+      # You can customize the parameters of any check by adding a second element
+      # to the tuple.
+      #
+      # To disable a check put `false` as second element:
+      #
+      #     {Credo.Check.Design.DuplicatedCode, false}
+      #
+      checks: [
+        {Credo.Check.Consistency.ExceptionNames},
+        {Credo.Check.Consistency.LineEndings},
+        {Credo.Check.Consistency.MultiAliasImportRequireUse},
+        {Credo.Check.Consistency.ParameterPatternMatching},
+        {Credo.Check.Consistency.SpaceAroundOperators},
+        {Credo.Check.Consistency.SpaceInParentheses},
+        {Credo.Check.Consistency.TabsOrSpaces},
+
+        # For some checks, like AliasUsage, you can only customize the priority
+        # Priority values are: `low, normal, high, higher`
+        {Credo.Check.Design.AliasUsage, priority: :low},
+
+        # For others you can set parameters
+
+        # If you don't want the `setup` and `test` macro calls in ExUnit tests
+        # or the `schema` macro in Ecto schemas to trigger DuplicatedCode, just
+        # set the `excluded_macros` parameter to `[:schema, :setup, :test]`.
+        {Credo.Check.Design.DuplicatedCode, excluded_macros: []},
+
+        # You can also customize the exit_status of each check.
+        # If you don't want TODO comments to cause `mix credo` to fail, just
+        # set this value to 0 (zero).
+        {Credo.Check.Design.TagTODO, exit_status: 2},
+        {Credo.Check.Design.TagFIXME},
+
+        {Credo.Check.Readability.FunctionNames},
+        {Credo.Check.Readability.LargeNumbers},
+        {Credo.Check.Readability.MaxLineLength, priority: :low, max_length: 100},
+        {Credo.Check.Readability.ModuleAttributeNames},
+        {Credo.Check.Readability.ModuleDoc, false},
+        {Credo.Check.Readability.ModuleNames},
+        {Credo.Check.Readability.ParenthesesOnZeroArityDefs},
+        {Credo.Check.Readability.ParenthesesInCondition},
+        {Credo.Check.Readability.PredicateFunctionNames},
+        {Credo.Check.Readability.PreferImplicitTry},
+        {Credo.Check.Readability.RedundantBlankLines},
+        {Credo.Check.Readability.StringSigils},
+        {Credo.Check.Readability.TrailingBlankLine},
+        {Credo.Check.Readability.TrailingWhiteSpace},
+        {Credo.Check.Readability.VariableNames},
+        {Credo.Check.Readability.Semicolons},
+        {Credo.Check.Readability.SpaceAfterCommas},
+
+        {Credo.Check.Refactor.DoubleBooleanNegation},
+        {Credo.Check.Refactor.CondStatements},
+        {Credo.Check.Refactor.CyclomaticComplexity},
+        {Credo.Check.Refactor.FunctionArity},
+        {Credo.Check.Refactor.MatchInCondition},
+        {Credo.Check.Refactor.NegatedConditionsInUnless},
+        {Credo.Check.Refactor.NegatedConditionsWithElse},
+        {Credo.Check.Refactor.Nesting},
+        {Credo.Check.Refactor.PipeChainStart},
+        {Credo.Check.Refactor.UnlessWithElse},
+
+        {Credo.Check.Warning.BoolOperationOnSameValues},
+        {Credo.Check.Warning.IExPry},
+        {Credo.Check.Warning.IoInspect},
+        {Credo.Check.Warning.LazyLogging},
+        {Credo.Check.Warning.OperationOnSameValues},
+        {Credo.Check.Warning.OperationWithConstantResult},
+        {Credo.Check.Warning.UnusedEnumOperation},
+        {Credo.Check.Warning.UnusedFileOperation},
+        {Credo.Check.Warning.UnusedKeywordOperation},
+        {Credo.Check.Warning.UnusedListOperation},
+        {Credo.Check.Warning.UnusedPathOperation},
+        {Credo.Check.Warning.UnusedRegexOperation},
+        {Credo.Check.Warning.UnusedStringOperation},
+        {Credo.Check.Warning.UnusedTupleOperation},
+
+        # Controversial and experimental checks (opt-in, just remove `, false`)
+        #
+        {Credo.Check.Refactor.ABCSize, false},
+        {Credo.Check.Refactor.AppendSingleItem, false},
+        {Credo.Check.Refactor.VariableRebinding, false},
+        {Credo.Check.Warning.MapGetUnsafePass, false},
+
+        # Deprecated checks (these will be deleted after a grace period)
+        {Credo.Check.Readability.Specs, false},
+        {Credo.Check.Warning.NameRedeclarationByAssignment, false},
+        {Credo.Check.Warning.NameRedeclarationByCase, false},
+        {Credo.Check.Warning.NameRedeclarationByDef, false},
+        {Credo.Check.Warning.NameRedeclarationByFn, false},
+
+        # Custom checks can be created using `mix credo.gen.check`.
+        #
+      ]
+    }
+  ]
+}
index dd85c52392f0b001ff946b65a2e101579aad6410..304e95e779afde9f05948e35ba8a1ba572019d31 100644 (file)
--- a/TODO.txt
+++ b/TODO.txt
@@ -1,5 +1,9 @@
-- Add cache for user fetching / representing. (mostly in TwitterAPI.activity_to_status)
-
 Unliking:
 
 - Add a proper undo activity, find out how to ignore those in twitter api.
+
+WEBSUB:
+
+- Add unsubscription
+- Add periodical renewal
+
index 3826dddff24bf89ceeb7626ad4fb3a0281a745b4..8f6fe00fbf64382b3bb898044153b88f0e280810 100644 (file)
@@ -30,7 +30,9 @@ config :mime, :types, %{
   "application/xrd+xml" => ["xrd+xml"]
 }
 
-config :pleroma, :websub_verifier, Pleroma.Web.Websub
+config :pleroma, :websub, Pleroma.Web.Websub
+config :pleroma, :ostatus, Pleroma.Web.OStatus
+config :pleroma, :httpoison, HTTPoison
 
 # Import environment specific config. This must remain at the bottom
 # of this file so it overrides the configuration defined above.
index 5d91279a22ae32927b22760825d6d3e0b73d7e73..04136e1f23d1447bf94d278484c48c3110cfb74b 100644 (file)
@@ -25,4 +25,6 @@ config :pleroma, Pleroma.Repo,
 # Reduce hash rounds for testing
 config :comeonin, :pbkdf2_rounds, 1
 
-config :pleroma, :websub_verifier, Pleroma.Web.WebsubMock
+config :pleroma, :websub, Pleroma.Web.WebsubMock
+config :pleroma, :ostatus, Pleroma.Web.OStatusMock
+config :pleroma, :httpoison, HTTPoisonMock
index 46568bb13eb288d6322b145db776e5427aa5e9c8..d77c8899749a7dd16e568829e3a77340392afa31 100644 (file)
@@ -5,6 +5,7 @@ defmodule Pleroma.Activity do
 
   schema "activities" do
     field :data, :map
+    field :local, :boolean, default: true
 
     timestamps()
   end
@@ -18,4 +19,9 @@ defmodule Pleroma.Activity do
     Repo.all(from activity in Activity,
       where: fragment("? @> ?", activity.data, ^%{object: %{id: ap_id}}))
   end
+
+  def get_create_activity_by_object_ap_id(ap_id) do
+    Repo.one(from activity in Activity,
+      where: fragment("? @> ?", activity.data, ^%{type: "Create", object: %{id: ap_id}}))
+  end
 end
index 86b6c0c1ea59ca953d2a6e18e248f165273dacaa..1f0a055681cab7698c8f390d95cfd27ea44fb981 100644 (file)
@@ -15,10 +15,11 @@ defmodule Pleroma.Application do
       # Start your own worker by calling: Pleroma.Worker.start_link(arg1, arg2, arg3)
       # worker(Pleroma.Worker, [arg1, arg2, arg3]),
       worker(Cachex, [:user_cache, [
-                         default_ttl: 5000,
+                         default_ttl: 25000,
                          ttl_interval: 1000,
-                         limit: 500
-                       ]])
+                         limit: 2500
+                       ]]),
+      worker(Pleroma.Web.Federator, [])
     ]
 
     # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
index f932034d7b99b2b9b8b0a4c90054fba43f71fc7f..949ccb0f66e172a6b4bece0983e55ef20fa52b8d 100644 (file)
@@ -13,4 +13,24 @@ defmodule Pleroma.Object do
     Repo.one(from object in Object,
       where: fragment("? @> ?", object.data, ^%{id: ap_id}))
   end
+
+  def get_cached_by_ap_id(ap_id) do
+    if Mix.env == :test do
+      get_by_ap_id(ap_id)
+    else
+      key = "object:#{ap_id}"
+      Cachex.get!(:user_cache, key, fallback: fn(_) ->
+        object = get_by_ap_id(ap_id)
+        if object do
+          {:commit, object}
+        else
+          {:ignore, object}
+        end
+      end)
+    end
+  end
+
+  def context_mapping(context) do
+    %Object{data: %{"id" => context}}
+  end
 end
index a3317f432d5de1041b67e76ba754bfa3dc4c9073..d47c3fdae75e63deee1b7fda2e9693ac54e0f4d0 100644 (file)
@@ -1,4 +1,5 @@
 defmodule Pleroma.Plugs.AuthenticationPlug do
+  alias Comeonin.Pbkdf2
   import Plug.Conn
 
   def init(options) do
@@ -25,12 +26,12 @@ defmodule Pleroma.Plugs.AuthenticationPlug do
   end
 
   defp verify(nil, _password, _user_id) do
-    Comeonin.Pbkdf2.dummy_checkpw
+    Pbkdf2.dummy_checkpw
     :error
   end
 
   defp verify(user, password, _user_id) do
-    if Comeonin.Pbkdf2.checkpw(password, user.password_hash) do
+    if Pbkdf2.checkpw(password, user.password_hash) do
       {:ok, user}
     else
       :error
@@ -42,7 +43,7 @@ defmodule Pleroma.Plugs.AuthenticationPlug do
          {:ok, userinfo} <- Base.decode64(header),
          [username, password] <- String.split(userinfo, ":")
     do
-      { :ok, username, password }
+      {:ok, username, password}
     end
   end
 
index 3aabf81574714bf0721116856d2318e277b44efe..9275eff87b78a62196232565b024be61f35a42fe 100644 (file)
@@ -1,6 +1,8 @@
 defmodule Pleroma.Upload do
+  alias Ecto.UUID
+  alias Pleroma.Web
   def store(%Plug.Upload{} = file) do
-    uuid = Ecto.UUID.generate
+    uuid = UUID.generate
     upload_folder = Path.join(upload_path(), uuid)
     File.mkdir_p!(upload_folder)
     result_file = Path.join(upload_folder, file.filename)
@@ -21,7 +23,7 @@ defmodule Pleroma.Upload do
   def store(%{"img" => "data:image/" <> image_data}) do
     parsed = Regex.named_captures(~r/(?<filetype>jpeg|png|gif);base64,(?<data>.*)/, image_data)
     data = Base.decode64!(parsed["data"])
-    uuid = Ecto.UUID.generate
+    uuid = UUID.generate
     upload_folder = Path.join(upload_path(), uuid)
     File.mkdir_p!(upload_folder)
     filename = Base.encode16(:crypto.hash(:sha256, data)) <> ".#{parsed["filetype"]}"
@@ -44,11 +46,11 @@ defmodule Pleroma.Upload do
   end
 
   defp upload_path do
-    Application.get_env(:pleroma, Pleroma.Upload)
-    |> Keyword.fetch!(:uploads)
+    settings = Application.get_env(:pleroma, Pleroma.Upload)
+    Keyword.fetch!(settings, :uploads)
   end
 
   defp url_for(file) do
-    "#{Pleroma.Web.base_url()}/media/#{file}"
+    "#{Web.base_url()}/media/#{file}"
   end
 end
index e1a7befaa7f0f2e7ae20455c72298ae964c101bd..4510be77052129bdf32950d2903fe6847f9171e2 100644 (file)
@@ -1,8 +1,10 @@
 defmodule Pleroma.User do
   use Ecto.Schema
-  import Ecto.Changeset
-  import Ecto.Query
-  alias Pleroma.{Repo, User, Object}
+
+  import Ecto.{Changeset, Query}
+  alias Pleroma.{Repo, User, Object, Web}
+  alias Comeonin.Pbkdf2
+  alias Pleroma.Web.{OStatus, Websub}
   alias Pleroma.Web.ActivityPub.ActivityPub
 
   schema "users" do
@@ -13,9 +15,11 @@ defmodule Pleroma.User do
     field :password_hash, :string
     field :password, :string, virtual: true
     field :password_confirmation, :string, virtual: true
-    field :following, { :array, :string }, default: []
+    field :following, {:array, :string}, default: []
     field :ap_id, :string
     field :avatar, :map
+    field :local, :boolean, default: true
+    field :info, :map, default: %{}
 
     timestamps()
   end
@@ -28,7 +32,7 @@ defmodule Pleroma.User do
   end
 
   def ap_id(%User{nickname: nickname}) do
-    "#{Pleroma.Web.base_url}/users/#{nickname}"
+    "#{Web.base_url}/users/#{nickname}"
   end
 
   def ap_followers(%User{} = user) do
@@ -67,7 +71,7 @@ defmodule Pleroma.User do
     |> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
 
     if changeset.valid? do
-      hashed = Comeonin.Pbkdf2.hashpwsalt(changeset.changes[:password])
+      hashed = Pbkdf2.hashpwsalt(changeset.changes[:password])
       ap_id = User.ap_id(%User{nickname: changeset.changes[:nickname]})
       followers = User.ap_followers(%User{nickname: changeset.changes[:nickname]})
       changeset
@@ -82,9 +86,13 @@ defmodule Pleroma.User do
   def follow(%User{} = follower, %User{} = followed) do
     ap_followers = User.ap_followers(followed)
     if following?(follower, followed) do
-      { :error,
-        "Could not follow user: #{followed.nickname} is already on your list." }
+      {:error,
+       "Could not follow user: #{followed.nickname} is already on your list."}
     else
+      if !followed.local do
+        Websub.subscribe(follower, followed)
+      end
+
       following = [ap_followers | follower.following]
       |> Enum.uniq
 
@@ -105,7 +113,7 @@ defmodule Pleroma.User do
       |> Repo.update
       { :ok, follower, ActivityPub.fetch_latest_follow(follower, followed)}
     else
-      { :error, "Not subscribed!" }
+      {:error, "Not subscribed!"}
     end
   end
 
@@ -120,6 +128,27 @@ defmodule Pleroma.User do
 
   def get_cached_by_nickname(nickname) do
     key = "nickname:#{nickname}"
-    Cachex.get!(:user_cache, key, fallback: fn(_) -> Repo.get_by(User, nickname: nickname) end)
+    Cachex.get!(:user_cache, key, fallback: fn(_) -> get_or_fetch_by_nickname(nickname) end)
+  end
+
+  def get_by_nickname(nickname) do
+    Repo.get_by(User, nickname: nickname)
+  end
+
+  def get_cached_user_info(user) do
+    key = "user_info:#{user.id}"
+    Cachex.get!(:user_cache, key, fallback: fn(_) -> user_info(user) end)
+  end
+
+  def get_or_fetch_by_nickname(nickname) do
+    with %User{} = user <- get_by_nickname(nickname)  do
+      user
+    else _e ->
+      with [nick, domain] <- String.split(nickname, "@"),
+           {:ok, user} <- OStatus.make_user(nickname) do
+        user
+      else _e -> nil
+      end
+    end
   end
 end
index 5937ec88cf6e69189f1e8e22ea242b92ad2444f1..f3e94b1010c54f978af1ed088f0076ab8038da8a 100644 (file)
@@ -1,9 +1,9 @@
 defmodule Pleroma.Web.ActivityPub.ActivityPub do
-  alias Pleroma.Repo
-  alias Pleroma.{Activity, Object, Upload, User}
+  alias Pleroma.{Activity, Repo, Object, Upload, User, Web}
+  alias Ecto.{Changeset, UUID}
   import Ecto.Query
 
-  def insert(map) when is_map(map) do
+  def insert(map, local \\ true) when is_map(map) do
     map = map
     |> Map.put_new_lazy("id", &generate_activity_id/0)
     |> Map.put_new_lazy("published", &make_date/0)
@@ -16,10 +16,32 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
       map
     end
 
-    Repo.insert(%Activity{data: map})
+    Repo.insert(%Activity{data: map, local: local})
   end
 
-  def like(%User{ap_id: ap_id} = user, %Object{data: %{ "id" => id}} = object) do
+  def create(to, actor, context, object, additional \\ %{}, published \\ nil, local \\ true) do
+    published = published || make_date()
+
+    activity = %{
+      "type" => "Create",
+      "to" => to |> Enum.uniq,
+      "actor" => actor.ap_id,
+      "object" => object,
+      "published" => published,
+      "context" => context
+    }
+    |> Map.merge(additional)
+
+    with {:ok, activity} <- insert(activity, local) do
+      if actor.local do
+        Pleroma.Web.Federator.enqueue(:publish, activity)
+       end
+
+      {:ok, activity}
+    end
+  end
+
+  def like(%User{ap_id: ap_id} = user, %Object{data: %{"id" => id}} = object, local \\ true) do
     cond do
       # There's already a like here, so return the original activity.
       ap_id in (object.data["likes"] || []) ->
@@ -33,10 +55,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
           "type" => "Like",
           "actor" => ap_id,
           "object" => id,
-          "to" => [User.ap_followers(user), object.data["actor"]]
+          "to" => [User.ap_followers(user), object.data["actor"]],
+          "context" => object.data["context"]
         }
 
-        {:ok, activity} = insert(data)
+        {:ok, activity} = insert(data, local)
 
         likes = [ap_id | (object.data["likes"] || [])] |> Enum.uniq
 
@@ -44,11 +67,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
         |> Map.put("like_count", length(likes))
         |> Map.put("likes", likes)
 
-        changeset = Ecto.Changeset.change(object, data: new_data)
+        changeset = Changeset.change(object, data: new_data)
         {:ok, object} = Repo.update(changeset)
 
         update_object_in_activities(object)
 
+        if user.local do
+          Pleroma.Web.Federator.enqueue(:publish, activity)
+        end
+
         {:ok, activity, object}
     end
   end
@@ -58,7 +85,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
     relevant_activities = Activity.all_by_object_ap_id(id)
     Enum.map(relevant_activities, fn (activity) ->
       new_activity_data = activity.data |> Map.put("object", object.data)
-      changeset = Ecto.Changeset.change(activity, data: new_activity_data)
+      changeset = Changeset.change(activity, data: new_activity_data)
       Repo.update(changeset)
     end)
   end
@@ -79,7 +106,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
       |> Map.put("like_count", length(likes))
       |> Map.put("likes", likes)
 
-      changeset = Ecto.Changeset.change(object, data: new_data)
+      changeset = Changeset.change(object, data: new_data)
       {:ok, object} = Repo.update(changeset)
 
       update_object_in_activities(object)
@@ -99,11 +126,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
   end
 
   def generate_object_id do
-    generate_id("objects")
+    Pleroma.Web.Router.Helpers.o_status_url(Pleroma.Web.Endpoint, :object, Ecto.UUID.generate)
   end
 
   def generate_id(type) do
-    "#{Pleroma.Web.base_url()}/#{type}/#{Ecto.UUID.generate}"
+    "#{Web.base_url()}/#{type}/#{UUID.generate}"
   end
 
   def fetch_public_activities(opts \\ %{}) do
@@ -127,6 +154,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
     query = from activity in query,
       where: activity.id > ^since_id
 
+    query = if opts["local_only"] do
+      from activity in query, where: activity.local == true
+    else
+      query
+    end
+
     query = if opts["max_id"] do
       from activity in query, where: activity.id < ^opts["max_id"]
     else
@@ -140,19 +173,19 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
       query
     end
 
-    Repo.all(query)
-    |> Enum.reverse
+    Enum.reverse(Repo.all(query))
   end
 
-  def announce(%User{ap_id: ap_id} = user, %Object{data: %{"id" => id}} = object) do
+  def announce(%User{ap_id: ap_id} = user, %Object{data: %{"id" => id}} = object, local \\ true) do
     data = %{
       "type" => "Announce",
       "actor" => ap_id,
       "object" => id,
-      "to" => [User.ap_followers(user), object.data["actor"]]
+      "to" => [User.ap_followers(user), object.data["actor"]],
+      "context" => object.data["context"]
     }
 
-    {:ok, activity} = insert(data)
+    {:ok, activity} = insert(data, local)
 
     announcements = [ap_id | (object.data["announcements"] || [])] |> Enum.uniq
 
@@ -160,14 +193,56 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
     |> Map.put("announcement_count", length(announcements))
     |> Map.put("announcements", announcements)
 
-    changeset = Ecto.Changeset.change(object, data: new_data)
+    changeset = Changeset.change(object, data: new_data)
     {:ok, object} = Repo.update(changeset)
 
     update_object_in_activities(object)
 
+    if user.local do
+      Pleroma.Web.Federator.enqueue(:publish, activity)
+    end
+
     {:ok, activity, object}
   end
 
+  def follow(%User{ap_id: follower_id, local: actor_local}, %User{ap_id: followed_id}, local \\ true) do
+    data = %{
+      "type" => "Follow",
+      "actor" => follower_id,
+      "to" => [followed_id],
+      "object" => followed_id,
+      "published" => make_date()
+    }
+
+    with {:ok, activity} <- insert(data, local) do
+      if actor_local do
+        Pleroma.Web.Federator.enqueue(:publish, activity)
+       end
+
+      {:ok, activity}
+    end
+  end
+
+  def unfollow(follower, followed, local \\ true) do
+    with follow_activity when not is_nil(follow_activity) <- fetch_latest_follow(follower, followed) do
+      data = %{
+        "type" => "Undo",
+        "actor" => follower.ap_id,
+        "to" => [followed.ap_id],
+        "object" => follow_activity.data["id"],
+        "published" => make_date()
+      }
+
+      with {:ok, activity} <- insert(data, local) do
+        if follower.local do
+          Pleroma.Web.Federator.enqueue(:publish, activity)
+        end
+
+        {:ok, activity}
+      end
+    end
+  end
+
   def fetch_activities_for_context(context) do
     query = from activity in Activity,
       where: fragment("? @> ?", activity.data, ^%{ context: context })
diff --git a/lib/pleroma/web/federator/federator.ex b/lib/pleroma/web/federator/federator.ex
new file mode 100644 (file)
index 0000000..ab3313d
--- /dev/null
@@ -0,0 +1,77 @@
+defmodule Pleroma.Web.Federator do
+  use GenServer
+  alias Pleroma.User
+  alias Pleroma.Web.WebFinger
+  require Logger
+
+  @websub Application.get_env(:pleroma, :websub)
+  @ostatus Application.get_env(:pleroma, :ostatus)
+  @max_jobs 10
+
+  def start_link do
+    GenServer.start_link(__MODULE__, {:sets.new(), :queue.new()}, name: __MODULE__)
+  end
+
+  def handle(:publish, activity) do
+    Logger.debug(fn -> "Running publish for #{activity.data["id"]}" end)
+    with actor when not is_nil(actor) <- User.get_cached_by_ap_id(activity.data["actor"]) do
+      Logger.debug(fn -> "Sending #{activity.data["id"]} out via websub" end)
+      Pleroma.Web.Websub.publish(Pleroma.Web.OStatus.feed_path(actor), actor, activity)
+
+      {:ok, actor} = WebFinger.ensure_keys_present(actor)
+      Logger.debug(fn -> "Sending #{activity.data["id"]} out via salmon" end)
+      Pleroma.Web.Salmon.publish(actor, activity)
+    end
+  end
+
+  def handle(:verify_websub, websub) do
+    Logger.debug(fn -> "Running websub verification for #{websub.id} (#{websub.topic}, #{websub.callback})" end)
+    @websub.verify(websub)
+  end
+
+  def handle(:incoming_doc, doc) do
+    Logger.debug("Got document, trying to parse")
+    @ostatus.handle_incoming(doc)
+  end
+
+  def handle(type, payload) do
+    Logger.debug(fn -> "Unknown task: #{type}" end)
+    {:error, "Don't know what do do with this"}
+  end
+
+  def enqueue(type, payload) do
+    if Mix.env == :test do
+      handle(type, payload)
+    else
+      GenServer.cast(__MODULE__, {:enqueue, type, payload})
+    end
+  end
+
+  def maybe_start_job(running_jobs, queue) do
+    if (:sets.size(running_jobs) < @max_jobs) && !:queue.is_empty(queue) do
+      {{:value, {type, payload}}, queue} = :queue.out(queue)
+      {:ok, pid} = Task.start(fn -> handle(type, payload) end)
+      mref = Process.monitor(pid)
+      {:sets.add_element(mref, running_jobs), queue}
+    else
+      {running_jobs, queue}
+    end
+  end
+
+  def handle_cast({:enqueue, type, payload}, {running_jobs, queue}) do
+    queue = :queue.in({type, payload}, queue)
+    {running_jobs, queue} = maybe_start_job(running_jobs, queue)
+    {:noreply, {running_jobs, queue}}
+  end
+
+  def handle_info({:DOWN, ref, :process, _pid, _reason}, {running_jobs, queue}) do
+    running_jobs = :sets.del_element(ref, running_jobs)
+    {running_jobs, queue} = maybe_start_job(running_jobs, queue)
+    {:noreply, {running_jobs, queue}}
+  end
+
+  def handle_cast(m, state) do
+    IO.inspect("Unknown: #{inspect(m)}, #{inspect(state)}")
+    {:noreply, state}
+  end
+end
index 590abc8bbbad3cfc7135f6b9936466a2520671b1..02d15ea94a0bdc5c11bbc3f17571403be48fe0f2 100644 (file)
@@ -1,5 +1,31 @@
 defmodule Pleroma.Web.OStatus.ActivityRepresenter do
-  def to_simple_form(%{data: %{"object" => %{"type" => "Note"}}} = activity, user) do
+  alias Pleroma.{Activity, User}
+  alias Pleroma.Web.OStatus.UserRepresenter
+  require Logger
+
+  defp get_in_reply_to(%{"object" => %{"inReplyTo" => in_reply_to}}) do
+    [{:"thr:in-reply-to", [ref: to_charlist(in_reply_to)], []}]
+  end
+
+  defp get_in_reply_to(_), do: []
+
+  defp get_mentions(to) do
+    Enum.map(to, fn (id) ->
+      cond do
+        # Special handling for the AP/Ostatus public collections
+        "https://www.w3.org/ns/activitystreams#Public" == id ->
+          {:link, [rel: "mentioned", "ostatus:object-type": "http://activitystrea.ms/schema/1.0/collection", href: "http://activityschema.org/collection/public"], []}
+        # Ostatus doesn't handle follower collections, ignore these.
+        Regex.match?(~r/^#{Pleroma.Web.base_url}.+followers$/, id) ->
+          []
+        true ->
+          {:link, [rel: "mentioned", "ostatus:object-type": "http://activitystrea.ms/schema/1.0/person", href: id], []}
+      end
+    end)
+  end
+
+  def to_simple_form(activity, user, with_author \\ false)
+  def to_simple_form(%{data: %{"object" => %{"type" => "Note"}}} = activity, user, with_author) do
     h = fn(str) -> [to_charlist(str)] end
 
     updated_at = activity.updated_at
@@ -12,16 +38,155 @@ defmodule Pleroma.Web.OStatus.ActivityRepresenter do
       {:link, [rel: 'enclosure', href: to_charlist(url["href"]), type: to_charlist(url["mediaType"])], []}
     end)
 
+    in_reply_to = get_in_reply_to(activity.data)
+    author = if with_author, do: [{:author, UserRepresenter.to_simple_form(user)}], else: []
+    mentions = activity.data["to"] |> get_mentions
+
     [
       {:"activity:object-type", ['http://activitystrea.ms/schema/1.0/note']},
       {:"activity:verb", ['http://activitystrea.ms/schema/1.0/post']},
-      {:id, h.(activity.data["object"]["id"])},
+      {:id, h.(activity.data["object"]["id"])}, # For notes, federate the object id.
       {:title, ['New note by #{user.nickname}']},
       {:content, [type: 'html'], h.(activity.data["object"]["content"])},
       {:published, h.(inserted_at)},
-      {:updated, h.(updated_at)}
-    ] ++ attachments
+      {:updated, h.(updated_at)},
+      {:"ostatus:conversation", [], h.(activity.data["context"])},
+      {:link, [href: h.(activity.data["context"]), rel: 'ostatus:conversation'], []},
+      {:link, [type: ['application/atom+xml'], href: h.(activity.data["object"]["id"]), rel: 'self'], []}
+    ] ++ attachments ++ in_reply_to ++ author ++ mentions
+  end
+
+  def to_simple_form(%{data: %{"type" => "Like"}} = activity, user, with_author) do
+    h = fn(str) -> [to_charlist(str)] end
+
+    updated_at = activity.updated_at
+    |> NaiveDateTime.to_iso8601
+    inserted_at = activity.inserted_at
+    |> NaiveDateTime.to_iso8601
+
+    in_reply_to = get_in_reply_to(activity.data)
+    author = if with_author, do: [{:author, UserRepresenter.to_simple_form(user)}], else: []
+    mentions = activity.data["to"] |> get_mentions
+
+    [
+      {:"activity:verb", ['http://activitystrea.ms/schema/1.0/favorite']},
+      {:id, h.(activity.data["id"])},
+      {:title, ['New favorite by #{user.nickname}']},
+      {:content, [type: 'html'], ['#{user.nickname} favorited something']},
+      {:published, h.(inserted_at)},
+      {:updated, h.(updated_at)},
+      {:"activity:object", [
+        {:"activity:object-type", ['http://activitystrea.ms/schema/1.0/note']},
+        {:id, h.(activity.data["object"])}, # For notes, federate the object id.
+      ]},
+      {:"ostatus:conversation", [], h.(activity.data["context"])},
+      {:link, [href: h.(activity.data["context"]), rel: 'ostatus:conversation'], []},
+      {:link, [rel: 'self', type: ['application/atom+xml'], href: h.(activity.data["id"])], []},
+      {:"thr:in-reply-to", [ref: to_charlist(activity.data["object"])], []}
+    ] ++ author ++ mentions
+  end
+
+  def to_simple_form(%{data: %{"type" => "Announce"}} = activity, user, with_author) do
+    h = fn(str) -> [to_charlist(str)] end
+
+    updated_at = activity.updated_at
+    |> NaiveDateTime.to_iso8601
+    inserted_at = activity.inserted_at
+    |> NaiveDateTime.to_iso8601
+
+    in_reply_to = get_in_reply_to(activity.data)
+    author = if with_author, do: [{:author, UserRepresenter.to_simple_form(user)}], else: []
+
+    retweeted_activity = Activity.get_create_activity_by_object_ap_id(activity.data["object"])
+    retweeted_user = User.get_cached_by_ap_id(retweeted_activity.data["actor"])
+
+    retweeted_xml = to_simple_form(retweeted_activity, retweeted_user, true)
+
+    mentions = activity.data["to"] |> get_mentions
+    [
+      {:"activity:object-type", ['http://activitystrea.ms/schema/1.0/activity']},
+      {:"activity:verb", ['http://activitystrea.ms/schema/1.0/share']},
+      {:id, h.(activity.data["id"])},
+      {:title, ['#{user.nickname} repeated a notice']},
+      {:content, [type: 'html'], ['RT #{retweeted_activity.data["object"]["content"]}']},
+      {:published, h.(inserted_at)},
+      {:updated, h.(updated_at)},
+      {:"ostatus:conversation", [], h.(activity.data["context"])},
+      {:link, [href: h.(activity.data["context"]), rel: 'ostatus:conversation'], []},
+      {:link, [rel: 'self', type: ['application/atom+xml'], href: h.(activity.data["id"])], []},
+      {:"activity:object", retweeted_xml}
+    ] ++ mentions ++ author
+  end
+
+  def to_simple_form(%{data: %{"type" => "Follow"}} = activity, user, with_author) do
+    h = fn(str) -> [to_charlist(str)] end
+
+    updated_at = activity.updated_at
+    |> NaiveDateTime.to_iso8601
+    inserted_at = activity.inserted_at
+    |> NaiveDateTime.to_iso8601
+
+    author = if with_author, do: [{:author, UserRepresenter.to_simple_form(user)}], else: []
+
+    mentions = (activity.data["to"] || []) |> get_mentions
+    [
+      {:"activity:object-type", ['http://activitystrea.ms/schema/1.0/activity']},
+      {:"activity:verb", ['http://activitystrea.ms/schema/1.0/follow']},
+      {:id, h.(activity.data["id"])},
+      {:title, ['#{user.nickname} started following #{activity.data["object"]}']},
+      {:content, [type: 'html'], ['#{user.nickname} started following #{activity.data["object"]}']},
+      {:published, h.(inserted_at)},
+      {:updated, h.(updated_at)},
+      {:"activity:object", [
+        {:"activity:object-type", ['http://activitystrea.ms/schema/1.0/person']},
+        {:id, h.(activity.data["object"])},
+        {:uri, h.(activity.data["object"])},
+      ]},
+      {:link, [rel: 'self', type: ['application/atom+xml'], href: h.(activity.data["id"])], []},
+    ] ++ mentions ++ author
+  end
+
+  # Only undos of follow for now. Will need to get redone once there are more
+  def to_simple_form(%{data: %{"type" => "Undo"}} = activity, user, with_author) do
+    h = fn(str) -> [to_charlist(str)] end
+
+    updated_at = activity.updated_at
+    |> NaiveDateTime.to_iso8601
+    inserted_at = activity.inserted_at
+    |> NaiveDateTime.to_iso8601
+
+    author = if with_author, do: [{:author, UserRepresenter.to_simple_form(user)}], else: []
+    follow_activity = Activity.get_by_ap_id(activity.data["object"])
+
+    mentions = (activity.data["to"] || []) |> get_mentions
+    [
+      {:"activity:object-type", ['http://activitystrea.ms/schema/1.0/activity']},
+      {:"activity:verb", ['http://activitystrea.ms/schema/1.0/unfollow']},
+      {:id, h.(activity.data["id"])},
+      {:title, ['#{user.nickname} stopped following #{follow_activity.data["object"]}']},
+      {:content, [type: 'html'], ['#{user.nickname} stopped following #{follow_activity.data["object"]}']},
+      {:published, h.(inserted_at)},
+      {:updated, h.(updated_at)},
+      {:"activity:object", [
+        {:"activity:object-type", ['http://activitystrea.ms/schema/1.0/person']},
+        {:id, h.(follow_activity.data["object"])},
+        {:uri, h.(follow_activity.data["object"])},
+      ]},
+      {:link, [rel: 'self', type: ['application/atom+xml'], href: h.(activity.data["id"])], []},
+    ] ++ mentions ++ author
+  end
+
+  def wrap_with_entry(simple_form) do
+    [{
+      :entry, [
+        xmlns: 'http://www.w3.org/2005/Atom',
+        "xmlns:thr": 'http://purl.org/syndication/thread/1.0',
+        "xmlns:activity": 'http://activitystrea.ms/spec/1.0/',
+        "xmlns:poco": 'http://portablecontacts.net/spec/1.0',
+        "xmlns:ostatus": 'http://ostatus.org/schema/1.0'
+      ], simple_form
+    }]
   end
 
-  def to_simple_form(_,_), do: nil
+  def to_simple_form(_, _, _), do: nil
 end
index 14ac3ebf4786fccd6feef406820211a7fddb6cd8..6b67b8ddf4f15485440e2e6dfac7a190318f37f1 100644 (file)
@@ -8,7 +8,8 @@ defmodule Pleroma.Web.OStatus.FeedRepresenter do
 
     h = fn(str) -> [to_charlist(str)] end
 
-    entries = Enum.map(activities, fn(activity) ->
+    entries = activities
+    |> Enum.map(fn(activity) ->
       {:entry, ActivityRepresenter.to_simple_form(activity, user)}
     end)
     |> Enum.filter(fn ({_, form}) -> form end)
@@ -16,14 +17,17 @@ defmodule Pleroma.Web.OStatus.FeedRepresenter do
     [{
       :feed, [
         xmlns: 'http://www.w3.org/2005/Atom',
+        "xmlns:thr": 'http://purl.org/syndication/thread/1.0',
         "xmlns:activity": 'http://activitystrea.ms/spec/1.0/',
-        "xmlns:poco": 'http://portablecontacts.net/spec/1.0'
+        "xmlns:poco": 'http://portablecontacts.net/spec/1.0',
+        "xmlns:ostatus": 'http://ostatus.org/schema/1.0'
       ], [
         {:id, h.(OStatus.feed_path(user))},
         {:title, ['#{user.nickname}\'s timeline']},
         {:updated, h.(most_recent_update)},
         {:link, [rel: 'hub', href: h.(OStatus.pubsub_path(user))], []},
-        {:link, [rel: 'self', href: h.(OStatus.feed_path(user))], []},
+        {:link, [rel: 'salmon', href: h.(OStatus.salmon_path(user))], []},
+        {:link, [rel: 'self', href: h.(OStatus.feed_path(user)), type: 'application/atom+xml'], []},
         {:author, UserRepresenter.to_simple_form(user)},
       ] ++ entries
     }]
index d21b9078f4bc81799c7aee86e648de56171ab177..842ad0f0199abcd3bb071508a788c273ff634941 100644 (file)
@@ -1,5 +1,13 @@
 defmodule Pleroma.Web.OStatus do
-  alias Pleroma.Web
+  @httpoison Application.get_env(:pleroma, :httpoison)
+
+  import Ecto.Query
+  import Pleroma.Web.XML
+  require Logger
+
+  alias Pleroma.{Repo, User, Web, Object, Activity}
+  alias Pleroma.Web.ActivityPub.ActivityPub
+  alias Pleroma.Web.{WebFinger, Websub}
 
   def feed_path(user) do
     "#{user.ap_id}/feed.atom"
@@ -9,6 +17,268 @@ defmodule Pleroma.Web.OStatus do
     "#{Web.base_url}/push/hub/#{user.nickname}"
   end
 
-  def user_path(user) do
+  def salmon_path(user) do
+    "#{user.ap_id}/salmon"
+  end
+
+  def handle_incoming(xml_string) do
+    doc = parse_document(xml_string)
+    entries = :xmerl_xpath.string('//entry', doc)
+
+    activities = Enum.map(entries, fn (entry) ->
+      {:xmlObj, :string, object_type} = :xmerl_xpath.string('string(/entry/activity:object-type[1])', entry)
+      {:xmlObj, :string, verb} = :xmerl_xpath.string('string(/entry/activity:verb[1])', entry)
+
+      case verb do
+        'http://activitystrea.ms/schema/1.0/share' ->
+          with {:ok, activity, retweeted_activity} <- handle_share(entry, doc), do: [activity, retweeted_activity]
+        'http://activitystrea.ms/schema/1.0/favorite' ->
+          with {:ok, activity, favorited_activity} <- handle_favorite(entry, doc), do: [activity, favorited_activity]
+        _ ->
+          case object_type do
+            'http://activitystrea.ms/schema/1.0/note' ->
+              with {:ok, activity} <- handle_note(entry, doc), do: activity
+            'http://activitystrea.ms/schema/1.0/comment' ->
+              with {:ok, activity} <- handle_note(entry, doc), do: activity
+            _ ->
+              Logger.error("Couldn't parse incoming document")
+              nil
+          end
+      end
+    end)
+    {:ok, activities}
+  end
+
+  def make_share(_entry, doc, retweeted_activity) do
+    with {:ok, actor} <- find_make_or_update_user(doc),
+         %Object{} = object <- Object.get_cached_by_ap_id(retweeted_activity.data["object"]["id"]),
+         {:ok, activity, _object} = ActivityPub.announce(actor, object, false) do
+      {:ok, activity}
+    end
+  end
+
+  def handle_share(entry, doc) do
+    with [object] <- :xmerl_xpath.string('/entry/activity:object', entry),
+         {:ok, retweeted_activity} <-  handle_note(object, object),
+         {:ok, activity} <- make_share(entry, doc, retweeted_activity) do
+      {:ok, activity, retweeted_activity}
+    else
+      e -> {:error, e}
+    end
+  end
+
+  def make_favorite(_entry, doc, favorited_activity) do
+    with {:ok, actor} <- find_make_or_update_user(doc),
+         %Object{} = object <- Object.get_cached_by_ap_id(favorited_activity.data["object"]["id"]),
+         {:ok, activity, _object} = ActivityPub.like(actor, object, false) do
+      {:ok, activity}
+    end
+  end
+
+  def get_or_try_fetching(entry) do
+    with id when not is_nil(id) <- string_from_xpath("//activity:object[1]/id", entry),
+         %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id) do
+      {:ok, activity}
+    else _e ->
+        with href when not is_nil(href) <- string_from_xpath("//activity:object[1]/link[@type=\"text/html\"]/@href", entry),
+             {:ok, [favorited_activity]} <- fetch_activity_from_html_url(href) do
+          {:ok, favorited_activity}
+        end
+    end
+  end
+
+  def handle_favorite(entry, doc) do
+    with {:ok, favorited_activity} <- get_or_try_fetching(entry),
+         {:ok, activity} <- make_favorite(entry, doc, favorited_activity) do
+      {:ok, activity, favorited_activity}
+    else
+      e -> {:error, e}
+    end
+  end
+
+  def get_attachments(entry) do
+    :xmerl_xpath.string('/entry/link[@rel="enclosure"]', entry)
+    |> Enum.map(fn (enclosure) ->
+      with href when not is_nil(href) <- string_from_xpath("/link/@href", enclosure),
+           type when not is_nil(type) <- string_from_xpath("/link/@type", enclosure) do
+        %{
+          "type" => "Attachment",
+          "url" => [%{
+                       "type" => "Link",
+                       "mediaType" => type,
+                       "href" => href
+                    }]
+        }
+      end
+    end)
+    |> Enum.filter(&(&1))
+  end
+
+  def handle_note(entry, doc \\ nil) do
+    content_html = string_from_xpath("//content[1]", entry)
+
+    [author] = :xmerl_xpath.string('//author[1]', doc)
+    {:ok, actor} = find_make_or_update_user(author)
+    inReplyTo = string_from_xpath("//thr:in-reply-to[1]/@ref", entry)
+
+    if !Object.get_cached_by_ap_id(inReplyTo) do
+      inReplyToHref = string_from_xpath("//thr:in-reply-to[1]/@href", entry)
+      if inReplyToHref do
+        fetch_activity_from_html_url(inReplyToHref)
+      end
+    end
+
+    context = (string_from_xpath("//ostatus:conversation[1]", entry) || "") |> String.trim
+
+    attachments = get_attachments(entry)
+
+    context = with %{data: %{"context" => context}} <- Object.get_cached_by_ap_id(inReplyTo) do
+                context
+              else _e ->
+                if String.length(context) > 0 do
+                  context
+                else
+                  ActivityPub.generate_context_id
+                end
+              end
+
+    to = [
+      "https://www.w3.org/ns/activitystreams#Public",
+      User.ap_followers(actor)
+    ]
+
+    mentions = :xmerl_xpath.string('//link[@rel="mentioned" and @ostatus:object-type="http://activitystrea.ms/schema/1.0/person"]', entry)
+    |> Enum.map(fn(person) -> string_from_xpath("@href", person) end)
+
+    to = to ++ mentions
+
+    date = string_from_xpath("//published", entry)
+    id = string_from_xpath("//id", entry)
+
+    object = %{
+      "id" => id,
+      "type" => "Note",
+      "to" => to,
+      "content" => content_html,
+      "published" => date,
+      "context" => context,
+      "actor" => actor.ap_id,
+      "attachment" => attachments
+    }
+
+    object = if inReplyTo do
+      Map.put(object, "inReplyTo", inReplyTo)
+    else
+      object
+    end
+
+    # TODO: Bail out sooner and use transaction.
+    if Object.get_by_ap_id(id) do
+      {:error, "duplicate activity"}
+    else
+      ActivityPub.create(to, actor, context, object, %{}, date, false)
+    end
+  end
+
+  def find_make_or_update_user(doc) do
+    uri = string_from_xpath("//author/uri[1]", doc)
+    with {:ok, user} <- find_or_make_user(uri) do
+      avatar = make_avatar_object(doc)
+      if !user.local && user.avatar != avatar do
+        change = Ecto.Changeset.change(user, %{avatar: avatar})
+        Repo.update(change)
+      else
+        {:ok, user}
+      end
+    end
+  end
+
+  def find_or_make_user(uri) do
+    query = from user in User,
+      where: user.ap_id == ^uri
+
+    user = Repo.one(query)
+
+    if is_nil(user) do
+      make_user(uri)
+    else
+      {:ok, user}
+    end
+  end
+
+  def make_user(uri) do
+    with {:ok, info} <- gather_user_info(uri) do
+      data = %{
+        local: false,
+        name: info["name"],
+        nickname: info["nickname"] <> "@" <> info["host"],
+        ap_id: info["uri"],
+        info: info,
+        avatar: info["avatar"]
+      }
+      # TODO: Make remote user changeset
+      # SHould enforce fqn nickname
+      Repo.insert(Ecto.Changeset.change(%User{}, data))
+    end
+  end
+
+  # TODO: Just takes the first one for now.
+  def make_avatar_object(author_doc) do
+    href = string_from_xpath("//author[1]/link[@rel=\"avatar\"]/@href", author_doc)
+    type = string_from_xpath("//author[1]/link[@rel=\"avatar\"]/@type", author_doc)
+
+    if href do
+      %{
+        "type" => "Image",
+        "url" =>
+          [%{
+              "type" => "Link",
+              "mediaType" => type,
+              "href" => href
+           }]
+      }
+    else
+      nil
+    end
+  end
+
+  def gather_user_info(username) do
+    with {:ok, webfinger_data} <- WebFinger.finger(username),
+         {:ok, feed_data} <- Websub.gather_feed_data(webfinger_data["topic"]) do
+      {:ok, Map.merge(webfinger_data, feed_data) |> Map.put("fqn", username)}
+    else e ->
+      Logger.debug(fn -> "Couldn't gather info for #{username}" end)
+      {:error, e}
+    end
+  end
+
+  # Regex-based 'parsing' so we don't have to pull in a full html parser
+  # It's a hack anyway. Maybe revisit this in the future
+  @mastodon_regex ~r/<link href='(.*)' rel='alternate' type='application\/atom\+xml'>/
+  @gs_regex ~r/<link title=.* href="(.*)" type="application\/atom\+xml" rel="alternate">/
+  @gs_classic_regex ~r/<link rel="alternate" href="(.*)" type="application\/atom\+xml" title=.*>/
+  def get_atom_url(body) do
+    cond do
+      Regex.match?(@mastodon_regex, body) ->
+        [[_, match]] = Regex.scan(@mastodon_regex, body)
+        {:ok, match}
+      Regex.match?(@gs_regex, body) ->
+        [[_, match]] = Regex.scan(@gs_regex, body)
+        {:ok, match}
+      Regex.match?(@gs_classic_regex, body) ->
+        [[_, match]] = Regex.scan(@gs_classic_regex, body)
+        {:ok, match}
+      true ->
+        Logger.debug(fn -> "Couldn't find atom link in #{inspect(body)}" end)
+        {:error, "Couldn't find the atom link"}
+    end
+  end
+
+  def fetch_activity_from_html_url(url) do
+    with {:ok, %{body: body}} <- @httpoison.get(url, [], follow_redirect: true),
+         {:ok, atom_url} <- get_atom_url(body),
+         {:ok, %{status_code: code, body: body}} when code in 200..299 <- @httpoison.get(atom_url, [], follow_redirect: true) do
+      handle_incoming(body)
+    end
   end
 end
index 3c8d8c0f11e665c60366435620bb3573cb98d499..e6822463d534a1a44d20e1bdbb9f3153d3f8c29a 100644 (file)
@@ -2,10 +2,16 @@ defmodule Pleroma.Web.OStatus.OStatusController do
   use Pleroma.Web, :controller
 
   alias Pleroma.{User, Activity}
-  alias Pleroma.Web.OStatus.FeedRepresenter
+  alias Pleroma.Web.OStatus.{FeedRepresenter, ActivityRepresenter}
   alias Pleroma.Repo
+  alias Pleroma.Web.{OStatus, Federator}
   import Ecto.Query
 
+  def feed_redirect(conn, %{"nickname" => nickname}) do
+    user = User.get_cached_by_nickname(nickname)
+    redirect conn, external: OStatus.feed_path(user)
+  end
+
   def feed(conn, %{"nickname" => nickname}) do
     user = User.get_cached_by_nickname(nickname)
     query = from activity in Activity,
@@ -16,7 +22,8 @@ defmodule Pleroma.Web.OStatus.OStatusController do
     activities = query
     |> Repo.all
 
-    response = FeedRepresenter.to_simple_form(user, activities, [user])
+    response = user
+    |> FeedRepresenter.to_simple_form(activities, [user])
     |> :xmerl.export_simple(:xmerl_xml)
     |> to_string
 
@@ -25,7 +32,30 @@ defmodule Pleroma.Web.OStatus.OStatusController do
     |> send_resp(200, response)
   end
 
-  def temp(conn, params) do
-    IO.inspect(params)
+  def salmon_incoming(conn, params) do
+    {:ok, body, _conn} = read_body(conn)
+    {:ok, magic_key} = Pleroma.Web.Salmon.fetch_magic_key(body)
+    {:ok, doc} = Pleroma.Web.Salmon.decode_and_validate(magic_key, body)
+
+    Federator.enqueue(:incoming_doc, doc)
+
+    conn
+    |> send_resp(200, "")
+  end
+
+  def object(conn, %{"uuid" => uuid}) do
+    id = o_status_url(conn, :object, uuid)
+    activity = Activity.get_create_activity_by_object_ap_id(id)
+    user = User.get_cached_by_ap_id(activity.data["actor"])
+
+    response = activity
+    |> ActivityRepresenter.to_simple_form(user, true)
+    |> ActivityRepresenter.wrap_with_entry
+    |> :xmerl.export_simple(:xmerl_xml)
+    |> to_string
+
+    conn
+    |> put_resp_content_type("application/atom+xml")
+    |> send_resp(200, response)
   end
 end
index 65dfc5643b983eb194137ec85b3fbda81284ed10..273d7524a8795fbe0c545500788e15f6c9df31ed 100644 (file)
@@ -7,14 +7,14 @@ defmodule Pleroma.Web.OStatus.UserRepresenter do
     bio = to_charlist(user.bio)
     avatar_url = to_charlist(User.avatar_url(user))
     [
-      { :id, [ap_id] },
-      { :"activity:object", ['http://activitystrea.ms/schema/1.0/person'] },
-      { :uri, [ap_id] },
-      { :"poco:preferredUsername", [nickname] },
-      { :"poco:displayName", [name] },
-      { :"poco:note", [bio] },
-      { :name, [nickname] },
-      { :link, [rel: 'avatar', href: avatar_url], []}
+      {:id, [ap_id]},
+      {:"activity:object", ['http://activitystrea.ms/schema/1.0/person']},
+      {:uri, [ap_id]},
+      {:"poco:preferredUsername", [nickname]},
+      {:"poco:displayName", [name]},
+      {:"poco:note", [bio]},
+      {:name, [nickname]},
+      {:link, [rel: 'avatar', href: avatar_url], []}
     ]
   end
 end
index a4f13c879b6746eea9accef186c95bffcde96f62..50a3934d6a8f8380daa6c233366add4e415bad05 100644 (file)
@@ -1,7 +1,7 @@
 defmodule Pleroma.Web.Router do
   use Pleroma.Web, :router
 
-  alias Pleroma.{Repo, User}
+  alias Pleroma.{Repo, User, Web.Router}
 
   def user_fetcher(username) do
     {:ok, Repo.get_by(User, %{nickname: username})}
@@ -10,13 +10,13 @@ defmodule Pleroma.Web.Router do
   pipeline :api do
     plug :accepts, ["json"]
     plug :fetch_session
-    plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Pleroma.Web.Router.user_fetcher/1, optional: true}
+    plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true}
   end
 
   pipeline :authenticated_api do
     plug :accepts, ["json"]
     plug :fetch_session
-    plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Pleroma.Web.Router.user_fetcher/1}
+    plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1}
   end
 
   pipeline :well_known do
@@ -30,7 +30,8 @@ defmodule Pleroma.Web.Router do
     get "/statusnet/config", TwitterAPI.Controller, :config
 
     get "/statuses/public_timeline", TwitterAPI.Controller, :public_timeline
-    get "/statuses/public_and_external_timeline", TwitterAPI.Controller, :public_timeline
+    get "/statuses/public_and_external_timeline", TwitterAPI.Controller, :public_and_external_timeline
+    get "/statuses/networkpublic_timeline", TwitterAPI.Controller, :public_and_external_timeline
     get "/statuses/user_timeline", TwitterAPI.Controller, :user_timeline
 
     get "/statuses/show/:id", TwitterAPI.Controller, :fetch_status
@@ -73,8 +74,14 @@ defmodule Pleroma.Web.Router do
   scope "/", Pleroma.Web do
     pipe_through :ostatus
 
+    get "/objects/:uuid", OStatus.OStatusController, :object
+
     get "/users/:nickname/feed", OStatus.OStatusController, :feed
+    get "/users/:nickname", OStatus.OStatusController, :feed_redirect
+    post "/users/:nickname/salmon", OStatus.OStatusController, :salmon_incoming
     post "/push/hub/:nickname", Websub.WebsubController, :websub_subscription_request
+    get "/push/subscriptions/:id", Websub.WebsubController, :websub_subscription_confirmation
+    post "/push/subscriptions/:id", Websub.WebsubController, :websub_incoming
   end
 
   scope "/.well-known", Pleroma.Web do
@@ -92,5 +99,5 @@ end
 
 defmodule Fallback.RedirectController do
   use Pleroma.Web, :controller
-  def redirector(conn, _params), do: send_file(conn, 200, "priv/static/index.html")
+  def redirector(conn, _params), do: (if Mix.env != :test, do: send_file(conn, 200, "priv/static/index.html"))
 end
index 3881f2758e0b82bcf2aff11983df6ce175bc8696..b4f81b4edfdf41a7e80472f431b77a1e78bc71ac 100644 (file)
@@ -1,8 +1,14 @@
 defmodule Pleroma.Web.Salmon do
+  @httpoison Application.get_env(:pleroma, :httpoison)
+
   use Bitwise
+  alias Pleroma.Web.XML
+  alias Pleroma.Web.OStatus.ActivityRepresenter
+  alias Pleroma.User
+  require Logger
 
   def decode(salmon) do
-    {doc, _rest} = :xmerl_scan.string(to_charlist(salmon))
+    doc = XML.parse_document(salmon)
 
     {:xmlObj, :string, data} = :xmerl_xpath.string('string(//me:data[1])', doc)
     {:xmlObj, :string, sig} = :xmerl_xpath.string('string(//me:sig[1])', doc)
@@ -10,7 +16,6 @@ defmodule Pleroma.Web.Salmon do
     {:xmlObj, :string, encoding} = :xmerl_xpath.string('string(//me:encoding[1])', doc)
     {:xmlObj, :string, type} = :xmerl_xpath.string('string(//me:data[1]/@type)', doc)
 
-
     {:ok, data} = Base.url_decode64(to_string(data), ignore: :whitespace)
     {:ok, sig} = Base.url_decode64(to_string(sig), ignore: :whitespace)
     alg = to_string(alg)
@@ -21,22 +26,12 @@ defmodule Pleroma.Web.Salmon do
   end
 
   def fetch_magic_key(salmon) do
-    [data, _, _, _, _] = decode(salmon)
-    {doc, _rest} = :xmerl_scan.string(to_charlist(data))
-    {:xmlObj, :string, uri} = :xmerl_xpath.string('string(//author[1]/uri)', doc)
-
-    uri = to_string(uri)
-    base = URI.parse(uri).host
-
-    # TODO: Find out if this endpoint is mandated by the standard.
-    {:ok, response} = HTTPoison.get(base <> "/.well-known/webfinger", ["Accept": "application/xrd+xml"], [params: [resource: uri]])
-
-    {doc, _rest} = :xmerl_scan.string(to_charlist(response.body))
-
-    {:xmlObj, :string, magickey} = :xmerl_xpath.string('string(//Link[@rel="magic-public-key"]/@href)', doc)
-    "data:application/magic-public-key," <> magickey = to_string(magickey)
-
-    magickey
+    with [data, _, _, _, _] <- decode(salmon),
+         doc <- XML.parse_document(data),
+         uri when not is_nil(uri) <- XML.string_from_xpath("/entry/author[1]/uri", doc),
+         {:ok, %{info: %{"magic_key" => magic_key}}} <- Pleroma.Web.OStatus.find_or_make_user(uri) do
+      {:ok, magic_key}
+    end
   end
 
   def decode_and_validate(magickey, salmon) do
@@ -57,7 +52,7 @@ defmodule Pleroma.Web.Salmon do
     end
   end
 
-  defp decode_key("RSA." <> magickey) do
+  def decode_key("RSA." <> magickey) do
     make_integer = fn(bin) ->
       list = :erlang.binary_to_list(bin)
       Enum.reduce(list, 0, fn (el, acc) -> (acc <<< 8) ||| el end)
@@ -70,4 +65,98 @@ defmodule Pleroma.Web.Salmon do
 
     {:RSAPublicKey, modulus, exponent}
   end
+
+  def encode_key({:RSAPublicKey, modulus, exponent}) do
+    modulus_enc = :binary.encode_unsigned(modulus) |> Base.url_encode64
+    exponent_enc = :binary.encode_unsigned(exponent) |> Base.url_encode64
+
+    "RSA.#{modulus_enc}.#{exponent_enc}"
+  end
+
+  def generate_rsa_pem do
+    port = Port.open({:spawn, "openssl genrsa"}, [:binary])
+    {:ok, pem} = receive do
+      {^port, {:data, pem}} -> {:ok, pem}
+    end
+    Port.close(port)
+    if Regex.match?(~r/RSA PRIVATE KEY/, pem) do
+      {:ok, pem}
+    else
+      :error
+    end
+  end
+
+  def keys_from_pem(pem) do
+    [private_key_code] = :public_key.pem_decode(pem)
+    private_key = :public_key.pem_entry_decode(private_key_code)
+    {:RSAPrivateKey, _, modulus, exponent, _, _, _, _, _, _, _} = private_key
+    public_key = {:RSAPublicKey, modulus, exponent}
+    {:ok, private_key, public_key}
+  end
+
+  def encode(private_key, doc) do
+    type = "application/atom+xml"
+    encoding = "base64url"
+    alg = "RSA-SHA256"
+
+    signed_text = [doc, type, encoding, alg]
+    |> Enum.map(&Base.url_encode64/1)
+    |> Enum.join(".")
+
+    signature = signed_text
+    |> :public_key.sign(:sha256, private_key)
+    |> to_string
+    |> Base.url_encode64
+
+    doc_base64 = doc
+    |> Base.url_encode64
+
+    # Don't need proper xml building, these strings are safe to leave unescaped
+    salmon = """
+    <?xml version="1.0" encoding="UTF-8"?>
+    <me:env xmlns:me="http://salmon-protocol.org/ns/magic-env">
+      <me:data type="application/atom+xml">#{doc_base64}</me:data>
+      <me:encoding>#{encoding}</me:encoding>
+      <me:alg>#{alg}</me:alg>
+      <me:sig>#{signature}</me:sig>
+    </me:env>
+    """
+
+    {:ok, salmon}
+  end
+
+  def remote_users(%{data: %{"to" => to}}) do
+    to
+    |> Enum.map(fn(id) -> User.get_cached_by_ap_id(id) end)
+    |> Enum.filter(fn(user) -> user && !user.local end)
+  end
+
+  defp send_to_user(%{info: %{"salmon" => salmon}}, feed, poster) do
+    poster.(salmon, feed, [{"Content-Type", "application/magic-envelope+xml"}])
+  end
+
+  defp send_to_user(_,_,_), do: nil
+
+  def publish(user, activity, poster \\ &@httpoison.post/3)
+  def publish(%{info: %{"keys" => keys}} = user, activity, poster) do
+    feed = ActivityRepresenter.to_simple_form(activity, user, true)
+    |> ActivityRepresenter.wrap_with_entry
+    |> :xmerl.export_simple(:xmerl_xml)
+    |> to_string
+
+    if feed do
+      {:ok, private, _} = keys_from_pem(keys)
+      {:ok, feed} = encode(private, feed)
+
+      remote_users(activity)
+      |> Enum.each(fn(remote_user) ->
+        Task.start(fn ->
+          Logger.debug(fn -> "sending salmon to #{remote_user.ap_id}" end)
+          send_to_user(remote_user, feed, poster)
+        end)
+      end)
+    end
+  end
+
+  def publish(%{id: id}, _, _), do: Logger.debug(fn -> "Keys missing for user #{id}" end)
 end
index f2bf93abb26c5ba84879bc653aa36144dd6a7b1d..affd435771e28d4f792d933b6041cd1bdbe58994 100644 (file)
@@ -1,17 +1,19 @@
 defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
   use Pleroma.Web.TwitterAPI.Representers.BaseRepresenter
   alias Pleroma.Web.TwitterAPI.Representers.{UserRepresenter, ObjectRepresenter}
-  alias Pleroma.Activity
-
+  alias Pleroma.{Activity, User}
+  alias Calendar.Strftime
+  alias Pleroma.Web.TwitterAPI.TwitterAPI
+  alias Pleroma.Wi
 
   defp user_by_ap_id(user_list, ap_id) do
     Enum.find(user_list, fn (%{ap_id: user_id}) -> ap_id == user_id end)
   end
 
-  def to_map(%Activity{data: %{"type" => "Announce", "actor" => actor}} = activity, %{users: users, announced_activity: announced_activity} = opts) do
+  def to_map(%Activity{data: %{"type" => "Announce", "actor" => actor, "published" => created_at}} = activity,
+             %{users: users, announced_activity: announced_activity} = opts) do
     user = user_by_ap_id(users, actor)
-    created_at = get_in(activity.data, ["published"])
-    |> date_to_asctime
+    created_at = created_at |> date_to_asctime
 
     text = "#{user.nickname} retweeted a status."
 
@@ -26,20 +28,21 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
       "is_post_verb" => false,
       "uri" => "tag:#{activity.data["id"]}:objectType=note",
       "created_at" => created_at,
-      "retweeted_status" => retweeted_status
+      "retweeted_status" => retweeted_status,
+      "statusnet_conversation_id" => conversation_id(announced_activity)
     }
   end
 
-  def to_map(%Activity{data: %{"type" => "Like"}} = activity, %{user: user, liked_activity: liked_activity} = opts) do
-    created_at = get_in(activity.data, ["published"])
-    |> date_to_asctime
+  def to_map(%Activity{data: %{"type" => "Like", "published" => created_at}} = activity,
+             %{user: user, liked_activity: liked_activity} = opts) do
+    created_at = created_at |> date_to_asctime
 
     text = "#{user.nickname} favorited a status."
 
     %{
       "id" => activity.id,
       "user" => UserRepresenter.to_map(user, opts),
-      "statusnet_html" => text,  # TODO: add summary
+      "statusnet_html" => text,
       "text" => text,
       "is_local" => true,
       "is_post_verb" => false,
@@ -49,16 +52,17 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
     }
   end
 
-  def to_map(%Activity{data: %{"type" => "Follow"}} = activity, %{user: user} = opts) do
-    created_at = get_in(activity.data, ["published"])
-    |> date_to_asctime
+  def to_map(%Activity{data: %{"type" => "Follow", "published" => created_at, "object" => followed_id}} = activity, %{user: user} = opts) do
+    created_at = created_at |> date_to_asctime
 
+    followed = User.get_cached_by_ap_id(followed_id)
+    text = "#{user.nickname} started following #{followed.nickname}"
     %{
       "id" => activity.id,
       "user" => UserRepresenter.to_map(user, opts),
       "attentions" => [],
-      "statusnet_html" => "",  # TODO: add summary
-      "text" => "",
+      "statusnet_html" => text,
+      "text" => text,
       "is_local" => true,
       "is_post_verb" => false,
       "created_at" => created_at,
@@ -66,14 +70,12 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
     }
   end
 
-  def to_map(%Activity{} = activity, %{user: user} = opts) do
-    content = get_in(activity.data, ["object", "content"])
-    created_at = get_in(activity.data, ["object", "published"])
-    |> date_to_asctime
-    like_count = get_in(activity.data, ["object", "like_count"]) || 0
-    announcement_count = get_in(activity.data, ["object", "announcement_count"]) || 0
-    favorited = opts[:for] && opts[:for].ap_id in (activity.data["object"]["likes"] || [])
-    repeated = opts[:for] && opts[:for].ap_id in (activity.data["object"]["announcements"] || [])
+  def to_map(%Activity{data: %{"object" => %{"content" => content} = object}} = activity, %{user: user} = opts) do
+    created_at = object["published"] |> date_to_asctime
+    like_count = object["like_count"] || 0
+    announcement_count = object["announcement_count"] || 0
+    favorited = opts[:for] && opts[:for].ap_id in (object["likes"] || [])
+    repeated = opts[:for] && opts[:for].ap_id in (object["announcements"] || [])
 
     mentions = opts[:mentioned] || []
 
@@ -82,6 +84,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
     |> Enum.filter(&(&1))
     |> Enum.map(fn (user) -> UserRepresenter.to_map(user, opts) end)
 
+    conversation_id = conversation_id(activity)
+
     %{
       "id" => activity.id,
       "user" => UserRepresenter.to_map(user, opts),
@@ -91,22 +95,41 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
       "is_local" => true,
       "is_post_verb" => true,
       "created_at" => created_at,
-      "in_reply_to_status_id" => activity.data["object"]["inReplyToStatusId"],
-      "statusnet_conversation_id" => activity.data["object"]["statusnetConversationId"],
-      "attachments" => (activity.data["object"]["attachment"] || []) |> ObjectRepresenter.enum_to_list(opts),
+      "in_reply_to_status_id" => object["inReplyToStatusId"],
+      "statusnet_conversation_id" => conversation_id,
+      "attachments" => (object["attachment"] || []) |> ObjectRepresenter.enum_to_list(opts),
       "attentions" => attentions,
       "fave_num" => like_count,
       "repeat_num" => announcement_count,
-      "favorited" => !!favorited,
-      "repeated" => !!repeated,
+      "favorited" => to_boolean(favorited),
+      "repeated" => to_boolean(repeated),
     }
   end
 
+  def conversation_id(activity) do
+    with context when not is_nil(context) <- activity.data["context"] do
+      TwitterAPI.context_to_conversation_id(context)
+    else _e -> nil
+    end
+  end
+
   defp date_to_asctime(date) do
     with {:ok, date, _offset} <- date |> DateTime.from_iso8601 do
-      Calendar.Strftime.strftime!(date, "%a %b %d %H:%M:%S %z %Y")
+      Strftime.strftime!(date, "%a %b %d %H:%M:%S %z %Y")
     else _e ->
       ""
     end
   end
+
+  defp to_boolean(false) do
+    false
+  end
+
+  defp to_boolean(nil) do
+    false
+  end
+
+  defp to_boolean(_) do
+    true
+  end
 end
index ab7d6d353a7476357703f18631f53d3418ef043a..4930774138d8861f287eb48ede8a737328144001 100644 (file)
@@ -11,7 +11,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.UserRepresenter do
       false
     end
 
-    user_info = User.user_info(user)
+    user_info = User.get_cached_user_info(user)
 
     map = %{
       "id" => user.id,
@@ -28,7 +28,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.UserRepresenter do
       "profile_image_url_https" => image,
       "profile_image_url_profile_size" => image,
       "profile_image_url_original" => image,
-      "rights" => %{}
+      "rights" => %{},
+      "statusnet_profile_url" => user.ap_id
     }
 
     map
index 8e2cd98ca8c19e4d1b08c9e2defb032f4c956983..793a55250ce7ca3af8a571c2a5d84706df8cc8b3 100644 (file)
@@ -5,34 +5,77 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
 
   import Ecto.Query
 
-  def create_status(user = %User{}, data = %{}) do
-    attachments = Enum.map(data["media_ids"] || [], fn (media_id) ->
-      Repo.get(Object, media_id).data
-    end)
+  def to_for_user_and_mentions(user, mentions) do
+    default_to = [
+      User.ap_followers(user),
+      "https://www.w3.org/ns/activitystreams#Public"
+    ]
 
-    context = ActivityPub.generate_context_id
+    default_to ++ Enum.map(mentions, fn ({_, %{ap_id: ap_id}}) -> ap_id end)
+  end
 
-    content = HtmlSanitizeEx.strip_tags(data["status"])
+  def format_input(text, mentions) do
+    HtmlSanitizeEx.strip_tags(text)
     |> String.replace("\n", "<br>")
+    |> add_user_links(mentions)
+  end
 
-    mentions = parse_mentions(content)
+  def attachments_from_ids(ids) do
+    Enum.map(ids || [], fn (media_id) ->
+      Repo.get(Object, media_id).data
+    end)
+  end
 
-    default_to = [
-      User.ap_followers(user),
-      "https://www.w3.org/ns/activitystreams#Public"
-    ]
+  def get_replied_to_activity(id) when not is_nil(id) do
+    Repo.get(Activity, id)
+  end
 
-    to = default_to ++ Enum.map(mentions, fn ({_, %{ap_id: ap_id}}) -> ap_id end)
+  def get_replied_to_activity(_), do: nil
 
-    content_html = add_user_links(content, mentions)
+  def add_attachments(text, attachments) do
+    attachment_text = Enum.map(attachments, fn
+      (%{"url" => [%{"href" => href} | _]}) ->
+        "<a href='#{href}'>#{href}</a>"
+      _ -> ""
+    end)
+    Enum.join([text | attachment_text], "<br>")
+    end
+
+  def create_status(%User{} = user, %{"status" => status} = data) do
+    attachments = attachments_from_ids(data["media_ids"])
+    context = ActivityPub.generate_context_id
+    mentions = parse_mentions(status)
+    content_html = status
+    |> format_input(mentions)
+    |> add_attachments(attachments)
 
+    to = to_for_user_and_mentions(user, mentions)
     date = make_date()
 
-    activity = %{
-      "type" => "Create",
-      "to" => to,
-      "actor" => user.ap_id,
-      "object" => %{
+    inReplyTo = get_replied_to_activity(data["in_reply_to_status_id"])
+
+    # Wire up reply info.
+    [to, context, object, additional] =
+      if inReplyTo do
+      context = inReplyTo.data["context"]
+      to = to ++ [inReplyTo.data["actor"]]
+
+      object = %{
+        "type" => "Note",
+        "to" => to,
+        "content" => content_html,
+        "published" => date,
+        "context" => context,
+        "attachment" => attachments,
+        "actor" => user.ap_id,
+        "inReplyTo" => inReplyTo.data["object"]["id"],
+        "inReplyToStatusId" => inReplyTo.id,
+      }
+      additional = %{}
+
+      [to, context, object, additional]
+      else
+      object = %{
         "type" => "Note",
         "to" => to,
         "content" => content_html,
@@ -40,36 +83,11 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
         "context" => context,
         "attachment" => attachments,
         "actor" => user.ap_id
-      },
-      "published" => date,
-      "context" => context
-    }
-
-    # Wire up reply info.
-    activity = with inReplyToId when not is_nil(inReplyToId) <- data["in_reply_to_status_id"],
-                    inReplyTo <- Repo.get(Activity, inReplyToId),
-                    context <- inReplyTo.data["context"]
-               do
-
-               to = activity["to"] ++ [inReplyTo.data["actor"]]
-
-               activity
-               |> put_in(["to"], to)
-               |> put_in(["context"], context)
-               |> put_in(["object", "context"], context)
-               |> put_in(["object", "inReplyTo"], inReplyTo.data["object"]["id"])
-               |> put_in(["object", "inReplyToStatusId"], inReplyToId)
-               |> put_in(["statusnetConversationId"], inReplyTo.data["statusnetConversationId"])
-               |> put_in(["object", "statusnetConversationId"], inReplyTo.data["statusnetConversationId"])
-               else _e ->
-                 activity
-               end
-
-    with {:ok, activity} <- ActivityPub.insert(activity) do
-      {:ok, activity} = add_conversation_id(activity)
-      Pleroma.Web.Websub.publish(Pleroma.Web.OStatus.feed_path(user), user, activity)
-      {:ok, activity}
+      }
+      [to, context, object, %{}]
     end
+
+    ActivityPub.create(to, user, context, object, additional, data)
   end
 
   def fetch_friend_statuses(user, opts \\ %{}) do
@@ -78,6 +96,12 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
   end
 
   def fetch_public_statuses(user, opts \\ %{}) do
+    opts = Map.put(opts, "local_only", true)
+    ActivityPub.fetch_public_activities(opts)
+    |> activities_to_statuses(%{for: user})
+  end
+
+  def fetch_public_and_external_statuses(user, opts \\ %{}) do
     ActivityPub.fetch_public_activities(opts)
     |> activities_to_statuses(%{for: user})
   end
@@ -93,18 +117,12 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
   end
 
   def fetch_conversation(user, id) do
-    query = from activity in Activity,
-      where: fragment("? @> ?", activity.data, ^%{ statusnetConversationId: id}),
-      limit: 1
-
-    with %Activity{} = activity <- Repo.one(query),
-         context <- activity.data["context"],
+    with context when is_binary(context) <- conversation_id_to_context(id),
          activities <- ActivityPub.fetch_activities_for_context(context),
          statuses <- activities |> activities_to_statuses(%{for: user})
     do
       statuses
-    else e ->
-      IO.inspect(e)
+    else _e ->
       []
     end
   end
@@ -116,28 +134,23 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
   end
 
   def follow(%User{} = follower, params) do
-    with { :ok, %User{} = followed } <- get_user(params),
-         { :ok, follower } <- User.follow(follower, followed),
-         { :ok, activity } <- ActivityPub.insert(%{
-           "type" => "Follow",
-           "actor" => follower.ap_id,
-           "object" => followed.ap_id,
-           "published" => make_date()
-         })
+    with {:ok, %User{} = followed} <- get_user(params),
+         {:ok, follower} <- User.follow(follower, followed),
+         {:ok, activity} <- ActivityPub.follow(follower, followed)
     do
-      { :ok, follower, followed, activity }
+      {:ok, follower, followed, activity}
     else
       err -> err
     end
   end
 
-def unfollow(%User{} = follower, params) do
+  def unfollow(%User{} = follower, params) do
     with { :ok, %User{} = unfollowed } <- get_user(params),
          { :ok, follower, follow_activity } <- User.unfollow(follower, unfollowed),
          { :ok, _activity } <- ActivityPub.insert(%{
            "type" => "Undo",
            "actor" => follower.ap_id,
-           "object" => follow_activity, # get latest Follow for these users
+           "object" => follow_activity.data["id"], # get latest Follow for these users
            "published" => make_date()
          })
     do
@@ -232,24 +245,6 @@ def unfollow(%User{} = follower, params) do
     Enum.reduce(mentions, text, fn ({match, %User{ap_id: ap_id}}, text) -> String.replace(text, match, "<a href='#{ap_id}'>#{match}</a>") end)
   end
 
-  defp add_conversation_id(activity) do
-    if is_integer(activity.data["statusnetConversationId"]) do
-      {:ok, activity}
-    else
-      data = activity.data
-      |> put_in(["object", "statusnetConversationId"], activity.id)
-      |> put_in(["statusnetConversationId"], activity.id)
-
-      object = Object.get_by_ap_id(activity.data["object"]["id"])
-
-      changeset = Ecto.Changeset.change(object, data: data["object"])
-      Repo.update(changeset)
-
-      changeset = Ecto.Changeset.change(activity, data: data)
-      Repo.update(changeset)
-    end
-  end
-
   def register_user(params) do
     params = %{
       nickname: params["nickname"],
@@ -268,20 +263,20 @@ def unfollow(%User{} = follower, params) do
       {:error, changeset} ->
         errors = Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)
       |> Poison.encode!
-        {:error, %{error: errors}}
+      {:error, %{error: errors}}
     end
   end
 
   def get_user(user \\ nil, params) do
     case params do
-      %{ "user_id" => user_id } ->
+      %{"user_id" => user_id} ->
         case target = Repo.get(User, user_id) do
           nil ->
             {:error, "No user with such user_id"}
           _ ->
             {:ok, target}
         end
-      %{ "screen_name" => nickname } ->
+      %{"screen_name" => nickname} ->
         case target = Repo.get_by(User, nickname: nickname) do
           nil ->
             {:error, "No user with such screen_name"}
@@ -337,4 +332,22 @@ def unfollow(%User{} = follower, params) do
   defp make_date do
     DateTime.utc_now() |> DateTime.to_iso8601
   end
+
+  def context_to_conversation_id(context) do
+    with %Object{id: id} <- Object.get_cached_by_ap_id(context) do
+      id
+    else _e ->
+      changeset = Object.context_mapping(context)
+      {:ok, %{id: id}} = Repo.insert(changeset)
+      id
+    end
+  end
+
+  def conversation_id_to_context(id) do
+    with %Object{data: %{"id" => context}} <- Repo.get(Object, id) do
+      context
+    else _e ->
+      {:error, "No such conversation"}
+    end
+  end
 end
index b5b829ca0532d8fd539e303f853dc21fa358bdd6..96a5f2151dd1b913f56064cfcc505519c1f0b629 100644 (file)
@@ -2,8 +2,9 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
   use Pleroma.Web, :controller
   alias Pleroma.Web.TwitterAPI.TwitterAPI
   alias Pleroma.Web.TwitterAPI.Representers.{UserRepresenter, ActivityRepresenter}
-  alias Pleroma.{Repo, Activity}
+  alias Pleroma.{Web, Repo, Activity}
   alias Pleroma.Web.ActivityPub.ActivityPub
+  alias Ecto.Changeset
 
   def verify_credentials(%{assigns: %{user: user}} = conn, _params) do
     response = user |> UserRepresenter.to_json(%{for: user})
@@ -15,7 +16,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
   def status_update(%{assigns: %{user: user}} = conn, %{"status" => status_text} = status_data) do
     if status_text |> String.trim |> String.length != 0 do
       media_ids = extract_media_ids(status_data)
-      {:ok, activity} = TwitterAPI.create_status(user, Map.put(status_data, "media_ids",  media_ids ))
+      {:ok, activity} = TwitterAPI.create_status(user, Map.put(status_data, "media_ids",  media_ids))
       conn
       |> json_reply(200, ActivityRepresenter.to_json(activity, %{user: user}))
     else
@@ -41,6 +42,14 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
     end
   end
 
+  def public_and_external_timeline(%{assigns: %{user: user}} = conn, params) do
+    statuses = TwitterAPI.fetch_public_and_external_statuses(user, params)
+    {:ok, json} = Poison.encode(statuses)
+
+    conn
+    |> json_reply(200, json)
+  end
+
   def public_timeline(%{assigns: %{user: user}} = conn, params) do
     statuses = TwitterAPI.fetch_public_statuses(user, params)
     {:ok, json} = Poison.encode(statuses)
@@ -79,34 +88,34 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
 
   def follow(%{assigns: %{user: user}} = conn, params) do
     case TwitterAPI.follow(user, params) do
-      { :ok, user, followed, _activity } ->
+      {:ok, user, followed, _activity} ->
         response = followed |> UserRepresenter.to_json(%{for: user})
         conn
         |> json_reply(200, response)
-      { :error, msg } -> forbidden_json_reply(conn, msg)
+      {:error, msg} -> forbidden_json_reply(conn, msg)
     end
   end
 
   def unfollow(%{assigns: %{user: user}} = conn, params) do
     case TwitterAPI.unfollow(user, params) do
-      { :ok, user, unfollowed, } ->
+      {:ok, user, unfollowed} ->
         response = unfollowed |> UserRepresenter.to_json(%{for: user})
         conn
         |> json_reply(200, response)
-      { :error, msg } -> forbidden_json_reply(conn, msg)
+      {:error, msg} -> forbidden_json_reply(conn, msg)
     end
   end
 
-  def fetch_status(%{assigns: %{user: user}} = conn, %{ "id" => id }) do
-    response = TwitterAPI.fetch_status(user, id) |> Poison.encode!
+  def fetch_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
+    response = Poison.encode!(TwitterAPI.fetch_status(user, id))
 
     conn
     |> json_reply(200, response)
   end
 
-  def fetch_conversation(%{assigns: %{user: user}} = conn, %{ "id" => id }) do
+  def fetch_conversation(%{assigns: %{user: user}} = conn, %{"id" => id}) do
     id = String.to_integer(id)
-    response = TwitterAPI.fetch_conversation(user, id) |> Poison.encode!
+    response = Poison.encode!(TwitterAPI.fetch_conversation(user, id))
 
     conn
     |> json_reply(200, response)
@@ -132,8 +141,8 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
   def config(conn, _params) do
     response = %{
       site: %{
-        name: Pleroma.Web.base_url,
-        server: Pleroma.Web.base_url,
+        name: Web.base_url,
+        server: Web.base_url,
         textlimit: -1
       }
     }
@@ -188,11 +197,10 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
 
   def update_avatar(%{assigns: %{user: user}} = conn, params) do
     {:ok, object} = ActivityPub.upload(params)
-    change = Ecto.Changeset.change(user, %{avatar: object.data})
+    change = Changeset.change(user, %{avatar: object.data})
     {:ok, user} = Repo.update(change)
 
-    response = UserRepresenter.to_map(user, %{for: user})
-    |> Poison.encode!
+    response = Poison.encode!(UserRepresenter.to_map(user, %{for: user}))
 
     conn
     |> json_reply(200, response)
index a81e3e6e19bab963922d31accb53629d3b082ec4..2c343c2d7c6395bfc9ca8f831e088bfbf560cb15 100644 (file)
@@ -20,8 +20,7 @@ defmodule Pleroma.Web do
     quote do
       use Phoenix.Controller, namespace: Pleroma.Web
       import Plug.Conn
-      import Pleroma.Web.Router.Helpers
-      import Pleroma.Web.Gettext
+      import Pleroma.Web.{Gettext, Router.Helpers}
     end
   end
 
@@ -33,9 +32,7 @@ defmodule Pleroma.Web do
       # Import convenience functions from controllers
       import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2, view_module: 1]
 
-      import Pleroma.Web.Router.Helpers
-      import Pleroma.Web.ErrorHelpers
-      import Pleroma.Web.Gettext
+      import Pleroma.Web.{ErrorHelpers, Gettext, Router.Helpers}
     end
   end
 
@@ -61,27 +58,7 @@ defmodule Pleroma.Web do
     apply(__MODULE__, which, [])
   end
 
-  def host do
-    settings = Application.get_env(:pleroma, Pleroma.Web.Endpoint)
-    settings
-    |> Keyword.fetch!(:url)
-    |> Keyword.fetch!(:host)
-  end
-
   def base_url do
-    settings = Application.get_env(:pleroma, Pleroma.Web.Endpoint)
-
-    host = host()
-
-    protocol = settings |> Keyword.fetch!(:protocol)
-
-    port_fragment = with {:ok, protocol_info} <- settings |> Keyword.fetch(String.to_atom(protocol)),
-                         {:ok, port} <- protocol_info |> Keyword.fetch(:port)
-    do
-      ":#{port}"
-    else _e ->
-      ""
-    end
-    "#{protocol}://#{host}#{port_fragment}"
+    Pleroma.Web.Endpoint.url
   end
 end
index eb540e92ac011e3bc629f68f10df047961967788..e8b738c960fa1d7c7844b14b531917c1dc7d5b1f 100644 (file)
 defmodule Pleroma.Web.WebFinger do
-  alias Pleroma.XmlBuilder
-  alias Pleroma.User
-  alias Pleroma.Web.OStatus
+  @httpoison Application.get_env(:pleroma, :httpoison)
 
-  def host_meta() do
-    base_url  = Pleroma.Web.base_url
+  alias Pleroma.{Repo, User, XmlBuilder}
+  alias Pleroma.Web
+  alias Pleroma.Web.{XML, Salmon, OStatus}
+  require Logger
+
+  def host_meta do
+    base_url  = Web.base_url
     {
-      :XRD, %{ xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0" },
+      :XRD, %{xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0"},
       {
-        :Link, %{ rel: "lrdd", type: "application/xrd+xml", template: "#{base_url}/.well-known/webfinger?resource={uri}"  }
+        :Link, %{rel: "lrdd", type: "application/xrd+xml", template: "#{base_url}/.well-known/webfinger?resource={uri}"}
       }
     }
     |> XmlBuilder.to_doc
   end
 
   def webfinger(resource) do
-    host = Pleroma.Web.host
-    regex = ~r/acct:(?<username>\w+)@#{host}/
-    case Regex.named_captures(regex, resource) do
-      %{"username" => username} ->
-        user = User.get_cached_by_nickname(username)
+    host = Pleroma.Web.Endpoint.host
+    regex = ~r/(acct:)?(?<username>\w+)@#{host}/
+    with %{"username" => username} <- Regex.named_captures(regex, resource) do
+      user = User.get_by_nickname(username)
+      {:ok, represent_user(user)}
+    else _e ->
+      with user when not is_nil(user) <- User.get_cached_by_ap_id(resource) do
         {:ok, represent_user(user)}
-      _ -> nil
+      else _e ->
+        {:error, "Couldn't find user"}
+      end
     end
   end
 
   def represent_user(user) do
+    {:ok, user} = ensure_keys_present(user)
+    {:ok, _private, public} = Salmon.keys_from_pem(user.info["keys"])
+    magic_key = Salmon.encode_key(public)
     {
       :XRD, %{xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0"},
       [
-        {:Subject, "acct:#{user.nickname}@#{Pleroma.Web.host}"},
+        {:Subject, "acct:#{user.nickname}@#{Pleroma.Web.Endpoint.host}"},
         {:Alias, user.ap_id},
-        {:Link, %{rel: "http://schemas.google.com/g/2010#updates-from", type: "application/atom+xml", href: OStatus.feed_path(user)}}
+        {:Link, %{rel: "http://schemas.google.com/g/2010#updates-from", type: "application/atom+xml", href: OStatus.feed_path(user)}},
+        {:Link, %{rel: "http://webfinger.net/rel/profile-page", type: "text/html", href: user.ap_id}},
+        {:Link, %{rel: "salmon", href: OStatus.salmon_path(user)}},
+        {:Link, %{rel: "magic-public-key", href: "data:application/magic-public-key,#{magic_key}"}}
       ]
     }
     |> XmlBuilder.to_doc
   end
+
+  # This seems a better fit in Salmon
+  def ensure_keys_present(user) do
+    info = user.info || %{}
+    if info["keys"] do
+      {:ok, user}
+    else
+      {:ok, pem} = Salmon.generate_rsa_pem
+      info = Map.put(info, "keys", pem)
+      Repo.update(Ecto.Changeset.change(user, info: info))
+    end
+  end
+
+  # FIXME: Make this call the host-meta to find the actual address.
+  defp webfinger_address(domain) do
+    "//#{domain}/.well-known/webfinger"
+  end
+
+  defp webfinger_from_xml(doc) do
+    magic_key = XML.string_from_xpath(~s{//Link[@rel="magic-public-key"]/@href}, doc)
+    "data:application/magic-public-key," <> magic_key = magic_key
+    topic = XML.string_from_xpath(~s{//Link[@rel="http://schemas.google.com/g/2010#updates-from"]/@href}, doc)
+    subject = XML.string_from_xpath("//Subject", doc)
+    salmon = XML.string_from_xpath(~s{//Link[@rel="salmon"]/@href}, doc)
+    data = %{
+      "magic_key" => magic_key,
+      "topic" => topic,
+      "subject" => subject,
+      "salmon" => salmon
+    }
+    {:ok, data}
+  end
+
+  def finger(account, getter \\ &@httpoison.get/3) do
+    domain = with [_name, domain] <- String.split(account, "@") do
+               domain
+             else _e ->
+               URI.parse(account).host
+             end
+    address = webfinger_address(domain)
+
+    # try https first
+    response = with {:ok, result} <- getter.("https:" <> address, ["Accept": "application/xrd+xml"], [params: [resource: account]]) do
+                 {:ok, result}
+               else _ ->
+                 getter.("http:" <> address, ["Accept": "application/xrd+xml"], [params: [resource: account], follow_redirect: true])
+               end
+
+    with {:ok, %{status_code: status_code, body: body}} when status_code in 200..299 <- response,
+         doc <- XML.parse_document(body),
+         {:ok, data} <- webfinger_from_xml(doc) do
+      {:ok, data}
+    else
+      e ->
+        Logger.debug(fn -> "Couldn't finger #{account}." end)
+        Logger.debug(fn -> inspect(e) end)
+        {:error, e}
+    end
+  end
 end
index 7c0fd31424d24893861b3363219ca9cf9f216908..d8959a96f13e6b5688393fb79da22e9f685bc6ff 100644 (file)
@@ -12,7 +12,7 @@ defmodule Pleroma.Web.WebFinger.WebFingerController do
   end
 
   def webfinger(conn, %{"resource" => resource}) do
-    {:ok, response} = Pleroma.Web.WebFinger.webfinger(resource)
+    {:ok, response} = WebFinger.webfinger(resource)
 
     conn
     |> put_resp_content_type("application/xrd+xml")
index cc66b52dd6eb8e53cdc1f8179f4e6d948697aaa5..7c8efa917f169182887119d6094c5c050e0167dc 100644 (file)
@@ -1,16 +1,20 @@
 defmodule Pleroma.Web.Websub do
+  alias Ecto.Changeset
   alias Pleroma.Repo
-  alias Pleroma.Web.Websub.WebsubServerSubscription
+  alias Pleroma.Web.Websub.{WebsubServerSubscription, WebsubClientSubscription}
   alias Pleroma.Web.OStatus.FeedRepresenter
-  alias Pleroma.Web.OStatus
+  alias Pleroma.Web.{XML, Endpoint, OStatus}
+  alias Pleroma.Web.Router.Helpers
+  require Logger
 
   import Ecto.Query
 
-  @websub_verifier Application.get_env(:pleroma, :websub_verifier)
+  @httpoison Application.get_env(:pleroma, :httpoison)
 
-  def verify(subscription, getter \\ &HTTPoison.get/3 ) do
+  def verify(subscription, getter \\ &@httpoison.get/3) do
     challenge = Base.encode16(:crypto.strong_rand_bytes(8))
-    lease_seconds = NaiveDateTime.diff(subscription.valid_until, subscription.updated_at) |> to_string
+    lease_seconds = NaiveDateTime.diff(subscription.valid_until, subscription.updated_at)
+    lease_seconds = lease_seconds |> to_string
 
     params = %{
       "hub.challenge": challenge,
@@ -25,11 +29,11 @@ defmodule Pleroma.Web.Websub do
     with {:ok, response} <- getter.(url, [], [params: params]),
          ^challenge <- response.body
     do
-      changeset = Ecto.Changeset.change(subscription, %{state: "active"})
+      changeset = Changeset.change(subscription, %{state: "active"})
       Repo.update(changeset)
     else _e ->
-      changeset = Ecto.Changeset.change(subscription, %{state: "rejected"})
-      {:ok, subscription } = Repo.update(changeset)
+      changeset = Changeset.change(subscription, %{state: "rejected"})
+      {:ok, subscription} = Repo.update(changeset)
       {:error, subscription}
     end
   end
@@ -39,18 +43,27 @@ defmodule Pleroma.Web.Websub do
     where: sub.topic == ^topic and sub.state == "active"
     subscriptions = Repo.all(query)
     Enum.each(subscriptions, fn(sub) ->
-      response = FeedRepresenter.to_simple_form(user, [activity], [user])
+      response = user
+      |> FeedRepresenter.to_simple_form([activity], [user])
       |> :xmerl.export_simple(:xmerl_xml)
+      |> to_string
 
-      signature = :crypto.hmac(:sha, sub.secret, response) |> Base.encode16
+      signature = sign(sub.secret || "", response)
+      Logger.debug(fn -> "Pushing to #{sub.callback}" end)
 
-      HTTPoison.post(sub.callback, response, [
-            {"Content-Type", "application/atom+xml"},
-            {"X-Hub-Signature", "sha1=#{signature}"}
-          ])
+      Task.start(fn ->
+        @httpoison.post(sub.callback, response, [
+              {"Content-Type", "application/atom+xml"},
+              {"X-Hub-Signature", "sha1=#{signature}"}
+            ])
+      end)
     end)
   end
 
+  def sign(secret, doc) do
+    :crypto.hmac(:sha, secret, to_string(doc)) |> Base.encode16 |> String.downcase
+  end
+
   def incoming_subscription_request(user, %{"hub.mode" => "subscribe"} = params) do
     with {:ok, topic} <- valid_topic(params, user),
          {:ok, lease_time} <- lease_time(params),
@@ -65,23 +78,32 @@ defmodule Pleroma.Web.Websub do
         callback: callback
       }
 
-      change = Ecto.Changeset.change(subscription, data)
+      change = Changeset.change(subscription, data)
       websub = Repo.insert_or_update!(change)
 
-      change = Ecto.Changeset.change(websub, %{valid_until: NaiveDateTime.add(websub.updated_at, lease_time)})
+      change = Changeset.change(websub, %{valid_until:
+                                          NaiveDateTime.add(websub.updated_at, lease_time)})
       websub = Repo.update!(change)
 
-      # Just spawn that for now, maybe pool later.
-      spawn(fn -> @websub_verifier.verify(websub) end)
+      Pleroma.Web.Federator.enqueue(:verify_websub, websub)
 
       {:ok, websub}
     else {:error, reason} ->
+      Logger.debug("Couldn't create subscription.")
+      Logger.debug(inspect(reason))
+
       {:error, reason}
     end
   end
 
   defp get_subscription(topic, callback) do
-    Repo.get_by(WebsubServerSubscription, topic: topic, callback: callback) || %WebsubServerSubscription{}
+    Repo.get_by(WebsubServerSubscription, topic: topic, callback: callback) ||
+      %WebsubServerSubscription{}
+  end
+
+  # Temp hack for mastodon.
+  defp lease_time(%{"hub.lease_seconds" => ""}) do
+    {:ok, 60 * 60 * 24 * 3} # three days
   end
 
   defp lease_time(%{"hub.lease_seconds" => lease_seconds}) do
@@ -94,9 +116,92 @@ defmodule Pleroma.Web.Websub do
 
   defp valid_topic(%{"hub.topic" => topic}, user) do
     if topic == OStatus.feed_path(user) do
-      {:ok, topic}
+      {:ok, OStatus.feed_path(user)}
     else
       {:error, "Wrong topic requested, expected #{OStatus.feed_path(user)}, got #{topic}"}
     end
   end
+
+  def subscribe(subscriber, subscribed, requester \\ &request_subscription/1) do
+    topic = subscribed.info["topic"]
+    # FIXME: Race condition, use transactions
+    {:ok, subscription} = with subscription when not is_nil(subscription) <- Repo.get_by(WebsubClientSubscription, topic: topic) do
+      subscribers = [subscriber.ap_id | subscription.subscribers] |> Enum.uniq
+      change = Ecto.Changeset.change(subscription, %{subscribers: subscribers})
+      Repo.update(change)
+    else _e ->
+      subscription = %WebsubClientSubscription{
+        topic: topic,
+        hub: subscribed.info["hub"],
+        subscribers: [subscriber.ap_id],
+        state: "requested",
+        secret: :crypto.strong_rand_bytes(8) |> Base.url_encode64,
+        user: subscribed
+      }
+      Repo.insert(subscription)
+    end
+    requester.(subscription)
+  end
+
+  def gather_feed_data(topic, getter \\ &@httpoison.get/1) do
+    with {:ok, response} <- getter.(topic),
+         status_code when status_code in 200..299 <- response.status_code,
+         body <- response.body,
+         doc <- XML.parse_document(body),
+         uri when not is_nil(uri) <- XML.string_from_xpath("/feed/author[1]/uri", doc),
+         hub when not is_nil(hub) <- XML.string_from_xpath(~S{/feed/link[@rel="hub"]/@href}, doc) do
+
+      name = XML.string_from_xpath("/feed/author[1]/name", doc)
+      preferredUsername = XML.string_from_xpath("/feed/author[1]/poco:preferredUsername", doc)
+      displayName = XML.string_from_xpath("/feed/author[1]/poco:displayName", doc)
+      avatar = OStatus.make_avatar_object(doc)
+
+      {:ok, %{
+        "uri" => uri,
+        "hub" => hub,
+        "nickname" => preferredUsername || name,
+        "name" => displayName || name,
+        "host" => URI.parse(uri).host,
+        "avatar" => avatar
+      }}
+    else e ->
+      {:error, e}
+    end
+  end
+
+  def request_subscription(websub, poster \\ &@httpoison.post/3, timeout \\ 10_000) do
+    data = [
+      "hub.mode": "subscribe",
+      "hub.topic": websub.topic,
+      "hub.secret": websub.secret,
+      "hub.callback": Helpers.websub_url(Endpoint, :websub_subscription_confirmation, websub.id)
+    ]
+
+    # This checks once a second if we are confirmed yet
+    websub_checker = fn ->
+      helper = fn (helper) ->
+        :timer.sleep(1000)
+        websub = Repo.get_by(WebsubClientSubscription, id: websub.id, state: "accepted")
+        if websub, do: websub, else: helper.(helper)
+      end
+      helper.(helper)
+    end
+
+    task = Task.async(websub_checker)
+
+    with {:ok, %{status_code: 202}} <- poster.(websub.hub, {:form, data}, ["Content-type": "application/x-www-form-urlencoded"]),
+         {:ok, websub} <- Task.yield(task, timeout) do
+      {:ok, websub}
+    else e ->
+      Task.shutdown(task)
+
+      change = Ecto.Changeset.change(websub, %{state: "rejected"})
+      {:ok, websub} = Repo.update(change)
+
+      Logger.debug(fn -> "Couldn't confirm subscription: #{inspect(websub)}" end)
+      Logger.debug(fn -> "error: #{inspect(e)}" end)
+
+      {:error, websub}
+    end
+  end
 end
diff --git a/lib/pleroma/web/websub/websub_client_subscription.ex b/lib/pleroma/web/websub/websub_client_subscription.ex
new file mode 100644 (file)
index 0000000..c7a25ea
--- /dev/null
@@ -0,0 +1,16 @@
+defmodule Pleroma.Web.Websub.WebsubClientSubscription do
+  use Ecto.Schema
+  alias Pleroma.User
+
+  schema "websub_client_subscriptions" do
+    field :topic, :string
+    field :secret, :string
+    field :valid_until, :naive_datetime
+    field :state, :string
+    field :subscribers, {:array, :string}, default: []
+    field :hub, :string
+    belongs_to :user, User
+
+    timestamps()
+  end
+end
index 5d54c6ef5c936c10cf4ba128712f5dab93230c62..4fc6932140fe777c8a8d73c56948d24af69d0085 100644 (file)
@@ -1,7 +1,9 @@
 defmodule Pleroma.Web.Websub.WebsubController do
   use Pleroma.Web, :controller
-  alias Pleroma.User
-  alias Pleroma.Web.Websub
+  alias Pleroma.{Repo, User}
+  alias Pleroma.Web.{Websub, Federator}
+  alias Pleroma.Web.Websub.WebsubClientSubscription
+  require Logger
 
   def websub_subscription_request(conn, %{"nickname" => nickname} = params) do
     user = User.get_cached_by_nickname(nickname)
@@ -15,4 +17,32 @@ defmodule Pleroma.Web.Websub.WebsubController do
       |> send_resp(500, reason)
     end
   end
+
+  def websub_subscription_confirmation(conn, %{"id" => id, "hub.mode" => "subscribe", "hub.challenge" => challenge, "hub.topic" => topic}) do
+    with %WebsubClientSubscription{} = websub <- Repo.get_by(WebsubClientSubscription, id: id, topic: topic) do
+      change = Ecto.Changeset.change(websub, %{state: "accepted"})
+      {:ok, _websub} = Repo.update(change)
+      conn
+      |> send_resp(200, challenge)
+    else _e ->
+      conn
+      |> send_resp(500, "Error")
+    end
+  end
+
+  def websub_incoming(conn, %{"id" => id}) do
+    with "sha1=" <> signature <- hd(get_req_header(conn, "x-hub-signature")),
+         signature <- String.downcase(signature),
+         %WebsubClientSubscription{} = websub <- Repo.get(WebsubClientSubscription, id),
+         {:ok, body, _conn} = read_body(conn),
+         ^signature <- Websub.sign(websub.secret, body) do
+      Federator.enqueue(:incoming_doc, body)
+      conn
+      |> send_resp(200, "OK")
+    else _e ->
+      Logger.debug("Can't handle incoming subscription post")
+      conn
+      |> send_resp(500, "Error")
+    end
+  end
 end
diff --git a/lib/pleroma/web/xml/xml.ex b/lib/pleroma/web/xml/xml.ex
new file mode 100644 (file)
index 0000000..22faf72
--- /dev/null
@@ -0,0 +1,19 @@
+defmodule Pleroma.Web.XML do
+  def string_from_xpath(xpath, doc) do
+    {:xmlObj, :string, res} = :xmerl_xpath.string('string(#{xpath})', doc)
+
+    res = res
+    |> to_string
+    |> String.trim
+
+    if res == "", do: nil, else: res
+  end
+
+  def parse_document(text) do
+    {doc, _rest} = text
+    |> :binary.bin_to_list
+    |> :xmerl_scan.string
+
+    doc
+  end
+end
index ac1ac8a743db0ff01aca0dcb845d8b06a7ef3f5d..c6d1449036705084f785c056b3dfce32f0ee703e 100644 (file)
@@ -30,13 +30,13 @@ defmodule Pleroma.XmlBuilder do
     NaiveDateTime.to_iso8601(time)
   end
 
-  def to_doc(content), do: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" <> to_xml(content)
+  def to_doc(content), do: ~s(<?xml version="1.0" encoding="UTF-8"?>) <> to_xml(content)
 
   defp make_open_tag(tag, attributes) do
     attributes_string = for {attribute, value} <- attributes do
       "#{attribute}=\"#{value}\""
     end |> Enum.join(" ")
 
-    Enum.join([tag, attributes_string], " ") |> String.strip
+    [tag, attributes_string] |> Enum.join(" ") |> String.strip
   end
 end
diff --git a/mix.exs b/mix.exs
index 0e54f0246adf30d45551f3d466ffa0720eeb885b..72c6fb15909aa264603bb89a4dde2d80f534d619 100644 (file)
--- a/mix.exs
+++ b/mix.exs
@@ -41,6 +41,7 @@ defmodule Pleroma.Mixfile do
      {:cachex, "~> 2.1"},
      {:httpoison, "~> 0.11.1"},
      {:ex_machina, "~> 2.0", only: :test},
+     {:credo, "~> 0.7", only: [:dev, :test]},
      {:mix_test_watch, "~> 0.2", only: :dev}]
   end
 
index 225a62f7a612b643b3684385ed072cf3f873a9b7..0bc4462c3109e42339a0b91e406928e3ce21a4ec 100644 (file)
--- a/mix.lock
+++ b/mix.lock
@@ -1,4 +1,5 @@
-%{"cachex": {:hex, :cachex, "2.1.0", "fad49b4e78d11c6c314e75bd8c9408f5b78cb065c047442798caed10803ee3be", [:mix], [{:eternal, "~> 1.1", [hex: :eternal, optional: false]}]},
+%{"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], []},
+  "cachex": {:hex, :cachex, "2.1.0", "fad49b4e78d11c6c314e75bd8c9408f5b78cb065c047442798caed10803ee3be", [:mix], [{:eternal, "~> 1.1", [hex: :eternal, optional: false]}]},
   "calendar": {:hex, :calendar, "0.16.1", "782327ad8bae7c797b887840dc4ddb933f05ce6e333e5b04964d7a5d5f79bde3", [:mix], [{:tzdata, "~> 0.5.8 or ~> 0.1.201603", [hex: :tzdata, optional: false]}]},
   "certifi": {:hex, :certifi, "1.0.0", "1c787a85b1855ba354f0b8920392c19aa1d06b0ee1362f9141279620a5be2039", [:rebar3], []},
   "comeonin": {:hex, :comeonin, "3.0.2", "8b213268a6634bd2e31a8035a963e974681d13ccc1f73f2ae664b6ac4e993c96", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, optional: false]}]},
@@ -6,6 +7,7 @@
   "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], []},
   "cowboy": {:hex, :cowboy, "1.1.2", "61ac29ea970389a88eca5a65601460162d370a70018afe6f949a29dca91f3bb0", [:rebar3], [{:cowlib, "~> 1.0.2", [hex: :cowlib, optional: false]}, {:ranch, "~> 1.3.2", [hex: :ranch, optional: false]}]},
   "cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [:make], []},
+  "credo": {:hex, :credo, "0.7.3", "9827ab04002186af1aec014a811839a06f72aaae6cd5eed3919b248c8767dbf3", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, optional: false]}]},
   "db_connection": {:hex, :db_connection, "1.1.2", "2865c2a4bae0714e2213a0ce60a1b12d76a6efba0c51fbda59c9ab8d1accc7a8", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, optional: true]}]},
   "decimal": {:hex, :decimal, "1.3.1", "157b3cedb2bfcb5359372a7766dd7a41091ad34578296e951f58a946fcab49c6", [:mix], []},
   "deppie": {:hex, :deppie, "1.1.0", "cfb6fcee7dfb64eb78cb8505537971a0805131899326ad469ef10df04520f451", [:mix], []},
diff --git a/priv/repo/migrations/20170423154511_add_fields_to_users.exs b/priv/repo/migrations/20170423154511_add_fields_to_users.exs
new file mode 100644 (file)
index 0000000..84de74b
--- /dev/null
@@ -0,0 +1,10 @@
+defmodule Pleroma.Repo.Migrations.AddFieldsToUsers do
+  use Ecto.Migration
+
+  def change do
+    alter table(:users) do
+      add :local, :boolean, default: true
+      add :info, :map
+    end
+  end
+end
diff --git a/priv/repo/migrations/20170426154155_create_websub_client_subscription.exs b/priv/repo/migrations/20170426154155_create_websub_client_subscription.exs
new file mode 100644 (file)
index 0000000..f427828
--- /dev/null
@@ -0,0 +1,15 @@
+defmodule Pleroma.Repo.Migrations.CreateWebsubClientSubscription do
+  use Ecto.Migration
+
+  def change do
+    create table(:websub_client_subscriptions) do
+      add :topic, :string
+      add :secret, :string
+      add :valid_until, :naive_datetime
+      add :state, :string
+      add :subscribers, :map
+
+      timestamps()
+    end
+  end
+end
diff --git a/priv/repo/migrations/20170427054757_add_user_and_hub.exs b/priv/repo/migrations/20170427054757_add_user_and_hub.exs
new file mode 100644 (file)
index 0000000..4f9a520
--- /dev/null
@@ -0,0 +1,10 @@
+defmodule Pleroma.Repo.Migrations.AddUserAndHub do
+  use Ecto.Migration
+
+  def change do
+    alter table(:websub_client_subscriptions) do
+      add :hub, :string
+      add :user_id, references(:users)
+    end
+  end
+end
diff --git a/priv/repo/migrations/20170501124823_add_id_contraints_to_activities_and_objects.exs b/priv/repo/migrations/20170501124823_add_id_contraints_to_activities_and_objects.exs
new file mode 100644 (file)
index 0000000..21534ad
--- /dev/null
@@ -0,0 +1,8 @@
+defmodule Pleroma.Repo.Migrations.AddIdContraintsToActivitiesAndObjects do
+  use Ecto.Migration
+
+  def change do
+    create index(:objects, ["(data->>\"id\")"], name: :objects_unique_apid_index)
+    create index(:activities, ["(data->>\"id\")"], name: :activities_unique_apid_index)
+  end
+end
diff --git a/priv/repo/migrations/20170501133231_add_id_contraints_to_activities_and_objects_part_two.exs b/priv/repo/migrations/20170501133231_add_id_contraints_to_activities_and_objects_part_two.exs
new file mode 100644 (file)
index 0000000..12eea13
--- /dev/null
@@ -0,0 +1,10 @@
+defmodule Pleroma.Repo.Migrations.AddIdContraintsToActivitiesAndObjectsPartTwo do
+  use Ecto.Migration
+
+  def change do
+    drop index(:objects, ["(data->>\"id\")"], name: :objects_unique_apid_index)
+    drop index(:activities, ["(data->>\"id\")"], name: :activities_unique_apid_index)
+    create unique_index(:objects, ["(data->>'id')"], name: :objects_unique_apid_index)
+    create unique_index(:activities, ["(data->>'id')"], name: :activities_unique_apid_index)
+  end
+end
diff --git a/priv/repo/migrations/20170502083023_add_local_field_to_activities.exs b/priv/repo/migrations/20170502083023_add_local_field_to_activities.exs
new file mode 100644 (file)
index 0000000..088d68f
--- /dev/null
@@ -0,0 +1,11 @@
+defmodule Pleroma.Repo.Migrations.AddLocalFieldToActivities do
+  use Ecto.Migration
+
+  def change do
+    alter table(:activities) do
+      add :local, :boolean, default: true
+    end
+
+    create index(:activities, [:local])
+  end
+end
diff --git a/priv/repo/migrations/20170506222027_add_unique_index_to_apid.exs b/priv/repo/migrations/20170506222027_add_unique_index_to_apid.exs
new file mode 100644 (file)
index 0000000..864b5e4
--- /dev/null
@@ -0,0 +1,7 @@
+defmodule Pleroma.Repo.Migrations.AddUniqueIndexToAPID do
+  use Ecto.Migration
+
+  def change do
+    create unique_index(:users, [:ap_id])
+  end
+end
index ce6eb15451f7ad7ba6b126d41a9d034b007532ae..366a2f9572290d139e81cd2563b4d1e42ee4f1ec 100644 (file)
@@ -15,4 +15,11 @@ defmodule Pleroma.ActivityTest do
 
     assert activity == found_activity
   end
+
+  test "returns the activity that created an object" do
+    activity = insert(:note_activity)
+    found_activity = Pleroma.Activity.get_create_activity_by_object_ap_id(activity.data["object"]["id"])
+
+    assert activity == found_activity
+  end
 end
diff --git a/test/fixtures/23211.atom b/test/fixtures/23211.atom
new file mode 100644 (file)
index 0000000..d5d111b
--- /dev/null
@@ -0,0 +1,508 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
+ <generator uri="https://gnu.io/social" version="1.0.2-dev">GNU social</generator>
+ <id>https://social.heldscal.la/api/statuses/user_timeline/23211.atom</id>
+ <title>lambadalambda timeline</title>
+ <subtitle>Updates from lambadalambda on social.heldscal.la!</subtitle>
+ <logo>https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg</logo>
+ <updated>2017-05-02T14:59:30+00:00</updated>
+<author>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <uri>https://social.heldscal.la/user/23211</uri>
+ <name>lambadalambda</name>
+ <summary>Call me Deacon Blues.</summary>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+ <link rel="avatar" type="image/jpeg" media:width="236" media:height="236" href="https://social.heldscal.la/avatar/23211-original-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/23211-48-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/23211-24-20170416114257.jpeg"/>
+ <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+ <poco:displayName>Constance Variable</poco:displayName>
+ <poco:note>Call me Deacon Blues.</poco:note>
+ <poco:address>
+  <poco:formatted>Berlin</poco:formatted>
+ </poco:address>
+ <poco:urls>
+  <poco:type>homepage</poco:type>
+  <poco:value>https://heldscal.la</poco:value>
+  <poco:primary>true</poco:primary>
+ </poco:urls>
+ <followers url="https://social.heldscal.la/lambadalambda/subscribers"></followers>
+ <statusnet:profile_info local_id="23211"></statusnet:profile_info>
+</author>
+ <link href="https://social.heldscal.la/lambadalambda" rel="alternate" type="text/html"/>
+ <link href="https://social.heldscal.la/main/sup" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="https://social.heldscal.la/api/statuses/user_timeline/23211.atom?max_id=2012090" rel="next" type="application/atom+xml"/>
+ <link href="https://social.heldscal.la/main/push/hub" rel="hub"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="salmon"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="https://social.heldscal.la/api/statuses/user_timeline/23211.atom" rel="self" type="application/atom+xml"/>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:comment:2015260:2017-05-02T14:45:47+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by godemperorofdune: &lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; It's because your instance decided to be trap! lol.&lt;/p&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2015305"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T14:45:47+00:00</published>
+ <updated>2017-05-02T14:45:47+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:pawoo.net,2017-05-02:objectId=7397439:objectType=Status</id>
+  <title>New comment by godemperorofdune</title>
+  <content type="html">&lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; It's because your instance decided to be trap! lol.&lt;/p&gt;</content>
+  <link rel="alternate" type="text/html" href="https://pawoo.net/users/God_Emperor_of_Dune/updates/2090090"/>
+  <status_net notice_id="2015260"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:pawoo.net,2017-05-02:objectId=7397439:objectType=Status" href="https://pawoo.net/users/God_Emperor_of_Dune/updates/2090090"></thr:in-reply-to>
+ <link rel="related" href="https://pawoo.net/users/God_Emperor_of_Dune/updates/2090090"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1035308"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1035308" local_id="1035308" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=136e244b26cdf1e9">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=136e244b26cdf1e9</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2015305.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2015305.atom"/>
+ <statusnet:notice_info local_id="2015305" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:social.heldscal.la,2017-05-02:noticeId=2015221:objectType=note</id>
+ <title>New note by lambadalambda</title>
+ <content type="html">Some script thinks I'm a mastodon server.&lt;br /&gt; &lt;br /&gt; [info] GET /api/v1/timelines/public&lt;br /&gt; [debug] Processing with Fallback.RedirectController.redirector/2&lt;br /&gt; Parameters: %{&amp;quot;limit&amp;quot; =&amp;gt; &amp;quot;40&amp;quot;, &amp;quot;path&amp;quot; =&amp;gt; [&amp;quot;api&amp;quot;, &amp;quot;v1&amp;quot;, &amp;quot;timelines&amp;quot;, &amp;quot;public&amp;quot;]}&lt;br /&gt; Pipelines: []</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2015221"/>
+ <status_net notice_id="2015221"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-02T14:40:50+00:00</published>
+ <updated>2017-05-02T14:40:50+00:00</updated>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1035308"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1035308" local_id="1035308" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=136e244b26cdf1e9">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=136e244b26cdf1e9</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2015221.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2015221.atom"/>
+ <statusnet:notice_info local_id="2015221" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:social.heldscal.la,2017-05-02:noticeId=2014759:objectType=comment</id>
+ <title>New comment by lambadalambda</title>
+ <content type="html">@&lt;a href=&quot;https://mstdn.io/users/mattskala&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Matthew Skala&quot;&gt;mattskala&lt;/a&gt; You and @&lt;a href=&quot;https://mastodon.social/users/kevinmarks&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Kevin Marks&quot;&gt;kevinmarks&lt;/a&gt; are not wrong, but my comment was a suggestion to users and admins: Don't use big instances, don't run big instances. Also, it's a secondary advice to devs: Don't add features that encourage big instances.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2014759"/>
+ <status_net notice_id="2014759"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-02T14:11:54+00:00</published>
+ <updated>2017-05-02T14:11:54+00:00</updated>
+ <thr:in-reply-to ref="tag:mstdn.io,2017-05-02:objectId=1316931:objectType=Status" href="https://mstdn.io/users/mattskala/updates/35698"></thr:in-reply-to>
+ <link rel="related" href="https://mstdn.io/users/mattskala/updates/35698"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1031866"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1031866" local_id="1031866" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/kevinmarks"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mstdn.io/users/mattskala"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2014759.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2014759.atom"/>
+ <statusnet:notice_info local_id="2014759" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:social.heldscal.la,2017-05-02:noticeId=2014684:objectType=comment</id>
+ <title>New comment by lambadalambda</title>
+ <content type="html">@&lt;a href=&quot;https://mastodon.social/users/Ronkjeffries&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Ron K Jeffries social&quot;&gt;ronkjeffries&lt;/a&gt; @&lt;a href=&quot;https://xoxo.zone/users/KevinMarks&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Kevin Marks &quot;&gt;kevinmarks&lt;/a&gt; Usually people who run their own private instance just look at the timelines of other servers, follow a seed population and then go from there. This is of course hard on Mastodon, because it doesn't have a publicly visible timeline.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2014684"/>
+ <status_net notice_id="2014684"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-02T14:07:00+00:00</published>
+ <updated>2017-05-02T14:07:00+00:00</updated>
+ <thr:in-reply-to ref="tag:mastodon.social,2017-05-02:objectId=4883853:objectType=Status" href="https://mastodon.social/users/Ronkjeffries/updates/2221244"></thr:in-reply-to>
+ <link rel="related" href="https://mastodon.social/users/Ronkjeffries/updates/2221244"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1031866"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1031866" local_id="1031866" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://xoxo.zone/users/KevinMarks"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/Ronkjeffries"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2014684.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2014684.atom"/>
+ <statusnet:notice_info local_id="2014684" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:comment:2014584:2017-05-02T14:05:32+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by mattskala: &lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; It's reasonable to expect that instance sizes will obey a power-law distribution because that's what such things in nature nearly always do.  If so, there'll necessarily be a few instances much larger than the others; even if most are small, the network both socially and technically has to be able to deal with the existence of the few large ones.&lt;/p&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2014659"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T14:05:32+00:00</published>
+ <updated>2017-05-02T14:05:32+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:mstdn.io,2017-05-02:objectId=1316931:objectType=Status</id>
+  <title>New comment by mattskala</title>
+  <content type="html">&lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; It's reasonable to expect that instance sizes will obey a power-law distribution because that's what such things in nature nearly always do.  If so, there'll necessarily be a few instances much larger than the others; even if most are small, the network both socially and technically has to be able to deal with the existence of the few large ones.&lt;/p&gt;</content>
+  <link rel="alternate" type="text/html" href="https://mstdn.io/users/mattskala/updates/35698"/>
+  <status_net notice_id="2014584"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:mstdn.io,2017-05-02:objectId=1316931:objectType=Status" href="https://mstdn.io/users/mattskala/updates/35698"></thr:in-reply-to>
+ <link rel="related" href="https://mstdn.io/users/mattskala/updates/35698"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1031866"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1031866" local_id="1031866" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2014659.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2014659.atom"/>
+ <statusnet:notice_info local_id="2014659" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:comment:2013568:2017-05-02T14:05:29+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by kevinmarks: &lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; except instance populations will be power law distributed, and the problems for the tummlers are worse at scale&lt;/p&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2014657"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T14:05:29+00:00</published>
+ <updated>2017-05-02T14:05:29+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:xoxo.zone,2017-05-02:objectId=89478:objectType=Status</id>
+  <title>New comment by kevinmarks</title>
+  <content type="html">&lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; except instance populations will be power law distributed, and the problems for the tummlers are worse at scale&lt;/p&gt;</content>
+  <link rel="alternate" type="text/html" href="https://xoxo.zone/users/KevinMarks/updates/1749"/>
+  <status_net notice_id="2013568"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:xoxo.zone,2017-05-02:objectId=89478:objectType=Status" href="https://xoxo.zone/users/KevinMarks/updates/1749"></thr:in-reply-to>
+ <link rel="related" href="https://xoxo.zone/users/KevinMarks/updates/1749"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1031866"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1031866" local_id="1031866" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2014657.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2014657.atom"/>
+ <statusnet:notice_info local_id="2014657" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:comment:2014060:2017-05-02T13:34:32+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by gcarregues: &lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Oh purée ! Ma vie en images !&lt;/p&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2014147"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T13:34:32+00:00</published>
+ <updated>2017-05-02T13:34:32+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:mastodon.etalab.gouv.fr,2017-05-02:objectId=55287:objectType=Status</id>
+  <title>New comment by gcarregues</title>
+  <content type="html">&lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Oh purée ! Ma vie en images !&lt;/p&gt;</content>
+  <link rel="alternate" type="text/html" href="https://mastodon.etalab.gouv.fr/users/gcarregues/updates/4370"/>
+  <status_net notice_id="2014060"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:mastodon.etalab.gouv.fr,2017-05-02:objectId=55287:objectType=Status" href="https://mastodon.etalab.gouv.fr/users/gcarregues/updates/4370"></thr:in-reply-to>
+ <link rel="related" href="https://mastodon.etalab.gouv.fr/users/gcarregues/updates/4370"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1034065"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1034065" local_id="1034065" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2014147.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2014147.atom"/>
+ <statusnet:notice_info local_id="2014147" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:note:2013573:2017-05-02T13:03:33+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by phildobangnz: also @&lt;a href=&quot;https://sealion.club/user/579&quot; class=&quot;h-card mention&quot; title=&quot;Sim Bot&quot;&gt;sim&lt;/a&gt; reminder you are awesome; don't even trip- u kewler than Tutankhamen's cucumber, fam. Okay, good night.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2013702"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T13:03:33+00:00</published>
+ <updated>2017-05-02T13:03:33+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+  <id>tag:sealion.club,2017-05-02:noticeId=3060818:objectType=note</id>
+  <title>New note by phildobangnz</title>
+  <content type="html">also @&lt;a href=&quot;https://sealion.club/user/579&quot; class=&quot;h-card mention&quot; title=&quot;Sim Bot&quot;&gt;sim&lt;/a&gt; reminder you are awesome; don't even trip- u kewler than Tutankhamen's cucumber, fam. Okay, good night.</content>
+  <link rel="alternate" type="text/html" href="https://sealion.club/notice/3060818"/>
+  <status_net notice_id="2013573"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:sealion.club,2017-05-02:noticeId=3060818:objectType=note" href="https://sealion.club/notice/3060818"></thr:in-reply-to>
+ <link rel="related" href="https://sealion.club/notice/3060818"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1034282"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1034282" local_id="1034282" ref="https://sealion.club/conversation/1633267">https://sealion.club/conversation/1633267</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013702.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013702.atom"/>
+ <statusnet:notice_info local_id="2013702" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:social.heldscal.la,2017-05-02:noticeId=2013586:objectType=comment</id>
+ <title>New comment by lambadalambda</title>
+ <content type="html">@&lt;a href=&quot;https://xoxo.zone/users/KevinMarks&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Kevin Marks &quot;&gt;kevinmarks&lt;/a&gt; People can stay in their giant unmoderatable instances with meaningless public and federated timelines and experience constant federation drama if they want. I'll stay here with my 5 friends.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2013586"/>
+ <status_net notice_id="2013586"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-02T12:54:59+00:00</published>
+ <updated>2017-05-02T12:54:59+00:00</updated>
+ <thr:in-reply-to ref="tag:xoxo.zone,2017-05-02:objectId=89478:objectType=Status" href="https://xoxo.zone/users/KevinMarks/updates/1749"></thr:in-reply-to>
+ <link rel="related" href="https://xoxo.zone/users/KevinMarks/updates/1749"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1031866"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1031866" local_id="1031866" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://xoxo.zone/users/KevinMarks"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013586.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013586.atom"/>
+ <statusnet:notice_info local_id="2013586" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:note:2013486:2017-05-02T12:46:48+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by fortune: There once was a dentist named Stone&lt;br /&gt; Who saw all his patients alone.&lt;br /&gt; In a fit of depravity&lt;br /&gt; He filled the wrong cavity,&lt;br /&gt; And my, how his practice has grown!</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2013511"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T12:46:48+00:00</published>
+ <updated>2017-05-02T12:46:48+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+  <id>tag:gs.kawa-kun.com,2017-05-02:noticeId=1655658:objectType=note</id>
+  <title>New note by fortune</title>
+  <content type="html">There once was a dentist named Stone&lt;br /&gt; Who saw all his patients alone.&lt;br /&gt; In a fit of depravity&lt;br /&gt; He filled the wrong cavity,&lt;br /&gt; And my, how his practice has grown!</content>
+  <link rel="alternate" type="text/html" href="https://gs.kawa-kun.com/notice/1655658"/>
+  <status_net notice_id="2013486"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:gs.kawa-kun.com,2017-05-02:noticeId=1655658:objectType=note" href="https://gs.kawa-kun.com/notice/1655658"></thr:in-reply-to>
+ <link rel="related" href="https://gs.kawa-kun.com/notice/1655658"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1034222"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1034222" local_id="1034222" ref="https://gs.kawa-kun.com/conversation/714072">https://gs.kawa-kun.com/conversation/714072</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013511.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013511.atom"/>
+ <statusnet:notice_info local_id="2013511" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:note:2013365:2017-05-02T12:37:55+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by xj9: &lt;p&gt;&amp;gt; rollerblading to work&lt;/p&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2013394"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T12:37:55+00:00</published>
+ <updated>2017-05-02T12:37:55+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+  <id>tag:sunshinegardens.org,2017-05-02:objectId=61020:objectType=Status</id>
+  <title>New note by xj9</title>
+  <content type="html">&lt;p&gt;&amp;gt; rollerblading to work&lt;/p&gt;</content>
+  <link rel="alternate" type="text/html" href="https://sunshinegardens.org/users/xj9/updates/748"/>
+  <status_net notice_id="2013365"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:sunshinegardens.org,2017-05-02:objectId=61020:objectType=Status" href="https://sunshinegardens.org/users/xj9/updates/748"></thr:in-reply-to>
+ <link rel="related" href="https://sunshinegardens.org/users/xj9/updates/748"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1034152"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1034152" local_id="1034152" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=5a0e98612f634218">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=5a0e98612f634218</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013394.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013394.atom"/>
+ <statusnet:notice_info local_id="2013394" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:comment:2013259:2017-05-02T12:29:03+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by cereal: @&lt;a href=&quot;https://gs.smuglo.li/user/28250&quot; class=&quot;h-card mention&quot; title=&quot;Bricky&quot;&gt;thatbrickster&lt;/a&gt; @&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card mention&quot; title=&quot;Constance Variable&quot;&gt;lambadalambda&lt;/a&gt; But why?</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2013267"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T12:29:03+00:00</published>
+ <updated>2017-05-02T12:29:03+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:sealion.club,2017-05-02:noticeId=3059985:objectType=comment</id>
+  <title>New comment by cereal</title>
+  <content type="html">@&lt;a href=&quot;https://gs.smuglo.li/user/28250&quot; class=&quot;h-card mention&quot; title=&quot;Bricky&quot;&gt;thatbrickster&lt;/a&gt; @&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card mention&quot; title=&quot;Constance Variable&quot;&gt;lambadalambda&lt;/a&gt; But why?</content>
+  <link rel="alternate" type="text/html" href="https://sealion.club/notice/3059985"/>
+  <status_net notice_id="2013259"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:sealion.club,2017-05-02:noticeId=3059985:objectType=comment" href="https://sealion.club/notice/3059985"></thr:in-reply-to>
+ <link rel="related" href="https://sealion.club/notice/3059985"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1034065"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1034065" local_id="1034065" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013267.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013267.atom"/>
+ <statusnet:notice_info local_id="2013267" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:comment:2013227:2017-05-02T12:24:27+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by thatbrickster: @&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Constance Variable&quot;&gt;lambadalambda&lt;/a&gt; install gentoo</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2013230"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T12:24:27+00:00</published>
+ <updated>2017-05-02T12:24:27+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:gs.smuglo.li,2017-05-02:noticeId=2144296:objectType=comment</id>
+  <title>New comment by thatbrickster</title>
+  <content type="html">@&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Constance Variable&quot;&gt;lambadalambda&lt;/a&gt; install gentoo</content>
+  <link rel="alternate" type="text/html" href="https://gs.smuglo.li/notice/2144296"/>
+  <status_net notice_id="2013227"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:gs.smuglo.li,2017-05-02:noticeId=2144296:objectType=comment" href="https://gs.smuglo.li/notice/2144296"></thr:in-reply-to>
+ <link rel="related" href="https://gs.smuglo.li/notice/2144296"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1034065"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1034065" local_id="1034065" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013230.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013230.atom"/>
+ <statusnet:notice_info local_id="2013230" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:comment:2013213:2017-05-02T12:22:53+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by dwmatiz: @&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card mention&quot;&gt;lambadalambda&lt;/a&gt; *unzips dick*</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2013218"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T12:22:53+00:00</published>
+ <updated>2017-05-02T12:22:53+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:sealion.club,2017-05-02:noticeId=3059800:objectType=comment</id>
+  <title>New comment by dwmatiz</title>
+  <content type="html">@&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card mention&quot;&gt;lambadalambda&lt;/a&gt; *unzips dick*</content>
+  <link rel="alternate" type="text/html" href="https://sealion.club/notice/3059800"/>
+  <status_net notice_id="2013213"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:sealion.club,2017-05-02:noticeId=3059800:objectType=comment" href="https://sealion.club/notice/3059800"></thr:in-reply-to>
+ <link rel="related" href="https://sealion.club/notice/3059800"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1034065"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1034065" local_id="1034065" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013218.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013218.atom"/>
+ <statusnet:notice_info local_id="2013218" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:comment:2013199:2017-05-02T12:22:03+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by shpuld: @&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card mention&quot; title=&quot;Constance Variable&quot;&gt;lambadalambda&lt;/a&gt; get #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://shitposter.club/tag/cofe&quot; rel=&quot;tag&quot;&gt;cofe&lt;/a&gt;&lt;/span&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2013206"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T12:22:03+00:00</published>
+ <updated>2017-05-02T12:22:03+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:shitposter.club,2017-05-02:noticeId=2783524:objectType=comment</id>
+  <title>New comment by shpuld</title>
+  <content type="html">@&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card mention&quot; title=&quot;Constance Variable&quot;&gt;lambadalambda&lt;/a&gt; get #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://shitposter.club/tag/cofe&quot; rel=&quot;tag&quot;&gt;cofe&lt;/a&gt;&lt;/span&gt;</content>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2783524"/>
+  <status_net notice_id="2013199"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-02:noticeId=2783524:objectType=comment" href="https://shitposter.club/notice/2783524"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2783524"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1034065"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1034065" local_id="1034065" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013206.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013206.atom"/>
+ <statusnet:notice_info local_id="2013206" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:social.heldscal.la,2017-05-02:noticeId=2013185:objectType=note</id>
+ <title>New note by lambadalambda</title>
+ <content type="html">What now? &lt;a href=&quot;https://social.heldscal.la/file/e4822d95de677757ff50d49672a4046c83218b76c04a0ad5e5f1f0a9a9eb1a74.gif&quot; title=&quot;https://social.heldscal.la/file/e4822d95de677757ff50d49672a4046c83218b76c04a0ad5e5f1f0a9a9eb1a74.gif&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-422572&quot;&gt;https://social.heldscal.la/attachment/422572&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2013185"/>
+ <status_net notice_id="2013185"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-02T12:21:04+00:00</published>
+ <updated>2017-05-02T12:21:04+00:00</updated>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1034065"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1034065" local_id="1034065" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="enclosure" href="https://social.heldscal.la/file/e4822d95de677757ff50d49672a4046c83218b76c04a0ad5e5f1f0a9a9eb1a74.gif" type="image/gif" length="132349"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013185.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2013185.atom"/>
+ <statusnet:notice_info local_id="2013185" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:note:2012929:2017-05-02T12:01:25+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by drkmttr: &lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; I checked out No Agenda because I saw you mention it several time. Sadly, I wasn't impressed. I'm all about varying perspectives but Adam and John basically just sound like resentful curmudgeons. It seems like their shtick is basically playing devil's advocate to everything to arouse some discontent. Just my two cents. 😉&lt;/p&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2012940"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T12:01:25+00:00</published>
+ <updated>2017-05-02T12:01:25+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+  <id>tag:mstdn.io,2017-05-02:objectId=1310093:objectType=Status</id>
+  <title>New note by drkmttr</title>
+  <content type="html">&lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; I checked out No Agenda because I saw you mention it several time. Sadly, I wasn't impressed. I'm all about varying perspectives but Adam and John basically just sound like resentful curmudgeons. It seems like their shtick is basically playing devil's advocate to everything to arouse some discontent. Just my two cents. 😉&lt;/p&gt;</content>
+  <link rel="alternate" type="text/html" href="https://mstdn.io/users/drkmttr/updates/35653"/>
+  <status_net notice_id="2012929"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:mstdn.io,2017-05-02:objectId=1310093:objectType=Status" href="https://mstdn.io/users/drkmttr/updates/35653"></thr:in-reply-to>
+ <link rel="related" href="https://mstdn.io/users/drkmttr/updates/35653"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1033892"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1033892" local_id="1033892" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2f329b4eb20e83e2">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2f329b4eb20e83e2</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2012940.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2012940.atom"/>
+ <statusnet:notice_info local_id="2012940" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:comment:2012336:2017-05-02T11:06:42+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by clacke: @&lt;a href=&quot;https://mastodon.org.uk/users/dick_turpin&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;dick_turpin&quot;&gt;dickturpin&lt;/a&gt; @&lt;a href=&quot;http://quitter.se/user/113503&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Luke&quot;&gt;luke&lt;/a&gt; Oh no, I miss being irritated by you, it  helps me understand myself and others. Also it builds character. :-)&lt;br /&gt; &lt;br /&gt; So if this is not federation because you can't follow all of online mankind, what should we call it? Proto-federated? Pre-federated?&lt;br /&gt; &lt;br /&gt; The term has been used decades ago for just one Microsoft Active Directory domain cross-certifying the root of another, by mutual agreement. I don't see how it's any less relevant to opportunistic federation between open servers on an open internet.&lt;br /&gt; &lt;br /&gt; I'm not saying we should be satisfied, I'm just saying that &quot;federate&quot; is a useful word and to build a big system we need to start with a small one. And focus on the things we *can* change, like helping the OStatus network grow and making the tools more useful.&lt;br /&gt; &lt;br /&gt; Saying that the network's ideals have failed because other networks aren't joining is doing neither of that.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2012341"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T11:06:42+00:00</published>
+ <updated>2017-05-02T11:06:42+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:social.heldscal.la,2017-05-02:noticeId=2012336:objectType=comment</id>
+  <title>New comment by clacke</title>
+  <content type="html">@&lt;a href=&quot;https://mastodon.org.uk/users/dick_turpin&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;dick_turpin&quot;&gt;dickturpin&lt;/a&gt; @&lt;a href=&quot;http://quitter.se/user/113503&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Luke&quot;&gt;luke&lt;/a&gt; Oh no, I miss being irritated by you, it  helps me understand myself and others. Also it builds character. :-)&lt;br /&gt; &lt;br /&gt; So if this is not federation because you can't follow all of online mankind, what should we call it? Proto-federated? Pre-federated?&lt;br /&gt; &lt;br /&gt; The term has been used decades ago for just one Microsoft Active Directory domain cross-certifying the root of another, by mutual agreement. I don't see how it's any less relevant to opportunistic federation between open servers on an open internet.&lt;br /&gt; &lt;br /&gt; I'm not saying we should be satisfied, I'm just saying that &amp;quot;federate&amp;quot; is a useful word and to build a big system we need to start with a small one. And focus on the things we *can* change, like helping the OStatus network grow and making the tools more useful.&lt;br /&gt; &lt;br /&gt; Saying that the network's ideals have failed because other networks aren't joining is doing neither of that.</content>
+  <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2012336"/>
+  <status_net notice_id="2012336"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:social.heldscal.la,2017-05-02:noticeId=2012336:objectType=comment" href="https://social.heldscal.la/notice/2012336"></thr:in-reply-to>
+ <link rel="related" href="https://social.heldscal.la/notice/2012336"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1016421"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1016421" local_id="1016421" ref="https://s.wefamlee.be/conversation/16478">https://s.wefamlee.be/conversation/16478</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2012341.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2012341.atom"/>
+ <statusnet:notice_info local_id="2012341" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-02:fave:23211:comment:2011332:2017-05-02T10:37:40+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by moonman: @&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card mention&quot; title=&quot;Constance Variable&quot;&gt;lambadalambda&lt;/a&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=mKLizztikRk&quot; title=&quot;https://www.youtube.com/watch?v=mKLizztikRk&quot; class=&quot;attachment&quot; rel=&quot;nofollow&quot;&gt;https://www.youtube.com/watch?v=mKLizztikRk&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2012148"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-02T10:37:40+00:00</published>
+ <updated>2017-05-02T10:37:40+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:shitposter.club,2017-05-02:noticeId=2781833:objectType=comment</id>
+  <title>New comment by moonman</title>
+  <content type="html">@&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card mention&quot; title=&quot;Constance Variable&quot;&gt;lambadalambda&lt;/a&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=mKLizztikRk&quot; title=&quot;https://www.youtube.com/watch?v=mKLizztikRk&quot; class=&quot;attachment&quot; rel=&quot;nofollow&quot;&gt;https://www.youtube.com/watch?v=mKLizztikRk&lt;/a&gt;</content>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2781833"/>
+  <status_net notice_id="2011332"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-02:noticeId=2781833:objectType=comment" href="https://shitposter.club/notice/2781833"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2781833"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1032783"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1032783" local_id="1032783" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=11d8b8c27d9513ec">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=11d8b8c27d9513ec</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2012148.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2012148.atom"/>
+ <statusnet:notice_info local_id="2012148" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:social.heldscal.la,2017-05-02:noticeId=2012145:objectType=comment</id>
+ <title>New comment by lambadalambda</title>
+ <content type="html">@&lt;a href=&quot;https://sealion.club/user/186&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;I'M CEREAL U GUISE&quot;&gt;cereal&lt;/a&gt; ? No, you don't even need the identity servers for federation.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2012145"/>
+ <status_net notice_id="2012145"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-02T10:37:33+00:00</published>
+ <updated>2017-05-02T10:37:33+00:00</updated>
+ <thr:in-reply-to ref="tag:sealion.club,2017-05-02:noticeId=3056001:objectType=comment" href="https://sealion.club/notice/3056001"></thr:in-reply-to>
+ <link rel="related" href="https://sealion.club/notice/3056001"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1033277"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1033277" local_id="1033277" ref="https://sealion.club/conversation/1629037">https://sealion.club/conversation/1629037</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://sealion.club/user/186"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2012145.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2012145.atom"/>
+ <statusnet:notice_info local_id="2012145" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+</feed>
diff --git a/test/fixtures/favorite.xml b/test/fixtures/favorite.xml
new file mode 100644 (file)
index 0000000..c32b4a4
--- /dev/null
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
+ <generator uri="https://gnu.io/social" version="1.0.2-dev">GNU social</generator>
+ <id>https://social.heldscal.la/api/statuses/user_timeline/23211.atom</id>
+ <title>lambadalambda timeline</title>
+ <subtitle>Updates from lambadalambda on social.heldscal.la!</subtitle>
+ <logo>https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg</logo>
+ <updated>2017-05-05T09:12:53+00:00</updated>
+<author>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <uri>https://social.heldscal.la/user/23211</uri>
+ <name>lambadalambda</name>
+ <summary>Call me Deacon Blues.</summary>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+ <link rel="avatar" type="image/jpeg" media:width="236" media:height="236" href="https://social.heldscal.la/avatar/23211-original-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/23211-48-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/23211-24-20170416114257.jpeg"/>
+ <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+ <poco:displayName>Constance Variable</poco:displayName>
+ <poco:note>Call me Deacon Blues.</poco:note>
+ <poco:address>
+  <poco:formatted>Berlin</poco:formatted>
+ </poco:address>
+ <poco:urls>
+  <poco:type>homepage</poco:type>
+  <poco:value>https://heldscal.la</poco:value>
+  <poco:primary>true</poco:primary>
+ </poco:urls>
+ <followers url="https://social.heldscal.la/lambadalambda/subscribers"></followers>
+ <statusnet:profile_info local_id="23211"></statusnet:profile_info>
+</author>
+ <link href="https://social.heldscal.la/lambadalambda" rel="alternate" type="text/html"/>
+ <link href="https://social.heldscal.la/main/sup" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="https://social.heldscal.la/main/push/hub" rel="hub"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="salmon"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="https://social.heldscal.la/api/statuses/user_timeline/23211.atom" rel="self" type="application/atom+xml"/>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061643:2017-05-05T09:12:50+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by moonman: @&lt;a href=&quot;https://shitposter.club/user/9655&quot; class=&quot;h-card mention&quot; title=&quot;Solidarity for Pigs&quot;&gt;neimzr4luzerz&lt;/a&gt; @&lt;a href=&quot;https://gs.smuglo.li/user/2326&quot; class=&quot;h-card mention&quot; title=&quot;Dolus_McHonest&quot;&gt;dolus&lt;/a&gt; childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2061828"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T09:12:50+00:00</published>
+ <updated>2017-05-05T09:12:50+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment</id>
+  <title>New comment by moonman</title>
+  <content type="html">@&lt;a href=&quot;https://shitposter.club/user/9655&quot; class=&quot;h-card mention&quot; title=&quot;Solidarity for Pigs&quot;&gt;neimzr4luzerz&lt;/a&gt; @&lt;a href=&quot;https://gs.smuglo.li/user/2326&quot; class=&quot;h-card mention&quot; title=&quot;Dolus_McHonest&quot;&gt;dolus&lt;/a&gt; childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English</content>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2827873"/>
+  <status_net notice_id="2061643"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" href="https://shitposter.club/notice/2827873"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2827873"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1061781"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1061781" local_id="1061781" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061828.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061828.atom"/>
+ <statusnet:notice_info local_id="2061828" source="unknown"></statusnet:notice_info>
+</entry>
+</feed>
diff --git a/test/fixtures/favorite_with_local_note.xml b/test/fixtures/favorite_with_local_note.xml
new file mode 100644 (file)
index 0000000..3c95560
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
+ <generator uri="https://gnu.io/social" version="1.0.2-dev">GNU social</generator>
+ <id>https://social.heldscal.la/api/statuses/user_timeline/23211.atom</id>
+ <title>lambadalambda timeline</title>
+ <subtitle>Updates from lambadalambda on social.heldscal.la!</subtitle>
+ <logo>https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg</logo>
+ <updated>2017-05-05T09:12:53+00:00</updated>
+<author>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <uri>https://social.heldscal.la/user/23211</uri>
+ <name>lambadalambda</name>
+ <summary>Call me Deacon Blues.</summary>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+ <link rel="avatar" type="image/jpeg" media:width="236" media:height="236" href="https://social.heldscal.la/avatar/23211-original-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/23211-48-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/23211-24-20170416114257.jpeg"/>
+ <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+ <poco:displayName>Constance Variable</poco:displayName>
+ <poco:note>Call me Deacon Blues.</poco:note>
+ <poco:address>
+  <poco:formatted>Berlin</poco:formatted>
+ </poco:address>
+ <poco:urls>
+  <poco:type>homepage</poco:type>
+  <poco:value>https://heldscal.la</poco:value>
+  <poco:primary>true</poco:primary>
+ </poco:urls>
+ <followers url="https://social.heldscal.la/lambadalambda/subscribers"></followers>
+ <statusnet:profile_info local_id="23211"></statusnet:profile_info>
+</author>
+ <link href="https://social.heldscal.la/lambadalambda" rel="alternate" type="text/html"/>
+ <link href="https://social.heldscal.la/main/sup" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="https://social.heldscal.la/main/push/hub" rel="hub"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="salmon"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="https://social.heldscal.la/api/statuses/user_timeline/23211.atom" rel="self" type="application/atom+xml"/>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061643:2017-05-05T09:12:50+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by moonman: @&lt;a href=&quot;https://shitposter.club/user/9655&quot; class=&quot;h-card mention&quot; title=&quot;Solidarity for Pigs&quot;&gt;neimzr4luzerz&lt;/a&gt; @&lt;a href=&quot;https://gs.smuglo.li/user/2326&quot; class=&quot;h-card mention&quot; title=&quot;Dolus_McHonest&quot;&gt;dolus&lt;/a&gt; childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2061828"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T09:12:50+00:00</published>
+ <updated>2017-05-05T09:12:50+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>localid</id>
+  <title>New comment by moonman</title>
+  <content type="html">@&lt;a href=&quot;https://shitposter.club/user/9655&quot; class=&quot;h-card mention&quot; title=&quot;Solidarity for Pigs&quot;&gt;neimzr4luzerz&lt;/a&gt; @&lt;a href=&quot;https://gs.smuglo.li/user/2326&quot; class=&quot;h-card mention&quot; title=&quot;Dolus_McHonest&quot;&gt;dolus&lt;/a&gt; childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English</content>
+  <status_net notice_id="2061643"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" href="https://shitposter.club/notice/2827873"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2827873"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1061781"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1061781" local_id="1061781" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061828.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061828.atom"/>
+ <statusnet:notice_info local_id="2061828" source="unknown"></statusnet:notice_info>
+</entry>
+</feed>
diff --git a/test/fixtures/httpoison_mock/http___gs.example.org_4040_index.php_user_1.xml b/test/fixtures/httpoison_mock/http___gs.example.org_4040_index.php_user_1.xml
new file mode 100644 (file)
index 0000000..058f629
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
+ <Subject>http://gs.example.org:4040/index.php/user/1</Subject>
+ <Alias>acct:lambda@gs.example.org</Alias>
+ <Alias>http://gs.example.org/index.php/lambda</Alias>
+ <Alias>http://gs.example.org/lambda</Alias>
+ <Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="http://gs.example.org/index.php/lambda"/>
+ <Link rel="http://gmpg.org/xfn/11" type="text/html" href="http://gs.example.org/index.php/lambda"/>
+ <Link rel="describedby" type="application/rdf+xml" href="http://gs.example.org/index.php/lambda/foaf"/>
+ <Link rel="http://apinamespace.org/atom" type="application/atomsvc+xml" href="http://gs.example.org/index.php/api/statusnet/app/service/lambda.xml"/>
+ <Link rel="http://apinamespace.org/twitter" href="http://gs.example.org/index.php/api/"/>
+ <Link rel="http://specs.openid.net/auth/2.0/provider" href="http://gs.example.org:4040/index.php/lambda"/>
+ <Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/user_timeline/1.atom"/>
+ <Link rel="magic-public-key" href="data:application/magic-public-key,RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwQhh-1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAB"/>
+ <Link rel="salmon" href="http://gs.example.org/index.php/main/salmon/user/1"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-replies" href="http://gs.example.org/index.php/main/salmon/user/1"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-mention" href="http://gs.example.org/index.php/main/salmon/user/1"/>
+ <Link rel="http://ostatus.org/schema/1.0/subscribe" template="http://gs.example.org/index.php/main/ostatussub?profile={uri}"/>
+</XRD>
diff --git a/test/fixtures/httpoison_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml b/test/fixtures/httpoison_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml
new file mode 100644 (file)
index 0000000..4904677
--- /dev/null
@@ -0,0 +1,460 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
+ <generator uri="https://gnu.io/social" version="1.2.0-beta4">GNU social</generator>
+ <id>http://gs.example.org/index.php/api/statuses/user_timeline/1.atom</id>
+ <title>lambda timeline</title>
+ <subtitle>Updates from lambda on gs.example.org!</subtitle>
+ <logo>http://gs.example.org/theme/neo-gnu/default-avatar-profile.png</logo>
+ <updated>2017-05-05T12:09:57+00:00</updated>
+<author>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <uri>http://gs.example.org:4040/index.php/user/1</uri>
+ <name>lambda</name>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/lambda"/>
+ <link rel="avatar" type="image/png" media:width="96" media:height="96" href="http://gs.example.org/theme/neo-gnu/default-avatar-profile.png"/>
+ <link rel="avatar" type="image/png" media:width="48" media:height="48" href="http://gs.example.org/theme/neo-gnu/default-avatar-stream.png"/>
+ <link rel="avatar" type="image/png" media:width="24" media:height="24" href="http://gs.example.org/theme/neo-gnu/default-avatar-mini.png"/>
+ <poco:preferredUsername>lambda</poco:preferredUsername>
+ <poco:displayName>lambda</poco:displayName>
+ <followers url="http://gs.example.org/index.php/lambda/subscribers"></followers>
+ <statusnet:profile_info local_id="1"></statusnet:profile_info>
+</author>
+ <link href="http://gs.example.org/index.php/lambda" rel="alternate" type="text/html"/>
+ <link href="http://gs.example.org/index.php/main/sup" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="http://gs.example.org/index.php/api/statuses/user_timeline/1.atom?max_id=34" rel="next" type="application/atom+xml"/>
+ <link href="http://gs.example.org/index.php/main/push/hub" rel="hub"/>
+ <link href="http://gs.example.org/index.php/main/salmon/user/1" rel="salmon"/>
+ <link href="http://gs.example.org/index.php/main/salmon/user/1" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="http://gs.example.org/index.php/main/salmon/user/1" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="http://gs.example.org/index.php/api/statuses/user_timeline/1.atom" rel="self" type="application/atom+xml"/>
+<entry>
+ <id>tag:gs.example.org,2017-05-04:noticeId=84:objectType=note</id>
+ <title>lambda repeated a notice by lambda2</title>
+ <content type="html">RT @&lt;a href=&quot;http://gs.example.org/index.php/user/7&quot; class=&quot;h-card mention&quot;&gt;lambda2&lt;/a&gt; Hello!</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/84"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+ <published>2017-05-04T16:38:50+00:00</published>
+ <updated>2017-05-04T16:38:50+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+  <id>tag:gs.example.org,2017-05-01:noticeId=67:objectType=note</id>
+  <title></title>
+  <content type="html">Hello!</content>
+  <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/67"/>
+  <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+  <published>2017-05-01T08:41:04+00:00</published>
+  <updated>2017-05-01T08:41:04+00:00</updated>
+  <author>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+   <uri>http://gs.example.org/index.php/user/7</uri>
+   <name>lambda2</name>
+   <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/lambda2"/>
+   <link rel="avatar" type="image/png" media:width="270" media:height="270" href="http://gs.example.org/avatar/7-270-20170501084053.png"/>
+   <link rel="avatar" type="image/png" media:width="96" media:height="96" href="http://gs.example.org/avatar/7-96-20170501084054.png"/>
+   <link rel="avatar" type="image/png" media:width="48" media:height="48" href="http://gs.example.org/avatar/7-48-20170501084104.png"/>
+   <link rel="avatar" type="image/png" media:width="24" media:height="24" href="http://gs.example.org/avatar/7-24-20170501084104.png"/>
+   <poco:preferredUsername>lambda2</poco:preferredUsername>
+   <poco:displayName>lambda2</poco:displayName>
+   <followers url="http://gs.example.org/index.php/lambda2/subscribers"></followers>
+   <statusnet:profile_info local_id="7"></statusnet:profile_info>
+  </author>
+  <activity:object>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+   <id>tag:gs.example.org,2017-05-01:noticeId=67:objectType=note</id>
+   <title>New note by lambda2</title>
+   <content type="html">Hello!</content>
+   <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/67"/>
+   <status_net notice_id="67"></status_net>
+  </activity:object>
+  <link rel="ostatus:conversation" href="tag:gs.example.org,2017-05-01:objectType=thread:nonce=cffa792cb95fe417"/>
+  <ostatus:conversation>tag:gs.example.org,2017-05-01:objectType=thread:nonce=cffa792cb95fe417</ostatus:conversation>
+  <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+  <source>
+   <id>http://gs.example.org/index.php/api/statuses/user_timeline/7.atom</id>
+   <title>lambda2</title>
+   <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/lambda2"/>
+   <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/user_timeline/7.atom"/>
+   <link rel="license" href="https://creativecommons.org/licenses/by/3.0/"/>
+   <icon>http://gs.example.org/avatar/7-96-20170501084054.png</icon>
+   <updated>2017-05-01T16:33:10+00:00</updated>
+  </source>
+  <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/67.atom"/>
+  <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/67.atom"/>
+ </activity:object>
+ <link rel="ostatus:conversation" href="tag:gs.example.org,2017-05-01:objectType=thread:nonce=cffa792cb95fe417"/>
+ <ostatus:conversation>tag:gs.example.org,2017-05-01:objectType=thread:nonce=cffa792cb95fe417</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/84.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/84.atom"/>
+ <statusnet:notice_info local_id="84" source="web" repeat_of="67"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org,2017-04-30:noticeId=63:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">what now?</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/63"/>
+ <status_net notice_id="63"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-30T10:09:57+00:00</published>
+ <updated>2017-04-30T10:09:57+00:00</updated>
+ <thr:in-reply-to ref="http://pleroma.example.org:4000/objects/477d8933-7591-4755-ba7a-2c34073ddc3c" href="http://pleroma.example.org:4000/objects/477d8933-7591-4755-ba7a-2c34073ddc3c"></thr:in-reply-to>
+ <link rel="related" href="http://pleroma.example.org:4000/objects/477d8933-7591-4755-ba7a-2c34073ddc3c"/>
+ <link rel="ostatus:conversation" href="tag:gs.example.org,2017-04-30:objectType=thread:nonce=1bbb60991ae9874b"/>
+ <ostatus:conversation>tag:gs.example.org,2017-04-30:objectType=thread:nonce=1bbb60991ae9874b</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/63.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/63.atom"/>
+ <statusnet:notice_info local_id="63" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org,2017-04-30:noticeId=61:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">@&lt;a href=&quot;http://pleroma.example.org:4000/users/lain5&quot; class=&quot;h-card mention&quot;&gt;lain5&lt;/a&gt; Hello!</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/61"/>
+ <status_net notice_id="61"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-30T10:07:26+00:00</published>
+ <updated>2017-04-30T10:07:26+00:00</updated>
+ <link rel="ostatus:conversation" href="tag:gs.example.org,2017-04-30:objectType=thread:nonce=1bbb60991ae9874b"/>
+ <ostatus:conversation>tag:gs.example.org,2017-04-30:objectType=thread:nonce=1bbb60991ae9874b</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/61.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/61.atom"/>
+ <statusnet:notice_info local_id="61" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org,2017-04-29:noticeId=59:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">ey</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/59"/>
+ <status_net notice_id="59"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-29T17:04:59+00:00</published>
+ <updated>2017-04-29T17:04:59+00:00</updated>
+ <link rel="ostatus:conversation" href="tag:gs.example.org,2017-04-29:objectType=thread:nonce=4cc42c2c61a0f4bd"/>
+ <ostatus:conversation>tag:gs.example.org,2017-04-29:objectType=thread:nonce=4cc42c2c61a0f4bd</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/59.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/59.atom"/>
+ <statusnet:notice_info local_id="59" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org,2017-04-29:noticeId=58:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">Another one.</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/58"/>
+ <status_net notice_id="58"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-29T17:02:47+00:00</published>
+ <updated>2017-04-29T17:02:47+00:00</updated>
+ <link rel="ostatus:conversation" href="tag:gs.example.org,2017-04-29:objectType=thread:nonce=53e9b8f1d6d38d13"/>
+ <ostatus:conversation>tag:gs.example.org,2017-04-29:objectType=thread:nonce=53e9b8f1d6d38d13</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/58.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/58.atom"/>
+ <statusnet:notice_info local_id="58" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org,2017-04-29:noticeId=57:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">Let's see if this comes over.</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/57"/>
+ <status_net notice_id="57"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-29T17:01:39+00:00</published>
+ <updated>2017-04-29T17:01:39+00:00</updated>
+ <link rel="ostatus:conversation" href="tag:gs.example.org,2017-04-29:objectType=thread:nonce=238a7bd3ffc7c9cc"/>
+ <ostatus:conversation>tag:gs.example.org,2017-04-29:objectType=thread:nonce=238a7bd3ffc7c9cc</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/57.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/57.atom"/>
+ <statusnet:notice_info local_id="57" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org,2017-04-29:noticeId=56:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">@&lt;a href=&quot;http://pleroma.example.org:4000/users/lain5&quot; class=&quot;h-card mention&quot;&gt;lain5&lt;/a&gt; Hey!</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/56"/>
+ <status_net notice_id="56"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-29T16:38:13+00:00</published>
+ <updated>2017-04-29T16:38:13+00:00</updated>
+ <link rel="ostatus:conversation" href="tag:gs.example.org,2017-04-29:objectType=thread:nonce=2629d3a398171b0f"/>
+ <ostatus:conversation>tag:gs.example.org,2017-04-29:objectType=thread:nonce=2629d3a398171b0f</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/56.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/56.atom"/>
+ <statusnet:notice_info local_id="56" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-25:noticeId=55:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">hey.</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/55"/>
+ <status_net notice_id="55"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-25T18:16:13+00:00</published>
+ <updated>2017-04-25T18:16:13+00:00</updated>
+ <thr:in-reply-to ref="http://pleroma.example.org:4000/objects/55bce8fc-b423-46b1-af71-3759ab4670bc" href="http://pleroma.example.org:4000/objects/55bce8fc-b423-46b1-af71-3759ab4670bc"></thr:in-reply-to>
+ <link rel="related" href="http://pleroma.example.org:4000/objects/55bce8fc-b423-46b1-af71-3759ab4670bc"/>
+ <link rel="ostatus:conversation" href="http://pleroma.example.org:4000/contexts/8f6f45d4-8e4d-4e1a-a2de-09f27367d2d0"/>
+ <ostatus:conversation>http://pleroma.example.org:4000/contexts/8f6f45d4-8e4d-4e1a-a2de-09f27367d2d0</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/55.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/55.atom"/>
+ <statusnet:notice_info local_id="55" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-25:noticeId=53:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">and this?</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/53"/>
+ <status_net notice_id="53"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-25T18:14:34+00:00</published>
+ <updated>2017-04-25T18:14:34+00:00</updated>
+ <thr:in-reply-to ref="http://pleroma.example.org:4000/objects/875b219f-8ced-4948-832e-137a06a88031" href="http://pleroma.example.org:4000/objects/875b219f-8ced-4948-832e-137a06a88031"></thr:in-reply-to>
+ <link rel="related" href="http://pleroma.example.org:4000/objects/875b219f-8ced-4948-832e-137a06a88031"/>
+ <link rel="ostatus:conversation" href="http://pleroma.example.org:4000/contexts/24779b0e-91ad-487e-81bd-6cf5bb437b09"/>
+ <ostatus:conversation>http://pleroma.example.org:4000/contexts/24779b0e-91ad-487e-81bd-6cf5bb437b09</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/53.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/53.atom"/>
+ <statusnet:notice_info local_id="53" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-25:noticeId=52:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">yeah it does :)</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/52"/>
+ <status_net notice_id="52"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-25T18:13:31+00:00</published>
+ <updated>2017-04-25T18:13:31+00:00</updated>
+ <thr:in-reply-to ref="http://pleroma.example.org:4000/objects/9c0430b4-ccb3-4e2c-9c50-ee345ebe18fc" href="http://pleroma.example.org:4000/objects/9c0430b4-ccb3-4e2c-9c50-ee345ebe18fc"></thr:in-reply-to>
+ <link rel="related" href="http://pleroma.example.org:4000/objects/9c0430b4-ccb3-4e2c-9c50-ee345ebe18fc"/>
+ <link rel="ostatus:conversation" href="tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=e0dc24b1a93ab6b3"/>
+ <ostatus:conversation>tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=e0dc24b1a93ab6b3</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/52.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/52.atom"/>
+ <statusnet:notice_info local_id="52" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-25:noticeId=50:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">@&lt;a href=&quot;http://pleroma.example.org:4000/users/lain5&quot; class=&quot;h-card mention&quot;&gt;lain5&lt;/a&gt; Let's try with one that originates here!</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/50"/>
+ <status_net notice_id="50"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-25T18:10:28+00:00</published>
+ <updated>2017-04-25T18:10:28+00:00</updated>
+ <link rel="ostatus:conversation" href="tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=e0dc24b1a93ab6b3"/>
+ <ostatus:conversation>tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=e0dc24b1a93ab6b3</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/50.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/50.atom"/>
+ <statusnet:notice_info local_id="50" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-25:noticeId=48:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">works?</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/48"/>
+ <status_net notice_id="48"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-25T18:08:44+00:00</published>
+ <updated>2017-04-25T18:08:44+00:00</updated>
+ <thr:in-reply-to ref="http://pleroma.example.org:4000/objects/8664caae-1cd6-4c1f-b1d7-27bd4ce76966" href="http://pleroma.example.org:4000/objects/8664caae-1cd6-4c1f-b1d7-27bd4ce76966"></thr:in-reply-to>
+ <link rel="related" href="http://pleroma.example.org:4000/objects/8664caae-1cd6-4c1f-b1d7-27bd4ce76966"/>
+ <link rel="ostatus:conversation" href="http://pleroma.example.org:4000/contexts/24779b0e-91ad-487e-81bd-6cf5bb437b09"/>
+ <ostatus:conversation>http://pleroma.example.org:4000/contexts/24779b0e-91ad-487e-81bd-6cf5bb437b09</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/48.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/48.atom"/>
+ <statusnet:notice_info local_id="48" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-25:noticeId=46:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">Let's send you an answer.</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/46"/>
+ <status_net notice_id="46"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-25T18:05:31+00:00</published>
+ <updated>2017-04-25T18:05:31+00:00</updated>
+ <thr:in-reply-to ref="http://pleroma.example.org:4000/objects/89ec2578-3f05-4b04-99b8-3e40f1282491" href="http://pleroma.example.org:4000/objects/89ec2578-3f05-4b04-99b8-3e40f1282491"></thr:in-reply-to>
+ <link rel="related" href="http://pleroma.example.org:4000/objects/89ec2578-3f05-4b04-99b8-3e40f1282491"/>
+ <link rel="ostatus:conversation" href="tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=73c7bcf6658f7ce3"/>
+ <ostatus:conversation>tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=73c7bcf6658f7ce3</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/46.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/46.atom"/>
+ <statusnet:notice_info local_id="46" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-25:noticeId=44:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">Hey.</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/44"/>
+ <status_net notice_id="44"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-25T18:01:09+00:00</published>
+ <updated>2017-04-25T18:01:09+00:00</updated>
+ <thr:in-reply-to ref="http://pleroma.example.org:4000/objects/5047e0a8-2302-483a-a420-ae835f5ca5a1" href="http://pleroma.example.org:4000/objects/5047e0a8-2302-483a-a420-ae835f5ca5a1"></thr:in-reply-to>
+ <link rel="related" href="http://pleroma.example.org:4000/objects/5047e0a8-2302-483a-a420-ae835f5ca5a1"/>
+ <link rel="ostatus:conversation" href="tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=6e7c8fc2823380b4"/>
+ <ostatus:conversation>tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=6e7c8fc2823380b4</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/44.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/44.atom"/>
+ <statusnet:notice_info local_id="44" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-25:noticeId=43:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">What's coming to you?</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/43"/>
+ <status_net notice_id="43"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-25T17:58:41+00:00</published>
+ <updated>2017-04-25T17:58:41+00:00</updated>
+ <thr:in-reply-to ref="http://pleroma.example.org:4000/objects/5047e0a8-2302-483a-a420-ae835f5ca5a1" href="http://pleroma.example.org:4000/objects/5047e0a8-2302-483a-a420-ae835f5ca5a1"></thr:in-reply-to>
+ <link rel="related" href="http://pleroma.example.org:4000/objects/5047e0a8-2302-483a-a420-ae835f5ca5a1"/>
+ <link rel="ostatus:conversation" href="tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=6e7c8fc2823380b4"/>
+ <ostatus:conversation>tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=6e7c8fc2823380b4</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/43.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/43.atom"/>
+ <statusnet:notice_info local_id="43" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-25:noticeId=42:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">Now this is podracing.</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/42"/>
+ <status_net notice_id="42"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-25T17:57:40+00:00</published>
+ <updated>2017-04-25T17:57:40+00:00</updated>
+ <thr:in-reply-to ref="http://pleroma.example.org:4000/objects/5047e0a8-2302-483a-a420-ae835f5ca5a1" href="http://pleroma.example.org:4000/objects/5047e0a8-2302-483a-a420-ae835f5ca5a1"></thr:in-reply-to>
+ <link rel="related" href="http://pleroma.example.org:4000/objects/5047e0a8-2302-483a-a420-ae835f5ca5a1"/>
+ <link rel="ostatus:conversation" href="tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=6e7c8fc2823380b4"/>
+ <ostatus:conversation>tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=6e7c8fc2823380b4</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/42.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/42.atom"/>
+ <statusnet:notice_info local_id="42" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-25:noticeId=39:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">Sure looks like it!</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/39"/>
+ <status_net notice_id="39"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-25T17:48:27+00:00</published>
+ <updated>2017-04-25T17:48:27+00:00</updated>
+ <thr:in-reply-to ref="http://pleroma.example.org:4000/objects/c9fe09c2-7504-46d2-a4f6-44a708455e6f" href="http://pleroma.example.org:4000/objects/c9fe09c2-7504-46d2-a4f6-44a708455e6f"></thr:in-reply-to>
+ <link rel="related" href="http://pleroma.example.org:4000/objects/c9fe09c2-7504-46d2-a4f6-44a708455e6f"/>
+ <link rel="ostatus:conversation" href="tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=4c6114a75bb4cea5"/>
+ <ostatus:conversation>tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=4c6114a75bb4cea5</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/39.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/39.atom"/>
+ <statusnet:notice_info local_id="39" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:gs.example.org:4040,2017-04-25:subscription:1:person:6:2017-04-25T17:47:47+00:00</id>
+ <title>lambda (lambda)'s status on Tuesday, 25-Apr-2017 17:47:47 UTC</title>
+ <content type="html">&lt;a href=&quot;http://gs.example.org:4040/index.php/lambda&quot;&gt;lambda&lt;/a&gt; started following &lt;a href=&quot;http://pleroma.example.org:4000/users/lain5&quot;&gt;l&lt;/a&gt;.</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/37"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/follow</activity:verb>
+ <published>2017-04-25T17:47:47+00:00</published>
+ <updated>2017-04-25T17:47:47+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <id>http://pleroma.example.org:4000/users/lain5</id>
+  <title>l</title>
+  <summary>lambadalambda</summary>
+  <link rel="alternate" type="text/html" href="http://pleroma.example.org:4000/users/lain5"/>
+  <link rel="avatar" type="image/png" media:width="48" media:height="48" href="http://gs.example.org/avatar/6-original-20170425174605.png"/>
+  <link rel="avatar" type="image/png" media:width="96" media:height="96" href="http://gs.example.org/avatar/6-96-20170425174605.png"/>
+  <link rel="avatar" type="image/png" media:width="48" media:height="48" href="http://gs.example.org/avatar/6-original-20170425174605.png"/>
+  <link rel="avatar" type="image/png" media:width="24" media:height="24" href="http://gs.example.org/avatar/6-24-20170425174747.png"/>
+  <poco:preferredUsername>lain5</poco:preferredUsername>
+  <poco:displayName>l</poco:displayName>
+  <poco:note>lambadalambda</poco:note>
+ </activity:object>
+ <link rel="ostatus:conversation" href="tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=119acad17515314c"/>
+ <ostatus:conversation>tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=119acad17515314c</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/37.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/37.atom"/>
+ <statusnet:notice_info local_id="37" source="activity"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-25:noticeId=36:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">@&lt;a href=&quot;http://pleroma.example.org:4000/users/lain5&quot; class=&quot;h-card mention&quot;&gt;lain5&lt;/a&gt; Hey, how are you?</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/36"/>
+ <status_net notice_id="36"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-25T17:46:22+00:00</published>
+ <updated>2017-04-25T17:46:22+00:00</updated>
+ <link rel="ostatus:conversation" href="tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=9c5ec19a18191372"/>
+ <ostatus:conversation>tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=9c5ec19a18191372</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/36.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/36.atom"/>
+ <statusnet:notice_info local_id="36" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-25:noticeId=35:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">@lain5@pleroma.example.org does this not work?</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org/index.php/notice/35"/>
+ <status_net notice_id="35"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-25T17:42:31+00:00</published>
+ <updated>2017-04-25T17:42:31+00:00</updated>
+ <link rel="ostatus:conversation" href="tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=fc841d7f52caa363"/>
+ <ostatus:conversation>tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=fc841d7f52caa363</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/35.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org/index.php/api/statuses/show/35.atom"/>
+ <statusnet:notice_info local_id="35" source="web"></statusnet:notice_info>
+</entry>
+</feed>
diff --git a/test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.atom b/test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.atom
new file mode 100644 (file)
index 0000000..4d732b1
--- /dev/null
@@ -0,0 +1,464 @@
+<?xml version="1.0"?>
+<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:media="http://purl.org/syndication/atommedia" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:mastodon="http://mastodon.social/schema/1.0">
+  <id>https://mastodon.social/users/lambadalambda.atom</id>
+  <title>Critical Value</title>
+  <subtitle></subtitle>
+  <updated>2017-04-16T21:47:25Z</updated>
+  <logo>https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif</logo>
+  <author>
+    <id>https://mastodon.social/users/lambadalambda</id>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+    <uri>https://mastodon.social/users/lambadalambda</uri>
+    <name>lambadalambda</name>
+    <email>lambadalambda@mastodon.social</email>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/@lambadalambda"/>
+    <link rel="avatar" type="image/gif" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif"/>
+    <link rel="header" type="" media:width="700" media:height="335" href="/headers/original/missing.png"/>
+    <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+    <poco:displayName>Critical Value</poco:displayName>
+    <mastodon:scope>public</mastodon:scope>
+  </author>
+  <link rel="alternate" type="text/html" href="https://mastodon.social/@lambadalambda"/>
+  <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda.atom"/>
+  <link rel="next" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda.atom?max_id=1616358"/>
+  <link rel="hub" href="https://mastodon.social/api/push"/>
+  <link rel="salmon" href="https://mastodon.social/api/salmon/264"/>
+  <entry>
+    <id>tag:mastodon.social,2017-05-04:objectId=4991300:objectType=Status</id>
+    <published>2017-05-04T14:10:30Z</published>
+    <updated>2017-05-04T14:10:30Z</updated>
+    <title>Delete</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/delete</activity:verb>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2247090"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2247090.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-05-04:objectId=4980289:objectType=Status</id>
+    <published>2017-05-04T07:43:23Z</published>
+    <updated>2017-05-04T07:43:23Z</updated>
+    <title>Delete</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/delete</activity:verb>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2244602"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2244602.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-05-03:objectId=4952899:objectType=Status</id>
+    <published>2017-05-03T17:26:43Z</published>
+    <updated>2017-05-03T17:26:43Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://pleroma.soykaf.com/users/lain" class="u-url mention"&gt;@&lt;span&gt;lain&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; OK!!&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/lain"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2237124"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2237124.atom"/>
+    <thr:in-reply-to ref="https://pleroma.soykaf.com/objects/5e755d92-f0ee-432f-8c17-590962aea59c" href=""/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-05-03:objectId=4952810:objectType=Status</id>
+    <published>2017-05-03T17:24:34Z</published>
+    <updated>2017-05-03T17:24:34Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="el">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://pleroma.soykaf.com/users/lain" class="u-url mention"&gt;@&lt;span&gt;lain&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; yeah :)&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/lain"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2237089"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2237089.atom"/>
+    <thr:in-reply-to ref="https://pleroma.soykaf.com/objects/32ff0743-236a-41e5-81c5-a3211088e741" href=""/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-05-03:objectId=4950388:objectType=Status</id>
+    <published>2017-05-03T16:22:00Z</published>
+    <updated>2017-05-03T16:22:00Z</updated>
+    <title>lambadalambda shared a status by lambadalambda@social.heldscal.la</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+    <activity:object>
+      <id>tag:social.heldscal.la,2017-05-03:noticeId=2030733:objectType=note</id>
+      <published>2017-05-03T12:29:20Z</published>
+      <updated>2017-05-03T12:29:31Z</updated>
+      <title>New status by lambadalambda@social.heldscal.la</title>
+      <author>
+        <id>https://social.heldscal.la/user/23211</id>
+        <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+        <uri>https://social.heldscal.la/user/23211</uri>
+        <name>lambadalambda</name>
+        <email>lambadalambda@social.heldscal.la</email>
+        <summary type="html">Call me Deacon Blues.</summary>
+        <link rel="alternate" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+        <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/000/236/original/23211-original-20170416114255.jpeg"/>
+        <link rel="header" type="" media:width="700" media:height="335" href="/headers/original/missing.png"/>
+        <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+        <poco:displayName>Constance Variable</poco:displayName>
+        <poco:note>Call me Deacon Blues.</poco:note>
+        <mastodon:scope>public</mastodon:scope>
+      </author>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+      <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+      <content type="html" xml:lang="en">Time for work. &lt;a href="https://social.heldscal.la/file/953c117a1e7e4c763755d2ac29cf1aae08e025599f4a4cc11ddff4082c07f969.jpg"&gt;https://social.heldscal.la/attachment/120552&lt;/a&gt;</content>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+      <link rel="enclosure" type="image/jpeg" length="383072" href="https://files.mastodon.social/media_attachments/files/000/391/513/original/953c117a1e7e4c763755d2ac29cf1aae08e025599f4a4cc11ddff4082c07f969.jpg"/>
+      <mastodon:scope>public</mastodon:scope>
+      <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2030733"/>
+    </activity:object>
+    <content type="html" xml:lang="en">Time for work. &lt;a href="https://social.heldscal.la/file/953c117a1e7e4c763755d2ac29cf1aae08e025599f4a4cc11ddff4082c07f969.jpg"&gt;https://social.heldscal.la/attachment/120552&lt;/a&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2236405"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2236405.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-05-03:objectId=4934452:objectType=Status</id>
+    <published>2017-05-03T08:21:09Z</published>
+    <updated>2017-05-03T08:21:09Z</updated>
+    <title>lambadalambda shared a status by lain@pleroma.soykaf.com</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+    <activity:object>
+      <id>https://pleroma.soykaf.com/objects/4c1bda26-902e-4525-9fcd-b9fd44925193</id>
+      <published>2017-05-03T08:04:44Z</published>
+      <updated>2017-05-03T08:05:52Z</updated>
+      <title>New status by lain@pleroma.soykaf.com</title>
+      <author>
+        <id>https://pleroma.soykaf.com/users/lain</id>
+        <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+        <uri>https://pleroma.soykaf.com/users/lain</uri>
+        <name>lain</name>
+        <email>lain@pleroma.soykaf.com</email>
+        <summary type="html">Test account</summary>
+        <link rel="alternate" type="text/html" href="https://pleroma.soykaf.com/users/lain"/>
+        <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/125/902/original/6B3AFC74ACA841B24CFB94DB9044C84EDE6AFF31C71718B023D413DAED09A68E.jpeg"/>
+        <link rel="header" type="" media:width="700" media:height="335" href="/headers/original/missing.png"/>
+        <poco:preferredUsername>lain</poco:preferredUsername>
+        <poco:displayName>Lain Iwakura</poco:displayName>
+        <poco:note>Test account</poco:note>
+        <mastodon:scope>public</mastodon:scope>
+      </author>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+      <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+      <content type="html" xml:lang="en">Added returning the entries as xml... let's see if the mastodon hammering stops now.</content>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+      <mastodon:scope>public</mastodon:scope>
+      <link rel="alternate" type="text/html" href=""/>
+    </activity:object>
+    <content type="html" xml:lang="en">Added returning the entries as xml... let's see if the mastodon hammering stops now.</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2232660"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2232660.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-05-02:objectId=4905499:objectType=Status</id>
+    <published>2017-05-02T19:34:21Z</published>
+    <updated>2017-05-02T19:34:21Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="ru">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://pleroma.soykaf.com/users/lain" class="u-url mention"&gt;@&lt;span&gt;lain&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; yay!&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/lain"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2226006"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2226006.atom"/>
+    <thr:in-reply-to ref="https://pleroma.soykaf.com/objects/b79fa9cd-1d27-448a-844f-79f306bc75c9" href=""/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-05-02:objectId=4905442:objectType=Status</id>
+    <published>2017-05-02T19:33:33Z</published>
+    <updated>2017-05-02T19:33:33Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="fa">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://pleroma.soykaf.com/users/lain" class="u-url mention"&gt;@&lt;span&gt;lain&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; so?&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/lain"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2225992"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2225992.atom"/>
+    <thr:in-reply-to ref="https://pleroma.soykaf.com/objects/233a878a-974e-4e75-b1c8-aa7657f561fc" href=""/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-05-02:objectId=4901603:objectType=Status</id>
+    <published>2017-05-02T18:33:06Z</published>
+    <updated>2017-05-02T18:33:06Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="el">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://pleroma.soykaf.com/users/lain" class="u-url mention"&gt;@&lt;span&gt;lain&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; hey&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/lain"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2224923"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2224923.atom"/>
+    <thr:in-reply-to ref="https://pleroma.soykaf.com/objects/c237d966-ac75-4fe3-a87a-d89d71a3a7a4" href=""/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-05-01:objectId=4836720:objectType=Status</id>
+    <published>2017-05-01T18:52:16Z</published>
+    <updated>2017-05-01T18:52:16Z</updated>
+    <title>lambadalambda shared a status by lain@pleroma.soykaf.com</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+    <activity:object>
+      <id>https://pleroma.soykaf.com/objects/7b41bb51-9aba-436a-82d9-dd3f5aca98c9</id>
+      <published>2017-05-01T18:50:54Z</published>
+      <updated>2017-05-01T18:50:57Z</updated>
+      <title>New status by lain@pleroma.soykaf.com</title>
+      <author>
+        <id>https://pleroma.soykaf.com/users/lain</id>
+        <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+        <uri>https://pleroma.soykaf.com/users/lain</uri>
+        <name>lain</name>
+        <email>lain@pleroma.soykaf.com</email>
+        <summary type="html">Test account</summary>
+        <link rel="alternate" type="text/html" href="https://pleroma.soykaf.com/users/lain"/>
+        <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/125/902/original/6B3AFC74ACA841B24CFB94DB9044C84EDE6AFF31C71718B023D413DAED09A68E.jpeg"/>
+        <link rel="header" type="" media:width="700" media:height="335" href="/headers/original/missing.png"/>
+        <poco:preferredUsername>lain</poco:preferredUsername>
+        <poco:displayName>Lain Iwakura</poco:displayName>
+        <poco:note>Test account</poco:note>
+        <mastodon:scope>public</mastodon:scope>
+      </author>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+      <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+      <content type="html" xml:lang="en">&lt;a href="https://mastodon.social/users/lambadalambda"&gt;@lambadalambda@mastodon.social&lt;/a&gt;  you're an all-star.</content>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/lambadalambda"/>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+      <mastodon:scope>public</mastodon:scope>
+      <link rel="alternate" type="text/html" href=""/>
+      <thr:in-reply-to ref="tag:mastodon.social,2017-05-01:objectId=4836142:objectType=Status" href="https://mastodon.social/@lambadalambda/4836142"/>
+    </activity:object>
+    <content type="html" xml:lang="en">&lt;a href="https://mastodon.social/users/lambadalambda"&gt;@lambadalambda@mastodon.social&lt;/a&gt;  you're an all-star.</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2211632"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2211632.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-05-01:objectId=4836142:objectType=Status</id>
+    <published>2017-05-01T18:38:47Z</published>
+    <updated>2017-05-01T18:38:47Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="ru">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://pleroma.soykaf.com/users/lain" class="u-url mention"&gt;@&lt;span&gt;lain&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Hey now!&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/lain"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2211518"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2211518.atom"/>
+    <thr:in-reply-to ref="https://pleroma.soykaf.com/objects/ffae4bea-00a3-4cef-8076-4ee4d448cb46" href=""/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-05-01:objectId=4836055:objectType=Status</id>
+    <published>2017-05-01T18:37:04Z</published>
+    <updated>2017-05-01T18:37:04Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="el">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://pleroma.soykaf.com/users/lain" class="u-url mention"&gt;@&lt;span&gt;lain&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; hello&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/lain"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2211496"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2211496.atom"/>
+    <thr:in-reply-to ref="https://pleroma.soykaf.com/objects/ffae4bea-00a3-4cef-8076-4ee4d448cb46" href=""/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-05-01:objectId=4834850:objectType=Status</id>
+    <published>2017-05-01T18:10:43Z</published>
+    <updated>2017-05-01T18:10:43Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="el">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://pleroma.soykaf.com/users/lain" class="u-url mention"&gt;@&lt;span&gt;lain&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Hey!&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/lain"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2211256"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2211256.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-29:objectId=4694455:objectType=Status</id>
+    <published>2017-04-29T18:39:12Z</published>
+    <updated>2017-04-29T18:39:12Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="ru">&lt;p&gt;@lain@pleroma.soykaf.com What&amp;apos;s up?&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2189604"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2189604.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-29:objectId=4694384:objectType=Status</id>
+    <published>2017-04-29T18:37:32Z</published>
+    <updated>2017-04-29T18:37:32Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="fr">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://social.heldscal.la/lain" class="u-url mention"&gt;@&lt;span&gt;lain&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Hey.&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://social.heldscal.la/user/37181"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2189588"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2189588.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-07:objectId=1874242:objectType=Status</id>
+    <published>2017-04-07T11:02:56Z</published>
+    <updated>2017-04-07T11:02:56Z</updated>
+    <title>lambadalambda shared a status by 0xroy@social.wxcafe.net</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+    <activity:object>
+      <id>tag:social.wxcafe.net,2017-04-07:objectId=72554:objectType=Status</id>
+      <published>2017-04-07T11:01:59Z</published>
+      <updated>2017-04-07T11:02:00Z</updated>
+      <title>New status by 0xroy@social.wxcafe.net</title>
+      <author>
+        <id>https://social.wxcafe.net/users/0xroy</id>
+        <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+        <uri>https://social.wxcafe.net/users/0xroy</uri>
+        <name>0xroy</name>
+        <email>0xroy@social.wxcafe.net</email>
+        <summary type="html">ta caution weeb | discussions privées : &lt;a href="https://%F0%9F%92%8C.0xroy.me"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;💌.0xroy.me&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;</summary>
+        <link rel="alternate" type="text/html" href="https://social.wxcafe.net/@0xroy"/>
+        <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/036/953/original/20068e41d0310172.jpg"/>
+        <link rel="header" type="image/jpeg" media:width="700" media:height="335" href="https://files.mastodon.social/accounts/headers/000/036/953/original/2229d0e3f129fe8c.jpg"/>
+        <poco:preferredUsername>0xroy</poco:preferredUsername>
+        <poco:displayName>「R O Y  🍵 B O S」</poco:displayName>
+        <poco:note>ta caution weeb | discussions privées : https://💌.0xroy.me</poco:note>
+        <mastodon:scope>public</mastodon:scope>
+      </author>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+      <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+      <content type="html" xml:lang="en">&lt;p&gt;someone pls eli5 matrix (protocol) and riot&lt;/p&gt;</content>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+      <mastodon:scope>public</mastodon:scope>
+      <link rel="alternate" type="text/html" href="https://social.wxcafe.net/users/0xroy/updates/4510"/>
+    </activity:object>
+    <content type="html" xml:lang="en">&lt;p&gt;someone pls eli5 matrix (protocol) and riot&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1689208"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1689208.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-06:objectId=1768247:objectType=Status</id>
+    <published>2017-04-06T11:10:19Z</published>
+    <updated>2017-04-06T11:10:19Z</updated>
+    <title>lambadalambda shared a status by areyoutoo@mastodon.xyz</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+    <activity:object>
+      <id>tag:mastodon.xyz,2017-04-05:objectId=133327:objectType=Status</id>
+      <published>2017-04-05T17:36:41Z</published>
+      <updated>2017-04-05T18:12:14Z</updated>
+      <title>New status by areyoutoo@mastodon.xyz</title>
+      <author>
+        <id>https://mastodon.xyz/users/areyoutoo</id>
+        <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+        <uri>https://mastodon.xyz/users/areyoutoo</uri>
+        <name>areyoutoo</name>
+        <email>areyoutoo@mastodon.xyz</email>
+        <summary type="html">devops | retired gamedev | always boost puppy pics</summary>
+        <link rel="alternate" type="text/html" href="https://mastodon.xyz/@areyoutoo"/>
+        <link rel="avatar" type="image/png" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/047/888/original/5ce2e132d4c18d65.png"/>
+        <link rel="header" type="image/png" media:width="700" media:height="335" href="https://files.mastodon.social/accounts/headers/000/047/888/original/missing.png"/>
+        <poco:preferredUsername>areyoutoo</poco:preferredUsername>
+        <poco:displayName>Raw Butter</poco:displayName>
+        <poco:note>devops | retired gamedev | always boost puppy pics</poco:note>
+        <mastodon:scope>public</mastodon:scope>
+      </author>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+      <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+      <content type="html" xml:lang="en">&lt;p&gt;Some UX thoughts for &lt;a href="https://mastodon.xyz/tags/mastodev"&gt;#&lt;span&gt;mastodev&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;- Would be nice if I could work on multiple draft toots? Clicking to reply to someone seems to erase any draft I had been working on.&lt;/p&gt;&lt;p&gt;- Kinda risky to click on the Federated Timeline if it loads new toots and scrolls 10ms before I click on something.&lt;/p&gt;&lt;p&gt;I probably don't know enough web frontend to help, but it might be fun to try.&lt;/p&gt;</content>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+      <category term="mastodev"/>
+      <mastodon:scope>public</mastodon:scope>
+      <link rel="alternate" type="text/html" href="https://mastodon.xyz/users/areyoutoo/updates/36028"/>
+    </activity:object>
+    <content type="html" xml:lang="en">&lt;p&gt;Some UX thoughts for &lt;a href="https://mastodon.xyz/tags/mastodev"&gt;#&lt;span&gt;mastodev&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;- Would be nice if I could work on multiple draft toots? Clicking to reply to someone seems to erase any draft I had been working on.&lt;/p&gt;&lt;p&gt;- Kinda risky to click on the Federated Timeline if it loads new toots and scrolls 10ms before I click on something.&lt;/p&gt;&lt;p&gt;I probably don't know enough web frontend to help, but it might be fun to try.&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1658950"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1658950.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-06:objectId=1764509:objectType=Status</id>
+    <published>2017-04-06T10:15:38Z</published>
+    <updated>2017-04-06T10:15:38Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <summary xml:lang="en">This is a test for cw federation</summary>
+    <content type="html" xml:lang="en">&lt;p&gt;This is a test for cw federation body text.&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1657819"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1657819.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-05:objectId=1645208:objectType=Status</id>
+    <published>2017-04-05T07:14:53Z</published>
+    <updated>2017-04-05T07:14:53Z</updated>
+    <title>lambadalambda shared a status by lambadalambda@social.heldscal.la</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+    <activity:object>
+      <id>tag:social.heldscal.la,2017-04-05:noticeId=1502088:objectType=note</id>
+      <published>2017-04-05T06:12:09Z</published>
+      <updated>2017-04-05T07:12:47Z</updated>
+      <title>New status by lambadalambda@social.heldscal.la</title>
+      <author>
+        <id>https://social.heldscal.la/user/23211</id>
+        <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+        <uri>https://social.heldscal.la/user/23211</uri>
+        <name>lambadalambda</name>
+        <email>lambadalambda@social.heldscal.la</email>
+        <summary type="html">Call me Deacon Blues.</summary>
+        <link rel="alternate" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+        <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/000/236/original/23211-original-20170416114255.jpeg"/>
+        <link rel="header" type="" media:width="700" media:height="335" href="/headers/original/missing.png"/>
+        <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+        <poco:displayName>Constance Variable</poco:displayName>
+        <poco:note>Call me Deacon Blues.</poco:note>
+        <mastodon:scope>public</mastodon:scope>
+      </author>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+      <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+      <content type="html" xml:lang="en">Federation 101: &lt;a href="https://www.youtube.com/watch?v=t1lYU5CA40o"&gt;https://www.youtube.com/watch?v=t1lYU5CA40o&lt;/a&gt;</content>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+      <mastodon:scope>public</mastodon:scope>
+      <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1502088"/>
+    </activity:object>
+    <content type="html" xml:lang="en">Federation 101: &lt;a href="https://www.youtube.com/watch?v=t1lYU5CA40o"&gt;https://www.youtube.com/watch?v=t1lYU5CA40o&lt;/a&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1618003"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1618003.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-05:objectId=1641750:objectType=Status</id>
+    <published>2017-04-05T05:44:48Z</published>
+    <updated>2017-04-05T05:44:48Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://social.heldscal.la/lambadalambda" class="u-url mention"&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; just a test.&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://social.heldscal.la/user/23211"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1616358"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1616358.atom"/>
+  </entry>
+</feed>
diff --git a/test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.xml b/test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.xml
new file mode 100644 (file)
index 0000000..6a6a978
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
+  <Subject>acct:lambadalambda@mastodon.social</Subject>
+  <Alias>https://mastodon.social/@lambadalambda</Alias>
+  <Alias>https://mastodon.social/users/lambadalambda</Alias>
+  <Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="https://mastodon.social/@lambadalambda"/>
+  <Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda.atom"/>
+  <Link rel="salmon" href="https://mastodon.social/api/salmon/264"/>
+  <Link rel="magic-public-key" href="data:application/magic-public-key,RSA.w0P_Tq4gb4G_QVuMGbJoC_AfMNcv-m7NfrlOwkVzcU47jgESuYI4UtJayissCdBycHUnfVUd9qol-eznSODzCJhfJloqEIC-aSnuEPGA0POtWad6DU0E6_Ho5zQn5WAWUwbRQqowbrsm_GHo2-3veR5jGenwA6sYhINg_c3QQbksyV0uJ20Umyx88w8-TJuv53twOfmyDWuYNoQ3y5ccHKOZcLHxYOhvwg3PFaGfFHMFiNmF40dTXt9K96r7sbzc44iLD-VphbMPJEjkMuf8PGEFOBzy8pm3wJZw2v32RNW2VESwMYyqDzwHXGSq1a73cS7hEnc79gXlELsK04L9QQ==.AQAB"/>
+  <Link rel="http://ostatus.org/schema/1.0/subscribe" template="https://mastodon.social/authorize_follow?acct={uri}"/>
+</XRD>
diff --git a/test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain.xml b/test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain.xml
new file mode 100644 (file)
index 0000000..284a30d
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"><Subject>acct:lain@pleroma.soykaf.com</Subject><Alias>https://pleroma.soykaf.com/users/lain</Alias><Link href="https://pleroma.soykaf.com/users/lain/feed.atom" rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" /><Link href="https://pleroma.soykaf.com/users/lain" rel="http://webfinger.net/rel/profile-page" type="text/html" /><Link href="https://pleroma.soykaf.com/users/lain/salmon" rel="salmon" /><Link href="data:application/magic-public-key,RSA.u39dKLin8N4PywPvasEGXstOMsgg9m1OEKnpfHnSHqc6UOtIPs5-aI_LcLbhIEH2EVl6jstvtqMIloPch1FizZ3OBiKz81dXTiEZ3NfKgj_GJfIlipChAadxrmUyWT_Pr0qPaF1vhPrkSTwR8iDNUiQ-OEggRPpJVkJ619MXNdsJE59yklZiD1WY0vC9aG9m-dh0BANKNwSjwfZ3uFjDh0UosMATKjPTSO_I59nK_lArex_jAwTnVm6Dryk2qR2XXZyzTzZAHuYqSM77RlsNTJUCOaSadl816eZAvU3TF-ibIou0D-0sN-M-QehRh93sVJ95U40GQz8jOGc_5wK8xw==.AQAB" rel="magic-public-key" /></XRD>
\ No newline at end of file
diff --git a/test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml b/test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml
new file mode 100644 (file)
index 0000000..a2a2629
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0"><id>https://pleroma.soykaf.com/users/lain/feed.atom</id><title>lain's timeline</title><updated>2017-05-05T08:38:03.385598</updated><link rel="hub" href="https://pleroma.soykaf.com/push/hub/lain"/><link rel="salmon" href="https://pleroma.soykaf.com/users/lain/salmon"/><link rel="self" href="https://pleroma.soykaf.com/users/lain/feed.atom" type="application/atom+xml"/><author><id>https://pleroma.soykaf.com/users/lain</id><activity:object>http://activitystrea.ms/schema/1.0/person</activity:object><uri>https://pleroma.soykaf.com/users/lain</uri><poco:preferredUsername>lain</poco:preferredUsername><poco:displayName>Lain Iwakura</poco:displayName><poco:note>Test account</poco:note><name>lain</name><link rel="avatar" href="https://pleroma.soykaf.com/media/dbd1aa2f-21a3-4333-955f-67c0ac988cc2/6B3AFC74ACA841B24CFB94DB9044C84EDE6AFF31C71718B023D413DAED09A68E.jpeg"/></author><entry><activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb><id>https://pleroma.soykaf.com/activities/579e4224-b2ab-4ffa-8bbe-f7197a0a38d1</id><title>lain repeated a notice</title><content type="html">RT In just seven days, I can make you a man!&lt;br&gt;            -- The Rocky Horror Picture Show</content><published>2017-05-05T08:38:03.385590</published><updated>2017-05-05T08:38:03.385598</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/e8673466-9642-4c9e-8781-f0f69d6b15ae</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/e8673466-9642-4c9e-8781-f0f69d6b15ae" rel="ostatus:conversation"/><link rel="self" type="application/atom+xml" href="https://pleroma.soykaf.com/activities/579e4224-b2ab-4ffa-8bbe-f7197a0a38d1"/><activity:object><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/53dd40f4-3069-45a1-863b-94a9b317093d</id><title>New note by fortune</title><content type="html">In just seven days, I can make you a man!&lt;br&gt;            -- The Rocky Horror Picture Show</content><published>2017-05-05T02:10:02.930802</published><updated>2017-05-05T08:38:03.423539</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/e8673466-9642-4c9e-8781-f0f69d6b15ae</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/e8673466-9642-4c9e-8781-f0f69d6b15ae" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/53dd40f4-3069-45a1-863b-94a9b317093d" rel="self"/><author><id>https://pleroma.soykaf.com/users/fortune</id><activity:object>http://activitystrea.ms/schema/1.0/person</activity:object><uri>https://pleroma.soykaf.com/users/fortune</uri><poco:preferredUsername>fortune</poco:preferredUsername><poco:displayName>fortune</poco:displayName><poco:note>The trusty unix fortune file</poco:note><name>fortune</name><link rel="avatar" href="https://pleroma.soykaf.com/media/07ed0371-2817-4d80-97e1-255ca632fac6/66BA0B957C5E18404D405029B6C2B01FF1A306FB6EEF3E1D1F4C30DEBB1156D7.jpeg"/></author><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/></activity:object><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/fortune"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/2bc86888-a256-4771-bb53-903f375804f9</id><title>New note by lain</title><content type="html">RTs federating into pleroma now.</content><published>2017-05-04T18:18:50.276470</published><updated>2017-05-04T18:18:50.276476</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/b7ae9350-f317-48aa-8058-2668091bb280</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/b7ae9350-f317-48aa-8058-2668091bb280" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/2bc86888-a256-4771-bb53-903f375804f9" rel="self"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/></entry><entry><activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb><id>https://pleroma.soykaf.com/activities/902b1f50-f295-4189-8c15-9c880919e121</id><title>New favorite by lain</title><content type="html">lain favorited something</content><published>2017-05-04T08:03:01.308890</published><updated>2017-05-04T08:03:01.308927</updated><activity:object><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><id>tag:gs.smuglo.li,2017-05-03:noticeId=2164642:objectType=comment</id></activity:object><ostatus:conversation>https://pleroma.soykaf.com/contexts/9419f742-aaba-4eb5-89a2-8b599e8bf43c</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/9419f742-aaba-4eb5-89a2-8b599e8bf43c" rel="ostatus:conversation"/><link rel="self" type="application/atom+xml" href="https://pleroma.soykaf.com/activities/902b1f50-f295-4189-8c15-9c880919e121"/><thr:in-reply-to ref="tag:gs.smuglo.li,2017-05-03:noticeId=2164642:objectType=comment"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://gs.smuglo.li/user/2"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/4e396e66-b063-454c-92c6-583506a9a2de</id><title>New note by lain</title><content type="html">Classic.&lt;br&gt;&lt;a href='https://pleroma.soykaf.com/media/adc36781-9765-4d9a-b57c-99b7a99108b2/mikodaemonstop.jpg'&gt;https://pleroma.soykaf.com/media/adc36781-9765-4d9a-b57c-99b7a99108b2/mikodaemonstop.jpg&lt;/a&gt;</content><published>2017-05-04T07:59:45.180619</published><updated>2017-05-04T07:59:45.180628</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/6afd9659-41e6-406d-ae97-43b880722861</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/6afd9659-41e6-406d-ae97-43b880722861" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/4e396e66-b063-454c-92c6-583506a9a2de" rel="self"/><link rel="enclosure" href="https://pleroma.soykaf.com/media/adc36781-9765-4d9a-b57c-99b7a99108b2/mikodaemonstop.jpg" type="image/jpeg"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/85d183e9-c935-4655-a1e6-8d69a4108235</id><title>New note by lain</title><content type="html">ん?&lt;br&gt;&lt;a href='https://pleroma.soykaf.com/media/ab144c6d-a38c-4d35-a60b-9a998becc094/n.gif'&gt;https://pleroma.soykaf.com/media/ab144c6d-a38c-4d35-a60b-9a998becc094/n.gif&lt;/a&gt;</content><published>2017-05-04T07:58:08.810716</published><updated>2017-05-04T07:58:08.810726</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/2e1aa616-86ce-4b50-9c81-63045a972156</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/2e1aa616-86ce-4b50-9c81-63045a972156" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/85d183e9-c935-4655-a1e6-8d69a4108235" rel="self"/><link rel="enclosure" href="https://pleroma.soykaf.com/media/ab144c6d-a38c-4d35-a60b-9a998becc094/n.gif" type="image/gif"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/7c5c45bb-e4d9-4f72-b4c6-0314afbd3553</id><title>New note by lain</title><content type="html">yeah.</content><published>2017-05-04T07:55:17.335290</published><updated>2017-05-04T07:55:17.335299</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/702c06cf-56ff-4a2f-bf5a-150bc00bb168</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/702c06cf-56ff-4a2f-bf5a-150bc00bb168" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/7c5c45bb-e4d9-4f72-b4c6-0314afbd3553" rel="self"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/f33f5f54-1c1d-4462-b9ed-229bb635dfd8</id><title>New note by lain</title><content type="html">yeah.</content><published>2017-05-04T07:49:24.931484</published><updated>2017-05-04T07:49:24.931492</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/c4932e7a-00cb-431a-b4ec-7404cb9daf65</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/c4932e7a-00cb-431a-b4ec-7404cb9daf65" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/f33f5f54-1c1d-4462-b9ed-229bb635dfd8" rel="self"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/></entry><entry><activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb><id>https://pleroma.soykaf.com/activities/0709bc79-7ac5-4983-b6d0-2205bf5ceba3</id><title>New favorite by lain</title><content type="html">lain favorited something</content><published>2017-05-03T20:08:11.294579</published><updated>2017-05-03T20:08:11.294587</updated><activity:object><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><id>tag:pawoo.net,2017-05-03:objectId=7967690:objectType=Status</id></activity:object><ostatus:conversation>https://pleroma.soykaf.com/contexts/07a4b34d-6255-4bb2-8c73-c295a09ac952</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/07a4b34d-6255-4bb2-8c73-c295a09ac952" rel="ostatus:conversation"/><link rel="self" type="application/atom+xml" href="https://pleroma.soykaf.com/activities/0709bc79-7ac5-4983-b6d0-2205bf5ceba3"/><thr:in-reply-to ref="tag:pawoo.net,2017-05-03:objectId=7967690:objectType=Status"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pawoo.net/users/God_Emperor_of_Dune"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/72c0288e-62d8-43d9-b3d8-1a9d78be8375</id><title>New note by lain</title><content type="html">&lt;a href='https://pawoo.net/users/God_Emperor_of_Dune'&gt;@God_Emperor_of_Dune@pawoo.net&lt;/a&gt; no man, just some fun domination play among buddies, nothing homo about it.</content><published>2017-05-03T20:01:00.998314</published><updated>2017-05-03T20:01:00.998322</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/07a4b34d-6255-4bb2-8c73-c295a09ac952</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/07a4b34d-6255-4bb2-8c73-c295a09ac952" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/72c0288e-62d8-43d9-b3d8-1a9d78be8375" rel="self"/><thr:in-reply-to ref="tag:pawoo.net,2017-05-03:objectId=7966029:objectType=Status"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pawoo.net/users/God_Emperor_of_Dune"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/d846409e-cf2a-4b68-a149-d5de34a91b0d</id><title>New note by lain</title><content type="html">&lt;a href='https://social.heldscal.la/user/24974'&gt;@dtluna@social.heldscal.la&lt;/a&gt; btfo.&lt;br&gt;&lt;a href='https://pleroma.soykaf.com/media/fbe42e87-5574-4544-89ba-29ddf46227fa/pnc__picked_media_1889ce61-4961-4fea-8a14-04fe6783ebf6.jpg'&gt;https://pleroma.soykaf.com/media/fbe42e87-5574-4544-89ba-29ddf46227fa/pnc__picked_media_1889ce61-4961-4fea-8a14-04fe6783ebf6.jpg&lt;/a&gt;</content><published>2017-05-03T20:00:15.860995</published><updated>2017-05-03T20:00:15.861002</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/0e88f35e-1a38-4181-bef9-5cbb0d943c63</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/0e88f35e-1a38-4181-bef9-5cbb0d943c63" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/d846409e-cf2a-4b68-a149-d5de34a91b0d" rel="self"/><link rel="enclosure" href="https://pleroma.soykaf.com/media/fbe42e87-5574-4544-89ba-29ddf46227fa/pnc__picked_media_1889ce61-4961-4fea-8a14-04fe6783ebf6.jpg" type="image/jpeg"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://social.heldscal.la/user/24974"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/9075265f-f3b2-40e8-809f-10714f05a1fd</id><title>New note by lain</title><content type="html">#nohomo &lt;br&gt;&lt;a href='https://pleroma.soykaf.com/media/5cc5ad91-d637-4c45-a691-5ea778dc1bb3/pnc__picked_media_f62dc9ae-ea23-4fe6-bf85-cb75a129ab34.jpg'&gt;https://pleroma.soykaf.com/media/5cc5ad91-d637-4c45-a691-5ea778dc1bb3/pnc__picked_media_f62dc9ae-ea23-4fe6-bf85-cb75a129ab34.jpg&lt;/a&gt;</content><published>2017-05-03T19:50:38.589106</published><updated>2017-05-03T19:50:38.589113</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/07a4b34d-6255-4bb2-8c73-c295a09ac952</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/07a4b34d-6255-4bb2-8c73-c295a09ac952" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/9075265f-f3b2-40e8-809f-10714f05a1fd" rel="self"/><link rel="enclosure" href="https://pleroma.soykaf.com/media/5cc5ad91-d637-4c45-a691-5ea778dc1bb3/pnc__picked_media_f62dc9ae-ea23-4fe6-bf85-cb75a129ab34.jpg" type="image/jpeg"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/></entry><entry><activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb><id>https://pleroma.soykaf.com/activities/7924e992-0a95-40d9-8d17-7278c6c634c9</id><title>New favorite by lain</title><content type="html">lain favorited something</content><published>2017-05-03T18:32:59.273375</published><updated>2017-05-03T18:32:59.273382</updated><activity:object><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><id>tag:gs.smuglo.li,2017-05-03:noticeId=2164774:objectType=comment</id></activity:object><ostatus:conversation>https://pleroma.soykaf.com/contexts/9419f742-aaba-4eb5-89a2-8b599e8bf43c</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/9419f742-aaba-4eb5-89a2-8b599e8bf43c" rel="ostatus:conversation"/><link rel="self" type="application/atom+xml" href="https://pleroma.soykaf.com/activities/7924e992-0a95-40d9-8d17-7278c6c634c9"/><thr:in-reply-to ref="tag:gs.smuglo.li,2017-05-03:noticeId=2164774:objectType=comment"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://gs.smuglo.li/user/2"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/569571ba-f54c-41b0-bde4-0fede54599f0</id><title>New note by lain</title><content type="html">&lt;a href='https://gs.smuglo.li/user/2'&gt;@nepfag@gs.smuglo.li&lt;/a&gt;@gs.smuglo.li I'll do proper subfolders soon, for now it's one per attachment + thumbs etc.</content><published>2017-05-03T18:27:01.449949</published><updated>2017-05-03T18:27:01.449956</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/9419f742-aaba-4eb5-89a2-8b599e8bf43c</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/9419f742-aaba-4eb5-89a2-8b599e8bf43c" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/569571ba-f54c-41b0-bde4-0fede54599f0" rel="self"/><thr:in-reply-to ref="tag:gs.smuglo.li,2017-05-03:noticeId=2164642:objectType=comment"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://gs.smuglo.li/user/2"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb><id>https://pleroma.soykaf.com/activities/b6cc5d7c-0785-4785-a689-f1b05dc9b24d</id><title>lain repeated a notice</title><content type="html">RT &lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://pleroma.soykaf.com/users/lain" class="u-url mention"&gt;@&lt;span&gt;lain&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Hey now!&lt;/p&gt;</content><published>2017-05-03T18:13:48.891061</published><updated>2017-05-03T18:13:48.891069</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/ec6fdd27-0ec1-4672-8408-5a8e5a9c094b</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/ec6fdd27-0ec1-4672-8408-5a8e5a9c094b" rel="ostatus:conversation"/><link rel="self" type="application/atom+xml" href="https://pleroma.soykaf.com/activities/b6cc5d7c-0785-4785-a689-f1b05dc9b24d"/><activity:object><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>tag:mastodon.social,2017-05-01:objectId=4836142:objectType=Status</id><title>New note by lambadalambda@mastodon.social</title><content type="html">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://pleroma.soykaf.com/users/lain" class="u-url mention"&gt;@&lt;span&gt;lain&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Hey now!&lt;/p&gt;</content><published>2017-05-01T18:38:49.365391</published><updated>2017-05-03T18:13:48.934745</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/ec6fdd27-0ec1-4672-8408-5a8e5a9c094b</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/ec6fdd27-0ec1-4672-8408-5a8e5a9c094b" rel="ostatus:conversation"/><link type="application/atom+xml" href="tag:mastodon.social,2017-05-01:objectId=4836142:objectType=Status" rel="self"/><thr:in-reply-to ref="https://pleroma.soykaf.com/objects/ffae4bea-00a3-4cef-8076-4ee4d448cb46"/><author><id>https://mastodon.social/users/lambadalambda</id><activity:object>http://activitystrea.ms/schema/1.0/person</activity:object><uri>https://mastodon.social/users/lambadalambda</uri><poco:preferredUsername>lambadalambda@mastodon.social</poco:preferredUsername><poco:displayName>Critical Value</poco:displayName><poco:note>nil</poco:note><name>lambadalambda@mastodon.social</name><link rel="avatar" href="https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif"/></author><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/lain"/></activity:object><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/lambadalambda"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb><id>https://pleroma.soykaf.com/activities/3c09eb31-4ba8-4ff5-b4fa-8f6f74d58bf0</id><title>lain repeated a notice</title><content type="html">RT Haha, salmons from mastodon didn't work because it's not implementing conversation id...</content><published>2017-05-03T18:13:15.148041</published><updated>2017-05-03T18:13:15.148049</updated><ostatus:conversation>tag:social.heldscal.la,2017-05-01:objectType=thread:nonce=86cda6c734401d80</ostatus:conversation><link href="tag:social.heldscal.la,2017-05-01:objectType=thread:nonce=86cda6c734401d80" rel="ostatus:conversation"/><link rel="self" type="application/atom+xml" href="https://pleroma.soykaf.com/activities/3c09eb31-4ba8-4ff5-b4fa-8f6f74d58bf0"/><activity:object><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>tag:social.heldscal.la,2017-05-01:noticeId=2000425:objectType=note</id><title>New note by lambadalambda@social.heldscal.la</title><content type="html">Haha, salmons from mastodon didn't work because it's not implementing conversation id...</content><published>2017-05-01T18:39:36.216377</published><updated>2017-05-03T18:13:15.171143</updated><ostatus:conversation>tag:social.heldscal.la,2017-05-01:objectType=thread:nonce=86cda6c734401d80</ostatus:conversation><link href="tag:social.heldscal.la,2017-05-01:objectType=thread:nonce=86cda6c734401d80" rel="ostatus:conversation"/><link type="application/atom+xml" href="tag:social.heldscal.la,2017-05-01:noticeId=2000425:objectType=note" rel="self"/><author><id>https://social.heldscal.la/user/23211</id><activity:object>http://activitystrea.ms/schema/1.0/person</activity:object><uri>https://social.heldscal.la/user/23211</uri><poco:preferredUsername>lambadalambda@social.heldscal.la</poco:preferredUsername><poco:displayName>Constance Variable</poco:displayName><poco:note>nil</poco:note><name>lambadalambda@social.heldscal.la</name><link rel="avatar" href="https://social.heldscal.la/avatar/23211-original-20170416114255.jpeg"/></author><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/></activity:object><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://social.heldscal.la/user/23211"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/b8fc83d5-d7c0-4b5f-8976-0317b51935ea</id><title>New note by lain</title><content type="html">.&lt;br&gt;&lt;a href='https://pleroma.soykaf.com/media/563008a7-9a60-47ac-a263-22835729adf6/1492530528735.png'&gt;https://pleroma.soykaf.com/media/563008a7-9a60-47ac-a263-22835729adf6/1492530528735.png&lt;/a&gt;</content><published>2017-05-03T18:12:50.745241</published><updated>2017-05-03T18:12:50.745249</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/9419f742-aaba-4eb5-89a2-8b599e8bf43c</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/9419f742-aaba-4eb5-89a2-8b599e8bf43c" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/b8fc83d5-d7c0-4b5f-8976-0317b51935ea" rel="self"/><link rel="enclosure" href="https://pleroma.soykaf.com/media/563008a7-9a60-47ac-a263-22835729adf6/1492530528735.png" type="image/png"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb><id>https://pleroma.soykaf.com/activities/ac93ecef-cde0-48e8-ae4b-19e3b94dbe30</id><title>lain repeated a notice</title><content type="html">RT Awright, which one of you hid my PENIS ENVY?</content><published>2017-05-03T18:08:49.231001</published><updated>2017-05-03T18:08:49.235354</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/a9132cf8-6afa-4dd8-8b29-7b6fcab623b8</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/a9132cf8-6afa-4dd8-8b29-7b6fcab623b8" rel="ostatus:conversation"/><link rel="self" type="application/atom+xml" href="https://pleroma.soykaf.com/activities/ac93ecef-cde0-48e8-ae4b-19e3b94dbe30"/><activity:object><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/04e15c66-4936-4930-a134-32841f088bcf</id><title>New note by fortune</title><content type="html">Awright, which one of you hid my PENIS ENVY?</content><published>2017-05-01T19:40:03.169996</published><updated>2017-05-03T18:08:49.285347</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/a9132cf8-6afa-4dd8-8b29-7b6fcab623b8</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/a9132cf8-6afa-4dd8-8b29-7b6fcab623b8" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/04e15c66-4936-4930-a134-32841f088bcf" rel="self"/><author><id>https://pleroma.soykaf.com/users/fortune</id><activity:object>http://activitystrea.ms/schema/1.0/person</activity:object><uri>https://pleroma.soykaf.com/users/fortune</uri><poco:preferredUsername>fortune</poco:preferredUsername><poco:displayName>fortune</poco:displayName><poco:note>The trusty unix fortune file</poco:note><name>fortune</name><link rel="avatar" href="https://pleroma.soykaf.com/media/07ed0371-2817-4d80-97e1-255ca632fac6/66BA0B957C5E18404D405029B6C2B01FF1A306FB6EEF3E1D1F4C30DEBB1156D7.jpeg"/></author><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/></activity:object><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/fortune"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb><id>https://pleroma.soykaf.com/activities/54b10fa9-d602-4a0f-b659-e6d3f7bc8c4c</id><title>lain repeated a notice</title><content type="html">RT He is a man capable of turning any colour into grey.&lt;br&gt;           -- John LeCarre</content><published>2017-05-03T17:44:47.578984</published><updated>2017-05-03T17:44:47.578996</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/8aebc8e5-5352-4047-8b74-4098a5830cca</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/8aebc8e5-5352-4047-8b74-4098a5830cca" rel="ostatus:conversation"/><link rel="self" type="application/atom+xml" href="https://pleroma.soykaf.com/activities/54b10fa9-d602-4a0f-b659-e6d3f7bc8c4c"/><activity:object><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/70ded299-184d-49cd-af17-23c0950536aa</id><title>New note by fortune</title><content type="html">He is a man capable of turning any colour into grey.&lt;br&gt;          -- John LeCarre</content><published>2017-05-02T08:40:03.419465</published><updated>2017-05-03T17:44:47.646192</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/8aebc8e5-5352-4047-8b74-4098a5830cca</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/8aebc8e5-5352-4047-8b74-4098a5830cca" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/70ded299-184d-49cd-af17-23c0950536aa" rel="self"/><author><id>https://pleroma.soykaf.com/users/fortune</id><activity:object>http://activitystrea.ms/schema/1.0/person</activity:object><uri>https://pleroma.soykaf.com/users/fortune</uri><poco:preferredUsername>fortune</poco:preferredUsername><poco:displayName>fortune</poco:displayName><poco:note>The trusty unix fortune file</poco:note><name>fortune</name><link rel="avatar" href="https://pleroma.soykaf.com/media/07ed0371-2817-4d80-97e1-255ca632fac6/66BA0B957C5E18404D405029B6C2B01FF1A306FB6EEF3E1D1F4C30DEBB1156D7.jpeg"/></author><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/></activity:object><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/fortune"/></entry><entry><activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb><id>https://pleroma.soykaf.com/activities/eff9fe49-8fc9-48e6-a1a0-921aa25c8118</id><title>lain repeated a notice</title><content type="html">RT The real trouble with women is that they have *all* the pussy.</content><published>2017-05-03T17:30:22.596037</published><updated>2017-05-03T17:30:22.596048</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/8c88c9df-4e40-4f54-b15f-c21848d1a8e2</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/8c88c9df-4e40-4f54-b15f-c21848d1a8e2" rel="ostatus:conversation"/><link rel="self" type="application/atom+xml" href="https://pleroma.soykaf.com/activities/eff9fe49-8fc9-48e6-a1a0-921aa25c8118"/><activity:object><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb><id>https://pleroma.soykaf.com/objects/0b9b008d-49eb-48a9-a18d-172ce7d01ea2</id><title>New note by fortune</title><content type="html">The real trouble with women is that they have *all* the pussy.</content><published>2017-05-02T12:10:03.603086</published><updated>2017-05-03T17:30:22.683141</updated><ostatus:conversation>https://pleroma.soykaf.com/contexts/8c88c9df-4e40-4f54-b15f-c21848d1a8e2</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/8c88c9df-4e40-4f54-b15f-c21848d1a8e2" rel="ostatus:conversation"/><link type="application/atom+xml" href="https://pleroma.soykaf.com/objects/0b9b008d-49eb-48a9-a18d-172ce7d01ea2" rel="self"/><author><id>https://pleroma.soykaf.com/users/fortune</id><activity:object>http://activitystrea.ms/schema/1.0/person</activity:object><uri>https://pleroma.soykaf.com/users/fortune</uri><poco:preferredUsername>fortune</poco:preferredUsername><poco:displayName>fortune</poco:displayName><poco:note>The trusty unix fortune file</poco:note><name>fortune</name><link rel="avatar" href="https://pleroma.soykaf.com/media/07ed0371-2817-4d80-97e1-255ca632fac6/66BA0B957C5E18404D405029B6C2B01FF1A306FB6EEF3E1D1F4C30DEBB1156D7.jpeg"/></author><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/></activity:object><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/fortune"/></entry><entry><activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb><id>https://pleroma.soykaf.com/activities/5d90bb26-ce23-4a5b-8dbd-651011780007</id><title>New favorite by lain</title><content type="html">lain favorited something</content><published>2017-05-03T17:28:20.967926</published><updated>2017-05-03T17:28:20.967935</updated><activity:object><activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type><id>tag:mastodon.social,2017-05-03:objectId=4952899:objectType=Status</id></activity:object><ostatus:conversation>https://pleroma.soykaf.com/contexts/42701ab4-964a-441a-a372-f51bd183e441</ostatus:conversation><link href="https://pleroma.soykaf.com/contexts/42701ab4-964a-441a-a372-f51bd183e441" rel="ostatus:conversation"/><link rel="self" type="application/atom+xml" href="https://pleroma.soykaf.com/activities/5d90bb26-ce23-4a5b-8dbd-651011780007"/><thr:in-reply-to ref="tag:mastodon.social,2017-05-03:objectId=4952899:objectType=Status"/><link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/lambadalambda"/></entry></feed>
\ No newline at end of file
diff --git a/test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml b/test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml
new file mode 100644 (file)
index 0000000..26fdebb
--- /dev/null
@@ -0,0 +1,54 @@
+<entry xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:media="http://purl.org/syndication/atommedia" xmlns:statusnet="http://status.net/schema/api/1/">
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment</id>
+ <title>New comment by moonman</title>
+ <content type="html">@&lt;a href=&quot;https://shitposter.club/user/9655&quot; class=&quot;h-card mention&quot; title=&quot;Solidarity for Pigs&quot;&gt;neimzr4luzerz&lt;/a&gt; @&lt;a href=&quot;https://gs.smuglo.li/user/2326&quot; class=&quot;h-card mention&quot; title=&quot;Dolus_McHonest&quot;&gt;dolus&lt;/a&gt; childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2827873"/>
+ <status_net notice_id="2827873"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T08:51:48+00:00</published>
+ <updated>2017-05-05T08:51:48+00:00</updated>
+ <author>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <uri>https://shitposter.club/user/1</uri>
+  <name>moonman</name>
+  <summary>EMAIL:shitposterclub@gmail.com XMPP: moon@talk.shitposter.club Matrix Ed25519 fingerprint: 2HuDUTEz3iFN5N3xl6PYp9xZW/EWhgbbt78SrFy4w8o</summary>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/moonman"/>
+  <link rel="avatar" type="image/jpeg" media:width="1040" media:height="1040" href="https://shitposter.club/avatar/1-original-20170503024316.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://shitposter.club/avatar/1-96-20170503024316.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://shitposter.club/avatar/1-48-20170503024316.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://shitposter.club/avatar/1-24-20170503024318.jpeg"/>
+  <poco:preferredUsername>moonman</poco:preferredUsername>
+  <poco:displayName>Generic Enemy</poco:displayName>
+  <poco:note>EMAIL:shitposterclub@gmail.com XMPP: moon@talk.shitposter.club Matrix Ed25519 fingerprint: 2HuDUTEz3iFN5N3xl6PYp9xZW/EWhgbbt78SrFy4w8o</poco:note>
+  <poco:address>
+   <poco:formatted>The Moon</poco:formatted>
+  </poco:address>
+  <poco:urls>
+   <poco:type>homepage</poco:type>
+   <poco:value>https://shitposter.club/moonman</poco:value>
+   <poco:primary>true</poco:primary>
+  </poco:urls>
+  <followers url="https://shitposter.club/moonman/subscribers"></followers>
+  <statusnet:profile_info local_id="1"></statusnet:profile_info>
+ </author>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2827849:objectType=comment" href="https://shitposter.club/notice/2827849"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2827849"/>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390270"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390270" local_id="1390270" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26">tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://gs.smuglo.li/user/2326"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://shitposter.club/user/9655"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <source>
+  <id>https://shitposter.club/api/statuses/user_timeline/1.atom</id>
+  <title>Generic Enemy</title>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/moonman"/>
+  <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/user_timeline/1.atom"/>
+  <link rel="license" href="https://shitposter.club/doc/tos"/>
+  <icon>https://shitposter.club/avatar/1-96-20170503024316.jpeg</icon>
+  <updated>2017-05-05T11:43:58+00:00</updated>
+ </source>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2827873.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2827873.atom"/>
+ <statusnet:notice_info local_id="2827873" source="Qvitter"></statusnet:notice_info>
+</entry>
diff --git a/test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml b/test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml
new file mode 100644 (file)
index 0000000..31df7c2
--- /dev/null
@@ -0,0 +1,454 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
+ <generator uri="https://gnu.io/social" version="1.2.0-beta4">GNU social</generator>
+ <id>https://shitposter.club/api/statuses/user_timeline/1.atom</id>
+ <title>moonman timeline</title>
+ <subtitle>Updates from moonman on Shitposter Club!</subtitle>
+ <logo>https://shitposter.club/avatar/1-96-20170503024316.jpeg</logo>
+ <updated>2017-05-05T13:24:09+00:00</updated>
+<author>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <uri>https://shitposter.club/user/1</uri>
+ <name>moonman</name>
+ <summary>EMAIL:shitposterclub@gmail.com XMPP: moon@talk.shitposter.club Matrix Ed25519 fingerprint: 2HuDUTEz3iFN5N3xl6PYp9xZW/EWhgbbt78SrFy4w8o</summary>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/moonman"/>
+ <link rel="avatar" type="image/jpeg" media:width="1040" media:height="1040" href="https://shitposter.club/avatar/1-original-20170503024316.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://shitposter.club/avatar/1-96-20170503024316.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://shitposter.club/avatar/1-48-20170503024316.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://shitposter.club/avatar/1-24-20170503024318.jpeg"/>
+ <poco:preferredUsername>moonman</poco:preferredUsername>
+ <poco:displayName>Generic Enemy</poco:displayName>
+ <poco:note>EMAIL:shitposterclub@gmail.com XMPP: moon@talk.shitposter.club Matrix Ed25519 fingerprint: 2HuDUTEz3iFN5N3xl6PYp9xZW/EWhgbbt78SrFy4w8o</poco:note>
+ <poco:address>
+  <poco:formatted>The Moon</poco:formatted>
+ </poco:address>
+ <poco:urls>
+  <poco:type>homepage</poco:type>
+  <poco:value>https://shitposter.club/moonman</poco:value>
+  <poco:primary>true</poco:primary>
+ </poco:urls>
+ <followers url="https://shitposter.club/moonman/subscribers"></followers>
+ <statusnet:profile_info local_id="1"></statusnet:profile_info>
+</author>
+ <link href="https://shitposter.club/moonman" rel="alternate" type="text/html"/>
+ <link href="https://shitposter.club/main/sup" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="https://shitposter.club/api/statuses/user_timeline/1.atom?max_id=2828044" rel="next" type="application/atom+xml"/>
+ <link href="https://shitposter.club/main/push/hub" rel="hub"/>
+ <link href="https://shitposter.club/main/salmon/user/1" rel="salmon"/>
+ <link href="https://shitposter.club/main/salmon/user/1" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="https://shitposter.club/main/salmon/user/1" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="https://shitposter.club/api/statuses/user_timeline/1.atom" rel="self" type="application/atom+xml"/>
+<entry>
+ <id>tag:shitposter.club,2017-05-05:subscription:1:person:23190:2017-05-05T11:43:58+00:00</id>
+ <title>Generic Enemy (moonman)'s status on Friday, 05-May-2017 11:43:58 UTC</title>
+ <content type="html">&lt;a href=&quot;https://shitposter.club/moonman&quot;&gt;Generic Enemy&lt;/a&gt; started following &lt;a href=&quot;https://noagendasocial.com/@Ma5on&quot;&gt;Mason&lt;/a&gt;.</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2829381"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/follow</activity:verb>
+ <published>2017-05-05T11:43:58+00:00</published>
+ <updated>2017-05-05T11:43:58+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <id>https://noagendasocial.com/users/Ma5on</id>
+  <title>Mason</title>
+  <link rel="alternate" type="text/html" href="https://noagendasocial.com/@Ma5on"/>
+  <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://shitposter.club/avatar/23190-original-20170505114356.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://shitposter.club/avatar/23190-96-20170505114358.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://shitposter.club/avatar/23190-48-20170505114358.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://shitposter.club/avatar/23190-24-20170505114358.jpeg"/>
+  <poco:preferredUsername>ma5on</poco:preferredUsername>
+  <poco:displayName>Mason</poco:displayName>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1391451"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1391451" local_id="1391451" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=abffa9c14a054d3b">tag:shitposter.club,2017-05-05:objectType=thread:nonce=abffa9c14a054d3b</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2829381.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2829381.atom"/>
+ <statusnet:notice_info local_id="2829381" source="activity"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:shitposter.club,2017-05-05:subscription:1:person:14357:2017-05-05T10:29:03+00:00</id>
+ <title>Generic Enemy (moonman)'s status on Friday, 05-May-2017 10:29:03 UTC</title>
+ <content type="html">&lt;a href=&quot;https://shitposter.club/moonman&quot;&gt;Generic Enemy&lt;/a&gt; started following &lt;a href=&quot;https://mastodon.cloud/@ohyran&quot;&gt;Jens Reuterberg&lt;/a&gt;.</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828682"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/follow</activity:verb>
+ <published>2017-05-05T10:29:03+00:00</published>
+ <updated>2017-05-05T10:29:03+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <id>https://mastodon.cloud/users/ohyran</id>
+  <title>Jens Reuterberg</title>
+  <summary>RPG-nerd, illustrator, Open Source enthusiast, KDE dude, designer and gay lefty. Might be a cliché - but we will soon find out!</summary>
+  <link rel="alternate" type="text/html" href="https://mastodon.cloud/@ohyran"/>
+  <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://shitposter.club/avatar/14357-original-20170505110123.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://shitposter.club/avatar/14357-96-20170505110757.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://shitposter.club/avatar/14357-48-20170505110757.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://shitposter.club/avatar/14357-24-20170505110757.jpeg"/>
+  <poco:preferredUsername>ohyran</poco:preferredUsername>
+  <poco:displayName>Jens Reuterberg</poco:displayName>
+  <poco:note>RPG-nerd, illustrator, Open Source enthusiast, KDE dude, designer and gay lefty. Might be a cliché - but we will soon find out!</poco:note>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390971"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390971" local_id="1390971" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=937151d4825a85bf">tag:shitposter.club,2017-05-05:objectType=thread:nonce=937151d4825a85bf</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828682.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828682.atom"/>
+ <statusnet:notice_info local_id="2828682" source="activity"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828637:objectType=note</id>
+ <title>New note by moonman</title>
+ <content type="html">basicall i would just rather have ppl say &amp;quot;i like x and y&amp;quot; than &amp;quot;i'm a nerd&amp;quot; the term can be retired.</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828637"/>
+ <status_net notice_id="2828637"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T10:24:54+00:00</published>
+ <updated>2017-05-05T10:24:54+00:00</updated>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390949"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390949" local_id="1390949" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=65992b0b9b5e6931">tag:shitposter.club,2017-05-05:objectType=thread:nonce=65992b0b9b5e6931</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828637.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828637.atom"/>
+ <statusnet:notice_info local_id="2828637" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828579:objectType=comment</id>
+ <title>New comment by moonman</title>
+ <content type="html">@&lt;a href=&quot;https://gs.smuglo.li/user/35497&quot; class=&quot;h-card mention&quot; title=&quot;Bokuro Bokusawa&quot;&gt;boco&lt;/a&gt; to be honest i've turned right around and been cruel to other people, i said i'd never do it but it happens again eventually.</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828579"/>
+ <status_net notice_id="2828579"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T10:20:33+00:00</published>
+ <updated>2017-05-05T10:20:33+00:00</updated>
+ <thr:in-reply-to ref="tag:gs.smuglo.li,2017-05-05:noticeId=2189031:objectType=comment" href="https://gs.smuglo.li/notice/2189031"></thr:in-reply-to>
+ <link rel="related" href="https://gs.smuglo.li/notice/2189031"/>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390862"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390862" local_id="1390862" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=c997fc73d7f8a8f0">tag:shitposter.club,2017-05-05:objectType=thread:nonce=c997fc73d7f8a8f0</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://gs.smuglo.li/user/35497"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828579.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828579.atom"/>
+ <statusnet:notice_info local_id="2828579" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828554:objectType=comment</id>
+ <title>New comment by moonman</title>
+ <content type="html">@&lt;a href=&quot;https://mastodon.cloud/users/ohyran&quot; class=&quot;h-card mention&quot; title=&quot;Jens Reuterberg&quot;&gt;ohyran&lt;/a&gt; i won't ever get over bullying but i agree otherwise. i don't go to comic shops too often these days but i got dragged to one last year and the sheer diversity of people enjoying comics now compared to years ago was striking and it pleased me. and i noticed a couple years ago because of youtube i find things i truly enjoy watching, like in-depth videos about electronic parts, didn't exist 20 years ago. it's pretty great.</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828554"/>
+ <status_net notice_id="2828554"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T10:18:10+00:00</published>
+ <updated>2017-05-05T10:18:10+00:00</updated>
+ <thr:in-reply-to ref="tag:mastodon.cloud,2017-05-05:objectId=6334570:objectType=Status" href="https://mastodon.cloud/users/ohyran/updates/595969"></thr:in-reply-to>
+ <link rel="related" href="https://mastodon.cloud/users/ohyran/updates/595969"/>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390752"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390752" local_id="1390752" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767">tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.cloud/users/ohyran"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828554.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828554.atom"/>
+ <statusnet:notice_info local_id="2828554" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:shitposter.club,2017-05-05:fave:1:comment:2828502:2017-05-05T10:12:52+00:00</id>
+ <title>Favorite</title>
+ <content type="html">moonman favorited something by ohyran: &lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://shitposter.club/moonman&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;moonman&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; fair enough - that distinction makes it clearer...&lt;/p&gt;&lt;p&gt;On the other hand - those of us who did &quot;pay the price&quot; of being nerdy little kids in the 80's and 90's should strive to get past it anyway (mental health wise not &quot;just get over it&quot;) and see the &quot;nerd culture&quot; thing as a blessing of sorts. We are in the optimal spot to do it. (not saying that that is something easy btw just that NOW is the best of time to start talking about it)&lt;/p&gt;</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828506"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T10:12:52+00:00</published>
+ <updated>2017-05-05T10:12:52+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:mastodon.cloud,2017-05-05:objectId=6334570:objectType=Status</id>
+  <title>New comment by ohyran</title>
+  <content type="html">&lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://shitposter.club/moonman&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;moonman&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; fair enough - that distinction makes it clearer...&lt;/p&gt;&lt;p&gt;On the other hand - those of us who did &quot;pay the price&quot; of being nerdy little kids in the 80's and 90's should strive to get past it anyway (mental health wise not &quot;just get over it&quot;) and see the &quot;nerd culture&quot; thing as a blessing of sorts. We are in the optimal spot to do it. (not saying that that is something easy btw just that NOW is the best of time to start talking about it)&lt;/p&gt;</content>
+  <link rel="alternate" type="text/html" href="https://mastodon.cloud/users/ohyran/updates/595969"/>
+  <status_net notice_id="2828502"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:mastodon.cloud,2017-05-05:objectId=6334570:objectType=Status" href="https://mastodon.cloud/users/ohyran/updates/595969"></thr:in-reply-to>
+ <link rel="related" href="https://mastodon.cloud/users/ohyran/updates/595969"/>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390752"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390752" local_id="1390752" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767">tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828506.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828506.atom"/>
+ <statusnet:notice_info local_id="2828506" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828496:objectType=note</id>
+ <title>New note by moonman</title>
+ <content type="html">things are better now, a lot less kids in america get beaten up and called a fag. still too many.</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828496"/>
+ <status_net notice_id="2828496"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T10:11:31+00:00</published>
+ <updated>2017-05-05T10:11:31+00:00</updated>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390862"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390862" local_id="1390862" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=c997fc73d7f8a8f0">tag:shitposter.club,2017-05-05:objectType=thread:nonce=c997fc73d7f8a8f0</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828496.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828496.atom"/>
+ <statusnet:notice_info local_id="2828496" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828457:objectType=comment</id>
+ <title>New comment by moonman</title>
+ <content type="html">@&lt;a href=&quot;https://shitposter.club/user/21787&quot; class=&quot;h-card mention&quot; title=&quot;Yukari&quot;&gt;cutscenes&lt;/a&gt; @&lt;a href=&quot;https://gs.smuglo.li/user/28250&quot; class=&quot;h-card mention&quot; title=&quot;Bricky&quot;&gt;thatbrickster&lt;/a&gt; @&lt;a href=&quot;https://gs.smuglo.li/user/35497&quot; class=&quot;h-card mention&quot; title=&quot;Bokuro Bokusawa&quot;&gt;boco&lt;/a&gt; i never understood this because nerds had pocket protectors, which was a draftsman engineer thing and therefore smart, while geeks were people in carnivals who bit heads off small animals.</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828457"/>
+ <status_net notice_id="2828457"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T10:07:57+00:00</published>
+ <updated>2017-05-05T10:07:57+00:00</updated>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2828427:objectType=comment" href="https://shitposter.club/notice/2828427"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2828427"/>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390752"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390752" local_id="1390752" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767">tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://gs.smuglo.li/user/28250"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://gs.smuglo.li/user/35497"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://shitposter.club/user/21787"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828457.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828457.atom"/>
+ <statusnet:notice_info local_id="2828457" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828435:objectType=comment</id>
+ <title>New comment by moonman</title>
+ <content type="html">@&lt;a href=&quot;https://mastodon.cloud/users/ohyran&quot; class=&quot;h-card mention&quot; title=&quot;Jens Reuterberg&quot;&gt;ohyran&lt;/a&gt; since i didn't specify i'm talking about people subjected to physical and psychological abuse and not people that are just mad that more people like comic books now.</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828435"/>
+ <status_net notice_id="2828435"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T10:05:07+00:00</published>
+ <updated>2017-05-05T10:05:07+00:00</updated>
+ <thr:in-reply-to ref="tag:mastodon.cloud,2017-05-05:objectId=6331705:objectType=Status" href="https://mastodon.cloud/users/ohyran/updates/595757"></thr:in-reply-to>
+ <link rel="related" href="https://mastodon.cloud/users/ohyran/updates/595757"/>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390752"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390752" local_id="1390752" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767">tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.cloud/users/ohyran"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828435.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828435.atom"/>
+ <statusnet:notice_info local_id="2828435" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828326:objectType=note</id>
+ <title>New note by moonman</title>
+ <content type="html">if you were a &amp;quot;nerd&amp;quot; before, like, 2001 you have permanent excuse to hate this kind of shit.   &lt;a href=&quot;https://shitposter.club/file/b79fa5644be0d6f22679136e67b7bf45c9c4a74a55c32dd2d0cf15de4ddd5be5.gif&quot; title=&quot;https://shitposter.club/file/b79fa5644be0d6f22679136e67b7bf45c9c4a74a55c32dd2d0cf15de4ddd5be5.gif&quot; class=&quot;attachment&quot; id=&quot;attachment-662105&quot; rel=&quot;nofollow external&quot;&gt;https://shitposter.club/attachment/662105&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828326"/>
+ <status_net notice_id="2828326"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T09:47:42+00:00</published>
+ <updated>2017-05-05T09:47:42+00:00</updated>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390752"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390752" local_id="1390752" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767">tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="enclosure" href="https://shitposter.club/file/b79fa5644be0d6f22679136e67b7bf45c9c4a74a55c32dd2d0cf15de4ddd5be5.gif" type="image/gif" length="1023884"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828326.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828326.atom"/>
+ <statusnet:notice_info local_id="2828326" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828250:objectType=note</id>
+ <title>New note by moonman</title>
+ <content type="html">&lt;a href=&quot;https://shitposter.club/file/1283e2d4dd8f96b8eeb5d9a16b318e210868aa11386cf0d593891e4c75c9126e.gif&quot; title=&quot;https://shitposter.club/file/1283e2d4dd8f96b8eeb5d9a16b318e210868aa11386cf0d593891e4c75c9126e.gif&quot; class=&quot;attachment&quot; id=&quot;attachment-662098&quot; rel=&quot;nofollow external&quot;&gt;https://shitposter.club/attachment/662098&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828250"/>
+ <status_net notice_id="2828250"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T09:39:06+00:00</published>
+ <updated>2017-05-05T09:39:06+00:00</updated>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390709"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390709" local_id="1390709" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=ea8ffae90546f0ab">tag:shitposter.club,2017-05-05:objectType=thread:nonce=ea8ffae90546f0ab</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="enclosure" href="https://shitposter.club/file/1283e2d4dd8f96b8eeb5d9a16b318e210868aa11386cf0d593891e4c75c9126e.gif" type="image/gif" length="1020391"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828250.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828250.atom"/>
+ <statusnet:notice_info local_id="2828250" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:shitposter.club,2017-05-05:fave:1:comment:2828161:2017-05-05T09:28:19+00:00</id>
+ <title>Favorite</title>
+ <content type="html">moonman favorited something by kro: @&lt;a href=&quot;https://shitposter.club/user/1&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Generic Enemy&quot;&gt;moonman&lt;/a&gt; Till Brooklyn?</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828162"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T09:28:19+00:00</published>
+ <updated>2017-05-05T09:28:19+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:gs.smuglo.li,2017-05-05:noticeId=2188587:objectType=comment</id>
+  <title>New comment by kro</title>
+  <content type="html">@&lt;a href=&quot;https://shitposter.club/user/1&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Generic Enemy&quot;&gt;moonman&lt;/a&gt; Till Brooklyn?</content>
+  <link rel="alternate" type="text/html" href="https://gs.smuglo.li/notice/2188587"/>
+  <status_net notice_id="2828161"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:gs.smuglo.li,2017-05-05:noticeId=2188587:objectType=comment" href="https://gs.smuglo.li/notice/2188587"></thr:in-reply-to>
+ <link rel="related" href="https://gs.smuglo.li/notice/2188587"/>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390624"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390624" local_id="1390624" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=d7aa6b5b057ca555">tag:shitposter.club,2017-05-05:objectType=thread:nonce=d7aa6b5b057ca555</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828162.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828162.atom"/>
+ <statusnet:notice_info local_id="2828162" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:shitposter.club,2017-05-05:fave:1:comment:2828125:2017-05-05T09:24:56+00:00</id>
+ <title>Favorite</title>
+ <content type="html">moonman favorited something by hardbass2k8: this has obviously interesting implications in various places, for example:&lt;br /&gt; the nationalism of the nazis might not have been real, who would have thought?&lt;br /&gt; socialism is usually promoted to implementation by real douchebags!&lt;br /&gt; your local social justice people might want diversity but they don't want you, m/19, white, why?&lt;br /&gt; amateur soccer club, they want to be the best in the amateur league but actually they just get drunk after training and are 50% overweight.&lt;br /&gt; This is because humans are not capable of telepathy, so if you join a group it doesn't magically align every little bit of your being with the declared group goals.&lt;br /&gt; &lt;br /&gt; Even though you see unmanned group beliefs flying around from time to time, generally groups are created from a bunch of people. they are not a container for people, they are the people inside them.&lt;br /&gt; &lt;br /&gt; so if you see a group that appears to be cool don't think of it as cool because its goals are cool but because its members are cool. if they aren't, tough cookies. don't be the retard and end up on the camp watchtower.</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828136"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T09:24:56+00:00</published>
+ <updated>2017-05-05T09:24:56+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:shitposter.club,2017-05-05:noticeId=2828125:objectType=comment</id>
+  <title>New comment by hardbass2k8</title>
+  <content type="html">this has obviously interesting implications in various places, for example:&lt;br /&gt; the nationalism of the nazis might not have been real, who would have thought?&lt;br /&gt; socialism is usually promoted to implementation by real douchebags!&lt;br /&gt; your local social justice people might want diversity but they don't want you, m/19, white, why?&lt;br /&gt; amateur soccer club, they want to be the best in the amateur league but actually they just get drunk after training and are 50% overweight.&lt;br /&gt; This is because humans are not capable of telepathy, so if you join a group it doesn't magically align every little bit of your being with the declared group goals.&lt;br /&gt; &lt;br /&gt; Even though you see unmanned group beliefs flying around from time to time, generally groups are created from a bunch of people. they are not a container for people, they are the people inside them.&lt;br /&gt; &lt;br /&gt; so if you see a group that appears to be cool don't think of it as cool because its goals are cool but because its members are cool. if they aren't, tough cookies. don't be the retard and end up on the camp watchtower.</content>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828125"/>
+  <status_net notice_id="2828125"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2828125:objectType=comment" href="https://shitposter.club/notice/2828125"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2828125"/>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390589"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390589" local_id="1390589" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=51b227fe92f6babf">tag:shitposter.club,2017-05-05:objectType=thread:nonce=51b227fe92f6babf</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828136.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828136.atom"/>
+ <statusnet:notice_info local_id="2828136" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828128:objectType=note</id>
+ <title>New note by moonman</title>
+ <content type="html">In a valid remake of They live, signs would say REBEL, and DON'T GET MARRIED AND HAVE KIDS</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828128"/>
+ <status_net notice_id="2828128"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T09:24:23+00:00</published>
+ <updated>2017-05-05T09:24:23+00:00</updated>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390642"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390642" local_id="1390642" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=b74397fa766b82c9">tag:shitposter.club,2017-05-05:objectType=thread:nonce=b74397fa766b82c9</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828128.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828128.atom"/>
+ <statusnet:notice_info local_id="2828128" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828104:objectType=note</id>
+ <title>New note by moonman</title>
+ <content type="html">&lt;a href=&quot;https://shitposter.club/file/4d34178bde99599f31a28928e1666fbd58448d8a22e94ed82222496e4a45cb07.gif&quot; title=&quot;https://shitposter.club/file/4d34178bde99599f31a28928e1666fbd58448d8a22e94ed82222496e4a45cb07.gif&quot; class=&quot;attachment&quot; id=&quot;attachment-662049&quot; rel=&quot;nofollow external&quot;&gt;https://shitposter.club/attachment/662049&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828104"/>
+ <status_net notice_id="2828104"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T09:21:01+00:00</published>
+ <updated>2017-05-05T09:21:01+00:00</updated>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390624"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390624" local_id="1390624" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=d7aa6b5b057ca555">tag:shitposter.club,2017-05-05:objectType=thread:nonce=d7aa6b5b057ca555</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="enclosure" href="https://shitposter.club/file/4d34178bde99599f31a28928e1666fbd58448d8a22e94ed82222496e4a45cb07.gif" type="image/gif" length="278366"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828104.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828104.atom"/>
+ <statusnet:notice_info local_id="2828104" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828102:objectType=note</id>
+ <title>New note by moonman</title>
+ <content type="html">when ppl find out i haven't always been serious  &lt;a href=&quot;https://shitposter.club/file/5859fa95875342cc65dba0d852f726db158ce28198c326d5f13d9de7c0d2c449.gif&quot; title=&quot;https://shitposter.club/file/5859fa95875342cc65dba0d852f726db158ce28198c326d5f13d9de7c0d2c449.gif&quot; class=&quot;attachment&quot; id=&quot;attachment-662053&quot; rel=&quot;nofollow external&quot;&gt;https://shitposter.club/attachment/662053&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828102"/>
+ <status_net notice_id="2828102"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T09:20:45+00:00</published>
+ <updated>2017-05-05T09:20:45+00:00</updated>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390622"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390622" local_id="1390622" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=0a025ac5a570b4ec">tag:shitposter.club,2017-05-05:objectType=thread:nonce=0a025ac5a570b4ec</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="enclosure" href="https://shitposter.club/file/5859fa95875342cc65dba0d852f726db158ce28198c326d5f13d9de7c0d2c449.gif" type="image/gif" length="119239"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828102.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828102.atom"/>
+ <statusnet:notice_info local_id="2828102" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828086:objectType=comment</id>
+ <title>New comment by moonman</title>
+ <content type="html">@&lt;a href=&quot;https://shitposter.club/user/9655&quot; class=&quot;h-card mention&quot; title=&quot;Solidarity for Pigs&quot;&gt;neimzr4luzerz&lt;/a&gt; @&lt;a href=&quot;https://gs.smuglo.li/user/2326&quot; class=&quot;h-card mention&quot; title=&quot;Dolus_McHonest&quot;&gt;dolus&lt;/a&gt; @&lt;a href=&quot;https://gs.smuglo.li/user/35497&quot; class=&quot;h-card mention&quot; title=&quot;Bokuro Bokusawa&quot;&gt;boco&lt;/a&gt; you are being too serious lol</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828086"/>
+ <status_net notice_id="2828086"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T09:17:19+00:00</published>
+ <updated>2017-05-05T09:17:19+00:00</updated>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2828082:objectType=comment" href="https://shitposter.club/notice/2828082"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2828082"/>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390270"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390270" local_id="1390270" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26">tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://gs.smuglo.li/user/2326"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://shitposter.club/user/9655"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://gs.smuglo.li/user/35497"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828086.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828086.atom"/>
+ <statusnet:notice_info local_id="2828086" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828085:objectType=note</id>
+ <title>New note by moonman</title>
+ <content type="html">shitposter dot club  &lt;a href=&quot;https://shitposter.club/file/9b084c7210b16abbf4d28594b924a07ef4a2a06f89d901a4c42fb1e243291263.gif&quot; title=&quot;https://shitposter.club/file/9b084c7210b16abbf4d28594b924a07ef4a2a06f89d901a4c42fb1e243291263.gif&quot; class=&quot;attachment&quot; id=&quot;attachment-662047&quot; rel=&quot;nofollow external&quot;&gt;https://shitposter.club/attachment/662047&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828085"/>
+ <status_net notice_id="2828085"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T09:16:50+00:00</published>
+ <updated>2017-05-05T09:16:50+00:00</updated>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390613"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390613" local_id="1390613" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=d1ae088a1b91e5e5">tag:shitposter.club,2017-05-05:objectType=thread:nonce=d1ae088a1b91e5e5</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="enclosure" href="https://shitposter.club/file/9b084c7210b16abbf4d28594b924a07ef4a2a06f89d901a4c42fb1e243291263.gif" type="image/gif" length="681847"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828085.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828085.atom"/>
+ <statusnet:notice_info local_id="2828085" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828061:objectType=note</id>
+ <title>New note by moonman</title>
+ <content type="html">even when i lie i tell the truth, is that so hard to understand?</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828061"/>
+ <status_net notice_id="2828061"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T09:15:07+00:00</published>
+ <updated>2017-05-05T09:15:07+00:00</updated>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390593"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390593" local_id="1390593" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=a516e4b8506b8ef5">tag:shitposter.club,2017-05-05:objectType=thread:nonce=a516e4b8506b8ef5</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828061.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828061.atom"/>
+ <statusnet:notice_info local_id="2828061" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:shitposter.club,2017-05-05:noticeId=2828052:objectType=comment</id>
+ <title>New comment by moonman</title>
+ <content type="html">@&lt;a href=&quot;https://shitposter.club/user/9591&quot; class=&quot;h-card mention&quot; title=&quot;warum hei&amp;#xDF;en deutschl&amp;#xE4;nder deutschl&amp;#xE4;nder&quot;&gt;hardbass2k8&lt;/a&gt; history, anthropology.</content>
+ <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2828052"/>
+ <status_net notice_id="2828052"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T09:14:22+00:00</published>
+ <updated>2017-05-05T09:14:22+00:00</updated>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2828048:objectType=comment" href="https://shitposter.club/notice/2828048"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2828048"/>
+ <link rel="ostatus:conversation" href="https://shitposter.club/conversation/1390564"/>
+ <ostatus:conversation href="https://shitposter.club/conversation/1390564" local_id="1390564" ref="tag:shitposter.club,2017-05-05:objectType=thread:nonce=fe4d7f35b13403ba">tag:shitposter.club,2017-05-05:objectType=thread:nonce=fe4d7f35b13403ba</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://shitposter.club/user/9591"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828052.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/2828052.atom"/>
+ <statusnet:notice_info local_id="2828052" source="Qvitter"></statusnet:notice_info>
+</entry>
+</feed>
diff --git a/test/fixtures/httpoison_mock/https___shitposter.club_notice_2827873.html b/test/fixtures/httpoison_mock/https___shitposter.club_notice_2827873.html
new file mode 100644 (file)
index 0000000..54745ef
--- /dev/null
@@ -0,0 +1,653 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+               "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+               <html xmlns="http://www.w3.org/1999/xhtml">
+                       <head>
+                               <title>Shitposter Club</title>
+                               <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+                               <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
+                               <link rel="stylesheet" type="text/css" href="https://shitposter.club/plugins/Qvitter/css/qvitter.css?changed=20170112022622" />
+                               <link rel="stylesheet" type="text/css" href="https://shitposter.club/plugins/Qvitter/css/jquery.minicolors.css" />
+                <link rel="apple-touch-icon" sizes="57x57" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/apple-touch-icon-57x57.png">
+                <link rel="apple-touch-icon" sizes="60x60" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/apple-touch-icon-60x60.png">
+                <link rel="apple-touch-icon" sizes="72x72" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/apple-touch-icon-72x72.png">
+                <link rel="apple-touch-icon" sizes="76x76" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/apple-touch-icon-76x76.png">
+                <link rel="apple-touch-icon" sizes="114x114" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/apple-touch-icon-114x114.png">
+                <link rel="apple-touch-icon" sizes="120x120" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/apple-touch-icon-120x120.png">
+                <link rel="apple-touch-icon" sizes="144x144" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/apple-touch-icon-144x144.png">
+                <link rel="apple-touch-icon" sizes="152x152" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/apple-touch-icon-152x152.png">
+                <link rel="apple-touch-icon" sizes="180x180" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/apple-touch-icon-180x180.png">
+                <link rel="icon" type="image/png" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/favicon-16x16.png" sizes="16x16">
+                <link rel="icon" type="image/png" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/favicon-32x32.png" sizes="32x32">
+                <link rel="icon" type="image/png" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/android-chrome-192x192.png" sizes="192x192">
+                <link rel="icon" type="image/png" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/favicon-96x96.png" sizes="96x96">
+                <link rel="manifest" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/manifest.json">
+                <link rel="mask-icon" href="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/safari-pinned-tab.svg" color="#a22430">
+                <meta name="apple-mobile-web-app-title" content="Shitposter Club">
+                <meta name="application-name" content="Shitposter Club">
+                <meta name="msapplication-TileColor" content="#da532c">
+                <meta name="msapplication-TileImage" content="https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/mstile-144x144.png">
+                <meta name="theme-color" content="#ffffff">
+                               <link title="oEmbed" href="https://shitposter.club/services/oembed.json?url=https%3A%2F%2Fshitposter.club%2Fnotice%2F2827873" type="application/json+oembed" rel="alternate">
+<link title="oEmbed" href="https://shitposter.club/services/oembed.xml?url=https%3A%2F%2Fshitposter.club%2Fnotice%2F2827873" type="application/xml+oembed" rel="alternate">
+<link title="Single notice (JSON)" href="https://shitposter.club/api/statuses/show/2827873.json" type="application/stream+json" rel="alternate">
+<link title="Single notice (Atom)" href="https://shitposter.club/api/statuses/show/2827873.atom" type="application/atom+xml" rel="alternate">
+<meta name="twitter:card" content="summary" />
+<meta name="twitter:title" content="Generic Enemy (@moonman)" />
+<meta name="twitter:description" content="@neimzr4luzerz @dolus childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English" />
+<meta property="og:description" content="@neimzr4luzerz @dolus childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English" />
+<meta property="og:site_name" content="Shitposter Club" />
+                               <script>
+
+                                       /*
+                                       @licstart  The following is the entire license notice for the
+                                       JavaScript code in this page.
+
+                                       Copyright (C) 2015  Hannes Mannerheim and other contributors
+
+                                       This program is free software: you can redistribute it and/or modify
+                                       it under the terms of the GNU Affero General Public License as
+                                       published by the Free Software Foundation, either version 3 of the
+                                       License, or (at your option) any later version.
+
+                                       This program is distributed in the hope that it will be useful,
+                                       but WITHOUT ANY WARRANTY; without even the implied warranty of
+                                       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+                                       GNU Affero General Public License for more details.
+
+                                       You should have received a copy of the GNU Affero General Public License
+                                       along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+                                       @licend  The above is the entire license notice
+                                       for the JavaScript code in this page.
+                                       */
+
+                    window.usersLanguageCode = "en";
+                    window.usersLanguageNameInEnglish = "English";
+                    window.englishLanguageData = {
+       "directionality":"ltr",
+       "languageName": "English",
+       "loginUsername": "Username or e-mail",
+       "loginPassword": "Password",
+       "loginSignIn": "Sign in",
+       "loginRememberMe": "Remember me",
+       "loginForgotPassword": "Forgot password?",
+       "notices": "Notices",
+       "followers": "Followers",
+       "following": "Following",
+       "groups": "Groups",
+       "compose": "PULL THE TRIGGER",
+       "queetVerb": "Send",
+       "queetsNounPlural": "Notices",
+       "logout": "Sign out",
+       "languageSelected": "Language:",
+       "viewMyProfilePage": "View my profile page",
+       "expand": "Expand",
+       "collapse": "Collapse",
+       "details": "Details",
+       "expandFullConversation": "Expand full conversation",
+       "replyVerb": "Reply",
+       "requeetVerb": "Repeat",
+       "favoriteVerb": "Favorite",
+       "requeetedVerb": "Repeated",
+       "favoritedVerb": "Favorited",
+       "replyTo": "Reply to",
+       "requeetedBy": "Repeated by {requeeted-by}",
+       "favoriteNoun": "Favorite",
+       "favoritesNoun": "Favorites",
+       "requeetNoun": "Repeat",
+       "requeetsNoun": "Repeats",
+       "newQueet": "{new-notice-count} new notice",
+       "newQueets": "{new-notice-count} new notices",
+       "longmonthsJanuary": "January",
+       "longmonthsFebruary": "February",
+       "longmonthsMars": "March",
+       "longmonthsApril": "April",
+       "longmonthsMay": "May",
+       "longmonthsJune": "June",
+       "longmonthsJuly": "July",
+       "longmonthsAugust": "August",
+       "longmonthsSeptember": "September",
+       "longmonthsOctober": "October",
+       "longmonthsNovember": "November",
+       "longmonthsDecember": "December",
+       "shortmonthsJanuary": "jan",
+       "shortmonthsFebruary": "feb",
+       "shortmonthsMars": "mar",
+       "shortmonthsApril": "apr",
+       "shortmonthsMay": "may",
+       "shortmonthsJune": "jun",
+       "shortmonthsJuly": "jul",
+       "shortmonthsAugust": "aug",
+       "shortmonthsSeptember": "sep",
+       "shortmonthsOctober": "oct",
+       "shortmonthsNovember": "nov",
+       "shortmonthsDecember": "dec",
+       "time12am": "{time} am",
+       "time12pm": "{time} pm",
+       "longDateFormat": "{time12} - {day} {month} {year}",
+       "shortDateFormatSeconds": "{seconds}s",
+       "shortDateFormatMinutes": "{minutes}m",
+       "shortDateFormatHours": "{hours}h",
+       "shortDateFormatDate": "{day} {month}",
+       "shortDateFormatDateAndY": "{day} {month} {year}",
+       "now": "now",
+       "posting": "posting",
+       "viewMoreInConvBefore": "← View more in conversation",
+       "viewMoreInConvAfter": "View more in conversation →",
+       "mentions": "Mentions",
+       "timeline": "Only Who I'm Following",
+       "publicTimeline": "Everyone on Shitposter Club",
+       "publicAndExtTimeline": "MY EYES! I CAN SEE FOREVER",
+       "searchVerb": "Search",
+       "deleteVerb": "Delete",
+       "cancelVerb": "Cancel",
+       "deleteConfirmation": "Are you sure you want to delete this notice?",
+       "userExternalFollow": "Remote follow",
+       "userExternalFollowHelp": "Your account ID (e.g. user@rainbowdash.net).",
+       "userFollow": "Follow",
+       "userFollowing": "Following",
+       "userUnfollow": "Unfollow",
+       "joinGroup": "Join",
+       "joinExternalGroup": "Join remotely",
+       "isMemberOfGroup": "Member",
+       "leaveGroup": "Leave",
+       "memberCount": "Members",
+       "adminCount": "Admins",
+       "settings": "Settings",
+       "saveChanges": "Save changes",
+       "linkColor": "Link color",
+       "backgroundColor": "Background color",
+       "newToQuitter": "New to {site-title}?",
+       "signUp": "Sign up",
+       "signUpFullName": "Full name",
+       "signUpEmail": "Email",
+       "signUpButtonText": "Sign up to {site-title}",
+       "welcomeHeading": "Welcome to {site-title}.",
+       "welcomeText": "We are a <span id=\"federated-tooltip\"><div id=\"what-is-federation\">\"Federation\" means that you don't need a {site-title} account to be able to follow, be followed by or interact with {site-title} users. You can register on any StatusNet or GNU social server or any service based on the the <a href=\"http://www.w3.org/community/ostatus/wiki/Main_Page\">Ostatus</a> protocol! You don't even have to join a service – try installing the lovely <a href=\"http://www.gnu.org/software/social/\">GNU social</a> software on your own server! :)</div>federation</span> of microbloggers who care about social justice and solidarity and want to quit the centralised capitalist services.",
+       "registerNickname": "Nickname",
+       "registerHomepage": "Homepage",
+       "registerBio": "Bio",
+       "registerLocation": "Location",
+       "registerRepeatPassword": "Repeat password",
+       "moreSettings": "More settings",
+       "otherServers": "Alternatively you can create an account on another server of the GNU social network. <a href=\"http://federation.skilledtests.com/select_your_server.html\">Comparison</a>",
+       "editMyProfile": "Edit profile",
+       "notifications": "Notifications",
+       "xFavedYourQueet": "favorited your notice",
+       "xRepeatedYourQueet": "repeated you",
+       "xStartedFollowingYou": "followed you",
+       "followsYou": "follows you",
+       "FAQ": "FAQ",
+       "inviteAFriend": "Invite a friend!",
+       "goToExternalProfile": "Go to full profile",
+       "cropAndSave": "Crop and save",
+       "showTerms": "Read our Terms of Use",
+       "ellipsisMore": "More",
+       "blockUser": "Block",
+       "goToOriginalNotice": "Go to the original notice",
+       "goToTheUsersRemoteProfile": "Go to the user's remote profile",
+       "clickToDrag":"Click to drag",
+       "keyboardShortcuts":"Keyboard shortcuts",
+       "classicInterface":"Classic {site-title}",
+       "accessibilityToggleLink":"For better accessibility, click this link to switch to the classic interface",
+       "tooltipBookmarkStream":"Add this stream to your bookmarks",
+       "tooltipTopMenu":"Menu and settings",
+       "tooltipAttachImage":"Attach an image",
+       "tooltipShortenUrls":"Shorten all URLs in the notice",
+       "tooltipReloadStream":"Refresh this stream",
+       "tooltipRemoveBookmark":"Remove this bookmark",
+       "clearHistory":"Clear browsing history",
+       "ERRORsomethingWentWrong":"Something went wrong.",
+       "ERRORmustBeLoggedIn":"You must be logged in to view this stream.",
+       "ERRORcouldNotFindUserWithNickname":"Could not find a user with nickname \"{nickname}\" on this server",
+       "ERRORcouldNotFindGroupWithNickname":"Could not find a group with nickname \"{nickname}\" on this server",
+       "ERRORcouldNotFindPage":"Could not find that page.",
+       "ERRORnoticeRemoved": "This notice has been removed.",
+       "ERRORnoContactWithServer": "Can not establish a connection to the server. The server could be overloaded, or there might be a problem with your internet connection. Please try again later!",
+       "ERRORattachmentUploadFailed": "The upload failed. The format might be unsupported or the size too large.",
+       "hideRepliesToPeopleIDoNotFollow":"Hide replies to people I don't follow",
+       "markAllNotificationsAsSeen":"Mark all notifications as seen",
+       "notifyRepliesAndMentions":"Mentions and replies",
+       "notifyFavs":"Favorites",
+       "notifyRepeats":"Repeats",
+       "notifyFollows":"New followers",
+       "timelineOptions":"Timeline options",
+       "ERRORfailedSavingYourSetting":"Failed saving your setting",
+       "ERRORfailedMarkingAllNotificationsAsRead":"Failed marking all notifications as seen.",
+       "newNotification": "{new-notice-count} new notification",
+       "newNotifications": "{new-notice-count} new notifications",
+       "thisIsANoticeFromABlockedUser":"Warning: This is a quip from a user you have blocked. Click to show it.",
+       "nicknamesListWithListName":"{nickname}’s list: {list-name}",
+       "myListWithListName":"My list: {list-name}",
+       "listMembers":"Members",
+       "listSubscribers":"Subscribers",
+       "ERRORcouldNotFindList":"There is no such list.",
+       "emailAlreadyInUse":"Already in use",
+       "addEditLanguageLink":"Help translate {site-title} to another language",
+       "onlyPartlyTranslated":"{site-title} is only partly translated to <em>{language-name}</em> ({percent}%). You can help complete the translation at <a href=\"https://git.gnu.io/h2p/Qvitter/tree/master/locale\">Qvitter's repository homepage</a>",
+       "startRant":"Start a rant",
+       "continueRant":"Continue the rant",
+       "hideEmbeddedInTimeline":"Hide embedded content in this timeline",
+       "hideQuotesInTimeline":"Hide quotes in this timeline",
+       "userBlocks":"Accounts you're blocking",
+       "buttonBlocked":"Blocked",
+       "buttonUnblock":"Unblock",
+       "failedBlockingUser":"Failed to block the user.",
+       "failedUnblockingUser":"Failed to unblock the user.",
+       "unblockUser": "Unblock",
+       "tooltipBlocksYou":"You are blocked from following {username}.",
+       "silenced":"Silenced",
+       "silencedPlural":"Silenced profiles",
+       "silencedUsersOnThisInstance":"Silenced profiles on {site-title}",
+       "sandboxed":"Sandboxed",
+       "sandboxedPlural":"Sandboxed profiles",
+       "sandboxedUsersOnThisInstance":"Sandboxed profiles on {site-title}",
+       "silencedStreamDescription":"Silenced users can't login or post quips and the quips they've already posted are hidden. For local users it's like a delete that can be reversed, for remote users it's like a site wide block.",
+       "sandboxedStreamDescription":"Quips from sandboxed users are excluded from the Public Timeline and The Whole Known Network. Apart from that, they can use the site like any other user.",
+       "onlyShowNotificationsFromUsersIFollow":"Only show notifications from users I follow",
+       "userOptions":"More user actions",
+       "silenceThisUser":"Silence {nickname}",
+       "sandboxThisUser":"Sandbox {nickname}",
+       "unSilenceThisUser":"Unsilence {nickname}",
+       "unSandboxThisUser":"Unsandbox {nickname}",
+       "ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
+       "ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
+       "muteUser":"Mute",
+       "unmuteUser":"Unmute",
+       "hideNotificationsFromMutedUsers":"Hide notifications from muted users",
+       "thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
+       "userMutes":"Accounts you're muting",
+       "userBlocked":"Blocked accounts",
+       "userMuted":"Muted accounts",
+       "mutedStreamDescription":"You've hidden these accounts from your timeline. You will still receive notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
+       "profileAndSettings":"Profile and settings",
+       "profileSettings":"Profile settings",
+       "thisIsABookmark":"This is a bookmark created in the Classic interface"
+}
+;
+                    window.defaultAvatarStreamSize = "https:\/\/shitposter.club\/theme\/neo-gnu\/default-avatar-stream.png";
+                    window.defaultAvatarProfileSize = "https:\/\/shitposter.club\/theme\/neo-gnu\/default-avatar-profile.png";
+                                       window.textLimit = 3800;
+                                       window.registrationsClosed = false;
+                                       window.thisSiteThinksItIsHttpButIsActuallyHttps = false;
+                                       window.siteTitle = "Shitposter Club";
+                                       window.loggedIn = false;
+                                       window.timeBetweenPolling = 5000;
+                                       window.apiRoot = 'https://shitposter.club/api/';
+                                       window.fullUrlToThisQvitterApp = 'https://shitposter.club/plugins/Qvitter/';
+                                       window.siteRootDomain = 'shitposter.club';
+                                       window.siteInstanceURL = 'https://shitposter.club/';
+                                       window.defaultLinkColor = '#0084B4';
+                                       window.defaultBackgroundColor = '#f4f4f4';
+                                       window.siteBackground = '../../file/cityscape.jpg';
+                                       window.enableWelcomeText = true;
+                                       window.customWelcomeText = {"en":"<h1 style=\"text-align: center;\"><img src=\"\/custom\/spclublogo-05.png\" alt=\"Shitposter Club\"><br>A safe space on the Internet<\/h1>"};
+                                       window.urlShortenerAPIURL = 'http://qttr.at/yourls-api.php';
+                                       window.urlShortenerSignature = 'b6afeec983';
+                                       window.commonSessionToken = 'cf0a3dab36bdf171e7c84cb4b46932a4e939c482e63347aa6b63fba804f93bf6623b10f6c074b590786764a3f269ebdf2eedb96b0c6c04ccf76dfabb054ee63a';
+                                       window.siteMaxThumbnailSize = 1000;
+                                       window.siteAttachmentURLBase = 'https://shitposter.club/attachment/';
+                                       window.siteEmail = 'shitposterclub@gmail.com';
+                                       window.siteLicenseTitle = '';
+                                       window.siteLicenseURL = 'https://shitposter.club/doc/tos';
+                                       window.customTermsOfUse = "<h2>The Rules<\/h2>\n<ol>\n<li>Do not post content that is illegal in the United States of America.<\/li>\n<li>Do not engage in behavior onsite that would get the admin or his hosting\nthreatened, e.g. doxing, harassment, posting copyrighted content that\nwill get the site DMCA'd, etc. This is a vague rule, sorry, it can't be\nhelped.<\/li>\n<li>The site should be considered NOT SAFE FOR WORK (NSFW), <em>however<\/em>,\nwe DO NOT allow: \n  <ul>\n  <li>\"excessive or extreme pornography\"<\/li>\n  <li>gore or \"gross-out\" (e.g. \"tubgirl\") pics<\/li>\n  <li>so-called \"loli hentai\" aka sexually explicit drawn depictions of children<\/li>\n  <li>\"child model\" pictures<\/li>\n  <\/ul>\n  ...on the \"public\" (\"everyone on Shitposter Club\") timeline.\n  <p>\n  What this means is, do not post these pictures, or \"repeat\" them from The Whole Known Network (\"My eyes!\") timeline, or embed them.<\/li>\n<li>Do not engage in behavior that harms the functionality of the site\nitself, e.g. no hacking or exploiting it or spamming. If you're told you're doing\nsomething that is harming the technical operation of the site, stop doing it. The\nadmin's word is final.<\/li>\n<\/ol>\n<h2>My Pledge to You<\/h2>\n<p>I will not ban you or delete your posts for:\nBeing a jerk, having a terrible opinion, disagreeing with me, engaging in so-called \"hate\" or \"offensive\" speech (we have a block button, use it.)<\/p>\n<p>I will ban you or delete your posts for:\nBreaking the rules above, intentionally evading a block to post directly\nat someone who has blocked you, basically antisocial behavior that\ndirectly tries to get around any of the other rules. I will TRY to be lenient and tolerant about rules and not be a ban-Nazi.<\/p>\n<p>You own your posts, but due to the nature of federated services you\nare granting an irrevocable license for others on the network to\nsyndicate it. You are responsible for what you post.<\/p>";
+                    window.siteLocalOnlyDefaultPath = true;
+                    window.disableKeyboardShortcuts = false;
+                                       // available language files and their last update time
+                                       window.availableLanguages = {
+                                               "ar": "ar.json?changed=20160908160646",
+                                               "ast": "ast.json?changed=20160908160646",
+                                               "ca": "ca.json?changed=20160908160646",
+                                               "de": "de.json?changed=20160908160646",
+                                               "en": "en.json?changed=20170501070701",
+                                               "eo": "eo.json?changed=20160305060047",
+                                               "es_419": "es_419.json?changed=20160908160646",
+                                               "es": "es.json?changed=20160908160646",
+                                               "eu": "eu.json?changed=20160908160646",
+                                               "fa": "fa.json?changed=20160908160646",
+                                               "fi": "fi.json?changed=20160908160646",
+                                               "fr": "fr.json?changed=20160908160646",
+                                               "gl": "gl.json?changed=20160908160646",
+                                               "he": "he.json?changed=20160908160646",
+                                               "hy": "hy.json?changed=20160908160646",
+                                               "io": "io.json?changed=20160908160646",
+                                               "it": "it.json?changed=20160908160646",
+                                               "ja": "ja.json?changed=20160908160646",
+                                               "nb": "nb.json?changed=20161231010003",
+                                               "nl": "nl.json?changed=20160908160646",
+                                               "pl": "pl.json?changed=20161231010003",
+                                               "pt_br": "pt_br.json?changed=20160908160646",
+                                               "pt": "pt.json?changed=20160908160646",
+                                               "ru": "ru.json?changed=20160908160646",
+                                               "sq": "sq.json?changed=20161231010003",
+                                               "sv": "sv.json?changed=20160908160646",
+                                               "tr": "tr.json?changed=20161231010003",
+                                               "uk": "uk.json?changed=20160908160646",
+                                               "zh_cn": "zh_cn.json?changed=20160908160646",
+                                               "zh_tw": "zh_tw.json?changed=20160908160646",
+                                               };
+
+                               </script>
+                               <link href='https://shitposter.club/plugins/QvitterSimpleSecurity/css/ss.css?changed=20160925025913' rel='stylesheet' type='text/css'>                  </head>
+                       <body class="" style="background-color:#f4f4f4">
+                                               <input id="upload-image-input" class="upload-image-input" type="file" name="upload-image-input">
+                               <div class="topbar">
+                                       <a href="https://shitposter.club/main/public"><div id="logo"></div></a><div id="top-compose" class="hidden"></div>
+                                       <ul class="quitter-settings dropdown-menu">
+                                               <li class="dropdown-caret right">
+                                                       <span class="caret-outer"></span>
+                                                       <span class="caret-inner"></span>
+                                               </li>
+                                               <li class="fullwidth"><a id="top-menu-profile-link" class="no-hover-card" href="https://shitposter.club/"><div id="top-menu-profile-link-fullname"></div><div id="top-menu-profile-link-view-profile"></div></a></li>
+                                               <li class="fullwidth dropdown-divider"></li>
+                        <li class="fullwidth"><a id="faq-link"></a></li>
+                        <li class="fullwidth"><a id="tou-link"></a></li>
+                        <li class="fullwidth"><a id="shortcuts-link"></a></li>                                                 <li class="fullwidth"><a id="invite-link" href="https://shitposter.club/main/invite"></a></li>
+                                                                                               <li class="fullwidth"><a id="classic-link"></a></li>
+                                               <li class="fullwidth dropdown-divider"></li>
+                                               <li class="fullwidth"><a id="logout"></a></li>
+                                               <li class="fullwidth language dropdown-divider"></li>
+                                               <li class="language"><a class="language-link" data-tooltip="العربية – Arabic" data-lang-code="ar">العربية</a></li><li class="language"><a class="language-link" data-tooltip="asturianu – Asturian" data-lang-code="ast">asturianu</a></li><li class="language"><a class="language-link" data-tooltip="català – Catalan" data-lang-code="ca">català</a></li><li class="language"><a class="language-link" data-tooltip="Deutsch – German" data-lang-code="de">Deutsch</a></li><li class="language"><a class="language-link" data-tooltip="English" data-lang-code="en">English</a></li><li class="language"><a class="language-link" data-tooltip="esperanto – Esperanto" data-lang-code="eo">esperanto</a></li><li class="language"><a class="language-link" data-tooltip="español (Latinoamérica) – Spanish (Latin America)" data-lang-code="es_419">español (Latinoamérica)</a></li><li class="language"><a class="language-link" data-tooltip="español – Spanish" data-lang-code="es">español</a></li><li class="language"><a class="language-link" data-tooltip="euskara – Basque" data-lang-code="eu">euskara</a></li><li class="language"><a class="language-link" data-tooltip="فارسی – Persian" data-lang-code="fa">فارسی</a></li><li class="language"><a class="language-link" data-tooltip="suomi – Finnish" data-lang-code="fi">suomi</a></li><li class="language"><a class="language-link" data-tooltip="français – French" data-lang-code="fr">français</a></li><li class="language"><a class="language-link" data-tooltip="galego – Galician" data-lang-code="gl">galego</a></li><li class="language"><a class="language-link" data-tooltip="עברית – Hebrew" data-lang-code="he">עברית</a></li><li class="language"><a class="language-link" data-tooltip="հայերեն – Armenian" data-lang-code="hy">հայերեն</a></li><li class="language"><a class="language-link" data-tooltip="Ido" data-lang-code="io">Ido</a></li><li class="language"><a class="language-link" data-tooltip="italiano – Italian" data-lang-code="it">italiano</a></li><li class="language"><a class="language-link" data-tooltip="日本語 – Japanese" data-lang-code="ja">日本語</a></li><li class="language"><a class="language-link" data-tooltip="norsk bokmål – Norwegian Bokmål" data-lang-code="nb">norsk bokmål</a></li><li class="language"><a class="language-link" data-tooltip="Nederlands – Dutch" data-lang-code="nl">Nederlands</a></li><li class="language"><a class="language-link" data-tooltip="polski – Polish" data-lang-code="pl">polski</a></li><li class="language"><a class="language-link" data-tooltip="português (Brasil) – Portuguese (Brazil)" data-lang-code="pt_br">português (Brasil)</a></li><li class="language"><a class="language-link" data-tooltip="português – Portuguese" data-lang-code="pt">português</a></li><li class="language"><a class="language-link" data-tooltip="русский – Russian" data-lang-code="ru">русский</a></li><li class="language"><a class="language-link" data-tooltip="shqip – Albanian" data-lang-code="sq">shqip</a></li><li class="language"><a class="language-link" data-tooltip="svenska – Swedish" data-lang-code="sv">svenska</a></li><li class="language"><a class="language-link" data-tooltip="Türkçe – Turkish" data-lang-code="tr">Türkçe</a></li><li class="language"><a class="language-link" data-tooltip="українська – Ukrainian" data-lang-code="uk">українська</a></li><li class="language"><a class="language-link" data-tooltip="中文(中国) – Chinese (China)" data-lang-code="zh_cn">中文(中国)</a></li><li class="language"><a class="language-link" data-tooltip="中文(台灣) – Chinese (Taiwan)" data-lang-code="zh_tw">中文(台灣)</a></li>                        <li class="fullwidth language dropdown-divider"></li>
+                        <li class="fullwidth"><a href="https://git.gnu.io/h2p/Qvitter/tree/master/locale" target="_blank" id="add-edit-language-link"></a></li>
+                                       </ul>
+                                       <div class="global-nav">
+                                               <div class="global-nav-inner">
+                                                       <div class="container">
+                                                               <div id="search">
+                                                                       <input type="text" spellcheck="false" autocomplete="off" name="q" placeholder="Sök" id="search-query" class="search-input">
+                                                                       <span class="search-icon">
+                                                                               <button class="icon nav-search" type="submit" tabindex="-1">
+                                                                                       <span> Sök </span>
+                                                                               </button>
+                                                                       </span>
+                                                               </div>
+                                                               <ul class="language-dropdown">
+                                                                       <li class="dropdown">
+                                                                               <a class="dropdown-toggle">
+                                                                                       <small></small>
+                                                                                       <span class="current-language"></span>
+                                                                                       <b class="caret"></b>
+                                                                               </a>
+                                                                               <ul class="dropdown-menu">
+                                                                                       <li class="dropdown-caret right">
+                                                                                               <span class="caret-outer"></span>
+                                                                                               <span class="caret-inner"></span>
+                                                                                       </li>
+                                                                                       <li><a class="language-link" data-tooltip="Arabic" data-lang-code="ar">العربية</a></li><li><a class="language-link" data-tooltip="Asturian" data-lang-code="ast">asturianu</a></li><li><a class="language-link" data-tooltip="Catalan" data-lang-code="ca">català</a></li><li><a class="language-link" data-tooltip="German" data-lang-code="de">Deutsch</a></li><li><a class="language-link" data-tooltip="English" data-lang-code="en">English</a></li><li><a class="language-link" data-tooltip="Esperanto" data-lang-code="eo">esperanto</a></li><li><a class="language-link" data-tooltip="Spanish (Latin America)" data-lang-code="es_419">español (Latinoamérica)</a></li><li><a class="language-link" data-tooltip="Spanish" data-lang-code="es">español</a></li><li><a class="language-link" data-tooltip="Basque" data-lang-code="eu">euskara</a></li><li><a class="language-link" data-tooltip="Persian" data-lang-code="fa">فارسی</a></li><li><a class="language-link" data-tooltip="Finnish" data-lang-code="fi">suomi</a></li><li><a class="language-link" data-tooltip="French" data-lang-code="fr">français</a></li><li><a class="language-link" data-tooltip="Galician" data-lang-code="gl">galego</a></li><li><a class="language-link" data-tooltip="Hebrew" data-lang-code="he">עברית</a></li><li><a class="language-link" data-tooltip="Armenian" data-lang-code="hy">հայերեն</a></li><li><a class="language-link" data-tooltip="Ido" data-lang-code="io">Ido</a></li><li><a class="language-link" data-tooltip="Italian" data-lang-code="it">italiano</a></li><li><a class="language-link" data-tooltip="Japanese" data-lang-code="ja">日本語</a></li><li><a class="language-link" data-tooltip="Norwegian Bokmål" data-lang-code="nb">norsk bokmål</a></li><li><a class="language-link" data-tooltip="Dutch" data-lang-code="nl">Nederlands</a></li><li><a class="language-link" data-tooltip="Polish" data-lang-code="pl">polski</a></li><li><a class="language-link" data-tooltip="Portuguese (Brazil)" data-lang-code="pt_br">português (Brasil)</a></li><li><a class="language-link" data-tooltip="Portuguese" data-lang-code="pt">português</a></li><li><a class="language-link" data-tooltip="Russian" data-lang-code="ru">русский</a></li><li><a class="language-link" data-tooltip="Albanian" data-lang-code="sq">shqip</a></li><li><a class="language-link" data-tooltip="Swedish" data-lang-code="sv">svenska</a></li><li><a class="language-link" data-tooltip="Turkish" data-lang-code="tr">Türkçe</a></li><li><a class="language-link" data-tooltip="Ukrainian" data-lang-code="uk">українська</a></li><li><a class="language-link" data-tooltip="Chinese (China)" data-lang-code="zh_cn">中文(中国)</a></li><li><a class="language-link" data-tooltip="Chinese (Taiwan)" data-lang-code="zh_tw">中文(台灣)</a></li>                                                                          </ul>
+                                                                       </li>
+                                                               </ul>
+                                                       </div>
+                                               </div>
+                                       </div>
+                               </div>
+                <div id="no-js-error">Please enable javascript to use this site.<script>var element = document.getElementById('no-js-error'); element.parentNode.removeChild(element);</script></div>
+                               <div id="page-container">
+                                                               <div class="front-welcome-text "></div>
+                        <div id="login-register-container">
+                                               <div id="login-content">
+                                                       <form id="form_login" class="form_settings" action="https://shitposter.club/main/qlogin" method="post">
+                                                               <div id="username-container">
+                                                                       <input id="nickname" name="nickname" type="text" value="" tabindex="1" />
+                                                               </div>
+                                                               <table class="password-signin"><tbody><tr>
+                                                                       <td class="flex-table-primary">
+                                                                               <div class="placeholding-input">
+                                                                                       <input id="password" name="password" type="password" tabindex="2" value="" />
+                                                                               </div>
+                                                                       </td>
+                                                                       <td class="flex-table-secondary">
+                                                                               <button class="submit" type="submit" id="submit-login" tabindex="4"></button>
+                                                                       </td>
+                                                               </tr></tbody></table>
+                                                               <div id="remember-forgot">
+                                                                       <input type="checkbox" id="rememberme" name="rememberme" value="yes" tabindex="3" checked="checked"> <span id="rememberme_label"></span> · <a id="forgot-password" href="https://shitposter.club/main/recoverpassword" ></a>
+                                                                       <input type="hidden" id="token" name="token" value="cf0a3dab36bdf171e7c84cb4b46932a4e939c482e63347aa6b63fba804f93bf6623b10f6c074b590786764a3f269ebdf2eedb96b0c6c04ccf76dfabb054ee63a">
+                                                                       <a href="https://shitposter.club/main/openid" id="openid-login" title="OpenID" donthijack>OpenID</a>                                                                    </div>
+                                                       </form>
+                                               </div>
+                                               <div class="front-signup">
+                                                       <h2></h2>
+                                                       <div class="signup-input-container"><input placeholder="" type="text" name="user[name]" autocomplete="off" class="text-input" id="signup-user-name"></div>
+                                                       <div class="signup-input-container"><input placeholder="" type="text" name="user[email]" autocomplete="off" id="signup-user-email"></div>
+                                                       <div class="signup-input-container"><input placeholder="" type="password" name="user[user_password]" class="text-input" id="signup-user-password"></div>
+                                                       <button id="signup-btn-step1" class="signup-btn" type="submit"></button>
+                                               </div>
+                            <div id="other-servers-link"></div><div id="qvitter-notice-logged-out"></div></div>
+                    <div id="feed">
+                                               <div id="feed-header">
+                                                       <div id="feed-header-inner">
+                                                               <h2>
+                                    <span id="stream-header"></span>
+                                </h2>
+                                                               <div class="reload-stream"></div>
+                                                       </div>
+                            <div id="feed-header-description"></div>
+                                               </div>
+                                               <div id="new-queets-bar-container" class="hidden"><div id="new-queets-bar"></div></div>
+                                               <div id="feed-body"></div>
+                                       </div>
+                    <div id="hidden-html"><ol class="notices xoxo"><style type="text/css" media="">.greentext { color: green; }</style>
+<style type="text/css" media="">
+.sensitive-blocker {
+  display: none;
+}
+
+div.stream-item.notice.sensitive-notice .sensitive-blocker {
+display: block;
+width: 100%;
+height: 100%;
+position: absolute;
+z-index: 100;
+/*background-color: #d4baba;*/
+background-color: black;
+background-image: url(/custom/afterdark.jpg);
+background-repeat: no-repeat;
+background-position: center center;
+background-size: contain;
+transition: opacity 1s ease-in-out;
+}
+
+.sensitive-blocker:hover {
+  opacity: .5;
+}
+
+div.stream-item.notice.expanded.sensitive-notice .sensitive-blocker {
+display: none;
+background-color: transparent;
+background-image: none;
+}
+</style>
+<style type="text/css" media="">span.dicerolls { font-weight: bold; border: 1px solid black; }</style>
+<li class="h-entry notice post notice-source-Qvitter" id="notice-2827873">
+ <span class="tagcontainer">
+  <section class="notice-headers">
+   <a href="https://shitposter.club/notice/2827873" class="notice-title">Generic Enemy (moonman)'s status on Friday, 05-May-2017 08:51:48 UTC</a>
+   <a href="https://shitposter.club/moonman" class="h-card p-author" title="moonman">
+    <img src="https://shitposter.club/avatar/1-48-20170503024316.jpeg" class="avatar u-photo" width="48" height="48" alt="Generic Enemy"/>
+Generic Enemy</a>
+   <div class="parents">
+    <a href="https://shitposter.club/notice/2827849" class="u-in-reply-to" rel="in-reply-to">in reply to</a>
+    <ul class="addressees">
+     <li class="h-card">
+      <a href="https://gs.smuglo.li/dolus" title="dolus" class="addressee account">Dolus_McHonest</a>
+     </li>
+     <li class="h-card">
+      <a href="https://shitposter.club/neimzr4luzerz" title="neimzr4luzerz" class="addressee account">Solidarity for Pigs</a>
+     </li>
+    </ul>
+   </div>
+  </section>
+  <article class="e-content">@<a href="https://shitposter.club/user/9655" class="h-card mention" title="Solidarity for Pigs">neimzr4luzerz</a> @<a href="https://gs.smuglo.li/user/2326" class="h-card mention" title="Dolus_McHonest">dolus</a> childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English</article>
+  <footer>
+   <a rel="bookmark" class="timestamp" href="https://shitposter.club/conversation/1390270#notice-2827873">
+    <time class="dt-published" datetime="2017-05-05T08:51:48+00:00" title="Friday, 05-May-2017 08:51:48 UTC">about 4 hours ago</time>
+   </a>
+    <span class="source">from     <span class="device">Qvitter</span>
+   </span>
+   <a href="https://shitposter.club/notice/2827873" class="permalink u-url">permalink</a>
+  </footer>
+ </span>
+</li>
+</ol></div>
+                                       <div id="footer"><div id="footer-spinner-container"></div></div>
+                               </div>
+                               <script type="text/javascript" src="https://shitposter.club/plugins/Qvitter/js/lib/jquery-2.1.4.min.js?changed=20160208020735"></script>
+                               <script type="text/javascript" src="https://shitposter.club/plugins/Qvitter/js/lib/jquery-ui.min.js?changed=20160208020735"></script>
+                               <script type="text/javascript" src="https://shitposter.club/plugins/Qvitter/js/lib/jquery.minicolors.min.js?changed=20160208020735"></script>
+                               <script type="text/javascript" src="https://shitposter.club/plugins/Qvitter/js/lib/jquery.jWindowCrop.js?changed=20160208020735"></script>
+                               <script type="text/javascript" src="https://shitposter.club/plugins/Qvitter/js/lib/load-image.min.js?changed=20160208020735"></script>
+                               <script type="text/javascript" src="https://shitposter.club/plugins/Qvitter/js/lib/xregexp-all-3.0.0-pre.js?changed=20160325055804"></script>
+                <script type="text/javascript" src="https://shitposter.club/plugins/Qvitter/js/lib/lz-string.js?changed=20160325055804"></script>
+                <script type="text/javascript" src="https://shitposter.club/plugins/Qvitter/js/lib/bowser.min.js?changed=20160325055804"></script>
+                               <script charset="utf-8" type="text/javascript" src="https://shitposter.club/plugins/Qvitter/js/dom-functions.js?changed=20170211091256"></script>
+                               <script charset="utf-8" type="text/javascript" src="https://shitposter.club/plugins/Qvitter/js/misc-functions.js?changed=20170112022606"></script>
+                               <script charset="utf-8" type="text/javascript" src="https://shitposter.club/plugins/Qvitter/js/ajax-functions.js?changed=20170112022606"></script>
+                <script charset="utf-8" type="text/javascript" src="https://shitposter.club/plugins/Qvitter/js/stream-router.js?changed=20160325055804"></script>
+                               <script charset="utf-8" type="text/javascript" src="https://shitposter.club/plugins/Qvitter/js/qvitter.js?changed=20170215071625"></script>
+                               <link rel="stylesheet" type="text/css" href="/custom/spc.css">
+<script src="/custom/spc.js"></script>
+<script src="https://shitposter.club/plugins/SPCEnhancements//js/audio-metadata.min.js"></script><script src='https://shitposter.club/plugins/QvitterSimpleSecurity/js/ss.js?changed=20160925025913'></script><style>
+img.emoji {
+    width: auto;
+    height: 1.5em;
+    display: inline-block;
+    margin-bottom: -0.25em;
+}
+.queet-text {
+    padding-bottom: .25em;
+}
+</style>
+<script src="https://shitposter.club/plugins/Emojify/js/emojify.js"></script>
+<script>
+emojify.setConfig({
+    img_dir: "https://shitposter.club/plugins/Emojify/images/emoji",
+    ignore_emoticons: true
+});
+
+var emojiReplacer = function(emoji, name, isEmoticon){
+    var classes = (isEmoticon ? "emoticon" : "emoji") + " emoji-" + name;
+    return '<span class="'+classes+'">'+emoji+'</span>';
+}
+</script>
+<script src="https://shitposter.club/plugins/Emojify/js/qvitter_event.js"></script>                    <div id="dynamic-styles">
+                               <style>
+                                       a, a:visited, a:active,
+                                       ul.stats li:hover a,
+                                       ul.stats li:hover a strong,
+                                       #user-body a:hover div strong,
+                                       #user-body a:hover div div,
+                                       .permalink-link:hover,
+                                       .stream-item.expanded > .queet .stream-item-expand,
+                                       .stream-item-footer .with-icn .requeet-text a b:hover,
+                                       .queet-text span.attachment.more,
+                                       .stream-item-header .created-at a:hover,
+                                       .stream-item-header a.account-group:hover .name,
+                                       .queet:hover .stream-item-expand,
+                                       .show-full-conversation:hover,
+                                       #new-queets-bar,
+                                       .menu-container div,
+                                       .cm-mention, .cm-tag, .cm-group, .cm-url, .cm-email,
+                                       div.syntax-middle span,
+                                       #user-body strong,
+                                       ul.stats,
+                                       .stream-item:not(.temp-post) ul.queet-actions li .icon:not(.is-mine):hover:before,
+                                       .show-full-conversation,
+                                       #user-body #user-queets:hover .label,
+                                       #user-body #user-groups:hover .label,
+                                       #user-body #user-following:hover .label,
+                                       ul.stats a strong,
+                                       .queet-box-extras button,
+                                       #openid-login:hover:after,
+                    .post-to-group,
+                    .stream-item-header .addressees .reply-to .h-card.not-mentioned-inline {
+                                               color:/*COLORSTART*/#0084B4/*COLOREND*/;
+                                               }
+                                       /*#unseen-notifications,*/
+                                       .stream-item.notification.not-seen > .queet::before,
+                                       #top-compose,
+                                       #logo,
+                                       .queet-toolbar button,
+                                       #user-header,
+                                       .profile-header-inner,
+                                       .topbar,
+                                       .menu-container,
+                                       .member-button.member,
+                                       .external-follow-button.following,
+                                       .qvitter-follow-button.following,
+                                       .save-profile-button,
+                                       .crop-and-save-button,
+                                       .topbar .global-nav.show-logo:before,
+                                       .topbar .global-nav.pulse-logo:before,
+                    .dropdown-menu li:not(.dropdown-caret) a:hover {
+                                               background-color:/*BACKGROUNDCOLORSTART*/#0084B4/*BACKGROUNDCOLOREND*/;
+                                               }
+                                       .queet-box-syntax[contenteditable="true"]:focus,
+                    .stream-item.selected-by-keyboard::before {
+                                               border-color:/*BORDERCOLORSTART*/#999999/*BORDERCOLOREND*/;
+                                               }
+                                       #user-footer-inner,
+                                       .inline-reply-queetbox,
+                                       #popup-faq #faq-container p.indent {
+                                               background-color:/*LIGHTERBACKGROUNDCOLORSTART*/rgb(205,230,239)/*LIGHTERBACKGROUNDCOLOREND*/;
+                                               }
+                                       #user-footer-inner,
+                                       .queet-box,
+                                       .queet-box-syntax[contenteditable="true"],
+                                       .inline-reply-queetbox,
+                                       span.inline-reply-caret,
+                                   .stream-item.expanded .stream-item.first-visible-after-parent,
+                                       #popup-faq #faq-container p.indent,
+                    .post-to-group,
+                    .quoted-notice:hover,
+                    .oembed-item:hover,
+                    .stream-item:hover:not(.expanded) .quoted-notice:hover,
+                    .stream-item:hover:not(.expanded) .oembed-item:hover {
+                                               border-color:/*LIGHTERBORDERCOLORSTART*/rgb(155,206,224)/*LIGHTERBORDERCOLOREND*/;
+                                               }
+                                       span.inline-reply-caret .caret-inner {
+                                               border-bottom-color:/*LIGHTERBORDERBOTTOMCOLORSTART*/rgb(205,230,239)/*LIGHTERBORDERBOTTOMCOLOREND*/;
+                                               }
+
+                                       .modal-close .icon,
+                                       .chev-right,
+                                       .close-right,
+                                       button.icon.nav-search,
+                                       .member-button .join-text i,
+                                       .external-member-button .join-text i,
+                                       .external-follow-button .follow-text i,
+                                       .qvitter-follow-button .follow-text i,
+                                       #logo,
+                                       .upload-cover-photo,
+                                       .upload-avatar,
+                                       .upload-background-image,
+                                       button.shorten i,
+                                       .reload-stream,
+                                       .topbar .global-nav:before,
+                                       .stream-item.notification.repeat .dogear,
+                                       .stream-item.notification.like .dogear,
+                                       .ostatus-link,
+                                       .close-edit-profile-window {
+                                               background-image: url("../../custom/shitposter-sprite2.png?v=41");
+                                               background-size: 500px 1329px;
+                                               }
+                                       @media (max-width: 910px) {
+                                               #search-query,
+                                               .menu-container a,
+                                               .menu-container a.current,
+                                               .stream-selection.friends-timeline:after,
+                                               .stream-selection.notifications:after,
+                                               .stream-selection.my-timeline:after,
+                                               .stream-selection.public-and-external-timeline:after,
+                                               .stream-selection.public-timeline:after {
+                                                       background-image: url("../../custom/shitposter-sprite2.png?v=41");
+                                                       background-size: 500px 1329px;
+                                                       }
+                                               }
+
+                               </style>
+                       </div>
+                       </body>
+               </html>
+
+
+                       <script type="text/javascript" src="https://shitposter.club/plugins/SensitiveContent/js/sensitivecontent.js"> </script>
diff --git a/test/fixtures/httpoison_mock/https___shitposter.club_user_1.xml b/test/fixtures/httpoison_mock/https___shitposter.club_user_1.xml
new file mode 100644 (file)
index 0000000..bf54c80
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
+ <Subject>https://shitposter.club/user/1</Subject>
+ <Alias>acct:moonman@shitposter.club</Alias>
+ <Alias>https://shitposter.club/moonman</Alias>
+ <Alias>https://shitposter.club/index.php/user/1</Alias>
+ <Alias>https://shitposter.club/index.php/moonman</Alias>
+ <Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="https://shitposter.club/moonman"/>
+ <Link rel="http://gmpg.org/xfn/11" type="text/html" href="https://shitposter.club/moonman"/>
+ <Link rel="describedby" type="application/rdf+xml" href="https://shitposter.club/moonman/foaf"/>
+ <Link rel="http://apinamespace.org/atom" type="application/atomsvc+xml" href="https://shitposter.club/api/statusnet/app/service/moonman.xml"/>
+ <Link rel="http://apinamespace.org/twitter" href="https://shitposter.club/api/"/>
+ <Link rel="http://specs.openid.net/auth/2.0/provider" href="https://shitposter.club/moonman"/>
+ <Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="https://shitposter.club/api/statuses/user_timeline/1.atom"/>
+ <Link rel="magic-public-key" href="data:application/magic-public-key,RSA.4PyrQWAfiQOIxPm4yO-0XHVxMTa8cY4PETeJSjcOx9CMNqiRYNxsT9JFyAwugiwASieMGZhfUDI7Huxyjhb-tyGzlCQEJdJxcWfaRFikwwqWyzpqtQAOjJCb0vYd8gTXSQNJfpwLWQSXUQgwwi31CR3ZlAAc5vtTuWgmKEUrk3c=.AQAB"/>
+ <Link rel="salmon" href="https://shitposter.club/main/salmon/user/1"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-replies" href="https://shitposter.club/main/salmon/user/1"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-mention" href="https://shitposter.club/main/salmon/user/1"/>
+ <Link rel="http://ostatus.org/schema/1.0/subscribe" template="https://shitposter.club/main/ostatussub?profile={uri}"/>
+</XRD>
diff --git a/test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml b/test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml
new file mode 100644 (file)
index 0000000..6cba5c2
--- /dev/null
@@ -0,0 +1,591 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
+ <generator uri="https://gnu.io/social" version="1.0.2-dev">GNU social</generator>
+ <id>https://social.heldscal.la/api/statuses/user_timeline/23211.atom</id>
+ <title>lambadalambda timeline</title>
+ <subtitle>Updates from lambadalambda on social.heldscal.la!</subtitle>
+ <logo>https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg</logo>
+ <updated>2017-05-05T12:01:21+00:00</updated>
+<author>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <uri>https://social.heldscal.la/user/23211</uri>
+ <name>lambadalambda</name>
+ <summary>Call me Deacon Blues.</summary>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+ <link rel="avatar" type="image/jpeg" media:width="236" media:height="236" href="https://social.heldscal.la/avatar/23211-original-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/23211-48-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/23211-24-20170416114257.jpeg"/>
+ <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+ <poco:displayName>Constance Variable</poco:displayName>
+ <poco:note>Call me Deacon Blues.</poco:note>
+ <poco:address>
+  <poco:formatted>Berlin</poco:formatted>
+ </poco:address>
+ <poco:urls>
+  <poco:type>homepage</poco:type>
+  <poco:value>https://heldscal.la</poco:value>
+  <poco:primary>true</poco:primary>
+ </poco:urls>
+ <followers url="https://social.heldscal.la/lambadalambda/subscribers"></followers>
+ <statusnet:profile_info local_id="23211"></statusnet:profile_info>
+</author>
+ <link href="https://social.heldscal.la/lambadalambda" rel="alternate" type="text/html"/>
+ <link href="https://social.heldscal.la/main/sup" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="https://social.heldscal.la/api/statuses/user_timeline/23211.atom?max_id=2060731" rel="next" type="application/atom+xml"/>
+ <link href="https://social.heldscal.la/main/push/hub" rel="hub"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="salmon"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="https://social.heldscal.la/api/statuses/user_timeline/23211.atom" rel="self" type="application/atom+xml"/>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:comment:2063249:2017-05-05T11:40:21+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by tatiana: &lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; they will start complaining about this, but won't come up with any solutions)&lt;/p&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2063306"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T11:40:21+00:00</published>
+ <updated>2017-05-05T11:40:21+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:social.weho.st,2017-05-05:objectId=172033:objectType=Status</id>
+  <title>New comment by tatiana</title>
+  <content type="html">&lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; they will start complaining about this, but won't come up with any solutions)&lt;/p&gt;</content>
+  <link rel="alternate" type="text/html" href="https://social.weho.st/users/Tatiana/updates/2841"/>
+  <status_net notice_id="2063249"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:social.weho.st,2017-05-05:objectId=172033:objectType=Status" href="https://social.weho.st/users/Tatiana/updates/2841"></thr:in-reply-to>
+ <link rel="related" href="https://social.weho.st/users/Tatiana/updates/2841"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1062581"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1062581" local_id="1062581" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2063306.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2063306.atom"/>
+ <statusnet:notice_info local_id="2063306" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:comment:2063041:2017-05-05T11:27:28+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by kat: @&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;h-card mention&quot; title=&quot;Constance Variable&quot;&gt;lambadalambda&lt;/a&gt; if the admin reading mine would delete a few it would be really useful in prioritising. </content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2063148"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T11:27:28+00:00</published>
+ <updated>2017-05-05T11:27:28+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:quitter.se,2017-05-05:noticeId=11807959:objectType=comment</id>
+  <title>New comment by kat</title>
+  <content type="html">@&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;h-card mention&quot; title=&quot;Constance Variable&quot;&gt;lambadalambda&lt;/a&gt; if the admin reading mine would delete a few it would be really useful in prioritising. </content>
+  <link rel="alternate" type="text/html" href="http://quitter.se/notice/11807959"/>
+  <status_net notice_id="2063041"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:quitter.se,2017-05-05:noticeId=11807959:objectType=comment" href="http://quitter.se/notice/11807959"></thr:in-reply-to>
+ <link rel="related" href="http://quitter.se/notice/11807959"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1062581"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1062581" local_id="1062581" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2063148.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2063148.atom"/>
+ <statusnet:notice_info local_id="2063148" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:noticeId=2062924:objectType=note</id>
+ <title>lambadalambda repeated a notice by nielsk</title>
+ <content type="html">RT @nielsk @&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Constance Variable&quot;&gt;lambadalambda&lt;/a&gt; but there are soooo many, where should I start to read?</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2062924"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+ <published>2017-05-05T11:09:37+00:00</published>
+ <updated>2017-05-05T11:09:37+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+  <id>tag:mastodon.social,2017-05-05:objectId=5024471:objectType=Status</id>
+  <title></title>
+  <content type="html">&lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; but there are soooo many, where should I start to read?&lt;/p&gt;</content>
+  <link rel="alternate" type="text/html" href="https://mastodon.social/users/nielsk/updates/2256348"/>
+  <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+  <published>2017-05-05T11:05:18+00:00</published>
+  <updated>2017-05-05T11:05:18+00:00</updated>
+  <author>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+   <uri>https://mastodon.social/users/nielsk</uri>
+   <name>nielsk</name>
+   <summary>Sysadmin by day and ehm… sysadmin by night. Besides that old video games, Japan, economics and some other stuff</summary>
+   <link rel="alternate" type="text/html" href="https://mastodon.social/@nielsk"/>
+   <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://social.heldscal.la/avatar/29849-original-20170428120037.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/29849-96-20170428120041.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/29849-48-20170428120041.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/29849-24-20170429103753.jpeg"/>
+   <poco:preferredUsername>nielsk</poco:preferredUsername>
+   <poco:displayName>nielsk</poco:displayName>
+   <poco:note>Sysadmin by day and ehm… sysadmin by night. Besides that old video games, Japan, economics and some other stuff</poco:note>
+   <statusnet:profile_info local_id="29849"></statusnet:profile_info>
+  </author>
+  <activity:object>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+   <id>tag:mastodon.social,2017-05-05:objectId=5024471:objectType=Status</id>
+   <title>New comment by nielsk</title>
+   <content type="html">&lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; but there are soooo many, where should I start to read?&lt;/p&gt;</content>
+   <link rel="alternate" type="text/html" href="https://mastodon.social/users/nielsk/updates/2256348"/>
+   <status_net notice_id="2062875"></status_net>
+  </activity:object>
+  <thr:in-reply-to ref="tag:social.heldscal.la,2017-05-05:noticeId=2062583:objectType=note" href="https://social.heldscal.la/notice/2062583"></thr:in-reply-to>
+  <link rel="related" href="https://social.heldscal.la/notice/2062583"/>
+  <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1062581"/>
+  <ostatus:conversation href="https://social.heldscal.la/conversation/1062581" local_id="1062581" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198</ostatus:conversation>
+  <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://social.heldscal.la/user/23211"/>
+  <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+  <source>
+   <id>https://mastodon.social/users/nielsk.atom</id>
+   <title>nielsk</title>
+   <link rel="alternate" type="text/html" href="https://mastodon.social/@nielsk"/>
+   <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/nielsk.atom"/>
+   <icon>https://social.heldscal.la/avatar/29849-96-20170428120041.jpeg</icon>
+   <updated>2017-05-05T11:06:32+00:00</updated>
+  </source>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1062581"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1062581" local_id="1062581" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062924.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062924.atom"/>
+ <statusnet:notice_info local_id="2062924" source="api" repeat_of="2062875"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:comment:2062875:2017-05-05T11:09:27+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by nielsk: &lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; but there are soooo many, where should I start to read?&lt;/p&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2062923"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T11:09:27+00:00</published>
+ <updated>2017-05-05T11:09:27+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:mastodon.social,2017-05-05:objectId=5024471:objectType=Status</id>
+  <title>New comment by nielsk</title>
+  <content type="html">&lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; but there are soooo many, where should I start to read?&lt;/p&gt;</content>
+  <link rel="alternate" type="text/html" href="https://mastodon.social/users/nielsk/updates/2256348"/>
+  <status_net notice_id="2062875"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:mastodon.social,2017-05-05:objectId=5024471:objectType=Status" href="https://mastodon.social/users/nielsk/updates/2256348"></thr:in-reply-to>
+ <link rel="related" href="https://mastodon.social/users/nielsk/updates/2256348"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1062581"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1062581" local_id="1062581" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062923.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062923.atom"/>
+ <statusnet:notice_info local_id="2062923" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:comment:2062863:2017-05-05T11:09:11+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by kasil: &lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; surely, google is not that evil !&lt;/p&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2062921"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T11:09:11+00:00</published>
+ <updated>2017-05-05T11:09:11+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:loutre.info,2017-05-05:objectId=23331:objectType=Status</id>
+  <title>New comment by kasil</title>
+  <content type="html">&lt;p&gt;&lt;span class=&quot;h-card&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot; class=&quot;u-url mention&quot;&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; surely, google is not that evil !&lt;/p&gt;</content>
+  <link rel="alternate" type="text/html" href="https://loutre.info/users/Kasil/updates/159"/>
+  <status_net notice_id="2062863"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:loutre.info,2017-05-05:objectId=23331:objectType=Status" href="https://loutre.info/users/Kasil/updates/159"></thr:in-reply-to>
+ <link rel="related" href="https://loutre.info/users/Kasil/updates/159"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1062581"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1062581" local_id="1062581" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062921.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062921.atom"/>
+ <statusnet:notice_info local_id="2062921" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:social.heldscal.la,2017-05-05:noticeId=2062767:objectType=comment</id>
+ <title>New comment by lambadalambda</title>
+ <content type="html">@&lt;a href=&quot;https://sealion.club/user/4&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;dewoo &amp;#x274E;&quot;&gt;dwmatiz&lt;/a&gt; dunno, probably.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2062767"/>
+ <status_net notice_id="2062767"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T10:55:17+00:00</published>
+ <updated>2017-05-05T10:55:17+00:00</updated>
+ <thr:in-reply-to ref="tag:sealion.club,2017-05-05:noticeId=3183881:objectType=comment" href="https://sealion.club/notice/3183881"></thr:in-reply-to>
+ <link rel="related" href="https://sealion.club/notice/3183881"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1062581"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1062581" local_id="1062581" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://sealion.club/user/4"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062767.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062767.atom"/>
+ <statusnet:notice_info local_id="2062767" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:social.heldscal.la,2017-05-05:noticeId=2062705:objectType=comment</id>
+ <title>New comment by lambadalambda</title>
+ <content type="html">@&lt;a href=&quot;https://gs.smuglo.li/user/28250&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Bricky&quot;&gt;thatbrickster&lt;/a&gt; I do it, too.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2062705"/>
+ <status_net notice_id="2062705"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T10:48:12+00:00</published>
+ <updated>2017-05-05T10:48:12+00:00</updated>
+ <thr:in-reply-to ref="tag:gs.smuglo.li,2017-05-05:noticeId=2189353:objectType=comment" href="https://gs.smuglo.li/notice/2189353"></thr:in-reply-to>
+ <link rel="related" href="https://gs.smuglo.li/notice/2189353"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1062581"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1062581" local_id="1062581" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://gs.smuglo.li/user/28250"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062705.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062705.atom"/>
+ <statusnet:notice_info local_id="2062705" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:social.heldscal.la,2017-05-05:noticeId=2062620:objectType=comment</id>
+ <title>New comment by lambadalambda</title>
+ <content type="html">@&lt;a href=&quot;https://social.tchncs.de/users/israuor&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Israuor &amp;#x2642;&quot;&gt;israuor&lt;/a&gt; @&lt;a href=&quot;https://mastodon.gougere.fr/users/bortzmeyer&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;S. Bortzmeyer  &amp;#x2705;&quot;&gt;bortzmeyer&lt;/a&gt; so, 99%. 100% for 'normal' people.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2062620"/>
+ <status_net notice_id="2062620"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T10:38:52+00:00</published>
+ <updated>2017-05-05T10:38:52+00:00</updated>
+ <thr:in-reply-to ref="tag:social.tchncs.de,2017-05-05:objectId=1667119:objectType=Status" href="https://social.tchncs.de/users/israuor/updates/74901"></thr:in-reply-to>
+ <link rel="related" href="https://social.tchncs.de/users/israuor/updates/74901"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1062581"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1062581" local_id="1062581" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://social.tchncs.de/users/israuor"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.gougere.fr/users/bortzmeyer"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062620.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062620.atom"/>
+ <statusnet:notice_info local_id="2062620" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:social.heldscal.la,2017-05-05:noticeId=2062583:objectType=note</id>
+ <title>New note by lambadalambda</title>
+ <content type="html">I wonder what'll happen when people realize the admin at their mail hoster can read all their e-mails.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2062583"/>
+ <status_net notice_id="2062583"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T10:35:45+00:00</published>
+ <updated>2017-05-05T10:35:45+00:00</updated>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1062581"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1062581" local_id="1062581" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062583.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062583.atom"/>
+ <statusnet:notice_info local_id="2062583" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:subscription:23211:person:35708:2017-05-05T09:34:46+00:00</id>
+ <title>Constance Variable (lambadalambda@social.heldscal.la)'s status on Friday, 05-May-2017 09:34:46 UTC</title>
+ <content type="html">&lt;a href=&quot;https://social.heldscal.la/lambadalambda&quot;&gt;Constance Variable&lt;/a&gt; started following &lt;a href=&quot;https://mastodon.social/@milouse&quot;&gt;milouse&lt;/a&gt;.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2062053"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/follow</activity:verb>
+ <published>2017-05-05T09:34:46+00:00</published>
+ <updated>2017-05-05T09:34:46+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <id>https://mastodon.social/users/milouse</id>
+  <title>milouse</title>
+  <summary>#Scout leader #sgdf, interested in #openweb, #semanticweb, #privacy, #foss and #socialeconomy. 0xA714ECAC8C9CEE3D</summary>
+  <link rel="alternate" type="text/html" href="https://mastodon.social/@milouse"/>
+  <link rel="avatar" type="image/png" media:width="120" media:height="120" href="https://social.heldscal.la/avatar/35708-original-20170505105902.png"/>
+  <link rel="avatar" type="image/png" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/35708-96-20170505105911.png"/>
+  <link rel="avatar" type="image/png" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/35708-48-20170505105911.png"/>
+  <link rel="avatar" type="image/png" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/35708-24-20170505105938.png"/>
+  <poco:preferredUsername>milouse</poco:preferredUsername>
+  <poco:displayName>milouse</poco:displayName>
+  <poco:note>#Scout leader #sgdf, interested in #openweb, #semanticweb, #privacy, #foss and #socialeconomy. 0xA714ECAC8C9CEE3D</poco:note>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1062248"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1062248" local_id="1062248" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=26ca19a355bb6135">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=26ca19a355bb6135</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062053.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2062053.atom"/>
+ <statusnet:notice_info local_id="2062053" source="activity"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:noticeId=2061871:objectType=note</id>
+ <title>lambadalambda repeated a notice by safebot</title>
+ <content type="html">RT @&lt;a href=&quot;https://gs.smuglo.li/user/25857&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;safebot&quot;&gt;safebot&lt;/a&gt; #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/tag/cheers&quot; rel=&quot;tag&quot;&gt;cheers&lt;/a&gt;&lt;/span&gt; &lt;a href=&quot;https://gs.smuglo.li/attachment/456444&quot; title=&quot;https://gs.smuglo.li/attachment/456444&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-432334&quot;&gt;https://gs.smuglo.li/attachment/456444&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2061871"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+ <published>2017-05-05T09:16:17+00:00</published>
+ <updated>2017-05-05T09:16:17+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+  <id>tag:gs.smuglo.li,2017-05-05:noticeId=2188073:objectType=note</id>
+  <title></title>
+  <content type="html">#&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://gs.smuglo.li/tag/cheers&quot; rel=&quot;tag&quot;&gt;cheers&lt;/a&gt;&lt;/span&gt; &lt;a href=&quot;https://gs.smuglo.li/file/5099e73c83da778cd032a721e96880f99a868b712be2975d08238547a5ba06c7.jpg&quot; title=&quot;https://gs.smuglo.li/file/5099e73c83da778cd032a721e96880f99a868b712be2975d08238547a5ba06c7.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/456444&lt;/a&gt;</content>
+  <link rel="alternate" type="text/html" href="https://gs.smuglo.li/notice/2188073"/>
+  <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+  <published>2017-05-05T08:36:53+00:00</published>
+  <updated>2017-05-05T08:36:53+00:00</updated>
+  <author>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+   <uri>https://gs.smuglo.li/user/25857</uri>
+   <name>safebot</name>
+   <link rel="alternate" type="text/html" href="https://gs.smuglo.li/safebot"/>
+   <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/25719-original-20161215233234.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/25719-original-20161215233234.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/25719-48-20161215233239.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/25719-24-20161215235533.jpeg"/>
+   <poco:preferredUsername>safebot</poco:preferredUsername>
+   <poco:displayName>safebot</poco:displayName>
+   <statusnet:profile_info local_id="25719"></statusnet:profile_info>
+  </author>
+  <activity:object>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+   <id>tag:gs.smuglo.li,2017-05-05:noticeId=2188073:objectType=note</id>
+   <title>New note by safebot</title>
+   <content type="html">#&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://gs.smuglo.li/tag/cheers&quot; rel=&quot;tag&quot;&gt;cheers&lt;/a&gt;&lt;/span&gt; &lt;a href=&quot;https://gs.smuglo.li/file/5099e73c83da778cd032a721e96880f99a868b712be2975d08238547a5ba06c7.jpg&quot; title=&quot;https://gs.smuglo.li/file/5099e73c83da778cd032a721e96880f99a868b712be2975d08238547a5ba06c7.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/456444&lt;/a&gt;</content>
+   <link rel="alternate" type="text/html" href="https://gs.smuglo.li/notice/2188073"/>
+   <status_net notice_id="2061504"></status_net>
+  </activity:object>
+  <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1061934"/>
+  <ostatus:conversation href="https://social.heldscal.la/conversation/1061934" local_id="1061934" ref="https://gs.smuglo.li/conversation/1009429">https://gs.smuglo.li/conversation/1009429</ostatus:conversation>
+  <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+  <category term="cheers"></category>
+  <source>
+   <id>https://gs.smuglo.li/api/statuses/user_timeline/25857.atom</id>
+   <title>safebot</title>
+   <link rel="alternate" type="text/html" href="https://gs.smuglo.li/safebot"/>
+   <link rel="self" type="application/atom+xml" href="https://gs.smuglo.li/api/statuses/user_timeline/25857.atom"/>
+   <icon>https://social.heldscal.la/avatar/25719-original-20161215233234.jpeg</icon>
+   <updated>2017-05-05T12:00:57+00:00</updated>
+  </source>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1061934"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1061934" local_id="1061934" ref="https://gs.smuglo.li/conversation/1009429">https://gs.smuglo.li/conversation/1009429</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061871.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061871.atom"/>
+ <statusnet:notice_info local_id="2061871" source="api" repeat_of="2061504"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061643:2017-05-05T09:12:50+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by moonman: @&lt;a href=&quot;https://shitposter.club/user/9655&quot; class=&quot;h-card mention&quot; title=&quot;Solidarity for Pigs&quot;&gt;neimzr4luzerz&lt;/a&gt; @&lt;a href=&quot;https://gs.smuglo.li/user/2326&quot; class=&quot;h-card mention&quot; title=&quot;Dolus_McHonest&quot;&gt;dolus&lt;/a&gt; childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2061828"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T09:12:50+00:00</published>
+ <updated>2017-05-05T09:12:50+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment</id>
+  <title>New comment by moonman</title>
+  <content type="html">@&lt;a href=&quot;https://shitposter.club/user/9655&quot; class=&quot;h-card mention&quot; title=&quot;Solidarity for Pigs&quot;&gt;neimzr4luzerz&lt;/a&gt; @&lt;a href=&quot;https://gs.smuglo.li/user/2326&quot; class=&quot;h-card mention&quot; title=&quot;Dolus_McHonest&quot;&gt;dolus&lt;/a&gt; childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English</content>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2827873"/>
+  <status_net notice_id="2061643"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" href="https://shitposter.club/notice/2827873"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2827873"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1061781"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1061781" local_id="1061781" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061828.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061828.atom"/>
+ <statusnet:notice_info local_id="2061828" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061696:2017-05-05T09:06:10+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by moonman: @&lt;a href=&quot;https://shitposter.club/user/9655&quot; class=&quot;h-card mention&quot; title=&quot;Solidarity for Pigs&quot;&gt;neimzr4luzerz&lt;/a&gt; &lt;br /&gt; &lt;span class=&quot;greentext&quot;&gt;&amp;gt; (((common era)))&lt;/span&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2061781"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T09:06:10+00:00</published>
+ <updated>2017-05-05T09:06:10+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:shitposter.club,2017-05-05:noticeId=2827918:objectType=comment</id>
+  <title>New comment by moonman</title>
+  <content type="html">@&lt;a href=&quot;https://shitposter.club/user/9655&quot; class=&quot;h-card mention&quot; title=&quot;Solidarity for Pigs&quot;&gt;neimzr4luzerz&lt;/a&gt; &lt;br /&gt; &lt;span class=&quot;greentext&quot;&gt;&amp;gt; (((common era)))&lt;/span&gt;</content>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2827918"/>
+  <status_net notice_id="2061696"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2827918:objectType=comment" href="https://shitposter.club/notice/2827918"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2827918"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1061781"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1061781" local_id="1061781" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061781.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061781.atom"/>
+ <statusnet:notice_info local_id="2061781" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:note:2061673:2017-05-05T08:58:28+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by moonman: discussion is one thing but any argument I've heard over and over again for the last three decades is going to go unanswered.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2061702"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T08:58:28+00:00</published>
+ <updated>2017-05-05T08:58:28+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+  <id>tag:shitposter.club,2017-05-05:noticeId=2827895:objectType=note</id>
+  <title>New note by moonman</title>
+  <content type="html">discussion is one thing but any argument I've heard over and over again for the last three decades is going to go unanswered.</content>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2827895"/>
+  <status_net notice_id="2061673"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2827895:objectType=note" href="https://shitposter.club/notice/2827895"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2827895"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1062026"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1062026" local_id="1062026" ref="https://shitposter.club/conversation/1390494">https://shitposter.club/conversation/1390494</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061702.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061702.atom"/>
+ <statusnet:notice_info local_id="2061702" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061280:2017-05-05T08:47:38+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by moonman: @&lt;a href=&quot;https://shitposter.club/user/9655&quot; class=&quot;h-card mention&quot; title=&quot;Solidarity for Pigs&quot;&gt;neimzr4luzerz&lt;/a&gt; sex is for procreation and as an expression of intimacy between commited couples, it is a sacramental act</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2061614"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T08:47:38+00:00</published>
+ <updated>2017-05-05T08:47:38+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:shitposter.club,2017-05-05:noticeId=2827561:objectType=comment</id>
+  <title>New comment by moonman</title>
+  <content type="html">@&lt;a href=&quot;https://shitposter.club/user/9655&quot; class=&quot;h-card mention&quot; title=&quot;Solidarity for Pigs&quot;&gt;neimzr4luzerz&lt;/a&gt; sex is for procreation and as an expression of intimacy between commited couples, it is a sacramental act</content>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2827561"/>
+  <status_net notice_id="2061280"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2827561:objectType=comment" href="https://shitposter.club/notice/2827561"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2827561"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1061781"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1061781" local_id="1061781" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061614.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061614.atom"/>
+ <statusnet:notice_info local_id="2061614" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:note:2061535:2017-05-05T08:40:55+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by fortune: What did Mickey Mouse get for Christmas?&lt;br /&gt; &lt;br /&gt; A Dan Quayle watch.&lt;br /&gt; &lt;br /&gt; -- heard from a Mike Dukakis field worker</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2061544"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T08:40:55+00:00</published>
+ <updated>2017-05-05T08:40:55+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+  <id>tag:social.heldscal.la,2017-05-05:noticeId=2061535:objectType=note</id>
+  <title>New note by fortune</title>
+  <content type="html">What did Mickey Mouse get for Christmas?&lt;br /&gt; &lt;br /&gt; A Dan Quayle watch.&lt;br /&gt; &lt;br /&gt; -- heard from a Mike Dukakis field worker</content>
+  <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2061535"/>
+  <status_net notice_id="2061535"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:social.heldscal.la,2017-05-05:noticeId=2061535:objectType=note" href="https://social.heldscal.la/notice/2061535"></thr:in-reply-to>
+ <link rel="related" href="https://social.heldscal.la/notice/2061535"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1061954"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1061954" local_id="1061954" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=5185e5c145ee4762">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=5185e5c145ee4762</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061544.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061544.atom"/>
+ <statusnet:notice_info local_id="2061544" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061421:2017-05-05T08:36:27+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by moonman: @&lt;a href=&quot;https://maly.io/users/sonya&quot; class=&quot;h-card mention&quot; title=&quot;Sonya Mann ✅&quot;&gt;sonya&lt;/a&gt; banned from 4chan. you better watch ou. i'm trouble, y'hear?</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2061495"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T08:36:27+00:00</published>
+ <updated>2017-05-05T08:36:27+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:shitposter.club,2017-05-05:noticeId=2827689:objectType=comment</id>
+  <title>New comment by moonman</title>
+  <content type="html">@&lt;a href=&quot;https://maly.io/users/sonya&quot; class=&quot;h-card mention&quot; title=&quot;Sonya Mann ✅&quot;&gt;sonya&lt;/a&gt; banned from 4chan. you better watch ou. i'm trouble, y'hear?</content>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2827689"/>
+  <status_net notice_id="2061421"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2827689:objectType=comment" href="https://shitposter.club/notice/2827689"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2827689"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1060861"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1060861" local_id="1060861" ref="https://shitposter.club/conversation/1389345">https://shitposter.club/conversation/1389345</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061495.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061495.atom"/>
+ <statusnet:notice_info local_id="2061495" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061351:2017-05-05T08:28:03+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by moonman: @&lt;a href=&quot;https://social.heldscal.la/user/29138&quot; class=&quot;h-card mention&quot; title=&quot;Claes Wallin (韋嘉誠)&quot;&gt;clacke&lt;/a&gt; is that the sequel to Time Crisis</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2061410"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T08:28:03+00:00</published>
+ <updated>2017-05-05T08:28:03+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:shitposter.club,2017-05-05:noticeId=2827630:objectType=comment</id>
+  <title>New comment by moonman</title>
+  <content type="html">@&lt;a href=&quot;https://social.heldscal.la/user/29138&quot; class=&quot;h-card mention&quot; title=&quot;Claes Wallin (韋嘉誠)&quot;&gt;clacke&lt;/a&gt; is that the sequel to Time Crisis</content>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2827630"/>
+  <status_net notice_id="2061351"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2827630:objectType=comment" href="https://shitposter.club/notice/2827630"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2827630"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1056672"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1056672" local_id="1056672" ref="https://shitposter.club/conversation/1385528">https://shitposter.club/conversation/1385528</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061410.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061410.atom"/>
+ <statusnet:notice_info local_id="2061410" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061339:2017-05-05T08:21:05+00:00</id>
+ <title>Favorite</title>
+ <content type="html">lambadalambda favorited something by hardbass2k8: @&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card mention&quot; title=&quot;Constance Variable&quot;&gt;lambadalambda&lt;/a&gt; pretty sure it's money laundering</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2061357"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-05-05T08:21:05+00:00</published>
+ <updated>2017-05-05T08:21:05+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:shitposter.club,2017-05-05:noticeId=2827617:objectType=comment</id>
+  <title>New comment by hardbass2k8</title>
+  <content type="html">@&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card mention&quot; title=&quot;Constance Variable&quot;&gt;lambadalambda&lt;/a&gt; pretty sure it's money laundering</content>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2827617"/>
+  <status_net notice_id="2061339"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-05-05:noticeId=2827617:objectType=comment" href="https://shitposter.club/notice/2827617"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2827617"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1059050"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1059050" local_id="1059050" ref="https://shitposter.club/conversation/1387523">https://shitposter.club/conversation/1387523</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061357.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061357.atom"/>
+ <statusnet:notice_info local_id="2061357" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:social.heldscal.la,2017-05-05:noticeId=2061303:objectType=note</id>
+ <title>New note by lambadalambda</title>
+ <content type="html">It's got tattoos, it's got a pierced hood&lt;br /&gt; It's got generation X&lt;br /&gt; It's got lesbians, and vitriol&lt;br /&gt; And sadomasochistic latex sex&lt;br /&gt; It's got Mighty Morphin' power brokers&lt;br /&gt; And Tanya Harding nude&lt;br /&gt; Macrobiotic lacto-vegan non-confrontational free range food&lt;br /&gt; It's got the handshake, peace talk, non-aggression pact&lt;br /&gt; A multicultural integration of segregated historical facts&lt;br /&gt; &lt;br /&gt; #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/tag/nsfw&quot; rel=&quot;tag&quot;&gt;nsfw&lt;/a&gt;&lt;/span&gt; &lt;a href=&quot;https://social.heldscal.la/file/61c13b99c92f40ec4865e7a3830da340b187e3de70d94b8da38fd2138bbede3a.jpg&quot; title=&quot;https://social.heldscal.la/file/61c13b99c92f40ec4865e7a3830da340b187e3de70d94b8da38fd2138bbede3a.jpg&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-432199&quot;&gt;https://social.heldscal.la/attachment/432199&lt;/a&gt; &lt;a href=&quot;https://social.heldscal.la/file/a88bba1a324da68ee2cfdbcd1c4cde60bd9553298244d6f81731270b71aa80df.jpg&quot; title=&quot;https://social.heldscal.la/file/a88bba1a324da68ee2cfdbcd1c4cde60bd9553298244d6f81731270b71aa80df.jpg&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-432200&quot;&gt;https://social.heldscal.la/attachment/432200&lt;/a&gt; &lt;a href=&quot;https://social.heldscal.la/file/887329a303250e73dc2eea06b1f0512fcac4b9d1b534068f03c45f00d5b21c39.jpg&quot; title=&quot;https://social.heldscal.la/file/887329a303250e73dc2eea06b1f0512fcac4b9d1b534068f03c45f00d5b21c39.jpg&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-432201&quot;&gt;https://social.heldscal.la/attachment/432201&lt;/a&gt; &lt;a href=&quot;https://social.heldscal.la/file/6d7a1ec15c1368c4c68810434d24da528606fcbccdd1da97b25affafeeb6ffda.jpg&quot; title=&quot;https://social.heldscal.la/file/6d7a1ec15c1368c4c68810434d24da528606fcbccdd1da97b25affafeeb6ffda.jpg&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-432202&quot;&gt;https://social.heldscal.la/attachment/432202&lt;/a&gt; &lt;a href=&quot;https://social.heldscal.la/file/2f55f2bb028eb9be744cc82b35a6b86b496d8c3924c700aff55a872ff11df54c.jpg&quot; title=&quot;https://social.heldscal.la/file/2f55f2bb028eb9be744cc82b35a6b86b496d8c3924c700aff55a872ff11df54c.jpg&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-432203&quot;&gt;https://social.heldscal.la/attachment/432203&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2061303"/>
+ <status_net notice_id="2061303"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-05T08:17:08+00:00</published>
+ <updated>2017-05-05T08:17:08+00:00</updated>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1061817"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1061817" local_id="1061817" ref="tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=bb6f4343036970e8">tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=bb6f4343036970e8</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <category term="nsfw"></category>
+ <link rel="enclosure" href="https://social.heldscal.la/file/61c13b99c92f40ec4865e7a3830da340b187e3de70d94b8da38fd2138bbede3a.jpg" type="image/jpeg" length="239712"/>
+ <link rel="enclosure" href="https://social.heldscal.la/file/a88bba1a324da68ee2cfdbcd1c4cde60bd9553298244d6f81731270b71aa80df.jpg" type="image/jpeg" length="185200"/>
+ <link rel="enclosure" href="https://social.heldscal.la/file/887329a303250e73dc2eea06b1f0512fcac4b9d1b534068f03c45f00d5b21c39.jpg" type="image/jpeg" length="292061"/>
+ <link rel="enclosure" href="https://social.heldscal.la/file/6d7a1ec15c1368c4c68810434d24da528606fcbccdd1da97b25affafeeb6ffda.jpg" type="image/jpeg" length="147280"/>
+ <link rel="enclosure" href="https://social.heldscal.la/file/2f55f2bb028eb9be744cc82b35a6b86b496d8c3924c700aff55a872ff11df54c.jpg" type="image/jpeg" length="164659"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061303.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2061303.atom"/>
+ <statusnet:notice_info local_id="2061303" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+</feed>
diff --git a/test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml b/test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml
new file mode 100644 (file)
index 0000000..f70fbc6
--- /dev/null
@@ -0,0 +1,719 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
+ <generator uri="https://gnu.io/social" version="1.0.2-dev">GNU social</generator>
+ <id>https://social.heldscal.la/api/statuses/user_timeline/29191.atom</id>
+ <title>shp timeline</title>
+ <subtitle>Updates from shp on social.heldscal.la!</subtitle>
+ <logo>https://social.heldscal.la/avatar/29191-96-20170421154949.jpeg</logo>
+ <updated>2017-05-05T11:57:06+00:00</updated>
+<author>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <uri>https://social.heldscal.la/user/29191</uri>
+ <name>shp</name>
+ <summary>cofe</summary>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/shp"/>
+ <link rel="avatar" type="image/jpeg" media:width="735" media:height="735" href="https://social.heldscal.la/avatar/29191-original-20170421154949.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/29191-96-20170421154949.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/29191-48-20170421154949.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/29191-24-20170421161149.jpeg"/>
+ <poco:preferredUsername>shp</poco:preferredUsername>
+ <poco:displayName>shp</poco:displayName>
+ <poco:note>cofe</poco:note>
+ <poco:address>
+  <poco:formatted>cofe</poco:formatted>
+ </poco:address>
+ <followers url="https://social.heldscal.la/shp/subscribers"></followers>
+ <statusnet:profile_info local_id="29191"></statusnet:profile_info>
+</author>
+ <link href="https://social.heldscal.la/shp" rel="alternate" type="text/html"/>
+ <link href="https://social.heldscal.la/main/sup" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="https://social.heldscal.la/api/statuses/user_timeline/29191.atom?max_id=1907936" rel="next" type="application/atom+xml"/>
+ <link href="https://social.heldscal.la/main/push/hub" rel="hub"/>
+ <link href="https://social.heldscal.la/main/salmon/user/29191" rel="salmon"/>
+ <link href="https://social.heldscal.la/main/salmon/user/29191" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="https://social.heldscal.la/main/salmon/user/29191" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="https://social.heldscal.la/api/statuses/user_timeline/29191.atom" rel="self" type="application/atom+xml"/>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-29:noticeId=1967657:objectType=note</id>
+ <title>shp repeated a notice by lain</title>
+ <content type="html">RT @&lt;a href=&quot;https://social.heldscal.la/user/37181&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Lain Iwakura&quot;&gt;lain&lt;/a&gt; @&lt;a href=&quot;https://social.heldscal.la/user/29191&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;shp&quot;&gt;shp&lt;/a&gt; @&lt;a href=&quot;https://social.heldscal.la/user/23211&quot; class=&quot;h-card u-url p-nickname mention&quot;&gt;lambadalambda&lt;/a&gt; cofe.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1967657"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+ <published>2017-04-29T18:19:34+00:00</published>
+ <updated>2017-04-29T18:19:34+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+  <id>https://pleroma.soykaf.com/activities/43d12c05-db3f-4f3d-bee1-d676f264490c</id>
+  <title></title>
+  <content type="html">&lt;a href=&quot;https://pleroma.soykaf.com/users/shp&quot;&gt;@shp&lt;/a&gt; &lt;a href=&quot;https://social.heldscal.la/user/23211&quot;&gt;@lambadalambda@social.heldscal.la&lt;/a&gt; cofe.</content>
+  <link rel="alternate" type="text/html" href="https://pleroma.soykaf.com/activities/43d12c05-db3f-4f3d-bee1-d676f264490c"/>
+  <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+  <published>2017-04-29T18:14:36+00:00</published>
+  <updated>2017-04-29T18:14:36+00:00</updated>
+  <author>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+   <uri>https://pleroma.soykaf.com/users/lain</uri>
+   <name>lain</name>
+   <summary>Test account</summary>
+   <link rel="alternate" type="text/html" href="https://pleroma.soykaf.com/users/lain"/>
+   <link rel="avatar" type="image/jpeg" media:width="250" media:height="202" href="https://social.heldscal.la/avatar/43188-original-20170429171039.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/43188-96-20170429172422.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/43188-48-20170429172422.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/43188-24-20170429181411.jpeg"/>
+   <poco:preferredUsername>lain</poco:preferredUsername>
+   <poco:displayName>Lain Iwakura</poco:displayName>
+   <poco:note>Test account</poco:note>
+   <statusnet:profile_info local_id="43188"></statusnet:profile_info>
+  </author>
+  <activity:object>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+   <id>https://pleroma.soykaf.com/activities/43d12c05-db3f-4f3d-bee1-d676f264490c</id>
+   <title>New note by lain</title>
+   <content type="html">&lt;a href=&quot;https://pleroma.soykaf.com/users/shp&quot;&gt;@shp&lt;/a&gt; &lt;a href=&quot;https://social.heldscal.la/user/23211&quot;&gt;@lambadalambda@social.heldscal.la&lt;/a&gt; cofe.</content>
+   <link rel="alternate" type="text/html" href="https://pleroma.soykaf.com/activities/43d12c05-db3f-4f3d-bee1-d676f264490c"/>
+   <status_net notice_id="1967581"></status_net>
+  </activity:object>
+  <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1007769"/>
+  <ostatus:conversation href="https://social.heldscal.la/conversation/1007769" local_id="1007769" ref="tag:social.heldscal.la,2017-04-29:objectType=thread:nonce=e0b75431888efdab">tag:social.heldscal.la,2017-04-29:objectType=thread:nonce=e0b75431888efdab</ostatus:conversation>
+  <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+  <source>
+   <id>https://pleroma.soykaf.com/users/lain/feed.atom</id>
+   <title>Lain Iwakura</title>
+   <link rel="alternate" type="text/html" href="https://pleroma.soykaf.com/users/lain"/>
+   <link rel="self" type="application/atom+xml" href="https://pleroma.soykaf.com/users/lain/feed.atom"/>
+   <icon>https://social.heldscal.la/avatar/43188-96-20170429172422.jpeg</icon>
+   <updated>2017-05-05T08:38:03+00:00</updated>
+  </source>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1007769"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1007769" local_id="1007769" ref="tag:social.heldscal.la,2017-04-29:objectType=thread:nonce=e0b75431888efdab">tag:social.heldscal.la,2017-04-29:objectType=thread:nonce=e0b75431888efdab</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1967657.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1967657.atom"/>
+ <statusnet:notice_info local_id="1967657" source="Qvitter" repeat_of="1967581"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-27:subscription:29191:person:29558:2017-04-27T17:26:37+00:00</id>
+ <title>shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:26:37 UTC</title>
+ <content type="html">&lt;a href=&quot;https://social.heldscal.la/shp&quot;&gt;shp&lt;/a&gt; started following &lt;a href=&quot;https://gs.smuglo.li/kfist&quot;&gt;KFist&lt;/a&gt;.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1933101"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/follow</activity:verb>
+ <published>2017-04-27T17:26:37+00:00</published>
+ <updated>2017-04-27T17:26:37+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <id>https://gs.smuglo.li/user/28051</id>
+  <title>KFist</title>
+  <summary>I stream thanks to @nepfag. I also drink, shitpost, and fly planes. I visited Japan and it changed my life. Do you love your station?</summary>
+  <link rel="alternate" type="text/html" href="https://gs.smuglo.li/kfist"/>
+  <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/29558-original-20170302030034.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/29558-original-20170302030034.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/29558-48-20170303232734.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/29558-24-20170304004149.jpeg"/>
+  <poco:preferredUsername>kfist</poco:preferredUsername>
+  <poco:displayName>KFist</poco:displayName>
+  <poco:note>I stream thanks to @nepfag. I also drink, shitpost, and fly planes. I visited Japan and it changed my life. Do you love your station?</poco:note>
+  <poco:urls>
+   <poco:type>homepage</poco:type>
+   <poco:value>http://smuglo.li:8000/stream.m3u</poco:value>
+   <poco:primary>true</poco:primary>
+  </poco:urls>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988472"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/988472" local_id="988472" ref="tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=f766240d13ed9c2e">tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=f766240d13ed9c2e</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933101.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933101.atom"/>
+ <statusnet:notice_info local_id="1933101" source="activity"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-27:noticeId=1933030:objectType=note</id>
+ <title>shp repeated a notice by shpbot</title>
+ <content type="html">RT @&lt;a href=&quot;https://gs.archae.me/user/4687&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;shpbot&quot;&gt;shpbot&lt;/a&gt; &amp;gt;QuakeC</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1933030"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+ <published>2017-04-27T17:21:10+00:00</published>
+ <updated>2017-04-27T17:21:10+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+  <id>tag:gs.archae.me,2017-04-27:noticeId=760881:objectType=note</id>
+  <title></title>
+  <content type="html">&lt;span class='greentext'&gt;&amp;gt;QuakeC&lt;/span&gt;</content>
+  <link rel="alternate" type="text/html" href="https://gs.archae.me/notice/760881"/>
+  <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+  <published>2017-04-27T17:15:13+00:00</published>
+  <updated>2017-04-27T17:15:13+00:00</updated>
+  <author>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+   <uri>https://gs.archae.me/user/4687</uri>
+   <name>shpbot</name>
+   <link rel="alternate" type="text/html" href="https://gs.archae.me/shpbot"/>
+   <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/31581-original-20170405170019.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/31581-original-20170405170019.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/31581-48-20170405170027.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/31581-24-20170405170342.jpeg"/>
+   <poco:preferredUsername>shpbot</poco:preferredUsername>
+   <poco:displayName>shpbot</poco:displayName>
+   <statusnet:profile_info local_id="31581"></statusnet:profile_info>
+  </author>
+  <activity:object>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+   <id>tag:gs.archae.me,2017-04-27:noticeId=760881:objectType=note</id>
+   <title>New note by shpbot</title>
+   <content type="html">&lt;span class='greentext'&gt;&amp;gt;QuakeC&lt;/span&gt;</content>
+   <link rel="alternate" type="text/html" href="https://gs.archae.me/notice/760881"/>
+   <status_net notice_id="1932941"></status_net>
+  </activity:object>
+  <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988397"/>
+  <ostatus:conversation href="https://social.heldscal.la/conversation/988397" local_id="988397" ref="https://gs.archae.me/conversation/318362">https://gs.archae.me/conversation/318362</ostatus:conversation>
+  <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+  <source>
+   <id>https://gs.archae.me/api/statuses/user_timeline/4687.atom</id>
+   <title>shpbot</title>
+   <link rel="alternate" type="text/html" href="https://gs.archae.me/shpbot"/>
+   <link rel="self" type="application/atom+xml" href="https://gs.archae.me/api/statuses/user_timeline/4687.atom"/>
+   <icon>https://social.heldscal.la/avatar/31581-original-20170405170019.jpeg</icon>
+   <updated>2017-05-05T11:45:08+00:00</updated>
+  </source>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988397"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/988397" local_id="988397" ref="https://gs.archae.me/conversation/318362">https://gs.archae.me/conversation/318362</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933030.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933030.atom"/>
+ <statusnet:notice_info local_id="1933030" source="Qvitter" repeat_of="1932941"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-27:subscription:29191:person:23226:2017-04-27T17:20:48+00:00</id>
+ <title>shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:20:48 UTC</title>
+ <content type="html">&lt;a href=&quot;https://social.heldscal.la/shp&quot;&gt;shp&lt;/a&gt; started following &lt;a href=&quot;http://quitter.se/taknamay&quot;&gt;Internet Turtle Ⓐ 🏴 ✅&lt;/a&gt;.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1933025"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/follow</activity:verb>
+ <published>2017-04-27T17:20:48+00:00</published>
+ <updated>2017-04-27T17:20:48+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <id>http://quitter.se/user/115823</id>
+  <title>Internet Turtle Ⓐ 🏴 ✅</title>
+  <summary>Scheme programmer, Novice esperantist, Spiritual naturalist - Will listen to your problems for free - XMPP: DarkDungeons94 at chatme.im</summary>
+  <link rel="alternate" type="text/html" href="http://quitter.se/taknamay"/>
+  <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/23226-original-20170427130915.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/23226-original-20170427130915.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/23226-48-20170427130918.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/23226-24-20170427171808.jpeg"/>
+  <poco:preferredUsername>taknamay</poco:preferredUsername>
+  <poco:displayName>Internet Turtle Ⓐ 🏴 ✅</poco:displayName>
+  <poco:note>Scheme programmer, Novice esperantist, Spiritual naturalist - Will listen to your problems for free - XMPP: DarkDungeons94 at chatme.im</poco:note>
+  <poco:address>
+   <poco:formatted>New Jersey, United States</poco:formatted>
+  </poco:address>
+  <poco:urls>
+   <poco:type>homepage</poco:type>
+   <poco:value>https://quitter.se/taknamay</poco:value>
+   <poco:primary>true</poco:primary>
+  </poco:urls>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988439"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/988439" local_id="988439" ref="tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=a66b1fb22020c152">tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=a66b1fb22020c152</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933025.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933025.atom"/>
+ <statusnet:notice_info local_id="1933025" source="activity"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-27:subscription:29191:person:29302:2017-04-27T17:20:33+00:00</id>
+ <title>shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:20:33 UTC</title>
+ <content type="html">&lt;a href=&quot;https://social.heldscal.la/shp&quot;&gt;shp&lt;/a&gt; started following &lt;a href=&quot;https://icosahedron.website/@Trev&quot;&gt;Chillidan Stormrave&lt;/a&gt;.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1933022"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/follow</activity:verb>
+ <published>2017-04-27T17:20:33+00:00</published>
+ <updated>2017-04-27T17:20:33+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <id>https://icosahedron.website/users/Trev</id>
+  <title>Trev Prime</title>
+  <summary>web tech, music, ethics. radical individualist. kinda queer. love thy neighbor. always open for conversation. </summary>
+  <link rel="alternate" type="text/html" href="https://icosahedron.website/@Trev"/>
+  <link rel="avatar" type="image/png" media:width="120" media:height="120" href="https://social.heldscal.la/avatar/29302-original-20170417171941.png"/>
+  <link rel="avatar" type="image/png" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/29302-96-20170417171942.png"/>
+  <link rel="avatar" type="image/png" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/29302-48-20170417171942.png"/>
+  <link rel="avatar" type="image/png" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/29302-24-20170417180438.png"/>
+  <poco:preferredUsername>trev</poco:preferredUsername>
+  <poco:displayName>Trev Prime</poco:displayName>
+  <poco:note>web tech, music, ethics. radical individualist. kinda queer. love thy neighbor. always open for conversation. </poco:note>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988436"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/988436" local_id="988436" ref="tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=781c05bd64ad9520">tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=781c05bd64ad9520</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933022.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933022.atom"/>
+ <statusnet:notice_info local_id="1933022" source="activity"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-27:subscription:29191:person:29367:2017-04-27T17:20:27+00:00</id>
+ <title>shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:20:27 UTC</title>
+ <content type="html">&lt;a href=&quot;https://social.heldscal.la/shp&quot;&gt;shp&lt;/a&gt; started following &lt;a href=&quot;https://gs.kawa-kun.com/aya&quot;&gt;射命丸 文&lt;/a&gt;.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1933020"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/follow</activity:verb>
+ <published>2017-04-27T17:20:27+00:00</published>
+ <updated>2017-04-27T17:20:27+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <id>https://gs.kawa-kun.com/user/4885</id>
+  <title>射命丸 文</title>
+  <summary>Traditional Reporter of Fantasy</summary>
+  <link rel="alternate" type="text/html" href="https://gs.kawa-kun.com/aya"/>
+  <link rel="avatar" type="image/png" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/29367-original-20170322091904.png"/>
+  <link rel="avatar" type="image/png" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/29367-original-20170322091904.png"/>
+  <link rel="avatar" type="image/png" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/29367-48-20170322103327.png"/>
+  <link rel="avatar" type="image/png" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/29367-24-20170322185131.png"/>
+  <poco:preferredUsername>aya</poco:preferredUsername>
+  <poco:displayName>射命丸 文</poco:displayName>
+  <poco:note>Traditional Reporter of Fantasy</poco:note>
+  <poco:address>
+   <poco:formatted>Gensōkyō</poco:formatted>
+  </poco:address>
+  <poco:urls>
+   <poco:type>homepage</poco:type>
+   <poco:value>https://danbooru.donmai.us</poco:value>
+   <poco:primary>true</poco:primary>
+  </poco:urls>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988435"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/988435" local_id="988435" ref="tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=5921da7a934e47ca">tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=5921da7a934e47ca</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933020.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933020.atom"/>
+ <statusnet:notice_info local_id="1933020" source="activity"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-27:subscription:29191:person:27773:2017-04-27T17:20:18+00:00</id>
+ <title>shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:20:18 UTC</title>
+ <content type="html">&lt;a href=&quot;https://social.heldscal.la/shp&quot;&gt;shp&lt;/a&gt; started following &lt;a href=&quot;https://gs.smuglo.li/japananon&quot;&gt;JapanAnon&lt;/a&gt;.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1933017"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/follow</activity:verb>
+ <published>2017-04-27T17:20:18+00:00</published>
+ <updated>2017-04-27T17:20:18+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <id>https://gs.smuglo.li/user/27299</id>
+  <title>JapanAnon</title>
+  <summary>匿名でしていてね!</summary>
+  <link rel="alternate" type="text/html" href="https://gs.smuglo.li/japananon"/>
+  <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/27773-original-20170102074719.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/27773-original-20170102074719.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/27773-48-20170103173058.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/27773-24-20170103173058.jpeg"/>
+  <poco:preferredUsername>japananon</poco:preferredUsername>
+  <poco:displayName>JapanAnon</poco:displayName>
+  <poco:note>匿名でしていてね!</poco:note>
+  <poco:address>
+   <poco:formatted>ワイヤード</poco:formatted>
+  </poco:address>
+  <poco:urls>
+   <poco:type>homepage</poco:type>
+   <poco:value>http://www.anonymous-japan.org</poco:value>
+   <poco:primary>true</poco:primary>
+  </poco:urls>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988434"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/988434" local_id="988434" ref="tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=ae3d819865886cba">tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=ae3d819865886cba</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933017.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933017.atom"/>
+ <statusnet:notice_info local_id="1933017" source="activity"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-27:subscription:29191:person:36560:2017-04-27T17:19:30+00:00</id>
+ <title>shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:19:30 UTC</title>
+ <content type="html">&lt;a href=&quot;https://social.heldscal.la/shp&quot;&gt;shp&lt;/a&gt; started following &lt;a href=&quot;https://shitposter.club/wareya&quot;&gt;wareya&lt;/a&gt;.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1933001"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/follow</activity:verb>
+ <published>2017-04-27T17:19:30+00:00</published>
+ <updated>2017-04-27T17:19:30+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <id>https://shitposter.club/user/15439</id>
+  <title>wareya</title>
+  <summary>Who are you to defy such a perfect being that is the machine?  日本語難しいけど頑張るぜ  github.com/wareya wareya.moe  Short: reya or war, never &quot;ware&quot;</summary>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/wareya"/>
+  <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/36560-original-20170414073546.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/36560-original-20170414073546.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/36560-48-20170414075036.jpeg"/>
+  <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/36560-24-20170427171930.jpeg"/>
+  <poco:preferredUsername>wareya</poco:preferredUsername>
+  <poco:displayName>wareya</poco:displayName>
+  <poco:note>Who are you to defy such a perfect being that is the machine?  日本語難しいけど頑張るぜ  github.com/wareya wareya.moe  Short: reya or war, never &quot;ware&quot;</poco:note>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988426"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/988426" local_id="988426" ref="tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=bd88a3cd20b5a418">tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=bd88a3cd20b5a418</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933001.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1933001.atom"/>
+ <statusnet:notice_info local_id="1933001" source="activity"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-27:subscription:29191:person:41176:2017-04-27T17:19:21+00:00</id>
+ <title>shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:19:21 UTC</title>
+ <content type="html">&lt;a href=&quot;https://social.heldscal.la/shp&quot;&gt;shp&lt;/a&gt; started following &lt;a href=&quot;https://hakui.club/takeshitakenji&quot;&gt;竹下憲二 (白)&lt;/a&gt;.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1932999"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/follow</activity:verb>
+ <published>2017-04-27T17:19:21+00:00</published>
+ <updated>2017-04-27T17:19:21+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <id>https://hakui.club/user/6</id>
+  <title>竹下憲二 (白)</title>
+  <summary>Oh boy.</summary>
+  <link rel="alternate" type="text/html" href="https://hakui.club/takeshitakenji"/>
+  <link rel="avatar" type="image/png" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/41176-original-20170428153916.png"/>
+  <link rel="avatar" type="image/png" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/41176-original-20170428153916.png"/>
+  <link rel="avatar" type="image/png" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/41176-48-20170428153926.png"/>
+  <link rel="avatar" type="image/png" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/41176-24-20170428160801.png"/>
+  <poco:preferredUsername>takeshitakenji</poco:preferredUsername>
+  <poco:displayName>竹下憲二 (白)</poco:displayName>
+  <poco:note>Oh boy.</poco:note>
+  <poco:address>
+   <poco:formatted>Seattle, WA</poco:formatted>
+  </poco:address>
+  <poco:urls>
+   <poco:type>homepage</poco:type>
+   <poco:value>http://gs.kawa-kun.com</poco:value>
+   <poco:primary>true</poco:primary>
+  </poco:urls>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988424"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/988424" local_id="988424" ref="tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=b139a673deba6963">tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=b139a673deba6963</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932999.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932999.atom"/>
+ <statusnet:notice_info local_id="1932999" source="activity"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-27:fave:29191:note:1932205:2017-04-27T17:17:46+00:00</id>
+ <title>Favorite</title>
+ <content type="html">shp favorited something by dolus: Looks like Merry is pussing out and caving to pressure. Sad. &lt;a href=&quot;https://gs.smuglo.li/file/23e37de3c321248d3f322d8ec042372914568ab4c9431a94e568a61b8146587f.png&quot; title=&quot;https://gs.smuglo.li/file/23e37de3c321248d3f322d8ec042372914568ab4c9431a94e568a61b8146587f.png&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/432294&lt;/a&gt; &lt;a href=&quot;https://gs.smuglo.li/file/e5a9549a19986d59d51750090910f47c186787adf02b2b6ac58df37556887297.png&quot; title=&quot;https://gs.smuglo.li/file/e5a9549a19986d59d51750090910f47c186787adf02b2b6ac58df37556887297.png&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/432295&lt;/a&gt; &lt;a href=&quot;https://gs.smuglo.li/file/2fdfabbc8ab0b8dc135903a8c48c29b440d1f97446b98ced4ad14a54d3b5d41f.png&quot; title=&quot;https://gs.smuglo.li/file/2fdfabbc8ab0b8dc135903a8c48c29b440d1f97446b98ced4ad14a54d3b5d41f.png&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/432296&lt;/a&gt; &lt;a href=&quot;https://gs.smuglo.li/file/af605d7c6fe3a8c26c6d334c2a8e0005f7e86a266f14a5b3755e7d3ac4e226de.png&quot; title=&quot;https://gs.smuglo.li/file/af605d7c6fe3a8c26c6d334c2a8e0005f7e86a266f14a5b3755e7d3ac4e226de.png&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/432297&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1932976"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-04-27T17:17:46+00:00</published>
+ <updated>2017-04-27T17:17:46+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+  <id>tag:gs.smuglo.li,2017-04-27:noticeId=2065465:objectType=note</id>
+  <title>New note by dolus</title>
+  <content type="html">Looks like Merry is pussing out and caving to pressure. Sad. &lt;a href=&quot;https://gs.smuglo.li/file/23e37de3c321248d3f322d8ec042372914568ab4c9431a94e568a61b8146587f.png&quot; title=&quot;https://gs.smuglo.li/file/23e37de3c321248d3f322d8ec042372914568ab4c9431a94e568a61b8146587f.png&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/432294&lt;/a&gt; &lt;a href=&quot;https://gs.smuglo.li/file/e5a9549a19986d59d51750090910f47c186787adf02b2b6ac58df37556887297.png&quot; title=&quot;https://gs.smuglo.li/file/e5a9549a19986d59d51750090910f47c186787adf02b2b6ac58df37556887297.png&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/432295&lt;/a&gt; &lt;a href=&quot;https://gs.smuglo.li/file/2fdfabbc8ab0b8dc135903a8c48c29b440d1f97446b98ced4ad14a54d3b5d41f.png&quot; title=&quot;https://gs.smuglo.li/file/2fdfabbc8ab0b8dc135903a8c48c29b440d1f97446b98ced4ad14a54d3b5d41f.png&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/432296&lt;/a&gt; &lt;a href=&quot;https://gs.smuglo.li/file/af605d7c6fe3a8c26c6d334c2a8e0005f7e86a266f14a5b3755e7d3ac4e226de.png&quot; title=&quot;https://gs.smuglo.li/file/af605d7c6fe3a8c26c6d334c2a8e0005f7e86a266f14a5b3755e7d3ac4e226de.png&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/432297&lt;/a&gt;</content>
+  <link rel="alternate" type="text/html" href="https://gs.smuglo.li/notice/2065465"/>
+  <status_net notice_id="1932205"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:gs.smuglo.li,2017-04-27:noticeId=2065465:objectType=note" href="https://gs.smuglo.li/notice/2065465"></thr:in-reply-to>
+ <link rel="related" href="https://gs.smuglo.li/notice/2065465"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/987894"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/987894" local_id="987894" ref="https://gs.smuglo.li/conversation/927473">https://gs.smuglo.li/conversation/927473</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932976.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932976.atom"/>
+ <statusnet:notice_info local_id="1932976" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-27:fave:29191:note:1932492:2017-04-27T17:13:55+00:00</id>
+ <title>Favorite</title>
+ <content type="html">shp favorited something by zemichi: &lt;a href=&quot;https://gs.smuglo.li/file/1d45ea4ffc95f15037f361b56ad6b89f8451b70ad1ff7a03b7bb0345b8e2227c.jpg&quot; title=&quot;https://gs.smuglo.li/file/1d45ea4ffc95f15037f361b56ad6b89f8451b70ad1ff7a03b7bb0345b8e2227c.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/432344&lt;/a&gt;&lt;br /&gt; that's a lot of loli</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1932922"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-04-27T17:13:55+00:00</published>
+ <updated>2017-04-27T17:13:55+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+  <id>tag:gs.smuglo.li,2017-04-27:noticeId=2065713:objectType=note</id>
+  <title>New note by zemichi</title>
+  <content type="html">&lt;a href=&quot;https://gs.smuglo.li/file/1d45ea4ffc95f15037f361b56ad6b89f8451b70ad1ff7a03b7bb0345b8e2227c.jpg&quot; title=&quot;https://gs.smuglo.li/file/1d45ea4ffc95f15037f361b56ad6b89f8451b70ad1ff7a03b7bb0345b8e2227c.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/432344&lt;/a&gt;&lt;br /&gt; that's a lot of loli</content>
+  <link rel="alternate" type="text/html" href="https://gs.smuglo.li/notice/2065713"/>
+  <status_net notice_id="1932492"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:gs.smuglo.li,2017-04-27:noticeId=2065713:objectType=note" href="https://gs.smuglo.li/notice/2065713"></thr:in-reply-to>
+ <link rel="related" href="https://gs.smuglo.li/notice/2065713"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988113"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/988113" local_id="988113" ref="https://gs.smuglo.li/conversation/927673">https://gs.smuglo.li/conversation/927673</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932922.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932922.atom"/>
+ <statusnet:notice_info local_id="1932922" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-27:fave:29191:note:1932559:2017-04-27T17:12:46+00:00</id>
+ <title>Favorite</title>
+ <content type="html">shp favorited something by gsimg: &lt;a href=&quot;https://gs.kawa-kun.com/file/3435c5cafda46f31cad5abb5837b3521b7b458198507073a496f4d10bad3633b.jpg&quot; title=&quot;https://gs.kawa-kun.com/file/3435c5cafda46f31cad5abb5837b3521b7b458198507073a496f4d10bad3633b.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.kawa-kun.com/file/3435c5cafda46f31cad5abb5837b3521b7b458198507073a496f4d10bad3633b.jpg&lt;/a&gt; #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://gs.kawa-kun.com/tag/nsfw&quot; rel=&quot;tag&quot;&gt;nsfw&lt;/a&gt;&lt;/span&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1932894"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-04-27T17:12:46+00:00</published>
+ <updated>2017-04-27T17:12:46+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+  <id>tag:gs.kawa-kun.com,2017-04-27:noticeId=1608309:objectType=note</id>
+  <title>New note by gsimg</title>
+  <content type="html">&lt;a href=&quot;https://gs.kawa-kun.com/file/3435c5cafda46f31cad5abb5837b3521b7b458198507073a496f4d10bad3633b.jpg&quot; title=&quot;https://gs.kawa-kun.com/file/3435c5cafda46f31cad5abb5837b3521b7b458198507073a496f4d10bad3633b.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.kawa-kun.com/file/3435c5cafda46f31cad5abb5837b3521b7b458198507073a496f4d10bad3633b.jpg&lt;/a&gt; #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://gs.kawa-kun.com/tag/nsfw&quot; rel=&quot;tag&quot;&gt;nsfw&lt;/a&gt;&lt;/span&gt;</content>
+  <link rel="alternate" type="text/html" href="https://gs.kawa-kun.com/notice/1608309"/>
+  <status_net notice_id="1932559"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:gs.kawa-kun.com,2017-04-27:noticeId=1608309:objectType=note" href="https://gs.kawa-kun.com/notice/1608309"></thr:in-reply-to>
+ <link rel="related" href="https://gs.kawa-kun.com/notice/1608309"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988157"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/988157" local_id="988157" ref="https://gs.kawa-kun.com/conversation/690817">https://gs.kawa-kun.com/conversation/690817</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932894.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932894.atom"/>
+ <statusnet:notice_info local_id="1932894" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-27:fave:29191:note:1932601:2017-04-27T17:12:28+00:00</id>
+ <title>Favorite</title>
+ <content type="html">shp favorited something by zemichi: &lt;a href=&quot;https://gs.smuglo.li/file/5d9114fafea7b9866c9d852bcfeaf66aade65ae26149758346bc5ade7e3fa8f0.jpg&quot; title=&quot;https://gs.smuglo.li/file/5d9114fafea7b9866c9d852bcfeaf66aade65ae26149758346bc5ade7e3fa8f0.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/432372&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1932888"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-04-27T17:12:28+00:00</published>
+ <updated>2017-04-27T17:12:28+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+  <id>tag:gs.smuglo.li,2017-04-27:noticeId=2065821:objectType=note</id>
+  <title>New note by zemichi</title>
+  <content type="html">&lt;a href=&quot;https://gs.smuglo.li/file/5d9114fafea7b9866c9d852bcfeaf66aade65ae26149758346bc5ade7e3fa8f0.jpg&quot; title=&quot;https://gs.smuglo.li/file/5d9114fafea7b9866c9d852bcfeaf66aade65ae26149758346bc5ade7e3fa8f0.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://gs.smuglo.li/attachment/432372&lt;/a&gt;</content>
+  <link rel="alternate" type="text/html" href="https://gs.smuglo.li/notice/2065821"/>
+  <status_net notice_id="1932601"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:gs.smuglo.li,2017-04-27:noticeId=2065821:objectType=note" href="https://gs.smuglo.li/notice/2065821"></thr:in-reply-to>
+ <link rel="related" href="https://gs.smuglo.li/notice/2065821"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988189"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/988189" local_id="988189" ref="https://gs.smuglo.li/conversation/927760">https://gs.smuglo.li/conversation/927760</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932888.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932888.atom"/>
+ <statusnet:notice_info local_id="1932888" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-27:noticeId=1932867:objectType=note</id>
+ <title>shp repeated a notice by shpbot</title>
+ <content type="html">RT @&lt;a href=&quot;https://gs.archae.me/user/4687&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;shpbot&quot;&gt;shpbot&lt;/a&gt; &lt;a href=&quot;https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg&quot; title=&quot;https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-237676&quot;&gt;https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg&lt;/a&gt; #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/tag/2hu&quot; rel=&quot;tag&quot;&gt;2hu&lt;/a&gt;&lt;/span&gt; #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/tag/ordinarymagician&quot; rel=&quot;tag&quot;&gt;ordinarymagician&lt;/a&gt;&lt;/span&gt; :thinking: &lt;a href=&quot;https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg&quot; title=&quot;https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-312306&quot;&gt;https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1932867"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+ <published>2017-04-27T17:11:35+00:00</published>
+ <updated>2017-04-27T17:11:35+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+  <id>tag:gs.archae.me,2017-04-27:noticeId=760830:objectType=note</id>
+  <title></title>
+  <content type="html">&lt;a href=&quot;https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg&quot; title=&quot;https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg&lt;/a&gt; #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://gs.archae.me/tag/2hu&quot; rel=&quot;tag&quot;&gt;2hu&lt;/a&gt;&lt;/span&gt; #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://gs.archae.me/tag/ordinarymagician&quot; rel=&quot;tag&quot;&gt;ordinarymagician&lt;/a&gt;&lt;/span&gt; :thinking: &lt;a href=&quot;https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg&quot; title=&quot;https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg&lt;/a&gt;</content>
+  <link rel="alternate" type="text/html" href="https://gs.archae.me/notice/760830"/>
+  <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+  <published>2017-04-27T17:00:08+00:00</published>
+  <updated>2017-04-27T17:00:08+00:00</updated>
+  <author>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+   <uri>https://gs.archae.me/user/4687</uri>
+   <name>shpbot</name>
+   <link rel="alternate" type="text/html" href="https://gs.archae.me/shpbot"/>
+   <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/31581-original-20170405170019.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/31581-original-20170405170019.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/31581-48-20170405170027.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/31581-24-20170405170342.jpeg"/>
+   <poco:preferredUsername>shpbot</poco:preferredUsername>
+   <poco:displayName>shpbot</poco:displayName>
+   <statusnet:profile_info local_id="31581"></statusnet:profile_info>
+  </author>
+  <activity:object>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+   <id>tag:gs.archae.me,2017-04-27:noticeId=760830:objectType=note</id>
+   <title>New note by shpbot</title>
+   <content type="html">&lt;a href=&quot;https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg&quot; title=&quot;https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg&lt;/a&gt; #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://gs.archae.me/tag/2hu&quot; rel=&quot;tag&quot;&gt;2hu&lt;/a&gt;&lt;/span&gt; #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://gs.archae.me/tag/ordinarymagician&quot; rel=&quot;tag&quot;&gt;ordinarymagician&lt;/a&gt;&lt;/span&gt; :thinking: &lt;a href=&quot;https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg&quot; title=&quot;https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg&lt;/a&gt;</content>
+   <link rel="alternate" type="text/html" href="https://gs.archae.me/notice/760830"/>
+   <status_net notice_id="1932673"></status_net>
+  </activity:object>
+  <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988229"/>
+  <ostatus:conversation href="https://social.heldscal.la/conversation/988229" local_id="988229" ref="https://gs.archae.me/conversation/318317">https://gs.archae.me/conversation/318317</ostatus:conversation>
+  <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+  <category term="2hu"></category>
+  <category term="ordinarymagician"></category>
+  <source>
+   <id>https://gs.archae.me/api/statuses/user_timeline/4687.atom</id>
+   <title>shpbot</title>
+   <link rel="alternate" type="text/html" href="https://gs.archae.me/shpbot"/>
+   <link rel="self" type="application/atom+xml" href="https://gs.archae.me/api/statuses/user_timeline/4687.atom"/>
+   <icon>https://social.heldscal.la/avatar/31581-original-20170405170019.jpeg</icon>
+   <updated>2017-05-05T11:45:08+00:00</updated>
+  </source>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988229"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/988229" local_id="988229" ref="https://gs.archae.me/conversation/318317">https://gs.archae.me/conversation/318317</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932867.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932867.atom"/>
+ <statusnet:notice_info local_id="1932867" source="api" repeat_of="1932673"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:social.heldscal.la,2017-04-27:noticeId=1932815:objectType=note</id>
+ <title>New note by shp</title>
+ <content type="html">federation issues with SPC atm it seems</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1932815"/>
+ <status_net notice_id="1932815"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-27T17:08:55+00:00</published>
+ <updated>2017-04-27T17:08:55+00:00</updated>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/988321"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/988321" local_id="988321" ref="tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=645a13c841f51769">tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=645a13c841f51769</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932815.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1932815.atom"/>
+ <statusnet:notice_info local_id="1932815" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-26:fave:29191:note:1907285:2017-04-26T06:59:07+00:00</id>
+ <title>Favorite</title>
+ <content type="html">shp favorited something by lambadalambda: Is this the most offensive video on the net? &lt;a href=&quot;https://social.heldscal.la/file/4c34bfb81a8155c265031bc48f7e69c29eb0d2941c57daf63f80e17b0e2e5f47.webm&quot; title=&quot;https://social.heldscal.la/file/4c34bfb81a8155c265031bc48f7e69c29eb0d2941c57daf63f80e17b0e2e5f47.webm&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://social.heldscal.la/attachment/402251&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1907959"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-04-26T06:59:07+00:00</published>
+ <updated>2017-04-26T06:59:07+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+  <id>tag:social.heldscal.la,2017-04-26:noticeId=1907285:objectType=note</id>
+  <title>New note by lambadalambda</title>
+  <content type="html">Is this the most offensive video on the net? &lt;a href=&quot;https://social.heldscal.la/file/4c34bfb81a8155c265031bc48f7e69c29eb0d2941c57daf63f80e17b0e2e5f47.webm&quot; title=&quot;https://social.heldscal.la/file/4c34bfb81a8155c265031bc48f7e69c29eb0d2941c57daf63f80e17b0e2e5f47.webm&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-402251&quot;&gt;https://social.heldscal.la/attachment/402251&lt;/a&gt;</content>
+  <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1907285"/>
+  <status_net notice_id="1907285"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:social.heldscal.la,2017-04-26:noticeId=1907285:objectType=note" href="https://social.heldscal.la/notice/1907285"></thr:in-reply-to>
+ <link rel="related" href="https://social.heldscal.la/notice/1907285"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/972605"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/972605" local_id="972605" ref="tag:social.heldscal.la,2017-04-26:objectType=thread:nonce=07b02e1328f456af">tag:social.heldscal.la,2017-04-26:objectType=thread:nonce=07b02e1328f456af</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1907959.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1907959.atom"/>
+ <statusnet:notice_info local_id="1907959" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-26:noticeId=1907951:objectType=note</id>
+ <title>shp repeated a notice by shpbot</title>
+ <content type="html">RT @&lt;a href=&quot;https://gs.archae.me/user/4687&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;shpbot&quot;&gt;shpbot&lt;/a&gt; &lt;a href=&quot;https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg&quot; title=&quot;https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-346198&quot;&gt;https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1907951"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+ <published>2017-04-26T06:58:19+00:00</published>
+ <updated>2017-04-26T06:58:19+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+  <id>tag:gs.archae.me,2017-04-26:noticeId=752596:objectType=note</id>
+  <title></title>
+  <content type="html">&lt;a href=&quot;https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg&quot; title=&quot;https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg&lt;/a&gt;</content>
+  <link rel="alternate" type="text/html" href="https://gs.archae.me/notice/752596"/>
+  <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+  <published>2017-04-26T06:15:07+00:00</published>
+  <updated>2017-04-26T06:15:07+00:00</updated>
+  <author>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+   <uri>https://gs.archae.me/user/4687</uri>
+   <name>shpbot</name>
+   <link rel="alternate" type="text/html" href="https://gs.archae.me/shpbot"/>
+   <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/31581-original-20170405170019.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/31581-original-20170405170019.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/31581-48-20170405170027.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/31581-24-20170405170342.jpeg"/>
+   <poco:preferredUsername>shpbot</poco:preferredUsername>
+   <poco:displayName>shpbot</poco:displayName>
+   <statusnet:profile_info local_id="31581"></statusnet:profile_info>
+  </author>
+  <activity:object>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+   <id>tag:gs.archae.me,2017-04-26:noticeId=752596:objectType=note</id>
+   <title>New note by shpbot</title>
+   <content type="html">&lt;a href=&quot;https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg&quot; title=&quot;https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg&lt;/a&gt;</content>
+   <link rel="alternate" type="text/html" href="https://gs.archae.me/notice/752596"/>
+   <status_net notice_id="1907331"></status_net>
+  </activity:object>
+  <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/972636"/>
+  <ostatus:conversation href="https://social.heldscal.la/conversation/972636" local_id="972636" ref="https://gs.archae.me/conversation/314010">https://gs.archae.me/conversation/314010</ostatus:conversation>
+  <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+  <source>
+   <id>https://gs.archae.me/api/statuses/user_timeline/4687.atom</id>
+   <title>shpbot</title>
+   <link rel="alternate" type="text/html" href="https://gs.archae.me/shpbot"/>
+   <link rel="self" type="application/atom+xml" href="https://gs.archae.me/api/statuses/user_timeline/4687.atom"/>
+   <icon>https://social.heldscal.la/avatar/31581-original-20170405170019.jpeg</icon>
+   <updated>2017-05-05T11:45:08+00:00</updated>
+  </source>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/972636"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/972636" local_id="972636" ref="https://gs.archae.me/conversation/314010">https://gs.archae.me/conversation/314010</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1907951.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1907951.atom"/>
+ <statusnet:notice_info local_id="1907951" source="api" repeat_of="1907331"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-26:fave:29191:note:1907341:2017-04-26T06:58:16+00:00</id>
+ <title>Favorite</title>
+ <content type="html">shp favorited something by moonman: &lt;a href=&quot;https://shitposter.club/file/1377b0894e983599c11e739e406243cabed9f8af7961a2550ecaf97e32de8e60.jpg&quot; title=&quot;https://shitposter.club/file/1377b0894e983599c11e739e406243cabed9f8af7961a2550ecaf97e32de8e60.jpg&quot; class=&quot;attachment&quot; rel=&quot;nofollow&quot;&gt;https://shitposter.club/attachment/630989&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1907949"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-04-26T06:58:16+00:00</published>
+ <updated>2017-04-26T06:58:16+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+  <id>tag:shitposter.club,2017-04-26:noticeId=2681941:objectType=note</id>
+  <title>New note by moonman</title>
+  <content type="html">&lt;a href=&quot;https://shitposter.club/file/1377b0894e983599c11e739e406243cabed9f8af7961a2550ecaf97e32de8e60.jpg&quot; title=&quot;https://shitposter.club/file/1377b0894e983599c11e739e406243cabed9f8af7961a2550ecaf97e32de8e60.jpg&quot; class=&quot;attachment&quot; rel=&quot;nofollow&quot;&gt;https://shitposter.club/attachment/630989&lt;/a&gt;</content>
+  <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2681941"/>
+  <status_net notice_id="1907341"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:shitposter.club,2017-04-26:noticeId=2681941:objectType=note" href="https://shitposter.club/notice/2681941"></thr:in-reply-to>
+ <link rel="related" href="https://shitposter.club/notice/2681941"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/972646"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/972646" local_id="972646" ref="https://shitposter.club/conversation/1300990">https://shitposter.club/conversation/1300990</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1907949.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1907949.atom"/>
+ <statusnet:notice_info local_id="1907949" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:social.heldscal.la,2017-04-26:fave:29191:comment:1907412:2017-04-26T06:57:56+00:00</id>
+ <title>Favorite</title>
+ <content type="html">shp favorited something by lambadalambda: @&lt;a href=&quot;https://gs.smuglo.li/user/2&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;nepfag&quot;&gt;nepfag&lt;/a&gt; &lt;a href=&quot;https://cherubini.casa/why-i-shut-down-wizards-town-and-left-mastodon-6d4e631346b3?source=linkShare-89c2f851e979-1493184822&amp;amp;gi=a6a47c5466a0&quot; title=&quot;https://cherubini.casa/why-i-shut-down-wizards-town-and-left-mastodon-6d4e631346b3?source=linkShare-89c2f851e979-1493184822&amp;amp;gi=a6a47c5466a0&quot; rel=&quot;nofollow noreferrer&quot; class=&quot;attachment&quot;&gt;https://social.heldscal.la/url/402273&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1907947"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+ <published>2017-04-26T06:57:56+00:00</published>
+ <updated>2017-04-26T06:57:56+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <id>tag:social.heldscal.la,2017-04-26:noticeId=1907412:objectType=comment</id>
+  <title>New comment by lambadalambda</title>
+  <content type="html">@&lt;a href=&quot;https://gs.smuglo.li/user/2&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;nepfag&quot;&gt;nepfag&lt;/a&gt; &lt;a href=&quot;https://cherubini.casa/why-i-shut-down-wizards-town-and-left-mastodon-6d4e631346b3?source=linkShare-89c2f851e979-1493184822&amp;amp;gi=a6a47c5466a0&quot; title=&quot;https://cherubini.casa/why-i-shut-down-wizards-town-and-left-mastodon-6d4e631346b3?source=linkShare-89c2f851e979-1493184822&amp;amp;gi=a6a47c5466a0&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-402273&quot;&gt;https://social.heldscal.la/url/402273&lt;/a&gt;</content>
+  <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1907412"/>
+  <status_net notice_id="1907412"></status_net>
+ </activity:object>
+ <thr:in-reply-to ref="tag:social.heldscal.la,2017-04-26:noticeId=1907412:objectType=comment" href="https://social.heldscal.la/notice/1907412"></thr:in-reply-to>
+ <link rel="related" href="https://social.heldscal.la/notice/1907412"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/972634"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/972634" local_id="972634" ref="tag:social.heldscal.la,2017-04-26:objectType=thread:nonce=85c21eda7aaa7259">tag:social.heldscal.la,2017-04-26:objectType=thread:nonce=85c21eda7aaa7259</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1907947.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1907947.atom"/>
+ <statusnet:notice_info local_id="1907947" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:social.heldscal.la,2017-04-26:noticeId=1907942:objectType=note</id>
+ <title>New note by shp</title>
+ <content type="html">#&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;https://social.heldscal.la/tag/cofe&quot; rel=&quot;tag&quot;&gt;cofe&lt;/a&gt;&lt;/span&gt; time my friends &lt;a href=&quot;https://social.heldscal.la/file/ec254b45b3a86ff74bc08bc7e065cb681d77cf7d4cedc9cdcf59e16adf311da3.png&quot; title=&quot;https://social.heldscal.la/file/ec254b45b3a86ff74bc08bc7e065cb681d77cf7d4cedc9cdcf59e16adf311da3.png&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-402381&quot;&gt;https://social.heldscal.la/attachment/402381&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1907942"/>
+ <status_net notice_id="1907942"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-26T06:57:18+00:00</published>
+ <updated>2017-04-26T06:57:18+00:00</updated>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/973042"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/973042" local_id="973042" ref="tag:social.heldscal.la,2017-04-26:objectType=thread:nonce=9c9d9373bccfaf70">tag:social.heldscal.la,2017-04-26:objectType=thread:nonce=9c9d9373bccfaf70</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <category term="cofe"></category>
+ <link rel="enclosure" href="https://social.heldscal.la/file/ec254b45b3a86ff74bc08bc7e065cb681d77cf7d4cedc9cdcf59e16adf311da3.png" type="image/png" length="3179103"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1907942.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1907942.atom"/>
+ <statusnet:notice_info local_id="1907942" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+</feed>
diff --git a/test/fixtures/httpoison_mock/https___social.heldscal.la_user_23211.xml b/test/fixtures/httpoison_mock/https___social.heldscal.la_user_23211.xml
new file mode 100644 (file)
index 0000000..426a529
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
+ <Subject>https://social.heldscal.la/user/23211</Subject>
+ <Alias>acct:lambadalambda@social.heldscal.la</Alias>
+ <Alias>https://social.heldscal.la/lambadalambda</Alias>
+ <Alias>https://social.heldscal.la/index.php/user/23211</Alias>
+ <Alias>https://social.heldscal.la/index.php/lambadalambda</Alias>
+ <Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+ <Link rel="http://gmpg.org/xfn/11" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+ <Link rel="describedby" type="application/rdf+xml" href="https://social.heldscal.la/lambadalambda/foaf"/>
+ <Link rel="http://apinamespace.org/atom" type="application/atomsvc+xml" href="https://social.heldscal.la/api/statusnet/app/service/lambadalambda.xml"/>
+ <Link rel="http://apinamespace.org/twitter" href="https://social.heldscal.la/api/"/>
+ <Link rel="http://specs.openid.net/auth/2.0/provider" href="https://social.heldscal.la/lambadalambda"/>
+ <Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/user_timeline/23211.atom"/>
+ <Link rel="magic-public-key" href="data:application/magic-public-key,RSA.uzg6r1peZU0vXGADWxGJ0PE34WvmhjUmydbX5YYdOiXfODVLwCMi1umGoqUDm-mRu4vNEdFBVJU1CpFA7dKzWgIsqsa501i2XqElmEveXRLvNRWFB6nG03Q5OUY2as8eE54BJm0p20GkMfIJGwP6TSFb-ICp3QjzbatuSPJ6xCE=.AQAB"/>
+ <Link rel="salmon" href="https://social.heldscal.la/main/salmon/user/23211"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-replies" href="https://social.heldscal.la/main/salmon/user/23211"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-mention" href="https://social.heldscal.la/main/salmon/user/23211"/>
+ <Link rel="http://ostatus.org/schema/1.0/subscribe" template="https://social.heldscal.la/main/ostatussub?profile={uri}"/>
+</XRD>
diff --git a/test/fixtures/httpoison_mock/https___social.heldscal.la_user_29191.xml b/test/fixtures/httpoison_mock/https___social.heldscal.la_user_29191.xml
new file mode 100644 (file)
index 0000000..6411033
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
+ <Subject>https://social.heldscal.la/user/29191</Subject>
+ <Alias>acct:shp@social.heldscal.la</Alias>
+ <Alias>https://social.heldscal.la/shp</Alias>
+ <Alias>https://social.heldscal.la/index.php/user/29191</Alias>
+ <Alias>https://social.heldscal.la/index.php/shp</Alias>
+ <Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="https://social.heldscal.la/shp"/>
+ <Link rel="http://gmpg.org/xfn/11" type="text/html" href="https://social.heldscal.la/shp"/>
+ <Link rel="describedby" type="application/rdf+xml" href="https://social.heldscal.la/shp/foaf"/>
+ <Link rel="http://apinamespace.org/atom" type="application/atomsvc+xml" href="https://social.heldscal.la/api/statusnet/app/service/shp.xml"/>
+ <Link rel="http://apinamespace.org/twitter" href="https://social.heldscal.la/api/"/>
+ <Link rel="http://specs.openid.net/auth/2.0/provider" href="https://social.heldscal.la/shp"/>
+ <Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/user_timeline/29191.atom"/>
+ <Link rel="magic-public-key" href="data:application/magic-public-key,RSA.wQ3i9UA0qmAxZ0WTIp4a-waZn_17Ez1pEEmqmqoooRsG1_BvpmOvLN0G2tEcWWxl2KOtdQMCiPptmQObeZeuj48mdsDZ4ArQinexY2hCCTcbV8Xpswpkb8K05RcKipdg07pnI7tAgQ0VWSZDImncL6YUGlG5YN8b5TjGOwk2VG8=.AQAB"/>
+ <Link rel="salmon" href="https://social.heldscal.la/main/salmon/user/29191"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-replies" href="https://social.heldscal.la/main/salmon/user/29191"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-mention" href="https://social.heldscal.la/main/salmon/user/29191"/>
+ <Link rel="http://ostatus.org/schema/1.0/subscribe" template="https://social.heldscal.la/main/ostatussub?profile={uri}"/>
+</XRD>
diff --git a/test/fixtures/httpoison_mock/nonexistant@social.heldscal.la.xml b/test/fixtures/httpoison_mock/nonexistant@social.heldscal.la.xml
new file mode 100644 (file)
index 0000000..2a61de8
--- /dev/null
@@ -0,0 +1,90 @@
+<!DOCTYPE html
+PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+  <title>Internal Server Error - social.heldscal.la</title>
+  <link rel="shortcut icon" href="https://social.heldscal.la/theme/neo-gnu/favicon.ico"/>
+  <link rel="stylesheet" type="text/css" href="https://social.heldscal.la/theme/base/css/display.css?version=1.0.2-dev" media="screen, projection, tv, print"/>
+  <link rel="stylesheet" type="text/css" href="https://social.heldscal.la/theme/neo-gnu/css/display.css?version=1.0.2-dev" media="screen, projection, tv, print"/>
+  <link rel="stylesheet" type="text/css" href="https://social.heldscal.la/modules/Oembed/css/oembed.css" media=""/>
+  <link rel="stylesheet" type="text/css" href="https://social.heldscal.la/modules/OStatus/theme/base/css/ostatus.css" media=""/>
+  <link rel="stylesheet" type="text/css" href="https://social.heldscal.la/media/js/extlib/jquery-ui/css/smoothness/jquery-ui.css?version=1.0.2-dev" media=""/>
+  <style type="text/css" media="">.greentext { color: green; }</style>
+  <link rel="stylesheet" type="text/css" href="https://social.heldscal.la/modules/Bookmark/css/bookmark.css" media=""/>
+  <link rel="stylesheet" type="text/css" href="https://social.heldscal.la/modules/Event/css/event.css" media=""/>
+  <link rel="stylesheet" type="text/css" href="https://social.heldscal.la/modules/Poll/css/poll.css" media=""/>
+  <link rel="search" type="application/opensearchdescription+xml" href="https://social.heldscal.la/opensearch/people" title="social.heldscal.la People Search"/>
+  <link rel="search" type="application/opensearchdescription+xml" href="https://social.heldscal.la/opensearch/notice" title="social.heldscal.la Notice Search"/>
+ </head>
+ <body id="error">
+  <div id="wrap">
+   <div id="header">
+    <address id="site_contact" class="h-card">
+     <a class="home bookmark" href="https://social.heldscal.la/main/public">
+      <img class="logo u-photo p-name" src="https://social.heldscal.la/theme/neo-gnu/logo.png" alt="social.heldscal.la"/>
+     </a>
+    </address>
+    <div id="site_nav_global_primary">
+     <form id="header-search" class="form" method="get" action="https://social.heldscal.la/search/notice">
+      <fieldset>
+       <input name="q" size="20" id="search-q"/>
+       <input type="submit" value="Search"/>
+      </fieldset>
+     </form>
+     <ul class="nav">
+      <li id="top_nav_doc_faq">
+       <a href="https://social.heldscal.la/doc/faq" title="Frequently asked questions">FAQ</a>
+      </li>
+      <li id="nav_login">
+       <a href="https://social.heldscal.la/main/login" title="Login to the site.">Login</a>
+      </li>
+     </ul>
+    </div>
+   </div>
+   <div id="core">
+    <div id="aside_primary_wrapper">
+     <div id="content_wrapper">
+      <div id="site_nav_local_views_wrapper">
+       <div id="content">
+        <h1>Internal Server Error</h1>
+        <div id="content_inner">
+         <div class="error">No such user found.</div>
+        </div>
+       </div>
+      </div>
+     </div>
+    </div>
+   </div>
+   <div id="footer">
+    <ul class="nav" id="site_nav_global_secondary">
+     <li>
+      <a href="https://social.heldscal.la/doc/help">Help</a>
+     </li>
+     <li>
+      <a href="https://social.heldscal.la/doc/about">About</a>
+     </li>
+     <li>
+      <a href="https://social.heldscal.la/doc/faq">FAQ</a>
+     </li>
+     <li>
+      <a href="https://social.heldscal.la/doc/privacy">Privacy</a>
+     </li>
+     <li>
+      <a href="https://social.heldscal.la/doc/source">Source</a>
+     </li>
+     <li>
+      <a href="https://social.heldscal.la/main/version">Version</a>
+     </li>
+     <li>
+      <a href="https://social.heldscal.la/doc/contact">Contact</a>
+     </li>
+    </ul>
+<p><strong>social.heldscal.la</strong> is a social network. It runs on <a href="https://www.postactiv.com/">postActiv</a>, version 1.0.2-dev, available under the <a href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">GNU Affero General Public License</a>.</p>
+    <p>
+     <img id="license_cc" src="/theme/licenses/cc_by_3.0_80x15.png" alt="Creative Commons Attribution 3.0" width="80" height="15"/>
+ All social.heldscal.la content and data are available under the <a class="license" rel="external license" href="https://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.</p>
+   </div>
+  </div>
+ </body>
+<!-- 25ms --></html>
diff --git a/test/fixtures/httpoison_mock/shp@social.heldscal.la.xml b/test/fixtures/httpoison_mock/shp@social.heldscal.la.xml
new file mode 100644 (file)
index 0000000..4cde42e
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
+ <Subject>acct:shp@social.heldscal.la</Subject>
+ <Alias>https://social.heldscal.la/user/29191</Alias>
+ <Alias>https://social.heldscal.la/shp</Alias>
+ <Alias>https://social.heldscal.la/index.php/user/29191</Alias>
+ <Alias>https://social.heldscal.la/index.php/shp</Alias>
+ <Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="https://social.heldscal.la/shp"/>
+ <Link rel="http://gmpg.org/xfn/11" type="text/html" href="https://social.heldscal.la/shp"/>
+ <Link rel="describedby" type="application/rdf+xml" href="https://social.heldscal.la/shp/foaf"/>
+ <Link rel="http://apinamespace.org/atom" type="application/atomsvc+xml" href="https://social.heldscal.la/api/statusnet/app/service/shp.xml"/>
+ <Link rel="http://apinamespace.org/twitter" href="https://social.heldscal.la/api/"/>
+ <Link rel="http://specs.openid.net/auth/2.0/provider" href="https://social.heldscal.la/shp"/>
+ <Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/user_timeline/29191.atom"/>
+ <Link rel="magic-public-key" href="data:application/magic-public-key,RSA.wQ3i9UA0qmAxZ0WTIp4a-waZn_17Ez1pEEmqmqoooRsG1_BvpmOvLN0G2tEcWWxl2KOtdQMCiPptmQObeZeuj48mdsDZ4ArQinexY2hCCTcbV8Xpswpkb8K05RcKipdg07pnI7tAgQ0VWSZDImncL6YUGlG5YN8b5TjGOwk2VG8=.AQAB"/>
+ <Link rel="salmon" href="https://social.heldscal.la/main/salmon/user/29191"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-replies" href="https://social.heldscal.la/main/salmon/user/29191"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-mention" href="https://social.heldscal.la/main/salmon/user/29191"/>
+ <Link rel="http://ostatus.org/schema/1.0/subscribe" template="https://social.heldscal.la/main/ostatussub?profile={uri}"/>
+</XRD>
diff --git a/test/fixtures/incoming_note_activity.xml b/test/fixtures/incoming_note_activity.xml
new file mode 100644 (file)
index 0000000..e54b25e
--- /dev/null
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" ?><entry xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:media="http://purl.org/syndication/atommedia" xmlns:statusnet="http://status.net/schema/api/1/">
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-23:noticeId=29:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">@&lt;a href=&quot;http://pleroma.example.org:4000/users/lain3&quot; class=&quot;h-card mention&quot;&gt;lain3&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org:4040/index.php/notice/29"/>
+ <status_net notice_id="29"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-23T14:51:03+00:00</published>
+ <updated>2017-04-23T14:51:03+00:00</updated>
+ <author>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <uri>http://gs.example.org:4040/index.php/user/1</uri>
+  <name>lambda</name>
+  <link rel="alternate" type="text/html" href="http://gs.example.org:4040/index.php/lambda"/>
+  <link rel="avatar" type="image/png" media:width="96" media:height="96" href="http://gs.example.org:4040/theme/neo-gnu/default-avatar-profile.png"/>
+  <link rel="avatar" type="image/png" media:width="48" media:height="48" href="http://gs.example.org:4040/theme/neo-gnu/default-avatar-stream.png"/>
+  <link rel="avatar" type="image/png" media:width="24" media:height="24" href="http://gs.example.org:4040/theme/neo-gnu/default-avatar-mini.png"/>
+  <poco:preferredUsername>lambda</poco:preferredUsername>
+  <poco:displayName>lambda</poco:displayName>
+  <followers url="http://gs.example.org:4040/index.php/lambda/subscribers"></followers>
+  <statusnet:profile_info local_id="1"></statusnet:profile_info>
+ </author>
+ <link rel="ostatus:conversation" href="tag:gs.example.org:4040,2017-04-23:objectType=thread:nonce=f09e22f58abd5c7b"/>
+ <ostatus:conversation>tag:gs.example.org:4040,2017-04-23:objectType=thread:nonce=f09e22f58abd5c7b</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain3"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <source>
+  <id>http://gs.example.org:4040/index.php/api/statuses/user_timeline/1.atom</id>
+  <title>lambda</title>
+  <link rel="alternate" type="text/html" href="http://gs.example.org:4040/index.php/lambda"/>
+  <link rel="self" type="application/atom+xml" href="http://gs.example.org:4040/index.php/api/statuses/user_timeline/1.atom"/>
+  <link rel="license" href="https://creativecommons.org/licenses/by/3.0/"/>
+  <icon>http://gs.example.org:4040/theme/neo-gnu/default-avatar-profile.png</icon>
+  <updated>2017-04-23T14:51:03+00:00</updated>
+ </source>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org:4040/index.php/api/statuses/show/29.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org:4040/index.php/api/statuses/show/29.atom"/>
+ <statusnet:notice_info local_id="29" source="web"></statusnet:notice_info>
+</entry>
diff --git a/test/fixtures/incoming_note_activity_answer.xml b/test/fixtures/incoming_note_activity_answer.xml
new file mode 100644 (file)
index 0000000..b1244fa
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" ?><entry xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:media="http://purl.org/syndication/atommedia" xmlns:statusnet="http://status.net/schema/api/1/">
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:gs.example.org:4040,2017-04-25:noticeId=55:objectType=note</id>
+ <title>New note by lambda</title>
+ <content type="html">hey.</content>
+ <link rel="alternate" type="text/html" href="http://gs.example.org:4040/index.php/notice/55"/>
+ <status_net notice_id="55"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-25T18:16:13+00:00</published>
+ <updated>2017-04-25T18:16:13+00:00</updated>
+ <author>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <uri>http://gs.example.org:4040/index.php/user/1</uri>
+  <name>lambda</name>
+  <link rel="alternate" type="text/html" href="http://gs.example.org:4040/index.php/lambda"/>
+  <link rel="avatar" type="image/png" media:width="96" media:height="96" href="http://gs.example.org:4040/theme/neo-gnu/default-avatar-profile.png"/>
+  <link rel="avatar" type="image/png" media:width="48" media:height="48" href="http://gs.example.org:4040/theme/neo-gnu/default-avatar-stream.png"/>
+  <link rel="avatar" type="image/png" media:width="24" media:height="24" href="http://gs.example.org:4040/theme/neo-gnu/default-avatar-mini.png"/>
+  <poco:preferredUsername>lambda</poco:preferredUsername>
+  <poco:displayName>lambda</poco:displayName>
+  <followers url="http://gs.example.org:4040/index.php/lambda/subscribers"></followers>
+  <statusnet:profile_info local_id="1"></statusnet:profile_info>
+ </author>
+ <thr:in-reply-to ref="http://pleroma.example.org:4000/objects/55bce8fc-b423-46b1-af71-3759ab4670bc" href="http://pleroma.example.org:4000/objects/55bce8fc-b423-46b1-af71-3759ab4670bc"></thr:in-reply-to>
+ <link rel="related" href="http://pleroma.example.org:4000/objects/55bce8fc-b423-46b1-af71-3759ab4670bc"/>
+ <link rel="ostatus:conversation" href="http://pleroma.example.org:4000/contexts/8f6f45d4-8e4d-4e1a-a2de-09f27367d2d0"/>
+ <ostatus:conversation>http://pleroma.example.org:4000/contexts/8f6f45d4-8e4d-4e1a-a2de-09f27367d2d0</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="http://pleroma.example.org:4000/users/lain5"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <source>
+  <id>http://gs.example.org:4040/index.php/api/statuses/user_timeline/1.atom</id>
+  <title>lambda</title>
+  <link rel="alternate" type="text/html" href="http://gs.example.org:4040/index.php/lambda"/>
+  <link rel="self" type="application/atom+xml" href="http://gs.example.org:4040/index.php/api/statuses/user_timeline/1.atom"/>
+  <link rel="license" href="https://creativecommons.org/licenses/by/3.0/"/>
+  <icon>http://gs.example.org:4040/theme/neo-gnu/default-avatar-profile.png</icon>
+  <updated>2017-04-25T18:16:13+00:00</updated>
+ </source>
+ <link rel="self" type="application/atom+xml" href="http://gs.example.org:4040/index.php/api/statuses/show/55.atom"/>
+ <link rel="edit" type="application/atom+xml" href="http://gs.example.org:4040/index.php/api/statuses/show/55.atom"/>
+ <statusnet:notice_info local_id="55" source="web"></statusnet:notice_info>
+</entry>
diff --git a/test/fixtures/incoming_reply_mastodon.xml b/test/fixtures/incoming_reply_mastodon.xml
new file mode 100644 (file)
index 0000000..8ee1186
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<entry xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:media="http://purl.org/syndication/atommedia" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:mastodon="http://mastodon.social/schema/1.0">
+  <id>tag:mastodon.social,2017-05-02:objectId=4901603:objectType=Status</id>
+  <published>2017-05-02T18:33:06Z</published>
+  <updated>2017-05-02T18:33:06Z</updated>
+  <title>New status by lambadalambda</title>
+  <author>
+    <id>https://mastodon.social/users/lambadalambda</id>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+    <uri>https://mastodon.social/users/lambadalambda</uri>
+    <name>lambadalambda</name>
+    <email>lambadalambda@mastodon.social</email>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/@lambadalambda"/>
+    <link rel="avatar" type="image/gif" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif"/>
+    <link rel="header" type="" media:width="700" media:height="335" href="/headers/original/missing.png"/>
+    <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+    <poco:displayName>Critical Value</poco:displayName>
+    <mastodon:scope>public</mastodon:scope>
+  </author>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+  <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+  <content type="html" xml:lang="el">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://pleroma.soykaf.com/users/lain" class="u-url mention"&gt;@&lt;span&gt;lain&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; hey&lt;/p&gt;</content>
+  <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/lain"/>
+  <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+  <mastodon:scope>public</mastodon:scope>
+  <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2224923"/>
+  <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2224923.atom"/>
+  <thr:in-reply-to ref="https://pleroma.soykaf.com/objects/c237d966-ac75-4fe3-a87a-d89d71a3a7a4" href=""/>
+</entry>
diff --git a/test/fixtures/incoming_websub_gnusocial_attachments.xml b/test/fixtures/incoming_websub_gnusocial_attachments.xml
new file mode 100644 (file)
index 0000000..9d331ef
--- /dev/null
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
+ <generator uri="https://gnu.io/social" version="1.0.2-dev">GNU social</generator>
+ <id>https://social.heldscal.la/api/statuses/user_timeline/23211.atom</id>
+ <title>lambadalambda timeline</title>
+ <subtitle>Updates from lambadalambda on social.heldscal.la!</subtitle>
+ <logo>https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg</logo>
+ <updated>2017-05-02T20:29:35+00:00</updated>
+<author>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <uri>https://social.heldscal.la/user/23211</uri>
+ <name>lambadalambda</name>
+ <summary>Call me Deacon Blues.</summary>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+ <link rel="avatar" type="image/jpeg" media:width="236" media:height="236" href="https://social.heldscal.la/avatar/23211-original-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/23211-48-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/23211-24-20170416114257.jpeg"/>
+ <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+ <poco:displayName>Constance Variable</poco:displayName>
+ <poco:note>Call me Deacon Blues.</poco:note>
+ <poco:address>
+  <poco:formatted>Berlin</poco:formatted>
+ </poco:address>
+ <poco:urls>
+  <poco:type>homepage</poco:type>
+  <poco:value>https://heldscal.la</poco:value>
+  <poco:primary>true</poco:primary>
+ </poco:urls>
+ <followers url="https://social.heldscal.la/lambadalambda/subscribers"></followers>
+ <statusnet:profile_info local_id="23211"></statusnet:profile_info>
+</author>
+ <link href="https://social.heldscal.la/lambadalambda" rel="alternate" type="text/html"/>
+ <link href="https://social.heldscal.la/main/sup" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="https://social.heldscal.la/main/push/hub" rel="hub"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="salmon"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="https://social.heldscal.la/api/statuses/user_timeline/23211.atom" rel="self" type="application/atom+xml"/>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:social.heldscal.la,2017-05-02:noticeId=2020923:objectType=note</id>
+ <title>New note by lambadalambda</title>
+ <content type="html">Okay gonna stream some cool games!! &lt;a href=&quot;https://social.heldscal.la/file/7ed5ee508e6376a6e3dd581e17e7ed0b7b638147c7e86784bf83abc2641ee3d4.gif&quot; title=&quot;https://social.heldscal.la/file/7ed5ee508e6376a6e3dd581e17e7ed0b7b638147c7e86784bf83abc2641ee3d4.gif&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-423842&quot;&gt;https://social.heldscal.la/attachment/423842&lt;/a&gt; &lt;a href=&quot;https://social.heldscal.la/file/4c209099cadfc5afd3e27a334aa0db96b3a7510dde1603305d68a2707e59a11f.png&quot; title=&quot;https://social.heldscal.la/file/4c209099cadfc5afd3e27a334aa0db96b3a7510dde1603305d68a2707e59a11f.png&quot; rel=&quot;nofollow external noreferrer&quot; class=&quot;attachment&quot; id=&quot;attachment-423843&quot;&gt;https://social.heldscal.la/attachment/423843&lt;/a&gt;</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2020923"/>
+ <status_net notice_id="2020923"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-05-02T20:29:35+00:00</published>
+ <updated>2017-05-02T20:29:35+00:00</updated>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1038558"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1038558" local_id="1038558" ref="tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=26c7afdcbcf4ebd4">tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=26c7afdcbcf4ebd4</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="enclosure" href="https://social.heldscal.la/file/7ed5ee508e6376a6e3dd581e17e7ed0b7b638147c7e86784bf83abc2641ee3d4.gif" type="image/gif" length="17283"/>
+ <link rel="enclosure" href="https://social.heldscal.la/file/4c209099cadfc5afd3e27a334aa0db96b3a7510dde1603305d68a2707e59a11f.png" type="image/png" length="6965"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2020923.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2020923.atom"/>
+ <statusnet:notice_info local_id="2020923" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+</feed>
diff --git a/test/fixtures/lambadalambda.atom b/test/fixtures/lambadalambda.atom
new file mode 100644 (file)
index 0000000..35e5064
--- /dev/null
@@ -0,0 +1,479 @@
+<?xml version="1.0"?>
+<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:media="http://purl.org/syndication/atommedia" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:mastodon="http://mastodon.social/schema/1.0">
+  <id>https://mastodon.social/users/lambadalambda.atom</id>
+  <title>Critical Value</title>
+  <subtitle></subtitle>
+  <updated>2017-04-16T21:47:25Z</updated>
+  <logo>https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif?1492379244</logo>
+  <author>
+    <id>https://mastodon.social/users/lambadalambda</id>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+    <uri>https://mastodon.social/users/lambadalambda</uri>
+    <name>lambadalambda</name>
+    <email>lambadalambda@mastodon.social</email>
+    <summary></summary>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/@lambadalambda"/>
+    <link rel="avatar" type="image/gif" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif?1492379244"/>
+    <link rel="header" type="" media:width="700" media:height="335" href="/headers/original/missing.png"/>
+    <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+    <poco:displayName>Critical Value</poco:displayName>
+    <mastodon:scope>public</mastodon:scope>
+  </author>
+  <link rel="alternate" type="text/html" href="https://mastodon.social/@lambadalambda"/>
+  <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda.atom"/>
+  <link rel="next" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda.atom?max_id=1488609"/>
+  <link rel="hub" href="https://mastodon.social/api/push"/>
+  <link rel="salmon" href="https://mastodon.social/api/salmon/264"/>
+  <entry>
+    <id>tag:mastodon.social,2017-04-07:objectId=1874242:objectType=Status</id>
+    <published>2017-04-07T11:02:56Z</published>
+    <updated>2017-04-07T11:02:56Z</updated>
+    <title>lambadalambda shared a status by 0xroy@social.wxcafe.net</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+    <activity:object>
+      <id>tag:social.wxcafe.net,2017-04-07:objectId=72554:objectType=Status</id>
+      <published>2017-04-07T11:01:59Z</published>
+      <updated>2017-04-07T11:02:00Z</updated>
+      <title>New status by 0xroy@social.wxcafe.net</title>
+      <author>
+        <id>https://social.wxcafe.net/users/0xroy</id>
+        <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+        <uri>https://social.wxcafe.net/users/0xroy</uri>
+        <name>0xroy</name>
+        <email>0xroy@social.wxcafe.net</email>
+        <summary>ta caution weeb | discussions privées : &lt;a href="https://💌.0xroy.me" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;💌.0xroy.me&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;</summary>
+        <link rel="alternate" type="text/html" href="https://social.wxcafe.net/@0xroy"/>
+        <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/036/953/original/20068e41d0310172.jpg?1491240516"/>
+        <link rel="header" type="image/jpeg" media:width="700" media:height="335" href="https://files.mastodon.social/accounts/headers/000/036/953/original/2229d0e3f129fe8c.jpg?1491381114"/>
+        <poco:preferredUsername>0xroy</poco:preferredUsername>
+        <poco:displayName>「R O Y  🍵 B O S」</poco:displayName>
+        <poco:note>ta caution weeb | discussions privées : &lt;a href="https://%F0%9F%92%8C.0xroy.me" rel="nofollow noopener"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;💌.0xroy.me&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;</poco:note>
+        <mastodon:scope>public</mastodon:scope>
+      </author>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+      <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+      <content type="html" xml:lang="en">&lt;p&gt;someone pls eli5 matrix (protocol) and riot&lt;/p&gt;</content>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+      <mastodon:scope>public</mastodon:scope>
+      <link rel="alternate" type="text/html" href="https://social.wxcafe.net/users/0xroy/updates/4510"/>
+    </activity:object>
+    <content type="html" xml:lang="en">&lt;p&gt;someone pls eli5 matrix (protocol) and riot&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1689208"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1689208.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-06:objectId=1768247:objectType=Status</id>
+    <published>2017-04-06T11:10:19Z</published>
+    <updated>2017-04-06T11:10:19Z</updated>
+    <title>lambadalambda shared a status by areyoutoo@mastodon.xyz</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+    <activity:object>
+      <id>tag:mastodon.xyz,2017-04-05:objectId=133327:objectType=Status</id>
+      <published>2017-04-05T17:36:41Z</published>
+      <updated>2017-04-05T18:12:14Z</updated>
+      <title>New status by areyoutoo@mastodon.xyz</title>
+      <author>
+        <id>https://mastodon.xyz/users/areyoutoo</id>
+        <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+        <uri>https://mastodon.xyz/users/areyoutoo</uri>
+        <name>areyoutoo</name>
+        <email>areyoutoo@mastodon.xyz</email>
+        <summary>devops | retired gamedev | always boost puppy pics</summary>
+        <link rel="alternate" type="text/html" href="https://mastodon.xyz/@areyoutoo"/>
+        <link rel="avatar" type="image/png" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/047/888/original/5ce2e132d4c18d65.png?1491343828"/>
+        <link rel="header" type="image/png" media:width="700" media:height="335" href="https://files.mastodon.social/accounts/headers/000/047/888/original/missing.png?1491336769"/>
+        <poco:preferredUsername>areyoutoo</poco:preferredUsername>
+        <poco:displayName>Raw Butter</poco:displayName>
+        <poco:note>devops | retired gamedev | always boost puppy pics</poco:note>
+        <mastodon:scope>public</mastodon:scope>
+      </author>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+      <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+      <content type="html" xml:lang="en">&lt;p&gt;Some UX thoughts for &lt;a href="https://mastodon.xyz/tags/mastodev" class="mention hashtag"&gt;#&lt;span&gt;mastodev&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;- Would be nice if I could work on multiple draft toots? Clicking to reply to someone seems to erase any draft I had been working on.&lt;/p&gt;&lt;p&gt;- Kinda risky to click on the Federated Timeline if it loads new toots and scrolls 10ms before I click on something.&lt;/p&gt;&lt;p&gt;I probably don't know enough web frontend to help, but it might be fun to try.&lt;/p&gt;</content>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+      <category term="mastodev"/>
+      <mastodon:scope>public</mastodon:scope>
+      <link rel="alternate" type="text/html" href="https://mastodon.xyz/users/areyoutoo/updates/36028"/>
+    </activity:object>
+    <content type="html" xml:lang="en">&lt;p&gt;Some UX thoughts for &lt;a href="https://mastodon.xyz/tags/mastodev" class="mention hashtag"&gt;#&lt;span&gt;mastodev&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;- Would be nice if I could work on multiple draft toots? Clicking to reply to someone seems to erase any draft I had been working on.&lt;/p&gt;&lt;p&gt;- Kinda risky to click on the Federated Timeline if it loads new toots and scrolls 10ms before I click on something.&lt;/p&gt;&lt;p&gt;I probably don't know enough web frontend to help, but it might be fun to try.&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1658950"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1658950.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-06:objectId=1764509:objectType=Status</id>
+    <published>2017-04-06T10:15:38Z</published>
+    <updated>2017-04-06T10:15:38Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <summary xml:lang="en">This is a test for cw federation</summary>
+    <content type="html" xml:lang="en">&lt;p&gt;This is a test for cw federation body text.&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1657819"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1657819.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-05:objectId=1645208:objectType=Status</id>
+    <published>2017-04-05T07:14:53Z</published>
+    <updated>2017-04-05T07:14:53Z</updated>
+    <title>lambadalambda shared a status by lambadalambda@social.heldscal.la</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+    <activity:object>
+      <id>tag:social.heldscal.la,2017-04-05:noticeId=1502088:objectType=note</id>
+      <published>2017-04-05T06:12:09Z</published>
+      <updated>2017-04-05T07:12:47Z</updated>
+      <title>New status by lambadalambda@social.heldscal.la</title>
+      <author>
+        <id>https://social.heldscal.la/user/23211</id>
+        <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+        <uri>https://social.heldscal.la/user/23211</uri>
+        <name>lambadalambda</name>
+        <email>lambadalambda@social.heldscal.la</email>
+        <summary>Call me Deacon Blues.</summary>
+        <link rel="alternate" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+        <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/000/236/original/23211-original-20170416114255.jpeg?1492345317"/>
+        <link rel="header" type="" media:width="700" media:height="335" href="/headers/original/missing.png"/>
+        <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+        <poco:displayName>Constance Variable</poco:displayName>
+        <poco:note>Call me Deacon Blues.</poco:note>
+        <mastodon:scope>public</mastodon:scope>
+      </author>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+      <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+      <content type="html" xml:lang="en">Federation 101: &lt;a href="https://www.youtube.com/watch?v=t1lYU5CA40o" rel="nofollow external noreferrer" class="attachment thumbnail"&gt;https://www.youtube.com/watch?v=t1lYU5CA40o&lt;/a&gt;</content>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+      <mastodon:scope>public</mastodon:scope>
+      <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1502088"/>
+    </activity:object>
+    <content type="html" xml:lang="en">Federation 101: &lt;a href="https://www.youtube.com/watch?v=t1lYU5CA40o" rel="nofollow external noreferrer" class="attachment thumbnail"&gt;https://www.youtube.com/watch?v=t1lYU5CA40o&lt;/a&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1618003"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1618003.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-05:objectId=1641750:objectType=Status</id>
+    <published>2017-04-05T05:44:48Z</published>
+    <updated>2017-04-05T05:44:48Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://social.heldscal.la/lambadalambda" class="u-url mention"&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; just a test.&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://social.heldscal.la/user/23211"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1616358"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1616358.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-04:objectId=1540149:objectType=Status</id>
+    <published>2017-04-04T06:31:09Z</published>
+    <updated>2017-04-04T06:31:09Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;Looks like you still can&amp;apos;t delete your account here (PRIVACY!), but I won&amp;apos;t be posting here anymore, my main account is &lt;span class="h-card"&gt;&lt;a href="https://social.heldscal.la/lambadalambda" class="u-url mention"&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://social.heldscal.la/user/23211"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1559641"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1559641.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-04:objectId=1539608:objectType=Status</id>
+    <published>2017-04-04T06:18:16Z</published>
+    <updated>2017-04-04T06:18:16Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://mastodon.social/@ghostbar" class="u-url mention"&gt;@&lt;span&gt;ghostbar&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Remember to rewrite it in Rust once you&amp;apos;re done.&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/ghostbar"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1559263"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1559263.atom"/>
+    <thr:in-reply-to ref="tag:mastodon.social,2017-04-03:objectId=1514426:objectType=Status" href="https://mastodon.social/@ghostbar/1514426"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-03:objectId=1504813:objectType=Status</id>
+    <published>2017-04-03T18:01:20Z</published>
+    <updated>2017-04-03T18:01:20Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://mastodon.xyz/@Azurolu" class="u-url mention"&gt;@&lt;span&gt;Azurolu&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; You mean gs.smuglo.li?&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.xyz/users/Azurolu"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1535844"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1535844.atom"/>
+    <thr:in-reply-to ref="tag:mastodon.xyz,2017-04-03:objectId=21879:objectType=Status" href="https://mastodon.xyz/users/Azurolu/updates/3813"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-03:objectId=1504805:objectType=Status</id>
+    <published>2017-04-03T18:01:05Z</published>
+    <updated>2017-04-03T18:01:05Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;There&amp;apos;s nothing wrong with having several alt accounts all across the fediverse. Try out another mastodon instance (&lt;a href="https://icosahedron.website" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;icosahedron.website&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;) or a GNU Social instance (like &lt;a href="https://shitposter.club" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;shitposter.club&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt; or &lt;a href="https://freezepeach.xyz" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;freezepeach.xyz&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;), or friendica. They are all on the same network, so you can still follow all your friends!&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1535837"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1535837.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-03:objectId=1503965:objectType=Status</id>
+    <published>2017-04-03T17:31:30Z</published>
+    <updated>2017-04-03T17:31:30Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://mastodon.social/@20Hz" class="u-url mention"&gt;@&lt;span&gt;20Hz&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; you could also try out a GS instance, which are on the same network :)&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/20Hz"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1535176"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1535176.atom"/>
+    <thr:in-reply-to ref="tag:mastodon.social,2017-04-03:objectId=1503524:objectType=Status" href="https://mastodon.social/@20Hz/1503524"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-03:objectId=1503955:objectType=Status</id>
+    <published>2017-04-03T17:31:08Z</published>
+    <updated>2017-04-03T17:31:08Z</updated>
+    <title>lambadalambda shared a status by shpuld@shitposter.club</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+    <activity:object>
+      <id>tag:shitposter.club,2017-04-03:noticeId=2251717:objectType=note</id>
+      <published>2017-04-03T17:06:43Z</published>
+      <updated>2017-04-03T17:12:06Z</updated>
+      <title>New status by shpuld@shitposter.club</title>
+      <author>
+        <id>https://shitposter.club/user/5381</id>
+        <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+        <uri>https://shitposter.club/user/5381</uri>
+        <name>shpuld</name>
+        <email>shpuld@shitposter.club</email>
+        <summary></summary>
+        <link rel="alternate" type="text/html" href="https://shitposter.club/shpuld"/>
+        <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/005/895/original/5381-original-20170401213417.jpeg?1491082522"/>
+        <link rel="header" type="" media:width="700" media:height="335" href="/headers/original/missing.png"/>
+        <poco:preferredUsername>shpuld</poco:preferredUsername>
+        <poco:displayName>shp</poco:displayName>
+        <mastodon:scope>public</mastodon:scope>
+      </author>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+      <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+      <content type="html" xml:lang="en">reposting the classic &lt;a href="https://shitposter.club/file/89c5fe483526caf3a46cfc5cdd4ae68061054350e767397731af658d54786e31.jpg" class="attachment" rel="nofollow external"&gt;https://shitposter.club/attachment/219846&lt;/a&gt;</content>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+      <link rel="enclosure" type="image/jpeg" length="30588" href="https://files.mastodon.social/media_attachments/files/000/156/256/original/89c5fe483526caf3a46cfc5cdd4ae68061054350e767397731af658d54786e31.jpg"/>
+      <mastodon:scope>public</mastodon:scope>
+      <link rel="alternate" type="text/html" href="https://shitposter.club/notice/2251717"/>
+    </activity:object>
+    <content type="html" xml:lang="en">reposting the classic &lt;a href="https://shitposter.club/file/89c5fe483526caf3a46cfc5cdd4ae68061054350e767397731af658d54786e31.jpg" class="attachment" rel="nofollow external"&gt;https://shitposter.club/attachment/219846&lt;/a&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1535166"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1535166.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-03:objectId=1503929:objectType=Status</id>
+    <published>2017-04-03T17:30:43Z</published>
+    <updated>2017-04-03T17:30:43Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://mastodon.social/@ghostbar" class="u-url mention"&gt;@&lt;span&gt;ghostbar&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Normally you shouldn&amp;apos;t be running tens of thousands of users on one instance... That&amp;apos;s one of the reasons for federation.&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/ghostbar"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1535144"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1535144.atom"/>
+    <thr:in-reply-to ref="tag:mastodon.social,2017-04-03:objectId=1503526:objectType=Status" href="https://mastodon.social/@ghostbar/1503526"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-03:objectId=1477255:objectType=Status</id>
+    <published>2017-04-03T08:24:39Z</published>
+    <updated>2017-04-03T08:24:39Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://mastodon.social/@dot_tiff" class="u-url mention"&gt;@&lt;span&gt;dot_tiff&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; it&amp;apos;s the vaporwave mode.&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/dot_tiff"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1513305"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1513305.atom"/>
+    <thr:in-reply-to ref="tag:mastodon.social,2017-04-03:objectId=1477220:objectType=Status" href="https://mastodon.social/@dot_tiff/1477220"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-03:objectId=1476210:objectType=Status</id>
+    <published>2017-04-03T07:45:42Z</published>
+    <updated>2017-04-03T07:45:42Z</updated>
+    <title>lambadalambda shared a status by lambadalambda@social.heldscal.la</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+    <activity:object>
+      <id>tag:social.heldscal.la,2017-04-03:noticeId=1475727:objectType=note</id>
+      <published>2017-04-03T07:44:43Z</published>
+      <updated>2017-04-03T07:44:48Z</updated>
+      <title>New status by lambadalambda@social.heldscal.la</title>
+      <author>
+        <id>https://social.heldscal.la/user/23211</id>
+        <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+        <uri>https://social.heldscal.la/user/23211</uri>
+        <name>lambadalambda</name>
+        <email>lambadalambda@social.heldscal.la</email>
+        <summary>Call me Deacon Blues.</summary>
+        <link rel="alternate" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+        <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/000/236/original/23211-original-20170416114255.jpeg?1492345317"/>
+        <link rel="header" type="" media:width="700" media:height="335" href="/headers/original/missing.png"/>
+        <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+        <poco:displayName>Constance Variable</poco:displayName>
+        <poco:note>Call me Deacon Blues.</poco:note>
+        <mastodon:scope>public</mastodon:scope>
+      </author>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+      <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+      <content type="html" xml:lang="en">Here's a song by the original anti-idol, Togawa Jun: &lt;a href="https://www.youtube.com/watch?v=kNI_NK2YY-s" rel="nofollow external noreferrer" class="attachment"&gt;https://www.youtube.com/watch?v=kNI_NK2YY-s&lt;/a&gt;</content>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+      <mastodon:scope>public</mastodon:scope>
+      <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1475727"/>
+    </activity:object>
+    <content type="html" xml:lang="en">Here's a song by the original anti-idol, Togawa Jun: &lt;a href="https://www.youtube.com/watch?v=kNI_NK2YY-s" rel="nofollow external noreferrer" class="attachment"&gt;https://www.youtube.com/watch?v=kNI_NK2YY-s&lt;/a&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1512485"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1512485.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-03:objectId=1476047:objectType=Status</id>
+    <published>2017-04-03T07:39:14Z</published>
+    <updated>2017-04-03T07:39:14Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://mastodon.social/@amrrr" class="u-url mention"&gt;@&lt;span&gt;amrrr&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; tumblr/10, but pretty good!&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/amrrr"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1512350"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1512350.atom"/>
+    <thr:in-reply-to ref="tag:mastodon.social,2017-04-03:objectId=1476030:objectType=Status" href="https://mastodon.social/@amrrr/1476030"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-03:objectId=1475949:objectType=Status</id>
+    <published>2017-04-03T07:35:45Z</published>
+    <updated>2017-04-03T07:35:45Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://mastodon.social/@Shookaite" class="u-url mention"&gt;@&lt;span&gt;Shookaite&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Oh, you mean like userstyles?&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/Shookaite"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1512271"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1512271.atom"/>
+    <thr:in-reply-to ref="tag:mastodon.social,2017-04-03:objectId=1475879:objectType=Status" href="https://mastodon.social/@Shookaite/1475879"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-03:objectId=1475581:objectType=Status</id>
+    <published>2017-04-03T07:20:03Z</published>
+    <updated>2017-04-03T07:20:03Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://mastodon.social/@Shookaite" class="u-url mention"&gt;@&lt;span&gt;Shookaite&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Would be nice if someone helped port Pleroma to Mastodon, that has a theme switcher (click on the cog in the upper right): &lt;a href="https://pleroma.heldscal.la/main/all" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;pleroma.heldscal.la/main/all&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/Shookaite"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1511987"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1511987.atom"/>
+    <thr:in-reply-to ref="tag:mastodon.social,2017-04-03:objectId=1475550:objectType=Status" href="https://mastodon.social/@Shookaite/1475550"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-02:objectId=1457325:objectType=Status</id>
+    <published>2017-04-02T21:57:43Z</published>
+    <updated>2017-04-02T21:57:43Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://mastodon.social/@rhosyn" class="u-url mention"&gt;@&lt;span&gt;rhosyn&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="h-card"&gt;&lt;a href="https://mastodon.social/@Meaningness" class="u-url mention"&gt;@&lt;span&gt;Meaningness&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; you could take a look at those listed at social.guhnoo.org&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/rhosyn"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/Meaningness"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1496564"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1496564.atom"/>
+    <thr:in-reply-to ref="tag:mastodon.social,2017-04-02:objectId=1449283:objectType=Status" href="https://mastodon.social/@rhosyn/1449283"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-02:objectId=1447926:objectType=Status</id>
+    <published>2017-04-02T18:31:52Z</published>
+    <updated>2017-04-02T18:31:52Z</updated>
+    <title>New status by lambadalambda</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">&lt;p&gt;My main account is &lt;span class="h-card"&gt;&lt;a href="https://social.heldscal.la/lambadalambda" class="u-url mention"&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; , btw.&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://social.heldscal.la/user/23211"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1488648"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1488648.atom"/>
+  </entry>
+  <entry>
+    <id>tag:mastodon.social,2017-04-02:objectId=1447878:objectType=Status</id>
+    <published>2017-04-02T18:30:37Z</published>
+    <updated>2017-04-02T18:30:37Z</updated>
+    <title>lambadalambda shared a status by Firstaide@awoo.space</title>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+    <activity:object>
+      <id>tag:awoo.space,2017-04-02:objectId=135324:objectType=Status</id>
+      <published>2017-04-02T18:29:32Z</published>
+      <updated>2017-04-02T18:29:32Z</updated>
+      <title>New status by Firstaide@awoo.space</title>
+      <author>
+        <id>https://awoo.space/users/Firstaide</id>
+        <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+        <uri>https://awoo.space/users/Firstaide</uri>
+        <name>Firstaide</name>
+        <email>Firstaide@awoo.space</email>
+        <summary>A smol awoo account, for a smol autistic 💙
+They/them please!
+NB/white/ace</summary>
+        <link rel="alternate" type="text/html" href="https://awoo.space/@Firstaide"/>
+        <link rel="avatar" type="image/png" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/023/707/original/95e92639771fd225.png?1492022811"/>
+        <link rel="header" type="image/jpeg" media:width="700" media:height="335" href="https://files.mastodon.social/accounts/headers/000/023/707/original/e98df174c26747be.jpg?1491667928"/>
+        <poco:preferredUsername>Firstaide</poco:preferredUsername>
+        <poco:displayName>Miff🚑✨</poco:displayName>
+        <poco:note>A smol awoo account, for a smol autistic 💙
+They/them please!
+NB/white/ace</poco:note>
+        <mastodon:scope>public</mastodon:scope>
+      </author>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+      <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+      <content type="html" xml:lang="en">&lt;p&gt;&lt;a href="https://mastodon.social/users/lambadalambda" class="h-card u-url p-nickname mention"&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt; yeah, I think that's p much the  big issue here? &lt;br&gt;When I first heard of Masto, I thought it was just like twitter at first, I had no idea federation was even a thing?, and I actually joined p early on? :-o &lt;/p&gt;&lt;p&gt;idk I think more stuff needs to be done about federation promotion, but honestly its gotta come from the get go when people get here to make an account I feel :-o&lt;/p&gt;</content>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/lambadalambda"/>
+      <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+      <mastodon:scope>public</mastodon:scope>
+      <link rel="alternate" type="text/html" href="https://awoo.space/users/Firstaide/updates/10904"/>
+      <thr:in-reply-to ref="tag:mastodon.social,2017-04-02:objectId=1447682:objectType=Status" href="https://mastodon.social/@lambadalambda/1447682"/>
+    </activity:object>
+    <content type="html" xml:lang="en">&lt;p&gt;&lt;a href="https://mastodon.social/users/lambadalambda" class="h-card u-url p-nickname mention"&gt;@&lt;span&gt;lambadalambda&lt;/span&gt;&lt;/a&gt; yeah, I think that's p much the  big issue here? &lt;br&gt;When I first heard of Masto, I thought it was just like twitter at first, I had no idea federation was even a thing?, and I actually joined p early on? :-o &lt;/p&gt;&lt;p&gt;idk I think more stuff needs to be done about federation promotion, but honestly its gotta come from the get go when people get here to make an account I feel :-o&lt;/p&gt;</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/1488609"/>
+    <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/1488609.atom"/>
+  </entry>
+</feed>
diff --git a/test/fixtures/ostatus_incoming_post.xml b/test/fixtures/ostatus_incoming_post.xml
new file mode 100644 (file)
index 0000000..7967e1b
--- /dev/null
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
+ <generator uri="https://gnu.io/social" version="1.0.2-dev">GNU social</generator>
+ <id>https://social.heldscal.la/api/statuses/user_timeline/23211.atom</id>
+ <title>lambadalambda timeline</title>
+ <subtitle>Updates from lambadalambda on social.heldscal.la!</subtitle>
+ <logo>https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg</logo>
+ <updated>2017-04-29T18:25:38+00:00</updated>
+<author>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <uri>https://social.heldscal.la/user/23211</uri>
+ <name>lambadalambda</name>
+ <summary>Call me Deacon Blues.</summary>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+ <link rel="avatar" type="image/jpeg" media:width="236" media:height="236" href="https://social.heldscal.la/avatar/23211-original-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/23211-48-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/23211-24-20170416114257.jpeg"/>
+ <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+ <poco:displayName>Constance Variable</poco:displayName>
+ <poco:note>Call me Deacon Blues.</poco:note>
+ <poco:address>
+  <poco:formatted>Berlin</poco:formatted>
+ </poco:address>
+ <poco:urls>
+  <poco:type>homepage</poco:type>
+  <poco:value>https://heldscal.la</poco:value>
+  <poco:primary>true</poco:primary>
+ </poco:urls>
+ <followers url="https://social.heldscal.la/lambadalambda/subscribers"></followers>
+ <statusnet:profile_info local_id="23211"></statusnet:profile_info>
+</author>
+ <link href="https://social.heldscal.la/lambadalambda" rel="alternate" type="text/html"/>
+ <link href="https://social.heldscal.la/main/sup" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="https://social.heldscal.la/main/push/hub" rel="hub"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="salmon"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="https://social.heldscal.la/api/statuses/user_timeline/23211.atom" rel="self" type="application/atom+xml"/>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:social.heldscal.la,2017-04-29:noticeId=1967725:objectType=note</id>
+ <title>New note by lambadalambda</title>
+ <content type="html">Will it blend?</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1967725"/>
+ <status_net notice_id="1967725"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-29T18:25:38+00:00</published>
+ <updated>2017-04-29T18:25:38+00:00</updated>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1007861"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1007861" local_id="1007861" ref="tag:social.heldscal.la,2017-04-29:objectType=thread:nonce=3f3a9dd83acc4e35">tag:social.heldscal.la,2017-04-29:objectType=thread:nonce=3f3a9dd83acc4e35</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1967725.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1967725.atom"/>
+ <statusnet:notice_info local_id="1967725" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+</feed>
diff --git a/test/fixtures/ostatus_incoming_reply.xml b/test/fixtures/ostatus_incoming_reply.xml
new file mode 100644 (file)
index 0000000..83a427a
--- /dev/null
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
+ <generator uri="https://gnu.io/social" version="1.0.2-dev">GNU social</generator>
+ <id>https://social.heldscal.la/api/statuses/user_timeline/23211.atom</id>
+ <title>lambadalambda timeline</title>
+ <subtitle>Updates from lambadalambda on social.heldscal.la!</subtitle>
+ <logo>https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg</logo>
+ <updated>2017-04-30T09:30:32+00:00</updated>
+<author>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <uri>https://social.heldscal.la/user/23211</uri>
+ <name>lambadalambda</name>
+ <summary>Call me Deacon Blues.</summary>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+ <link rel="avatar" type="image/jpeg" media:width="236" media:height="236" href="https://social.heldscal.la/avatar/23211-original-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/23211-48-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/23211-24-20170416114257.jpeg"/>
+ <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+ <poco:displayName>Constance Variable</poco:displayName>
+ <poco:note>Call me Deacon Blues.</poco:note>
+ <poco:address>
+  <poco:formatted>Berlin</poco:formatted>
+ </poco:address>
+ <poco:urls>
+  <poco:type>homepage</poco:type>
+  <poco:value>https://heldscal.la</poco:value>
+  <poco:primary>true</poco:primary>
+ </poco:urls>
+ <followers url="https://social.heldscal.la/lambadalambda/subscribers"></followers>
+ <statusnet:profile_info local_id="23211"></statusnet:profile_info>
+</author>
+ <link href="https://social.heldscal.la/lambadalambda" rel="alternate" type="text/html"/>
+ <link href="https://social.heldscal.la/main/sup" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="https://social.heldscal.la/main/push/hub" rel="hub"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="salmon"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="https://social.heldscal.la/api/statuses/user_timeline/23211.atom" rel="self" type="application/atom+xml"/>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:social.heldscal.la,2017-04-30:noticeId=1978790:objectType=comment</id>
+ <title>New comment by lambadalambda</title>
+ <content type="html">@&lt;a href=&quot;https://gs.archae.me/user/4687&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;shpbot&quot;&gt;shpbot&lt;/a&gt; why not indeed.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/1978790"/>
+ <status_net notice_id="1978790"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2017-04-30T09:30:32+00:00</published>
+ <updated>2017-04-30T09:30:32+00:00</updated>
+ <thr:in-reply-to ref="tag:gs.archae.me,2017-04-30:noticeId=778260:objectType=note" href="https://gs.archae.me/notice/778260"></thr:in-reply-to>
+ <link rel="related" href="https://gs.archae.me/notice/778260"/>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1013566"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1013566" local_id="1013566" ref="https://gs.archae.me/conversation/327120">https://gs.archae.me/conversation/327120</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://gs.archae.me/user/4687"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1978790.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/1978790.atom"/>
+ <statusnet:notice_info local_id="1978790" source="Pleroma FE"></statusnet:notice_info>
+</entry>
+</feed>
diff --git a/test/fixtures/private_key.pem b/test/fixtures/private_key.pem
new file mode 100644 (file)
index 0000000..7a4b146
--- /dev/null
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAqnWeDtrqWasCKNXiuSq1tSCLI5H7BSvIROy5YfuGsXHrIlCq
+LdIm9QlIUUmIi9QyzgiGEDsPCCkA1UguCVgF/UrJ1+FvHcHsTELkkBu/yCl9mrgt
+WzTckhb6KjOhqtxi/TKgRaJ2Rlwz2bvH5sbCP9qffthitdxfh14KC5V0gqDt1xCy
+WgZo79vbYMcVkcQoh5uLtG64ksYFBMfgnLaSj7xg5i2qCDiIY7bqBujo5HllDqeo
+w3LXmsztt1cT8heXEjW0SYJvAHJK00OsG1kp4cqhfKzxLCHNGQJVHQxLOXy97I7o
+HOeuhbxPhjpGSBMgw7YFm3ODXviqf557eqFcaQIDAQABAoIBAC6f+VnK22sncXHF
+/zvyyL0AZ86U8XpanW7s6VA5wn/qzwwV0Fa0Mt+3aEaDvIuywSrF/hWWcegjfwzX
+r2/y2cCMomUgTopvLrk1WttoG68eWjLlydI2xVZYXpkIgmH/4juri1dAtuVL9wrJ
+aEZhe2SH4jSJ74Ya/y5BtLGycaoA9FHyIzHPTx52Ix2jWKWtKimW8J+aERi2uHdN
+7yTnLT2APhs5fnvNnn0tg85CI3Ny2GNiqmAail14yVfRz8Sf6qDIepH5Jfz9oll4
+I+GYUOLs6eTgkHXBn8LGhtHTE/9UJmb42OyWrW8X+nc/Mjz5xh0u/g1Gdp36oUMz
+OotfneECgYEA3cGfQxmxjEqSbXt9jbxiCukU7PmkDDQqBu97URC4N8qEcMF1wW7X
+AddU7Kq/UJU+oqjD/7UQHoS2ZThPtto6SpVdXQzsnrnPWQcrv5b1DV/TpXfwGoZ3
+svUIAcx4vGzhhmHDJCBsdY6n8xWBYtSqfLFXgN5UkdafLGy3EkCEtmUCgYEAxMgl
+7eU2QkWkzgJxOj6xjG2yqM3jxOvvoiRnD0rIQaBS70P/1N94ZkMXzOwddddZ5OW+
+55h/a8TmFKP/+NW4PHRYra/dazGI4IBlw6Yeq6uq/4jbuSqtBbaNn/Dz5kdHBTqM
+PtbBvc9Fztd2zb3InyyLbb4c+WjMqi0AooN027UCgYB4Tax7GJtLwsEBiDcrB4Ig
+7SYfEae/vyT1skIyTmHCUqnbCfk6QUl/hDRcWJ2FuBHM6MW8GZxvEgxpiU0lo+pv
+v+xwqKxNx/wHDm7bd6fl45DMee7WVRDnEyuO3kC56E/JOYxGMxjkBcpzg703wqvj
+Dcqs7PDwVYDw9uGykzHsSQKBgEQnNcvA+RvW1w9qlSChGgkS7S+9r0dCl8pGZVNM
+iTMBfffUS0TE6QQx9IpKtKFdpoq6b3XywR7oIO/BJSRfkOGPQi9Vm5BGpatrjNNI
+M5Mtb5n1InRtLWOvKDnez/pPcW+EKZKR+qPsp7bNtR3ovxUx7lBh6dMP0uKVl4Sx
+lsWJAoGBAIeek9eG+S3m2jaJRHasfKo5mJ2JrrmnjQXUOGUP8/CgO8sW1VmG2WAk
+Av7+BRI2mP2f+3SswG/AoRGmRXXw65ly63ws8ixrhK0MG3MgqDkWc69SbTaaMJ+u
+BQFYMsB1vZdUV3CaRqySkjY68QWGcJ4Z5JKHuTXzKv/GeFmw0V9R
+-----END RSA PRIVATE KEY-----
diff --git a/test/fixtures/salmon2.xml b/test/fixtures/salmon2.xml
new file mode 100644 (file)
index 0000000..d8ecbc1
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<me:env xmlns:me="http://salmon-protocol.org/ns/magic-env"><me:data type="application/atom+xml">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8-PGVudHJ5IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20iIHhtbG5zOnRocj0iaHR0cDovL3B1cmwub3JnL3N5bmRpY2F0aW9uL3RocmVhZC8xLjAiIHhtbG5zOmFjdGl2aXR5PSJodHRwOi8vYWN0aXZpdHlzdHJlYS5tcy9zcGVjLzEuMC8iIHhtbG5zOmdlb3Jzcz0iaHR0cDovL3d3dy5nZW9yc3Mub3JnL2dlb3JzcyIgeG1sbnM6b3N0YXR1cz0iaHR0cDovL29zdGF0dXMub3JnL3NjaGVtYS8xLjAiIHhtbG5zOnBvY289Imh0dHA6Ly9wb3J0YWJsZWNvbnRhY3RzLm5ldC9zcGVjLzEuMCIgeG1sbnM6bWVkaWE9Imh0dHA6Ly9wdXJsLm9yZy9zeW5kaWNhdGlvbi9hdG9tbWVkaWEiIHhtbG5zOnN0YXR1c25ldD0iaHR0cDovL3N0YXR1cy5uZXQvc2NoZW1hL2FwaS8xLyI-CiA8YWN0aXZpdHk6b2JqZWN0LXR5cGU-aHR0cDovL2FjdGl2aXR5c3RyZWEubXMvc2NoZW1hLzEuMC9ub3RlPC9hY3Rpdml0eTpvYmplY3QtdHlwZT4KIDxpZD50YWc6c29jaWFsLmhlbGRzY2FsLmxhLDIwMTctMDQtMjk6bm90aWNlSWQ9MTk2NzEwNjpvYmplY3RUeXBlPW5vdGU8L2lkPgogPHRpdGxlPk5ldyBub3RlIGJ5IGxhbWJhZGFsYW1iZGE8L3RpdGxlPgogPGNvbnRlbnQgdHlwZT0iaHRtbCI-dGVzdCBAJmx0O2EgaHJlZj0mcXVvdDtodHRwczovL3BsZXJvbWEuc295a2FmLmNvbS91c2Vycy9sYWluJnF1b3Q7IGNsYXNzPSZxdW90O2gtY2FyZCB1LXVybCBwLW5pY2tuYW1lIG1lbnRpb24mcXVvdDsmZ3Q7bGFpbiZsdDsvYSZndDs8L2NvbnRlbnQ-CiA8bGluayByZWw9ImFsdGVybmF0ZSIgdHlwZT0idGV4dC9odG1sIiBocmVmPSJodHRwczovL3NvY2lhbC5oZWxkc2NhbC5sYS9ub3RpY2UvMTk2NzEwNiIvPgogPHN0YXR1c19uZXQgbm90aWNlX2lkPSIxOTY3MTA2Ij48L3N0YXR1c19uZXQ-CiA8YWN0aXZpdHk6dmVyYj5odHRwOi8vYWN0aXZpdHlzdHJlYS5tcy9zY2hlbWEvMS4wL3Bvc3Q8L2FjdGl2aXR5OnZlcmI-CiA8cHVibGlzaGVkPjIwMTctMDQtMjlUMTc6Mjg6MjErMDA6MDA8L3B1Ymxpc2hlZD4KIDx1cGRhdGVkPjIwMTctMDQtMjlUMTc6Mjg6MjErMDA6MDA8L3VwZGF0ZWQ-CiA8YXV0aG9yPgogIDxhY3Rpdml0eTpvYmplY3QtdHlwZT5odHRwOi8vYWN0aXZpdHlzdHJlYS5tcy9zY2hlbWEvMS4wL3BlcnNvbjwvYWN0aXZpdHk6b2JqZWN0LXR5cGU-CiAgPHVyaT5odHRwczovL3NvY2lhbC5oZWxkc2NhbC5sYS91c2VyLzIzMjExPC91cmk-CiAgPG5hbWU-bGFtYmFkYWxhbWJkYTwvbmFtZT4KICA8c3VtbWFyeT5DYWxsIG1lIERlYWNvbiBCbHVlcy48L3N1bW1hcnk-CiAgPGxpbmsgcmVsPSJhbHRlcm5hdGUiIHR5cGU9InRleHQvaHRtbCIgaHJlZj0iaHR0cHM6Ly9zb2NpYWwuaGVsZHNjYWwubGEvbGFtYmFkYWxhbWJkYSIvPgogIDxsaW5rIHJlbD0iYXZhdGFyIiB0eXBlPSJpbWFnZS9qcGVnIiBtZWRpYTp3aWR0aD0iMjM2IiBtZWRpYTpoZWlnaHQ9IjIzNiIgaHJlZj0iaHR0cHM6Ly9zb2NpYWwuaGVsZHNjYWwubGEvYXZhdGFyLzIzMjExLW9yaWdpbmFsLTIwMTcwNDE2MTE0MjU1LmpwZWciLz4KICA8bGluayByZWw9ImF2YXRhciIgdHlwZT0iaW1hZ2UvanBlZyIgbWVkaWE6d2lkdGg9Ijk2IiBtZWRpYTpoZWlnaHQ9Ijk2IiBocmVmPSJodHRwczovL3NvY2lhbC5oZWxkc2NhbC5sYS9hdmF0YXIvMjMyMTEtOTYtMjAxNzA0MTYxMTQyNTUuanBlZyIvPgogIDxsaW5rIHJlbD0iYXZhdGFyIiB0eXBlPSJpbWFnZS9qcGVnIiBtZWRpYTp3aWR0aD0iNDgiIG1lZGlhOmhlaWdodD0iNDgiIGhyZWY9Imh0dHBzOi8vc29jaWFsLmhlbGRzY2FsLmxhL2F2YXRhci8yMzIxMS00OC0yMDE3MDQxNjExNDI1NS5qcGVnIi8-CiAgPGxpbmsgcmVsPSJhdmF0YXIiIHR5cGU9ImltYWdlL2pwZWciIG1lZGlhOndpZHRoPSIyNCIgbWVkaWE6aGVpZ2h0PSIyNCIgaHJlZj0iaHR0cHM6Ly9zb2NpYWwuaGVsZHNjYWwubGEvYXZhdGFyLzIzMjExLTI0LTIwMTcwNDE2MTE0MjU3LmpwZWciLz4KICA8cG9jbzpwcmVmZXJyZWRVc2VybmFtZT5sYW1iYWRhbGFtYmRhPC9wb2NvOnByZWZlcnJlZFVzZXJuYW1lPgogIDxwb2NvOmRpc3BsYXlOYW1lPkNvbnN0YW5jZSBWYXJpYWJsZTwvcG9jbzpkaXNwbGF5TmFtZT4KICA8cG9jbzpub3RlPkNhbGwgbWUgRGVhY29uIEJsdWVzLjwvcG9jbzpub3RlPgogIDxwb2NvOmFkZHJlc3M-CiAgIDxwb2NvOmZvcm1hdHRlZD5CZXJsaW48L3BvY286Zm9ybWF0dGVkPgogIDwvcG9jbzphZGRyZXNzPgogIDxwb2NvOnVybHM-CiAgIDxwb2NvOnR5cGU-aG9tZXBhZ2U8L3BvY286dHlwZT4KICAgPHBvY286dmFsdWU-aHR0cHM6Ly9oZWxkc2NhbC5sYTwvcG9jbzp2YWx1ZT4KICAgPHBvY286cHJpbWFyeT50cnVlPC9wb2NvOnByaW1hcnk-CiAgPC9wb2NvOnVybHM-CiAgPGZvbGxvd2VycyB1cmw9Imh0dHBzOi8vc29jaWFsLmhlbGRzY2FsLmxhL2xhbWJhZGFsYW1iZGEvc3Vic2NyaWJlcnMiPjwvZm9sbG93ZXJzPgogIDxzdGF0dXNuZXQ6cHJvZmlsZV9pbmZvIGxvY2FsX2lkPSIyMzIxMSI-PC9zdGF0dXNuZXQ6cHJvZmlsZV9pbmZvPgogPC9hdXRob3I-CiA8bGluayByZWw9Im9zdGF0dXM6Y29udmVyc2F0aW9uIiBocmVmPSJodHRwczovL3NvY2lhbC5oZWxkc2NhbC5sYS9jb252ZXJzYXRpb24vMTAwNzQ5NiIvPgogPG9zdGF0dXM6Y29udmVyc2F0aW9uIGhyZWY9Imh0dHBzOi8vc29jaWFsLmhlbGRzY2FsLmxhL2NvbnZlcnNhdGlvbi8xMDA3NDk2IiBsb2NhbF9pZD0iMTAwNzQ5NiIgcmVmPSJ0YWc6c29jaWFsLmhlbGRzY2FsLmxhLDIwMTctMDQtMjk6b2JqZWN0VHlwZT10aHJlYWQ6bm9uY2U9NDU5ZGYyMjM2NDFiMDNkZSI-dGFnOnNvY2lhbC5oZWxkc2NhbC5sYSwyMDE3LTA0LTI5Om9iamVjdFR5cGU9dGhyZWFkOm5vbmNlPTQ1OWRmMjIzNjQxYjAzZGU8L29zdGF0dXM6Y29udmVyc2F0aW9uPgogPGxpbmsgcmVsPSJtZW50aW9uZWQiIG9zdGF0dXM6b2JqZWN0LXR5cGU9Imh0dHA6Ly9hY3Rpdml0eXN0cmVhLm1zL3NjaGVtYS8xLjAvcGVyc29uIiBocmVmPSJodHRwczovL3BsZXJvbWEuc295a2FmLmNvbS91c2Vycy9sYWluIi8-CiA8bGluayByZWw9Im1lbnRpb25lZCIgb3N0YXR1czpvYmplY3QtdHlwZT0iaHR0cDovL2FjdGl2aXR5c3RyZWEubXMvc2NoZW1hLzEuMC9jb2xsZWN0aW9uIiBocmVmPSJodHRwOi8vYWN0aXZpdHlzY2hlbWEub3JnL2NvbGxlY3Rpb24vcHVibGljIi8-CiA8c291cmNlPgogIDxpZD5odHRwczovL3NvY2lhbC5oZWxkc2NhbC5sYS9hcGkvc3RhdHVzZXMvdXNlcl90aW1lbGluZS8yMzIxMS5hdG9tPC9pZD4KICA8dGl0bGU-Q29uc3RhbmNlIFZhcmlhYmxlPC90aXRsZT4KICA8bGluayByZWw9ImFsdGVybmF0ZSIgdHlwZT0idGV4dC9odG1sIiBocmVmPSJodHRwczovL3NvY2lhbC5oZWxkc2NhbC5sYS9sYW1iYWRhbGFtYmRhIi8-CiAgPGxpbmsgcmVsPSJzZWxmIiB0eXBlPSJhcHBsaWNhdGlvbi9hdG9tK3htbCIgaHJlZj0iaHR0cHM6Ly9zb2NpYWwuaGVsZHNjYWwubGEvYXBpL3N0YXR1c2VzL3VzZXJfdGltZWxpbmUvMjMyMTEuYXRvbSIvPgogIDxsaW5rIHJlbD0ibGljZW5zZSIgaHJlZj0iaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMC8iLz4KICA8aWNvbj5odHRwczovL3NvY2lhbC5oZWxkc2NhbC5sYS9hdmF0YXIvMjMyMTEtOTYtMjAxNzA0MTYxMTQyNTUuanBlZzwvaWNvbj4KICA8dXBkYXRlZD4yMDE3LTA0LTI5VDE3OjI4OjIxKzAwOjAwPC91cGRhdGVkPgogPC9zb3VyY2U-CiA8bGluayByZWw9InNlbGYiIHR5cGU9ImFwcGxpY2F0aW9uL2F0b20reG1sIiBocmVmPSJodHRwczovL3NvY2lhbC5oZWxkc2NhbC5sYS9hcGkvc3RhdHVzZXMvc2hvdy8xOTY3MTA2LmF0b20iLz4KIDxsaW5rIHJlbD0iZWRpdCIgdHlwZT0iYXBwbGljYXRpb24vYXRvbSt4bWwiIGhyZWY9Imh0dHBzOi8vc29jaWFsLmhlbGRzY2FsLmxhL2FwaS9zdGF0dXNlcy9zaG93LzE5NjcxMDYuYXRvbSIvPgogPHN0YXR1c25ldDpub3RpY2VfaW5mbyBsb2NhbF9pZD0iMTk2NzEwNiIgc291cmNlPSJQbGVyb21hIEZFIj48L3N0YXR1c25ldDpub3RpY2VfaW5mbz4KPC9lbnRyeT4K</me:data><me:encoding>base64url</me:encoding><me:alg>RSA-SHA256</me:alg><me:sig>CJ3wiWW9Io6Y24To3PFBF8cGuvJG8ps5zEwu1k1kSAlSX7WcysvS4ZoPKICFrD4brJxMLpW3AQCLNPIa246-Y0noGiNdpj0w0_TWgWXukWo50pD7cWVugr15YCMUtC-v00iDYfZTlmrTVM6kSCcpAmGMbZPTaXVmKZryjTDoXSI=</me:sig></me:env>
\ No newline at end of file
diff --git a/test/fixtures/share-gs.xml b/test/fixtures/share-gs.xml
new file mode 100644 (file)
index 0000000..ab5e488
--- /dev/null
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
+ <generator uri="https://gnu.io/social" version="1.0.2-dev">GNU social</generator>
+ <id>https://social.heldscal.la/api/statuses/user_timeline/23211.atom</id>
+ <title>lambadalambda timeline</title>
+ <subtitle>Updates from lambadalambda on social.heldscal.la!</subtitle>
+ <logo>https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg</logo>
+ <updated>2017-05-03T08:05:41+00:00</updated>
+<author>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <uri>https://social.heldscal.la/user/23211</uri>
+ <name>lambadalambda</name>
+ <summary>Call me Deacon Blues.</summary>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/lambadalambda"/>
+ <link rel="avatar" type="image/jpeg" media:width="236" media:height="236" href="https://social.heldscal.la/avatar/23211-original-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/23211-48-20170416114255.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/23211-24-20170416114257.jpeg"/>
+ <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+ <poco:displayName>Constance Variable</poco:displayName>
+ <poco:note>Call me Deacon Blues.</poco:note>
+ <poco:address>
+  <poco:formatted>Berlin</poco:formatted>
+ </poco:address>
+ <poco:urls>
+  <poco:type>homepage</poco:type>
+  <poco:value>https://heldscal.la</poco:value>
+  <poco:primary>true</poco:primary>
+ </poco:urls>
+ <followers url="https://social.heldscal.la/lambadalambda/subscribers"></followers>
+ <statusnet:profile_info local_id="23211"></statusnet:profile_info>
+</author>
+ <link href="https://social.heldscal.la/lambadalambda" rel="alternate" type="text/html"/>
+ <link href="https://social.heldscal.la/main/sup" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="https://social.heldscal.la/main/push/hub" rel="hub"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="salmon"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="https://social.heldscal.la/main/salmon/user/23211" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="https://social.heldscal.la/api/statuses/user_timeline/23211.atom" rel="self" type="application/atom+xml"/>
+<entry>
+ <id>tag:social.heldscal.la,2017-05-03:noticeId=2028428:objectType=note</id>
+ <title>lambadalambda repeated a notice by lain</title>
+ <content type="html">RT @&lt;a href=&quot;https://pleroma.soykaf.com/users/lain&quot; class=&quot;h-card u-url p-nickname mention&quot; title=&quot;Lain Iwakura&quot;&gt;lain&lt;/a&gt; Added returning the entries as xml... let's see if the mastodon hammering stops now.</content>
+ <link rel="alternate" type="text/html" href="https://social.heldscal.la/notice/2028428"/>
+ <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+ <published>2017-05-03T08:05:41+00:00</published>
+ <updated>2017-05-03T08:05:41+00:00</updated>
+ <activity:object>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+  <id>https://pleroma.soykaf.com/objects/4c1bda26-902e-4525-9fcd-b9fd44925193</id>
+  <title></title>
+  <content type="html">Added returning the entries as xml... let's see if the mastodon hammering stops now.</content>
+  <link rel="alternate" type="text/html" href="https://pleroma.soykaf.com/objects/4c1bda26-902e-4525-9fcd-b9fd44925193"/>
+  <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+  <published>2017-05-03T08:04:44+00:00</published>
+  <updated>2017-05-03T08:04:44+00:00</updated>
+  <author>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+   <uri>https://pleroma.soykaf.com/users/lain</uri>
+   <name>lain</name>
+   <summary>Test account</summary>
+   <link rel="alternate" type="text/html" href="https://pleroma.soykaf.com/users/lain"/>
+   <link rel="avatar" type="image/jpeg" media:width="250" media:height="202" href="https://social.heldscal.la/avatar/43188-original-20170429171039.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="https://social.heldscal.la/avatar/43188-96-20170429172422.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="https://social.heldscal.la/avatar/43188-48-20170429172422.jpeg"/>
+   <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="https://social.heldscal.la/avatar/43188-24-20170429181411.jpeg"/>
+   <poco:preferredUsername>lain</poco:preferredUsername>
+   <poco:displayName>Lain Iwakura</poco:displayName>
+   <poco:note>Test account</poco:note>
+   <statusnet:profile_info local_id="43188"></statusnet:profile_info>
+  </author>
+  <activity:object>
+   <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+   <id>https://pleroma.soykaf.com/objects/4c1bda26-902e-4525-9fcd-b9fd44925193</id>
+   <title>New note by lain</title>
+   <content type="html">Added returning the entries as xml... let's see if the mastodon hammering stops now.</content>
+   <link rel="alternate" type="text/html" href="https://pleroma.soykaf.com/objects/4c1bda26-902e-4525-9fcd-b9fd44925193"/>
+   <status_net notice_id="2028424"></status_net>
+  </activity:object>
+  <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1042737"/>
+  <ostatus:conversation href="https://social.heldscal.la/conversation/1042737" local_id="1042737" ref="https://pleroma.soykaf.com/contexts/ede39a2b-7cf3-4fa4-8ccd-cb97431bcc22">https://pleroma.soykaf.com/contexts/ede39a2b-7cf3-4fa4-8ccd-cb97431bcc22</ostatus:conversation>
+  <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+  <source>
+   <id>https://pleroma.soykaf.com/users/lain/feed.atom</id>
+   <title>Lain Iwakura</title>
+   <link rel="alternate" type="text/html" href="https://pleroma.soykaf.com/users/lain"/>
+   <link rel="self" type="application/atom+xml" href="https://pleroma.soykaf.com/users/lain/feed.atom"/>
+   <icon>https://social.heldscal.la/avatar/43188-96-20170429172422.jpeg</icon>
+   <updated>2017-05-03T08:04:44+00:00</updated>
+  </source>
+ </activity:object>
+ <link rel="ostatus:conversation" href="https://social.heldscal.la/conversation/1042737"/>
+ <ostatus:conversation href="https://social.heldscal.la/conversation/1042737" local_id="1042737" ref="https://pleroma.soykaf.com/contexts/ede39a2b-7cf3-4fa4-8ccd-cb97431bcc22">https://pleroma.soykaf.com/contexts/ede39a2b-7cf3-4fa4-8ccd-cb97431bcc22</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2028428.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/show/2028428.atom"/>
+ <statusnet:notice_info local_id="2028428" source="api" repeat_of="2028424"></statusnet:notice_info>
+</entry>
+</feed>
diff --git a/test/fixtures/share.xml b/test/fixtures/share.xml
new file mode 100644 (file)
index 0000000..e07b886
--- /dev/null
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<entry xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:media="http://purl.org/syndication/atommedia" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:mastodon="http://mastodon.social/schema/1.0">
+  <id>tag:mastodon.social,2017-05-03:objectId=4934452:objectType=Status</id>
+  <published>2017-05-03T08:21:09Z</published>
+  <updated>2017-05-03T08:21:09Z</updated>
+  <title>lambadalambda shared a status by lain@pleroma.soykaf.com</title>
+  <author>
+    <id>https://mastodon.social/users/lambadalambda</id>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+    <uri>https://mastodon.social/users/lambadalambda</uri>
+    <name>lambadalambda</name>
+    <email>lambadalambda@mastodon.social</email>
+    <link rel="alternate" type="text/html" href="https://mastodon.social/@lambadalambda"/>
+    <link rel="avatar" type="image/gif" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif"/>
+    <link rel="header" type="" media:width="700" media:height="335" href="/headers/original/missing.png"/>
+    <poco:preferredUsername>lambadalambda</poco:preferredUsername>
+    <poco:displayName>Critical Value</poco:displayName>
+    <mastodon:scope>public</mastodon:scope>
+  </author>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+  <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+  <activity:object>
+    <id>https://pleroma.soykaf.com/objects/4c1bda26-902e-4525-9fcd-b9fd44925193</id>
+    <published>2017-05-03T08:04:44Z</published>
+    <updated>2017-05-03T08:05:52Z</updated>
+    <title>New status by lain@pleroma.soykaf.com</title>
+    <author>
+      <id>https://pleroma.soykaf.com/users/lain</id>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+      <uri>https://pleroma.soykaf.com/users/lain</uri>
+      <name>lain</name>
+      <email>lain@pleroma.soykaf.com</email>
+      <summary type="html">Test account</summary>
+      <link rel="alternate" type="text/html" href="https://pleroma.soykaf.com/users/lain"/>
+      <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/125/902/original/6B3AFC74ACA841B24CFB94DB9044C84EDE6AFF31C71718B023D413DAED09A68E.jpeg"/>
+      <link rel="header" type="" media:width="700" media:height="335" href="/headers/original/missing.png"/>
+      <poco:preferredUsername>lain</poco:preferredUsername>
+      <poco:displayName>Lain Iwakura</poco:displayName>
+      <poco:note>Test account</poco:note>
+      <mastodon:scope>public</mastodon:scope>
+    </author>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <content type="html" xml:lang="en">Added returning the entries as xml... let's see if the mastodon hammering stops now.</content>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    <mastodon:scope>public</mastodon:scope>
+    <link rel="alternate" type="text/html" href=""/>
+  </activity:object>
+  <content type="html" xml:lang="en">Added returning the entries as xml... let's see if the mastodon hammering stops now.</content>
+  <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+  <mastodon:scope>public</mastodon:scope>
+  <link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2232660"/>
+  <link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2232660.atom"/>
+</entry>
diff --git a/test/fixtures/user_full.xml b/test/fixtures/user_full.xml
new file mode 100644 (file)
index 0000000..8eee8c6
--- /dev/null
@@ -0,0 +1,10 @@
+<author>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <uri>http://gs.example.org:4040/index.php/user/1</uri>
+  <name>lambda</name>
+  <link rel="avatar" type="image/png" media:width="96" media:height="96" href="http://gs.example.org:4040/theme/neo-gnu/default-avatar-profile.png"/>
+  <link rel="avatar" type="image/png" media:width="48" media:height="48" href="http://gs.example.org:4040/theme/neo-gnu/default-avatar-stream.png"/>
+  <link rel="avatar" type="image/png" media:width="24" media:height="24" href="http://gs.example.org:4040/theme/neo-gnu/default-avatar-mini.png"/>
+  <poco:preferredUsername>Constance Variable</poco:preferredUsername>
+  <poco:displayName>lambadalambda</poco:displayName>
+</author>
diff --git a/test/fixtures/user_name_only.xml b/test/fixtures/user_name_only.xml
new file mode 100644 (file)
index 0000000..6d895d5
--- /dev/null
@@ -0,0 +1,5 @@
+<author>
+  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+  <uri>http://gs.example.org:4040/index.php/user/1</uri>
+  <name>lambda</name>
+</author>
diff --git a/test/fixtures/webfinger.xml b/test/fixtures/webfinger.xml
new file mode 100644 (file)
index 0000000..4cde42e
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
+ <Subject>acct:shp@social.heldscal.la</Subject>
+ <Alias>https://social.heldscal.la/user/29191</Alias>
+ <Alias>https://social.heldscal.la/shp</Alias>
+ <Alias>https://social.heldscal.la/index.php/user/29191</Alias>
+ <Alias>https://social.heldscal.la/index.php/shp</Alias>
+ <Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="https://social.heldscal.la/shp"/>
+ <Link rel="http://gmpg.org/xfn/11" type="text/html" href="https://social.heldscal.la/shp"/>
+ <Link rel="describedby" type="application/rdf+xml" href="https://social.heldscal.la/shp/foaf"/>
+ <Link rel="http://apinamespace.org/atom" type="application/atomsvc+xml" href="https://social.heldscal.la/api/statusnet/app/service/shp.xml"/>
+ <Link rel="http://apinamespace.org/twitter" href="https://social.heldscal.la/api/"/>
+ <Link rel="http://specs.openid.net/auth/2.0/provider" href="https://social.heldscal.la/shp"/>
+ <Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="https://social.heldscal.la/api/statuses/user_timeline/29191.atom"/>
+ <Link rel="magic-public-key" href="data:application/magic-public-key,RSA.wQ3i9UA0qmAxZ0WTIp4a-waZn_17Ez1pEEmqmqoooRsG1_BvpmOvLN0G2tEcWWxl2KOtdQMCiPptmQObeZeuj48mdsDZ4ArQinexY2hCCTcbV8Xpswpkb8K05RcKipdg07pnI7tAgQ0VWSZDImncL6YUGlG5YN8b5TjGOwk2VG8=.AQAB"/>
+ <Link rel="salmon" href="https://social.heldscal.la/main/salmon/user/29191"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-replies" href="https://social.heldscal.la/main/salmon/user/29191"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-mention" href="https://social.heldscal.la/main/salmon/user/29191"/>
+ <Link rel="http://ostatus.org/schema/1.0/subscribe" template="https://social.heldscal.la/main/ostatussub?profile={uri}"/>
+</XRD>
index 0f9cd0d15cae388bc0122bfa47cbab75f6aa9586..16011edbfda2d9d386e0034b19679032b917e758 100644 (file)
@@ -5,7 +5,7 @@ defmodule Pleroma.Builders.ActivityBuilder do
   def build(data \\ %{}, opts \\ %{}) do
     user = opts[:user] || Pleroma.Factory.insert(:user)
     activity = %{
-      "id" => 1,
+      "id" => Pleroma.Web.ActivityPub.ActivityPub.generate_object_id,
       "actor" => user.ap_id,
       "to" => ["https://www.w3.org/ns/activitystreams#Public"],
       "object" => %{
@@ -23,7 +23,7 @@ defmodule Pleroma.Builders.ActivityBuilder do
 
   def insert_list(times, data \\ %{}, opts \\ %{}) do
     Enum.map(1..times, fn (n) ->
-      {:ok, activity} = insert(Map.merge(data, %{"id" => n}))
+      {:ok, activity} = insert(data)
       activity
     end)
   end
index 1662d4cd60f4699770fec4940ca58af7959010b3..5c110c72d406ed0d0232c4f061b9bef19471c3d2 100644 (file)
@@ -24,7 +24,8 @@ defmodule Pleroma.Factory do
       "to" => ["https://www.w3.org/ns/activitystreams#Public"],
       "published_at" => DateTime.utc_now() |> DateTime.to_iso8601,
       "likes" => [],
-      "like_count" => 0
+      "like_count" => 0,
+      "context" => "2hu"
     }
 
     %Pleroma.Object{
@@ -40,7 +41,8 @@ defmodule Pleroma.Factory do
       "actor" => note.data["actor"],
       "to" => note.data["to"],
       "object" => note.data,
-      "published_at" => DateTime.utc_now() |> DateTime.to_iso8601
+      "published_at" => DateTime.utc_now() |> DateTime.to_iso8601,
+      "context" => note.data["context"]
     }
 
     %Pleroma.Activity{
@@ -91,4 +93,14 @@ defmodule Pleroma.Factory do
       state: "requested"
     }
   end
+
+  def websub_client_subscription_factory do
+    %Pleroma.Web.Websub.WebsubClientSubscription{
+      topic: "http://example.org",
+      secret: "here's a secret",
+      valid_until: nil,
+      state: "requested",
+      subscribers: []
+    }
+  end
 end
diff --git a/test/support/httpoison_mock.ex b/test/support/httpoison_mock.ex
new file mode 100644 (file)
index 0000000..733abce
--- /dev/null
@@ -0,0 +1,125 @@
+defmodule HTTPoisonMock do
+  alias HTTPoison.Response
+
+  def get(url, body \\ [], headers \\ [])
+
+  def get("https://social.heldscal.la/.well-known/webfinger", [Accept: "application/xrd+xml"], [params: [resource: "nonexistant@social.heldscal.la"]]) do
+    {:ok, %Response{
+      status_code: 500,
+      body: File.read!("test/fixtures/httpoison_mock/nonexistant@social.heldscal.la.xml")
+    }}
+  end
+
+  def get("https://social.heldscal.la/.well-known/webfinger", [Accept: "application/xrd+xml"], [params: [resource: "shp@social.heldscal.la"]]) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/shp@social.heldscal.la.xml")
+    }}
+  end
+  
+  def get("https://social.heldscal.la/.well-known/webfinger", [Accept: "application/xrd+xml"], [params: [resource: "https://social.heldscal.la/user/23211"]]) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_user_23211.xml")
+    }}
+  end
+  
+  def get("https://social.heldscal.la/.well-known/webfinger", [Accept: "application/xrd+xml"], [params: [resource: "https://social.heldscal.la/user/29191"]]) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_user_29191.xml")
+    }}
+  end
+
+  def get("https://mastodon.social/.well-known/webfinger", [Accept: "application/xrd+xml"], [params: [resource: "https://mastodon.social/users/lambadalambda"]]) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.xml")
+    }}
+  end
+
+  def get("https://shitposter.club/.well-known/webfinger", [Accept: "application/xrd+xml"], [params: [resource: "https://shitposter.club/user/1"]]) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/https___shitposter.club_user_1.xml")
+    }}
+  end
+
+  def get("http://gs.example.org/.well-known/webfinger", [Accept: "application/xrd+xml"], [params: [resource: "http://gs.example.org:4040/index.php/user/1"], follow_redirect: true]) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/http___gs.example.org_4040_index.php_user_1.xml")
+    }}
+  end
+
+  def get("https://pleroma.soykaf.com/.well-known/webfinger", [Accept: "application/xrd+xml"], [params: [resource: "https://pleroma.soykaf.com/users/lain"]]) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain.xml")
+    }}
+  end
+
+  def get("https://social.heldscal.la/api/statuses/user_timeline/29191.atom", _body, _headers) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml")
+    }}
+  end
+
+  def get("https://social.heldscal.la/api/statuses/user_timeline/23211.atom", _body, _headers) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml")
+    }}
+  end
+
+  def get("https://mastodon.social/users/lambadalambda.atom", _body, _headers) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.atom")
+    }}
+  end
+
+  def get("https://pleroma.soykaf.com/users/lain/feed.atom", _body, _headers) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml")
+    }}
+  end
+
+  def get("http://gs.example.org/index.php/api/statuses/user_timeline/1.atom", _body, _headers) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml")
+    }}
+  end
+
+  def get("https://shitposter.club/notice/2827873", _body, _headers) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/https___shitposter.club_notice_2827873.html")
+    }}
+  end
+
+  def get("https://shitposter.club/api/statuses/show/2827873.atom", _body, _headers) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml")
+    }}
+  end
+
+  def get("https://shitposter.club/api/statuses/user_timeline/1.atom", _body, _headers) do
+    {:ok, %Response{
+      status_code: 200,
+      body: File.read!("test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml")
+    }}
+  end
+
+  def get(url, body, headers) do
+    {:error, "Not implemented the mock response for get #{inspect(url)}"}
+  end
+
+  def post(url, body, headers) do
+    {:error, "Not implemented the mock response for post #{inspect(url)}"}
+  end
+end
index 991ec09725892651baa23be8d79e06fdaaa5d0aa..e6de4a5cd731076d05c4fbff17f9c6c6050b44f5 100644 (file)
@@ -1,9 +1,12 @@
 defmodule Pleroma.UserTest do
   alias Pleroma.Builders.UserBuilder
-  alias Pleroma.User
+  alias Pleroma.{User, Repo}
+  alias Pleroma.Web.OStatus
+  alias Pleroma.Web.Websub.WebsubClientSubscription
   use Pleroma.DataCase
 
   import Pleroma.Factory
+  import Ecto.Query
 
   test "ap_id returns the activity pub id for the user" do
     host =
@@ -13,7 +16,7 @@ defmodule Pleroma.UserTest do
 
     user = UserBuilder.build
 
-    expected_ap_id = "https://#{host}/users/#{user.nickname}"
+    expected_ap_id = "#{Pleroma.Web.base_url}/users/#{user.nickname}"
 
     assert expected_ap_id == User.ap_id(user)
   end
@@ -30,13 +33,29 @@ defmodule Pleroma.UserTest do
     user = insert(:user)
     followed = insert(:user)
 
-    {:ok, user } = User.follow(user, followed)
+    {:ok, user} = User.follow(user, followed)
 
     user = Repo.get(User, user.id)
 
     assert user.following == [User.ap_followers(followed)]
   end
 
+  test "following a remote user will ensure a websub subscription is present" do
+    user = insert(:user)
+    {:ok, followed} = OStatus.make_user("shp@social.heldscal.la")
+
+    assert followed.local == false
+
+    {:ok, user} = User.follow(user, followed)
+    assert user.following == [User.ap_followers(followed)]
+
+    query = from w in WebsubClientSubscription,
+    where: w.topic == ^followed.info["topic"]
+    websub = Repo.one(query)
+
+    assert websub
+  end
+
   test "unfollow takes a user and another user" do
     followed = insert(:user)
     user = insert(:user, %{following: [User.ap_followers(followed)]})
@@ -86,4 +105,39 @@ defmodule Pleroma.UserTest do
       assert changeset.changes[:following] == [User.ap_followers(%User{nickname: @full_user_data.nickname})]
     end
   end
+
+  describe "fetching a user from nickname or trying to build one" do
+    test "gets an existing user" do
+      user = insert(:user)
+      fetched_user = User.get_or_fetch_by_nickname(user.nickname)
+
+      assert user == fetched_user
+    end
+
+    test "fetches an external user via ostatus if no user exists" do
+      fetched_user = User.get_or_fetch_by_nickname("shp@social.heldscal.la")
+      assert fetched_user.nickname == "shp@social.heldscal.la"
+    end
+
+    test "returns nil if no user could be fetched" do
+      fetched_user = User.get_or_fetch_by_nickname("nonexistant@social.heldscal.la")
+      assert fetched_user == nil
+    end
+
+    test "returns nil for nonexistant local user" do
+      fetched_user = User.get_or_fetch_by_nickname("nonexistant")
+      assert fetched_user == nil
+    end
+  end
+
+  test "returns an ap_id for a user" do
+    user = insert(:user)
+    assert User.ap_id(user) == Pleroma.Web.Router.Helpers.o_status_url(Pleroma.Web.Endpoint, :feed_redirect, user.nickname)
+  end
+
+  test "returns an ap_followers link for a user" do
+    user = insert(:user)
+    assert User.ap_followers(user) == Pleroma.Web.Router.Helpers.o_status_url(Pleroma.Web.Endpoint, :feed_redirect, user.nickname) <> "/followers"
+  end
 end
+
index bf9090d2f3dbe75b545e6f6b18f8bf337f2f0a76..a9a6e13647cca2ac78fa680bbb740f044bf98a2a 100644 (file)
@@ -40,6 +40,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
     end
   end
 
+  describe "create activities" do
+    test "removes doubled 'to' recipients" do
+      {:ok, activity} = ActivityPub.create(["user1", "user1", "user2"], %User{ap_id: "1"}, "", %{})
+      assert activity.data["to"] == ["user1", "user2"]
+    end
+  end
+
   describe "fetch activities for recipients" do
     test "retrieve the activities for certain recipients" do
       {:ok, activity_one} = ActivityBuilder.insert(%{"to" => ["someone"]})
@@ -125,6 +132,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
       assert like_activity.data["type"] == "Like"
       assert like_activity.data["object"] == object.data["id"]
       assert like_activity.data["to"] == [User.ap_followers(user), note_activity.data["actor"]]
+      assert like_activity.data["context"] == object.data["context"]
       assert object.data["like_count"] == 1
       assert object.data["likes"] == [user.ap_id]
 
@@ -174,6 +182,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
       assert announce_activity.data["to"] == [User.ap_followers(user), note_activity.data["actor"]]
       assert announce_activity.data["object"] == object.data["id"]
       assert announce_activity.data["actor"] == user.ap_id
+      assert announce_activity.data["context"] == object.data["context"]
     end
   end
 
@@ -204,6 +213,30 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
     end
   end
 
+  describe "following / unfollowing" do
+    test "creates a follow activity" do
+      follower = insert(:user)
+      followed = insert(:user)
+
+      {:ok, activity} = ActivityPub.follow(follower, followed)
+      assert activity.data["type"] == "Follow"
+      assert activity.data["actor"] == follower.ap_id
+      assert activity.data["object"] == followed.ap_id
+    end
+
+    test "creates an undo activity for the last follow" do
+      follower = insert(:user)
+      followed = insert(:user)
+
+      {:ok, follow_activity} = ActivityPub.follow(follower, followed)
+      {:ok, activity} = ActivityPub.unfollow(follower, followed)
+
+      assert activity.data["type"] == "Undo"
+      assert activity.data["actor"] == follower.ap_id
+      assert activity.data["object"] == follow_activity.data["id"]
+    end
+  end
+
   def data_uri do
     "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2ODApLCBxdWFsaXR5ID0gODUK/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgA7ADsAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A+jpFB7UqjGPanM3OKQc14J6t2PB4+tGKVRmjFKwrCAYpQM0uBSZANPlJFLAEClxSDk9KkHTtW0UxtjOaRulPY4ppwactBRITnkUhBAqQjmgjNSnY05iLcKN4pxAzQynbkAD61pBofOhQwCUzIIqOV4o1ZpZAiepOKpx6tp5dk+2Q5Uc/ODW6cZLUZocUFu1ZFz4j0S3tnuJdRgSNPvFn5/AVxOr/ABm8H2Ny0Mc0t0Vfa3lgDj15NcFdNaLUxqWR6ZtFMkzyMdBxXn0fxi8JTadJdWsskrxY3QEgOR3I7HFbVt468O6lp5v9M1S1nVYBK0DNtkAzjBHY+1croy5b2JjV0R0IwVySM0xgvXIpljd2t1avMHjUK21iG3AHGalk8tmZYmQsP4epFczotbnRCXMyLcRwOlCFs8g0siOvRc+9IXKrzwanlNLIa7HJwaQZJ5Bpgf5iTUis2Rg8VtTZoPboKQLkZpzdKjLFR0NbXKiI5IqBj8x61OTkc1EzLu7VEjeJrlTk9aegNScU4KOtehyHl3Q0ZFPA4oxS0/ZkXGMMUzH1p7dcUhGKrkL0AcUZ96SkYU7NFWTJAc8GkIGajBxSlgKiSZFrDuKaxAqGSZVPXB9KwfEvi/R9CtmmvblBtH3dwzn0+tKMWJpLc6RQpPLD8+lZviPU103T5ZbZDczLxsiVnPT2FeE+NPj2lk/lWVuCGjWRW8wAAEZ5/A+tcxafHG8XV1kuTYxbCC0gd5Rj3CmtUrdDHnR0PxCb4pa1P/odi6W8i70VCyfL77sYrC1Dwp4u03wzp1841G2vJpJFuCyFlXaNwJZcgAjp6mvQNI+OloX322t6JMiqAfPheH9ScfnXSaf8a9JuIkhute8MwynAZctKH9htLU+WEtHcXtn3PmjxT8RdbttMm0S1t1jSRAsjSLmQsOpHHANclp2nXmqIGQT3EseRKkIaRiD/ALO4c5r7Wn8T+BfEy+Rq1l4Yu42I3y3EwQL/AN9oK57U/AvwI1e6in0XWtK0a+gf5J9M1BY2B6YxnBH4VrGMUtDFts+S7jw34ss2WSLQdThV8bNls6qyjuQckH8a1fh/B4gv/EE1jZB7a9SB5Db9JJyOiANjnPXJz7V9jeB/A72cDwSeKBr2lLJhXmhDzxkngCQNjAPtWz4w8B6Drlg82p2toJYSrW9yEyykDjft9W78U+XyJ+Z8Y6T8S/FWhG+0bUzLFNMyxzxy5Vo2QbWBXIIOR1r234HR+JtemGqxakzWi8rIzZWU4BKj1IzXB/FHwna6pq0+k6q08PjHTkV/s8kylLyHccsHAyW24wDyO+au+CPH114M+GV5p+nyp8k6y2KuhDQbiQ8Z6AMAFOe4PSuerRgzajWcT6dlVcfNjPfg9aqzxZ6kj6V4z8HfihqPjHxxFpt/cCJpVfapIwWUZKj9a9i1S/htrv7LcgxOFDHPcHnIrhnQs20dcKvMRMBg9eKfC5CY4qKSVB/FwehAzmolfGck9awSsdCd9i60i4GagM+1jlu/FU5rgKetRBw8gPzUuY6IxLZuVd2Uhsj0pEOVyTVfaTLkHFTJGSDw7c9RxVNo1fuqy1OpwacvpS5oUc16sYniyDFKQQKeBTXJ9K1fukxkQuSDk1G0wzipZVLCq0keOagpSJ8ggEUYJFRRngVKOnWgvmZEN3mbduR6g9KdINq5OPQA8frUVyqfLJtbI9D6dTXLeJ/FNrd2c2n6VJBc3avsMTNgnrlgfb071L0M5TMT4x+OB4Y0GYW6eZdH5WeLLCDPA3EDv6cV8iePvE3iOa+dNVF5E8rh184EBj6jt+texP4hiv8AW57C7uNRWQI0UuYGkECDqdm4On4Fx6ivGPH1hf2d9JBPqFrPbbz5Z2PtYN8wIQgqvBHpirppMxm2zj7pp5H/AH0hdlAyWIbj61EjkPxISeuQMZ+tXBpN407Q28ttKwUFgs6gngdFJBP0Aq0lpB9rki1m3vLGRE4EMGSxx1IYj9DXbdJamOpnLchfvIH9yw5qxHql0gURSy8cbfNJwKY+kX8ccU0tnMkMv+rkZCFk7gKaS3stVjCzRWk67VyW8vgA+pxil7sgJ01icTb9sc3oHG/B9cHv9a7bwj4r1WJokk1bR9FtokMm9rOF2c+643Z9hXmjM5kLE9/TFSW001vOJoZGWQZwfQ+uOmcUSoxewuZn014O+O0mkWcMt/4q1HUp4H2R2FnZqImyvVi2TgHAwuOc17R4R+I/iPxXoTXmm6Ta2yK6Rfa9QkPlPnP3FGN/O3v/ABe1fBHh/UpdI1e21KKKKSW2kEkayDcuR0JHt1/Gu2sfij4lh0Gx0W0uXhS1uzcRMzHaTjoRnHUt+dYzjOL0YRsz2345fCjxRZyaj8QB4lj1bUzCWnRlMXl4xho8HAA9Dn3rwmDxLqVzdTwxOZY9UKLdxSLgCVMEumOFYqB27mt3Xvi5q+q6anh/Urye50tXk3yJlHbeMnIyNyhs153qGpWwvIRpgmitYCSBK4Mjt/eIA4Ptzj3pqm+XXco9n+HtvNp+tzeILNEa9t5DKm3BKsQSxPFei+I/iIJbO0udRulmiaV4WuguHVguGR+cbhjIwORXz98P/GFxb+I4DeESWsreUysdg2kEHkd+a7Dxd4a0l4p77SNcitYNRmS5WzuUZI1aNSpcPkgkMT2Ga5nSkrqT3NYytse8eDfETqsSXNwZbd8bWAyCpHBFdrGyyxF0B2kEqfXmvlv4ZeLNTW0/sPWSA0JMdtJuA3beNv6cV778P9da/sFtZgqyQjb97PFefVp8jsdNKqbt3GT0pkIfjqMCrsgU/d5p9vbkjLEY9K5uRnpQqe6RQozNkmoNS0lbycStfzQEKF2q+38cYrVSPZ0FOKvnIyM+wP8AMU0r7h7aUZX6HQUo4pG4pR0Fe2eXIkGMU1jQBkZpKctTOwVHPyMVJUU7KBUjIFUbsc4qRmC8DkDvUTuAAfyqhqd/HZ2kjmWFXCk7WfGT9KG1HctyOc+LviVtB8M3D2/mfaXXbGVHAB6nrXx7408Qa48we3ju4LbzgwkMhIc9gccZPXtXo/xK8RX+o+NmtzdywCV9sXlNtCgdf979Mcdc1j6x8RrCLSodNt9Di1fVLQbLi7uI1lj3DhT8uC3A68Gog/e2MJSIvh7e/EOeCOAacdWgmBk33UgJtkAOXjkEgKr6rnn2rtbb4OJ45+zak0tukMyf6TJZI2VYE5IJkZWPTtXiNr4ytDr82o6ho9jkEqsdu7wshyfmHB5+ua7Ff2gfEtrpI0zT7NbS0SFo41S4+fJwAxOAOMegrdxaeiI5jd8Yfs/6Jpd5CbPxfCkKERtHeptldv4gqlR7dzj1r1vR/AHgrwr4GvrC2vtJg1K+t1dJg+5kZVBz87MRk9duK+XtP+KOsaaTLKU1fUoLhp4b25kLrGzDBUKeo4rE1nx5r+ri5bVbl7yWUKI3c/6kBt3yAcD06dKbhKe4c0T6juPhnrvjTTor/TfHkggjHMZclAudvyIuOT/ebOa5Dxv8CrPw14dvnuPEHiqfIChIrQyRSOO5Ib7uc4xivC/CnjjxFod/ZzW2rXiQwygiMuxQ9+QCM816V4X+M/iLxJ4nttP8Wa1fS6dLNt/0ZzBsGPlGFHPXNV7NxjoTdHkXiLRX0xUmW+trmGV2CsgIcAE/eViCM/jWTLHJEEMiNGJBlNwxuHTjOO9fXvjSH4UeH7iCxXwlqGp32oMLaGczmba+7najEnIwc7QcHI615N8RfAmpX9guq2YuSVINpA9isDTRtvdmUZLfKoXg8k5qo1A5TxyBYDKplLiLPzGMAnHqOaVjGXZId/khj9/qR2zXT6t4S1+ewh1E6LNFAJVspGSHAWU8qrDGVJHqTyamk+HPim1tNQl1HTm01rGNZHiu/wB2zAnHy54NXzLuRZrock6tJIiIhcvwu0ck+mO5pmG3tGziMqPm3ZBX2NdQ/h7V9H0n+0prS2RgY5oXW6XzVB6SBQx+X8M1zNxLNcTPPcyPLJIxZnZuWJ55oT5tii3b29t9hN1/aluky4ItishfHYghSo/Guk0vWrm/0d9MW4mLiIgxkD50JyyKSTXHBJZCv7p3PJJHP41oeGJvK1WI5wxyFYDo3vx6VFZJxu9QizrtMl8NpDHdSXOo294JADFKFKL/ALrgjBH+6a9M8Ha29jq9je2rlLfgSgMWBHqPwrynxVp6iBdZsR5UUxAmjdtpjfOCRzytdP8AD3Uk1DT0sJpIosfKGY9Gxt7e4rz69Lnjzdjem0nY+vrSRJo45kdXSQbhg8/l2rSs9pHIrjPAl4Lvw7Zyo7OAoUtx6deldhYk45rz7s9JaIuhFIJqPYD2qYcLz0NJtbtjFNob1Vma2N3WnBRimjinZr2rHA2OHAxTSOQKNxoByeahiF2moLhe2OT0qZt3UGmTY2o5P3elEQMm6l2tkqSAMKB3NeA/GrxRKuryafG6JMh5fd8wPpj0r33VJ1t7eSUoT5SMSfTjqOK+Pfi54zSXR7+OKKE3V5OV3qFDoo5Jz1zUTXNJIUpaHC+MPFF86T6X59vc290N5LRgyL/wIc5/z6Vyct7MbNbbIEatuGPWqvmJl2cM5bOGzmmKMD0Peu1Qiuhzt3HFuMKAFwBjGR0685pXkZ+HO4enT+VNoQbpAikElsEVYg5bg5bjuaaRjAxwKv6Vp897e/ZIB5kuMkIM7ee9bviDwjc6bBA778z4CZGBnIz+mTSdSN7MXKcoAAqgDGPc0+KRkkV1dlZDlSCcg0sUE0k/kxIZG3bBt7nOP51o3vh3V7O0F3PYzpER94rxnNOc4R0bFr2Ois/iHqZlsUmtbAi2k++qnewJJbJySSScknnNdp8N/iZa6T4v1G6uoJNYnvIf3ct3OrGOUKygg5G0HjPGa8sn8O6zFGrSadchGUlGGTgE1RvLW6s7kwSq0L44G3r0IA/z3rHkpvZj5pH2V418XeE4L7UYVutPMDlZtR/dh4TM7LIuGB+ZgUxn3NdX4a8Y+GfF0WmabLNFewSW6q9tcQxuking7S2Gzkdya+H4nvILO50zDQ2lx5TXJePO3bnB/DpmqVjql5p2oxXdjeMstsf3Ug578EZ6evFT7JrbUr2jPdP2hfA/hXS5Irvw0tnDpzMz+X5IUnHBiDjoM84x1714Dd24tg8TlXlyf4TgHPPNb/ibxrruuwxxX9ypMblw0Y2ncTk96w572eeBklcMrEMRgcmtKcZRV2LmRLpyxpdRzWN8thMF5MxwM/UD+dTTanq9tduYdSnEu/JltrliGx3GD0rPsxavcKLxrjyedzRx7mB7dSKvQ6fpTo4fV5LZ2zgS2rdO2cMf0zVbKzA7ey8Y6tc+EjEZLa8aJl85LqFJDJ1yMsCenPXrVfw7q+dTltn0XS3SeAywuoaNlGCAQVYDOcHpXO6cYdMG5buyvUmAPyFx5ZHBBDKOoNPspkkWGY/KtjLjAOCYNyYxx1GR+tYOOjViou0rs+qvgLrEd5pj2y5UxEZTORjtjPNewxptHGK+avgVei18TrEkoaKSMKD64HBr6Phn8wYDruHWvCn7s2j146xTLaMehxQS2ehpIhlAepqQhvWrjqtRmztFMYYqSmNzXsyPPEFAHNLQcAVACMeOTUMgyhy34U9+TmkZVYcjHFBMmcr45BTwzfsh/eG3k4A54UnP6V8D+O7mSa8CSOzlMqpPYdK+8fiRe+R4fuUgkbcI3DgLkEFT3/Gvgfxu27UWOAMsfu896dFXqamU37pz+OMZ4paQdBQMnIX5mHauwxuxQCQSB05P0yP8a6PwLorate3Nwyn7PZwlnbHViMKPzrFs1fyrtUVWXyC5PXgFScfrXq3whgRvh/r8bSbXl3MrAc8Kwx+e2sqs+SJUSX9nXR1vjqV68RKBwqts+YA84zWl+0XqVvZz2dhBGrOFYlcY2ZUIp/VvyFaX7LylPDGpzOR8155aknqcL/Vq8x+O15Lc/EfUDI7OImWNQewH/wBeuemuas7ly0SNb4A+Hf7a1qLYgfLEnK8IoHX8+le9ap4Kj1LW7TS4h5lsh8+dD9044UfU8muS/Zl0i3srK8vpI3ybWJo2HRgVDY/AnB+ler6brdlaag/m4FzcyZADgnj/AAzXNV96buaxV0VtN8NrEJIF06NYolKszrlCO3HXOK8Yt/BE/jX4r3NxHapHpkNzsCqMbgAemc9MV758S/Ep0rQIrDTcnUtUcWlso+9k8M2PYZJNafwy8PQWd5AFRGEUeRIBjcQuC31PWiKdkOxyPi34T6TLps/l2MLXDRrE3GBtBr5m+MHgA+HrpprO3ZIjncuRhQOmOK++NZh8yLcw4LBj9BXhHx/0+2/4Ry4WaJRPcIRGoGTk5I/lWyk6cromUU9j40kR4jiRTmmbhjFeveKvh3IuhxX8JcOsZZ02ZBA7j0ryOX5ZCMDHrXbTq+00Rg4uO5GQpIyqtjpkZqaG7uIopIkk+SQYZSAQfw6VDQe+N3GOdveravuK45SQM7CSTydoxj9Ku+dI2AsjuAqg5OAOR3zgDgVWhZ7acgqiN0IljVgPwOa257+0jtY4H0/Rb18gCVI3jYjGSDjaM5qW+luhR6/8CYpn8QWqMULRpmQhsggdwe9fSVpIEkx6141+zwLK+c3MGlpbmGAIGBznI5r2Cf5ZRsH4183i5fvGz2KGsVc6WxdTHip2IJzk1j6fM4QAjPHWr4YlVIbqP7tTTqaGig5u0Vf5nR0mBSnrRX0NjzRoAwaY9S1GwyaiSQDFG44NNfJLL1AGKkRcGo5GWIvIx+UdeKz5iZHK+PsJ4XvFETyyOhRI1XJdiOBjuK+CfiHZzWWry291G0E0b7XjcYI9vavsz4peMZ9KL6fpcqi8nVh5o5MS98ehr47+JjSDXpXkkMspbczMS24nuc06Mk6uhlI44ZztBBP8q0dEtUutShhe5it+eJJQdmf7pI9a6D4SeGj4p8XwWrrm3TLy46Yr6D8RfBLRdX0RUsNmn6lGA0UiZ2MfQjpW9Wuoy5SOU+bNVsbzRdadbq0W1jmR0/dguhR1I+U9+uRXQ/DXxFHpE11pV0d0Nzu8t3O0DOOTn6fqa9b0LQblrWbwf430Ylrf5Ip1UFJV6ZU9Qfxrn/E/wAv0AufDVyZEYHZC4ywHpmsPaKekh8jWxmfBbXrXw1ruq+GdUuY44bh/Ot5ncBS4Jxg+4P5iuf8A2hLJIviAbuJojDfWyTJJG+5WwNpI98jmprzwF4sCpb6poeoCeLhbiFRJtGeMjrgV0+r/AAk8dan4WsUE1pqVtagtDE6lJUB5KH8T09acLRqeoSvYo+FPinDongWCxi01zOdibomGdqDDFgR3PP41X8N+LT4l8c215q959h0+0Q+RDnGWzkliPyrg38K+IItVOlXFnLa3DA5E3yLgcEgnr+HWn2ely2uprYRW0txfvIB5cY4zv+7n/wCtRKnCzY1KV7H0t8NY7jxh40bxPfLJHFFCy6ZETny4DkFv95j39K+g/DEKpNIQW+ZQuTjtwa8Z8Px6lpWg2VkqeVrNyi4gjAAjUYO3P90dx1r0XStVXTrTzNQvYoNiKhLyABsDkiueOm5sdZrFyqoYwm4EbSRxjHJP0xXh+tyt408ZrFYEyWFvJgvjIkIBBUHpwOa6DVfEd14qebTtEd00kN5V5qZBXcP7kK9z2zyKZd3+i+CdEa6vkSyZUEdhZxtmQnptRcZZieSaH770A4b4/SxaX4UktbBTJf3r/ZrGNDlmTozAegr5T8Q6bcaVeiyuE2uo5JGM19f+HfDWq+JPEM/inxSiwMqFNOs8g/ZYzzkn+8RjI9a82/aB8JW93bz3dqI4Z7blTj/WjuB71rSqxhJJIzmmz52xnnpmm9sY4znrTmJDEYxg96Yc13mdhzO8jM0jF3P8TcmrVjE1xLHEFGA3PHrj/CqgHT3Nd18O9BbUb1QhXGAzA9xWdWfLTbCCcpJH0T+znYLaaK06KymRcse2c16y0BL56/XvXMfC/Tvs2jbYQqKGKhP0rstpUbSp44ya+aqe83Jnt0lbQLeMKvpUuFwAOg96hJwMZpplK8Bc1PPbZFOF3c6+iimknNfRSlY8oCTmkJ5opByazcyhW5B9R1rm/F+siys7obvLSGIneTkMewxWxrt6un6ZNcspZgAiKOrM3AFed+OLUwaPDbTyNLeX0irLj+FepA+lY1JWElfc88sEuNc1Se4uJWDHLsuBnrxjivEfjppEtv4iurtVCxCZY/lQgHCg/wBa9juLtrHxbFJYSK27CIu7GBjAU15p8YpNdvtQuLe/RYlizI4Qg8epxx/Klh5cs7k1InX/ALIHh4SWV7qzRg+bMIkJH8Ir6RjtzBGyvFKxPKqAMmuE/Zh0JdP+G+mSOVDzbpfu4OSa9cS1RDnJJ9TmnOXPK4RseReNtb122uxFa+CJ723jzmYuo2jPXpms7R/ito9rPHbazo1xYxb9hk8sFY/XPoPevd4baAxciPJPzHrWdqHhnw7qUckd5YWbs2dwMQ+b9KOVvUV7bFHwxe+HfENil1pt1a3UBBA8txjn3Fbi6TbBFCp1HVeMV4r4l+FNxoN+dY8BanNo90hLeSpxFJk9CvStf4ZfE3XBqH9geNdMlt7mOTy1vEGI5D0/Wn1uVud5rvg7R9W8t72wgmkQ7o5GQFlPqCeRXFav8G/DM32qSG1Ntc3DFjPG2HDHryBkc817DCyyICQDmho1K89qfLdEuR8v+JPhh480u6JsPFOr3VqgwphjVpVB6jcSpPHFZFp4S16xuEc6J4j8QXAkUp/aGRGnHXAb+tfWbwI4G4qB7saie1iVuFRh2wcUuQo+eNPsPjDqs6QzjTfD9oCdskcReRFP91ckA49a6rQPh1YabqKazqs95rGpDH+n6hyV4xiNB8q5+letlII0PygkdsjrWFrTTyB/LdI88FupHv1otbQLowtSmt7W2Z2aKCJRzuQAkf1r54+OuvmHRiqRjzZpDHaQLyQD1Y16R8SPF2heHSba7nl1XUpOLe2iIeR2J6hR0GfXNcx4a8E3ms6lL4z8cQwxyBQdP07dxAMcFh3P41CVnzdgnrsfJt9bzWs3lzgh8ZORz+VRgcd69M+OOhNHrkmp42CV/ugY+X1+teaDpXpU6ntFexzje4+teq/BiMya5ZqH27uCa8qUEyhe2a9f+CVo0+tW6KwUqA2TWONlaibYVfvT6y8PQG1tYIgoH8RYd60ppGzgsW9MVBYEx2sY4bCAc/SiVlOAMrgdBXhtK1j1IMeX44oCswzvxVXzWDfdzUU7IX+aYofQMKwab2N46u3Ml6noVMPWn0mBX0Ejx4jaVRzQRyBQfl6deoqLDloc/r0jz69a2ilWEcbTBcH7w4Ga4T4j3VzN4ki0+wJLRW7+ZJ12Fz1+tdrFeomoapqcn3Y08qIY56kcfiK53whpNxc+I9Yur9T57FMZ7EjdiueScpWBHF6/4EvI9FS7jczOhEz/ACc5/wADXnHxF0OV9LvLouY4ZI8yr0ycDj8K+lfEl8bbR7nz8RvDEQUI+/6frXk/jGN9W+GMd39n8tzG7SKByXyQP5UOLWwm77nqXwNtwnw50D5Rg2aN09cV6PJblrcgE5xXB/A1HPgXSYpPvQQeU31VsH+Vekog2d63pQ0IbSPGvjLp3jO60Ge30C7+yMTxIoIb9K8O8Z+BvEmhfC2bxPqmv63earFKglRbhvkDHkgD/Gvs2/gWaIoy5z1NYWq6DZ31nLaPGpgmG2WJ+UYU7NbiPkT4e+LfF9t490vw54d1vWrq2umKS22qsk0eAudwIOQvbmvpDSY7XV4Rc3FgkM8Um2eJh9yQdhVnwz8OfDvheSa60TTrWxuZNymXyy52nsCScCtvR9DeCe7leWOQ3DiQBVIGcYNZzu3oXbzNnTQq26AAgAAY9KsSsqA5PFLaQ7UZccZqjrMhjiIyOelaaxjqZpamb4j1mWxtJWslWSVVyqlh8x9K8D8V/Eb4tTai9va6dZ6dBkhHkIJIB+tev6r5MNu93eSlYx0yuRn0Hqa8s+I/iXUdC1mzso/DumSTXUT3Mcd9eeU/lLjJ9ATnpUKXNsjRrzOJ1Xxt8Z4o1aG5S4LdFt4C7H8s1k3vif43X9lLby6fdw7lJeVocHHt6GvQ/CPxm8Lzyz2uqeH73RLi35meFhc24JPGWTp9cV6jpus6Bq1tFcWt1bXMEw/dvE+8N+HBoXMt0RyvufPPwHXTodSnm1jSL1vETvh7y7jyBnsrEYGTXtf2Oa6iE+otEIkyEt06D3z3rbuLfTYlfbDGqYGVAGcgda4rxZrupW1sLbSrETSZ+XeCf5cVm3c0SPMP2gdPtJvD895KSjwtkNjG70FfNRjYMFVeo4Fev/HPUPEYjgi1m4CiY5FuoxjHr1rzHSJY1u0nnQsituKdyc8fhXdh21C72MJ6vQpWsD/aVDqVNfRPwF0JjbxXrqMklQfYYP8AWvHZbZpSl+YNnmzMP9knrhR7V9JfBaKOLw7aKeBliG7H/OK5sbO9NJG2FVpNs9YR9kKgAN8oxTA7ls7cZ9arhmDAAlQeBmh2kRmBcnnrjIrzJbHqwSJXzngmkIkJzvYfQ0yJj/Fg/Tmnb6i1jVe7oj0GiiivbkePEbyWp4Xhh6kD6DFICBTgwySfSoEzjZoDPq402NgN84mkUf3QWP8AOtvTIVj1XUmAIM0kb57gbAOPyNVESGHx0WOQ89ngHsG3H+ma02Ii1ME4Bmt//QGz/Jj+VRFasTZk+OLH7folzG6qcwk5PUH2rl/haNO1fwtHpd2ElntiyTROOvUAgdT1rvNXjE1lMh6BcHH0r5W+Mkt/4Xv5NV0m8m0+62mRGifaWAODSfRAmlufUvgnTjpLXNiMeXHKSgB5wea7Nc9DXgH7HfivXPFngy+uvEF+99c298YUmcfMyhFPJ79TXv8AHjArpp+62jKQki8cVA0CsSWXOat4oIGKvkuK5T+xoQAQcfWpBGETavAqcsAOtRl81HKguIgIU8CsfUE8y5I2g4NbMjBYicGqES+ZOXPc1M/eViomRq+iW13PbySs8ckIIj7pz3IOea85+O/wxm8bWlreQXUEWpWkTwh3jLo8bdmGeOle0um45NQzQnbt6r1wQCKzs47DZ8v+B/h3pfgvQtYS6ZL/AFfUoikhjhYxIoHCqPasz4M+BNY0m+nuhcTRWs0x2wH+EZ6gdq+oL3TvPBGBg9QAOf0osNMt4MHygGUYzgVDjJ7hdHNw6SyrskUqgX86xdZihtYJNkagEkEV3ursFiORwBXkfxM12HR9Ev76YsscXQ+5HApqKZalofKfx51NtX8fzwQn93akQqOwauLs7N9plO1Qq5Yu/DEHkV0ttY3GpX01xcxb5LyVnnUjLIOxGOnfrXP6/E0Nz9gikea1hJMYKgEfj3rpptNcqZz63udQkk2vTWs2nWjLY2irbQr3Z8Fif0/KvoH4NzKuiDT3UqYGc7T3GcV458IrN0nt45CzgE3QHbONuPrzXtmiRjS9RhZEjLRMS4BxkE8j8687GVEpcp6GFhdXZ3DljuUcY7HtRFLIAAXJGOhp0jCVxMo2bxnafekRBjvXHc9JRSHmQv1AGPTinDpSDA/hNSADGaQz0M8Cm7jSnJpuDXuSieIh2M0hUnHNOHSjHvUcoXRlXlsJryS4QfvIHXB9tuW/9CNJqb7fsV4pykc65P8AsPlCD9Nw/Kr8KgTT5/iYE/y/pVW/tkNvPasxWK4VgD/zzJHX8Oo9wKlRa3AsTASQghgNy4Ix19a+Tv2trSa211LnzCYLiH92hP3MHnA9x+tfU8F4W0uO4kGCyAsB/CRwwr46/ae1w6z4xuBu3R2yCOIDtg1UUpSIkewfsHAf8K31Fu/9qsRj08uOvpaIdBntXy9+wNeCTwPrlmcmSK/Ehz6NGP6rX0/EwGADkAYzWra5miHsiemtnBNDOO1RSMzZUemacp22AYzM2dvUUW+WJz1rD1vxBFo9q80trPMqEBhEu449cVoaJq1nf2iXVvJuSQZGRgj6jtWTkrj5S5fErCfmxVWzZSuNxyaZrF0ghI3KSRnhqpgvHHGc/NkdKiUrPQ0gtDdCHA5NO2EikgfegJ9KezYrWOu5ncidKjcYQk9KlZz2Ws/U7kQ2zluOKUmkEY3Od8XX6QRsRJgbe/tXzN8WLy58U6vbaVaQyzWaz5uCM7S2eAeeleteO9Slv70adZq7yzHGFHIHrWRc6Fp+kaVmQD7QPnZs53N9B1rjqzZtFI8f8T6W+h3B06zU77jbC1wmCRgcg57ZYV5brdpdXl9HcPbqlsSI4sKBlfu5/IV7p4w0ue9uVEMWTFbSSvvX5tw5zg/UflXI+O7G2zZm1jXZDMqhVGB0zioo4hRlZroNUeZ6Gj8H9HkjedpMKVbC57bRxXq8NoRfxlsOeD25+tcz8MNMkg0Q3lz96YswHpXZ6ZbiXMjNGjE9yc159eo5Tuz1MPCMI2sapxu/eHkfpTg4GcdKgmhe3+/IrZ9KRZFyFPeiMzflLisOMk/hUoHHHSoIhnn0p7y7cDa3I9aq5Em4xPR6B0NGaCcCvojxrCUmPc0tIDk1BMkMKYkyO45pt15Lxukh+U8MevGMYqbJ3AccferjPHWsyxGW0hZlSOL9668HJ6AVnOVtwimzkfE/iqTTbbULBZebWZhgnDSByTx75P5V8n/EieeTV7gzkpJI5bBOT16V7F4/1WUSXFzcbhMoAVTglGHf3rwbxZcb3aWWbdI5JOPXvU4a8pNoVXRHtv7BuurZ+M9Y0GZz/p1ss0Y9TGWz+hP5V9rRAAHHY4P1r82f2bNZTQ/jN4dvZJCkMl0bc5PXzFKDPtlq/SS3YHkd+1dEkua/czH5VWALc/SnFDglXAPuKivftHlHyFDSAcbuBXB674017w9cSnUdDe7tV5ElmxdlHuDj9KzlK26HynZXNmkzbuA3Q471z+o6dNabxZLtDn7qnGDXNaT8cPBl9qAsJpZ7K8Jx5VxEUJ/Ou5tdU0jUIFu47uIxnsXwaiUYPVFRbOH1fQ9d1EMr6pdWeenkgAj8SDW9oFlqEcUNrcTzXJjxmRyMt7nAroibaZCY3Ei9trDj9aW2BQFsHI6GoUU9yy7CdqhR0xT2IxyagWTAUkjkZqO6uFC/eGK0UrE8ot1OVU/NgAcVx/ibUm+yyfMe/PYVo6nfZDKuSOmRXl/xg8RxaH4P1G+L8RRE47lsYFRJ3nZFR0Wp84/Gb4iavF8QNugalPafYGKkxtjL9SD2OB7da9Y8BanreteH9M1HXnuZrqVC26RBtPJ5G0AV8l3c817ezTXEhkmmfc7Fhnc3WvrL4EXn2jwzb6Zql4FlCfuw3I+Xpj2NPGRjGCtuFFubOjETT61cSzrulkVAWP8AdIryrX4pJbyDT2jKuLngn+JQoGf0r1q8ePTtVDwM7JKMHnIyvauElH9qeNQFQeXFkk45GTXituLd9zup0tbnb6PCI7a3tgoXy4xuHqcc1qqFXB5x9TxVW3dCGk435qzGC4yxxk1ztOR2xRK21wvzMWPXJpyptlYHkDoaZ5bAlgDwePepISSdxHJrWMTcsxfKmSTzyKq3JTzAX35I7EepqzGflIqKR23YBAA9WrRK4oKLdppv0PUuKa+KSkIzX0FzwrDlbtSjHUHNR4IGeaq3d4kaERjJzhyG+7UykZNMmurmKBGkkkCbQeo9q8g1vVGeO61BsyJK33SOVH516JqiM1pPc3Mv7uNC3l/h1J7184ePPFeyB7a0mCMNxZio+bmuapeTsXHRanK/E3VkaQiGQGNN2c/ePsa8Z1edJbpmP3WP5VseKtUe7dg0rHJPFc02C2fyruw9NQic05NlqG7eDUYbq3YxyRsroy8bSD1Hv0r9L/gt4stvGfgDStbhYb5IQlwM/clUYcfnX5i5ySDyO3tyP8K+vP2D/EJj03WtHkkJWOZJ9uegYAEj8qdZLdDifWqgFcnByOtZms2aTICQxHcE5H5VoxvuTPGcAjHSldd67SMispe+XGVtzhtf8B+FvEtuyavpMEsg6Tqm1wfr1rzvWPgbPFKZ/D/iu/slX7kLyFl9uDXt15YnO+PKnOeDWdcx3u1/9Xz221hKNuhUYo8Cl8L/ABV8M3v2q08T212ijm3lXAI/Cux8E+MvGk8iQan4fXg4eWO4yv1xiuxm0e4uZcu6Lnrha1NO023skwsYLYwSSeazsx28yxZXDXJBIK+3pTdRwqMCeM1ZQxQRk4A4zWBrWortIyBz+Y71TlYDP1S5SGBiZCFwTwPSvkr9pTx0mr33/CN6ZN5kMEn+kFDkO/8Ad9wK779oP4mzaPYnRtFkJu7nKmVTwi9yPevnr4fNYS+KY5tTdHJDbPNJ2lyMEk9zWtKHuOo+hLabszqPAvw4m1LT47m5j2qh+YHqR2Neo6T4YbS4AkB3yRAbDGxB/GtnwgLmWygMMcYZVCZXuAMDnoa2Ly0vbiQeYBE+AdyLg/U14+Ir1KnvM78PGK2LQvobrw1Mktt5N3AnCkcsRwGGayvCllHHDPctHm6uPvK3Va2Le0eNQJiLjYMb+9WjGGKsi4kPJIHb3rllNz23OpabDLeMRLtdRkVcjmXaAqIPfFQMnOaF2k8ZBpwTW5rEsySsTjOPpTkchgFxUAUlgKngjIY5q43NbMsZwPvDmoXVHbLDJqVkXHJGaj2VpZMLHqHFNdsAnp7mlxVe4Uu+NxCjqK9y54ZBLJLNIyRu0aY5Yd/X8KyL3XtKsEaP7QjOhAVI13Nz+FWNekmGkXH2eQRhsRqcdM03SdLsNOswsSqSMB5H5ZzjkmspMg5Pxzrlt/Y80s969pbohAjaIoGP1PWvkPx3rQub6aUnkscBTkV7d+0X4sWW/fR4thigQjdjv+FfM+sSyXUzF27c49v61dCm5PUyqTs7GVdF2cFzliTmmSRPGAXxyKkuRhlcElSAT6io5JDLIpbOK7ttDBsjGc8V7j+x5qzaf8S2tWJ2XdqwIHcqQR+ma8PBw/1rsPg/rP8AYXxH0bUXkZYVuRHJj+64K/1qasfdHB6n6U6VeokSxzvtzyrH1PatlWVlyBxXJ2DLNbR5wc9fQ+9T/brjT1ACmaBewPIrhhPl3N3G+x0rEnjio3BPrWDD4osZRyxRs8g9qc3iC0JOycHHrV+0TBQaNOcKBwvNU5HVF3k5weax73xHAFyZVHt3rmNa8R3MyOlqmEOcuTWUporkN3xDrdtBHLmRQ38Irxzx/wCMZkhkgtWMa7W8yQfwqOTitLVHmcGSaVjjJyTXivxUvLy9uI9H0pZGedyjOq5yO9YpqUvIHorHGRWOo/EPxjL5YdbC3OJHCnCR54P1NWPF3g3+ztZRbGNxbMAFAP3SK9t+HvhFfDHhqK2ji3vPFuuZB94k9vpVrUdBjuJyDET3ANaOq0rIh077mb+z7eXGgSeRqoNzptxHwkg3bW9j1Fe4xaL4Y1tfO0+5aCVlA2qcfnmuF8K6BGkC7UC4x8vocV12m+HxG2+Lcp9QcZrKyl8RtFuOw+78EX1uN1tKk6j0HNY15puo2T7pIZVx3IyDXoejrqFtCqmXco4CnsK1mjWZNs0O4nuRWf1OP2WbQxLW54y6kkl+GJ6YxTTGVGduK9U1Dw9aXOcxLn1ArCvvCoBIjkK+gIzUTwklsdNPERluzheQ3NWY2bpUnibTtT0mNplsJbpAM/uuSK5G38bWC4+1QS2x37dsi8is/Yyjudaqrozryc4yBSkH2qK2miuY0mikDxPyrjofSn5/2qiSZXPZ2Z6YTgcdaguSfkjB5Y5NSKTmqlySNRtznqDx+NeupWPDuGqCH+z5YpGwpHGByPeuM1rxHa6XYyz3cqpAnUE/MeO1aPiu9uIrctG+3AxxXzX8TNZvbjWLi3nZXj5G059evWsXN1JWWhN9Dj/iHrSatq19djcI5ZCVBPQdK8/u9rS9ep6j0q/rs0gkmj3ZGcc+1YMsjbnOcYC/qATXpUafLG9zmer1FuwFVAO5OajtlMkkakoCT3NXdUt0W58kFtoCn35FU7Mb7tVPRcEcCqTugsS31k0UoQHkD5qhhZ4pEkBIYEEY45FW7id7nUDvAXquF9qpu7MQWOcNxVK842YLQ/Qf4DeKI/Enw80u/Zw00cCwzc5+dRg5/KvQruISQsgHUYyO9fJf7Geq3kTX+nLJm3yHCnPB4FfW8bGSJieMHt3rzpK0mmdCdjjLq3a0vfmwEJIAFNuIQVDkLnoQOlb+u20TMSQfWqccMbQAkZ4zWOpVzDltIiOQGJ6e1Ur6BIkBI3NzgeldBcRJ2UAn0rKnAMjKR93ODStcLnJ36PdQyIFOSMY9Ky/CPg+FtabUZEEjRgiPJ6MetdmESNCQgJcHJP41u6DawQWa+WgyyhyT1yRk1KgmJq+pQis5YLVImtSQRgvn2qkbMGdTs3ZOM4rqJhsRuScZAzUVtEnljIyeuTVWHcg0Wx8uQg/dzXY6XbLtBwKw7BV8zpXT6ZgKo2jpmqitbEyZeit41UALUvlgDufrT0p7dK7FBIybZWMeewqOaImMjZuAGePWrSqCx5PArlvidql1ovgXWtUsSq3NtYSyRlgcBgOD1q0rhc8W/aH+N1j4Sv5PDmgFZtSGVupgMrEMZAHNeF6V8TLTUrgnV4RO8hGCy9T3+leR6vqF5qOoTXV7cPNPLI0ryMcks3U1UhleO6+U9QCfeieGVWOpVOvKJ9ieDvEekLbpHHdxxQkZVGfpmuvS8sJVDx3cTKe5PWviqw1nUAvn+dlk4HpVs+K9ebkahKg6BVOBXDPCci1OmOP5p8tuh//Z"
   end
index 61df41a1d56772c014e66c2369130463cba6c6e2..969b2a854cf193f5880b83b189ad5240045f2662 100644 (file)
@@ -2,7 +2,8 @@ defmodule Pleroma.Web.OStatus.ActivityRepresenterTest do
   use Pleroma.DataCase
 
   alias Pleroma.Web.OStatus.ActivityRepresenter
-  alias Pleroma.{User, Activity}
+  alias Pleroma.{User, Activity, Object}
+  alias Pleroma.Web.ActivityPub.ActivityPub
 
   import Pleroma.Factory
 
@@ -23,6 +24,10 @@ defmodule Pleroma.Web.OStatus.ActivityRepresenterTest do
     <content type="html">#{note_activity.data["object"]["content"]}</content>
     <published>#{inserted_at}</published>
     <updated>#{updated_at}</updated>
+    <ostatus:conversation>#{note_activity.data["context"]}</ostatus:conversation>
+    <link href="#{note_activity.data["context"]}" rel="ostatus:conversation" />
+    <link type="application/atom+xml" href="#{note_activity.data["object"]["id"]}" rel="self" />
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
     """
 
     tuple = ActivityRepresenter.to_simple_form(note_activity, user)
@@ -32,6 +37,206 @@ defmodule Pleroma.Web.OStatus.ActivityRepresenterTest do
     assert clean(res) == clean(expected)
   end
 
+  test "a reply note" do
+    note = insert(:note_activity)
+    answer = insert(:note_activity)
+    object = answer.data["object"]
+    object = Map.put(object, "inReplyTo", note.data["object"]["id"])
+
+    data = %{answer.data | "object" => object}
+    answer = %{answer | data: data}
+
+    updated_at = answer.updated_at
+    |> NaiveDateTime.to_iso8601
+    inserted_at = answer.inserted_at
+    |> NaiveDateTime.to_iso8601
+
+    user = User.get_cached_by_ap_id(answer.data["actor"])
+
+    expected = """
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <id>#{answer.data["object"]["id"]}</id>
+    <title>New note by #{user.nickname}</title>
+    <content type="html">#{answer.data["object"]["content"]}</content>
+    <published>#{inserted_at}</published>
+    <updated>#{updated_at}</updated>
+    <ostatus:conversation>#{answer.data["context"]}</ostatus:conversation>
+    <link href="#{answer.data["context"]}" rel="ostatus:conversation" />
+    <link type="application/atom+xml" href="#{answer.data["object"]["id"]}" rel="self" />
+    <thr:in-reply-to ref="#{note.data["object"]["id"]}" />
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+    """
+
+    tuple = ActivityRepresenter.to_simple_form(answer, user)
+
+    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> IO.iodata_to_binary
+
+    assert clean(res) == clean(expected)
+  end
+
+  test "an announce activity" do
+    note = insert(:note_activity)
+    user = insert(:user)
+    object = Object.get_cached_by_ap_id(note.data["object"]["id"])
+
+    {:ok, announce, object} = ActivityPub.announce(user, object)
+
+    announce = Repo.get(Activity, announce.id)
+
+    note_user = User.get_cached_by_ap_id(note.data["actor"])
+    note = Repo.get(Activity, note.id)
+    note_xml = ActivityRepresenter.to_simple_form(note, note_user, true)
+    |> :xmerl.export_simple_content(:xmerl_xml)
+    |> to_string
+
+    updated_at = announce.updated_at
+    |> NaiveDateTime.to_iso8601
+    inserted_at = announce.inserted_at
+    |> NaiveDateTime.to_iso8601
+
+    expected = """
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
+    <id>#{announce.data["id"]}</id>
+    <title>#{user.nickname} repeated a notice</title>
+    <content type="html">RT #{note.data["object"]["content"]}</content>
+    <published>#{inserted_at}</published>
+    <updated>#{updated_at}</updated>
+    <ostatus:conversation>#{announce.data["context"]}</ostatus:conversation>
+    <link href="#{announce.data["context"]}" rel="ostatus:conversation" />
+    <link rel="self" type="application/atom+xml" href="#{announce.data["id"]}"/>
+    <activity:object>
+      #{note_xml}
+    </activity:object>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="#{note.data["actor"]}"/>
+    """
+
+    announce_xml = ActivityRepresenter.to_simple_form(announce, user)
+    |> :xmerl.export_simple_content(:xmerl_xml)
+    |> to_string
+
+    assert clean(expected) == clean(announce_xml)
+  end
+
+  test "a like activity" do
+    note = insert(:note)
+    user = insert(:user)
+    {:ok, like, _note} = ActivityPub.like(user, note)
+
+    # TODO: Are these the correct dates?
+    updated_at = like.updated_at
+    |> NaiveDateTime.to_iso8601
+    inserted_at = like.inserted_at
+    |> NaiveDateTime.to_iso8601
+
+    tuple = ActivityRepresenter.to_simple_form(like, user)
+    refute is_nil(tuple)
+
+    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> IO.iodata_to_binary
+
+    expected = """
+    <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
+    <id>#{like.data["id"]}</id>
+    <title>New favorite by #{user.nickname}</title>
+    <content type="html">#{user.nickname} favorited something</content>
+    <published>#{inserted_at}</published>
+    <updated>#{updated_at}</updated>
+    <activity:object>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+      <id>#{note.data["id"]}</id>
+    </activity:object>
+    <ostatus:conversation>#{like.data["context"]}</ostatus:conversation>
+    <link href="#{like.data["context"]}" rel="ostatus:conversation" />
+    <link rel="self" type="application/atom+xml" href="#{like.data["id"]}"/>
+    <thr:in-reply-to ref="#{note.data["id"]}" />
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="#{note.data["actor"]}"/>
+    """
+
+    assert clean(res) == clean(expected)
+  end
+
+  test "a follow activity" do
+    follower = insert(:user)
+    followed = insert(:user)
+    {:ok, activity} = ActivityPub.insert(%{
+          "type" => "Follow",
+          "actor" => follower.ap_id,
+          "object" => followed.ap_id,
+          "to" => [followed.ap_id]
+    })
+
+
+    # TODO: Are these the correct dates?
+    updated_at = activity.updated_at
+    |> NaiveDateTime.to_iso8601
+    inserted_at = activity.inserted_at
+    |> NaiveDateTime.to_iso8601
+
+    tuple = ActivityRepresenter.to_simple_form(activity, follower)
+
+    refute is_nil(tuple)
+
+    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> IO.iodata_to_binary
+
+    expected = """
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/follow</activity:verb>
+    <id>#{activity.data["id"]}</id>
+    <title>#{follower.nickname} started following #{activity.data["object"]}</title>
+    <content type="html"> #{follower.nickname} started following #{activity.data["object"]}</content>
+    <published>#{inserted_at}</published>
+    <updated>#{updated_at}</updated>
+    <activity:object>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+      <id>#{activity.data["object"]}</id>
+      <uri>#{activity.data["object"]}</uri>
+    </activity:object>
+    <link rel="self" type="application/atom+xml" href="#{activity.data["id"]}"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="#{activity.data["object"]}"/>
+    """
+
+    assert clean(res) == clean(expected)
+  end
+
+  test "an unfollow activity" do
+    follower = insert(:user)
+    followed = insert(:user)
+    {:ok, _activity} = ActivityPub.follow(follower, followed)
+    {:ok, activity} = ActivityPub.unfollow(follower, followed)
+
+    # TODO: Are these the correct dates?
+    updated_at = activity.updated_at
+    |> NaiveDateTime.to_iso8601
+    inserted_at = activity.inserted_at
+    |> NaiveDateTime.to_iso8601
+
+    tuple = ActivityRepresenter.to_simple_form(activity, follower)
+
+    refute is_nil(tuple)
+
+    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> IO.iodata_to_binary
+
+    expected = """
+    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/unfollow</activity:verb>
+    <id>#{activity.data["id"]}</id>
+    <title>#{follower.nickname} stopped following #{followed.ap_id}</title>
+    <content type="html"> #{follower.nickname} stopped following #{followed.ap_id}</content>
+    <published>#{inserted_at}</published>
+    <updated>#{updated_at}</updated>
+    <activity:object>
+      <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+      <id>#{followed.ap_id}</id>
+      <uri>#{followed.ap_id}</uri>
+    </activity:object>
+    <link rel="self" type="application/atom+xml" href="#{activity.data["id"]}"/>
+    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="#{followed.ap_id}"/>
+    """
+
+    assert clean(res) == clean(expected)
+  end
+
   test "an unknown activity" do
     tuple = ActivityRepresenter.to_simple_form(%Activity{}, nil)
     assert is_nil(tuple)
index 9a02d8c16cae22ca3be501aa824fdf14ddc9416a..df5a964e26b9fd7f7d2f8f030f2347a45c10fc40 100644 (file)
@@ -22,12 +22,13 @@ defmodule Pleroma.Web.OStatus.FeedRepresenterTest do
     |> :xmerl.export_simple_content(:xmerl_xml)
 
     expected = """
-    <feed xmlns="http://www.w3.org/2005/Atom" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0">
+    <feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0">
       <id>#{OStatus.feed_path(user)}</id>
       <title>#{user.nickname}'s timeline</title>
       <updated>#{most_recent_update}</updated>
       <link rel="hub" href="#{OStatus.pubsub_path(user)}" />
-      <link rel="self" href="#{OStatus.feed_path(user)}" />
+      <link rel="salmon" href="#{OStatus.salmon_path(user)}" />
+      <link rel="self" href="#{OStatus.feed_path(user)}" type="application/atom+xml" />
       <author>
         #{user_xml}
       </author>
index 229cd9b1e1c214980eafdb8b00f4e6e4df8ce7bd..8b7ca4d8933dcbbe5191ebf6d98672a79a7637a8 100644 (file)
@@ -12,4 +12,15 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
 
     assert response(conn, 200)
   end
+
+  test "gets an object", %{conn: conn} do
+    note_activity = insert(:note_activity)
+    [_, uuid] = hd Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["object"]["id"])
+    url = "/objects/#{uuid}"
+
+    conn = conn
+    |> get(url)
+
+    assert response(conn, 200)
+  end
 end
diff --git a/test/web/ostatus/ostatus_test.exs b/test/web/ostatus/ostatus_test.exs
new file mode 100644 (file)
index 0000000..41e1c34
--- /dev/null
@@ -0,0 +1,242 @@
+defmodule Pleroma.Web.OStatusTest do
+  use Pleroma.DataCase
+  alias Pleroma.Web.OStatus
+  alias Pleroma.Web.XML
+  alias Pleroma.{Object, Repo, User}
+  import Pleroma.Factory
+
+  test "don't insert create notes twice" do
+    incoming = File.read!("test/fixtures/incoming_note_activity.xml")
+    {:ok, [_activity]} = OStatus.handle_incoming(incoming)
+    assert {:ok, [{:error, "duplicate activity"}]} == OStatus.handle_incoming(incoming)
+  end
+
+  test "handle incoming note - GS, Salmon" do
+    incoming = File.read!("test/fixtures/incoming_note_activity.xml")
+    {:ok, [activity]} = OStatus.handle_incoming(incoming)
+
+    assert activity.data["type"] == "Create"
+    assert activity.data["object"]["type"] == "Note"
+    assert activity.data["object"]["id"] == "tag:gs.example.org:4040,2017-04-23:noticeId=29:objectType=note"
+    assert activity.data["published"] == "2017-04-23T14:51:03+00:00"
+    assert activity.data["context"] == "tag:gs.example.org:4040,2017-04-23:objectType=thread:nonce=f09e22f58abd5c7b"
+    assert "http://pleroma.example.org:4000/users/lain3" in activity.data["to"]
+    assert activity.local == false
+  end
+
+  test "handle incoming notes - GS, subscription" do
+    incoming = File.read!("test/fixtures/ostatus_incoming_post.xml")
+    {:ok, [activity]} = OStatus.handle_incoming(incoming)
+
+    assert activity.data["type"] == "Create"
+    assert activity.data["object"]["type"] == "Note"
+    assert activity.data["object"]["actor"] == "https://social.heldscal.la/user/23211"
+    assert activity.data["object"]["content"] == "Will it blend?"
+    user = User.get_cached_by_ap_id(activity.data["actor"])
+    assert User.ap_followers(user) in activity.data["to"]
+  end
+
+  test "handle incoming notes with attachments - GS, subscription" do
+    incoming = File.read!("test/fixtures/incoming_websub_gnusocial_attachments.xml")
+    {:ok, [activity]} = OStatus.handle_incoming(incoming)
+
+    assert activity.data["type"] == "Create"
+    assert activity.data["object"]["type"] == "Note"
+    assert activity.data["object"]["actor"] == "https://social.heldscal.la/user/23211"
+    assert activity.data["object"]["attachment"] |> length == 2
+  end
+
+  test "handle incoming notes - Mastodon, salmon, reply" do
+    # It uses the context of the replied to object
+    Repo.insert!(%Object{
+          data: %{
+            "id" => "https://pleroma.soykaf.com/objects/c237d966-ac75-4fe3-a87a-d89d71a3a7a4",
+            "context" => "2hu"
+          }})
+    incoming = File.read!("test/fixtures/incoming_reply_mastodon.xml")
+    {:ok, [activity]} = OStatus.handle_incoming(incoming)
+
+    assert activity.data["type"] == "Create"
+    assert activity.data["object"]["type"] == "Note"
+    assert activity.data["object"]["actor"] == "https://mastodon.social/users/lambadalambda"
+    assert activity.data["context"] == "2hu"
+  end
+
+  test "handle incoming notes - GS, subscription, reply" do
+    incoming = File.read!("test/fixtures/ostatus_incoming_reply.xml")
+    {:ok, [activity]} = OStatus.handle_incoming(incoming)
+
+    assert activity.data["type"] == "Create"
+    assert activity.data["object"]["type"] == "Note"
+    assert activity.data["object"]["actor"] == "https://social.heldscal.la/user/23211"
+    assert activity.data["object"]["content"] == "@<a href=\"https://gs.archae.me/user/4687\" class=\"h-card u-url p-nickname mention\" title=\"shpbot\">shpbot</a> why not indeed."
+    assert activity.data["object"]["inReplyTo"] == "tag:gs.archae.me,2017-04-30:noticeId=778260:objectType=note"
+  end
+
+  test "handle incoming retweets - GS, subscription" do
+    incoming = File.read!("test/fixtures/share-gs.xml")
+    {:ok, [[activity, retweeted_activity]]} = OStatus.handle_incoming(incoming)
+
+    assert activity.data["type"] == "Announce"
+    assert activity.data["actor"] == "https://social.heldscal.la/user/23211"
+    assert activity.data["object"] == retweeted_activity.data["object"]["id"]
+    refute activity.local
+    assert retweeted_activity.data["type"] == "Create"
+    assert retweeted_activity.data["actor"] == "https://pleroma.soykaf.com/users/lain"
+    refute retweeted_activity.local
+  end
+
+  test "handle incoming retweets - Mastodon, salmon" do
+    incoming = File.read!("test/fixtures/share.xml")
+    {:ok, [[activity, retweeted_activity]]} = OStatus.handle_incoming(incoming)
+
+    assert activity.data["type"] == "Announce"
+    assert activity.data["actor"] == "https://mastodon.social/users/lambadalambda"
+    assert activity.data["object"] == retweeted_activity.data["object"]["id"]
+    refute activity.local
+    assert retweeted_activity.data["type"] == "Create"
+    assert retweeted_activity.data["actor"] == "https://pleroma.soykaf.com/users/lain"
+    refute retweeted_activity.local
+  end
+
+  test "handle incoming favorites - GS, websub" do
+    incoming = File.read!("test/fixtures/favorite.xml")
+    {:ok, [[activity, favorited_activity]]} = OStatus.handle_incoming(incoming)
+
+    assert activity.data["type"] == "Like"
+    assert activity.data["actor"] == "https://social.heldscal.la/user/23211"
+    assert activity.data["object"] == favorited_activity.data["object"]["id"]
+    refute activity.local
+    assert favorited_activity.data["type"] == "Create"
+    assert favorited_activity.data["actor"] == "https://shitposter.club/user/1"
+    assert favorited_activity.data["object"]["id"] == "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
+    refute favorited_activity.local
+  end
+
+  test "handle incoming favorites with locally available object - GS, websub" do
+    note_activity = insert(:note_activity)
+
+    incoming = File.read!("test/fixtures/favorite_with_local_note.xml")
+    |> String.replace("localid", note_activity.data["object"]["id"])
+
+    {:ok, [[activity, favorited_activity]]} = OStatus.handle_incoming(incoming)
+
+    assert activity.data["type"] == "Like"
+    assert activity.data["actor"] == "https://social.heldscal.la/user/23211"
+    assert activity.data["object"] == favorited_activity.data["object"]["id"]
+    refute activity.local
+    assert note_activity.id == favorited_activity.id
+    assert favorited_activity.local
+  end
+
+  test "handle incoming replies" do
+    incoming = File.read!("test/fixtures/incoming_note_activity_answer.xml")
+    {:ok, [activity]} = OStatus.handle_incoming(incoming)
+
+    assert activity.data["type"] == "Create"
+    assert activity.data["object"]["type"] == "Note"
+    assert activity.data["object"]["inReplyTo"] == "http://pleroma.example.org:4000/objects/55bce8fc-b423-46b1-af71-3759ab4670bc"
+    assert "http://pleroma.example.org:4000/users/lain5" in activity.data["to"]
+  end
+
+  describe "new remote user creation" do
+    test "returns local users" do
+      local_user = insert(:user)
+      {:ok, user} = OStatus.find_or_make_user(local_user.ap_id)
+
+      assert user == local_user
+    end
+
+    test "tries to use the information in poco fields" do
+      uri = "https://social.heldscal.la/user/23211"
+
+      {:ok, user} = OStatus.find_or_make_user(uri)
+
+      user = Repo.get(Pleroma.User, user.id)
+      assert user.name == "Constance Variable"
+      assert user.nickname == "lambadalambda@social.heldscal.la"
+      assert user.local == false
+      assert user.info["uri"] == uri
+      assert user.ap_id == uri
+      assert user.avatar["type"] == "Image"
+
+      {:ok, user_again} = OStatus.find_or_make_user(uri)
+
+      assert user == user_again
+    end
+
+    test "find_make_or_update_user takes an author element and returns an updated user" do
+      uri = "https://social.heldscal.la/user/23211"
+
+      {:ok, user} = OStatus.find_or_make_user(uri)
+      change = Ecto.Changeset.change(user, %{avatar: nil})
+
+      {:ok, user} = Repo.update(change)
+      refute user.avatar
+
+      doc = XML.parse_document(File.read!("test/fixtures/23211.atom"))
+      [author] = :xmerl_xpath.string('//author[1]', doc)
+      {:ok, user} = OStatus.find_make_or_update_user(author)
+      assert user.avatar["type"] == "Image"
+
+      {:ok, user_again} = OStatus.find_make_or_update_user(author)
+      assert user_again == user
+    end
+  end
+
+  describe "gathering user info from a user id" do
+    test "it returns user info in a hash" do
+      user = "shp@social.heldscal.la"
+
+      # TODO: make test local
+      {:ok, data} = OStatus.gather_user_info(user)
+
+      expected = %{
+        "hub" => "https://social.heldscal.la/main/push/hub",
+        "magic_key" => "RSA.wQ3i9UA0qmAxZ0WTIp4a-waZn_17Ez1pEEmqmqoooRsG1_BvpmOvLN0G2tEcWWxl2KOtdQMCiPptmQObeZeuj48mdsDZ4ArQinexY2hCCTcbV8Xpswpkb8K05RcKipdg07pnI7tAgQ0VWSZDImncL6YUGlG5YN8b5TjGOwk2VG8=.AQAB",
+        "name" => "shp",
+        "nickname" => "shp",
+        "salmon" => "https://social.heldscal.la/main/salmon/user/29191",
+        "subject" => "acct:shp@social.heldscal.la",
+        "topic" => "https://social.heldscal.la/api/statuses/user_timeline/29191.atom",
+        "uri" => "https://social.heldscal.la/user/29191",
+        "host" => "social.heldscal.la",
+        "fqn" => user,
+        "avatar" => %{"type" => "Image", "url" => [%{"href" => "https://social.heldscal.la/avatar/29191-original-20170421154949.jpeg", "mediaType" => "image/jpeg", "type" => "Link"}]}
+      }
+      assert data == expected
+    end
+
+    test "it works with the uri" do
+      user = "https://social.heldscal.la/user/29191"
+
+      # TODO: make test local
+      {:ok, data} = OStatus.gather_user_info(user)
+
+      expected = %{
+        "hub" => "https://social.heldscal.la/main/push/hub",
+        "magic_key" => "RSA.wQ3i9UA0qmAxZ0WTIp4a-waZn_17Ez1pEEmqmqoooRsG1_BvpmOvLN0G2tEcWWxl2KOtdQMCiPptmQObeZeuj48mdsDZ4ArQinexY2hCCTcbV8Xpswpkb8K05RcKipdg07pnI7tAgQ0VWSZDImncL6YUGlG5YN8b5TjGOwk2VG8=.AQAB",
+        "name" => "shp",
+        "nickname" => "shp",
+        "salmon" => "https://social.heldscal.la/main/salmon/user/29191",
+        "subject" => "https://social.heldscal.la/user/29191",
+        "topic" => "https://social.heldscal.la/api/statuses/user_timeline/29191.atom",
+        "uri" => "https://social.heldscal.la/user/29191",
+        "host" => "social.heldscal.la",
+        "fqn" => user,
+        "avatar" => %{"type" => "Image", "url" => [%{"href" => "https://social.heldscal.la/avatar/29191-original-20170421154949.jpeg", "mediaType" => "image/jpeg", "type" => "Link"}]}
+      }
+      assert data == expected
+    end
+  end
+
+  describe "fetching a status by it's HTML url" do
+    test "it builds a missing status from an html url" do
+      url = "https://shitposter.club/notice/2827873"
+      {:ok, [activity] } = OStatus.fetch_activity_from_html_url(url)
+
+      assert activity.data["actor"] == "https://shitposter.club/user/1"
+      assert activity.data["object"]["id"] == "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
+    end 
+  end
+end
index 4ebb320814b21d95aba1029be7a979dd23d46f73..ed26ccf83af3a3c004653420d90ec42977311a19 100644 (file)
@@ -1,6 +1,8 @@
 defmodule Pleroma.Web.Salmon.SalmonTest do
   use Pleroma.DataCase
   alias Pleroma.Web.Salmon
+  alias Pleroma.{Repo, Activity, User}
+  import Pleroma.Factory
 
   @magickey "RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwQhh-1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAB"
 
@@ -16,4 +18,75 @@ defmodule Pleroma.Web.Salmon.SalmonTest do
     {:ok, salmon} = File.read("test/fixtures/salmon.xml")
     assert Salmon.decode_and_validate(@wrong_magickey, salmon) == :error
   end
+
+  test "generates an RSA private key pem" do
+    {:ok, key} = Salmon.generate_rsa_pem
+    assert is_binary(key)
+    assert Regex.match?(~r/RSA/, key)
+  end
+
+  test "it encodes a magic key from a public key" do
+    key = Salmon.decode_key(@magickey)
+    magic_key = Salmon.encode_key(key)
+
+    assert @magickey == magic_key
+  end
+
+  test "returns a public and private key from a pem" do
+    pem = File.read!("test/fixtures/private_key.pem")
+    {:ok, private, public} = Salmon.keys_from_pem(pem)
+
+    assert elem(private, 0) == :RSAPrivateKey
+    assert elem(public, 0) == :RSAPublicKey
+  end
+
+  test "encodes an xml payload with a private key" do
+    doc = File.read!("test/fixtures/incoming_note_activity.xml")
+    pem = File.read!("test/fixtures/private_key.pem")
+    {:ok, private, public} = Salmon.keys_from_pem(pem)
+
+    # Let's try a roundtrip.
+    {:ok, salmon} = Salmon.encode(private, doc)
+    {:ok, decoded_doc} = Salmon.decode_and_validate(Salmon.encode_key(public), salmon)
+
+    assert doc == decoded_doc
+  end
+
+  test "it gets a magic key" do
+    # TODO: Make test local
+    salmon = File.read!("test/fixtures/salmon2.xml")
+    {:ok, key} = Salmon.fetch_magic_key(salmon)
+
+    assert key == "RSA.uzg6r1peZU0vXGADWxGJ0PE34WvmhjUmydbX5YYdOiXfODVLwCMi1umGoqUDm-mRu4vNEdFBVJU1CpFA7dKzWgIsqsa501i2XqElmEveXRLvNRWFB6nG03Q5OUY2as8eE54BJm0p20GkMfIJGwP6TSFb-ICp3QjzbatuSPJ6xCE=.AQAB"
+  end
+
+  test "it pushes an activity to remote accounts it's addressed to" do
+    user_data = %{
+      info: %{
+        "salmon" => "http://example.org/salmon"
+      },
+      local: false
+    }
+
+    mentioned_user = insert(:user, user_data)
+    note = insert(:note)
+    activity_data = %{
+      "id" => Pleroma.Web.ActivityPub.ActivityPub.generate_activity_id,
+      "type" => "Create",
+      "actor" => note.data["actor"],
+      "to" => note.data["to"] ++ [mentioned_user.ap_id],
+      "object" => note.data,
+      "published_at" => DateTime.utc_now() |> DateTime.to_iso8601,
+      "context" => note.data["context"]
+    }
+
+    {:ok, activity} = Repo.insert(%Activity{data: activity_data})
+    user = Repo.get_by(User, ap_id: activity.data["actor"])
+    {:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user)
+
+    poster = fn (url, data, headers) ->
+      assert url == "http://example.org/salmon"
+    end
+    Salmon.publish(user, activity, poster)
+  end
 end
index d0cccb1497d84dff4ac3931446ba7d6019d46f15..84c8d9a49ee5c94bcca61ff6814093a5865b312e 100644 (file)
@@ -22,6 +22,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenterTest do
 
     retweeted_status = ActivityRepresenter.to_map(note_activity, %{user: activity_actor, for: user})
     assert retweeted_status["repeated"] == true
+    assert retweeted_status["id"] == note_activity.id
+    assert status["statusnet_conversation_id"] == retweeted_status["statusnet_conversation_id"]
 
     assert status["retweeted_status"] == retweeted_status
   end
@@ -69,6 +71,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenterTest do
     content = HtmlSanitizeEx.strip_tags(content_html)
     date = DateTime.from_naive!(~N[2016-05-24 13:26:08.003], "Etc/UTC") |> DateTime.to_iso8601
 
+    {:ok, convo_object} = Object.context_mapping("2hu") |> Repo.insert
+
     activity = %Activity{
       id: 1,
       data: %{
@@ -84,14 +88,15 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenterTest do
           "type" => "Note",
           "content" => content_html,
           "inReplyToStatusId" => 213123,
-          "statusnetConversationId" => 4711,
           "attachment" => [
             object
           ],
           "like_count" => 5,
-          "announcement_count" => 3
+          "announcement_count" => 3,
+          "context" => "2hu"
         },
-        "published" => date
+        "published" => date,
+        "context" => "2hu"
       }
     }
 
@@ -106,7 +111,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenterTest do
       "is_post_verb" => true,
       "created_at" => "Tue May 24 13:26:08 +0000 2016",
       "in_reply_to_status_id" => 213123,
-      "statusnet_conversation_id" => 4711,
+      "statusnet_conversation_id" => convo_object.id,
       "attachments" => [
         ObjectRepresenter.to_map(object)
       ],
index 1e92c519046391e6dffbaed50e9187a90e1f3a99..77f0659483f3ba1e851727d9d5bd3f82c760c0ab 100644 (file)
@@ -48,7 +48,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.UserRepresenterTest do
       "profile_image_url_profile_size" => image,
       "profile_image_url_original" => image,
       "following" => false,
-      "rights" => %{}
+      "rights" => %{},
+      "statusnet_profile_url" => user.ap_id
     }
 
     assert represented == UserRepresenter.to_map(user)
@@ -72,7 +73,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.UserRepresenterTest do
       "profile_image_url_profile_size" => image,
       "profile_image_url_original" => image,
       "following" => true,
-      "rights" => %{}
+      "rights" => %{},
+      "statusnet_profile_url" => user.ap_id
     }
 
     assert represented == UserRepresenter.to_map(user, %{for: follower})
index 6c249be7d619a0807437b3ce5e795f080cc6e46f..f8afbaee52b3d4a6995c8aeebb06bb0c6c6e76e9 100644 (file)
@@ -84,12 +84,13 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
   describe "GET /statusnet/conversation/:id.json" do
     test "returns the statuses in the conversation", %{conn: conn} do
       {:ok, _user} = UserBuilder.insert
-      {:ok, _activity} = ActivityBuilder.insert(%{"statusnetConversationId" => 1, "context" => "2hu"})
-      {:ok, _activity_two} = ActivityBuilder.insert(%{"statusnetConversationId" => 1,"context" => "2hu"})
+      {:ok, _activity} = ActivityBuilder.insert(%{"context" => "2hu"})
+      {:ok, _activity_two} = ActivityBuilder.insert(%{"context" => "2hu"})
       {:ok, _activity_three} = ActivityBuilder.insert(%{"context" => "3hu"})
 
+      {:ok, object} = Object.context_mapping("2hu") |> Repo.insert
       conn = conn
-      |> get("/api/statusnet/conversation/1.json")
+      |> get("/api/statusnet/conversation/#{object.id}.json")
 
       response = json_response(conn, 200)
 
@@ -244,6 +245,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
 
       {:ok, current_user} = User.follow(current_user, followed)
       assert current_user.following == [User.ap_followers(followed)]
+      ActivityPub.follow(current_user, followed)
 
       conn = conn
       |> with_credentials(current_user.nickname, "test")
@@ -396,10 +398,4 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
     header_content = "Basic " <> Base.encode64("#{username}:#{password}")
     put_req_header(conn, "authorization", header_content)
   end
-
-  setup do
-    Supervisor.terminate_child(Pleroma.Supervisor, ConCache)
-    Supervisor.restart_child(Pleroma.Supervisor, ConCache)
-    :ok
-  end
 end
index 590428423b2e3a23e97476c3cfba61d572be328b..9a7dc48dab42e472cd90e1413f21b8dd8509eb37 100644 (file)
@@ -33,19 +33,18 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
 
     { :ok, activity = %Activity{} } = TwitterAPI.create_status(user, input)
 
-    assert get_in(activity.data, ["object", "content"]) == "Hello again, <a href='shp'>@shp</a>.<br>This is on another line."
+    assert get_in(activity.data, ["object", "content"]) == "Hello again, <a href='shp'>@shp</a>.<br>This is on another line.<br><a href='http://example.org/image.jpg'>http://example.org/image.jpg</a>"
     assert get_in(activity.data, ["object", "type"]) == "Note"
     assert get_in(activity.data, ["object", "actor"]) == user.ap_id
     assert get_in(activity.data, ["actor"]) == user.ap_id
     assert Enum.member?(get_in(activity.data, ["to"]), User.ap_followers(user))
     assert Enum.member?(get_in(activity.data, ["to"]), "https://www.w3.org/ns/activitystreams#Public")
     assert Enum.member?(get_in(activity.data, ["to"]), "shp")
+    assert activity.local == true
 
-    # Add a context + 'statusnet_conversation_id'
+    # Add a context
     assert is_binary(get_in(activity.data, ["context"]))
     assert is_binary(get_in(activity.data, ["object", "context"]))
-    assert get_in(activity.data, ["object", "statusnetConversationId"]) == activity.id
-    assert get_in(activity.data, ["statusnetConversationId"]) == activity.id
 
     assert is_list(activity.data["object"]["attachment"])
 
@@ -69,15 +68,14 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
 
     assert get_in(reply.data, ["context"]) == get_in(activity.data, ["context"])
     assert get_in(reply.data, ["object", "context"]) == get_in(activity.data, ["object", "context"])
-    assert get_in(reply.data, ["statusnetConversationId"]) == get_in(activity.data, ["statusnetConversationId"])
-    assert get_in(reply.data, ["object", "statusnetConversationId"]) == get_in(activity.data, ["object", "statusnetConversationId"])
     assert get_in(reply.data, ["object", "inReplyTo"]) == get_in(activity.data, ["object", "id"])
     assert get_in(reply.data, ["object", "inReplyToStatusId"]) == activity.id
     assert Enum.member?(get_in(reply.data, ["to"]), "some_cool_id")
   end
 
-  test "fetch public statuses" do
+  test "fetch public statuses, excluding remote ones." do
     %{ public: activity, user: user } = ActivityBuilder.public_and_non_public
+    insert(:note_activity, %{local: false})
 
     follower = insert(:user, following: [User.ap_followers(user)])
 
@@ -87,6 +85,18 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
     assert Enum.at(statuses, 0) == ActivityRepresenter.to_map(activity, %{user: user, for: follower})
   end
 
+  test "fetch whole known network statuses" do
+    %{ public: activity, user: user } = ActivityBuilder.public_and_non_public
+    insert(:note_activity, %{local: false})
+
+    follower = insert(:user, following: [User.ap_followers(user)])
+
+    statuses = TwitterAPI.fetch_public_and_external_statuses(follower)
+
+    assert length(statuses) == 2
+    assert Enum.at(statuses, 0) == ActivityRepresenter.to_map(activity, %{user: user, for: follower})
+  end
+
   test "fetch friends' statuses" do
     user = insert(:user, %{following: ["someguy/followers"]})
     {:ok, activity} = ActivityBuilder.insert(%{"to" => ["someguy/followers"]})
@@ -180,6 +190,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
   test "Unfollow another user using user_id" do
     unfollowed = insert(:user)
     user = insert(:user, %{following: [User.ap_followers(unfollowed)]})
+    ActivityPub.follow(user, unfollowed)
 
     {:ok, user, unfollowed } = TwitterAPI.unfollow(user, %{"user_id" => unfollowed.id})
     assert user.following == []
@@ -192,6 +203,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
     unfollowed = insert(:user)
     user = insert(:user, %{following: [User.ap_followers(unfollowed)]})
 
+    ActivityPub.follow(user, unfollowed)
+
     {:ok, user, unfollowed } = TwitterAPI.unfollow(user, %{"screen_name" => unfollowed.nickname})
     assert user.following == []
 
@@ -201,11 +214,13 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
 
   test "fetch statuses in a context using the conversation id" do
     {:ok, user} = UserBuilder.insert()
-    {:ok, activity} = ActivityBuilder.insert(%{"statusnetConversationId" => 1, "context" => "2hu"})
-    {:ok, activity_two} = ActivityBuilder.insert(%{"statusnetConversationId" => 1,"context" => "2hu"})
+    {:ok, activity} = ActivityBuilder.insert(%{"context" => "2hu"})
+    {:ok, activity_two} = ActivityBuilder.insert(%{"context" => "2hu"})
     {:ok, _activity_three} = ActivityBuilder.insert(%{"context" => "3hu"})
 
-    statuses = TwitterAPI.fetch_conversation(user, 1)
+    {:ok, object} = Object.context_mapping("2hu") |> Repo.insert
+
+    statuses = TwitterAPI.fetch_conversation(user, object.id)
 
     assert length(statuses) == 2
     assert Enum.at(statuses, 0)["id"] == activity.id
@@ -314,9 +329,33 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
     refute Repo.get_by(User, nickname: "lain")
   end
 
+  test "it assigns an integer conversation_id" do
+    note_activity = insert(:note_activity)
+    user = User.get_cached_by_ap_id(note_activity.data["actor"])
+    status = ActivityRepresenter.to_map(note_activity, %{user: user})
+
+    assert is_number(status["statusnet_conversation_id"])
+  end
+
   setup do
     Supervisor.terminate_child(Pleroma.Supervisor, Cachex)
     Supervisor.restart_child(Pleroma.Supervisor, Cachex)
     :ok
   end
+
+  describe "context_to_conversation_id" do
+    test "creates a mapping object" do
+      conversation_id = TwitterAPI.context_to_conversation_id("random context")
+      object = Object.get_by_ap_id("random context")
+
+      assert conversation_id == object.id
+    end
+
+    test "returns an existing mapping for an existing object" do
+      {:ok, object} = Object.context_mapping("random context") |> Repo.insert
+      conversation_id = TwitterAPI.context_to_conversation_id("random context")
+
+      assert conversation_id == object.id
+    end
+  end
 end
index 8a3007ff9181f89491d81376bf557ef2a923a889..495d3d50b4c80e558d94b0ae88229048b5101ff3 100644 (file)
@@ -1,11 +1,61 @@
 defmodule Pleroma.Web.WebFingerTest do
   use Pleroma.DataCase
+  alias Pleroma.Web.WebFinger
+  import Pleroma.Factory
 
   describe "host meta" do
     test "returns a link to the xml lrdd" do
-      host_info = Pleroma.Web.WebFinger.host_meta
+      host_info = WebFinger.host_meta()
 
       assert String.contains?(host_info, Pleroma.Web.base_url)
     end
   end
+
+  describe "incoming webfinger request" do
+    test "works for fqns" do
+      user = insert(:user)
+
+      {:ok, result} = WebFinger.webfinger("#{user.nickname}@#{Pleroma.Web.Endpoint.host}")
+      assert is_binary(result)
+    end
+
+    test "works for ap_ids" do
+      user = insert(:user)
+
+      {:ok, result} = WebFinger.webfinger(user.ap_id)
+      assert is_binary(result)
+    end
+  end
+
+  describe "fingering" do
+    test "returns the info for a user" do
+      user = "shp@social.heldscal.la"
+
+      getter = fn(_url, _headers, [params: [resource: ^user]]) ->
+        {:ok, %{status_code: 200, body: File.read!("test/fixtures/webfinger.xml")}}
+      end
+
+      {:ok, data} = WebFinger.finger(user, getter)
+
+      assert data["magic_key"] == "RSA.wQ3i9UA0qmAxZ0WTIp4a-waZn_17Ez1pEEmqmqoooRsG1_BvpmOvLN0G2tEcWWxl2KOtdQMCiPptmQObeZeuj48mdsDZ4ArQinexY2hCCTcbV8Xpswpkb8K05RcKipdg07pnI7tAgQ0VWSZDImncL6YUGlG5YN8b5TjGOwk2VG8=.AQAB"
+      assert data["topic"] == "https://social.heldscal.la/api/statuses/user_timeline/29191.atom"
+      assert data["subject"] == "acct:shp@social.heldscal.la"
+      assert data["salmon"] == "https://social.heldscal.la/main/salmon/user/29191"
+    end
+  end
+
+  describe "ensure_keys_present" do
+    test "it creates keys for a user and stores them in info" do
+      user = insert(:user)
+      refute is_binary(user.info["keys"])
+      {:ok, user} = WebFinger.ensure_keys_present(user)
+      assert is_binary(user.info["keys"])
+    end
+
+    test "it doesn't create keys if there already are some" do
+      user = insert(:user, %{info: %{"keys" => "xxx"}})
+      {:ok, user} = WebFinger.ensure_keys_present(user)
+      assert user.info["keys"] == "xxx"
+    end
+  end
 end
index 8368cafea584ec76f1a49abba439d475253158f1..8f68248a486d2e97ac2aa676f767182ae38f4c74 100644 (file)
@@ -1,6 +1,9 @@
 defmodule Pleroma.Web.Websub.WebsubControllerTest do
   use Pleroma.Web.ConnCase
   import Pleroma.Factory
+  alias Pleroma.Web.Websub.WebsubClientSubscription
+  alias Pleroma.{Repo, Activity}
+  alias Pleroma.Web.Websub
 
   test "websub subscription request", %{conn: conn} do
     user = insert(:user)
@@ -20,4 +23,62 @@ defmodule Pleroma.Web.Websub.WebsubControllerTest do
 
     assert response(conn, 202) == "Accepted"
   end
+
+  test "websub subscription confirmation", %{conn: conn} do
+    websub = insert(:websub_client_subscription)
+
+    params = %{
+      "hub.mode" => "subscribe",
+      "hub.topic" => websub.topic,
+      "hub.challenge" => "some challenge",
+      "hub.lease_seconds" => 100
+    }
+
+    conn = conn
+    |> get("/push/subscriptions/#{websub.id}", params)
+
+    websub = Repo.get(WebsubClientSubscription, websub.id)
+
+    assert response(conn, 200) == "some challenge"
+    assert websub.state == "accepted"
+
+    # TODO valid_until
+  end
+
+  test "handles incoming feed updates", %{conn: conn} do
+    websub = insert(:websub_client_subscription)
+    doc = "some stuff"
+    signature = Websub.sign(websub.secret, doc)
+
+    conn = conn
+    |> put_req_header("x-hub-signature", "sha1=" <> signature)
+    |> put_req_header("content-type", "application/atom+xml")
+    |> post("/push/subscriptions/#{websub.id}", doc)
+
+    assert response(conn, 200) == "OK"
+
+    assert length(Repo.all(Activity)) == 1
+  end
+
+  test "rejects incoming feed updates with the wrong signature", %{conn: conn} do
+    websub = insert(:websub_client_subscription)
+    doc = "some stuff"
+    signature = Websub.sign("wrong secret", doc)
+
+    conn = conn
+    |> put_req_header("x-hub-signature", "sha1=" <> signature)
+    |> put_req_header("content-type", "application/atom+xml")
+    |> post("/push/subscriptions/#{websub.id}", doc)
+
+    assert response(conn, 500) == "Error"
+
+    assert length(Repo.all(Activity)) == 0
+  end
+end
+
+defmodule Pleroma.Web.OStatusMock do
+  import Pleroma.Factory
+  def handle_incoming(_doc) do
+    insert(:note_activity)
+  end
 end
index 334ba03fc28bea529635d8758b07ef7921323e2b..48774dc692c28d3a2d63eae381a836b771c0e241 100644 (file)
@@ -3,11 +3,13 @@ defmodule Pleroma.Web.WebsubMock do
     {:ok, sub}
   end
 end
+
 defmodule Pleroma.Web.WebsubTest do
   use Pleroma.DataCase
   alias Pleroma.Web.Websub
   alias Pleroma.Web.Websub.WebsubServerSubscription
   import Pleroma.Factory
+  alias Pleroma.Web.Router.Helpers
 
   test "a verification of a request that is accepted" do
     sub = insert(:websub_subscription)
@@ -58,7 +60,6 @@ defmodule Pleroma.Web.WebsubTest do
       "hub.lease_seconds" => "100"
     }
 
-
     {:ok, subscription } = Websub.incoming_subscription_request(user, data)
     assert subscription.topic == Pleroma.Web.OStatus.feed_path(user)
     assert subscription.state == "requested"
@@ -78,7 +79,6 @@ defmodule Pleroma.Web.WebsubTest do
       "hub.lease_seconds" => "100"
     }
 
-
     {:ok, subscription } = Websub.incoming_subscription_request(user, data)
     assert subscription.topic == Pleroma.Web.OStatus.feed_path(user)
     assert subscription.state == sub.state
@@ -87,4 +87,91 @@ defmodule Pleroma.Web.WebsubTest do
     assert length(Repo.all(WebsubServerSubscription)) == 1
     assert subscription.id == sub.id
   end
+
+  def accepting_verifier(subscription) do
+    {:ok, %{ subscription | state: "accepted" }}
+  end
+
+  test "initiate a subscription for a given user and topic" do
+    subscriber = insert(:user)
+    user = insert(:user, %{info: %{ "topic" =>  "some_topic", "hub" => "some_hub"}})
+
+    {:ok, websub} = Websub.subscribe(subscriber, user, &accepting_verifier/1)
+    assert websub.subscribers == [subscriber.ap_id]
+    assert websub.topic == "some_topic"
+    assert websub.hub == "some_hub"
+    assert is_binary(websub.secret)
+    assert websub.user == user
+    assert websub.state == "accepted"
+  end
+
+  test "discovers the hub and canonical url" do
+    topic = "https://mastodon.social/users/lambadalambda.atom"
+
+    getter = fn(^topic) ->
+      doc = File.read!("test/fixtures/lambadalambda.atom")
+      {:ok, %{status_code: 200, body: doc}}
+    end
+
+    {:ok, discovered} = Websub.gather_feed_data(topic, getter)
+    expected = %{
+      "hub" => "https://mastodon.social/api/push",
+      "uri" => "https://mastodon.social/users/lambadalambda",
+      "nickname" => "lambadalambda",
+      "name" => "Critical Value",
+      "host" => "mastodon.social",
+      "avatar" => %{"type" => "Image", "url" => [%{"href" => "https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif?1492379244", "mediaType" => "image/gif", "type" => "Link"}]}
+    }
+
+    assert expected == discovered
+  end
+
+  test "calls the hub, requests topic" do
+    hub = "https://social.heldscal.la/main/push/hub"
+    topic = "https://social.heldscal.la/api/statuses/user_timeline/23211.atom"
+    websub = insert(:websub_client_subscription, %{hub: hub, topic: topic})
+
+    poster = fn (^hub, {:form, data}, _headers) ->
+      assert Keyword.get(data, :"hub.mode") == "subscribe"
+      assert Keyword.get(data, :"hub.callback") == Helpers.websub_url(Pleroma.Web.Endpoint, :websub_subscription_confirmation, websub.id)
+      {:ok, %{status_code: 202}}
+    end
+
+    task = Task.async(fn -> Websub.request_subscription(websub, poster) end)
+
+    change = Ecto.Changeset.change(websub, %{state: "accepted"})
+    {:ok, _} = Repo.update(change)
+
+    {:ok, websub} = Task.await(task)
+
+    assert websub.state == "accepted"
+  end
+
+  test "rejects the subscription if it can't be accepted" do
+    hub = "https://social.heldscal.la/main/push/hub"
+    topic = "https://social.heldscal.la/api/statuses/user_timeline/23211.atom"
+    websub = insert(:websub_client_subscription, %{hub: hub, topic: topic})
+
+    poster = fn (^hub, {:form, _data}, _headers) ->
+      {:ok, %{status_code: 202}}
+    end
+
+    {:error, websub} = Websub.request_subscription(websub, poster, 1000)
+    assert websub.state == "rejected"
+
+    websub = insert(:websub_client_subscription, %{hub: hub, topic: topic})
+    poster = fn (^hub, {:form, _data}, _headers) ->
+      {:ok, %{status_code: 400}}
+    end
+
+    {:error, websub} = Websub.request_subscription(websub, poster, 1000)
+    assert websub.state == "rejected"
+  end
+
+  test "sign a text" do
+    signed = Websub.sign("secret", "text")
+    assert signed == "B8392C23690CCF871F37EC270BE1582DEC57A503" |> String.downcase
+
+    signed = Websub.sign("secret", [["て"], ['す']])
+  end
 end