Merge branch 'master' into develop

This commit is contained in:
Griatch 2018-12-30 11:15:10 +01:00
commit daa9c55653
10 changed files with 488 additions and 356 deletions

View file

@ -105,7 +105,7 @@ def _create_version():
print(err) print(err)
try: try:
version = "%s (rev %s)" % (version, check_output("git rev-parse --short HEAD", shell=True, cwd=root, stderr=STDOUT).strip()) version = "%s (rev %s)" % (version, check_output("git rev-parse --short HEAD", shell=True, cwd=root, stderr=STDOUT).strip())
except (IOError, CalledProcessError, WindowsError): except (IOError, CalledProcessError, OSError):
# ignore if we cannot get to git # ignore if we cannot get to git
pass pass
return version return version

View file

@ -3047,7 +3047,7 @@ class CmdSpawn(COMMAND_DEFAULT_CLASS):
caller.msg("|rDeletion cancelled.|n") caller.msg("|rDeletion cancelled.|n")
return return
try: try:
success = protlib.delete_db_prototype(caller, self.args) success = protlib.delete_prototype(self.args)
except protlib.PermissionError as err: except protlib.PermissionError as err:
caller.msg("|rError deleting:|R {}|n".format(err)) caller.msg("|rError deleting:|R {}|n".format(err))
caller.msg("Deletion {}.".format( caller.msg("Deletion {}.".format(

View file

@ -1,7 +1,7 @@
# Contrib folder # Contrib folder
This folder contains 'contributions': extra snippets of code that are `evennia/contrib/` contains 'contributions': extra snippets of code that are
potentially very useful for the game coder but which are considered potentially very useful for the game coder but which are considered
too game-specific to be a part of the main Evennia game server. These too game-specific to be a part of the main Evennia game server. These
modules are not used unless you explicitly import them. See each file modules are not used unless you explicitly import them. See each file
@ -17,7 +17,7 @@ things you want from here into your game folder and change them there.
* Barter system (Griatch 2012) - A safe and effective barter-system * Barter system (Griatch 2012) - A safe and effective barter-system
for any game. Allows safe trading of any goods (including coin). for any game. Allows safe trading of any goods (including coin).
* Building menu (vincent-lg 2018) - An @edit command for modifying * Building menu (vincent-lg 2018) - An `@edit` command for modifying
objects using a generated menu. Customizable for different games. objects using a generated menu. Customizable for different games.
* CharGen (Griatch 2011) - A simple Character creator for OOC mode. * CharGen (Griatch 2011) - A simple Character creator for OOC mode.
Meant as a starting point for a more fleshed-out system. Meant as a starting point for a more fleshed-out system.
@ -60,9 +60,6 @@ things you want from here into your game folder and change them there.
* Tree Select (FlutterSprite 2017) - A simple system for creating a * Tree Select (FlutterSprite 2017) - A simple system for creating a
branching EvMenu with selection options sourced from a single branching EvMenu with selection options sourced from a single
multi-line string. multi-line string.
* Turnbattle (Tim Ashley Jenkins 2017) - This is a framework for a turn-based
combat system with different levels of complexity, including versions with
equipment and magic as well as ranged combat.
* Wilderness (titeuf87 2017) - Make infinitely large wilderness areas * Wilderness (titeuf87 2017) - Make infinitely large wilderness areas
with dynamically created locations. with dynamically created locations.
* UnixCommand (Vincent Le Geoff 2017) - Add commands with UNIX-style syntax. * UnixCommand (Vincent Le Geoff 2017) - Add commands with UNIX-style syntax.
@ -75,7 +72,8 @@ things you want from here into your game folder and change them there.
objects and events using Python from in-game. objects and events using Python from in-game.
* Turnbattle (FlutterSprite 2017) - A turn-based combat engine meant * Turnbattle (FlutterSprite 2017) - A turn-based combat engine meant
as a start to build from. Has attack/disengage and turn timeouts, as a start to build from. Has attack/disengage and turn timeouts,
and includes optional expansions for equipment and combat movement. and includes optional expansions for equipment and combat movement, magic
and ranged combat.
* Tutorial examples (Griatch 2011, 2015) - A folder of basic * Tutorial examples (Griatch 2011, 2015) - A folder of basic
example objects, commands and scripts. example objects, commands and scripts.
* Tutorial world (Griatch 2011, 2015) - A folder containing the * Tutorial world (Griatch 2011, 2015) - A folder containing the

View file

@ -1,116 +1,132 @@
# SOME DESCRIPTIVE TITLE. # The French translation for the Evennia server.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the Evennia package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# Maintained by: vincent-lg <vincent.legoff.srs@gmail.com>, 2018-
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-02 16:22-0500\n" "POT-Creation-Date: 2018-11-22 08:45+0100\n"
"PO-Revision-Date: 2016-03-04 11:51-0500\n" "PO-Revision-Date: 2016-03-04 11:51-0500\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fr\n" "Language: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
"Last-Translator: \n"
"Language-Team: \n"
"X-Generator: Poedit 1.7.6\n" "X-Generator: Poedit 1.7.6\n"
#: commands/cmdhandler.py:485 #: .\accounts\accounts.py:440
msgid "There were multiple matches." #, fuzzy
msgstr "Il y a eu plusieurs correspondances." msgid "Account being deleted."
msgstr "Suppression du compte."
#: commands/cmdhandler.py:513 #: .\commands\cmdhandler.py:681
msgid "There were multiple matches."
msgstr "Il y a plusieurs correspondances possibles."
#: .\commands\cmdhandler.py:704
#, python-format #, python-format
msgid "Command '%s' is not available." msgid "Command '%s' is not available."
msgstr "Commande '%s' n'est pas disponible." msgstr "La commande '%s' n'est pas disponible."
#: commands/cmdhandler.py:518 #: .\commands\cmdhandler.py:709
#, python-format #, python-format
msgid " Maybe you meant %s?" msgid " Maybe you meant %s?"
msgstr "Voulez-vous dire %s?" msgstr " Vouliez-vous dire %s ?"
#: commands/cmdhandler.py:518 #: .\commands\cmdhandler.py:709
msgid "or" msgid "or"
msgstr "ou" msgstr "ou"
#: commands/cmdhandler.py:520 #: .\commands\cmdhandler.py:711
msgid " Type \"help\" for help." msgid " Type \"help\" for help."
msgstr "Tapez \"help\" pour de l'aide." msgstr " Tapez \"help\" pour obtenir de l'aide."
#: commands/cmdparser.py:183 #: .\commands\cmdsethandler.py:89
#, python-format #, python-brace-format
msgid "Could not find '%s'." msgid ""
msgstr "Peut pas trouver '%s'." "{traceback}\n"
"Error loading cmdset '{path}'\n"
"(Traceback was logged {timestamp})"
msgstr ""
"{traceback}\n"
"Une erreur s'est produite lors du chargement du cmdset '{path}'\n"
"(Référence de l'erreur : {timestamp})"
#: commands/cmdsethandler.py:130 #: .\commands\cmdsethandler.py:94
#, python-format #, fuzzy, python-brace-format
msgid ""
"Error loading cmdset: No cmdset class '{classname}' in '{path}'.\n"
"(Traceback was logged {timestamp})"
msgstr ""
"\n"
"Une erreur s'est produite lors du chargement de cmdset : la classe cmdset '{classname}' est introuvable dans "
"{path}.\n"
"(Référence de l'erreur : {timestamp})"
#: .\commands\cmdsethandler.py:98
#, fuzzy, python-brace-format
msgid ""
"{traceback}\n"
"SyntaxError encountered when loading cmdset '{path}'.\n"
"(Traceback was logged {timestamp})"
msgstr ""
"\n"
"Erreur de syntaxe lors du chargement de cmdset '{path}' : \"{error}\".\n"
"(Référence de l'erreur : {timestamp})"
#: .\commands\cmdsethandler.py:103
#, fuzzy, python-brace-format
msgid ""
"{traceback}\n"
"Compile/Run error when loading cmdset '{path}'.\",\n"
"(Traceback was logged {timestamp})"
msgstr ""
"\n"
"Erreur de compilation/exécution lors du chargement de cmdset '{path}' : "
"\"{error}\".\n"
"(Référence de l'erreur : {timestamp})"
#: .\commands\cmdsethandler.py:108
#, python-brace-format
msgid "" msgid ""
"\n" "\n"
"(Unsuccessfully tried '%s.' + '%s.%s')." "Error encountered for cmdset at path '{path}'.\n"
"Replacing with fallback '{fallback_path}'.\n"
msgstr ""
"\n"
"Une erreur a été rencontrée lors du chargement du cmdset '{path}'.\n"
"Le cmdset '{fallback_path}' est utilisé en remplacement.\n"
#: .\commands\cmdsethandler.py:114
#, python-brace-format
msgid "Fallback path '{fallback_path}' failed to generate a cmdset."
msgstr "Impossible de générer le cmdset de remplacement : '{fallback_path}'."
#: .\commands\cmdsethandler.py:182 .\commands\cmdsethandler.py:192
#, fuzzy, python-format
msgid ""
"\n"
"(Unsuccessfully tried '%s')."
msgstr "" msgstr ""
"\n" "\n"
"(Essayé sans succès '%s.' + '%s.%s')." "(Essayé sans succès '%s.' + '%s.%s')."
#: commands/cmdsethandler.py:151 #: .\commands\cmdsethandler.py:311
#, python-brace-format
msgid ""
"\n"
"Error loading cmdset {path}: \"{error}\""
msgstr ""
"\n"
"Erreur de chargement de cmdset {path}: \"{error}\""
#: commands/cmdsethandler.py:155
#, python-brace-format
msgid ""
"\n"
"Error in loading cmdset: No cmdset class '{classname}' in {path}."
msgstr ""
"\n"
"Erreur lors du chargement de cmdset: Pas de classe cmdset '{classname}' in "
"{path}."
#: commands/cmdsethandler.py:159
#, python-brace-format
msgid ""
"\n"
"SyntaxError encountered when loading cmdset '{path}': \"{error}\"."
msgstr ""
"\n"
"Erreur de syntaxe lors du chargement de cmdset '{path}': \"{error}\"."
#: commands/cmdsethandler.py:163
#, python-brace-format
msgid ""
"\n"
"Compile/Run error when loading cmdset '{path}': \"{error}\"."
msgstr ""
"\n"
"Erreur de compilation/exécution lors du chargement de cmdset '{path}': "
"\"{error}\"."
#: commands/cmdsethandler.py:174
msgid ""
"\n"
" (See log for details.)"
msgstr ""
"\n"
"(Voir registre pour plus de détails.)"
#: commands/cmdsethandler.py:247
#, python-brace-format #, python-brace-format
msgid "custom {mergetype} on cmdset '{cmdset}'" msgid "custom {mergetype} on cmdset '{cmdset}'"
msgstr "custom {mergetype} sur cmdset '{cmdset}'" msgstr "custom {mergetype} sur cmdset '{cmdset}'"
#: commands/cmdsethandler.py:250 #: .\commands\cmdsethandler.py:314
#, python-brace-format #, python-brace-format
msgid " <Merged {mergelist} {mergetype}, prio {prio}>: {current}" msgid " <Merged {mergelist} {mergetype}, prio {prio}>: {current}"
msgstr " <Fusionné {mergelist} {mergetype}, prio {prio}>: {current}" msgstr " <Fusionné {mergelist} {mergetype}, prio {prio}>: {current}"
#: commands/cmdsethandler.py:258 #: .\commands\cmdsethandler.py:322
#, python-brace-format #, python-brace-format
msgid "" msgid ""
" <{key} ({mergetype}, prio {prio}, {permstring})>:\n" " <{key} ({mergetype}, prio {prio}, {permstring})>:\n"
@ -119,135 +135,212 @@ msgstr ""
" <{key} ({mergetype}, prio {prio}, {permstring})>:\n" " <{key} ({mergetype}, prio {prio}, {permstring})>:\n"
" {keylist}" " {keylist}"
#: commands/cmdsethandler.py:347 #: .\commands\cmdsethandler.py:426
msgid "Only CmdSets can be added to the cmdsethandler!" msgid "Only CmdSets can be added to the cmdsethandler!"
msgstr "Seulement CmdSets peuvent être ajoutés au cmdsethandler!" msgstr "Seuls des CmdSets peuvent être ajoutés au cmdsethandler !"
#: comms/channelhandler.py:94 #: .\comms\channelhandler.py:100
msgid "Say what?"
msgstr "Que voulez-vous dire ?"
#: .\comms\channelhandler.py:105
#, python-format
msgid "Channel '%s' not found."
msgstr "Le canal '%s' ne semble pas exister."
#: .\comms\channelhandler.py:108
#, python-format
msgid "You are not connected to channel '%s'."
msgstr "Vous n'êtes pas connecté au canal '%s'."
#: .\comms\channelhandler.py:112
#, python-format
msgid "You are not permitted to send to channel '%s'."
msgstr "Vous n'avez pas le droit de parler sur le canal '%s'."
#: .\comms\channelhandler.py:155
msgid " (channel)" msgid " (channel)"
msgstr " (channel)" msgstr " (canal)"
#: locks/lockhandler.py:230 #: .\locks\lockhandler.py:236
#, python-format #, python-format
msgid "Lock: lock-function '%s' is not available." msgid "Lock: lock-function '%s' is not available."
msgstr "Vérou: lock-function '%s' n'est pas disponible." msgstr "Verrou : lock-function '%s' n'est pas disponible."
#: locks/lockhandler.py:243 #: .\locks\lockhandler.py:249
#, python-format #, python-format
msgid "Lock: definition '%s' has syntax errors." msgid "Lock: definition '%s' has syntax errors."
msgstr "Vérou: définition '%s' a des erreurs de syntaxe." msgstr "Verrou : la définition '%s' a des erreurs de syntaxe."
#: locks/lockhandler.py:247 #: .\locks\lockhandler.py:253
#, python-format #, python-format
msgid "" msgid ""
"LockHandler on %(obj)s: access type '%(access_type)s' changed from " "LockHandler on %(obj)s: access type '%(access_type)s' changed from "
"'%(source)s' to '%(goal)s' " "'%(source)s' to '%(goal)s' "
msgstr "" msgstr ""
"Gestionnaire de vérrou sur %(obj)s: type d'accès '%(access_type)s' a changé " "Gestionnaire de verrous sur %(obj)s: type d'accès '%(access_type)s' a changé "
"de '%(source)s' à '%(goal)s'" "de '%(source)s' à '%(goal)s'"
#: locks/lockhandler.py:304 #: .\locks\lockhandler.py:320
#, python-format #, fuzzy, python-brace-format
msgid "Lock: '%s' contains no colon (:)." msgid "Lock: '{lockdef}' contains no colon (:)."
msgstr "Verrou: '%s' contient pas de deux points (:)." msgstr "Verrou : '%s' ne contient pas de deux points (:)."
#: locks/lockhandler.py:308 #: .\locks\lockhandler.py:328
#, python-format #, fuzzy, python-brace-format
msgid "Lock: '%s' has no access_type (left-side of colon is empty)." msgid "Lock: '{lockdef}' has no access_type (left-side of colon is empty)."
msgstr "" msgstr ""
"Verrou: '%s' n'a pas de access_type (côté gauche du deux point est vide)." "Verrou : '%s' n'a pas de 'access_type' (il n'y a rien avant les deux points)."
#: locks/lockhandler.py:311 #: .\locks\lockhandler.py:336
#, python-format #, fuzzy, python-brace-format
msgid "Lock: '%s' has mismatched parentheses." msgid "Lock: '{lockdef}' has mismatched parentheses."
msgstr "Verrou: '%s' a des parenthèses dépareillées." msgstr "Verrou : '%s' a des parenthèses déséquilibrées."
#: locks/lockhandler.py:314 #: .\locks\lockhandler.py:343
#, python-format #, fuzzy, python-brace-format
msgid "Lock: '%s' has no valid lock functions." msgid "Lock: '{lockdef}' has no valid lock functions."
msgstr "Verrou: '%s' n'a pas de fonctions verrou valides." msgstr "Verrou : '%s' n'a pas de lock-function valide."
#: objects/objects.py:528 #: .\objects\objects.py:729
#, python-format #, python-format
msgid "Couldn't perform move ('%s'). Contact an admin." msgid "Couldn't perform move ('%s'). Contact an admin."
msgstr "Ne pouvait effectuer le coup ('%s'). Contactez un administrateur." msgstr "Impossible de se déplacer vers ('%s'). Veuillez contacter un administrateur."
#: objects/objects.py:538 #: .\objects\objects.py:739
msgid "The destination doesn't exist." msgid "The destination doesn't exist."
msgstr "La destination n'existe pas." msgstr "La destination est inconnue."
#: objects/objects.py:651 #: .\objects\objects.py:830
#, python-format #, python-format
msgid "Could not find default home '(#%d)'." msgid "Could not find default home '(#%d)'."
msgstr "Ne peut trouver la maison '(#%d)' par défaut." msgstr "Impossible de trouver la salle de départ (default home) par défaut : '#%d'."
#: objects/objects.py:667 #: .\objects\objects.py:846
msgid "Something went wrong! You are dumped into nowhere. Contact an admin." msgid "Something went wrong! You are dumped into nowhere. Contact an admin."
msgstr "" msgstr ""
"Quelque chose a mal tourné! Vous êtes nulle part. Contactez un " "Quelque chose a mal tourné ! Vous vous trouvez au milieu de nulle part. "
"administrateur." "Veuillez contacter un administrateur."
#: objects/objects.py:747 #: .\objects\objects.py:912
#, python-format #, python-format
msgid "Your character %s has been destroyed." msgid "Your character %s has been destroyed."
msgstr "Votre personnage %s a été détruit." msgstr "Votre personnage %s a été détruit."
#: players/players.py:356 #: .\scripts\scripthandler.py:53
msgid "Player being deleted."
msgstr "Suppression de joueur."
#: scripts/scripthandler.py:50
#, python-format #, python-format
msgid "" msgid ""
"\n" "\n"
" '%(key)s' (%(next_repeat)s/%(interval)s, %(repeats)s repeats): %(desc)s" " '%(key)s' (%(next_repeat)s/%(interval)s, %(repeats)s repeats): %(desc)s"
msgstr "" msgstr ""
"\n" "\n"
" '%(key)s' (%(next_repeat)s/%(interval)s, %(repeats)s répète): %(desc)s" " '%(key)s' (%(next_repeat)s/%(interval)s, %(repeats)s répète) : %(desc)s"
#: scripts/scripts.py:202 #: .\scripts\scripts.py:205
#, python-format #, python-format
msgid "" msgid ""
"Script %(key)s(#%(dbid)s) of type '%(cname)s': at_repeat() error '%(err)s'." "Script %(key)s(#%(dbid)s) of type '%(cname)s': at_repeat() error '%(err)s'."
msgstr "" msgstr ""
"Scripte %(key)s(#%(dbid)s) de type '%(cname)s': at_repeat() erreur " "Le script %(key)s(#%(dbid)s) de type '%(cname)s' a rencontré une erreur "
"'%(err)s'." "durant at_repeat() : '%(err)s'."
#: server/initial_setup.py:29 #: .\server\initial_setup.py:28
#, fuzzy
msgid "" msgid ""
"\n" "\n"
"Welcome to your new |wEvennia|n-based game! Visit http://www.evennia.com if " "Welcome to your new |wEvennia|n-based game! Visit http://www.evennia.com if "
"you need\n" "you need\n"
"help, want to contribute, report issues or just join the community.\n" "help, want to contribute, report issues or just join the community.\n"
"As Player #1 you can create a demo/tutorial area with |w@batchcommand " "As Account #1 you can create a demo/tutorial area with |w@batchcommand "
"tutorial_world.build|n.\n" "tutorial_world.build|n.\n"
" " " "
msgstr "" msgstr ""
"\n" "\n"
"Bienvenue dans ton nouveau jeu basé sur |wEvennia|n ! Visitez http://www." "Bienvenue dans votre nouveau jeu basé sur |wEvennia|n ! Visitez le site Web\n"
"evennia.com si vous avez besoin\n" "http://www.evennia.com si vous avez besoin d'aide, pour contribuer au projet,\n"
"d'aide, si vous voulez contribuer, rapporter des problèmes ou faire partie " "afin de rapporter des bugs ou faire partie de la communauté.\n"
"de la communauté.\n" "En tant que premier personnage (#1), vous pouvez créer une zone de\n"
"En tant que Joueur #1 vous pouvez créer une zone de démo/tutoriel avec " "démo/tutoriel en entrant la commande |w@batchcommand tutorial_world.build|n.\n"
"|w@batchcommand tutorial_world.build|n.\n"
" " " "
#: server/initial_setup.py:102 #: .\server\initial_setup.py:92
msgid "This is User #1." msgid "This is User #1."
msgstr "Utilisateur #1." msgstr "C'est l'utilisateur #1."
#: server/initial_setup.py:111 #: .\server\initial_setup.py:105
msgid "Limbo" msgid "Limbo"
msgstr "Limbes." msgstr "Limbes"
#: server/sessionhandler.py:258 #: .\server\server.py:139
#, fuzzy
msgid "idle timeout exceeded"
msgstr "Délai d'inactivité dépassé, déconnexion."
#: .\server\sessionhandler.py:386
msgid " ... Server restarted." msgid " ... Server restarted."
msgstr " ... Serveur redémarré." msgstr " ... Serveur redémarré."
#: server/sessionhandler.py:408 #: .\server\sessionhandler.py:606
msgid "Logged in from elsewhere. Disconnecting." msgid "Logged in from elsewhere. Disconnecting."
msgstr "Connecté d'ailleurs. Déconnexion." msgstr "Connexion d'une autre session. Déconnexion de celle-ci."
#: server/sessionhandler.py:432 #: .\server\sessionhandler.py:634
msgid "Idle timeout exceeded, disconnecting." msgid "Idle timeout exceeded, disconnecting."
msgstr "Délai d'inactivité dépassé, déconnexion." msgstr "Délai d'inactivité dépassé, déconnexion."
#: .\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 Depuis votre client, vous pouvez également préciser une phrase contenant "
"plusieurs mots séparés par un espace, dès lors que cette phrase est entourée de guillemets."
#: .\utils\evmenu.py:192
#, python-brace-format
msgid ""
"Menu node '{nodename}' is either not implemented or caused an error. Make "
"another choice."
msgstr ""
"Ce choix '{nodename}' n'est pas implémenté, ou bien a créé une erreur. "
"Faies un autre choix."
#: .\utils\evmenu.py:194
#, python-brace-format
msgid "Error in menu node '{nodename}'."
msgstr "Une erreur s'est produite dans le choix '{nodename}'."
#: .\utils\evmenu.py:195
msgid "No description."
msgstr "Description non renseignée."
#: .\utils\evmenu.py:196
msgid "Commands: <menu option>, help, quit"
msgstr "Utilisez une des commandes : <menu option>, help, quit"
#: .\utils\evmenu.py:197
msgid "Commands: <menu option>, help"
msgstr "Utilisez une des commandes : <menu option>, help"
#: .\utils\evmenu.py:198
msgid "Commands: help, quit"
msgstr "Utilisez une des commandes : help, quit"
#: .\utils\evmenu.py:199
msgid "Commands: help"
msgstr "Utilisez la commande : help"
#: .\utils\evmenu.py:200
msgid "Choose an option or try 'help'."
msgstr "Choisissez une option ou entrez la commande 'help'."
#: .\utils\utils.py:1866
#, python-format
msgid "Could not find '%s'."
msgstr "Impossible de trouver '%s'."
#: .\utils\utils.py:1873
#, python-format
msgid "More than one match for '%s' (please narrow target):\n"
msgstr "Plus d'une possibilité pour '%s' (veuillez préciser) :\n"

View file

@ -1217,7 +1217,7 @@ def evennia_version():
"git rev-parse --short HEAD", "git rev-parse --short HEAD",
shell=True, cwd=EVENNIA_ROOT, stderr=STDOUT).strip() shell=True, cwd=EVENNIA_ROOT, stderr=STDOUT).strip()
version = "%s (rev %s)" % (version, rev) version = "%s (rev %s)" % (version, rev)
except (IOError, CalledProcessError, WindowsError): except (IOError, CalledProcessError, OSError):
# move on if git is not answering # move on if git is not answering
pass pass
return version return version

View file

@ -30,32 +30,31 @@ plugin_handler.add('hotbuttons', (function () {
// Add Buttons // Add Buttons
var addButtonsUI = function () { var addButtonsUI = function () {
var buttons = $( [ var buttons = $( [
'<div id="buttons" class="split split-vertical">', '<div id="buttons" class="split split-vertical">',
' <div id="buttonsform" class="wrapper">', ' <div id="buttonsform">',
' <div id="buttonscontrol" class="input-group">', ' <div id="buttonscontrol" class="input-group">',
' <button class="btn" id="assign_button0" type="button" value="button0">unassigned</button>', ' <button class="btn" id="assign_button0" type="button" value="button0">unassigned</button>',
' <button class="btn" id="assign_button1" type="button" value="button1">unassigned</button>', ' <button class="btn" id="assign_button1" type="button" value="button1">unassigned</button>',
' <button class="btn" id="assign_button2" type="button" value="button2">unassigned</button>', ' <button class="btn" id="assign_button2" type="button" value="button2">unassigned</button>',
' <button class="btn" id="assign_button3" type="button" value="button3">unassigned</button>', ' <button class="btn" id="assign_button3" type="button" value="button3">unassigned</button>',
' <button class="btn" id="assign_button4" type="button" value="button4">unassigned</button>', ' <button class="btn" id="assign_button4" type="button" value="button4">unassigned</button>',
' <button class="btn" id="assign_button5" type="button" value="button5">unassigned</button>', ' <button class="btn" id="assign_button5" type="button" value="button5">unassigned</button>',
' <button class="btn" id="assign_button6" type="button" value="button6">unassigned</button>', ' <button class="btn" id="assign_button6" type="button" value="button6">unassigned</button>',
' <button class="btn" id="assign_button7" type="button" value="button7">unassigned</button>', ' <button class="btn" id="assign_button7" type="button" value="button7">unassigned</button>',
' <button class="btn" id="assign_button8" type="button" value="button8">unassigned</button>', ' <button class="btn" id="assign_button8" type="button" value="button8">unassigned</button>',
' </div>', ' </div>',
' </div>', ' </div>',
'</div>', '</div>',
].join("\n") ); ].join("\n") );
// Add buttons in front of the existing #inputform // Add buttons in front of the existing #inputform
buttons.insertBefore('#inputform'); $('#input').prev().replaceWith(buttons);
$('#inputform').addClass('split split-vertical');
Split(['#buttons','#inputform'], { Split(['#main','#buttons','#input'], {
sizes: [85,5,10],
direction: 'vertical', direction: 'vertical',
sizes: [50,50],
gutterSize: 4, gutterSize: 4,
minSize: 150, minSize: [150,20,50],
}); });
} }

View file

@ -77,10 +77,12 @@ let options_plugin = (function () {
if (code === 27) { // Escape key if (code === 27) { // Escape key
if ($('#helpdialog').is(':visible')) { if ($('#helpdialog').is(':visible')) {
plugins['popups'].closePopup("#helpdialog"); plugins['popups'].closePopup("#helpdialog");
} else { return true;
plugins['popups'].closePopup("#optionsdialog"); }
if ($('#optionsdialog').is(':visible')) {
plugins['popups'].closePopup("#optionsdialog");
return true;
} }
return true;
} }
return false; return false;
} }
@ -129,6 +131,21 @@ let options_plugin = (function () {
plugins['popups'].closePopup("#helpdialog"); plugins['popups'].closePopup("#helpdialog");
} }
//
// Make sure to close any dialogs on connection lost
var onText = function (args, kwargs) {
// is helppopup set? and if so, does this Text have type 'help'?
if ('helppopup' in options && options['helppopup'] ) {
if (kwargs && ('type' in kwargs) && (kwargs['type'] == 'help') ) {
$('#helpdialogcontent').append('<div>'+ args + '</div>');
plugins['popups'].togglePopup("#helpdialog");
return true;
}
}
return false;
}
// //
// Register and init plugin // Register and init plugin
var init = function () { var init = function () {
@ -155,6 +172,7 @@ let options_plugin = (function () {
onGotOptions: onGotOptions, onGotOptions: onGotOptions,
onPrompt: onPrompt, onPrompt: onPrompt,
onConnectionClose: onConnectionClose, onConnectionClose: onConnectionClose,
onText: onText,
} }
})() })()
plugin_handler.add('options', options_plugin); plugin_handler.add('options', options_plugin);

View file

@ -183,12 +183,12 @@ let splithandler_plugin = (function () {
var dialog = $("#splitdialogcontent"); var dialog = $("#splitdialogcontent");
dialog.empty(); dialog.empty();
var selection = '<select name="pane">'; var selection = '<select name="pane">';
for ( var pane in split_panes ) { for ( var pane in split_panes ) {
selection = selection + '<option value="' + pane + '">' + pane + '</option>'; selection = selection + '<option value="' + pane + '">' + pane + '</option>';
} }
selection = "Pane to split: " + selection + "</select> "; selection = "Pane to split: " + selection + "</select> ";
dialog.append(selection); dialog.append(selection);
dialog.append('<input type="radio" name="direction" value="vertical" checked>top/bottom </>'); dialog.append('<input type="radio" name="direction" value="vertical" checked>top/bottom </>');
dialog.append('<input type="radio" name="direction" value="horizontal">side-by-side <hr />'); dialog.append('<input type="radio" name="direction" value="horizontal">side-by-side <hr />');
@ -203,7 +203,7 @@ let splithandler_plugin = (function () {
dialog.append('<input type="radio" name="flow2" value="replace">replace </>'); dialog.append('<input type="radio" name="flow2" value="replace">replace </>');
dialog.append('<input type="radio" name="flow2" value="append">append <hr />'); dialog.append('<input type="radio" name="flow2" value="append">append <hr />');
dialog.append('<div id="splitclose" class="btn btn-large btn-outline-primary float-right">Split</div>'); dialog.append('<div id="splitclose" class="btn btn-large btn-outline-primary float-right">Split</div>');
$("#splitclose").bind("click", onSplitDialogClose); $("#splitclose").bind("click", onSplitDialogClose);
@ -251,21 +251,21 @@ let splithandler_plugin = (function () {
var dialog = $("#panedialogcontent"); var dialog = $("#panedialogcontent");
dialog.empty(); dialog.empty();
var selection = '<select name="assign-pane">'; var selection = '<select name="assign-pane">';
for ( var pane in split_panes ) { for ( var pane in split_panes ) {
selection = selection + '<option value="' + pane + '">' + pane + '</option>'; selection = selection + '<option value="' + pane + '">' + pane + '</option>';
} }
selection = "Assign to pane: " + selection + "</select> <hr />"; selection = "Assign to pane: " + selection + "</select> <hr />";
dialog.append(selection); dialog.append(selection);
var multiple = '<select multiple name="assign-type">'; var multiple = '<select multiple name="assign-type">';
for ( var type in known_types ) { for ( var type in known_types ) {
multiple = multiple + '<option value="' + known_types[type] + '">' + known_types[type] + '</option>'; multiple = multiple + '<option value="' + known_types[type] + '">' + known_types[type] + '</option>';
} }
multiple = "Content types: " + multiple + "</select> <hr />"; multiple = "Content types: " + multiple + "</select> <hr />";
dialog.append(multiple); dialog.append(multiple);
dialog.append('<div id="paneclose" class="btn btn-large btn-outline-primary float-right">Assign</div>'); dialog.append('<div id="paneclose" class="btn btn-large btn-outline-primary float-right">Assign</div>');
$("#paneclose").bind("click", onPaneControlDialogClose); $("#paneclose").bind("click", onPaneControlDialogClose);
@ -276,9 +276,9 @@ let splithandler_plugin = (function () {
// Close "Pane Controls" dialog // Close "Pane Controls" dialog
var onPaneControlDialogClose = function () { var onPaneControlDialogClose = function () {
var pane = $("select[name=assign-pane]").val(); var pane = $("select[name=assign-pane]").val();
var types = $("select[name=assign-type]").val(); var types = $("select[name=assign-type]").val();
// var types = new Array; // var types = new Array;
// $('#splitdialogcontent input[type=checkbox]:checked').each(function() { // $('#splitdialogcontent input[type=checkbox]:checked').each(function() {
// types.push( $(this).attr('value') ); // types.push( $(this).attr('value') );
// }); // });
@ -287,24 +287,24 @@ let splithandler_plugin = (function () {
plugins['popups'].closePopup("#panedialog"); plugins['popups'].closePopup("#panedialog");
} }
// //
// helper function sending text to a pane // helper function sending text to a pane
var txtToPane = function (panekey, txt) { var txtToPane = function (panekey, txt) {
var pane = split_panes[panekey]; var pane = split_panes[panekey];
var text_div = $('#' + panekey + '-sub'); var text_div = $('#' + panekey + '-sub');
if ( pane['update_method'] == 'replace' ) {
text_div.html(txt)
} else if ( pane['update_method'] == 'append' ) {
text_div.append(txt);
var scrollHeight = text_div.parent().prop("scrollHeight");
text_div.parent().animate({ scrollTop: scrollHeight }, 0);
} else { // line feed
text_div.append("<div class='out'>" + txt + "</div>");
var scrollHeight = text_div.parent().prop("scrollHeight");
text_div.parent().animate({ scrollTop: scrollHeight }, 0);
}
if ( pane['update_method'] == 'replace' ) {
text_div.html(txt)
} else if ( pane['update_method'] == 'append' ) {
text_div.append(txt);
var scrollHeight = text_div.parent().prop("scrollHeight");
text_div.parent().animate({ scrollTop: scrollHeight }, 0);
} else { // line feed
text_div.append("<div class='out'>" + txt + "</div>");
var scrollHeight = text_div.parent().prop("scrollHeight");
text_div.parent().animate({ scrollTop: scrollHeight }, 0);
}
} }
@ -316,53 +316,76 @@ let splithandler_plugin = (function () {
// //
// Accept plugin onText events // Accept plugin onText events
var onText = function (args, kwargs) { var onText = function (args, kwargs) {
// If the message is not itself tagged, we'll assume it
// If the message is not itself tagged, we'll assume it // should go into any panes with 'all' or 'rest' set
// should go into any panes with 'all' or 'rest' set
var msgtype = "rest"; var msgtype = "rest";
if ( kwargs && 'type' in kwargs ) { if ( kwargs && 'type' in kwargs ) {
msgtype = kwargs['type']; msgtype = kwargs['type'];
if ( ! known_types.includes(msgtype) ) { if ( ! known_types.includes(msgtype) ) {
// this is a new output type that can be mapped to panes // this is a new output type that can be mapped to panes
console.log('detected new output type: ' + msgtype) console.log('detected new output type: ' + msgtype)
known_types.push(msgtype); known_types.push(msgtype);
} }
} }
var target_panes = []; var target_panes = [];
var rest_panes = []; var rest_panes = [];
for (var key in split_panes) {
var pane = split_panes[key];
// is this message type mapped to this pane (or does the pane has an 'all' type)?
if (pane['types'].length > 0) {
if (pane['types'].includes(msgtype) || pane['types'].includes('all')) {
target_panes.push(key);
} else if (pane['types'].includes('rest')) {
// store rest-panes in case we have no explicit to send to
rest_panes.push(key);
}
} else {
// unassigned panes are assumed to be rest-panes too
rest_panes.push(key);
}
}
var ntargets = target_panes.length;
var nrests = rest_panes.length;
if (ntargets > 0) {
// we have explicit target panes to send to
for (var i=0; i<ntargets; i++) {
txtToPane(target_panes[i], args[0]);
}
return true;
} else if (nrests > 0) {
// no targets, send remainder to rest-panes/unassigned
for (var i=0; i<nrests; i++) {
txtToPane(rest_panes[i], args[0]);
}
return true;
}
// unhandled message
return false;
}
//
// onKeydown check for 'ESC' key.
var onKeydown = function (event) {
var code = event.which;
if (code === 27) { // Escape key
if ($('#splitdialog').is(':visible')) {
plugins['popups'].closePopup("#splitdialog");
return true;
}
if ($('#panedialog').is(':visible')) {
plugins['popups'].closePopup("#panedialog");
return true;
}
}
// capture all keys while one of our "modal" dialogs is open
if ($('#splitdialogcontent').is(':visible') || $('#panedialogcontent').is(':visible')) {
return true;
}
for (var key in split_panes) {
var pane = split_panes[key];
// is this message type mapped to this pane (or does the pane has an 'all' type)?
if (pane['types'].length > 0) {
if (pane['types'].includes(msgtype) || pane['types'].includes('all')) {
target_panes.push(key);
} else if (pane['types'].includes('rest')) {
// store rest-panes in case we have no explicit to send to
rest_panes.push(key);
}
} else {
// unassigned panes are assumed to be rest-panes too
rest_panes.push(key);
}
}
var ntargets = target_panes.length;
var nrests = rest_panes.length;
if (ntargets > 0) {
// we have explicit target panes to send to
for (var i=0; i<ntargets; i++) {
txtToPane(target_panes[i], args[0]);
}
return true;
} else if (nrests > 0) {
// no targets, send remainder to rest-panes/unassigned
for (var i=0; i<nrests; i++) {
txtToPane(rest_panes[i], args[0]);
}
return true;
}
// unhandled message
return false; return false;
} }
@ -409,6 +432,7 @@ let splithandler_plugin = (function () {
dynamic_split: dynamic_split, dynamic_split: dynamic_split,
undo_split: undo_split, undo_split: undo_split,
set_pane_types: set_pane_types, set_pane_types: set_pane_types,
onKeydown: onKeydown,
} }
})() })()
plugin_handler.add('splithandler', splithandler_plugin); plugin_handler.add('splithandler', splithandler_plugin);

View file

@ -73,10 +73,10 @@ JQuery available.
<script src={% static "webclient/js/plugins/popups.js" %} language="javascript" type="text/javascript"></script> <script src={% static "webclient/js/plugins/popups.js" %} language="javascript" type="text/javascript"></script>
<script src={% static "webclient/js/plugins/options.js" %} language="javascript" type="text/javascript"></script> <script src={% static "webclient/js/plugins/options.js" %} language="javascript" type="text/javascript"></script>
<script src={% static "webclient/js/plugins/history.js" %} language="javascript" type="text/javascript"></script> <script src={% static "webclient/js/plugins/history.js" %} language="javascript" type="text/javascript"></script>
<script src={% static "webclient/js/plugins/splithandler.js" %} language="javascript" type="text/javascript"></script>
<script src={% static "webclient/js/plugins/default_in.js" %} language="javascript" type="text/javascript"></script> <script src={% static "webclient/js/plugins/default_in.js" %} language="javascript" type="text/javascript"></script>
<script src={% static "webclient/js/plugins/oob.js" %} language="javascript" type="text/javascript"></script> <script src={% static "webclient/js/plugins/oob.js" %} language="javascript" type="text/javascript"></script>
<script src={% static "webclient/js/plugins/notifications.js" %} language="javascript" type="text/javascript"></script> <script src={% static "webclient/js/plugins/notifications.js" %} language="javascript" type="text/javascript"></script>
<script src={% static "webclient/js/plugins/splithandler.js" %} language="javascript" type="text/javascript"></script>
<script src={% static "webclient/js/plugins/default_out.js" %} language="javascript" type="text/javascript"></script> <script src={% static "webclient/js/plugins/default_out.js" %} language="javascript" type="text/javascript"></script>
{% endblock %} {% endblock %}