Main menu

This commit is contained in:
y4my4my4m 2023-05-13 23:25:43 +09:00
parent a2b920f84f
commit 38d6cce5ba
3 changed files with 66 additions and 22 deletions

View file

@ -1,8 +1,7 @@
// Telnet client for ZealOS by y4my4m
// Public Domain
Cd(__DIR__);;
// PaletteSet("Temple");
Cd(__DIR__);;
#define TELNET_PORT 23
#define BUF_SIZE 8192 // way too big?
@ -19,6 +18,9 @@ Cd(__DIR__);;
#include "TelnetClass"
#include "TelnetHelpers"
// If you're using a custom palette, the colors might not seem right.
// PaletteSet("Temple");
Bool force_disconnect = FALSE;
I64 TelnetOpen(U8 *host, U16 port) {
@ -31,7 +33,8 @@ I64 TelnetOpen(U8 *host, U16 port) {
sock = TCPConnectionCreate(host, port);
"$$GREEN$$Connecting to %s:%d.$$FG$$$$BG$$\n", host, port;
if (sock <= 0) {
PrintErr("Failed to connect to %s:%d\n", host, port);
// PrintErr("Failed to connect to %s:%d\n", host, port);
PopUpOk("\n\n\tFailed to connect\n\n");
return sock;
}
@ -139,8 +142,10 @@ U0 ANSIParse()
// }
// Telnet negotiation sequence
if (*ptr == NEGOTIATE) {
// FIXME: i don't think the telnet negotiation is actually working properly?
TelnetNegotiate(term.sock, ptr);
// TODO: verify this is working, somehow
// i see it being sent out as multiple short burst instead of one long answer
// anyway, i'm not sure how to verify if it's working or not but the code seems OK
if (term.sock_ready) TelnetNegotiate(term.sock, ptr);
ptr += 3;
}
else if (*ptr == ANSI_ESC) {
@ -239,6 +244,7 @@ U0 ANSIParse()
break; // reset
case 1: isBright = TRUE; break;
case 2: isBright = FALSE; break;
default: break;
}
}
else if ((ansi_code[m] >= 30 && ansi_code[m] <= 39) || (ansi_code[m] >= 90 && ansi_code[m] <= 97)) {
@ -606,7 +612,7 @@ U0 TerminalTask() {
Sleep(100); // Avoid busy waiting
}
while (!force_disconnect) {
while (term.sock_ready) {
term.buffer_len = TCPSocketReceive(term.sock, term.buffer, BUF_SIZE - 1);
if (term.buffer_len > 0) {
term.buffer[term.buffer_len] = '\0';
@ -614,7 +620,7 @@ U0 TerminalTask() {
ANSIParse;
} else {
"Error: Connection closed by the remote host.\n";
DocPrint(term.doc, "Error: Connection closed by the remote host.\n");
break;
}
}
@ -629,6 +635,20 @@ U0 Telnet(U8 *host=NULL, U16 port=TELNET_PORT) {
term.sock_ready = 0;
I64 art_path = "Art/TelnetSplash.ans";
SettingsPush;
MenuPush(
"Telnet {"
" Connect(,CH_CTRLN);"
" Exit(,CH_SHIFT_ESC);"
"}"
"Load {"
" ANSIArt(,CH_CTRLO);"
"}"
"About {"
" Info(,CH_CTRLL);"
"}"
);
StrCopy(Fs->task_title, "TELNET");
Fs->border_src = BDS_CONST;
Fs->border_attr = LTGREEN << 4 + DriveTextAttrGet(':') & 15;
@ -646,11 +666,12 @@ U0 Telnet(U8 *host=NULL, U16 port=TELNET_PORT) {
(TEXT_ROWS / 2) - (Fs->win_height / 2) +
(Fs->win_height - 1),
Fs);
DocClear;
show_splash:
// SplashScreen
// I64 buffer_size = sizeof(term.buffer);
DocClear;
MemSet(term.buffer, 0, sizeof(term.buffer));
term.buffer_len = ANSIArtLoad(art_path, term.buffer);
if (term.buffer_len > 0) {
@ -678,7 +699,10 @@ init_connection:
term.sock = TelnetOpen(host, port);
if (term.sock <= 0) {
return;
// return;
term.waiting_for_input = TRUE;
host = NULL;
goto show_splash;
}
term.sock_ready = 1; // Signal that the socket is ready
term.waiting_for_input = FALSE;
@ -689,7 +713,6 @@ init_connection:
break;
}
I64 sc;
try
{
@ -735,8 +758,20 @@ init_connection:
if (term.sock_ready) TCPSocketSendString(term.sock, "\x1B");
break;
case CH_SHIFT_ESC:
if (term.sock_ready)
{
if (term.sock_ready) TCPSocketClose(term.sock);
host = NULL;
term.sock_ready = 0;
term.waiting_for_input = TRUE;
"Telnet connection closed.\n";
Sleep(100);
goto show_splash;
}
else
force_disconnect = TRUE;
break;
break;
// send buffer on enter
case '\n':
if (term.sock_ready) TCPSocketSendString(term.sock, "\r\n");
@ -754,13 +789,16 @@ init_connection:
if (art_path != NULL) {
term.sock_ready = 0;
term.waiting_for_input = TRUE;
SysLog("%s\n", art_path);
// SysLog("%s\n", art_path);
goto show_splash;
}
else {
"Error: Could not load art.\n";
}
break;
case CH_CTRLL:
PopUpOk("\n\n Not all BBS will work perfectly (yet). \n\n You can load ANSi artwork with Ctrl+O","\n\n\n\t\tMade by y4my4m\n\n");
break;
default:
if (key >= ' ' && key <= '~') {
// Handle regular keys
@ -776,8 +814,14 @@ init_connection:
catch
PutExcept;
TCPSocketClose(term.sock);
"Telnet connection closed.\n";
// ideally go back to the splashscreen and wait for another input?
// term.sock_ready = 0;
// term.waiting_for_input = TRUE;
// goto show_splash;
MenuPop;
SettingsPop;
}

View file

@ -227,7 +227,7 @@ U0 TerminalDrawIt(CTask *task, CDC *dc)
{
// Clear the document
// DocClear(term.doc);
Sleep(100);
// Sleep(100);
DCFill;
I64 row, col;

View file

@ -7,8 +7,8 @@ U8 IsDigit(U8 ch) {
}
class CHostForm {
U8 host[256] format "$$DA-P,LEN=255,A=\"Host:%s\"$$";
U16 port format "$$DA,LEN=255,A=\"Port:%d\"$$";
U8 host[256] format "\n\n \t$$DA-P,LEN=255,A=\"Host:%s\"$$\t\n";
U16 port format "\t$$DA,LEN=255,A=\"Port:%d\"$$\t\n \n\n";
};
U0 TelnetPrompt(CHostForm *form) {
@ -73,7 +73,7 @@ public I64 ANSIArtBrowser()
DocPrint(doc, "$$LTBLUE$$\n\n");
tmpde1 = FilesFind("Art/*.ans");
tmpde1 = FilesFind("Art/*.*", 1);
if (tmpde1)
{