division emoji.ex on loader.ex and emoji.ex
[akkoma] / lib / pleroma / emoji.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Emoji do
6 @moduledoc """
7 This GenServer stores in an ETS table the list of the loaded emojis,
8 and also allows to reload the list at runtime.
9 """
10 use GenServer
11
12 alias Pleroma.Emoji.Loader
13
14 require Logger
15
16 @ets __MODULE__.Ets
17 @ets_options [
18 :ordered_set,
19 :protected,
20 :named_table,
21 {:read_concurrency, true}
22 ]
23
24 @doc false
25 def start_link(_) do
26 GenServer.start_link(__MODULE__, [], name: __MODULE__)
27 end
28
29 @doc "Reloads the emojis from disk."
30 @spec reload() :: :ok
31 def reload do
32 GenServer.call(__MODULE__, :reload)
33 end
34
35 @doc "Returns the path of the emoji `name`."
36 @spec get(String.t()) :: String.t() | nil
37 def get(name) do
38 case :ets.lookup(@ets, name) do
39 [{_, path}] -> path
40 _ -> nil
41 end
42 end
43
44 @doc "Returns all the emojos!!"
45 @spec get_all() :: list({String.t(), String.t(), String.t()})
46 def get_all do
47 :ets.tab2list(@ets)
48 end
49
50 @doc false
51 def init(_) do
52 @ets = :ets.new(@ets, @ets_options)
53 GenServer.cast(self(), :reload)
54 {:ok, nil}
55 end
56
57 @doc false
58 def handle_cast(:reload, state) do
59 update_emojis(Loader.load())
60 {:noreply, state}
61 end
62
63 @doc false
64 def handle_call(:reload, _from, state) do
65 update_emojis(Loader.load())
66 {:reply, :ok, state}
67 end
68
69 @doc false
70 def terminate(_, _) do
71 :ok
72 end
73
74 @doc false
75 def code_change(_old_vsn, state, _extra) do
76 update_emojis(Loader.load())
77 {:ok, state}
78 end
79
80 defp update_emojis(emojis) do
81 :ets.insert(@ets, emojis)
82 end
83 end