Fix the rendering of SEENBY/PATH lines in packets, which should have each new line prefixed with host

This commit is contained in:
2023-11-27 09:00:32 +11:00
parent a19eaa3291
commit 8590bb8acc
3 changed files with 42 additions and 29 deletions

View File

@@ -495,8 +495,8 @@ class Message extends FTNBase
} else {
// Seenby & PATH - FSC-0068
$return .= sprintf("SEEN-BY: %s\r",wordwrap(optimize_path($this->seenby)->join(' '),70,"\rSEEN-BY: "));
$return .= sprintf("\01PATH: %s\r",wordwrap(optimize_path($this->path)->join(' '),73,"\rPATH: "));
$return .= $this->optimise_path($this->seenby,'SEEN-BY:')."\r";
$return .= "\x01".$this->optimise_path($this->path,'PATH:')."\r";
}
$return .= "\00";
@@ -514,6 +514,44 @@ class Message extends FTNBase
$this->decode($values);
}
/**
* Reduce our PATH/SEEN-BY for messages as per FSC-0068
*
* @param Collection $path
* @param string $prefix
* @param int $len
* @param string $delim
* @return string
*/
function optimise_path(Collection $path,string $prefix,int $len=79,string $delim="\r"): string
{
$cur = NULL;
$result = $prefix;
$c = strlen($prefix);
foreach ($path as $address) {
[$host,$node] = explode('/',$address);
if (($c+strlen(' '.$host)) > $len) {
$result .= ($x=$delim.$prefix);
$c = strlen($x);
$cur = NULL;
}
if ($host !== $cur) {
$cur = $host;
$result .= ($x=' '.$address);
} else {
$result .= ($x=' '.$node);
}
$c += strlen($x);
}
return $result;
}
/**
* Parse a message from a packet
*

View File

@@ -162,29 +162,4 @@ if (! function_exists('wtime')) {
return Carbon::create($year,$month,$day,$hr,$min,$sec+$milli/10);
}
}
if (! function_exists('optimize_path')) {
/**
* This will optimize an array of paths to show the smallest number of characters
*/
function optimize_path(Collection $path): Collection
{
$cur = NULL;
$result = collect();
foreach ($path as $address) {
[$host,$node] = explode('/',$address);
if ($host !== $cur) {
$cur = $host;
$result->push($address);
} else {
$result->push($node);
}
}
return $result;
}
}