Implemented Dynamic Items for data to be sent to polled systems based on data in db, like stats/nodelists
This commit is contained in:
124
app/Classes/File/Send/Dynamic.php
Normal file
124
app/Classes/File/Send/Dynamic.php
Normal file
@@ -0,0 +1,124 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\File\Send;
|
||||
|
||||
use Carbon\Carbon;
|
||||
|
||||
use App\Classes\File\Send;
|
||||
use App\Classes\Node;
|
||||
use App\Models\Address;
|
||||
use App\Models\Dynamic as Model;
|
||||
use App\Classes\Dynamic as Item;
|
||||
|
||||
/**
|
||||
* Dynamic files that are sent to systems during a mailer session
|
||||
*/
|
||||
final class Dynamic extends Send
|
||||
{
|
||||
private const LOGKEY = 'FSD';
|
||||
|
||||
/** @var int Our internal position counter */
|
||||
private int $readpos = 0;
|
||||
private string $buffer;
|
||||
private Item $item;
|
||||
private Carbon $sent;
|
||||
|
||||
/**
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function __construct(private Model $do,Address $ao,int $type)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->ftype = ((($type&0xff)<<8)|self::IS_FILE);
|
||||
$this->item = new $this->do->model($ao,$this->do->arguments);
|
||||
$this->sent = Carbon::now();
|
||||
}
|
||||
|
||||
public function __get($key) {
|
||||
switch ($key) {
|
||||
case 'dbids':
|
||||
return collect([$this->do->id]);
|
||||
|
||||
case 'nameas':
|
||||
return $this->item->getName();
|
||||
|
||||
case 'mtime':
|
||||
return $this->sent->timestamp;
|
||||
|
||||
case 'size':
|
||||
return strlen($this->buffer);
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
public function close(bool $successful,Node $node): void
|
||||
{
|
||||
if ($successful) {
|
||||
$this->complete = TRUE;
|
||||
|
||||
$next_at = $this->do->next_at
|
||||
->startOfDay()
|
||||
->addHours($this->do->start_time->hour)
|
||||
->addMinutes($this->do->start_time->minute);
|
||||
|
||||
switch ($this->do->frequency) {
|
||||
case 'ONCE':
|
||||
$this->do->active = FALSE;
|
||||
|
||||
break;
|
||||
|
||||
case 'DAILY':
|
||||
$this->do->next_at = $next_at
|
||||
->addDay();
|
||||
|
||||
break;
|
||||
|
||||
case 'WEEKLY':
|
||||
$this->do->next_at = $next_at
|
||||
->addWeek();
|
||||
|
||||
break;
|
||||
|
||||
case 'MONTHLY':
|
||||
$this->do->next_at = $next_at
|
||||
->addMonth();
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new \Exception(sprintf('%s:! Unknown frequency [%s] for [%d]',self::LOGKEY,$this->do->frequency,$this->do->id));
|
||||
}
|
||||
|
||||
$this->do->save();
|
||||
}
|
||||
}
|
||||
|
||||
public function feof(): bool
|
||||
{
|
||||
return ($this->readpos === $this->size);
|
||||
}
|
||||
|
||||
public function open(string $compress=''): bool
|
||||
{
|
||||
$this->buffer = (string)$this->item;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
public function read(int $length): string
|
||||
{
|
||||
$result = substr($this->buffer,$this->readpos,$length);
|
||||
$this->readpos += strlen($result);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function seek(int $pos): bool
|
||||
{
|
||||
$this->readpos = ($pos < $this->size) ? $pos : $this->size;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user