Start adding MSSP wizard info
This commit is contained in:
parent
0006b8d40f
commit
c9893c6e65
5 changed files with 484 additions and 101 deletions
|
|
@ -169,6 +169,8 @@
|
||||||
|
|
||||||
- Evscaperoom - a full puzzle engine for making multiplayer escape rooms in Evennia. Used to make
|
- Evscaperoom - a full puzzle engine for making multiplayer escape rooms in Evennia. Used to make
|
||||||
the entry for the MUD-Coder's Guild's 2019 Game Jam with the theme "One Room", where it ranked #1.
|
the entry for the MUD-Coder's Guild's 2019 Game Jam with the theme "One Room", where it ranked #1.
|
||||||
|
- Evennia game-index client no longer a contrib - moved into server core and configured with new
|
||||||
|
setting `GAME_INDEX_ENABLED`.
|
||||||
- The `extended_room` contrib saw some backwards-incompatible refactoring:
|
- The `extended_room` contrib saw some backwards-incompatible refactoring:
|
||||||
+ All commands now begin with `CmdExtendedRoom`. So before it was `CmdExtendedLook`, now
|
+ All commands now begin with `CmdExtendedRoom`. So before it was `CmdExtendedLook`, now
|
||||||
it's `CmdExtendedRoomLook` etc.
|
it's `CmdExtendedRoomLook` etc.
|
||||||
|
|
|
||||||
410
evennia/server/connection_wizard.py
Normal file
410
evennia/server/connection_wizard.py
Normal file
|
|
@ -0,0 +1,410 @@
|
||||||
|
"""
|
||||||
|
Link Evennia to external resources (wizard plugin for evennia_launcher)
|
||||||
|
|
||||||
|
"""
|
||||||
|
import sys
|
||||||
|
import pprint
|
||||||
|
from django.conf import settings
|
||||||
|
from evennia.utils.utils import list_to_string
|
||||||
|
|
||||||
|
class ConnectionWizard(object):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.data = {}
|
||||||
|
self.prev_node = None
|
||||||
|
|
||||||
|
def display(self, text):
|
||||||
|
"Show text"
|
||||||
|
print(text)
|
||||||
|
|
||||||
|
def ask_continue(self):
|
||||||
|
"'Press return to continue'-prompt"
|
||||||
|
input(" (Press return to continue)")
|
||||||
|
|
||||||
|
def ask_node(self, options, prompt="Enter choice: ", default=None):
|
||||||
|
"""
|
||||||
|
Retrieve options and jump to different menu nodes
|
||||||
|
|
||||||
|
Args:
|
||||||
|
options (dict): Node options on the form {key: (desc, callback), }
|
||||||
|
prompt (str, optional): Question to ask
|
||||||
|
default (str, optional): Default value to use if user hits return.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
opt_txt = "\n".join(f" {key}: {desc}" for key, (desc, _, _) in options.items())
|
||||||
|
self.display(opt_txt)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
resp = input(prompt).strip()
|
||||||
|
|
||||||
|
if not resp:
|
||||||
|
if default:
|
||||||
|
resp = str(default)
|
||||||
|
|
||||||
|
if resp.lower() in options:
|
||||||
|
self.display(f" Selected '{resp}'.")
|
||||||
|
desc, callback, kwargs = options[resp.lower()]
|
||||||
|
callback(self, **kwargs)
|
||||||
|
elif resp.lower() in ("quit", "q"):
|
||||||
|
sys.exit()
|
||||||
|
elif resp:
|
||||||
|
# input, but nothing was recognized
|
||||||
|
self.display(" Choose one of: {}".format(list_to_string(list(options))))
|
||||||
|
|
||||||
|
def ask_yesno(self, prompt, default="yes"):
|
||||||
|
"""
|
||||||
|
Ask a yes/no question inline.
|
||||||
|
|
||||||
|
Kwargs:
|
||||||
|
prompt (str): The prompt to ask.
|
||||||
|
default (str): "yes" or "no", used if pressing return.
|
||||||
|
Returns:
|
||||||
|
reply (str): Either 'yes' or 'no'.
|
||||||
|
|
||||||
|
"""
|
||||||
|
prompt = prompt + (" [Y]/N? " if default == "yes" else " Y/[N]? ")
|
||||||
|
|
||||||
|
while True:
|
||||||
|
resp = input(prompt).lstrip().lower()
|
||||||
|
if not resp:
|
||||||
|
resp = default.lower()
|
||||||
|
if resp in ("yes", "y"):
|
||||||
|
self.display(" Answered Yes.")
|
||||||
|
return "yes"
|
||||||
|
elif resp in ("no", "n"):
|
||||||
|
self.display(" Answered No.")
|
||||||
|
return "no"
|
||||||
|
elif resp.lower() in ("quit", "q"):
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
def ask_choice(self, prompt="> ", options=None, default=None):
|
||||||
|
"""
|
||||||
|
Ask multiple-choice question, get response inline.
|
||||||
|
|
||||||
|
Kwargs:
|
||||||
|
prompt (str): Input prompt.
|
||||||
|
options (list): List of options. Will be indexable by sequence number 1...
|
||||||
|
default (int): The list index+1 of the default choice, if any
|
||||||
|
Returns:
|
||||||
|
reply (str): The answered reply.
|
||||||
|
|
||||||
|
"""
|
||||||
|
opt_txt = "\n".join(f" {ind + 1}: {desc}" for ind, desc in enumerate(options))
|
||||||
|
self.display(opt_txt)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
resp = input(prompt).strip()
|
||||||
|
|
||||||
|
if not resp:
|
||||||
|
if default:
|
||||||
|
return options[int(default)]
|
||||||
|
if resp.lower() in ("quit", "q"):
|
||||||
|
sys.exit()
|
||||||
|
if resp.isdigit():
|
||||||
|
resp = int(resp) - 1
|
||||||
|
if 0 <= resp < len(options):
|
||||||
|
selection = options[resp]
|
||||||
|
self.display(f" Selected '{selection}'.")
|
||||||
|
return selection
|
||||||
|
self.display(" Select one of the given options.")
|
||||||
|
|
||||||
|
def ask_input(self, prompt="> ", default=None, verify=True, max_len=None):
|
||||||
|
"""
|
||||||
|
Get arbitrary input inline.
|
||||||
|
|
||||||
|
Kwargs:
|
||||||
|
prompt (str): The display prompt.
|
||||||
|
default (str, optional): If empty input, use this.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
inp (str): The input given, or default.
|
||||||
|
|
||||||
|
"""
|
||||||
|
while True:
|
||||||
|
resp = input(prompt).strip()
|
||||||
|
if not resp and default:
|
||||||
|
resp = str(default)
|
||||||
|
|
||||||
|
if resp.lower() == 'none':
|
||||||
|
resp = ''
|
||||||
|
ok = input("\n Leave blank? [Y]/N: ")
|
||||||
|
if ok.lower() in ('n', 'no'):
|
||||||
|
continue
|
||||||
|
elif ok.lower() in ('q', 'quit'):
|
||||||
|
sys.exit()
|
||||||
|
return resp
|
||||||
|
|
||||||
|
if verify:
|
||||||
|
self.display(resp)
|
||||||
|
if max_len:
|
||||||
|
nlen = len(resp)
|
||||||
|
if nlen > max_len:
|
||||||
|
self.display(f" This text is {nlen} characters long. Max is {max_len}.")
|
||||||
|
continue
|
||||||
|
ok = input("\n Is the above looking correct? [Y]/N: ")
|
||||||
|
if ok.lower() in ("n", "no"):
|
||||||
|
continue
|
||||||
|
elif ok.lower() in ('q', 'quit'):
|
||||||
|
sys.exit()
|
||||||
|
return resp
|
||||||
|
|
||||||
|
|
||||||
|
def node_start(wizard):
|
||||||
|
text = """
|
||||||
|
This wizard helps activate external networks with Evennia. It will create
|
||||||
|
a config that will be attached to the bottom of the game settings file.
|
||||||
|
|
||||||
|
Use `quit` at any time to abort and throw away any changes.
|
||||||
|
"""
|
||||||
|
options = {
|
||||||
|
"1": ("Add game to Evennia game index (also for closed dev games)",
|
||||||
|
node_game_index_start, {}),
|
||||||
|
"2": ("Add MSSP information (for mud-list crawlers)",
|
||||||
|
node_mssp_start, {}),
|
||||||
|
"3": ("View and Save created settings",
|
||||||
|
node_view_and_apply_settings, {}),
|
||||||
|
}
|
||||||
|
|
||||||
|
wizard.display(text)
|
||||||
|
wizard.ask_node(options)
|
||||||
|
|
||||||
|
|
||||||
|
# Evennia game index
|
||||||
|
|
||||||
|
|
||||||
|
def node_game_index_start(wizard, **kwargs):
|
||||||
|
text = f"""
|
||||||
|
The Evennia game index (http://games.evennia.com) lists both active Evennia
|
||||||
|
games as well as games in various stages of development.
|
||||||
|
|
||||||
|
You can put up your game in the index also if you are not (yet) open for
|
||||||
|
players. If so, put 'None' for the connection details. Just tell us you
|
||||||
|
are out there and make us excited about your upcoming game!
|
||||||
|
|
||||||
|
Please check the listing online first to see that your exact game name is
|
||||||
|
not colliding with an existing game-name in the list (be nice!).
|
||||||
|
"""
|
||||||
|
|
||||||
|
wizard.display(text)
|
||||||
|
if wizard.ask_yesno("Continue adding/editing an Index entry?") == 'yes':
|
||||||
|
node_game_index_fields(wizard)
|
||||||
|
else:
|
||||||
|
node_start(wizard)
|
||||||
|
|
||||||
|
def node_game_index_fields(wizard, status=None):
|
||||||
|
|
||||||
|
# reset the listing if needed
|
||||||
|
if not hasattr(wizard, "game_index_listing"):
|
||||||
|
wizard.game_index_listing = settings.GAME_INDEX_LISTING
|
||||||
|
|
||||||
|
# game status
|
||||||
|
|
||||||
|
status_default = wizard.game_index_listing['game_status']
|
||||||
|
text = f"""
|
||||||
|
What is the status of your game?
|
||||||
|
- pre-alpha: a game in its very early stages, mostly unfinished or unstarted
|
||||||
|
- alpha: a working concept, probably lots of bugs and incomplete features
|
||||||
|
- beta: a working game, but expect bugs and changing features
|
||||||
|
- launched: a full, working game that may still be expanded upon and improved later
|
||||||
|
|
||||||
|
Current value:
|
||||||
|
{status_default}
|
||||||
|
"""
|
||||||
|
|
||||||
|
options = ["pre-alpha", "alpha", "beta", "launched"]
|
||||||
|
|
||||||
|
wizard.display(text)
|
||||||
|
wizard.game_index_listing['game_status'] = \
|
||||||
|
wizard.ask_choice("Select one: ", options)
|
||||||
|
|
||||||
|
# short desc
|
||||||
|
|
||||||
|
sdesc_default = wizard.game_index_listing.get('short_description', None)
|
||||||
|
|
||||||
|
text = f"""
|
||||||
|
Enter a short description of your game. Make it snappy and interesting!
|
||||||
|
This should be at most one or two sentences (255 characters) to display by
|
||||||
|
'{settings.SERVERNAME}' in the main game list. Line breaks will be ignored.
|
||||||
|
|
||||||
|
Current value:
|
||||||
|
{sdesc_default}
|
||||||
|
"""
|
||||||
|
|
||||||
|
wizard.display(text)
|
||||||
|
wizard.game_index_listing['short_description'] = \
|
||||||
|
wizard.ask_input(default=sdesc_default, max_len=255)
|
||||||
|
|
||||||
|
# long desc
|
||||||
|
|
||||||
|
long_default = wizard.game_index_listing.get("long_description", None)
|
||||||
|
|
||||||
|
text = f"""
|
||||||
|
Enter a longer, full-length description. This will be shown when clicking
|
||||||
|
on your game's listing. You can use \\n to create line breaks and may use
|
||||||
|
Markdown formatting like *bold*, _italic_, [linkname](http://link) etc.
|
||||||
|
|
||||||
|
Current value:
|
||||||
|
{long_default}
|
||||||
|
"""
|
||||||
|
|
||||||
|
wizard.display(text)
|
||||||
|
wizard.game_index_listing['long_description'] = \
|
||||||
|
wizard.ask_input(default=long_default)
|
||||||
|
|
||||||
|
# listing contact
|
||||||
|
|
||||||
|
listing_default = wizard.game_index_listing.get("listing_contact", None)
|
||||||
|
text = f"""
|
||||||
|
Enter a listing email-contact. This will not be visible in the listing, but
|
||||||
|
allows us to get in touch with you should there be some listing issue (like
|
||||||
|
a name collision) or some bug with the listing (us actually using this is
|
||||||
|
likely to be somewhere between super-rarely and never).
|
||||||
|
|
||||||
|
Current value:
|
||||||
|
{listing_default}
|
||||||
|
"""
|
||||||
|
|
||||||
|
wizard.display(text)
|
||||||
|
wizard.game_index_listing['listing_contact'] = \
|
||||||
|
wizard.ask_input(default=listing_default)
|
||||||
|
|
||||||
|
# telnet hostname
|
||||||
|
|
||||||
|
hostname_default = wizard.game_index_listing.get('telnet_hostname', None)
|
||||||
|
text = f"""
|
||||||
|
Enter the hostname to which third-party telnet mud clients can connect to
|
||||||
|
your game. This would be the name of the server your game is hosted on,
|
||||||
|
like `coolgame.games.com`, or `mygreatgame.se`.
|
||||||
|
|
||||||
|
Write 'None' if you are not offering public telnet connections at this time.
|
||||||
|
|
||||||
|
Current value:
|
||||||
|
{hostname_default}
|
||||||
|
"""
|
||||||
|
|
||||||
|
wizard.display(text)
|
||||||
|
wizard.game_index_listing['telnet_hostname'] = \
|
||||||
|
wizard.ask_input(default=hostname_default)
|
||||||
|
|
||||||
|
|
||||||
|
# telnet port
|
||||||
|
|
||||||
|
port_default = wizard.game_index_listing.get('telnet_port', None)
|
||||||
|
text = f"""
|
||||||
|
Enter the main telnet port. The Evennia default is 4000. You can change
|
||||||
|
this with the TELNET_PORTS server setting.
|
||||||
|
|
||||||
|
Write 'None' if you are not offering public telnet connections at this time.
|
||||||
|
|
||||||
|
Current value:
|
||||||
|
{port_default}
|
||||||
|
"""
|
||||||
|
|
||||||
|
wizard.display(text)
|
||||||
|
wizard.game_index_listing['telnet_port'] = \
|
||||||
|
wizard.ask_input(default=port_default)
|
||||||
|
|
||||||
|
|
||||||
|
# website
|
||||||
|
|
||||||
|
website_default = wizard.game_index_listing.get('game_website', None)
|
||||||
|
text = f"""
|
||||||
|
Evennia is its own web server and runs your game's website. Enter the
|
||||||
|
URL of the website here, like http://yourwebsite.com, here.
|
||||||
|
|
||||||
|
Wtite 'None' if you are not offering a publicly visible website at this time.
|
||||||
|
|
||||||
|
Current value:
|
||||||
|
{website_default}
|
||||||
|
"""
|
||||||
|
|
||||||
|
wizard.display(text)
|
||||||
|
wizard.game_index_listing['game_website'] = \
|
||||||
|
wizard.ask_input(default=website_default)
|
||||||
|
|
||||||
|
# webclient
|
||||||
|
|
||||||
|
webclient_default = wizard.game_index_listing.get('web_client_url', None)
|
||||||
|
text = f"""
|
||||||
|
Evennia offers its own native webclient. Normally it will be found from the
|
||||||
|
game homepage at something like http://yourwebsite.com/webclient. Enter
|
||||||
|
your specific URL here (when clicking this link you should launch into the
|
||||||
|
web client)
|
||||||
|
|
||||||
|
Wtite 'None' if you don't want to list a publicly accessible webclient.
|
||||||
|
|
||||||
|
Current value:
|
||||||
|
{webclient_default}
|
||||||
|
"""
|
||||||
|
|
||||||
|
wizard.display(text)
|
||||||
|
wizard.game_index_listing['web_client_url'] = \
|
||||||
|
wizard.ask_input(default=webclient_default)
|
||||||
|
|
||||||
|
if not (wizard.game_index_listing.get('web_client_url') or
|
||||||
|
(wizard.game_index_listing.get('telnet_host'))):
|
||||||
|
wizard.display(
|
||||||
|
"\nNote: You have not specified any connection options. This means "
|
||||||
|
"your game \nwill be marked as being in 'closed development' in "
|
||||||
|
"the index.")
|
||||||
|
|
||||||
|
wizard.display("\nDon't forget to inspect and save your changes.")
|
||||||
|
|
||||||
|
node_start(wizard)
|
||||||
|
|
||||||
|
|
||||||
|
# MSSP
|
||||||
|
|
||||||
|
|
||||||
|
def node_mssp_start(wizard):
|
||||||
|
|
||||||
|
text = f"""
|
||||||
|
MSSP (Mud Server Status Protocol) allows online MUD-listing sites/crawlers
|
||||||
|
to continuously monitor your game and list information about it. Some of
|
||||||
|
this, like active player-count, Evennia will automatically add for you,
|
||||||
|
whereas many fields is info about your game.
|
||||||
|
|
||||||
|
To use MSSP you should generally have a publicly open game that external
|
||||||
|
players can connect to.
|
||||||
|
"""
|
||||||
|
|
||||||
|
wizard.mssp_table
|
||||||
|
|
||||||
|
|
||||||
|
# Admin
|
||||||
|
|
||||||
|
def _save_changes(wizard):
|
||||||
|
"""
|
||||||
|
Perform the save
|
||||||
|
"""
|
||||||
|
print("saving!")
|
||||||
|
|
||||||
|
def node_view_and_apply_settings(wizard):
|
||||||
|
"""
|
||||||
|
Inspect and save the data gathered in the other nodes
|
||||||
|
|
||||||
|
"""
|
||||||
|
pp = pprint.PrettyPrinter(indent=4)
|
||||||
|
saves = False
|
||||||
|
|
||||||
|
game_index_txt = "No changes to save for Game Index."
|
||||||
|
if hasattr(wizard, "game_index_listing"):
|
||||||
|
if wizard.game_index_listing != settings.GAME_INDEX_LISTING:
|
||||||
|
game_index_txt = "No changes to save for Game Index."
|
||||||
|
else:
|
||||||
|
game_index_txt = pp.pformat(wizard.game_index_listing)
|
||||||
|
saves = True
|
||||||
|
|
||||||
|
text = game_index_txt
|
||||||
|
|
||||||
|
print("- Game index:\n" + text)
|
||||||
|
|
||||||
|
if saves:
|
||||||
|
if wizard.ask_yesno("Do you want to save these settings?") == 'yes':
|
||||||
|
_save_changes(wizard)
|
||||||
|
else:
|
||||||
|
print("Cancelled. Returning ...")
|
||||||
|
wizard.ask_continue()
|
||||||
|
node_start(wizard)
|
||||||
|
|
||||||
|
|
@ -1823,6 +1823,16 @@ def run_dummyrunner(number_of_dummies):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def run_connect_wizard():
|
||||||
|
"""
|
||||||
|
Run the linking wizard, for adding new external connections.
|
||||||
|
|
||||||
|
"""
|
||||||
|
from .connection_wizard import ConnectionWizard, node_start
|
||||||
|
wizard = ConnectionWizard()
|
||||||
|
node_start(wizard)
|
||||||
|
|
||||||
|
|
||||||
def list_settings(keys):
|
def list_settings(keys):
|
||||||
"""
|
"""
|
||||||
Display the server settings. We only display the Evennia specific
|
Display the server settings. We only display the Evennia specific
|
||||||
|
|
@ -2082,7 +2092,7 @@ def main():
|
||||||
init_game_directory(CURRENT_DIR, check_db=True)
|
init_game_directory(CURRENT_DIR, check_db=True)
|
||||||
run_menu()
|
run_menu()
|
||||||
elif option in ('status', 'info', 'start', 'istart', 'ipstart', 'reload', 'restart', 'reboot',
|
elif option in ('status', 'info', 'start', 'istart', 'ipstart', 'reload', 'restart', 'reboot',
|
||||||
'reset', 'stop', 'sstop', 'kill', 'skill', 'sstart'):
|
'reset', 'stop', 'sstop', 'kill', 'skill', 'sstart', 'connections'):
|
||||||
# operate the server directly
|
# operate the server directly
|
||||||
if not SERVER_LOGFILE:
|
if not SERVER_LOGFILE:
|
||||||
init_game_directory(CURRENT_DIR, check_db=True)
|
init_game_directory(CURRENT_DIR, check_db=True)
|
||||||
|
|
@ -2120,6 +2130,9 @@ def main():
|
||||||
print("This option is not supported on Windows.")
|
print("This option is not supported on Windows.")
|
||||||
else:
|
else:
|
||||||
kill(SERVER_PIDFILE, 'Server')
|
kill(SERVER_PIDFILE, 'Server')
|
||||||
|
elif option == 'connections':
|
||||||
|
run_connect_wizard()
|
||||||
|
|
||||||
elif option != "noop":
|
elif option != "noop":
|
||||||
# pass-through to django manager, but set things up first
|
# pass-through to django manager, but set things up first
|
||||||
check_db = False
|
check_db = False
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,6 @@ MSSP_VAR = b'\x01'
|
||||||
MSSP_VAL = b'\x02'
|
MSSP_VAL = b'\x02'
|
||||||
|
|
||||||
|
|
||||||
# try to get the customized mssp info, if it exists.
|
|
||||||
MSSPTable_CUSTOM = utils.variable_from_module(settings.MSSP_META_MODULE, "MSSPTable", default={})
|
|
||||||
|
|
||||||
|
|
||||||
class Mssp(object):
|
class Mssp(object):
|
||||||
"""
|
"""
|
||||||
Implements the MSSP protocol. Add this to a variable on the telnet
|
Implements the MSSP protocol. Add this to a variable on the telnet
|
||||||
|
|
@ -86,109 +82,34 @@ class Mssp(object):
|
||||||
|
|
||||||
# Required fields
|
# Required fields
|
||||||
|
|
||||||
"NAME": "Evennia",
|
"NAME": settings.SERVERNAME,
|
||||||
"PLAYERS": self.get_player_count,
|
"PLAYERS": self.get_player_count,
|
||||||
"UPTIME": self.get_uptime,
|
"UPTIME": self.get_uptime,
|
||||||
|
|
||||||
# Generic
|
"PORT": list(reversed(settings.TELNET_PORTS)), # most important port should be last in list
|
||||||
|
|
||||||
|
# Evennia auto-filled
|
||||||
"CRAWL DELAY": "-1",
|
"CRAWL DELAY": "-1",
|
||||||
|
"CODEBASE": utils.get_evennia_version(mode='pretty'),
|
||||||
"HOSTNAME": "", # current or new hostname
|
"FAMILY": "Custom",
|
||||||
"PORT": ["4000"], # most important port should be last in list
|
|
||||||
"CODEBASE": "Evennia",
|
|
||||||
"CONTACT": "", # email for contacting the mud
|
|
||||||
"CREATED": "", # year MUD was created
|
|
||||||
"ICON": "", # url to icon 32x32 or larger; <32kb.
|
|
||||||
"IP": "", # current or new IP address
|
|
||||||
"LANGUAGE": "", # name of language used, e.g. English
|
|
||||||
"LOCATION": "", # full English name of server country
|
|
||||||
"MINIMUM AGE": "0", # set to 0 if not applicable
|
|
||||||
"WEBSITE": "www.evennia.com",
|
|
||||||
|
|
||||||
# Categorisation
|
|
||||||
|
|
||||||
"FAMILY": "Custom", # evennia goes under 'Custom'
|
|
||||||
"GENRE": "None", # Adult, Fantasy, Historical, Horror, Modern, None, or Science Fiction
|
|
||||||
"GAMEPLAY": "None", # Adventure, Educational, Hack and Slash, None,
|
|
||||||
# Player versus Player, Player versus Environment,
|
|
||||||
# Roleplaying, Simulation, Social or Strategy
|
|
||||||
"STATUS": "Open Beta", # Alpha, Closed Beta, Open Beta, Live
|
|
||||||
"GAMESYSTEM": "Custom", # D&D, d20 System, World of Darkness, etc. Use Custom if homebrew
|
|
||||||
"SUBGENRE": "None", # LASG, Medieval Fantasy, World War II, Frankenstein,
|
|
||||||
# Cyberpunk, Dragonlance, etc. Or None if not available.
|
|
||||||
|
|
||||||
# World
|
|
||||||
|
|
||||||
"AREAS": "0",
|
|
||||||
"HELPFILES": "0",
|
|
||||||
"MOBILES": "0",
|
|
||||||
"OBJECTS": "0",
|
|
||||||
"ROOMS": "0", # use 0 if room-less
|
|
||||||
"CLASSES": "0", # use 0 if class-less
|
|
||||||
"LEVELS": "0", # use 0 if level-less
|
|
||||||
"RACES": "0", # use 0 if race-less
|
|
||||||
"SKILLS": "0", # use 0 if skill-less
|
|
||||||
|
|
||||||
# Protocols set to 1 or 0)
|
|
||||||
|
|
||||||
"ANSI": "1",
|
"ANSI": "1",
|
||||||
"GMCP": "0",
|
"GMCP": "1" if settings.TELNET_OOB_ENABLED else "0",
|
||||||
"ATCP": "0",
|
"ATCP": "0",
|
||||||
"MCCP": "0",
|
"MCCP": "1",
|
||||||
"MCP": "0",
|
"MCP": "0",
|
||||||
"MSDP": "0",
|
"MSDP": "1" if settings.TELNET_OOB_ENABLED else "0",
|
||||||
"MSP": "0",
|
"MSP": "0",
|
||||||
"MXP": "0",
|
"MXP": "1",
|
||||||
"PUEBLO": "0",
|
"PUEBLO": "0",
|
||||||
"SSL": "1",
|
"SSL": "1" if settings.SSL_ENABLED else "0",
|
||||||
"UTF-8": "1",
|
"UTF-8": "1",
|
||||||
"ZMP": "0",
|
"ZMP": "0",
|
||||||
"VT100": "0",
|
"VT100": "1",
|
||||||
"XTERM 256 COLORS": "0",
|
"XTERM 256 COLORS": "1",
|
||||||
|
|
||||||
# Commercial set to 1 or 0)
|
|
||||||
|
|
||||||
"PAY TO PLAY": "0",
|
|
||||||
"PAY FOR PERKS": "0",
|
|
||||||
|
|
||||||
# Hiring set to 1 or 0)
|
|
||||||
|
|
||||||
"HIRING BUILDERS": "0",
|
|
||||||
"HIRING CODERS": "0",
|
|
||||||
|
|
||||||
# Extended variables
|
|
||||||
|
|
||||||
# World
|
|
||||||
|
|
||||||
"DBSIZE": "0",
|
|
||||||
"EXITS": "0",
|
|
||||||
"EXTRA DESCRIPTIONS": "0",
|
|
||||||
"MUDPROGS": "0",
|
|
||||||
"MUDTRIGS": "0",
|
|
||||||
"RESETS": "0",
|
|
||||||
|
|
||||||
# Game (set to 1, 0 or one of the given alternatives)
|
|
||||||
|
|
||||||
"ADULT MATERIAL": "0",
|
|
||||||
"MULTICLASSING": "0",
|
|
||||||
"NEWBIE FRIENDLY": "0",
|
|
||||||
"PLAYER CITIES": "0",
|
|
||||||
"PLAYER CLANS": "0",
|
|
||||||
"PLAYER CRAFTING": "0",
|
|
||||||
"PLAYER GUILDS": "0",
|
|
||||||
"EQUIPMENT SYSTEM": "None", # "None", "Level", "Skill", "Both"
|
|
||||||
"MULTIPLAYING": "None", # "None", "Restricted", "Full"
|
|
||||||
"PLAYERKILLING": "None", # "None", "Restricted", "Full"
|
|
||||||
"QUEST SYSTEM": "None", # "None", "Immortal Run", "Automated", "Integrated"
|
|
||||||
"ROLEPLAYING": "None", # "None", "Accepted", "Encouraged", "Enforced"
|
|
||||||
"TRAINING SYSTEM": "None", # "None", "Level", "Skill", "Both"
|
|
||||||
"WORLD ORIGINALITY": "None", # "All Stock", "Mostly Stock", "Mostly Original", "All Original"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# update the static table with the custom one
|
# update the static table with the custom one
|
||||||
if MSSPTable_CUSTOM:
|
self.mssp_table.update(settings.MSSP_TABLE)
|
||||||
self.mssp_table.update(MSSPTable_CUSTOM)
|
|
||||||
|
|
||||||
varlist = ''
|
varlist = ''
|
||||||
for variable, value in self.mssp_table.items():
|
for variable, value in self.mssp_table.items():
|
||||||
|
|
@ -196,7 +117,8 @@ class Mssp(object):
|
||||||
value = value()
|
value = value()
|
||||||
if utils.is_iter(value):
|
if utils.is_iter(value):
|
||||||
for partval in value:
|
for partval in value:
|
||||||
varlist += MSSP_VAR + bytes(variable, 'utf-8') + MSSP_VAL + bytes(partval, 'utf-8')
|
varlist += (MSSP_VAR + bytes(variable, 'utf-8') +
|
||||||
|
MSSP_VAL + bytes(partval, 'utf-8'))
|
||||||
else:
|
else:
|
||||||
varlist += MSSP_VAR + bytes(variable, 'utf-8') + MSSP_VAL + bytes(value, 'utf-8')
|
varlist += MSSP_VAR + bytes(variable, 'utf-8') + MSSP_VAL + bytes(value, 'utf-8')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -343,9 +343,6 @@ SERVER_SERVICES_PLUGIN_MODULES = ["server.conf.server_services_plugins"]
|
||||||
# main Evennia Portal application when the Portal is initiated.
|
# main Evennia Portal application when the Portal is initiated.
|
||||||
# It will be called last in the startup sequence.
|
# It will be called last in the startup sequence.
|
||||||
PORTAL_SERVICES_PLUGIN_MODULES = ["server.conf.portal_services_plugins"]
|
PORTAL_SERVICES_PLUGIN_MODULES = ["server.conf.portal_services_plugins"]
|
||||||
# Module holding MSSP meta data. This is used by MUD-crawlers to determine
|
|
||||||
# what type of game you are running, how many accounts you have etc.
|
|
||||||
MSSP_META_MODULE = "server.conf.mssp"
|
|
||||||
# Module for web plugins.
|
# Module for web plugins.
|
||||||
WEB_PLUGINS_MODULE = "server.conf.web_plugins"
|
WEB_PLUGINS_MODULE = "server.conf.web_plugins"
|
||||||
# Tuple of modules implementing lock functions. All callable functions
|
# Tuple of modules implementing lock functions. All callable functions
|
||||||
|
|
@ -682,6 +679,10 @@ DEFAULT_CHANNELS = [
|
||||||
# While the MudInfo channel will also receieve this, this channel is meant for non-staffers.
|
# While the MudInfo channel will also receieve this, this channel is meant for non-staffers.
|
||||||
CHANNEL_CONNECTINFO = None
|
CHANNEL_CONNECTINFO = None
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# External Connections
|
||||||
|
######################################################################
|
||||||
|
|
||||||
# The Evennia Game Index is a dynamic listing of Evennia games. You can add your game
|
# The Evennia Game Index is a dynamic listing of Evennia games. You can add your game
|
||||||
# to this list also if it is in closed pre-alpha development.
|
# to this list also if it is in closed pre-alpha development.
|
||||||
GAME_INDEX_ENABLED = False
|
GAME_INDEX_ENABLED = False
|
||||||
|
|
@ -692,15 +693,50 @@ GAME_INDEX_LISTING = {
|
||||||
'long_description': '',
|
'long_description': '',
|
||||||
'listing_contact': '', # email
|
'listing_contact': '', # email
|
||||||
'telnet_hostname': '', # mygame.com
|
'telnet_hostname': '', # mygame.com
|
||||||
'telnet_port': 1234,
|
'telnet_port': '', # 1234
|
||||||
'game_website': '', # http://mygame.com
|
'game_website': '', # http://mygame.com
|
||||||
'web_client_url': '' # http://mygame.com/webclient
|
'web_client_url': '' # http://mygame.com/webclient
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# MSSP (Mud Server Status Protocol) is used by MUD-crawlers to determine
|
||||||
|
# what type of game you are running, how many players you have etc. Some of
|
||||||
|
# this (like server name and current number of players) is handled by Evennia
|
||||||
|
# automatically, other fields are set by you.
|
||||||
|
MSSP_TABLE = {
|
||||||
|
"HOSTNAME": "", "PORT": "", # telnet host/port
|
||||||
|
"CONTACT": "", "CREATED": "", # email, year of game creation
|
||||||
|
"IP": "", "ICON": "", # ip address; url to icon 32x32or larger; <32kb.
|
||||||
|
"LANGUAGE": "English", "LOCATION": "", # server country location, like "Sweden"
|
||||||
|
"MINIMUM AGE": "0", # set to 0 if not applicable
|
||||||
|
"WEBSITE": "www.evennia.com",
|
||||||
|
"GENRE": "None", # Adult, Fantasy, Historical, Horror, Modern, None, or Science Fiction
|
||||||
|
"GAMEPLAY": "None", # Adventure, Educational, Hack and Slash, None,
|
||||||
|
# Player versus Player, Player versus Environment,
|
||||||
|
# Roleplaying, Simulation, Social or Strategy
|
||||||
|
"STATUS": "Alpha", # Alpha, Closed Beta, Open Beta, Live
|
||||||
|
"GAMESYSTEM": "Custom", # D&D, d20 System, World of Darkness, etc. Use Custom if homebrew
|
||||||
|
"SUBGENRE": "None", # Freeform, like LASG, Medieval Fantasy, World War II, Frankenstein,
|
||||||
|
# Cyberpunk, Dragonlance, etc. Or None if not available.
|
||||||
|
# use 0 if not applicable or off
|
||||||
|
"AREAS": "0", "HELPFILES": "0", "MOBILES": "0", "OBJECTS": "0",
|
||||||
|
"ROOMS": "0", "CLASSES": "0", "LEVELS": "0", "RACES": "0", "SKILLS": "0",
|
||||||
|
|
||||||
######################################################################
|
"PAY TO PLAY": "0", "PAY FOR PERKS": "0",
|
||||||
# External Channel connections
|
"HIRING BUILDERS": "0", "HIRING CODERS": "0",
|
||||||
######################################################################
|
|
||||||
|
"DBSIZE": "0", "EXITS": "0", "EXTRA DESCRIPTIONS": "0",
|
||||||
|
"MUDPROGS": "0", "MUDTRIGS": "0", "RESETS": "0",
|
||||||
|
|
||||||
|
"ADULT MATERIAL": "0", "MULTICLASSING": "0", "NEWBIE FRIENDLY": "0", "PLAYER CITIES": "0",
|
||||||
|
"PLAYER CLANS": "0", "PLAYER CRAFTING": "0", "PLAYER GUILDS": "0",
|
||||||
|
"EQUIPMENT SYSTEM": "None", # "None", "Level", "Skill", "Both"
|
||||||
|
"MULTIPLAYING": "None", # "None", "Restricted", "Full"
|
||||||
|
"PLAYERKILLING": "None", # "None", "Restricted", "Full"
|
||||||
|
"QUEST SYSTEM": "None", # "None", "Immortal Run", "Automated", "Integrated"
|
||||||
|
"ROLEPLAYING": "None", # "None", "Accepted", "Encouraged", "Enforced"
|
||||||
|
"TRAINING SYSTEM": "None", # "None", "Level", "Skill", "Both"
|
||||||
|
"WORLD ORIGINALITY": "None", # "All Stock", "Mostly Stock", "Mostly Original", "All Original"
|
||||||
|
}
|
||||||
|
|
||||||
# Note: You do *not* have to make your MUD open to
|
# Note: You do *not* have to make your MUD open to
|
||||||
# the public to use the external connections, they
|
# the public to use the external connections, they
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue