#!/usr/bin/perl # This was a bash script until I determined the level of invoking the ancient gods of the console required to make # that work would be just too much use Storable; #use Data::Dumper; # I know declaring a empty hash is 100% unnessecary but I am anyway %conf = {}; # this will be stored used to keep track of stuff $updfile = "index.json"; # I could use JSON here, but it might be easier to abuse jq $updlsturl = "https://content.minetest.net/api/packages/"; # give use a json file of everything available $modpath = "/home/kake26/.minetest/mods/"; # where your server stores its mods sub chk_update () { print "Checking for updates...\n"; foreach my $key (keys %{ $conf->{"mods"}}) { # the fing arrow -> sigh could have saved so much time print "Checking mod $key \n"; # So we can now check against index2.json $author2 = `jq -c '.[] | select(.name =="$key") | .author' index2.json`; $author2 =~ s/\"//g; $release2 = `jq -c '.[] | select(.name =="$key") | .release' index2.json`; $release2 =~ s/\"//g; chomp($author2); chomp($release2); if ($conf->{"mods"}{$key}{"release"} != $release2) { print "Mod $key current release: " . $release2 . " installed: " . $conf->{"mods"}{$key}{"release"} ."!\n"; # we should trigger the updater here &do_update($key,$release2,$author2); }else{ print "Mod $key up to date\n"; } } } sub get_ready (){ $mods = `find $modpath -type d -maxdepth 1 -print`; # -print is there for a reason, find saved a huge amount of time @mods = split("\n",$mods); foreach(@mods){ @tmods = split("\/",$_); $tmname = pop(@tmods); if ($tmname eq "mods"){ next; } # At this point we should have a mod's name $author = `jq -c '.[] | select(.name =="$tmname") | .author' index.json`; #jq is a time saver $author =~ s/\"//g; chomp($author); $release = `jq -c '.[] | select(.name =="$tmname") | .release' index.json`; $release =~ s/\"//g; chomp($release); $conf{"mods"}{$tmname}{"author"} = $author; $conf{"mods"}{$tmname}{"release"} = $release; } store \%conf, 'mods'; return; } sub get_file () { # get the system("wget -O index2.json $updlsturl"); return; } sub do_update ($mod,$ver,$author) { # https://content.minetest.net/packages/TenPlus1/mob_horse/download/ # https://content.minetest.net/packages/jp/i3/releases/14157/download/ $mod = $_[0]; $ver = $_[1]; $author = $_[2]; system("wget -O $mod.zip https://content.minetest.net/packages/$author/$mod/releases/$ver/download/"); system("unzip -o $mod.zip"); # print "Update info $mod $ver $author\n"; } sub update_files () { # This is triggered when mod updates are detected system("rm index.json"); system("cp index2.json index.json"); system("rm mods"); undef(%conf); &get_ready(); return; } # Maybe get ready and check update should be called every time if (-e "mods"){ # load data print "Loading data\n"; $conf = retrieve('mods'); get_file(); chk_update(); update_files(); }else{ # check if index.json exists if not then create it if (-e "index.json") { # do noothing }else{ system("wget -O index.json $updlsturl"); } get_ready(); # chk_update expects a hash retrived from storables so program needs to be run again after this #chk_update(); }