From 359842d554424946c2cae87bc240cf92c5a318fa Mon Sep 17 00:00:00 2001 From: Ben Longden Date: Wed, 21 Apr 2021 18:17:19 +0100 Subject: [PATCH 1/7] Mudlet likes GA's for prompts Don't sent GA on every message (not everything is a prompt) Do enforce line endings for mudlet, it wont display anything without it. --- evennia/server/portal/telnet.py | 5 ++--- evennia/server/portal/ttype.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/evennia/server/portal/telnet.py b/evennia/server/portal/telnet.py index 821e96aa24..8e5c4baf96 100644 --- a/evennia/server/portal/telnet.py +++ b/evennia/server/portal/telnet.py @@ -337,8 +337,6 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): line = line.replace(b"\n", b"\r\n") if not line.endswith(b"\r\n") and self.protocol_flags.get("FORCEDENDLINE", True): line += b"\r\n" - if not self.protocol_flags.get("NOGOAHEAD", True): - line += IAC + GA return self.transport.write(mccp_compress(self, line)) # Session hooks @@ -440,7 +438,8 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): prompt = mxp_parse(prompt) prompt = to_bytes(prompt, self) prompt = prompt.replace(IAC, IAC + IAC).replace(b"\n", b"\r\n") - prompt += IAC + GA + if not self.protocol_flags.get("NOGOAHEAD", True): + prompt += IAC + GA self.transport.write(mccp_compress(self, prompt)) else: if echo is not None: diff --git a/evennia/server/portal/ttype.py b/evennia/server/portal/ttype.py index 01e7ebf74a..0b0683b637 100644 --- a/evennia/server/portal/ttype.py +++ b/evennia/server/portal/ttype.py @@ -119,7 +119,7 @@ class Ttype(object): if clientname.startswith("MUDLET"): # supports xterm256 stably since 1.1 (2010?) xterm256 = clientname.split("MUDLET", 1)[1].strip() >= "1.1" - self.protocol.protocol_flags["FORCEDENDLINE"] = False + self.protocol.protocol_flags["FORCEDENDLINE"] = True if clientname.startswith("TINTIN++"): self.protocol.protocol_flags["FORCEDENDLINE"] = True From 9099796258c1394f5226e491da6bc966f9eb7d14 Mon Sep 17 00:00:00 2001 From: Ben Longden Date: Thu, 22 Apr 2021 11:01:21 +0100 Subject: [PATCH 2/7] FORCEENDLINE is True by default so no need to set Test also updated to check FORCEENDLINE after TTYPE is negotiated --- evennia/server/portal/tests.py | 3 +-- evennia/server/portal/ttype.py | 4 ---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/evennia/server/portal/tests.py b/evennia/server/portal/tests.py index 6bd76db827..a67f1a4490 100644 --- a/evennia/server/portal/tests.py +++ b/evennia/server/portal/tests.py @@ -231,7 +231,6 @@ class TestTelnet(TwistedTestCase): self.transport.client = ["localhost"] self.transport.setTcpKeepAlive = Mock() d = self.proto.makeConnection(self.transport) - # test suppress_ga self.assertTrue(self.proto.protocol_flags["NOGOAHEAD"]) self.proto.dataReceived(IAC + DONT + SUPPRESS_GA) @@ -246,13 +245,13 @@ class TestTelnet(TwistedTestCase): self.assertEqual(self.proto.protocol_flags["SCREENHEIGHT"][0], 45) self.assertEqual(self.proto.handshakes, 6) # test ttype - self.assertTrue(self.proto.protocol_flags["FORCEDENDLINE"]) self.assertFalse(self.proto.protocol_flags["TTYPE"]) self.assertTrue(self.proto.protocol_flags["ANSI"]) self.proto.dataReceived(IAC + WILL + TTYPE) self.proto.dataReceived(b"".join([IAC, SB, TTYPE, IS, b"MUDLET", IAC, SE])) self.assertTrue(self.proto.protocol_flags["XTERM256"]) self.assertEqual(self.proto.protocol_flags["CLIENTNAME"], "MUDLET") + self.assertTrue(self.proto.protocol_flags["FORCEDENDLINE"]) self.proto.dataReceived(b"".join([IAC, SB, TTYPE, IS, b"XTERM", IAC, SE])) self.proto.dataReceived(b"".join([IAC, SB, TTYPE, IS, b"MTTS 137", IAC, SE])) self.assertEqual(self.proto.handshakes, 5) diff --git a/evennia/server/portal/ttype.py b/evennia/server/portal/ttype.py index 0b0683b637..04d78b497f 100644 --- a/evennia/server/portal/ttype.py +++ b/evennia/server/portal/ttype.py @@ -119,10 +119,6 @@ class Ttype(object): if clientname.startswith("MUDLET"): # supports xterm256 stably since 1.1 (2010?) xterm256 = clientname.split("MUDLET", 1)[1].strip() >= "1.1" - self.protocol.protocol_flags["FORCEDENDLINE"] = True - - if clientname.startswith("TINTIN++"): - self.protocol.protocol_flags["FORCEDENDLINE"] = True if ( clientname.startswith("XTERM") From c209a9b8ef04e6dc6e9ec7393198ddafd17005b2 Mon Sep 17 00:00:00 2001 From: Ben Longden Date: Mon, 26 Apr 2021 10:31:42 +0100 Subject: [PATCH 3/7] Move prompt logic to a flag set by TTYPE (for Mudlet, currently) --- evennia/server/portal/suppress_ga.py | 1 + evennia/server/portal/telnet.py | 6 ++++-- evennia/server/portal/tests.py | 1 + evennia/server/portal/ttype.py | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/evennia/server/portal/suppress_ga.py b/evennia/server/portal/suppress_ga.py index a295582a26..0ef356021d 100644 --- a/evennia/server/portal/suppress_ga.py +++ b/evennia/server/portal/suppress_ga.py @@ -40,6 +40,7 @@ class SuppressGA(object): self.protocol = protocol self.protocol.protocol_flags["NOGOAHEAD"] = True + self.protocol.protocol_flags["NOPROMPTGOAHEAD"] = True # Used to send a GA after a prompt line only, set in TTYPE (per client) # tell the client that we prefer to suppress GA ... self.protocol.will(SUPPRESS_GA).addCallbacks(self.will_suppress_ga, self.wont_suppress_ga) diff --git a/evennia/server/portal/telnet.py b/evennia/server/portal/telnet.py index 8e5c4baf96..147d37485c 100644 --- a/evennia/server/portal/telnet.py +++ b/evennia/server/portal/telnet.py @@ -337,6 +337,8 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): line = line.replace(b"\n", b"\r\n") if not line.endswith(b"\r\n") and self.protocol_flags.get("FORCEDENDLINE", True): line += b"\r\n" + if not self.protocol_flags.get("NOGOAHEAD", True) and self.protocol_flags.get("NOPROMPTGOAHEAD", True): + line += IAC + GA return self.transport.write(mccp_compress(self, line)) # Session hooks @@ -438,8 +440,8 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): prompt = mxp_parse(prompt) prompt = to_bytes(prompt, self) prompt = prompt.replace(IAC, IAC + IAC).replace(b"\n", b"\r\n") - if not self.protocol_flags.get("NOGOAHEAD", True): - prompt += IAC + GA + if not self.protocol_flags.get("NOGOAHEAD", True) and not self.protocol_flags.get("NOPROMPTGOAHEAD", True): + prompt += IAC + GA self.transport.write(mccp_compress(self, prompt)) else: if echo is not None: diff --git a/evennia/server/portal/tests.py b/evennia/server/portal/tests.py index a67f1a4490..bd3cb94503 100644 --- a/evennia/server/portal/tests.py +++ b/evennia/server/portal/tests.py @@ -252,6 +252,7 @@ class TestTelnet(TwistedTestCase): self.assertTrue(self.proto.protocol_flags["XTERM256"]) self.assertEqual(self.proto.protocol_flags["CLIENTNAME"], "MUDLET") self.assertTrue(self.proto.protocol_flags["FORCEDENDLINE"]) + self.assertFalse(self.proto.protocol_flags["NOPROMPTGOAHEAD"]) self.proto.dataReceived(b"".join([IAC, SB, TTYPE, IS, b"XTERM", IAC, SE])) self.proto.dataReceived(b"".join([IAC, SB, TTYPE, IS, b"MTTS 137", IAC, SE])) self.assertEqual(self.proto.handshakes, 5) diff --git a/evennia/server/portal/ttype.py b/evennia/server/portal/ttype.py index 04d78b497f..368ebecf1a 100644 --- a/evennia/server/portal/ttype.py +++ b/evennia/server/portal/ttype.py @@ -119,6 +119,8 @@ class Ttype(object): if clientname.startswith("MUDLET"): # supports xterm256 stably since 1.1 (2010?) xterm256 = clientname.split("MUDLET", 1)[1].strip() >= "1.1" + # Mudlet likes GA's on a prompt line for the prompt trigger to match. + self.protocol.protocol_flags["NOPROMPTGOAHEAD"] = False if ( clientname.startswith("XTERM") From 61d42d91d40e6bccef609f40ec213f3c3bdccb0d Mon Sep 17 00:00:00 2001 From: Ben Longden Date: Mon, 26 Apr 2021 12:04:35 +0100 Subject: [PATCH 4/7] Review feedback --- evennia/server/portal/telnet.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/evennia/server/portal/telnet.py b/evennia/server/portal/telnet.py index 147d37485c..e61a42570a 100644 --- a/evennia/server/portal/telnet.py +++ b/evennia/server/portal/telnet.py @@ -337,7 +337,7 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): line = line.replace(b"\n", b"\r\n") if not line.endswith(b"\r\n") and self.protocol_flags.get("FORCEDENDLINE", True): line += b"\r\n" - if not self.protocol_flags.get("NOGOAHEAD", True) and self.protocol_flags.get("NOPROMPTGOAHEAD", True): + if not self.protocol_flags.get("NOGOAHEAD", True): line += IAC + GA return self.transport.write(mccp_compress(self, line)) @@ -440,8 +440,8 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): prompt = mxp_parse(prompt) prompt = to_bytes(prompt, self) prompt = prompt.replace(IAC, IAC + IAC).replace(b"\n", b"\r\n") - if not self.protocol_flags.get("NOGOAHEAD", True) and not self.protocol_flags.get("NOPROMPTGOAHEAD", True): - prompt += IAC + GA + if not self.protocol_flags.get("NOPROMPTGOAHEAD", self.protocol_flags.get("NOGOAHEAD", True)): + prompt += IAC + GA self.transport.write(mccp_compress(self, prompt)) else: if echo is not None: From 9b749d16a63941a45f017916fc68c2d210b0dc37 Mon Sep 17 00:00:00 2001 From: Ben Longden Date: Mon, 26 Apr 2021 12:29:05 +0100 Subject: [PATCH 5/7] For mudlet we overwrite the negotiated GA value Suppress GA Activate the NOPROMPTGOAHEAD flag so GA's only sent on prompts --- evennia/server/portal/tests.py | 1 + evennia/server/portal/ttype.py | 1 + 2 files changed, 2 insertions(+) diff --git a/evennia/server/portal/tests.py b/evennia/server/portal/tests.py index bd3cb94503..c26c9cc46d 100644 --- a/evennia/server/portal/tests.py +++ b/evennia/server/portal/tests.py @@ -252,6 +252,7 @@ class TestTelnet(TwistedTestCase): self.assertTrue(self.proto.protocol_flags["XTERM256"]) self.assertEqual(self.proto.protocol_flags["CLIENTNAME"], "MUDLET") self.assertTrue(self.proto.protocol_flags["FORCEDENDLINE"]) + self.assertTrue(self.proto.protocol_flags["NOGOAHEAD"]) self.assertFalse(self.proto.protocol_flags["NOPROMPTGOAHEAD"]) self.proto.dataReceived(b"".join([IAC, SB, TTYPE, IS, b"XTERM", IAC, SE])) self.proto.dataReceived(b"".join([IAC, SB, TTYPE, IS, b"MTTS 137", IAC, SE])) diff --git a/evennia/server/portal/ttype.py b/evennia/server/portal/ttype.py index 368ebecf1a..bf6e3e4139 100644 --- a/evennia/server/portal/ttype.py +++ b/evennia/server/portal/ttype.py @@ -120,6 +120,7 @@ class Ttype(object): # supports xterm256 stably since 1.1 (2010?) xterm256 = clientname.split("MUDLET", 1)[1].strip() >= "1.1" # Mudlet likes GA's on a prompt line for the prompt trigger to match. + self.protocol.protocol_flags["NOGOAHEAD"] = True self.protocol.protocol_flags["NOPROMPTGOAHEAD"] = False if ( From b787c4d07625f918cd3547892c96c1205aa26085 Mon Sep 17 00:00:00 2001 From: Ben Longden Date: Mon, 26 Apr 2021 12:42:11 +0100 Subject: [PATCH 6/7] Only use GA-lite for mudlet if it's rejected NOGOAHEAD --- evennia/server/portal/ttype.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/evennia/server/portal/ttype.py b/evennia/server/portal/ttype.py index bf6e3e4139..62ed853e9d 100644 --- a/evennia/server/portal/ttype.py +++ b/evennia/server/portal/ttype.py @@ -119,9 +119,10 @@ class Ttype(object): if clientname.startswith("MUDLET"): # supports xterm256 stably since 1.1 (2010?) xterm256 = clientname.split("MUDLET", 1)[1].strip() >= "1.1" - # Mudlet likes GA's on a prompt line for the prompt trigger to match. - self.protocol.protocol_flags["NOGOAHEAD"] = True - self.protocol.protocol_flags["NOPROMPTGOAHEAD"] = False + # Mudlet likes GA's on a prompt line for the prompt trigger to match, if it's not wanting NOGOAHEAD. + if not self.protocol.protocol_flags["NOGOAHEAD"]: + self.protocol.protocol_flags["NOGOAHEAD"] = True + self.protocol.protocol_flags["NOPROMPTGOAHEAD"] = False if ( clientname.startswith("XTERM") From 76c1e09c84198788024550f9fffbb3806dba5069 Mon Sep 17 00:00:00 2001 From: Griatch Date: Sun, 9 May 2021 15:43:21 +0200 Subject: [PATCH 7/7] Fix PEP8 in PR #2390 --- evennia/server/portal/suppress_ga.py | 4 +++- evennia/server/portal/telnet.py | 3 ++- evennia/server/portal/ttype.py | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/evennia/server/portal/suppress_ga.py b/evennia/server/portal/suppress_ga.py index 0ef356021d..21332ea070 100644 --- a/evennia/server/portal/suppress_ga.py +++ b/evennia/server/portal/suppress_ga.py @@ -40,7 +40,9 @@ class SuppressGA(object): self.protocol = protocol self.protocol.protocol_flags["NOGOAHEAD"] = True - self.protocol.protocol_flags["NOPROMPTGOAHEAD"] = True # Used to send a GA after a prompt line only, set in TTYPE (per client) + self.protocol.protocol_flags[ + "NOPROMPTGOAHEAD" + ] = True # Used to send a GA after a prompt line only, set in TTYPE (per client) # tell the client that we prefer to suppress GA ... self.protocol.will(SUPPRESS_GA).addCallbacks(self.will_suppress_ga, self.wont_suppress_ga) diff --git a/evennia/server/portal/telnet.py b/evennia/server/portal/telnet.py index e61a42570a..2467fea040 100644 --- a/evennia/server/portal/telnet.py +++ b/evennia/server/portal/telnet.py @@ -440,7 +440,8 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): prompt = mxp_parse(prompt) prompt = to_bytes(prompt, self) prompt = prompt.replace(IAC, IAC + IAC).replace(b"\n", b"\r\n") - if not self.protocol_flags.get("NOPROMPTGOAHEAD", self.protocol_flags.get("NOGOAHEAD", True)): + if not self.protocol_flags.get("NOPROMPTGOAHEAD", + self.protocol_flags.get("NOGOAHEAD", True)): prompt += IAC + GA self.transport.write(mccp_compress(self, prompt)) else: diff --git a/evennia/server/portal/ttype.py b/evennia/server/portal/ttype.py index 62ed853e9d..d74b3ae9db 100644 --- a/evennia/server/portal/ttype.py +++ b/evennia/server/portal/ttype.py @@ -119,7 +119,8 @@ class Ttype(object): if clientname.startswith("MUDLET"): # supports xterm256 stably since 1.1 (2010?) xterm256 = clientname.split("MUDLET", 1)[1].strip() >= "1.1" - # Mudlet likes GA's on a prompt line for the prompt trigger to match, if it's not wanting NOGOAHEAD. + # Mudlet likes GA's on a prompt line for the prompt trigger to + # match, if it's not wanting NOGOAHEAD. if not self.protocol.protocol_flags["NOGOAHEAD"]: self.protocol.protocol_flags["NOGOAHEAD"] = True self.protocol.protocol_flags["NOPROMPTGOAHEAD"] = False