[R|D=]', ' 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 command starts with '-', its to unsubscribe if (str_starts_with($this->arguments[0],'-')) { $sub = FALSE; $area = substr($this->arguments[0],1); } elseif (str_starts_with($this->arguments[0],'+')) { $sub = TRUE; $area = substr($this->arguments[0],1); } else { $sub = TRUE; $area = $this->arguments[0]; } 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); } } }