diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000000..580225a96a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,27 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG] Enter a brief description here" +labels: bug +assignees: '' + +--- + +#### Describe the bug +A clear and concise description of what the bug is. + +#### To Reproduce +Steps to reproduce the behavior: +1. +2. +3. +4. See error + +#### Expected behavior +A clear and concise description of what you expected to happen. + +#### Environment, Evennia version, OS etc +If unsure, run `evennia -v` or get the first few lines of the `about` command in-game. + +#### Additional context +Any other context about the problem, or ideas on how to solve. diff --git a/.github/ISSUE_TEMPLATE/documentation-issue.md b/.github/ISSUE_TEMPLATE/documentation-issue.md new file mode 100644 index 0000000000..bffee8dfb5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation-issue.md @@ -0,0 +1,14 @@ +--- +name: Documentation issue +about: Documentation problems and suggestions +title: '[Documentation] Enter a brief description here' +labels: documentation +assignees: '' + +--- + +#### Documentation issue +Describe what the issue is and where it can/should be found. + +#### Suggested change +The suggested change. diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000000..7dc702cfad --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[Feature Request] Enter a brief description here" +labels: feature-request +assignees: '' + +--- + +#### Is your feature request related to a problem? Please describe. +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +#### Describe the solution you'd like +A clear and concise description of what you want to happen. + +#### Describe alternatives you've considered +A clear and concise description of any alternative solutions or features you've considered. + +#### Additional context +Add any other context or screenshots about the feature request here. diff --git a/CHANGELOG.md b/CHANGELOG.md index 45cd4cc941..9a607c34f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,8 @@ without arguments starts a full interactive Python console. - `AttributeHandler.get(return_list=True)` will return `[]` if there are no Attributes instead of `[None]`. - Remove `pillow` requirement (install especially if using imagefield) +- Add Simplified Korean translation (user aceamro) +- Show warning on `start -l` if settings contains values unsafe for production. ## Evennia 0.9 (2018-2019) diff --git a/evennia/commands/default/building.py b/evennia/commands/default/building.py index 8222297fb4..6712aa8a7f 100644 --- a/evennia/commands/default/building.py +++ b/evennia/commands/default/building.py @@ -1469,10 +1469,10 @@ class CmdSetAttribute(ObjManipCommand): char: Setting an attribute on a character (global search) character: Alias for char, as above. - Sets attributes on objects. The second form clears - a previously set attribute while the last form - inspects the current value of the attribute - (if any). + Sets attributes on objects. The second example form above clears a + previously set attribute while the third form inspects the current value of + the attribute (if any). The last one (with the star) is a shortcut for + operatin on a player Account rather than an Object. The most common data to save with this command are strings and numbers. You can however also set Python primitives such as lists, diff --git a/evennia/commands/default/system.py b/evennia/commands/default/system.py index c408493248..41490b6502 100644 --- a/evennia/commands/default/system.py +++ b/evennia/commands/default/system.py @@ -264,6 +264,7 @@ class EvenniaPythonConsole(code.InteractiveConsole): """Push some code, whether complete or not.""" old_stdout = sys.stdout old_stderr = sys.stderr + class FakeStd: def __init__(self, caller): self.caller = caller @@ -274,9 +275,14 @@ class EvenniaPythonConsole(code.InteractiveConsole): fake_std = FakeStd(self.caller) sys.stdout = fake_std sys.stderr = fake_std - result = super().push(line) - sys.stdout = old_stdout - sys.stderr = old_stderr + result = None + try: + result = super().push(line) + except SystemExit: + pass + finally: + sys.stdout = old_stdout + sys.stderr = old_stderr return result @@ -298,8 +304,8 @@ class CmdPy(COMMAND_DEFAULT_CLASS): being parsed as HTML in the webclient but not in telnet clients) Without argument, open a Python console in-game. This is a full console, - accepting multi-line Python code for testing and debugging. Type `exit` to - return to the game. If Evennia is reloaded, thek console will be closed. + accepting multi-line Python code for testing and debugging. Type `exit()` to + return to the game. If Evennia is reloaded, the console will be closed. Enter a line of instruction after the 'py' command to execute it immediately. Separate multiple commands by ';' or open the code editor @@ -768,8 +774,13 @@ class CmdAbout(COMMAND_DEFAULT_CLASS): """Display information about server or target""" string = """ - |cEvennia|n {version}|n - MU* development system + |cEvennia|n MU* development system + + |wEvennia version|n: {version} + |wOS|n: {os} + |wPython|n: {python} + |wTwisted|n: {twisted} + |wDjango|n: {django} |wLicence|n https://opensource.org/licenses/BSD-3-Clause |wWeb|n http://www.evennia.com @@ -778,10 +789,6 @@ class CmdAbout(COMMAND_DEFAULT_CLASS): |wMaintainer|n (2010-) Griatch (griatch AT gmail DOT com) |wMaintainer|n (2006-10) Greg Taylor - |wOS|n {os} - |wPython|n {python} - |wTwisted|n {twisted} - |wDjango|n {django} """.format(version=utils.get_evennia_version(), os=os.name, python=sys.version.split()[0], diff --git a/evennia/locale/fr/LC_MESSAGES/django.mo b/evennia/locale/fr/LC_MESSAGES/django.mo index b16ad24fa0..6ed877e2c7 100644 Binary files a/evennia/locale/fr/LC_MESSAGES/django.mo and b/evennia/locale/fr/LC_MESSAGES/django.mo differ diff --git a/evennia/locale/it/LC_MESSAGES/django.mo b/evennia/locale/it/LC_MESSAGES/django.mo index 0a23b91f99..4d111b20c8 100644 Binary files a/evennia/locale/it/LC_MESSAGES/django.mo and b/evennia/locale/it/LC_MESSAGES/django.mo differ diff --git a/evennia/locale/ko/LC_MESSAGES/django.mo b/evennia/locale/ko/LC_MESSAGES/django.mo new file mode 100644 index 0000000000..eabd610805 Binary files /dev/null and b/evennia/locale/ko/LC_MESSAGES/django.mo differ diff --git a/evennia/locale/ko/LC_MESSAGES/django.po b/evennia/locale/ko/LC_MESSAGES/django.po new file mode 100644 index 0000000000..dbef340a04 --- /dev/null +++ b/evennia/locale/ko/LC_MESSAGES/django.po @@ -0,0 +1,333 @@ +##The Simplified Korean translation for the Evennia server. +##Copyright (C) 2019 Ethan Kwon +##This file is distributed under the same license as the Evennia package. +##FIRST AUTHOR: Ethan Kwon , 2019- +## +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-09-21 05:00+0900\n" +"PO-Revision-Date: 2019-09-21 05:00+0900\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: korean\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .\accounts\accounts.py:784 +msgid "Account being deleted." +msgstr "계정이 삭제되었습니다." + +#: .\commands\cmdhandler.py:680 +msgid "There were multiple matches." +msgstr "여러 개의 일치 항목을 찾았습니다." + +#: .\commands\cmdhandler.py:703 +#, python-format +msgid "Command '%s' is not available." +msgstr "'%s' 명령은 사용할 수 없습니다." + +#: .\commands\cmdhandler.py:708 +#, python-format +msgid " Maybe you meant %s?" +msgstr "'%s'이 맞습니까?" + +#: .\commands\cmdhandler.py:708 +msgid "or" +msgstr "또는" + +#: .\commands\cmdhandler.py:710 +msgid " Type \"help\" for help." +msgstr " 도음말은 \"help\"를 입력하세요." + +#: .\commands\cmdsethandler.py:89 +#, python-brace-format +msgid "" +"{traceback}\n" +"Error loading cmdset '{path}'\n" +"(Traceback was logged {timestamp})" +msgstr "" +"{traceback}\n" +"Error loading cmdset '{path}'\n" +"Traceback was logged {timestamp})" + +#: .\commands\cmdsethandler.py:94 +#, python-brace-format +msgid "" +"Error loading cmdset: No cmdset class '{classname}' in '{path}'.\n" +"(Traceback was logged {timestamp})" +msgstr "" +"Error loading cmdset: No cmdset class '{classname}' in '{path}'.\n" +"(Traceback was logged {timestamp})" + +#: .\commands\cmdsethandler.py:98 +#, python-brace-format +msgid "" +"{traceback}\n" +"SyntaxError encountered when loading cmdset '{path}'.\n" +"(Traceback was logged {timestamp})" +msgstr "" +"{traceback}\n" +"SyntaxError encountered when loading cmdset '{path}'.\n" +"(Traceback was logged {timestamp})" + +#: .\commands\cmdsethandler.py:103 +#, python-brace-format +msgid "" +"{traceback}\n" +"Compile/Run error when loading cmdset '{path}'.\",\n" +"(Traceback was logged {timestamp})" +msgstr "" +"{traceback}\n" +"Compile/Run error when loading cmdset '{path}'.\",\n" +"(Traceback was logged {timestamp})" + +#: .\commands\cmdsethandler.py:108 +#, python-brace-format +msgid "" +"\n" +"Error encountered for cmdset at path '{path}'.\n" +"Replacing with fallback '{fallback_path}'.\n" +msgstr "" +"\n" +"Error encountered for cmdset at path '{path}'.\n" +"Replacing with fallback '{fallback_path}'.\n" + +#: .\commands\cmdsethandler.py:114 +#, python-brace-format +msgid "Fallback path '{fallback_path}' failed to generate a cmdset." +msgstr "Fallback path '{fallback_path}' failed to generate a cmdset." + +#: .\commands\cmdsethandler.py:182 .\commands\cmdsethandler.py:192 +#, python-format +msgid "" +"\n" +"(Unsuccessfully tried '%s')." +msgstr "" +"\n" +"(Unsuccessfully tried '%s')." + +#: .\commands\cmdsethandler.py:311 +#, python-brace-format +msgid "custom {mergetype} on cmdset '{cmdset}'" +msgstr "custom {mergetype} on cmdset '{cmdset}'" + +#: .\commands\cmdsethandler.py:314 +#, python-brace-format +msgid " : {current}" +msgstr " : {current}" + +#: .\commands\cmdsethandler.py:322 +#, python-brace-format +msgid "" +" <{key} ({mergetype}, prio {prio}, {permstring})>:\n" +" {keylist}" +msgstr "" +" <{key} ({mergetype}, prio {prio}, {permstring})>:\n" +" {keylist}" + +#: .\commands\cmdsethandler.py:426 +msgid "Only CmdSets can be added to the cmdsethandler!" +msgstr "Only CmdSets can be added to the cmdsethandler!" + +#: .\comms\channelhandler.py:100 +msgid "Say what?" +msgstr "뭐라구요?" + +#: .\comms\channelhandler.py:105 +#, python-format +msgid "Channel '%s' not found." +msgstr "'%s' 채널을 찾을 수 없습니다." + +#: .\comms\channelhandler.py:108 +#, python-format +msgid "You are not connected to channel '%s'." +msgstr "'%s' 채널에 접속하고 있지 않습니다." + +#: .\comms\channelhandler.py:112 +#, python-format +msgid "You are not permitted to send to channel '%s'." +msgstr "'%s' 채널에 보낼 수 없습니다." + +#: .\comms\channelhandler.py:155 +msgid " (channel)" +msgstr " (채널)" + +#: .\locks\lockhandler.py:236 +#, python-format +msgid "Lock: lock-function '%s' is not available." +msgstr "Lock: lock-function '%s' is not available." + +#: .\locks\lockhandler.py:249 +#, python-format +msgid "Lock: definition '%s' has syntax errors." +msgstr "Lock: definition '%s' has syntax errors." + +#: .\locks\lockhandler.py:253 +#, python-format +msgid "" +"LockHandler on %(obj)s: access type '%(access_type)s' changed from " +"'%(source)s' to '%(goal)s' " +msgstr "" +"LockHandler on %(obj)s: access type '%(access_type)s' changed from " +"'%(source)s' to '%(goal)s' " + +#: .\locks\lockhandler.py:320 +#, python-brace-format +msgid "Lock: '{lockdef}' contains no colon (:)." +msgstr "Lock: '{lockdef}' contains no colon (:)." + +#: .\locks\lockhandler.py:328 +#, python-brace-format +msgid "Lock: '{lockdef}' has no access_type (left-side of colon is empty)." +msgstr "Lock: '{lockdef}' has no access_type (left-side of colon is empty)." + +#: .\locks\lockhandler.py:336 +#, python-brace-format +msgid "Lock: '{lockdef}' has mismatched parentheses." +msgstr "Lock: '{lockdef}' has mismatched parentheses." + +#: .\locks\lockhandler.py:343 +#, python-brace-format +msgid "Lock: '{lockdef}' has no valid lock functions." +msgstr "Lock: '{lockdef}' has no valid lock functions." + +#: .\objects\objects.py:745 +#, python-format +msgid "Couldn't perform move ('%s'). Contact an admin." +msgstr "Couldn't perform move ('%s'). 운영자에게 문의하세요." + +#: .\objects\objects.py:755 +msgid "The destination doesn't exist." +msgstr "The destination doesn't exist." + +#: .\objects\objects.py:846 +#, python-format +msgid "Could not find default home '(#%d)'." +msgstr "Could not find default home '(#%d)'." + +#: .\objects\objects.py:862 +msgid "Something went wrong! You are dumped into nowhere. Contact an admin." +msgstr "Something went wrong! You are dumped into nowhere. 운영자에게 문의하세요." + +#: .\objects\objects.py:1004 +#, python-format +msgid "Your character %s has been destroyed." +msgstr "%s 캐릭터가 삭제되었습니다." + +#: .\scripts\scripthandler.py:53 +#, python-format +msgid "" +"\n" +" '%(key)s' (%(next_repeat)s/%(interval)s, %(repeats)s repeats): %(desc)s" +msgstr "" +"\n" +" '%(key)s' (%(next_repeat)s/%(interval)s, %(repeats)s repeats): %(desc)s" + +#: .\scripts\scripts.py:199 +#, python-format +msgid "" +"Script %(key)s(#%(dbid)s) of type '%(cname)s': at_repeat() error '%(err)s'." +msgstr "" +"Script %(key)s(#%(dbid)s) of type '%(cname)s': at_repeat() error '%(err)s'." + +#: .\server\initial_setup.py:28 +msgid "" +"\n" +"Welcome to your new |wEvennia|n-based game! Visit http://www.evennia.com if " +"you need\n" +"help, want to contribute, report issues or just join the community.\n" +"As Account #1 you can create a demo/tutorial area with |w@batchcommand " +"tutorial_world.build|n.\n" +" " +msgstr "" +"\n" +"Welcome to your new |wEvennia|n-based game! Visit http://www.evennia.com if " +"you need\n" +"help, want to contribute, report issues or just join the community.\n" +"#1 유저(운영자)는 |w@batchcommand tutorial_world.build|n.명령을 사용하여\n" +"데모겸 튜터리얼 월드를 생성할 수 있습니다.\n" +" " + +#: .\server\initial_setup.py:92 +msgid "This is User #1." +msgstr "This is User #1." + +#: .\server\initial_setup.py:105 +msgid "Limbo" +msgstr "림보" + +#: .\server\server.py:139 +msgid "idle timeout exceeded" +msgstr "연결 시간 초과" + +#: .\server\sessionhandler.py:392 +msgid " ... Server restarted." +msgstr " ... 서버가 재가동되었습니다." + +#: .\server\sessionhandler.py:620 +msgid "Logged in from elsewhere. Disconnecting." +msgstr "어디에선가 로그인했습니다. 접속이 끊어집니다." + +#: .\server\sessionhandler.py:648 +msgid "Idle timeout exceeded, disconnecting." +msgstr "연결 시간이 초과되었습니다. 접속이 끊어집니다." + +#: .\server\validators.py:50 +#, python-format +msgid "" +"%s From a terminal client, you can also use a phrase of multiple words if " +"you enclose the password in double quotes." +msgstr "" +"%s 터미널 클라이언트에서 암호를 큰 따옴표로 묶으면 여러 단어로 된 암호를 사용할 수 있습니다." +"" + +#: .\utils\evmenu.py:192 +#, python-brace-format +msgid "" +"Menu node '{nodename}' is either not implemented or caused an error. Make " +"another choice." +msgstr "" +"Menu node '{nodename}'가 구현되지 않았거나 오류가 발생했습니다." +"다른 선택을 해보세요." + +#: .\utils\evmenu.py:194 +#, python-brace-format +msgid "Error in menu node '{nodename}'." +msgstr "Menu node '{nodename}'에서 오류가 발생했습니다." + +#: .\utils\evmenu.py:195 +msgid "No description." +msgstr "설명이 없습니다." + +#: .\utils\evmenu.py:196 +msgid "Commands: , help, quit" +msgstr "명령: , help, quit" + +#: .\utils\evmenu.py:197 +msgid "Commands: , help" +msgstr "명령: , help" + +#: .\utils\evmenu.py:198 +msgid "Commands: help, quit" +msgstr "명령: help, quit" + +#: .\utils\evmenu.py:199 +msgid "Commands: help" +msgstr "명령: help" + +#: .\utils\evmenu.py:200 +msgid "Choose an option or try 'help'." +msgstr "다른 옵션을 선택하거나 'help'를 확인해보세요." + +#: .\utils\utils.py:1882 +#, python-format +msgid "Could not find '%s'." +msgstr "'%s'를 찾을 수 없습니다." + +#: .\utils\utils.py:1889 +#, python-format +msgid "More than one match for '%s' (please narrow target):\n" +msgstr "'%s'와 일치하는 항목을 여러 개 찾았습니다.:\n" diff --git a/evennia/locale/pl/LC_MESSAGES/django.mo b/evennia/locale/pl/LC_MESSAGES/django.mo index 021e81ea31..f6e31091d5 100644 Binary files a/evennia/locale/pl/LC_MESSAGES/django.mo and b/evennia/locale/pl/LC_MESSAGES/django.mo differ diff --git a/evennia/locale/pt/LC_MESSAGES/django.mo b/evennia/locale/pt/LC_MESSAGES/django.mo index 9477bd2ee3..7dd70380e3 100644 Binary files a/evennia/locale/pt/LC_MESSAGES/django.mo and b/evennia/locale/pt/LC_MESSAGES/django.mo differ diff --git a/evennia/locale/sv/LC_MESSAGES/django.mo b/evennia/locale/sv/LC_MESSAGES/django.mo index bf139e0421..11f35e564a 100644 Binary files a/evennia/locale/sv/LC_MESSAGES/django.mo and b/evennia/locale/sv/LC_MESSAGES/django.mo differ diff --git a/evennia/locale/zh/LC_MESSAGES/django.mo b/evennia/locale/zh/LC_MESSAGES/django.mo index a0ec7c2c00..d07dd7a517 100644 Binary files a/evennia/locale/zh/LC_MESSAGES/django.mo and b/evennia/locale/zh/LC_MESSAGES/django.mo differ diff --git a/evennia/server/deprecations.py b/evennia/server/deprecations.py index 976040a8e9..d51f3e753d 100644 --- a/evennia/server/deprecations.py +++ b/evennia/server/deprecations.py @@ -85,7 +85,12 @@ def check_errors(settings): def check_warnings(settings): """ - Check deprecations that should produce warnings but which + Check conditions and deprecations that should produce warnings but which does not stop launch. """ - pass + if settings.DEBUG: + print(" [Devel: settings.DEBUG is True. Important to turn off in production.]") + if settings.IN_GAME_ERRORS: + print(" [Devel: settings.IN_GAME_ERRORS is True. Turn off in production.]") + if settings.ALLOWED_HOSTS == ["*"]: + print(" [Devel: settings.ALLOWED_HOSTS set to '*' (all). Limit in production.]") diff --git a/evennia/server/evennia_launcher.py b/evennia/server/evennia_launcher.py index 86dd99aa43..ad73bd26a0 100644 --- a/evennia/server/evennia_launcher.py +++ b/evennia/server/evennia_launcher.py @@ -242,7 +242,7 @@ ERROR_DATABASE = \ (error was '{traceback}') If you think your database should work, make sure you are running your - commands from inside your game directory. If this error persists, run + commands from inside your game directory. If this error persists, run evennia migrate @@ -1611,7 +1611,7 @@ def show_version_info(about=False): django=django.get_version()) -def error_check_python_modules(): +def error_check_python_modules(show_warnings=False): """ Import settings modules in settings. This will raise exceptions on pure python-syntax issues which are hard to catch gracefully with @@ -1619,6 +1619,9 @@ def error_check_python_modules(): python source files themselves). Best they fail already here before we get any further. + Kwargs: + show_warnings (bool): If non-fatal warning messages should be shown. + """ from django.conf import settings @@ -1634,11 +1637,13 @@ def error_check_python_modules(): from evennia.server import deprecations try: deprecations.check_errors(settings) - deprecations.check_warnings(settings) except DeprecationWarning as err: print(err) sys.exit() + if show_warnings: + deprecations.check_warnings(settings) + # core modules _imp(settings.COMMAND_PARSER) _imp(settings.SEARCH_AT_RESULT) @@ -2113,11 +2118,11 @@ def main(): query_info() elif option == "start": init_game_directory(CURRENT_DIR, check_db=True) - error_check_python_modules() + error_check_python_modules(show_warnings=args.tail_log) start_evennia(args.profiler, args.profiler) elif option == "istart": init_game_directory(CURRENT_DIR, check_db=True) - error_check_python_modules() + error_check_python_modules(show_warnings=args.tail_log) start_server_interactive() elif option == "ipstart": start_portal_interactive() diff --git a/evennia/server/portal/telnet.py b/evennia/server/portal/telnet.py index b82754f37a..19ac5d10d8 100644 --- a/evennia/server/portal/telnet.py +++ b/evennia/server/portal/telnet.py @@ -11,7 +11,8 @@ import re from twisted.internet import protocol from twisted.internet.task import LoopingCall from twisted.conch.telnet import Telnet, StatefulTelnetProtocol -from twisted.conch.telnet import IAC, NOP, LINEMODE, GA, WILL, WONT, ECHO, NULL +from twisted.conch.telnet import (IAC, NOP, LINEMODE, GA, WILL, WONT, ECHO, NULL, + MODE, LINEMODE_EDIT, LINEMODE_TRAPSIG) from django.conf import settings from evennia.server.session import Session from evennia.server.portal import ttype, mssp, telnet_oob, naws, suppress_ga @@ -51,6 +52,8 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): This is called when the connection is first established. """ + # important in order to work normally with standard telnet + self.do(LINEMODE) # initialize the session self.line_buffer = b"" client_address = self.transport.client @@ -146,12 +149,18 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): enable (bool): If this option should be enabled. """ - return (option == LINEMODE or - option == ttype.TTYPE or - option == naws.NAWS or - option == MCCP or - option == mssp.MSSP or - option == suppress_ga.SUPPRESS_GA) + if option == LINEMODE: + # make sure to activate line mode with local editing for all clients + self.requestNegotiation(LINEMODE, MODE + + bytes(chr(ord(LINEMODE_EDIT) + + ord(LINEMODE_TRAPSIG)), 'ascii')) + return True + else: + return (option == ttype.TTYPE or + option == naws.NAWS or + option == MCCP or + option == mssp.MSSP or + option == suppress_ga.SUPPRESS_GA) def enableLocal(self, option): """ @@ -164,7 +173,8 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): enable (bool): If this option should be enabled. """ - return (option == MCCP or + return (option == LINEMODE or + option == MCCP or option == ECHO or option == suppress_ga.SUPPRESS_GA) diff --git a/evennia/utils/create.py b/evennia/utils/create.py index 36729a62eb..b0527331b0 100644 --- a/evennia/utils/create.py +++ b/evennia/utils/create.py @@ -351,6 +351,7 @@ def create_message(senderobj, message, channels=None, receivers=None, locks=None message = create_message +create_msg = create_message def create_channel(key, aliases=None, desc=None, diff --git a/evennia/web/webclient/static/webclient/js/plugins/default_in.js b/evennia/web/webclient/static/webclient/js/plugins/default_in.js index cfde412043..044e4e7ec8 100644 --- a/evennia/web/webclient/static/webclient/js/plugins/default_in.js +++ b/evennia/web/webclient/static/webclient/js/plugins/default_in.js @@ -28,9 +28,9 @@ let defaultin_plugin = (function () { case 13: // Enter key var outtext = inputfield.val() || ""; // Grab the text from which-ever inputfield is focused if ( !event.shiftKey ) { // Enter Key without shift --> send Mesg - var lines = outtext.trim().replace(/[\r]+/,"\n").replace(/[\n]+/, "\n").split("\n"); + var lines = outtext.replace(/[\r]+/,"\n").replace(/[\n]+/, "\n").split("\n"); for (var i = 0; i < lines.length; i++) { - plugin_handler.onSend( lines[i].trim() ); + plugin_handler.onSend( lines[i] ); } inputfield.val(""); // Clear this inputfield event.preventDefault();