Merge branch 'master' into black-format

This commit is contained in:
Griatch 2019-09-25 18:48:05 +02:00
commit 1efcc31744
19 changed files with 456 additions and 32 deletions

27
.github/ISSUE_TEMPLATE/bug-report.md vendored Normal file
View file

@ -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.

View file

@ -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.

View file

@ -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.

View file

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

View file

@ -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,

View file

@ -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],

Binary file not shown.

View file

@ -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 " <Merged {mergelist} {mergetype}, prio {prio}>: {current}"
msgstr " <Merged {mergelist} {mergetype}, prio {prio}>: {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: <menu option>, help, quit"
msgstr "명령: <menu option>, help, quit"
#: .\utils\evmenu.py:197
msgid "Commands: <menu option>, help"
msgstr "명령: <menu option>, 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"

View file

@ -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.]")

View file

@ -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()

View file

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

View file

@ -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,

View file

@ -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();