evennia/docs/2.x/html/_modules/evennia/commands/default/batchprocess.html
2023-12-20 18:06:19 +01:00

934 lines
No EOL
90 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.commands.default.batchprocess &#8212; Evennia 2.x documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/underscore.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
</head><body>
<div class="admonition important">
<p class="first admonition-title">Note</p>
<p class="last">You are reading an old version of the Evennia documentation. <a href="https://www.evennia.com/docs/latest/index.html">The latest version is here</a></p>.
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 2.x</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.batchprocess</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li>
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
<a href="https://evennia.blogspot.com/">Blog</a>
</li>
</ul>
</div>
</div>
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.commands.default.batchprocess</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Batch processors</span>
<span class="sd">These commands implements the &#39;batch-command&#39; and &#39;batch-code&#39;</span>
<span class="sd">processors, using the functionality in evennia.utils.batchprocessors.</span>
<span class="sd">They allow for offline world-building.</span>
<span class="sd">Batch-command is the simpler system. This reads a file (*.ev)</span>
<span class="sd">containing a list of in-game commands and executes them in sequence as</span>
<span class="sd">if they had been entered in the game (including permission checks</span>
<span class="sd">etc).</span>
<span class="sd">Batch-code is a full-fledged python code interpreter that reads blocks</span>
<span class="sd">of python code (*.py) and executes them in sequence. This allows for</span>
<span class="sd">much more power than Batch-command, but requires knowing Python and</span>
<span class="sd">the Evennia API. It is also a severe security risk and should</span>
<span class="sd">therefore always be limited to superusers only.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">evennia.commands.cmdset</span> <span class="kn">import</span> <span class="n">CmdSet</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">logger</span><span class="p">,</span> <span class="n">utils</span>
<span class="kn">from</span> <span class="nn">evennia.utils.batchprocessors</span> <span class="kn">import</span> <span class="n">BATCHCMD</span><span class="p">,</span> <span class="n">BATCHCODE</span>
<span class="n">_RE_COMMENT</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;^#.*?$&quot;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span> <span class="o">+</span> <span class="n">re</span><span class="o">.</span><span class="n">DOTALL</span><span class="p">)</span>
<span class="n">_RE_CODE_START</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;^# batchcode code:&quot;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
<span class="n">_COMMAND_DEFAULT_CLASS</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">class_from_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">)</span>
<span class="c1"># limit symbols for API inclusion</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;CmdBatchCommands&quot;</span><span class="p">,</span> <span class="s2">&quot;CmdBatchCode&quot;</span><span class="p">)</span>
<span class="n">_HEADER_WIDTH</span> <span class="o">=</span> <span class="mi">70</span>
<span class="n">_UTF8_ERROR</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2"> |rDecode error in &#39;</span><span class="si">%s</span><span class="s2">&#39;.|n</span>
<span class="s2"> This file contains non-ascii character(s). This is common if you</span>
<span class="s2"> wrote some input in a language that has more letters and special</span>
<span class="s2"> symbols than English; such as accents or umlauts. This is usually</span>
<span class="s2"> fine and fully supported! But for Evennia to know how to decode such</span>
<span class="s2"> characters in a universal way, the batchfile must be saved with the</span>
<span class="s2"> international &#39;UTF-8&#39; encoding. This file is not.</span>
<span class="s2"> Please re-save the batchfile with the UTF-8 encoding (refer to the</span>
<span class="s2"> documentation of your text editor on how to do this, or switch to a</span>
<span class="s2"> better featured one) and try again.</span>
<span class="s2"> Error reported was: &#39;</span><span class="si">%s</span><span class="s2">&#39;</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="c1"># -------------------------------------------------------------</span>
<span class="c1"># Helper functions</span>
<span class="c1"># -------------------------------------------------------------</span>
<span class="k">def</span> <span class="nf">format_header</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">entry</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Formats a header</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">width</span> <span class="o">=</span> <span class="n">_HEADER_WIDTH</span> <span class="o">-</span> <span class="mi">10</span>
<span class="c1"># strip all comments for the header</span>
<span class="k">if</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_batchmode</span> <span class="o">!=</span> <span class="s2">&quot;batch_commands&quot;</span><span class="p">:</span>
<span class="c1"># only do cleanup for batchcode</span>
<span class="n">entry</span> <span class="o">=</span> <span class="n">_RE_CODE_START</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">entry</span> <span class="o">=</span> <span class="n">_RE_COMMENT</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">entry</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="n">header</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">crop</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="n">width</span><span class="p">)</span>
<span class="n">ptr</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">stacklen</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stack</span><span class="p">)</span>
<span class="n">header</span> <span class="o">=</span> <span class="s2">&quot;|w</span><span class="si">%02i</span><span class="s2">/</span><span class="si">%02i</span><span class="s2">|G: </span><span class="si">%s</span><span class="s2">|n&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ptr</span><span class="p">,</span> <span class="n">stacklen</span><span class="p">,</span> <span class="n">header</span><span class="p">)</span>
<span class="c1"># add extra space to the side for padding.</span>
<span class="n">header</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="p">(</span><span class="n">width</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">header</span><span class="p">)))</span>
<span class="n">header</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">n&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">header</span>
<span class="k">def</span> <span class="nf">format_code</span><span class="p">(</span><span class="n">entry</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Formats the viewing of code and errors</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">code</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">entry</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">):</span>
<span class="n">code</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|G&gt;&gt;&gt;|n </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">line</span>
<span class="k">return</span> <span class="n">code</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">batch_cmd_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function for executing a single batch-command entry</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">ptr</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span>
<span class="n">stack</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stack</span>
<span class="n">command</span> <span class="o">=</span> <span class="n">stack</span><span class="p">[</span><span class="n">ptr</span><span class="p">]</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">format_header</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">command</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">()</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">batch_code_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function for executing a single batch-code entry</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">ptr</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span>
<span class="n">stack</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stack</span>
<span class="n">debug</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_debug</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">stack</span><span class="p">[</span><span class="n">ptr</span><span class="p">]</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">format_header</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">code</span><span class="p">))</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">BATCHCODE</span><span class="o">.</span><span class="n">code_exec</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">extra_environ</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;caller&quot;</span><span class="p">:</span> <span class="n">caller</span><span class="p">},</span> <span class="n">debug</span><span class="o">=</span><span class="n">debug</span><span class="p">)</span>
<span class="k">if</span> <span class="n">err</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">format_code</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Step in stack, returning the item located.</span>
<span class="sd"> stackptr - current position in stack</span>
<span class="sd"> stack - the stack of units</span>
<span class="sd"> step - how many steps to move from stackptr</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">ptr</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span>
<span class="n">stack</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stack</span>
<span class="n">nstack</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">stack</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ptr</span> <span class="o">+</span> <span class="n">step</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|RBeginning of batch file.&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ptr</span> <span class="o">+</span> <span class="n">step</span> <span class="o">&gt;=</span> <span class="n">nstack</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|REnd of batch file.&quot;</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">min</span><span class="p">(</span><span class="n">nstack</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">ptr</span> <span class="o">+</span> <span class="n">step</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">showall</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Show the current position in stack</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">stackptr</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span>
<span class="n">stack</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stack</span>
<span class="k">if</span> <span class="n">stackptr</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">stack</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">showall</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">entry</span> <span class="o">=</span> <span class="n">stack</span><span class="p">[</span><span class="n">stackptr</span><span class="p">]</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">format_header</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">entry</span><span class="p">)</span>
<span class="n">codeall</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;|G(hh for help)&quot;</span>
<span class="k">if</span> <span class="n">showall</span><span class="p">:</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">codeall</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">):</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|G||n </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">line</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This purges all effects running</span>
<span class="sd"> on the caller.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">del</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stack</span>
<span class="k">del</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span>
<span class="k">del</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_pythonpath</span>
<span class="k">del</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_batchmode</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="c1"># something might have already been erased; it&#39;s not critical</span>
<span class="k">pass</span>
<span class="c1"># clear everything back to the state before the batch call</span>
<span class="k">if</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_cmdset_backup</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">cmdset_stack</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_cmdset_backup</span>
<span class="n">caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">del</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_cmdset_backup</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># something went wrong. Purge cmdset except default</span>
<span class="n">caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="c1"># caller.scripts.validate() # this will purge interactive mode</span>
<span class="c1"># -------------------------------------------------------------</span>
<span class="c1"># main access commands</span>
<span class="c1"># -------------------------------------------------------------</span>
<div class="viewcode-block" id="CmdBatchCommands"><a class="viewcode-back" href="../../../../api/evennia.commands.default.batchprocess.html#evennia.commands.default.batchprocess.CmdBatchCommands">[docs]</a><span class="k">class</span> <span class="nc">CmdBatchCommands</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> build from batch-command file</span>
<span class="sd"> Usage:</span>
<span class="sd"> batchcommands[/interactive] &lt;python.path.to.file&gt;</span>
<span class="sd"> Switch:</span>
<span class="sd"> interactive - this mode will offer more control when</span>
<span class="sd"> executing the batch file, like stepping,</span>
<span class="sd"> skipping, reloading etc.</span>
<span class="sd"> Runs batches of commands from a batch-cmd text file (*.ev).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;batchcommands&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;batchcommand&quot;</span><span class="p">,</span> <span class="s2">&quot;batchcmd&quot;</span><span class="p">]</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;interactive&quot;</span><span class="p">,)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands) or perm(Developer)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdBatchCommands.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.batchprocess.html#evennia.commands.default.batchprocess.CmdBatchCommands.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Starts the processor.&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">args</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: batchcommands[/interactive] &lt;path.to.file&gt;&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">python_path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="c1"># parse indata file</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">commands</span> <span class="o">=</span> <span class="n">BATCHCMD</span><span class="o">.</span><span class="n">parse_file</span><span class="p">(</span><span class="n">python_path</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">UnicodeDecodeError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_UTF8_ERROR</span> <span class="o">%</span> <span class="p">(</span><span class="n">python_path</span><span class="p">,</span> <span class="n">err</span><span class="p">))</span>
<span class="k">return</span>
<span class="k">except</span> <span class="ne">IOError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="k">if</span> <span class="n">err</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="n">string</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&#39;</span><span class="si">%s</span><span class="s2">&#39; could not load. You have to supply python paths &quot;</span>
<span class="s2">&quot;from one of the defined batch-file directories</span><span class="se">\n</span><span class="s2"> (</span><span class="si">%s</span><span class="s2">).&quot;</span>
<span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span> <span class="o">%</span> <span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">python_path</span><span class="p">,</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">BASE_BATCHPROCESS_PATHS</span><span class="p">)))</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">commands</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;File </span><span class="si">{</span><span class="n">python_path</span><span class="si">}</span><span class="s2"> seems empty of valid commands.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">switches</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="c1"># Store work data in cache</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stack</span> <span class="o">=</span> <span class="n">commands</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_pythonpath</span> <span class="o">=</span> <span class="n">python_path</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_batchmode</span> <span class="o">=</span> <span class="s2">&quot;batch_commands&quot;</span>
<span class="c1"># we use list() here to create a new copy of the cmdset stack</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_cmdset_backup</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">cmdset_stack</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">BatchSafeCmdSet</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;inter&quot;</span> <span class="ow">in</span> <span class="n">switches</span> <span class="ow">or</span> <span class="s2">&quot;interactive&quot;</span> <span class="ow">in</span> <span class="n">switches</span><span class="p">:</span>
<span class="c1"># Allow more control over how batch file is executed</span>
<span class="c1"># Set interactive state directly</span>
<span class="n">caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">BatchInteractiveCmdSet</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Batch-command processor - Interactive mode for </span><span class="si">{</span><span class="n">python_path</span><span class="si">}</span><span class="s2"> ...&quot;</span><span class="p">)</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Running Batch-command processor - Automatic mode &quot;</span>
<span class="sa">f</span><span class="s2">&quot;for </span><span class="si">{</span><span class="n">python_path</span><span class="si">}</span><span class="s2"> (this might take some time) ...&quot;</span>
<span class="p">)</span>
<span class="c1"># run in-process (might block)</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">commands</span><span class="p">)):</span>
<span class="c1"># loop through the batch file</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">batch_cmd_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># clean out the safety cmdset and clean out all other</span>
<span class="c1"># temporary attrs.</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;|G Batchfile &#39;</span><span class="si">{</span><span class="n">python_path</span><span class="si">}</span><span class="s2">&#39; applied.&quot;</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdBatchCode"><a class="viewcode-back" href="../../../../api/evennia.commands.default.batchprocess.html#evennia.commands.default.batchprocess.CmdBatchCode">[docs]</a><span class="k">class</span> <span class="nc">CmdBatchCode</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> build from batch-code file</span>
<span class="sd"> Usage:</span>
<span class="sd"> batchcode[/interactive] &lt;python path to file&gt;</span>
<span class="sd"> Switch:</span>
<span class="sd"> interactive - this mode will offer more control when</span>
<span class="sd"> executing the batch file, like stepping,</span>
<span class="sd"> skipping, reloading etc.</span>
<span class="sd"> debug - auto-delete all objects that has been marked as</span>
<span class="sd"> deletable in the script file (see example files for</span>
<span class="sd"> syntax). This is useful so as to to not leave multiple</span>
<span class="sd"> object copies behind when testing out the script.</span>
<span class="sd"> Runs batches of commands from a batch-code text file (*.py).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;batchcode&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;batchcodes&quot;</span><span class="p">]</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;interactive&quot;</span><span class="p">,</span> <span class="s2">&quot;debug&quot;</span><span class="p">)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:superuser()&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdBatchCode.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.batchprocess.html#evennia.commands.default.batchprocess.CmdBatchCode.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Starts the processor.&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">args</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: batchcode[/interactive/debug] &lt;path.to.file&gt;&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">python_path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="n">debug</span> <span class="o">=</span> <span class="s2">&quot;debug&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="c1"># parse indata file</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">codes</span> <span class="o">=</span> <span class="n">BATCHCODE</span><span class="o">.</span><span class="n">parse_file</span><span class="p">(</span><span class="n">python_path</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">UnicodeDecodeError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_UTF8_ERROR</span> <span class="o">%</span> <span class="p">(</span><span class="n">python_path</span><span class="p">,</span> <span class="n">err</span><span class="p">))</span>
<span class="k">return</span>
<span class="k">except</span> <span class="ne">IOError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="k">if</span> <span class="n">err</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">err</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="n">string</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&#39;</span><span class="si">%s</span><span class="s2">&#39; could not load. You have to supply python paths &quot;</span>
<span class="s2">&quot;from one of the defined batch-file directories</span><span class="se">\n</span><span class="s2"> (</span><span class="si">%s</span><span class="s2">).&quot;</span>
<span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span> <span class="o">%</span> <span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">python_path</span><span class="p">,</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">BASE_BATCHPROCESS_PATHS</span><span class="p">)))</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">codes</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;File </span><span class="si">{</span><span class="n">python_path</span><span class="si">}</span><span class="s2"> seems empty of functional code.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">switches</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="c1"># Store work data in cache</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stack</span> <span class="o">=</span> <span class="n">codes</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_pythonpath</span> <span class="o">=</span> <span class="n">python_path</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_batchmode</span> <span class="o">=</span> <span class="s2">&quot;batch_code&quot;</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_debug</span> <span class="o">=</span> <span class="n">debug</span>
<span class="c1"># we use list() here to create a new copy of cmdset_stack</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_cmdset_backup</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">cmdset_stack</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">BatchSafeCmdSet</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;inter&quot;</span> <span class="ow">in</span> <span class="n">switches</span> <span class="ow">or</span> <span class="s2">&quot;interactive&quot;</span> <span class="ow">in</span> <span class="n">switches</span><span class="p">:</span>
<span class="c1"># Allow more control over how batch file is executed</span>
<span class="c1"># Set interactive state directly</span>
<span class="n">caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">BatchInteractiveCmdSet</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Batch-code processor - Interactive mode for </span><span class="si">{</span><span class="n">python_path</span><span class="si">}</span><span class="s2"> ...&quot;</span><span class="p">)</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Running Batch-code processor - Automatic mode for </span><span class="si">{</span><span class="n">python_path</span><span class="si">}</span><span class="s2"> ...&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">codes</span><span class="p">)):</span>
<span class="c1"># loop through the batch file</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">batch_code_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># clean out the safety cmdset and clean out all other</span>
<span class="c1"># temporary attrs.</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;|G Batchfile &#39;</span><span class="si">{</span><span class="n">python_path</span><span class="si">}</span><span class="s2">&#39; applied.&quot;</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<span class="c1"># -------------------------------------------------------------</span>
<span class="c1"># State-commands for the interactive batch processor modes</span>
<span class="c1"># (these are the same for both processors)</span>
<span class="c1"># -------------------------------------------------------------</span>
<span class="k">class</span> <span class="nc">CmdStateAbort</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> abort</span>
<span class="sd"> This is a safety feature. It force-ejects us out of the processor and to</span>
<span class="sd"> the default cmdset, regardless of what current cmdset the processor might</span>
<span class="sd"> have put us in (e.g. when testing buggy scripts etc).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;abort&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Exit back to default.&quot;&quot;&quot;</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Exited processor and reset out active cmdset back to the default one.&quot;</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStateLL</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> ll</span>
<span class="sd"> Look at the full source for the current</span>
<span class="sd"> command definition.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;ll&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">show_curr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="n">showall</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStatePP</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> pp</span>
<span class="sd"> Process the currently shown command definition.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;pp&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This checks which type of processor we are running.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_batchmode</span> <span class="o">==</span> <span class="s2">&quot;batch_code&quot;</span><span class="p">:</span>
<span class="n">batch_code_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">batch_cmd_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStateRR</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> rr</span>
<span class="sd"> Reload the batch file, keeping the current</span>
<span class="sd"> position in it.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;rr&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_batchmode</span> <span class="o">==</span> <span class="s2">&quot;batch_code&quot;</span><span class="p">:</span>
<span class="n">new_data</span> <span class="o">=</span> <span class="n">BATCHCODE</span><span class="o">.</span><span class="n">parse_file</span><span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_pythonpath</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">new_data</span> <span class="o">=</span> <span class="n">BATCHCMD</span><span class="o">.</span><span class="n">parse_file</span><span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_pythonpath</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stack</span> <span class="o">=</span> <span class="n">new_data</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">format_code</span><span class="p">(</span><span class="s2">&quot;File reloaded. Staying on same command.&quot;</span><span class="p">))</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStateRRR</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> rrr</span>
<span class="sd"> Reload the batch file, starting over</span>
<span class="sd"> from the beginning.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;rrr&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_batchmode</span> <span class="o">==</span> <span class="s2">&quot;batch_code&quot;</span><span class="p">:</span>
<span class="n">BATCHCODE</span><span class="o">.</span><span class="n">parse_file</span><span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_pythonpath</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">BATCHCMD</span><span class="o">.</span><span class="n">parse_file</span><span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_pythonpath</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">format_code</span><span class="p">(</span><span class="s2">&quot;File reloaded. Restarting from top.&quot;</span><span class="p">))</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStateNN</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> nn</span>
<span class="sd"> Go to next command. No commands are executed.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;nn&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="n">arg</span> <span class="ow">and</span> <span class="n">arg</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
<span class="n">step</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">step</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">step</span><span class="p">)</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStateNL</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> nl</span>
<span class="sd"> Go to next command, viewing its full source.</span>
<span class="sd"> No commands are executed.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;nl&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="n">arg</span> <span class="ow">and</span> <span class="n">arg</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
<span class="n">step</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">step</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">step</span><span class="p">)</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">showall</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStateBB</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> bb</span>
<span class="sd"> Backwards to previous command. No commands</span>
<span class="sd"> are executed.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;bb&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="n">arg</span> <span class="ow">and</span> <span class="n">arg</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
<span class="n">step</span> <span class="o">=</span> <span class="o">-</span><span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">step</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">step</span><span class="p">)</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStateBL</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> bl</span>
<span class="sd"> Backwards to previous command, viewing its full</span>
<span class="sd"> source. No commands are executed.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;bl&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="n">arg</span> <span class="ow">and</span> <span class="n">arg</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
<span class="n">step</span> <span class="o">=</span> <span class="o">-</span><span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">step</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">step</span><span class="p">)</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">showall</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStateSS</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> ss [steps]</span>
<span class="sd"> Process current command, then step to the next</span>
<span class="sd"> one. If steps is given,</span>
<span class="sd"> process this many commands.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;ss&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="n">arg</span> <span class="ow">and</span> <span class="n">arg</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
<span class="n">step</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">step</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">step</span><span class="p">):</span>
<span class="k">if</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_batchmode</span> <span class="o">==</span> <span class="s2">&quot;batch_code&quot;</span><span class="p">:</span>
<span class="n">batch_code_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">batch_cmd_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStateSL</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> sl [steps]</span>
<span class="sd"> Process current command, then step to the next</span>
<span class="sd"> one, viewing its full source. If steps is given,</span>
<span class="sd"> process this many commands.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;sl&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="n">arg</span> <span class="ow">and</span> <span class="n">arg</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
<span class="n">step</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">step</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">step</span><span class="p">):</span>
<span class="k">if</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_batchmode</span> <span class="o">==</span> <span class="s2">&quot;batch_code&quot;</span><span class="p">:</span>
<span class="n">batch_code_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">batch_cmd_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStateCC</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> cc</span>
<span class="sd"> Continue to process all remaining</span>
<span class="sd"> commands.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;cc&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">nstack</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stack</span><span class="p">)</span>
<span class="n">ptr</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span>
<span class="n">step</span> <span class="o">=</span> <span class="n">nstack</span> <span class="o">-</span> <span class="n">ptr</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">step</span><span class="p">):</span>
<span class="k">if</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_batchmode</span> <span class="o">==</span> <span class="s2">&quot;batch_code&quot;</span><span class="p">:</span>
<span class="n">batch_code_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">batch_cmd_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">format_code</span><span class="p">(</span><span class="s2">&quot;Finished processing batch file.&quot;</span><span class="p">))</span>
<span class="k">class</span> <span class="nc">CmdStateJJ</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> jj &lt;command number&gt;</span>
<span class="sd"> Jump to specific command number</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;jj&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="n">arg</span> <span class="ow">and</span> <span class="n">arg</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
<span class="n">number</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">format_code</span><span class="p">(</span><span class="s2">&quot;You must give a number index.&quot;</span><span class="p">))</span>
<span class="k">return</span>
<span class="n">ptr</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span>
<span class="n">step</span> <span class="o">=</span> <span class="n">number</span> <span class="o">-</span> <span class="n">ptr</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">step</span><span class="p">)</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStateJL</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> jl &lt;command number&gt;</span>
<span class="sd"> Jump to specific command number and view its full source.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;jl&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="n">arg</span> <span class="ow">and</span> <span class="n">arg</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
<span class="n">number</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">format_code</span><span class="p">(</span><span class="s2">&quot;You must give a number index.&quot;</span><span class="p">))</span>
<span class="k">return</span>
<span class="n">ptr</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">batch_stackptr</span>
<span class="n">step</span> <span class="o">=</span> <span class="n">number</span> <span class="o">-</span> <span class="n">ptr</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">step</span><span class="p">)</span>
<span class="n">show_curr</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">showall</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStateQQ</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> qq</span>
<span class="sd"> Quit the batchprocessor.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;qq&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Aborted interactive batch mode.&quot;</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CmdStateHH</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Help command&quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;hh&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;BatchProcess&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(batchcommands)&quot;</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2"> Interactive batch processing commands:</span>
<span class="s2"> nn [steps] - next command (no processing)</span>
<span class="s2"> nl [steps] - next &amp; look</span>
<span class="s2"> bb [steps] - back to previous command (no processing)</span>
<span class="s2"> bl [steps] - back &amp; look</span>
<span class="s2"> jj &lt;N&gt; - jump to command nr N (no processing)</span>
<span class="s2"> jl &lt;N&gt; - jump &amp; look</span>
<span class="s2"> pp - process currently shown command (no step)</span>
<span class="s2"> ss [steps] - process &amp; step</span>
<span class="s2"> sl [steps] - process &amp; step &amp; look</span>
<span class="s2"> ll - look at full definition of current command</span>
<span class="s2"> rr - reload batch file (stay on current)</span>
<span class="s2"> rrr - reload batch file (start from first)</span>
<span class="s2"> hh - this help list</span>
<span class="s2"> cc - continue processing to end, then quit.</span>
<span class="s2"> qq - quit (abort all remaining commands)</span>
<span class="s2"> abort - this is a safety command that always is available</span>
<span class="s2"> regardless of what cmdsets gets added to us during</span>
<span class="s2"> batch-command processing. It immediately shuts down</span>
<span class="s2"> the processor and returns us to the default cmdset.</span>
<span class="s2"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="c1"># -------------------------------------------------------------</span>
<span class="c1">#</span>
<span class="c1"># Defining the cmdsets for the interactive batchprocessor</span>
<span class="c1"># mode (same for both processors)</span>
<span class="c1">#</span>
<span class="c1"># -------------------------------------------------------------</span>
<span class="k">class</span> <span class="nc">BatchSafeCmdSet</span><span class="p">(</span><span class="n">CmdSet</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The base cmdset for the batch processor.</span>
<span class="sd"> This sets a &#39;safe&#39; abort command that will</span>
<span class="sd"> always be available to get out of everything.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;Batch_default&quot;</span>
<span class="n">priority</span> <span class="o">=</span> <span class="mi">150</span> <span class="c1"># override other cmdsets.</span>
<span class="k">def</span> <span class="nf">at_cmdset_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Init the cmdset&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateAbort</span><span class="p">())</span>
<span class="k">class</span> <span class="nc">BatchInteractiveCmdSet</span><span class="p">(</span><span class="n">CmdSet</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The cmdset for the interactive batch processor mode.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;Batch_interactive&quot;</span>
<span class="n">priority</span> <span class="o">=</span> <span class="mi">104</span>
<span class="k">def</span> <span class="nf">at_cmdset_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;init the cmdset&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateAbort</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateLL</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStatePP</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateRR</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateRRR</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateNN</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateNL</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateBB</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateBL</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateSS</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateSL</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateCC</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateJJ</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateJL</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateQQ</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdStateHH</span><span class="p">())</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 2.x</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.batchprocess</a></li>
</ul>
</div>
<div class="admonition important">
<p class="first admonition-title">Note</p>
<p class="last">You are reading an old version of the Evennia documentation. <a href="https://www.evennia.com/docs/latest/index.html">The latest version is here</a></p>.
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2023, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>