Migrate A2-D1 (Mac Mini) to A1-D1 (clicks server)

Signed-off-by: Skyler Grey <skyler3665@gmail.com>
diff --git a/services/clicksforms/default.nix b/services/clicksforms/default.nix
new file mode 100644
index 0000000..e1cd51d
--- /dev/null
+++ b/services/clicksforms/default.nix
@@ -0,0 +1,26 @@
+{ nixpkgs-clicksforms, system, config, lib, ... }: let
+  pkgsOld = nixpkgs-clicksforms.legacyPackages.${system};
+in { 
+  home.packages = [
+    (pkgsOld.python3.withPackages (pyPkgs: with pyPkgs; [
+      databases
+      sqlalchemy
+      orm
+      typesystem
+      (pyPkgs.callPackage ./discordpy.nix {})
+      aiohttp
+      fastapi
+      aiosqlite
+      uvicorn
+      validators
+      (
+        pyPkgs.fetchPypi {
+          pname = "jishaku";
+          version = "2.5.1";
+          hash = lib.fakeSha256;
+        }
+      )
+      slowapi
+    ]))
+  ];
+}
diff --git a/services/clicksforms/discordpy.nix b/services/clicksforms/discordpy.nix
new file mode 100644
index 0000000..83aed0f
--- /dev/null
+++ b/services/clicksforms/discordpy.nix
@@ -0,0 +1,64 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, libopus
+, pynacl
+, pythonOlder
+, withVoice ? true
+, ffmpeg
+}:
+
+buildPythonPackage rec {
+  pname = "discord.py";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Rapptz";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Rh3gijm67LVyOaliP7w3YwKviKydnxXvu4snNrM5H1c=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ] ++ lib.optionals withVoice [
+    libopus
+    pynacl
+    ffmpeg
+  ];
+
+  patchPhase = ''
+    substituteInPlace "discord/opus.py" \
+      --replace "ctypes.util.find_library('opus')" "'${libopus}/lib/libopus.so.0'"
+  '' + lib.optionalString withVoice ''
+    substituteInPlace "discord/player.py" \
+      --replace "executable='ffmpeg'" "executable='${ffmpeg}/bin/ffmpeg'"
+  '';
+
+  # Only have integration tests with discord
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "discord"
+    "discord.file"
+    "discord.member"
+    "discord.user"
+    "discord.state"
+    "discord.guild"
+    "discord.webhook"
+    "discord.ext.commands.bot"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the Discord API";
+    homepage = "https://discordpy.rtfd.org/";
+    changelog = "https://github.com/Rapptz/discord.py/blob/v${version}/docs/whats_new.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ minion3665 ];
+  };
+}
+