From 4176e267d816202625aa0b22a68dfb6c4a455745 Mon Sep 17 00:00:00 2001 From: "psyc://loupsycedyglgamf.onion/~lynX" Date: Wed, 20 Jul 2016 18:50:52 +0200 Subject: [PATCH] one mud per child.. unfinished integration --- place/nemesis.c | 8 ++++- world/default/en/jabber.textdb | 5 +++ world/net/tn/outgoing.c | 58 ++++++++++++++++++++++++++-------- world/net/usercmd.i | 36 +++++++++++++++++++++ 4 files changed, 92 insertions(+), 15 deletions(-) diff --git a/place/nemesis.c b/place/nemesis.c index 4e5a3ec..832b36b 100644 --- a/place/nemesis.c +++ b/place/nemesis.c @@ -1,11 +1,17 @@ #include -#define CONNECT_TELNET "nemesis.de", 2000 +//#ifdef BRAIN +# define CONNECT_TELNET "nemesis.de", 2000 +//#else +//# define CONNECT_TELNET "nemesis.de", 2001 // NemTest +//#endif + #define ON_CONNECT emit("guest\n"); #define ON_ANY NET_PATH "tn/outgoing"::msg(source, mc, data, vars); #include +// to do this properly, we need a systematic way to redo prompts FIXME parse(all) { // remove Nemesis' guest prompt.. why was i so funny // back then to implement several prompt chars? diff --git a/world/default/en/jabber.textdb b/world/default/en/jabber.textdb index f8618c3..effe189 100644 --- a/world/default/en/jabber.textdb +++ b/world/default/en/jabber.textdb @@ -363,6 +363,11 @@ _notice_typing_active _notice_typing_gone | +_notice_telnet_verbatim +| +| [_text_verbatim] +| + _notice_place | | [_data] diff --git a/world/net/tn/outgoing.c b/world/net/tn/outgoing.c index 9b4c30a..12df5a2 100644 --- a/world/net/tn/outgoing.c +++ b/world/net/tn/outgoing.c @@ -1,43 +1,73 @@ // vim:syntax=lpc +// DEBUG: FIXME +#define _flag_log_sockets_telnet_outgoing + #include -//#include #include -#include -//#include +//#include + +// this outgoing "telnet" socket thing implements both '/set mudlink' +// for users as MUD chatrooms such as @nemesis. would be cool if it +// actually was capable of handling telnet protocol, but the mud in +// question isn't, either. +// +// for a tighter integration between psyced and MUD it would also be +// cool to either have a native PSYC side channel, or to embed crypto- +// graphically signed PSYC packets (using a shared secret hash) into +// this stream. // message queueing and automatic reconnect mgmt inherit NET_PATH "circuit"; -//inherit NET_PATH "place/public"; +virtual inherit NET_PATH "output"; +static string connectstring; +static object owner; + +send(all) { + // if this doesn't work, then maybe you just forgot + // to /set charset in your test user + iconv(all, SYSTEM_CHARSET, "ASCII//TRANSLIT"); // should be configurable #ifdef _flag_log_sockets_telnet_outgoing -emit(all, source) { - log_file("RAW_TN_OUT", "%d %O\t-> %s", time(), ME, all); - return ::emit(all); -} + log_file("RAW_TN_OUT", "%O > %O\n", ME, all); #endif + //if (function_exists("emit")) return emit(all); + return emit(all); +} parse(all) { next_input_to(#'parse); #ifdef _flag_log_sockets_telnet_outgoing - log_file("RAW_TN_OUT", "%d %O\t<- %s", time(), ME, all); + log_file("RAW_TN_OUT", "%O < %O\n", ME, all); #endif - // assumes multicaster.. fix later - castmsg(ME, "_notice_telnet_verbatim", "[_text_verbatim]", + iconv(all, "ASCII//TRANSLIT", SYSTEM_CHARSET); + if (owner) sendmsg(owner, + "_notice_telnet_verbatim", "[_text_verbatim]", + ([ "_text_verbatim": all ])); + else if (function_exists("castmsg")) castmsg(ME, + "_notice_telnet_verbatim", "[_text_verbatim]", ([ "_text_verbatim": all ])); } link(ho, po) { - sTextPath(0, 0, "tn"); + //sTextPath(0, 0, "tn"); return ::circuit(ho, po || TELNET_SERVICE); } +config(host, port, justdoit) { + connectstring = replace(justdoit, " ", "\n") + "\n"; + owner = previous_object(); + link(host, port); +} + logon(failure) { int rc = ::logon(failure); unless (rc) return 0; next_input_to(#'parse); parse("[connected]"); // hack to maintain logon ascii graphics intact + // could have queued this instead: + if (connectstring) call_out(#'send, 1, connectstring); call_out(#'runQ, 3); // deliver the queue of messages in circuit.c return rc; } @@ -78,7 +108,7 @@ msg(source, mc, data, mapping vars, showingLog, target) { if (abbrev("_message_public", mc)) { // FIXME: should we handle the disconnect instead? if (data == "quit") return 1; - return emit(data + "\n"); + return send(data + "\n"); } #endif } @@ -99,7 +129,7 @@ render(string mc, string data, mapping vars, mixed source) { output = psyctext( template, vars, data, source); if (!output || output=="") return D2(D("tn/out: empty output\n")); if (template == "") output += "\n"; - emit(output); + send(output); } #endif diff --git a/world/net/usercmd.i b/world/net/usercmd.i index 1c8fd34..17beef5 100644 --- a/world/net/usercmd.i +++ b/world/net/usercmd.i @@ -143,6 +143,27 @@ input(a, dest) { #endif } +#define MUDLINK //FIXME + +#ifdef MUDLINK +object mudlink; + +mudlink(config) { + string connectstring, host; int port; + // should have mud nicknames instead, so that charsets, prompts + // and login procedures can be automated.. + if (sscanf(config, "%s %d %s", host, port, connectstring)) { + // FIXME L8R: + //unless (objectp(mudlink)) mudlink = named_clone(NET_PATH "tn/outgoing", MYNICK); + unless (objectp(mudlink)) mudlink = clone_object(NET_PATH "tn/outgoing"); + if (objectp(mudlink)) mudlink -> config(host, port, connectstring); + return 1; + } + // could produce a dedicated syntax warning here.. default is okay + return 0; +} +#endif + parsecmd(command, dest) { array(string) args; string a; @@ -1393,6 +1414,14 @@ cmd(a, args, dest, command) { w("_echo_save", "[_amount_lines] lines of log saved.", (["_amount_lines": t])); break; +#ifdef MUDLINK + case "mud": + unless (objectp(mudlink) && interactive(mudlink)) mudlink(v("mudlink")); + // nicer UI using simulated query with $mud TBD.. FIXME + // also, this send() is not doing the translit!?!! + if (objectp(mudlink)) mudlink -> send(ARGS(1) +"\n"); + break; +#endif // MUDLINK #endif /* USER_PROGRAM */ default: #ifdef USER_PROGRAM @@ -2664,6 +2693,7 @@ checkVar(key, value) { string a, b; array(string) t; + P3(("%O checkVar(%O, %O)\n", ME, key, value)) // aliases for variable names switch(key) { case "befehlszeichen": @@ -2969,6 +2999,12 @@ checkVar(key, value) { // case "popstarfave": // case "musicfave": break; // always valid +#ifdef MUDLINK + case "mudlink": + P0(("mudlink %O\n", value)) + if (value && !mudlink(value)) value = 0; + break; +#endif case "encoding": key = "charset"; // fall thru case "charset":