147 lines
4.8 KiB
PHP
147 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace App\Classes\FTN\Process\Netmail\Robot\Areafix;
|
|
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Arr;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
use App\Jobs\AreafixRescan;
|
|
|
|
// Echoarea Processing Command
|
|
class Area extends Base
|
|
{
|
|
private const LOGKEY = 'AFA';
|
|
|
|
private const command = '%AREA';
|
|
|
|
public static function help(): array
|
|
{
|
|
return [
|
|
self::command.' [-|+]<ECHOAREA> [R|D=<DAYS>]',
|
|
' Use the area command to subscribe (+) or unsubscribe (-) to an ECHOAREA',
|
|
' Arguments:',
|
|
' - ECHOAREA (required) name of area to subscribe or unsubscribe',
|
|
' - D=DAYS (optional) number of days to resend mail from this area that you',
|
|
' havent already received (useful if you are resubscribing to an area and',
|
|
' have received mail in the past)',
|
|
' - R=DAYS (optional) number of days to resend mail from this area (even if',
|
|
' it was sent to you previously)',
|
|
' Notes:',
|
|
' * "+" is optional, and is implied if "-" is not used',
|
|
' * "R" and "D" options only apply to subscribing',
|
|
];
|
|
}
|
|
|
|
public function process(): string
|
|
{
|
|
$command = self::command.' '.join(' ',$this->arguments);
|
|
|
|
if (! ($area=Arr::get($this->arguments,0,NULL)))
|
|
return sprintf('%-25s <-- INVALID, AN AREA IS REQUIRED',$command);
|
|
|
|
// If command starts with '-', its to unsubscribe
|
|
if (str_starts_with($area,'-')) {
|
|
$sub = FALSE;
|
|
$area = substr($area,1);
|
|
|
|
} elseif (str_starts_with($area,'+')) {
|
|
$sub = TRUE;
|
|
$area = substr($area,1);
|
|
|
|
} else {
|
|
$sub = TRUE;
|
|
$area = $area;
|
|
}
|
|
|
|
Log::debug(sprintf('%s:- Processing [%s] for [%s]',self::LOGKEY,$sub ? 'ADD' : 'REMOVE',$area));
|
|
|
|
// Drop the area from the arguments, the rest are options
|
|
array_shift($this->arguments);
|
|
|
|
// Area exists
|
|
if ($ea=$this->mo->fftn->domain->echoareas->where('name',$area)->pop()) {
|
|
// If already subscribed
|
|
if ($nea=$this->mo->fftn->echoareas->where('name',$area)->pop()) {
|
|
// requesting to subscribe "You already are since..., arguments ignored
|
|
if ($sub) {
|
|
Log::debug(sprintf('%s:- FTN [%s] ALREADY subscribed to [%s] since [%s]',self::LOGKEY,$this->mo->fftn->ftn,$area,$nea->pivot->subscribed));
|
|
|
|
return sprintf('%-25s <-- ALREADY subscribed since %s',$command,$nea->pivot->subscribed);
|
|
|
|
// requesting to unsubscribe
|
|
} else {
|
|
$this->mo->fftn->echoareas()->detach($ea->id);
|
|
|
|
// Remove sub, clear queue
|
|
$x = DB::table('echomail_seenby')
|
|
->where('address_id',$this->mo->fftn->id)
|
|
->join('echomails',['echomails.id'=>'echomail_seenby.echomail_id'])
|
|
->where('echoarea_id',$nea->id)
|
|
->whereNotNull('export_at')
|
|
->whereNull('sent_at')
|
|
->orderBy('echomails.datetime')
|
|
->skip($this->mo->fftn->system->pkt_msgs) // Might already being sent in this session
|
|
->delete();
|
|
|
|
Log::debug(sprintf('%s:- FTN [%s] UNSUBSCRIBED from [%s] clearing [%s]',self::LOGKEY,$this->mo->fftn->ftn,$area,$x));
|
|
|
|
return sprintf('%-25s <-- UNSUBSCRIBED, CLEARED [%d] MSGS from queue',$command,$x);
|
|
}
|
|
|
|
// If not subscribed
|
|
} else {
|
|
// requesting to subscribe, subsubsribe and rescan if arguments
|
|
if ($sub) {
|
|
$this->mo->fftn->echoareas()->attach([$ea->id=>['subscribed'=>Carbon::now()]]);
|
|
|
|
// If we have arguments, they are to rescan
|
|
if (count($this->arguments) === 1) {
|
|
$m = [];
|
|
if (preg_match('/^([DR])=([0-9]+)$/',$this->arguments[0],$m)) {
|
|
switch ($m[1]) {
|
|
// Scan
|
|
case 'D':
|
|
AreafixRescan::dispatch($this->mo->fftn,$ea,$m[2])
|
|
->onQueue('mail');
|
|
|
|
return sprintf('%-25s <-- SUBSCRIBED, RESCAN [%d] DAYS queued',$command,$m[2]);
|
|
|
|
// Scan
|
|
case 'R':
|
|
AreafixRescan::dispatch($this->mo->fftn,$ea,$m[2],TRUE)
|
|
->onQueue('mail');
|
|
|
|
return sprintf('%-25s <-- SUBSCRIBED, FORCE RESCAN [%d] DAYS queued',$command,$m[2]);
|
|
}
|
|
}
|
|
|
|
return sprintf('%-25s <-- SUBSCRIBED, INVALID OPTIONS',$command);
|
|
|
|
} elseif (count($this->arguments) > 1) {
|
|
Log::debug(sprintf('%s:- FTN [%s] subscribed to [%s], extra commands [%s] ignored',self::LOGKEY,$this->mo->fftn->ftn,$area,join('|',$this->arguments)));
|
|
|
|
return sprintf('%-25s <-- SUBSCRIBED, OPTIONS IGNORED',$command);
|
|
|
|
} else {
|
|
Log::debug(sprintf('%s:- FTN [%s] subscribed to [%s]',self::LOGKEY,$this->mo->fftn->ftn,$area));
|
|
|
|
return sprintf('%-25s <-- SUBSCRIBED',$command);
|
|
}
|
|
|
|
// If not subscribed, "you arent subscribed, arguments ignored"
|
|
} else {
|
|
Log::debug(sprintf('%s:- FTN [%s] is NOT subscribed to [%s], NO ACTION taken',self::LOGKEY,$this->mo->fftn->ftn,$area));
|
|
|
|
return sprintf('%-25s <-- NOT subscribed, NO ACTION taken',$command);
|
|
}
|
|
}
|
|
|
|
} else {
|
|
Log::debug(sprintf('%s:- FTN [%s] area UNKNOWN [%s], NO ACTION taken',self::LOGKEY,$this->mo->fftn->ftn,$area));
|
|
|
|
return sprintf('%-25s <-- AREA UNKNOWN, NO ACTION TAKEN',$command);
|
|
}
|
|
}
|
|
} |