From 378515d29b29db92b78376d4035040506e7d0cf5 Mon Sep 17 00:00:00 2001 From: Deon George Date: Thu, 28 Nov 2024 22:07:39 +1100 Subject: [PATCH] Implemented filefix %SCAN/%RESCAN, and some cosmetic cleanup --- .../FTN/Process/Netmail/Robot/Areafix.php | 23 +++++-- .../Process/Netmail/Robot/Areafix/Rescan.php | 11 +-- .../Process/Netmail/Robot/Areafix/Scan.php | 11 +-- .../FTN/Process/Netmail/Robot/Filefix.php | 21 ++++-- .../Process/Netmail/Robot/Filefix/Area.php | 4 +- .../Netmail/Robot/Filefix/Filelist.php | 15 +++-- .../Process/Netmail/Robot/Filefix/Rescan.php | 67 +++++++++++++++++++ .../Process/Netmail/Robot/Filefix/Scan.php | 67 +++++++++++++++++++ app/Jobs/AreafixRescan.php | 18 ++--- app/Jobs/FilefixRescan.php | 22 +++--- app/Models/Echomail.php | 1 + app/Models/File.php | 1 + 12 files changed, 211 insertions(+), 50 deletions(-) create mode 100644 app/Classes/FTN/Process/Netmail/Robot/Filefix/Rescan.php create mode 100644 app/Classes/FTN/Process/Netmail/Robot/Filefix/Scan.php diff --git a/app/Classes/FTN/Process/Netmail/Robot/Areafix.php b/app/Classes/FTN/Process/Netmail/Robot/Areafix.php index 9cd7133..353cfd1 100644 --- a/app/Classes/FTN/Process/Netmail/Robot/Areafix.php +++ b/app/Classes/FTN/Process/Netmail/Robot/Areafix.php @@ -25,7 +25,7 @@ final class Areafix extends Robot if ((strtolower($mo->to) !== 'areafix') || (! ($mo instanceof Netmail))) return FALSE; - Log::info(sprintf('%s:- Processing AREAFIX [%s] message from (%s) [%s]', self::LOGKEY, $mo->to, $mo->from, $mo->fftn->ftn)); + Log::info(sprintf('%s:- Processing AREAFIX [%s] message from (%s) [%s]',self::LOGKEY,$mo->to,$mo->from,$mo->fftn->ftn)); return parent::handle($mo); } @@ -36,21 +36,32 @@ final class Areafix extends Robot $result->push('--> BEGIN <--'); foreach ($mo->body_lines as $command) { + Log::debug(sprintf('%s:* Processing command [%s]',self::LOGKEY,$command)); + // Skip empty lines - if (! $command) + if (! $command || preg_match('/^\s+$/',$command)) continue; - $command = explode(' ',strtoupper(trim($command))); + $command = explode(' ',strtoupper(rtrim($command))); + Log::debug(sprintf('%s:* Processing command',self::LOGKEY),['command'=>$command]); // If command starts with '...' or '---', its a tear/tag line, and we have reached the end if (str_starts_with($command[0],'...') || str_starts_with($command[0],'---')) { - Log::debug(sprintf('%s:= We got a tearline/tagline, end of processing',self::LOGKEY)); + Log::info(sprintf('%s:= We got a tearline/tagline, end of processing',self::LOGKEY)); - $result->push('--> END OF PROCESSING <--'); + $result->push('--> END OF PROCESSING - TEARLINE/TAGLINE <--'); break; - // If command doesnt start with %, its an area + // Lines starting with a space, we'll abort + } elseif (! $command[0]) { + Log::info(sprintf('%s:= Got a new line with a space, end of processing',self::LOGKEY)); + + $result->push('--> END OF PROCESSING - SPACE DETECTED <--'); + + break; + + // If command doesnt start with %, its an area } elseif (! str_starts_with($command[0],'%')) { Log::info(sprintf('%s:= Assuming command [%s] is an AREA command',self::LOGKEY,$command[0])); diff --git a/app/Classes/FTN/Process/Netmail/Robot/Areafix/Rescan.php b/app/Classes/FTN/Process/Netmail/Robot/Areafix/Rescan.php index ff6b9f4..250201c 100644 --- a/app/Classes/FTN/Process/Netmail/Robot/Areafix/Rescan.php +++ b/app/Classes/FTN/Process/Netmail/Robot/Areafix/Rescan.php @@ -2,6 +2,7 @@ namespace App\Classes\FTN\Process\Netmail\Robot\Areafix; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\Log; use App\Jobs\AreafixRescan; @@ -21,7 +22,7 @@ class Rescan extends Base ' Arguments:', ' - ECHOAREA (required) name of area to subscribe or unsubscribe', ' - DAYS (optional) number of days to resend mail from this area that you', - ' If DAYS is omitted, the default is 30', + ' If DAYS is omitted, the default is 30.', ]; } @@ -31,19 +32,19 @@ class Rescan extends Base $command = self::command.' '.join(' ',$this->arguments); - if (! is_numeric($this->arguments[1])) + if (! is_numeric($days=Arr::get($this->arguments,1,30))) return sprintf('%-25s <-- INVALID, DAYS [%s] NOT NUMERIC',$command,$this->arguments[1]); // Area exists if ($ea=$this->mo->fftn->domain->echoareas->where('name',$this->arguments[0])->pop()) { // If already subscribed if ($this->mo->fftn->echoareas->pluck('name')->contains($this->arguments[0])) { - AreafixRescan::dispatch($this->mo->fftn,$ea,$this->arguments[1],TRUE) + AreafixRescan::dispatch($this->mo->fftn,$ea,$days,TRUE) ->onQueue('mail'); - Log::debug(sprintf('%s:- FTN [%s] RESCAN [%s] DAYS [%d]',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0],$this->arguments[1])); + Log::debug(sprintf('%s:- FTN [%s] RESCAN [%s] DAYS [%d]',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0],$days)); - return sprintf('%-25s <-- RESCAN [%d] DAYS queued',$command,$this->arguments[1]); + return sprintf('%-25s <-- RESCAN [%d] DAYS queued',$command,$days); // If not subscribed } else { diff --git a/app/Classes/FTN/Process/Netmail/Robot/Areafix/Scan.php b/app/Classes/FTN/Process/Netmail/Robot/Areafix/Scan.php index 266fdbb..f7e4442 100644 --- a/app/Classes/FTN/Process/Netmail/Robot/Areafix/Scan.php +++ b/app/Classes/FTN/Process/Netmail/Robot/Areafix/Scan.php @@ -2,6 +2,7 @@ namespace App\Classes\FTN\Process\Netmail\Robot\Areafix; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\Log; use App\Jobs\AreafixRescan; @@ -22,7 +23,7 @@ class Scan extends Base ' Arguments:', ' - ECHOAREA (required) name of area to subscribe or unsubscribe', ' - DAYS (optional) number of days to resend mail from this area that you', - ' If DAYS is omitted, the default is 30', + ' If DAYS is omitted, the default is 30.', ]; } @@ -32,19 +33,19 @@ class Scan extends Base $command = self::command.' '.join(' ',$this->arguments); - if (! is_numeric($this->arguments[1])) + if (! is_numeric($days=Arr::get($this->arguments,1,30))) return sprintf('%-25s <-- INVALID, DAYS [%s] NOT NUMERIC',$command,$this->arguments[1]); // Area exists if ($ea=$this->mo->fftn->domain->echoareas->where('name',$this->arguments[0])->pop()) { // If already subscribed if ($this->mo->fftn->echoareas->pluck('name')->contains($this->arguments[0])) { - AreafixRescan::dispatch($this->mo->fftn,$ea,$this->arguments[1]) + AreafixRescan::dispatch($this->mo->fftn,$ea,$days) ->onQueue('mail'); - Log::debug(sprintf('%s:- FTN [%s] SCAN [%s] DAYS [%d]',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0],$this->arguments[1])); + Log::debug(sprintf('%s:- FTN [%s] SCAN [%s] DAYS [%d]',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0],$days)); - return sprintf('%-25s <-- SCAN [%d] DAYS queued',$command,$this->arguments[1]); + return sprintf('%-25s <-- SCAN [%d] DAYS queued',$command,$days); // If not subscribed } else { diff --git a/app/Classes/FTN/Process/Netmail/Robot/Filefix.php b/app/Classes/FTN/Process/Netmail/Robot/Filefix.php index 13ba18b..970e1e9 100644 --- a/app/Classes/FTN/Process/Netmail/Robot/Filefix.php +++ b/app/Classes/FTN/Process/Netmail/Robot/Filefix.php @@ -25,7 +25,7 @@ final class Filefix extends Robot if ((strtolower($mo->to) !== 'filefix') || (! ($mo instanceof Netmail))) return FALSE; - Log::info(sprintf('%s:- Processing FILEFIX [%s] message from (%s) [%s]', self::LOGKEY, $mo->to, $mo->from, $mo->fftn->ftn)); + Log::info(sprintf('%s:- Processing FILEFIX [%s] message from (%s) [%s]',self::LOGKEY,$mo->to,$mo->from,$mo->fftn->ftn)); return parent::handle($mo); } @@ -36,17 +36,28 @@ final class Filefix extends Robot $result->push('--> BEGIN <--'); foreach ($mo->body_lines as $command) { + Log::debug(sprintf('%s:* Processing command [%s]',self::LOGKEY,$command)); + // Skip empty lines - if (! $command) + if (! $command || preg_match('/^\s+$/',$command)) continue; - $command = explode(' ',strtoupper(trim($command))); + $command = explode(' ',strtoupper(rtrim($command))); + Log::debug(sprintf('%s:* Processing command',self::LOGKEY),['command'=>$command]); // If command starts with '...' or '---', its a tear/tag line, and we have reached the end if (str_starts_with($command[0],'...') || str_starts_with($command[0],'---')) { - Log::debug(sprintf('%s:= We got a tearline/tagline, end of processing',self::LOGKEY)); + Log::info(sprintf('%s:= We got a tearline/tagline, end of processing',self::LOGKEY)); - $result->push('--> END OF PROCESSING <--'); + $result->push('--> END OF PROCESSING - TEARLINE/TAGLINE <--'); + + break; + + // Lines starting with a space, we'll abort + } elseif (! $command[0]) { + Log::info(sprintf('%s:= Got a new line with a space, end of processing',self::LOGKEY)); + + $result->push('--> END OF PROCESSING - SPACE DETECTED <--'); break; diff --git a/app/Classes/FTN/Process/Netmail/Robot/Filefix/Area.php b/app/Classes/FTN/Process/Netmail/Robot/Filefix/Area.php index 8914a6f..b56e64a 100644 --- a/app/Classes/FTN/Process/Netmail/Robot/Filefix/Area.php +++ b/app/Classes/FTN/Process/Netmail/Robot/Filefix/Area.php @@ -87,7 +87,7 @@ class Area extends Base return sprintf('%-25s <-- UNSUBSCRIBED, CLEARED [%d] FILES from queue',$command,$x); } - // If not subscribed + // If not subscribed } else { // requesting to subscribe, subsubsribe and rescan if arguments if ($sub) { @@ -136,7 +136,7 @@ class Area extends Base } } else { - Log::debug(sprintf('%s:- FTN [%s] area UNKNOWN [%s], NO ACTION taken',self::LOGKEY,$this->mo->fftn->ftn,$area)); + Log::debug(sprintf('%s:- FILE [%s] area UNKNOWN [%s], NO ACTION taken',self::LOGKEY,$this->mo->fftn->ftn,$area)); return sprintf('%-25s <-- AREA UNKNOWN, NO ACTION TAKEN',$command); } diff --git a/app/Classes/FTN/Process/Netmail/Robot/Filefix/Filelist.php b/app/Classes/FTN/Process/Netmail/Robot/Filefix/Filelist.php index adefb4e..f6dc70f 100644 --- a/app/Classes/FTN/Process/Netmail/Robot/Filefix/Filelist.php +++ b/app/Classes/FTN/Process/Netmail/Robot/Filefix/Filelist.php @@ -2,6 +2,7 @@ namespace App\Classes\FTN\Process\Netmail\Robot\Filefix; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Notification; @@ -34,22 +35,22 @@ class Filelist extends Base $command = self::command.' '.join(' ',$this->arguments); - if (! is_numeric($this->arguments[1])) + if (! is_numeric($days=Arr::get($this->arguments,1,30))) return sprintf('%-25s <-- INVALID, DAYS [%s] NOT NUMERIC',$command,$this->arguments[1]); - if ($this->arguments[1] > 365) - $this->arguments[1] = 365; + if ($days > 365) + $days = 365; // Area exists if ($fa=$this->mo->fftn->domain->fileareas->where('name',$this->arguments[0])->pop()) { // If already subscribed if ($this->mo->fftn->fileareas->pluck('name')->contains($this->arguments[0])) { Notification::route('netmail',$this->mo->fftn) - ->notify(new FileListNotification($this->mo,$fa,$this->arguments[1])); + ->notify(new FileListNotification($this->mo,$fa,$days)); - Log::debug(sprintf('%s:- FTN [%s] FILELIST [%s] DAYS [%d]',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0],$this->arguments[1])); + Log::debug(sprintf('%s:- FTN [%s] FILELIST [%s] DAYS [%d]',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0],$days)); - return sprintf('%-25s <-- FILELIST [%d] DAYS',$command,$this->arguments[1]); + return sprintf('%-25s <-- FILELIST [%d] DAYS',$command,$days); // If not subscribed } else { @@ -59,7 +60,7 @@ class Filelist extends Base } } else { - Log::debug(sprintf('%s:- FTN [%s] area UNKNOWN [%s], NO ACTION taken',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0])); + Log::debug(sprintf('%s:- FILE [%s] area UNKNOWN [%s], NO ACTION taken',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0])); return sprintf('%-25s <-- AREA UNKNOWN, NO ACTION TAKEN',$command); } diff --git a/app/Classes/FTN/Process/Netmail/Robot/Filefix/Rescan.php b/app/Classes/FTN/Process/Netmail/Robot/Filefix/Rescan.php new file mode 100644 index 0000000..955c02d --- /dev/null +++ b/app/Classes/FTN/Process/Netmail/Robot/Filefix/Rescan.php @@ -0,0 +1,67 @@ + []', + ' Use the rescan command to resend files from a filearea.', + ' This is will resend files again, even if you have received them in the', + ' past.', + ' Arguments:', + ' - FILEAREA (required) name of area to subscribe or unsubscribe', + ' - DAYS (optional) number of days to resend mail from this area that you', + ' If DAYS is omitted, the default is 30. The maximum is 365.', + ]; + } + + public function process(): string + { + Log::debug(sprintf('%s:- Filefix [%s] for [%s] for [%s]',self::LOGKEY,self::command,$this->mo->fftn->ftn,join('|',$this->arguments))); + + $command = self::command.' '.join(' ',$this->arguments); + + if (! is_numeric($days=Arr::get($this->arguments,1,30))) + return sprintf('%-25s <-- INVALID, DAYS [%s] NOT NUMERIC',$command,$this->arguments[1]); + + if ($days > 365) + $days = 365; + + // Area exists + if ($fa=$this->mo->fftn->domain->fileareas->where('name',$this->arguments[0])->pop()) { + // If already subscribed + if ($this->mo->fftn->fileareas->pluck('name')->contains($this->arguments[0])) { + FilefixRescan::dispatch($this->mo->fftn,$fa,$days,TRUE) + ->onQueue('mail'); + + Log::debug(sprintf('%s:- FTN [%s] RESCAN [%s] DAYS [%d]',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0],$days)); + + return sprintf('%-25s <-- RESCAN [%d] DAYS queued',$command,$days); + + // If not subscribed + } else { + Log::debug(sprintf('%s:- FTN [%s] is NOT subscribed to [%s], NO ACTION taken',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0])); + + return sprintf('%-25s <-- NOT subscribed, NO ACTION taken',$command); + } + + } else { + Log::debug(sprintf('%s:- FILE [%s] area UNKNOWN [%s], NO ACTION taken',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0])); + + return sprintf('%-25s <-- AREA UNKNOWN, NO ACTION TAKEN',$command); + } + } +} \ No newline at end of file diff --git a/app/Classes/FTN/Process/Netmail/Robot/Filefix/Scan.php b/app/Classes/FTN/Process/Netmail/Robot/Filefix/Scan.php new file mode 100644 index 0000000..120b04c --- /dev/null +++ b/app/Classes/FTN/Process/Netmail/Robot/Filefix/Scan.php @@ -0,0 +1,67 @@ + []', + ' Use the scan command to resend files that you havent received yet from an', + ' filearea. This is useful if you are rejoining an filearea, and only want', + ' to get files that you dont already have.', + ' Arguments:', + ' - FILEAREA (required) name of area to subscribe or unsubscribe', + ' - DAYS (optional) number of days to resend mail from this area that you', + ' If DAYS is omitted, the default is 30. The maximum is 365.', + ]; + } + + public function process(): string + { + Log::debug(sprintf('%s:- Filefix [%s] for [%s] for [%s]',self::LOGKEY,self::command,$this->mo->fftn->ftn,join('|',$this->arguments))); + + $command = self::command.' '.join(' ',$this->arguments); + + if (! is_numeric($days=Arr::get($this->arguments,1,30))) + return sprintf('%-25s <-- INVALID, DAYS [%s] NOT NUMERIC',$command,$this->arguments[1]); + + if ($days > 365) + $days = 365; + + // Area exists + if ($fa=$this->mo->fftn->domain->fileareas->where('name',$this->arguments[0])->pop()) { + // If already subscribed + if ($this->mo->fftn->fileareas->pluck('name')->contains($this->arguments[0])) { + FilefixRescan::dispatch($this->mo->fftn,$fa,$days) + ->onQueue('mail'); + + Log::debug(sprintf('%s:- FTN [%s] SCAN [%s] DAYS [%d]',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0],$days)); + + return sprintf('%-25s <-- SCAN [%d] DAYS queued',$command,$days); + + // If not subscribed + } else { + Log::debug(sprintf('%s:- FTN [%s] is NOT subscribed to [%s], NO ACTION taken',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0])); + + return sprintf('%-25s <-- NOT subscribed, NO ACTION taken',$command); + } + + } else { + Log::debug(sprintf('%s:- FILE [%s] area UNKNOWN [%s], NO ACTION taken',self::LOGKEY,$this->mo->fftn->ftn,$this->arguments[0])); + + return sprintf('%-25s <-- AREA UNKNOWN, NO ACTION TAKEN',$command); + } + } +} \ No newline at end of file diff --git a/app/Jobs/AreafixRescan.php b/app/Jobs/AreafixRescan.php index 2674b8f..a2bd589 100644 --- a/app/Jobs/AreafixRescan.php +++ b/app/Jobs/AreafixRescan.php @@ -85,15 +85,15 @@ class AreafixRescan implements ShouldQueue $latest = NULL; foreach (Echomail::select(['id','datetime']) - ->where('echoarea_id',$this->eao->id) - ->where('datetime','>=', - Carbon::now() - ->subDays($this->days) - ->startOfDay() - ) - ->orderBy('datetime') - ->cursor() as $eo) { - + ->where('echoarea_id',$this->eao->id) + ->where('datetime','>=', + Carbon::now() + ->subDays($this->days) + ->startOfDay() + ) + ->orderBy('datetime') + ->cursor() as $eo) + { // Echomail hasnt been exported before if (! $eo->seenby->count()) { $eo->seenby()->attach($this->ao->id,['export_at'=>Carbon::now()]); diff --git a/app/Jobs/FilefixRescan.php b/app/Jobs/FilefixRescan.php index 910943e..b675b6d 100644 --- a/app/Jobs/FilefixRescan.php +++ b/app/Jobs/FilefixRescan.php @@ -84,16 +84,16 @@ class FilefixRescan implements ShouldQueue $earliest = NULL; $latest = NULL; - foreach (File::select(['id','datetime']) - ->where('filearea_id',$this->fao->id) - ->where('datetime','>=', - Carbon::now() - ->subDays($this->days) - ->startOfDay() - ) - ->orderBy('datetime') - ->cursor() as $fo) { - + foreach (File::select(['id','datetime','name']) + ->where('filearea_id',$this->fao->id) + ->where('datetime','>=', + Carbon::now() + ->subDays($this->days) + ->startOfDay() + ) + ->orderBy('datetime') + ->cursor() as $fo) + { // File hasnt been exported before if (! $fo->seenby->count()) { $fo->seenby()->attach($this->ao->id,['export_at'=>Carbon::now()]); @@ -131,7 +131,7 @@ class FilefixRescan implements ShouldQueue } else { $s++; - Log::debug(sprintf('Not resending previously sent message [%d], FILE (%s) - sent on [%s]', + Log::debug(sprintf('Not resending previously sent file [%d], FILE (%s) - sent on [%s]', $fo->id, $fo->name, $export->pivot->sent_at ?: '-', diff --git a/app/Models/Echomail.php b/app/Models/Echomail.php index 297d3b2..a37cf19 100644 --- a/app/Models/Echomail.php +++ b/app/Models/Echomail.php @@ -291,6 +291,7 @@ final class Echomail extends Model implements Packet return $this->belongsToMany(Address::class,'echomail_seenby') ->select(['addresses.id','zone_id','host_id','node_id']) ->withPivot(['export_at','sent_at','sent_pkt']) + ->dontCache() ->FTN2DOrder(); } diff --git a/app/Models/File.php b/app/Models/File.php index a11f30b..6832ee3 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -190,6 +190,7 @@ class File extends Model public function seenby() { return $this->belongsToMany(Address::class,'file_seenby') + ->dontCache() ->ftnOrder(); }