commit c5f3549e8e5367492f851f6f03209cdc6822002d Author: player Date: Sat Aug 15 00:28:04 2026 +0700 init: workspace opencode sync diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cec1def --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.log +__pycache__/ +*.pyc.DS_Store +node_modules/.env + diff --git a/routeros/monitor-expiry.rsc b/routeros/monitor-expiry.rsc new file mode 100644 index 0000000..1672cbb --- /dev/null +++ b/routeros/monitor-expiry.rsc @@ -0,0 +1,72 @@ +# Monitor hotspot user expiry — unified +# Monitors: Bulanan2, Bulanan4, Family, home +# Voucher (vc-2K3J, vc-5K10J): removed when expired +# Bulanan/Family/home: limit-uptime=1s when expired + +:local montharray { "jan"; "feb"; "mar"; "apr"; "may"; "jun"; "jul"; "aug"; "sep"; "oct"; "nov"; "dec" } + +:local dateint do={ + :local days [:pick $d 4 6] + :local monthstr [:pick $d 0 3] + :local year [:pick $d 7 11] + :local monthint ([ :find $montharray $monthstr ] + 1) + :local month "$monthint" + :if ([len $month] = 1) do={ :set month "0$month" } + :return [:tonum "$year$month$days"] +} + +:local timeint do={ + :local hours [:pick $t 0 2] + :local minutes [:pick $t 3 5] + :return ($hours * 60 + $minutes) +} + +:local now [/system clock get date] +:local nowtime [/system clock get time] +:local today [$dateint d=$now] +:local curtime [$timeint t=$nowtime] + +:local profiles { "Bulanan2"; "Bulanan4"; "Family"; "home" } +:local vouchProfiles { "vc-2K3J"; "vc-5K10J" } + +:local expiredCount 0 + +:foreach profile in=$profiles do={ + :foreach i in=[/ip hotspot user find where profile=$profile] do={ + :local comment [/ip hotspot user get $i comment] + :local name [/ip hotspot user get $i name] + :if (([:pick $comment 3] = "/") and ([:pick $comment 6] = "/")) do={ + :local expd [$dateint d=$comment] + :local exptStart [:pick $comment 12 20] + :local exptMin [$timeint t=$exptStart] + :if (($expd < $today) or (($expd = $today) and ($exptMin < $curtime))) do={ + /ip hotspot user set limit-uptime=1s $i + /ip hotspot active remove [find where user=$name] + :set expiredCount ($expiredCount + 1) + :log info ("Expired: " . $name . " (" . $profile . ")") + } + } + } +} + +:foreach profile in=$vouchProfiles do={ + :foreach i in=[/ip hotspot user find where profile=$profile] do={ + :local comment [/ip hotspot user get $i comment] + :local name [/ip hotspot user get $i name] + :if (([:pick $comment 3] = "/") and ([:pick $comment 6] = "/")) do={ + :local expd [$dateint d=$comment] + :local exptStart [:pick $comment 12 20] + :local exptMin [$timeint t=$exptStart] + :if (($expd < $today) or (($expd = $today) and ($exptMin < $curtime))) do={ + /ip hotspot user remove $i + /ip hotspot active remove [find where user=$name] + :set expiredCount ($expiredCount + 1) + :log info ("Voucher expired & removed: " . $name) + } + } + } +} + +:if ($expiredCount > 0) do={ + :log info ("Monitor-expiry: " . $expiredCount . " user(s) expired") +}