87 lines
2.5 KiB
PHP
87 lines
2.5 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace App\Classes\BBS\Server;
|
||
|
|
||
|
use App\Classes\BBS\Server as AbstractServer;
|
||
|
use App\Classes\Sock\SocketClient;
|
||
|
|
||
|
class Ansitex extends AbstractServer
|
||
|
{
|
||
|
protected const LOGKEY = 'BAS';
|
||
|
|
||
|
/* CONSTS */
|
||
|
|
||
|
public const PORT = 23;
|
||
|
|
||
|
protected function init(SocketClient $client)
|
||
|
{
|
||
|
define('ESC', chr(27));
|
||
|
define('CON', ESC.'[?25h'); // Cursor On
|
||
|
define('COFF', ESC.'[?25l'); // Cursor Off
|
||
|
define('CSAVE', ESC.'[s'); // Save Cursor position
|
||
|
define('CRESTORE',ESC.'[u'); // Restore to saved position
|
||
|
define('HOME', ESC.'[0;0f');
|
||
|
define('LEFT', ESC.'[D'); // Move Cursor
|
||
|
define('RIGHT', ESC.'[C'); // Move Cursor
|
||
|
define('DOWN', ESC.'[B'); // Move Cursor
|
||
|
define('UP', ESC.'[A'); // Move Cursor
|
||
|
define('CR', chr(13));
|
||
|
define('LF', chr(10));
|
||
|
define('BS', chr(8));
|
||
|
define('CLS', ESC.'[2J');
|
||
|
define('HASH', '#'); // Enter
|
||
|
define('STAR', '*'); // Star Entry
|
||
|
define('SPACE', ' '); // Space (for compatibility with Videotex)
|
||
|
|
||
|
// NOTE: This consts are effective output
|
||
|
define('RESET', ESC.'[0;39;49m');
|
||
|
define('RED', ESC.'[0;31m');
|
||
|
define('GREEN', ESC.'[0;32m');
|
||
|
define('YELLOW', ESC.'[1;33m');
|
||
|
define('BLUE', ESC.'[0;34m');
|
||
|
define('MAGENTA', ESC.'[0;35m');
|
||
|
define('CYAN', ESC.'[0;36m');
|
||
|
define('WHITE', ESC.'[1;37m');
|
||
|
define('NEWBG', '');
|
||
|
|
||
|
// Compatibility attributes (to Videotex).
|
||
|
define('R_RED', RED.SPACE);
|
||
|
define('R_GREEN', GREEN.SPACE);
|
||
|
define('R_YELLOW', YELLOW.SPACE);
|
||
|
define('R_BLUE', BLUE.SPACE);
|
||
|
define('R_MAGENTA', MAGENTA.SPACE);
|
||
|
define('R_CYAN', CYAN.SPACE);
|
||
|
define('R_WHITE', WHITE.SPACE);
|
||
|
//define('FLASH',chr(8));
|
||
|
|
||
|
// Keyboard presses
|
||
|
// @todo Check where these are used vs the keys defined above?
|
||
|
define('KEY_DELETE', chr(8));
|
||
|
define('KEY_LEFT', chr(136));
|
||
|
define('KEY_RIGHT', chr(137));
|
||
|
define('KEY_DOWN', chr(138));
|
||
|
define('KEY_UP', chr(139));
|
||
|
|
||
|
parent::init($client);
|
||
|
}
|
||
|
|
||
|
function moveCursor($x,$y): string
|
||
|
{
|
||
|
return ESC.'['.$y.';'.$x.'f';
|
||
|
}
|
||
|
|
||
|
// Abstract function
|
||
|
public function sendBaseline(string $text,bool $reposition=FALSE)
|
||
|
{
|
||
|
$this->client->send(CSAVE.ESC.'[24;0f'.RESET.SPACE.$text.
|
||
|
($this->blp > $this->po->strlenv(SPACE.$text)
|
||
|
? str_repeat(' ',$this->blp-$this->po->strlenv(SPACE.$text)).
|
||
|
($reposition ? ESC.'[24;0f'.str_repeat(RIGHT,$this->po->strlenv(SPACE.$text)) : CRESTORE)
|
||
|
: ($reposition ? '' : CRESTORE)),
|
||
|
static::TIMEOUT
|
||
|
);
|
||
|
|
||
|
$this->blp = $this->po->strlenv(SPACE.$text);
|
||
|
$this->baseline = $text;
|
||
|
}
|
||
|
}
|