Add configurable theme color (#53)
authorfloatingghost <hannah@coffee-and-dreams.uk>
Wed, 6 Jul 2022 20:00:43 +0000 (20:00 +0000)
committerfloatingghost <hannah@coffee-and-dreams.uk>
Wed, 6 Jul 2022 20:00:43 +0000 (20:00 +0000)
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma/pulls/53

CHANGELOG.md
config/config.exs
config/description.exs
docs/configuration/cheatsheet.md
lib/pleroma/application.ex
lib/pleroma/telemetry/logger.ex [deleted file]
lib/pleroma/web/endpoint.ex
lib/pleroma/web/fallback/redirect_controller.ex
lib/pleroma/web/metadata.ex
lib/pleroma/web/metadata/providers/theme.ex [new file with mode: 0644]
test/pleroma/web/metadata/providers/theme_test.exs [new file with mode: 0644]

index 55ae540b602d1786bb0628f0d698b6a455c2e282..2a12a0c5754f2fdbccd9a31eba7462d5ef57b07e 100644 (file)
@@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
 ### Added
 - Added move account API
+- Added ability to set instance accent-color via theme-color
 
 ### Removed
 - SSH frontend, to be potentially re-enabled via a bridge rather than wired into the main system
index 06c946b2af2cd70e903fc210a12d2506a9ac6082..908b79d09b3f79800fa66a318e73ff54b8c28bbf 100644 (file)
@@ -477,6 +477,8 @@ config :pleroma, Pleroma.Web.Metadata,
   ],
   unfurl_nsfw: false
 
+config :pleroma, Pleroma.Web.Metadata.Providers.Theme, theme_color: "#593196"
+
 config :pleroma, Pleroma.Web.Preload,
   providers: [
     Pleroma.Web.Preload.Providers.Instance
index d8eaa34a262d0a432a3d654bf6674394a63839c6..c36e9d2b2b0215752b62b86a10f42e007db3fba6 100644 (file)
@@ -1979,6 +1979,21 @@ config :pleroma, :config_description, [
       }
     ]
   },
+  %{
+    group: :pleroma,
+    key: Pleroma.Web.Metadata.Providers.Theme,
+    type: :group,
+    description: "Specific provider to hand out themes to instances that scrape index.html",
+    children: [
+      %{
+        key: :theme_color,
+        type: :string,
+        description:
+          "The 'accent color' of the instance, used in places like misskey's instance ticker",
+        suggestions: ["#593196"]
+      }
+    ]
+  },
   %{
     group: :pleroma,
     key: :rich_media,
index 11083e831527b0ae07b4705f77622f0b7f8e217a..cef86e80663c1f284738bb1e3e5240edc5fbc6ed 100644 (file)
@@ -1114,6 +1114,18 @@ config :pleroma, :frontends,
 
 This would serve the frontend from the the folder at `$instance_static/frontends/pleroma/stable`. You have to copy the frontend into this folder yourself. You can choose the name and ref any way you like, but they will be used by mix tasks to automate installation in the future, the name referring to the project and the ref referring to a commit.
 
+### Theme settings
+
+Settings to change theme as exposed to the outside world, for software
+that scans `index.html` (mainly misskey)
+
+```
+config :pleroma, Pleroma.Web.Metadata.Providers.Theme, theme_color: "#593196"
+```
+
+This sets the `theme-color` meta tag on `index.html`, and is basically
+a hack to make misskey find the right thing.
+
 ## Ephemeral activities (Pleroma.Workers.PurgeExpiredActivity)
 
 Settings to enable and configure expiration for ephemeral activities
index b55d980e92787068523adbe07eca4861ad256cbd..0f4f5a358d4a5c9555b19db17fb488141d2600a2 100644 (file)
@@ -47,7 +47,6 @@ defmodule Pleroma.Application do
     # Disable warnings_as_errors at runtime, it breaks Phoenix live reload
     # due to protocol consolidation warnings
     Code.compiler_options(warnings_as_errors: false)
-    Pleroma.Telemetry.Logger.attach()
     Config.Holder.save_default()
     Pleroma.HTML.compile_scrubbers()
     Pleroma.Config.Oban.warn()
diff --git a/lib/pleroma/telemetry/logger.ex b/lib/pleroma/telemetry/logger.ex
deleted file mode 100644 (file)
index 4c781c5..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Telemetry.Logger do
-  @moduledoc "Transforms Pleroma telemetry events to logs"
-
-  require Logger
-
-  @events [
-    [:pleroma, :repo, :query]
-  ]
-  def attach do
-    :telemetry.attach_many(
-      "pleroma-logger",
-      @events,
-      &Pleroma.Telemetry.Logger.handle_event/4,
-      []
-    )
-  end
-
-  # Passing anonymous functions instead of strings to logger is intentional,
-  # that way strings won't be concatenated if the message is going to be thrown
-  # out anyway due to higher log level configured
-
-  def handle_event(
-        [:pleroma, :repo, :query] = _name,
-        %{query_time: query_time} = measurements,
-        %{source: source} = metadata,
-        config
-      ) do
-    logging_config = Pleroma.Config.get([:telemetry, :slow_queries_logging], [])
-
-    if logging_config[:enabled] &&
-         logging_config[:min_duration] &&
-         query_time > logging_config[:min_duration] and
-         (is_nil(logging_config[:exclude_sources]) or
-            source not in logging_config[:exclude_sources]) do
-      log_slow_query(measurements, metadata, config)
-    else
-      :ok
-    end
-  end
-
-  defp log_slow_query(
-         %{query_time: query_time} = _measurements,
-         %{source: _source, query: query, params: query_params, repo: repo} = _metadata,
-         _config
-       ) do
-    sql_explain =
-      with {:ok, %{rows: explain_result_rows}} <-
-             repo.query("EXPLAIN " <> query, query_params, log: false) do
-        Enum.map_join(explain_result_rows, "\n", & &1)
-      end
-
-    {:current_stacktrace, stacktrace} = Process.info(self(), :current_stacktrace)
-
-    pleroma_stacktrace =
-      Enum.filter(stacktrace, fn
-        {__MODULE__, _, _, _} ->
-          false
-
-        {mod, _, _, _} ->
-          mod
-          |> to_string()
-          |> String.starts_with?("Elixir.Pleroma.")
-      end)
-
-    Logger.warn(fn ->
-      """
-      Slow query!
-
-      Total time: #{round(query_time / 1_000)} ms
-
-      #{query}
-
-      #{inspect(query_params, limit: :infinity)}
-
-      #{sql_explain}
-
-      #{Exception.format_stacktrace(pleroma_stacktrace)}
-      """
-    end)
-  end
-end
index 9d73cf0f8a30c0fdf88d990775020eadac907bc1..9ba98d0a8eb68206dcb066fd07bafa48dec7ca11 100644 (file)
@@ -12,8 +12,6 @@ defmodule Pleroma.Web.Endpoint do
   socket("/socket", Pleroma.Web.UserSocket)
   socket("/live", Phoenix.LiveView.Socket)
 
-  plug(Plug.Telemetry, event_prefix: [:phoenix, :endpoint])
-
   plug(Pleroma.Web.Plugs.SetLocalePlug)
   plug(CORSPlug)
   plug(Pleroma.Web.Plugs.HTTPSecurityPlug)
index 5fca290e56d4ec6a780826dfe46a10d0aae7bc5f..49f659cf0138035d1b8da31d9296ff8889c3cecc 100644 (file)
@@ -55,11 +55,12 @@ defmodule Pleroma.Web.Fallback.RedirectController do
   def redirector_with_preload(conn, params) do
     {:ok, index_content} = File.read(index_file_path())
     preloads = preload_data(conn, params)
+    tags = Metadata.build_static_tags(params)
     title = "<title>#{Pleroma.Config.get([:instance, :name])}</title>"
 
     response =
       index_content
-      |> String.replace("<!--server-generated-meta-->", preloads <> title)
+      |> String.replace("<!--server-generated-meta-->", tags <> preloads <> title)
 
     conn
     |> put_resp_content_type("text/html")
index 46ef00c088f9caf076fbffa0d6d50054ccce57ef..48801b5884da2761885e996221589bec7cfe5b3d 100644 (file)
@@ -5,10 +5,28 @@
 defmodule Pleroma.Web.Metadata do
   alias Phoenix.HTML
 
+  def build_static_tags(params) do
+    providers = [
+      Pleroma.Web.Metadata.Providers.Theme
+    ]
+
+    Enum.reduce(providers, "", fn parser, acc ->
+      rendered_html =
+        params
+        |> parser.build_tags()
+        |> Enum.map(&to_tag/1)
+        |> Enum.map(&HTML.safe_to_string/1)
+        |> Enum.join()
+
+      acc <> rendered_html
+    end)
+  end
+
   def build_tags(params) do
     providers = [
       Pleroma.Web.Metadata.Providers.RelMe,
-      Pleroma.Web.Metadata.Providers.RestrictIndexing
+      Pleroma.Web.Metadata.Providers.RestrictIndexing,
+      Pleroma.Web.Metadata.Providers.Theme
       | activated_providers()
     ]
 
diff --git a/lib/pleroma/web/metadata/providers/theme.ex b/lib/pleroma/web/metadata/providers/theme.ex
new file mode 100644 (file)
index 0000000..581ff76
--- /dev/null
@@ -0,0 +1,16 @@
+defmodule Pleroma.Web.Metadata.Providers.Theme do
+  alias Pleroma.Web.Metadata.Providers.Provider
+
+  @behaviour Provider
+
+  @impl Provider
+  def build_tags(_) do
+    [
+      {:meta,
+       [
+         name: "theme-color",
+         content: Pleroma.Config.get([__MODULE__, :theme_color])
+       ], []}
+    ]
+  end
+end
diff --git a/test/pleroma/web/metadata/providers/theme_test.exs b/test/pleroma/web/metadata/providers/theme_test.exs
new file mode 100644 (file)
index 0000000..0c2c1e4
--- /dev/null
@@ -0,0 +1,12 @@
+defmodule Pleroma.Web.Metadata.Providers.ThemeTest do
+  use Pleroma.DataCase
+  alias Pleroma.Web.Metadata.Providers.Theme
+
+  setup do: clear_config([Pleroma.Web.Metadata.Providers.Theme, :theme_color], "configured")
+
+  test "it renders the theme-color meta tag" do
+    result = Theme.build_tags(%{})
+
+    assert {:meta, [name: "theme-color", content: "configured"], []} in result
+  end
+end