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")