109 lines
3.7 KiB
Nix
109 lines
3.7 KiB
Nix
{
|
|
lib,
|
|
config,
|
|
pkgs,
|
|
...
|
|
}:
|
|
let
|
|
waniKani-bypass-lessons = pkgs.writeShellApplication {
|
|
name = "wanikani-bypass-lessons";
|
|
runtimeInputs = with pkgs; [
|
|
curl
|
|
jq
|
|
];
|
|
text = ''
|
|
#!/usr/bin/env bash
|
|
|
|
# this token that starts with "2da24" is read only so i am keeping it public, i have nothing secret on my wanikani account
|
|
# but i need a write token for the second part of this script
|
|
|
|
# i am going to read it from /persist/wanikani
|
|
|
|
[ ! -e /persist/wanikani ] && echo "/persist/wanikani doesnt exist here :(" && exit 1
|
|
|
|
WANIKANI_TOKEN=$(< /persist/wanikani)
|
|
|
|
# Maximum number of reviews to maintain
|
|
MAX_REVIEWS=200
|
|
|
|
echo "=== Checking current reviews ==="
|
|
|
|
# Get current reviews (SRS stages 0-4)
|
|
current_reviews=0
|
|
for i in {0..4}; do
|
|
stage_count=$(curl -s -H "Authorization: Bearer 2da24e4a-ba89-4c4a-9047-d08f21e9dd01" "https://api.wanikani.com/v2/assignments?srs_stages=$i" | jq '.total_count')
|
|
current_reviews=$((current_reviews + stage_count))
|
|
echo "SRS stage $i: $stage_count items"
|
|
done
|
|
|
|
echo "Current total reviews: $current_reviews"
|
|
echo "Maximum reviews target: $MAX_REVIEWS"
|
|
|
|
if [ "$current_reviews" -ge "$MAX_REVIEWS" ]; then
|
|
echo "Reviews ($current_reviews) >= max ($MAX_REVIEWS). No lessons to bypass."
|
|
sleep 3600
|
|
exit 0
|
|
fi
|
|
|
|
lessons_to_bypass=$((MAX_REVIEWS - current_reviews))
|
|
echo "Need to bypass $lessons_to_bypass lessons to reach $MAX_REVIEWS total"
|
|
|
|
# Get available lessons (limited to what we need)
|
|
ASSIGNMENT_IDS=$(curl -s -H "Authorization: Bearer 2da24e4a-ba89-4c4a-9047-d08f21e9dd01" "https://api.wanikani.com/v2/assignments?immediately_available_for_lessons=true" | jq -r ".data[] | .id" | head -n "$lessons_to_bypass")
|
|
|
|
available_lessons=$(echo "$ASSIGNMENT_IDS" | wc -l)
|
|
echo "Available lessons: $available_lessons"
|
|
|
|
if [ "$available_lessons" -eq 0 ]; then
|
|
echo "No lessons available to bypass."
|
|
sleep 3600
|
|
exit 0
|
|
fi
|
|
|
|
# Limit to what we actually need
|
|
actual_bypass=$(echo "$ASSIGNMENT_IDS" | wc -l)
|
|
echo "Will bypass $actual_bypass lessons"
|
|
|
|
# "2017-09-05T23:41:28.980679Z" i need to create this from current time
|
|
|
|
TIME_STRING=$(date -u +"%Y-%m-%dT%H:%M:%S.%6NZ")
|
|
echo "Current time: $TIME_STRING"
|
|
|
|
echo "=== Starting assignments ==="
|
|
for assignment_id in $ASSIGNMENT_IDS; do
|
|
echo "Starting assignment $assignment_id"
|
|
curl -s "https://api.wanikani.com/v2/assignments/$assignment_id/start" \
|
|
-X "PUT" \
|
|
-H "Wanikani-Revision: 20170710" \
|
|
-H "Content-Type: application/json; charset=utf-8" \
|
|
-H "Authorization: Bearer $WANIKANI_TOKEN" \
|
|
-d "{\"assignment\": {\"started_at\": \"$TIME_STRING\" }}"
|
|
echo
|
|
sleep 1
|
|
done
|
|
|
|
echo "Successfully bypassed $actual_bypass lessons"
|
|
echo "New total should be approximately: $((current_reviews + actual_bypass))"
|
|
sleep 3600
|
|
'';
|
|
};
|
|
in
|
|
{
|
|
options.services.wanikani-bypass-lessons.enable = lib.mkEnableOption {
|
|
description = "Enable WaniKani Bypass Lessons";
|
|
default = config.osbmModules.services.wanikani-bypass-lessons.enable or false;
|
|
};
|
|
|
|
config = lib.mkIf config.services.wanikani-bypass-lessons.enable {
|
|
systemd.services.wanikani-bypass-lessons = {
|
|
description = "WaniKani Bypass Lessons";
|
|
wantedBy = [ "multi-user.target" ];
|
|
serviceConfig = {
|
|
Type = "simple";
|
|
ExecStart = "${lib.getExe waniKani-bypass-lessons}";
|
|
Restart = "always";
|
|
RestartSec = 60 * 60;
|
|
};
|
|
};
|
|
};
|
|
}
|