From 679363066cbecc4b55867ebeb5fff55e59b0e064 Mon Sep 17 00:00:00 2001
From: Zynh Ludwig <Zynh0722@gmail.com>
Date: Tue, 4 Mar 2025 15:34:25 -0800
Subject: [PATCH] pkgs: dorian init

---
 pkgs/default.nix                 |   1 +
 pkgs/dorion/default.nix          | 195 +++++++++++++++++++++++++++++++
 pkgs/dorion/no-cargo-patch.patch |  31 +++++
 3 files changed, 227 insertions(+)
 create mode 100644 pkgs/dorion/default.nix
 create mode 100644 pkgs/dorion/no-cargo-patch.patch

diff --git a/pkgs/default.nix b/pkgs/default.nix
index 385b7fc..dd82a73 100644
--- a/pkgs/default.nix
+++ b/pkgs/default.nix
@@ -14,4 +14,5 @@ in
   dwlmsg = callDefaultPackage ./dwlmsg;
   uhk-agent = callDefaultPackage ./uhk-agent;
   pipewire-controller = callDefaultPackage ./pipewire-controller;
+  dorion = callDefaultPackage ./dorion;
 }
diff --git a/pkgs/dorion/default.nix b/pkgs/dorion/default.nix
new file mode 100644
index 0000000..cb0f3b9
--- /dev/null
+++ b/pkgs/dorion/default.nix
@@ -0,0 +1,195 @@
+{ lib
+, fetchFromGitHub
+, fetchurl
+, rustPlatform
+, cmake
+, ninja
+, wrapGAppsHook4
+, glib-networking
+, gst_all_1
+, libsysprof-capture
+, libayatana-appindicator
+, nodejs
+, openssl
+, pkg-config
+, yq-go
+, pnpm_9
+, webkitgtk_4_1
+, cargo-tauri
+, desktop-file-utils
+,
+}:
+
+let
+  webkitgtk_4_1' = webkitgtk_4_1.override {
+    enableExperimental = true;
+  };
+
+  shelter = fetchurl {
+    url = "https://raw.githubusercontent.com/uwu/shelter-builds/4264c79a7e8efb2c0000c180dd8369c9a5194105/shelter.js";
+    hash = "sha256-C+iPl40QN2CfhHX8cc+5mu+8qfD1VZDJHbUjfY2QcUg=";
+    meta = {
+      homepage = "https://github.com/uwu/shelter";
+      sourceProvenance = [ lib.sourceTypes.binaryBytecode ]; # actually, minified JS
+      license = lib.licenses.cc0;
+    };
+  };
+in
+
+# nyo finalAttrs :<
+  # https://github.com/NixOS/nixpkgs/pull/194475
+rustPlatform.buildRustPackage rec {
+  pname = "dorion";
+  version = "6.4.1";
+
+  src = fetchFromGitHub {
+    owner = "SpikeHD";
+    repo = "Dorion";
+    tag = "v${version}";
+    hash = "sha256-La58qj9acZzTG7WDfnBNdVWzAjOYVkIZzO8uyjQvt6o=";
+  };
+
+  cargoPatches = [
+    ./no-cargo-patch.patch
+  ];
+
+  cargoRoot = "src-tauri";
+  buildAndTestSubdir = cargoRoot;
+
+  useFetchCargoVendor = true;
+  cargoHash = "sha256-5qK1IRaUrf4pYDmoBZoR6q6rL06irurwo4v5JLX+Io4=";
+
+  pnpmDeps = pnpm_9.fetchDeps {
+    inherit pname version src;
+    hash = "sha256-xBonUzA4+1zbViEsKap6CaG6ZRldW1LjNYIB+FmVRFs=";
+  };
+
+  # CMake (webkit extension)
+  cmakeDir = ".";
+  cmakeBuildDir = "src-tauri/extension_webkit";
+  dontUseCmakeConfigure = true;
+  dontUseNinjaBuild = true;
+  dontUseNinjaCheck = true;
+  dontUseNinjaInstall = true;
+  # cmake's supposed to set this automatically
+  # ... but the detection is based on the presence of ninja build hook
+  cmakeFlags = [
+    "-GNinja"
+  ];
+
+  nativeBuildInputs = [
+    pnpm_9.configHook
+    cargo-tauri.hook
+    nodejs
+    pkg-config
+    wrapGAppsHook4
+    yq-go
+    desktop-file-utils
+    cmake
+    ninja
+  ];
+
+  buildInputs = [
+    openssl
+    webkitgtk_4_1'
+    gst_all_1.gst-plugins-base
+    gst_all_1.gst-plugins-bad
+    gst_all_1.gst-plugins-good
+    gst_all_1.gst-plugins-rs
+    glib-networking
+    libsysprof-capture
+    libayatana-appindicator
+  ];
+
+  postPatch = ''
+    # remove updater
+    rm -rf updater
+
+    # patch cargo-deps
+    pushd $cargoDepsCopy/tauri-plugin-shell-*
+    patch -p1 < /build/source/src-tauri/patches/tauri-plugin-shell+*.patch
+    popd
+
+    substituteInPlace $cargoDepsCopy/libappindicator-sys-*/src/lib.rs \
+      --replace "libayatana-appindicator3.so.1" "${libayatana-appindicator}/lib/libayatana-appindicator3.so.1"
+
+    # disable pre-build script and disable auto-updater
+    yq -iPo=json '
+      .bundle.resources = (.bundle.resources | map(select(. != "updater*")))
+    ' src-tauri/tauri.conf.json
+
+    # link shelter injection
+    ln -s ${shelter} src-tauri/injection/shelter.js
+
+    # link html/frontend data
+    ln -s /build/source/src /build/source/src-tauri/html
+  '';
+
+  configurePhase = ''
+    cmakeConfigurePhase
+    pnpmConfigHook
+  '';
+
+  buildPhase = ''
+    ninjaBuildPhase
+    cd /build/source
+    tauriBuildHook
+  '';
+
+  postInstall = ''
+    # Set up the resource directories
+    mkdir -p $out/lib/Dorion
+    ln -s $out/lib/Dorion $out/lib/dorion
+    rm -rf $out/lib/Dorion/injection
+    cp -r src-tauri/injection $out/lib/Dorion
+    cp -r src $out/lib/Dorion
+
+    # Modify the desktop file
+    desktop-file-edit \
+      --set-comment "Tiny alternative Discord client" \
+      --set-key="Exec" --set-value="Dorion %U" \
+      --set-key="TryExec" --set-value="Dorion" \
+      --set-key="StartupWMClass" --set-value="Dorion" \
+      --set-key="StartupNotify" --set-value="true" \
+      --set-key="Categories" --set-value="Network;InstantMessaging;Chat;" \
+      --set-key="Keywords" --set-value="dorion;discord;vencord;chat;im;vc;ds;dc;dsc;tauri;" \
+      --set-key="Terminal" --set-value="false" \
+      --set-key="MimeType" --set-value="x-scheme-handler/discord" \
+      $out/share/applications/Dorion.desktop
+  '';
+
+  # error: failed to run custom build command for `Dorion v6.4.1 (/build/source/src-tauri)`
+  # Permission denied (os error 13)
+  doCheck = false;
+
+  env = {
+    TAURI_RESOURCE_DIR = "${placeholder "out"}/lib";
+  };
+
+  meta = {
+    homepage = "https://spikehd.github.io/projects/dorion/";
+    description = "Tiny alternative Discord client";
+    longDescription = ''
+      Dorion is an alternative Discord client aimed towards lower-spec or
+      storage-sensitive PCs that supports themes, plugins, and more!
+    '';
+    changelog = "https://github.com/SpikeHD/Dorion/releases/tag/v${version}";
+    downloadPage = "https://github.com/SpikeHD/Dorion/releases/tag/v${version}";
+    license = with lib.licenses; [
+      gpl3Only
+      cc0 # Shelter
+    ];
+    mainProgram = "Dorion";
+    maintainers = with lib.maintainers; [
+      nyabinary
+      aleksana
+      griffi-gh
+      getchoo
+    ];
+    platforms = lib.platforms.linux;
+    sourceProvenance = [
+      lib.sourceTypes.binaryBytecode # actually, minified JS
+      lib.sourceTypes.fromSource
+    ];
+  };
+}
diff --git a/pkgs/dorion/no-cargo-patch.patch b/pkgs/dorion/no-cargo-patch.patch
new file mode 100644
index 0000000..d39f967
--- /dev/null
+++ b/pkgs/dorion/no-cargo-patch.patch
@@ -0,0 +1,31 @@
+diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
+index 59f676d..b7090d4 100644
+--- a/src-tauri/Cargo.lock
++++ b/src-tauri/Cargo.lock
+@@ -4954,6 +4954,8 @@ dependencies = [
+ [[package]]
+ name = "tauri-plugin-shell"
+ version = "2.0.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0ad7880c5586b6b2104be451e3d7fc0f3800c84bda69e9ba81c828f87cb34267"
+ dependencies = [
+  "encoding_rs",
+  "log",
+diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
+index 62a508b..0bbe935 100644
+--- a/src-tauri/Cargo.toml
++++ b/src-tauri/Cargo.toml
+@@ -12,13 +12,6 @@ rust-version = "1.81"
+ strip = "debuginfo"
+ lto = true
+ 
+-# Patches
+-[package.metadata.patch]
+-crates = ["tauri-plugin-shell"]
+-
+-[patch.crates-io]
+-tauri-plugin-shell = { path="./target/patch/tauri-plugin-shell-2.0.2" }
+-
+ [build-dependencies]
+ tauri-build = { version = "2.0.0", features = [] }
+