Allow using a custom manfest and getting multiple packs at once
authorEkaterina Vaartis <vaartis@cock.li>
Thu, 18 Apr 2019 07:57:20 +0000 (10:57 +0300)
committerEkaterina Vaartis <vaartis@cock.li>
Sat, 20 Apr 2019 08:17:17 +0000 (11:17 +0300)
A custom manifest can be provided as a command-line options --manifest/-m

lib/mix/tasks/pleroma/emoji.ex

index ffe7336175523fef992ce4f9021700998ad835bf..902bddc655279a630e379eeae3dd5e01a89d33dc 100644 (file)
@@ -9,15 +9,31 @@ defmodule Mix.Tasks.Pleroma.Emoji do
   @moduledoc """
   """
 
-  defp fetch_manifest do
-    Tesla.get!("https://git.pleroma.social/vaartis/emoji-index/raw/master/index.json").body
-    |> Poison.decode!()
+  @default_manifest "https://git.pleroma.social/vaartis/emoji-index/raw/master/index.json"
+
+  defp fetch_manifest(from) do
+    Tesla.get!(from).body |> Poison.decode!()
+  end
+
+  defp parse_global_opts(args) do
+    OptionParser.parse(
+      args,
+      strict: [
+        manifest: :string
+      ],
+      aliases: [
+        m: :manifest
+      ]
+    )
   end
 
-  def run(["ls-packs"]) do
+  def run(["ls-packs" | args]) do
     Application.ensure_all_started(:hackney)
 
-    manifest = fetch_manifest()
+    {options, [], []} = parse_global_opts(args)
+
+    manifest =
+      fetch_manifest(if options[:manifest], do: options[:manifest], else: @default_manifest)
 
     Enum.each(manifest, fn {name, info} ->
       to_print = [
@@ -34,65 +50,72 @@ defmodule Mix.Tasks.Pleroma.Emoji do
     end)
   end
 
-  def run(["get-pack", pack_name]) do
+  def run(["get-packs" | args]) do
     Application.ensure_all_started(:hackney)
 
-    manifest = fetch_manifest()
-
-    if Map.has_key?(manifest, pack_name) do
-      pack = manifest[pack_name]
-      src_url = pack["src"]
-
-      IO.puts(
-        IO.ANSI.format([
-          "Downloading pack ",
-          :bright,
-          pack_name,
-          :normal,
-          " from ",
-          :underline,
-          src_url
-        ])
-      )
-
-      binary_archive = Tesla.get!(src_url).body
-
-      IO.puts("Unpacking #{pack_name} pack")
-
-      static_path = Path.join(:code.priv_dir(:pleroma), "static")
-
-      pack_path =
-        Path.join([
-          static_path,
-          Pleroma.Config.get!([:instance, :static_dir]),
-          "emoji",
-          pack_name
-        ])
-
-      files_to_unzip =
-        Enum.map(
-          pack["files"],
-          fn {_, f} -> to_charlist(f) end
+    {options, pack_names, []} = parse_global_opts(args)
+
+    manifest =
+      fetch_manifest(if options[:manifest], do: options[:manifest], else: @default_manifest)
+
+    for pack_name <- pack_names do
+      if Map.has_key?(manifest, pack_name) do
+        pack = manifest[pack_name]
+        src_url = pack["src"]
+
+        IO.puts(
+          IO.ANSI.format([
+            "Downloading ",
+            :bright,
+            pack_name,
+            :normal,
+            " from ",
+            :underline,
+            src_url
+          ])
         )
 
-      {:ok, _} =
-        :zip.unzip(binary_archive,
-          cwd: pack_path,
-          file_list: files_to_unzip
-        )
-
-      IO.puts("Wriring emoji.txt for the #{pack_name} pack")
-
-      emoji_txt_str =
-        Enum.map(
-          pack["files"],
-          fn {shortcode, path} -> "#{shortcode}, /instance/static/emoji/#{pack_name}/#{path}" end
-        )
-        |> Enum.join("\n")
-
-      File.write!(Path.join(pack_path, "emoji.txt"), emoji_txt_str)
-    else
-      IO.puts(IO.ANSI.format([:bright, :red, "No pack named \"#{pack_name}\" found"]))
+        binary_archive = Tesla.get!(src_url).body
+
+        IO.puts(IO.ANSI.format(["Unpacking ", :bright, pack_name]))
+
+        static_path = Path.join(:code.priv_dir(:pleroma), "static")
+
+        pack_path =
+          Path.join([
+            static_path,
+            Pleroma.Config.get!([:instance, :static_dir]),
+            "emoji",
+            pack_name
+          ])
+
+        files_to_unzip =
+          Enum.map(
+            pack["files"],
+            fn {_, f} -> to_charlist(f) end
+          )
+
+        {:ok, _} =
+          :zip.unzip(binary_archive,
+            cwd: pack_path,
+            file_list: files_to_unzip
+          )
+
+        IO.puts(IO.ANSI.format(["Writing emoji.txt for ", :bright, pack_name]))
+
+        emoji_txt_str =
+          Enum.map(
+            pack["files"],
+            fn {shortcode, path} ->
+              "#{shortcode}, /instance/static/emoji/#{pack_name}/#{path}"
+            end
+          )
+          |> Enum.join("\n")
+
+        File.write!(Path.join(pack_path, "emoji.txt"), emoji_txt_str)
+      else
+        IO.puts(IO.ANSI.format([:bright, :red, "No pack named \"#{pack_name}\" found"]))
+      end
     end
   end
 end