diff --git a/evennia/commands/default/help.py b/evennia/commands/default/help.py index 6f09f98068..ebce460748 100644 --- a/evennia/commands/default/help.py +++ b/evennia/commands/default/help.py @@ -75,7 +75,7 @@ class CmdHelp(Command): pass if usemore: - evmore.msg(self.caller, text) + evmore.msg(self.caller, text, session=self.session) return self.msg((text, {"type": "help"})) @@ -267,7 +267,7 @@ class CmdHelp(Command): return # no exact matches found. Just give suggestions. - self.msg(self.format_help_entry("", "No help entry found for '%s'" % query, None, suggested=suggestions)) + self.msg((self.format_help_entry("", "No help entry found for '%s'" % query, None, suggested=suggestions), {"type": "help"})) def _loadhelp(caller): diff --git a/evennia/commands/default/system.py b/evennia/commands/default/system.py index 77a0dce864..fe5efa337d 100644 --- a/evennia/commands/default/system.py +++ b/evennia/commands/default/system.py @@ -161,7 +161,7 @@ def _run_code_snippet(caller, pycode, mode="eval", measure_time=False, # Try to retrieve the session session = caller if hasattr(caller, "sessions"): - session = caller.sessions.get()[0] + sessions = caller.sessions.all() # import useful variables import evennia @@ -175,11 +175,12 @@ def _run_code_snippet(caller, pycode, mode="eval", measure_time=False, } if show_input: - try: - caller.msg(">>> %s" % pycode, session=session, - options={"raw": True}) - except TypeError: - caller.msg(">>> %s" % pycode, options={"raw": True}) + for session in sessions: + try: + caller.msg(">>> %s" % pycode, session=session, + options={"raw": True}) + except TypeError: + caller.msg(">>> %s" % pycode, options={"raw": True}) try: try: @@ -206,10 +207,11 @@ def _run_code_snippet(caller, pycode, mode="eval", measure_time=False, errlist = errlist[4:] ret = "\n".join("%s" % line for line in errlist if line) - try: - caller.msg(ret, session=session, options={"raw": True}) - except TypeError: - caller.msg(ret, options={"raw": True}) + for session in sessions: + try: + caller.msg(ret, session=session, options={"raw": True}) + except TypeError: + caller.msg(ret, options={"raw": True}) class CmdPy(COMMAND_DEFAULT_CLASS): diff --git a/evennia/server/inputfuncs.py b/evennia/server/inputfuncs.py index 9c7098a7db..3715bb53fe 100644 --- a/evennia/server/inputfuncs.py +++ b/evennia/server/inputfuncs.py @@ -436,9 +436,12 @@ def webclient_options(session, *args, **kwargs): """ account = session.account - clientoptions = settings.WEBCLIENT_OPTIONS.copy() - storedoptions = account.db._saved_webclient_options or {} - clientoptions.update(storedoptions) + clientoptions = account.db._saved_webclient_options + if not clientoptions: + # No saved options for this account, copy and save the default. + account.db._saved_webclient_options = settings.WEBCLIENT_OPTIONS.copy() + # Get the _SaverDict created by the database. + clientoptions = account.db._saved_webclient_options # The webclient adds a cmdid to every kwargs, but we don't need it. try: @@ -448,7 +451,8 @@ def webclient_options(session, *args, **kwargs): if not kwargs: # No kwargs: we are getting the stored options - session.msg(webclient_options=clientoptions) + # Convert clientoptions to regular dict for sending. + session.msg(webclient_options=dict(clientoptions)) # Create a monitor. If a monitor already exists then it will replace # the previous one since it would use the same idstring @@ -461,5 +465,3 @@ def webclient_options(session, *args, **kwargs): # kwargs provided: persist them to the account object for key, value in kwargs.iteritems(): clientoptions[key] = value - - account.db._saved_webclient_options = clientoptions diff --git a/evennia/server/portal/irc.py b/evennia/server/portal/irc.py index 75ef7fb289..7a67a5ba80 100644 --- a/evennia/server/portal/irc.py +++ b/evennia/server/portal/irc.py @@ -20,6 +20,7 @@ IRC_BOLD = "\002" IRC_COLOR = "\003" IRC_RESET = "\017" IRC_ITALIC = "\026" +IRC_INVERT = "\x16" IRC_NORMAL = "99" IRC_UNDERLINE = "37" @@ -38,7 +39,7 @@ IRC_CYAN = "11" IRC_BLUE = "12" IRC_MAGENTA = "13" IRC_DGREY = "14" -IRC_GRAY = "15" +IRC_GREY = "15" # obsolete test: @@ -57,7 +58,7 @@ IRC_COLOR_MAP = dict(( (r'|t', " "), # tab (r'|-', " "), # fixed tab (r'|_', " "), # space - (r'|*', ""), # invert + (r'|*', IRC_INVERT), # invert (r'|^', ""), # blinking text (r'|h', IRC_BOLD), # highlight, use bold instead @@ -76,7 +77,7 @@ IRC_COLOR_MAP = dict(( (r'|B', IRC_COLOR + IRC_DBLUE), (r'|M', IRC_COLOR + IRC_DMAGENTA), (r'|C', IRC_COLOR + IRC_DCYAN), - (r'|W', IRC_COLOR + IRC_GRAY), # light grey + (r'|W', IRC_COLOR + IRC_GREY), # light grey (r'|X', IRC_COLOR + IRC_BLACK), # pure black (r'|[r', IRC_COLOR + IRC_NORMAL + "," + IRC_DRED), @@ -85,7 +86,7 @@ IRC_COLOR_MAP = dict(( (r'|[b', IRC_COLOR + IRC_NORMAL + "," + IRC_DBLUE), (r'|[m', IRC_COLOR + IRC_NORMAL + "," + IRC_DMAGENTA), (r'|[c', IRC_COLOR + IRC_NORMAL + "," + IRC_DCYAN), - (r'|[w', IRC_COLOR + IRC_NORMAL + "," + IRC_GRAY), # light grey background + (r'|[w', IRC_COLOR + IRC_NORMAL + "," + IRC_GREY), # light grey background (r'|[x', IRC_COLOR + IRC_NORMAL + "," + IRC_BLACK) # pure black background )) # ansi->irc diff --git a/evennia/server/portal/tests.py b/evennia/server/portal/tests.py new file mode 100644 index 0000000000..be400144c6 --- /dev/null +++ b/evennia/server/portal/tests.py @@ -0,0 +1,75 @@ +try: + from django.utils.unittest import TestCase +except ImportError: + from django.test import TestCase + +try: + from django.utils import unittest +except ImportError: + import unittest + +import string +from evennia.server.portal import irc + + +class TestIRC(TestCase): + + def test_plain_ansi(self): + """ + Test that printable characters do not get mangled. + """ + irc_ansi = irc.parse_ansi_to_irc(string.printable) + ansi_irc = irc.parse_irc_to_ansi(string.printable) + self.assertEqual(irc_ansi, string.printable) + self.assertEqual(ansi_irc, string.printable) + + def test_bold(self): + s_irc = "\x02thisisatest" + s_eve = r'|hthisisatest' + self.assertEqual(irc.parse_ansi_to_irc(s_eve), s_irc) + self.assertEqual(s_eve, irc.parse_irc_to_ansi(s_irc)) + + def test_italic(self): + s_irc = "\x02thisisatest" + s_eve = r'|hthisisatest' + self.assertEqual(irc.parse_ansi_to_irc(s_eve), s_irc) + + def test_colors(self): + color_map = (("\0030", r'|w'), + ("\0031", r'|X'), + ("\0032", r'|B'), + ("\0033", r'|G'), + ("\0034", r'|r'), + ("\0035", r'|R'), + ("\0036", r'|M'), + ("\0037", r'|Y'), + ("\0038", r'|y'), + ("\0039", r'|g'), + ("\00310", r'|C'), + ("\00311", r'|c'), + ("\00312", r'|b'), + ("\00313", r'|m'), + ("\00314", r'|x'), + ("\00315", r'|W'), + ("\00399,5", r'|[r'), + ("\00399,3", r'|[g'), + ("\00399,7", r'|[y'), + ("\00399,2", r'|[b'), + ("\00399,6", r'|[m'), + ("\00399,10", r'|[c'), + ("\00399,15", r'|[w'), + ("\00399,1", r'|[x')) + + for m in color_map: + self.assertEqual(irc.parse_irc_to_ansi(m[0]), m[1]) + self.assertEqual(m[0], irc.parse_ansi_to_irc(m[1])) + + def test_identity(self): + """ + Test that the composition of the function and + its inverse gives the correct string. + """ + + s = r'|wthis|Xis|gis|Ma|C|complex|*string' + + self.assertEqual(irc.parse_irc_to_ansi(irc.parse_ansi_to_irc(s)), s) diff --git a/evennia/utils/evmore.py b/evennia/utils/evmore.py index 4043025d6f..169091396b 100644 --- a/evennia/utils/evmore.py +++ b/evennia/utils/evmore.py @@ -192,7 +192,7 @@ class EvMore(object): if self._npages <= 1 and not always_page: # no need for paging; just pass-through. - caller.msg(text=text, **kwargs) + caller.msg(text=text, session=self._session, **kwargs) else: # go into paging mode # first pass on the msg kwargs diff --git a/evennia/web/webclient/static/webclient/css/webclient.css b/evennia/web/webclient/static/webclient/css/webclient.css index fff9f29390..1c94a1f9fd 100644 --- a/evennia/web/webclient/static/webclient/css/webclient.css +++ b/evennia/web/webclient/static/webclient/css/webclient.css @@ -31,6 +31,8 @@ strong {font-weight: bold;} div {margin:0px;} +.hidden { display: none; } + /* Utility messages (green) */ .sys { color: #0f0 } diff --git a/evennia/web/webclient/static/webclient/js/webclient_gui.js b/evennia/web/webclient/static/webclient/js/webclient_gui.js index c1af719f72..ba657858d9 100644 --- a/evennia/web/webclient/static/webclient/js/webclient_gui.js +++ b/evennia/web/webclient/static/webclient/js/webclient_gui.js @@ -289,6 +289,7 @@ function onPrompt(args, kwargs) { // Called when the user logged in function onLoggedIn() { + $('#optionsbutton').removeClass('hidden'); Evennia.msg("webclient_options", [], {}); } @@ -323,6 +324,8 @@ function onSilence(cmdname, args, kwargs) {} // Handle the server connection closing function onConnectionClose(conn_name, evt) { + $('#optionsbutton').addClass('hidden'); + closePopup("#optionsdialog"); onText(["The connection was closed or lost."], {'cls': 'err'}); } diff --git a/evennia/web/webclient/templates/webclient/webclient.html b/evennia/web/webclient/templates/webclient/webclient.html index 7be315f3fa..1c641bffb0 100644 --- a/evennia/web/webclient/templates/webclient/webclient.html +++ b/evennia/web/webclient/templates/webclient/webclient.html @@ -11,7 +11,7 @@