diff --git a/.github/workflows/github_action_build_docs.yml b/.github/workflows/github_action_build_docs.yml index 1dec645a18..e3bbb77e9a 100644 --- a/.github/workflows/github_action_build_docs.yml +++ b/.github/workflows/github_action_build_docs.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: - python-version: [3.10] + python-version: ['3.10'] steps: - name: Checkout 0.9.5 branch diff --git a/.github/workflows/github_action_test_suite.yml b/.github/workflows/github_action_test_suite.yml index 83fb7616b9..a11b2a0f63 100644 --- a/.github/workflows/github_action_test_suite.yml +++ b/.github/workflows/github_action_test_suite.yml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.9", "3.10"] + python-version: ['3.9', '3.10'] TESTING_DB: ['sqlite3', 'postgresql', 'mysql'] steps: @@ -94,7 +94,7 @@ jobs: # it's also not critical if pushing to either service fails (happens for PRs since env is not # available outside of the evennia org) - name: Send data to Coveralls - if: ${{ matrix.TESTING_DB == 'sqlite3' && matrix.python-version == "3.10" }} + if: ${{ matrix.TESTING_DB == 'sqlite3' && matrix.python-version == '3.10' }} continue-on-error: true env: COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} @@ -103,7 +103,7 @@ jobs: coveralls - name: Send data to Codacy - if: ${{ matrix.TESTING_DB == 'sqlite3' && matrix.python-version == "3.10" }} + if: ${{ matrix.TESTING_DB == 'sqlite3' && matrix.python-version == '3.10' }} continue-on-error: true uses: codacy/codacy-coverage-reporter-action@master with: @@ -113,22 +113,22 @@ jobs: # docker setup and push - name: Set up QEMU - if: matrix.TESTING_DB == 'sqlite3' && matrix.python-version == "3.10" + if: matrix.TESTING_DB == 'sqlite3' && matrix.python-version == '3.10' uses: docker/setup-qemu-action@v1 - name: Set up Docker Buildx - if: matrix.TESTING_DB == 'sqlite3' && matrix.python-version == "3.10" + if: matrix.TESTING_DB == 'sqlite3' && matrix.python-version == '3.10' uses: docker/setup-buildx-action@v1 - name: Login to DockerHub - if: matrix.TESTING_DB == 'sqlite3' && matrix.python-version == "3.10" && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') + if: matrix.TESTING_DB == 'sqlite3' && matrix.python-version == '3.10' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') uses: docker/login-action@v1 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push for master - if: matrix.TESTING_DB == 'sqlite3' && matrix.python-version == "3.10" && github.ref == 'refs/heads/master' + if: matrix.TESTING_DB == 'sqlite3' && matrix.python-version == '3.10' && github.ref == 'refs/heads/master' id: docker_build_master uses: docker/build-push-action@v2 with: @@ -136,7 +136,7 @@ jobs: tags: evennia/evennia:latest - name: Build and push for develop - if: matrix.TESTING_DB == 'sqlite3' && matrix.python-version == "3.10" && github.ref == 'refs/heads/develop' + if: matrix.TESTING_DB == 'sqlite3' && matrix.python-version == '3.10' && github.ref == 'refs/heads/develop' id: docker_build_develop uses: docker/build-push-action@v2 with: diff --git a/docs/Makefile b/docs/Makefile index 748dd61c9e..92780c2e48 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -3,6 +3,7 @@ SOURCEDIR = source BUILDDIR = build AUTODOCDIR = $(SOURCEDIR)/api + # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= diff --git a/evennia/commands/default/building.py b/evennia/commands/default/building.py index 1a32d63efa..6372c469e0 100644 --- a/evennia/commands/default/building.py +++ b/evennia/commands/default/building.py @@ -2572,15 +2572,16 @@ class CmdExamine(ObjManipCommand): if value: return f"{string}: T" return f"{string}: F" - return ", ".join( + txt = ", ".join( _truefalse(opt, getattr(cmdset, opt)) for opt in ("no_exits", "no_objs", "no_channels", "duplicates") if getattr(cmdset, opt) is not None ) + return ", " + txt if txt else "" def format_single_cmdset(self, cmdset): options = self.format_single_cmdset_options(cmdset) - return f"{cmdset.path} [{cmdset.key}] ({cmdset.mergetype}, prio {cmdset.priority}{options}" + return f"{cmdset.path} [{cmdset.key}] ({cmdset.mergetype}, prio {cmdset.priority}{options})" def format_stored_cmdsets(self, obj): if hasattr(obj, "cmdset"): diff --git a/evennia/contrib/tutorials/tutorial_world/build.ev b/evennia/contrib/tutorials/tutorial_world/build.ev index 6875f421ca..f66d531b63 100644 --- a/evennia/contrib/tutorials/tutorial_world/build.ev +++ b/evennia/contrib/tutorials/tutorial_world/build.ev @@ -89,13 +89,14 @@ # Open an exit to tutorial. We don't do this in the @dig # command since we want to describe the exit. # -@open tutorial;tut;intro = tut#01 +@open tutorial;tut : tutorial_world.rooms.TutorialStartExit = tut#01 # # describe the tutorial exit # @desc tutorial = - This starts the |gEvennia tutorial|n, using a small solo game to show off - some of the server's possibilities. + This exit leads to the |gEvennia tutorial|n, a small solo game to examine. + Before going there, you may want to enter |wintro|n to get some general help + on using the default commands. # # now we actually go to the tutorial # @@ -108,9 +109,6 @@ tutorial This small quest shows some examples of Evennia usage. - |gDo you want help with how to play? Write |yintro|g to get an introduction to - Evennia and the basics of playing!|n - To get into the mood of this miniature quest, imagine you are an adventurer out to find fame and fortune. You have heard rumours of an old castle ruin by the coast. In its depth a warrior princess was buried together with her @@ -121,12 +119,8 @@ tutorial screaming in your face you stand where the moor meet the sea along a high, rocky coast ... -Try '|yintro|n' for usage help. During the quest, write '|ytutorial|n' to get -behind-the-scenes help anywhere, and '|ygive up|n' to abandon the quest. - |gwrite 'begin' to start your quest!|n - # # Show that the tutorial command works ... # diff --git a/evennia/contrib/tutorials/tutorial_world/intro_menu.py b/evennia/contrib/tutorials/tutorial_world/intro_menu.py index 1be58ea31d..445df03640 100644 --- a/evennia/contrib/tutorials/tutorial_world/intro_menu.py +++ b/evennia/contrib/tutorials/tutorial_world/intro_menu.py @@ -57,6 +57,7 @@ class DemoCommandSetHelp(CmdSet): from evennia import default_cmds self.add(default_cmds.CmdHelp()) + self.add(default_cmds.CmdChannel()) def goto_command_demo_help(caller, raw_string, **kwargs): @@ -124,11 +125,11 @@ The small sign reads: of their name (like '|ylook cozy|n') or use the number in the list to pick the one you want, like this: - |ylook 2-small|n + |ylook small-2|n As long as what you write is uniquely identifying you can be lazy and not write the full name of the thing you want to look at. Try '|ylook bo|n', - '|yl co|n' or '|yl 1-sm|n'! + '|yl co|n' or '|yl sm-1|n'! ... Oh, and if you see database-ids like (#1245) by the name of objects, it's because you are playing with Builder-privileges or higher. Regular @@ -357,7 +358,7 @@ graphical game is like comparing a book to a movie - it's just a different experience altogether. MUDs are |wdifferent|n from Interactive Fiction (IF) in that they are multiplayer -and usually has a consistent game world with many stories and protagonists +and usually have a consistent game world with many stories and protagonists acting at the same time. Like there are many different styles of graphical MMOs, there are |wmany @@ -499,8 +500,8 @@ Use |yhelp |n to get specific help. Try |yhelp help|n to get help on usin the help command. For your game you could add help about your game, lore, rules etc as well. -At the moment you only have |whelp|n and some |wChannel Names|n (the '' -is just a placeholder to indicate you are using this menu). +At the moment you probably only have |whelp|n and a |wchannel|n command +(the '' is just a placeholder to indicate you are using this menu). We'll add more commands as we get to them in this tutorial - but we'll only cover a small handful. Once you exit you'll find a lot more! Now let's try @@ -529,9 +530,7 @@ This will send a message to the |wpublic|n channel where everyone on that channel can see it. If someone else is on your server, you may get a reply! Evennia can link its in-game channels to external chat networks. This allows -you to talk with people not actually logged into the game. For -example, the online Evennia-demo links its |wpublic|n channel to the #evennia -IRC support channel. +you to talk with people not actually logged into the game. ## OPTIONS @@ -578,19 +577,13 @@ include other people/objects in the emote, reference things by a short-descripti |g** Paging people **|n Halfway between talking on a |wChannel|n and chatting in your current location -with |wsay|n and |wpose|n, you can also |wpage|n people. This is like a private -message only they can see. +with |wsay|n and |wpose|n, you can also send private messages with |wpage|n: - |ypage = Hello there! - page , = Hello both of you!|n + |ypage Hello there!|n -If you are alone on the server, put your own name as |w|n to test it and -page yourself. Write just |ypage|n to see your latest pages. This will also show -you if anyone paged you while you were offline. - -(By the way - depending on which games you are used to, you may think that the -use of |y=|n above is strange. This is a MUSH/MUX-style of syntax. For your own -game you can change the |wpose|n command to work however you prefer). +Put your own name as |y|n to page yourself as a test. Write just |ypage|n +to see your latest pages. This will also show you if anyone paged you while you +were offline. ## OPTIONS @@ -675,8 +668,8 @@ That concludes this little quick-intro to using the base game commands of Evennia. With this you should be able to continue exploring and also find help if you get stuck! -Write |ynext|n to end this wizard and continue to the tutorial-world quest! -If you want there is also some |wextra|n info for where to go beyond that. +Write |ynext|n to end this wizard. If you want there is also some |wextra|n info +for where to go beyond that. ## OPTIONS @@ -704,12 +697,12 @@ Evennia you are wise to take a look at the |wEvennia documentation|n at - The tutorial-world may or may not be your cup of tea, but it does show off several |wuseful tools|n of Evennia. You may want to check out how it works: - |yhttps://www.evennia.com/docs/latest/Tutorial-World-Introduction|n + |yhttps://www.evennia.com/docs/latest/Howto/Starting/Part1/Tutorial-World|n - You can then continue looking through the |wTutorials|n and pick one that fits your level of understanding. - |yhttps://www.evennia.com/docs/latest/Tutorials|n + |yhttps://www.evennia.com/docs/latest/Howto/Howto-Overview|n - Make sure to |wjoin our forum|n and connect to our |wsupport chat|n! The Evennia community is very active and friendly and no question is too simple. @@ -751,6 +744,9 @@ class TutorialEvMenu(EvMenu): self.caller.cmdset.remove(DemoCommandSetComms) _maintain_demo_room(self.caller, delete=True) super().close_menu() + if self.caller.account: + self.caller.msg("Restoring permissions ...") + self.caller.account.execute_cmd("unquell") def options_formatter(self, optionslist): diff --git a/evennia/contrib/tutorials/tutorial_world/rooms.py b/evennia/contrib/tutorials/tutorial_world/rooms.py index aa6d61912c..50c9bacb3f 100644 --- a/evennia/contrib/tutorials/tutorial_world/rooms.py +++ b/evennia/contrib/tutorials/tutorial_world/rooms.py @@ -12,7 +12,7 @@ in a separate module (e.g. if they could have been re-used elsewhere.) import random from evennia import TICKER_HANDLER -from evennia import CmdSet, Command, DefaultRoom +from evennia import CmdSet, Command, DefaultRoom, DefaultExit from evennia import utils, create_object, search_object from evennia import syscmdkeys, default_cmds from .objects import LightSource @@ -304,6 +304,18 @@ class TutorialRoom(DefaultRoom): self.db.details = {detailkey.lower(): description} +class TutorialStartExit(DefaultExit): + """ + This is like a normal exit except it makes the `intro` command available + on itself. We put it on the exit in order to provide this command to the + Limbo room without modifying Limbo itself - deleting the tutorial exit + will also clean up the intro command. + + """ + def at_object_creation(self): + self.cmdset.add(CmdSetEvenniaIntro, persistent=True) + + # ------------------------------------------------------------- # # Weather room - room with a ticker @@ -399,8 +411,8 @@ class CmdEvenniaIntro(Command): from .intro_menu import init_menu # quell also superusers if self.caller.account: + self.caller.msg("Auto-quelling permissions while in intro ...") self.caller.account.execute_cmd("quell") - self.caller.msg("(Auto-quelling)") init_menu(self.caller) @@ -429,7 +441,6 @@ class IntroRoom(TutorialRoom): "This assigns the health Attribute to " "the account." ) - self.cmdset.add(CmdSetEvenniaIntro, persistent=True) def at_object_receive(self, character, source_location): """ diff --git a/evennia/server/initial_setup.py b/evennia/server/initial_setup.py index 0d0b18a70e..26fdb3b7fb 100644 --- a/evennia/server/initial_setup.py +++ b/evennia/server/initial_setup.py @@ -28,7 +28,10 @@ ERROR_NO_SUPERUSER = """ LIMBO_DESC = _(""" Welcome to your new |wEvennia|n-based game! Visit https://www.evennia.com if you need help, want to contribute, report issues or just join the community. -As Account #1 you can create a demo/tutorial area with '|wbatchcommand tutorial_world.build|n'. + +As a privileged user, write |wbatchcommand tutorial_world.build|n to build +tutorial content. Once built, try |wintro|n for starting help and |wtutorial|n to +play the demo game. """) diff --git a/evennia/settings_default.py b/evennia/settings_default.py index 163f67ec2d..914d5c0704 100644 --- a/evennia/settings_default.py +++ b/evennia/settings_default.py @@ -485,8 +485,9 @@ COMMAND_DEFAULT_CLASS = "evennia.commands.default.muxcommand.MuxCommand" # Command.arg_regex is a regular expression desribing how the arguments # to the command must be structured for the command to match a given user # input. By default the command-name should end with a space or / (since the -# default commands uses MuxCommand and /switches). -COMMAND_DEFAULT_ARG_REGEX = r'^[ /]+.*$|$' +# default commands uses MuxCommand and /switches). Note that the extra \n +# is necessary for use with batchprocessor. +COMMAND_DEFAULT_ARG_REGEX = r'^[ /]|\n|$' # By default, Command.msg will only send data to the Session calling # the Command in the first place. If set, Command.msg will instead return # data to all Sessions connected to the Account/Character associated with