From 0eac3689a42dde4d17b94442689569be43ef512d Mon Sep 17 00:00:00 2001 From: Rory& Date: Thu, 25 Apr 2024 08:45:02 +0000 Subject: [PATCH] draupnir: init at 2.0.0-beta.11 --- pkgs/by-name/dr/draupnir/hashes.json | 3 + pkgs/by-name/dr/draupnir/package.json | 89 ++++++++++++++++++ pkgs/by-name/dr/draupnir/package.nix | 124 ++++++++++++++++++++++++++ pkgs/by-name/dr/draupnir/update.sh | 39 ++++++++ 4 files changed, 255 insertions(+) create mode 100644 pkgs/by-name/dr/draupnir/hashes.json create mode 100644 pkgs/by-name/dr/draupnir/package.json create mode 100644 pkgs/by-name/dr/draupnir/package.nix create mode 100755 pkgs/by-name/dr/draupnir/update.sh diff --git a/pkgs/by-name/dr/draupnir/hashes.json b/pkgs/by-name/dr/draupnir/hashes.json new file mode 100644 index 00000000000000..dd13bad3c6d444 --- /dev/null +++ b/pkgs/by-name/dr/draupnir/hashes.json @@ -0,0 +1,3 @@ +{ + "yarn_offline_cache_hash": "sha256-pT7OV4criLnohiye+8t9bkn9jScJpdXtpv4eualsphM=" +} diff --git a/pkgs/by-name/dr/draupnir/package.json b/pkgs/by-name/dr/draupnir/package.json new file mode 100644 index 00000000000000..4c252c473c63b3 --- /dev/null +++ b/pkgs/by-name/dr/draupnir/package.json @@ -0,0 +1,89 @@ +{ + "name": "draupnir", + "version": "2.0.0-beta.11", + "description": "A moderation tool for Matrix", + "main": "lib/index.js", + "repository": "https://github.com/the-draupnir-project/Draupnir.git", + "author": "Gnuxie", + "license": "AFL-3.0", + "private": true, + "scripts": { + "build": "tsc --project test/tsconfig.json && tsc > /dev/null 2>&1", + "postbuild": "corepack yarn describe-version", + "describe-version": "(git describe > version.txt.tmp && mv version.txt.tmp version.txt) || true && rm -f version.txt.tmp", + "remove-tests-from-lib": "rm -rf lib/test/ && cp -r lib/src/* lib/ && rm -rf lib/src/", + "lint": "corepack yarn eslint --cache src test && corepack yarn prettier --cache --ignore-unknown --check src test", + "start:dev": "corepack yarn build && node --async-stack-traces lib/index.js", + "test:unit": "mocha --require './test/tsnode.cjs' --forbid-only 'test/unit/**/*.{ts,tsx}'", + "test:unit:single": "mocha --require test/tsnode.cjs", + "test:integration": "NODE_ENV=harness mocha --require test/tsnode.cjs --async-stack-traces --forbid-only --require test/integration/fixtures.ts --timeout 300000 --project ./tsconfig.json \"test/integration/**/*Test.ts\"", + "test:integration:single": "NODE_ENV=harness corepack yarn mocha --require test/tsnode.cjs --require test/integration/fixtures.ts --timeout 300000 --project ./tsconfig.json", + "test:appservice:integration": "NODE_ENV=harness mocha --require test/tsnode.cjs --async-stack-traces --forbid-only --timeout 300000 --project ./tsconfig.json \"test/appservice/integration/**/*Test.ts\"", + "test:appservice:integration:single": "NODE_ENV=harness corepack yarn mocha --require test/tsnode.cjs --timeout 300000 --project ./tsconfig.json", + "test:manual": "NODE_ENV=harness ts-node test/integration/manualLaunchScript.ts", + "version": "sed -i '/# version automated/s/[0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][^\"]*/'$npm_package_version'/' synapse_antispam/setup.py && git add synapse_antispam/setup.py && cat synapse_antispam/setup.py" + }, + "devDependencies": { + "@eslint/js": "^9.7.0", + "@types/better-sqlite3": "^7.6.9", + "@types/config": "^3.3.1", + "@types/crypto-js": "^4.2.2", + "@types/eslint__js": "^8.42.3", + "@types/express": "^4.17.21", + "@types/html-to-text": "^8.0.1", + "@types/humanize-duration": "^3.27.1", + "@types/js-yaml": "^4.0.9", + "@types/jsdom": "21.1.7", + "@types/mocha": "^10.0.7", + "@types/nedb": "^1.8.16", + "@types/node": "^20.14.11", + "@types/pg": "^8.6.5", + "@types/request": "^2.48.12", + "@types/shell-quote": "1.7.5", + "crypto-js": "^4.2.0", + "eslint": "^9.7.0", + "expect": "^29.7.0", + "mocha": "^10.7.0", + "prettier": "^3.3.3", + "ts-auto-mock": "^3.7.4", + "ts-node": "^10.9.2", + "typescript": "^5.5.3", + "typescript-eslint": "^7.16.1", + "typescript-formatter": "^7.2" + }, + "dependencies": { + "@gnuxie/typescript-result": "^1.0.0", + "@sentry/node": "^7.17.2", + "@sentry/tracing": "^7.17.2", + "@sinclair/typebox": "0.34.13", + "@the-draupnir-project/interface-manager": "3.0.0", + "@the-draupnir-project/matrix-basic-types": "^0.2.0", + "await-lock": "^2.2.2", + "better-sqlite3": "^9.4.3", + "body-parser": "^1.20.2", + "config": "^3.3.9", + "express": "^4.19", + "html-to-text": "^8.0.0", + "humanize-duration": "^3.27.1", + "humanize-duration-ts": "^2.1.1", + "js-yaml": "^4.1.0", + "jsdom": "^24.0.0", + "matrix-appservice-bridge": "^10.3.1", + "matrix-bot-sdk": "npm:@vector-im/matrix-bot-sdk@^0.7.1-element.6", + "matrix-protection-suite": "npm:@gnuxie/matrix-protection-suite@2.5.1", + "matrix-protection-suite-for-matrix-bot-sdk": "npm:@gnuxie/matrix-protection-suite-for-matrix-bot-sdk@2.5.1", + "parse-duration": "^1.0.2", + "pg": "^8.8.0", + "shell-quote": "^1.7.3", + "ulidx": "^2.2.1", + "yaml": "^2.3.2" + }, + "overrides": { + "matrix-bot-sdk": "$@vector-im/matrix-bot-sdk", + "@vector-im/matrix-bot-sdk": "npm:@vector-im/matrix-bot-sdk@^0.7.1-element.6" + }, + "engines": { + "node": ">=20.0.0" + }, + "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610" +} diff --git a/pkgs/by-name/dr/draupnir/package.nix b/pkgs/by-name/dr/draupnir/package.nix new file mode 100644 index 00000000000000..5659f587129dd1 --- /dev/null +++ b/pkgs/by-name/dr/draupnir/package.nix @@ -0,0 +1,124 @@ +{ + lib, + fetchFromGitHub, + makeWrapper, + nodejs, + matrix-sdk-crypto-nodejs, + python3, + sqlite, + srcOnly, + removeReferencesTo, + mkYarnPackage, + fetchYarnDeps, + nixosTests, +}: + +# docs: https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks/javascript.section.md#yarn2nix-javascript-yarn2nix +let + hashesFile = builtins.fromJSON (builtins.readFile ./hashes.json); + nodeSources = srcOnly nodejs; +in +mkYarnPackage rec { + pname = "draupnir"; + version = "2.0.0-beta.11"; + src = fetchFromGitHub { + owner = "the-draupnir-project"; + repo = "Draupnir"; + rev = "v${version}"; + hash = "sha256-jh0DpThlopP5nSTKqNh7BLjGGlz2vTFUafUI2R6wOT0="; + }; + + nativeBuildInputs = [ + makeWrapper + sqlite + ]; + + offlineCache = fetchYarnDeps { + name = "${pname}-yarn-offline-cache"; + yarnLock = src + "/yarn.lock"; + hash = hashesFile.yarn_offline_cache_hash; + }; + + yarnLock = src + "/yarn.lock"; + packageJSON = ./package.json; + + pkgConfig = { + "@matrix-org/matrix-sdk-crypto-nodejs" = { + postInstall = '' + # replace with the built package + cd .. + rm -r matrix-sdk-crypto-nodejs + ln -s ${matrix-sdk-crypto-nodejs}/lib/node_modules/@matrix-org/* ./ + ''; + }; + + better-sqlite3 = { + nativeBuildInputs = [ python3 ]; + postInstall = '' + # build native sqlite bindings + npm run build-release --offline --nodedir="${nodeSources}" + find build -type f -exec \ + ${removeReferencesTo}/bin/remove-references-to \ + -t "${nodeSources}" {} \; + ''; + }; + }; + + #prebuild phase + preBuild = '' + echo "Adding version.txt..." + mkdir -p deps/draupnir/ + echo "${version}-nix" > deps/draupnir/version.txt + + sed -i 's/corepack //g' deps/draupnir/package.json + ''; + + buildPhase = '' + runHook preBuild + echo "Building..." + yarn --offline --verbose build + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out/share + cp -a . $out/share/draupnir + + makeWrapper ${nodejs}/bin/node $out/bin/draupnir \ + --add-flags $out/share/draupnir/deps/draupnir/lib/index.js + + runHook postInstall + ''; + distPhase = "true"; + + passthru = { + tests = { + inherit (nixosTests) draupnir; + }; + updateScript = ./update.sh; + }; + + meta = with lib; { + description = "A moderation tool for Matrix"; + homepage = "https://github.com/the-draupnir-project/Draupnir"; + longDescription = '' + As an all-in-one moderation tool, it can protect your server from + malicious invites, spam messages, and whatever else you don't want. + In addition to server-level protection, Draupnir is great for communities + wanting to protect their rooms without having to use their personal + accounts for moderation. + + The bot by default includes support for bans, redactions, anti-spam, + server ACLs, room directory changes, room alias transfers, account + deactivation, room shutdown, and more. + + A Synapse module is also available to apply the same rulesets the bot + uses across an entire homeserver. + ''; + license = licenses.afl3; + maintainers = with maintainers; [ RorySys ]; + mainProgram = "draupnir"; + }; +} diff --git a/pkgs/by-name/dr/draupnir/update.sh b/pkgs/by-name/dr/draupnir/update.sh new file mode 100755 index 00000000000000..78842bfcbfc449 --- /dev/null +++ b/pkgs/by-name/dr/draupnir/update.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i bash -p curl common-updater-scripts coreutils jq prefetch-yarn-deps git + +set -euo pipefail +set -x + +cd "$(git rev-parse --show-toplevel)" + +TMPDIR=$(mktemp -d) + +echo "Getting versions..." +latestVersion="$(curl -sL "https://api.github.com/repos/the-draupnir-project/Draupnir/releases?per_page=1" | jq -r '.[0].tag_name | ltrimstr("v")')" +echo " --> Latest version: ${latestVersion}" +currentVersion=$(nix-instantiate --eval -E "with import ./. {}; draupnir.version or (lib.getVersion draupnir)" | tr -d '"') +echo " --> Current version: ${currentVersion}" +if [[ "$currentVersion" == "$latestVersion" ]]; then + echo "Draupnir is up-to-date: $currentVersion" + exit 0 +else + echo "We are out of date..." +fi + +curl https://raw.githubusercontent.com/the-draupnir-project/Draupnir/v$latestVersion/package.json -o pkgs/by-name/dr/draupnir/package.json + +update-source-version draupnir "$latestVersion" + +# Update yarn offline cache hash +cd $TMPDIR + +curl https://raw.githubusercontent.com/the-draupnir-project/Draupnir/v$latestVersion/yarn.lock -o yarn.lock +TMP_PREFETCH_HASH=`prefetch-yarn-deps yarn.lock` +NEW_YARN_OFFLINE_HASH=`nix hash to-sri --type sha256 $TMP_PREFETCH_HASH` + +cd - +echo "New yarn offline hash: $NEW_YARN_OFFLINE_HASH" + +TMPFILE=$(mktemp) +jq '.yarn_offline_cache_hash = "'$NEW_YARN_OFFLINE_HASH'"' pkgs/by-name/dr/draupnir/hashes.json > $TMPFILE +mv -- "$TMPFILE" pkgs/by-name/dr/draupnir/hashes.json