web.html   [plain text]


<?xml version="1.0"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><title>Twisted Documentation: The Evolution of Finger: a clean web frontend</title><link href="../howto/stylesheet.css" type="text/css" rel="stylesheet" /></head><body bgcolor="white"><h1 class="title">The Evolution of Finger: a clean web frontend</h1><div class="toc"><ol><li><a href="#auto0">Introduction</a></li><li><a href="#auto1">Use Woven</a></li></ol></div><div class="content"><span></span><h2>Introduction<a name="auto0"></a></h2><p> This is the sixth part of the Twisted tutorial <a href="index.html">Twisted from Scratch, or The Evolution of Finger</a>.</p><p>In this part, we demonstrate adding a web frontend using the Woven
templating system.</p><h2>Use Woven<a name="auto1"></a></h2><p>Here we convert to using Woven, instead of manually constructing HTML
snippets. Woven is a sophisticated web templating system. Its main features are
to disallow any code inside the HTML, and transparent integration with deferred
results.</p><div class="py-listing"><pre>
<span class="py-src-comment"># Do everything properly, and componentize
</span><span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span><span class="py-src-op">.</span><span class="py-src-variable">application</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">internet</span><span class="py-src-op">,</span> <span class="py-src-variable">service</span><span class="py-src-newline">
</span><span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span><span class="py-src-op">.</span><span class="py-src-variable">internet</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">protocol</span><span class="py-src-op">,</span> <span class="py-src-variable">reactor</span><span class="py-src-op">,</span> <span class="py-src-variable">defer</span><span class="py-src-newline">
</span><span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span><span class="py-src-op">.</span><span class="py-src-variable">protocols</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">basic</span><span class="py-src-op">,</span> <span class="py-src-variable">irc</span><span class="py-src-newline">
</span><span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span><span class="py-src-op">.</span><span class="py-src-variable">python</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">components</span><span class="py-src-newline">
</span><span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span><span class="py-src-op">.</span><span class="py-src-variable">web</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">resource</span><span class="py-src-op">,</span> <span class="py-src-variable">server</span><span class="py-src-op">,</span> <span class="py-src-variable">static</span><span class="py-src-op">,</span> <span class="py-src-variable">xmlrpc</span><span class="py-src-op">,</span> <span class="py-src-variable">microdom</span><span class="py-src-newline">
</span><span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span><span class="py-src-op">.</span><span class="py-src-variable">web</span><span class="py-src-op">.</span><span class="py-src-variable">woven</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">page</span><span class="py-src-op">,</span> <span class="py-src-variable">model</span><span class="py-src-op">,</span> <span class="py-src-variable">interfaces</span><span class="py-src-newline">
</span><span class="py-src-keyword">import</span> <span class="py-src-variable">cgi</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-keyword">class</span> <span class="py-src-identifier">IFingerService</span><span class="py-src-op">(</span><span class="py-src-parameter">components</span><span class="py-src-op">.</span><span class="py-src-parameter">Interface</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-keyword">def</span> <span class="py-src-identifier">getUser</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">user</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-string">&quot;&quot;&quot;Return a deferred returning a string&quot;&quot;&quot;</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">getUsers</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-string">&quot;&quot;&quot;Return a deferred returning a list of strings&quot;&quot;&quot;</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-keyword">class</span> <span class="py-src-identifier">IFingerSetterService</span><span class="py-src-op">(</span><span class="py-src-parameter">components</span><span class="py-src-op">.</span><span class="py-src-parameter">Interface</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-keyword">def</span> <span class="py-src-identifier">setUser</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">user</span><span class="py-src-op">,</span> <span class="py-src-parameter">status</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-string">&quot;&quot;&quot;Set the user's status to something&quot;&quot;&quot;</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">catchError</span><span class="py-src-op">(</span><span class="py-src-parameter">err</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">    </span><span class="py-src-keyword">return</span> <span class="py-src-string">&quot;Internal error in server&quot;</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-keyword">class</span> <span class="py-src-identifier">FingerProtocol</span><span class="py-src-op">(</span><span class="py-src-parameter">basic</span><span class="py-src-op">.</span><span class="py-src-parameter">LineReceiver</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-keyword">def</span> <span class="py-src-identifier">lineReceived</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">user</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">d</span> <span class="py-src-op">=</span> <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">factory</span><span class="py-src-op">.</span><span class="py-src-variable">getUser</span><span class="py-src-op">(</span><span class="py-src-variable">user</span><span class="py-src-op">)</span><span class="py-src-newline">
</span>        <span class="py-src-variable">d</span><span class="py-src-op">.</span><span class="py-src-variable">addErrback</span><span class="py-src-op">(</span><span class="py-src-variable">catchError</span><span class="py-src-op">)</span><span class="py-src-newline">
</span>        <span class="py-src-keyword">def</span> <span class="py-src-identifier">writeValue</span><span class="py-src-op">(</span><span class="py-src-parameter">value</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">            </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">transport</span><span class="py-src-op">.</span><span class="py-src-variable">write</span><span class="py-src-op">(</span><span class="py-src-variable">value</span><span class="py-src-op">+</span><span class="py-src-string">'\n'</span><span class="py-src-op">)</span><span class="py-src-newline">
</span>            <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">transport</span><span class="py-src-op">.</span><span class="py-src-variable">loseConnection</span><span class="py-src-op">(</span><span class="py-src-op">)</span><span class="py-src-newline">
</span>        <span class="py-src-dedent"></span><span class="py-src-variable">d</span><span class="py-src-op">.</span><span class="py-src-variable">addCallback</span><span class="py-src-op">(</span><span class="py-src-variable">writeValue</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-keyword">class</span> <span class="py-src-identifier">IFingerFactory</span><span class="py-src-op">(</span><span class="py-src-parameter">components</span><span class="py-src-op">.</span><span class="py-src-parameter">Interface</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-keyword">def</span> <span class="py-src-identifier">getUser</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">user</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-string">&quot;&quot;&quot;Return a deferred returning a string&quot;&quot;&quot;</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">buildProtocol</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">addr</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-string">&quot;&quot;&quot;Return a protocol returning a string&quot;&quot;&quot;</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-keyword">class</span> <span class="py-src-identifier">FingerFactoryFromService</span><span class="py-src-op">(</span><span class="py-src-parameter">protocol</span><span class="py-src-op">.</span><span class="py-src-parameter">ServerFactory</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-variable">__implements__</span> <span class="py-src-op">=</span> <span class="py-src-variable">IFingerFactory</span><span class="py-src-op">,</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-variable">protocol</span> <span class="py-src-op">=</span> <span class="py-src-variable">FingerProtocol</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-keyword">def</span> <span class="py-src-identifier">__init__</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">service</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span> <span class="py-src-op">=</span> <span class="py-src-variable">service</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">getUser</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">user</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-keyword">return</span> <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span><span class="py-src-op">.</span><span class="py-src-variable">getUser</span><span class="py-src-op">(</span><span class="py-src-variable">user</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-variable">components</span><span class="py-src-op">.</span><span class="py-src-variable">registerAdapter</span><span class="py-src-op">(</span><span class="py-src-variable">FingerFactoryFromService</span><span class="py-src-op">,</span><span class="py-src-nl">
</span>                           <span class="py-src-variable">IFingerService</span><span class="py-src-op">,</span><span class="py-src-nl">
</span>                           <span class="py-src-variable">IFingerFactory</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-keyword">class</span> <span class="py-src-identifier">FingerSetterProtocol</span><span class="py-src-op">(</span><span class="py-src-parameter">basic</span><span class="py-src-op">.</span><span class="py-src-parameter">LineReceiver</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-keyword">def</span> <span class="py-src-identifier">connectionMade</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">lines</span> <span class="py-src-op">=</span> <span class="py-src-op">[</span><span class="py-src-op">]</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">lineReceived</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">line</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">lines</span><span class="py-src-op">.</span><span class="py-src-variable">append</span><span class="py-src-op">(</span><span class="py-src-variable">line</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">connectionLost</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">reason</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-keyword">if</span> <span class="py-src-variable">len</span><span class="py-src-op">(</span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">lines</span><span class="py-src-op">)</span> <span class="py-src-op">==</span> <span class="py-src-number">2</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">            </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">factory</span><span class="py-src-op">.</span><span class="py-src-variable">setUser</span><span class="py-src-op">(</span><span class="py-src-op">*</span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">lines</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-keyword">class</span> <span class="py-src-identifier">IFingerSetterFactory</span><span class="py-src-op">(</span><span class="py-src-parameter">components</span><span class="py-src-op">.</span><span class="py-src-parameter">Interface</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-keyword">def</span> <span class="py-src-identifier">setUser</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">user</span><span class="py-src-op">,</span> <span class="py-src-parameter">status</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-string">&quot;&quot;&quot;Return a deferred returning a string&quot;&quot;&quot;</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">buildProtocol</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">addr</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-string">&quot;&quot;&quot;Return a protocol returning a string&quot;&quot;&quot;</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-keyword">class</span> <span class="py-src-identifier">FingerSetterFactoryFromService</span><span class="py-src-op">(</span><span class="py-src-parameter">protocol</span><span class="py-src-op">.</span><span class="py-src-parameter">ServerFactory</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-variable">__implements__</span> <span class="py-src-op">=</span> <span class="py-src-variable">IFingerSetterFactory</span><span class="py-src-op">,</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-variable">protocol</span> <span class="py-src-op">=</span> <span class="py-src-variable">FingerSetterProtocol</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-keyword">def</span> <span class="py-src-identifier">__init__</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">service</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span> <span class="py-src-op">=</span> <span class="py-src-variable">service</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">setUser</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">user</span><span class="py-src-op">,</span> <span class="py-src-parameter">status</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span><span class="py-src-op">.</span><span class="py-src-variable">setUser</span><span class="py-src-op">(</span><span class="py-src-variable">user</span><span class="py-src-op">,</span> <span class="py-src-variable">status</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-variable">components</span><span class="py-src-op">.</span><span class="py-src-variable">registerAdapter</span><span class="py-src-op">(</span><span class="py-src-variable">FingerSetterFactoryFromService</span><span class="py-src-op">,</span><span class="py-src-nl">
</span>                           <span class="py-src-variable">IFingerSetterService</span><span class="py-src-op">,</span><span class="py-src-nl">
</span>                           <span class="py-src-variable">IFingerSetterFactory</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-keyword">class</span> <span class="py-src-identifier">IRCReplyBot</span><span class="py-src-op">(</span><span class="py-src-parameter">irc</span><span class="py-src-op">.</span><span class="py-src-parameter">IRCClient</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-keyword">def</span> <span class="py-src-identifier">connectionMade</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">nickname</span> <span class="py-src-op">=</span> <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">factory</span><span class="py-src-op">.</span><span class="py-src-variable">nickname</span><span class="py-src-newline">
</span>        <span class="py-src-variable">irc</span><span class="py-src-op">.</span><span class="py-src-variable">IRCClient</span><span class="py-src-op">.</span><span class="py-src-variable">connectionMade</span><span class="py-src-op">(</span><span class="py-src-variable">self</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">privmsg</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">user</span><span class="py-src-op">,</span> <span class="py-src-parameter">channel</span><span class="py-src-op">,</span> <span class="py-src-parameter">msg</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">user</span> <span class="py-src-op">=</span> <span class="py-src-variable">user</span><span class="py-src-op">.</span><span class="py-src-variable">split</span><span class="py-src-op">(</span><span class="py-src-string">'!'</span><span class="py-src-op">)</span><span class="py-src-op">[</span><span class="py-src-number">0</span><span class="py-src-op">]</span><span class="py-src-newline">
</span>        <span class="py-src-keyword">if</span> <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">nickname</span><span class="py-src-op">.</span><span class="py-src-variable">lower</span><span class="py-src-op">(</span><span class="py-src-op">)</span> <span class="py-src-op">==</span> <span class="py-src-variable">channel</span><span class="py-src-op">.</span><span class="py-src-variable">lower</span><span class="py-src-op">(</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">            </span><span class="py-src-variable">d</span> <span class="py-src-op">=</span> <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">factory</span><span class="py-src-op">.</span><span class="py-src-variable">getUser</span><span class="py-src-op">(</span><span class="py-src-variable">msg</span><span class="py-src-op">)</span><span class="py-src-newline">
</span>            <span class="py-src-variable">d</span><span class="py-src-op">.</span><span class="py-src-variable">addErrback</span><span class="py-src-op">(</span><span class="py-src-variable">catchError</span><span class="py-src-op">)</span><span class="py-src-newline">
</span>            <span class="py-src-variable">d</span><span class="py-src-op">.</span><span class="py-src-variable">addCallback</span><span class="py-src-op">(</span><span class="py-src-keyword">lambda</span> <span class="py-src-variable">m</span><span class="py-src-op">:</span> <span class="py-src-string">&quot;Status of %s: %s&quot;</span> <span class="py-src-op">%</span> <span class="py-src-op">(</span><span class="py-src-variable">msg</span><span class="py-src-op">,</span> <span class="py-src-variable">m</span><span class="py-src-op">)</span><span class="py-src-op">)</span><span class="py-src-newline">
</span>            <span class="py-src-variable">d</span><span class="py-src-op">.</span><span class="py-src-variable">addCallback</span><span class="py-src-op">(</span><span class="py-src-keyword">lambda</span> <span class="py-src-variable">m</span><span class="py-src-op">:</span> <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">msg</span><span class="py-src-op">(</span><span class="py-src-variable">user</span><span class="py-src-op">,</span> <span class="py-src-variable">m</span><span class="py-src-op">)</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-keyword">class</span> <span class="py-src-identifier">IIRCClientFactory</span><span class="py-src-op">(</span><span class="py-src-parameter">components</span><span class="py-src-op">.</span><span class="py-src-parameter">Interface</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-string">&quot;&quot;&quot;
    @ivar nickname
    &quot;&quot;&quot;</span>       <span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-keyword">def</span> <span class="py-src-identifier">getUser</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">user</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-string">&quot;&quot;&quot;Return a deferred returning a string&quot;&quot;&quot;</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">buildProtocol</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">addr</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-string">&quot;&quot;&quot;Return a protocol&quot;&quot;&quot;</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-keyword">class</span> <span class="py-src-identifier">IRCClientFactoryFromService</span><span class="py-src-op">(</span><span class="py-src-parameter">protocol</span><span class="py-src-op">.</span><span class="py-src-parameter">ClientFactory</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-variable">__implements__</span> <span class="py-src-op">=</span> <span class="py-src-variable">IIRCClientFactory</span><span class="py-src-op">,</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-variable">protocol</span> <span class="py-src-op">=</span> <span class="py-src-variable">IRCReplyBot</span><span class="py-src-newline">
</span>    <span class="py-src-variable">nickname</span> <span class="py-src-op">=</span> <span class="py-src-variable">None</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-keyword">def</span> <span class="py-src-identifier">__init__</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">service</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span> <span class="py-src-op">=</span> <span class="py-src-variable">service</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">getUser</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">user</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-keyword">return</span> <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span><span class="py-src-op">.</span><span class="py-src-variable">getUser</span><span class="py-src-op">(</span><span class="py-src-variable">user</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-variable">components</span><span class="py-src-op">.</span><span class="py-src-variable">registerAdapter</span><span class="py-src-op">(</span><span class="py-src-variable">IRCClientFactoryFromService</span><span class="py-src-op">,</span><span class="py-src-nl">
</span>                           <span class="py-src-variable">IFingerService</span><span class="py-src-op">,</span><span class="py-src-nl">
</span>                           <span class="py-src-variable">IIRCClientFactory</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-keyword">class</span> <span class="py-src-identifier">UsersModel</span><span class="py-src-op">(</span><span class="py-src-parameter">model</span><span class="py-src-op">.</span><span class="py-src-parameter">MethodModel</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-keyword">def</span> <span class="py-src-identifier">initialize</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-op">*</span><span class="py-src-parameter">args</span><span class="py-src-op">,</span> <span class="py-src-op">**</span><span class="py-src-parameter">kwargs</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span><span class="py-src-op">=</span><span class="py-src-variable">args</span><span class="py-src-op">[</span><span class="py-src-number">0</span><span class="py-src-op">]</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">wmfactory_users</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">request</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-keyword">return</span> <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span><span class="py-src-op">.</span><span class="py-src-variable">getUsers</span><span class="py-src-op">(</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-variable">components</span><span class="py-src-op">.</span><span class="py-src-variable">registerAdapter</span><span class="py-src-op">(</span><span class="py-src-variable">UsersModel</span><span class="py-src-op">,</span> <span class="py-src-variable">IFingerService</span><span class="py-src-op">,</span> <span class="py-src-variable">interfaces</span><span class="py-src-op">.</span><span class="py-src-variable">IModel</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-keyword">class</span> <span class="py-src-identifier">UserStatusTree</span><span class="py-src-op">(</span><span class="py-src-parameter">page</span><span class="py-src-op">.</span><span class="py-src-parameter">Page</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-variable">template</span> <span class="py-src-op">=</span> <span class="py-src-string">&quot;&quot;&quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;Users&lt;/title&gt;&lt;/head&gt;&lt;body&gt;
    &lt;h1&gt;Users&lt;/h1&gt;
    &lt;ul model=&quot;users&quot; view=&quot;List&quot;&gt;
    &lt;li pattern=&quot;listItem&quot;&gt;&lt;a view=&quot;Anchor&quot; /&gt;&lt;/li&gt;
    &lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;&quot;&quot;&quot;</span>                          <span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-keyword">def</span> <span class="py-src-identifier">initialize</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-op">*</span><span class="py-src-parameter">args</span><span class="py-src-op">,</span> <span class="py-src-op">**</span><span class="py-src-parameter">kwargs</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span><span class="py-src-op">=</span><span class="py-src-variable">args</span><span class="py-src-op">[</span><span class="py-src-number">0</span><span class="py-src-op">]</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">getDynamicChild</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">path</span><span class="py-src-op">,</span> <span class="py-src-parameter">request</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-keyword">return</span> <span class="py-src-variable">UserStatus</span><span class="py-src-op">(</span><span class="py-src-variable">user</span><span class="py-src-op">=</span><span class="py-src-variable">path</span><span class="py-src-op">,</span> <span class="py-src-variable">service</span><span class="py-src-op">=</span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">wchild_RPC2</span> <span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">request</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-keyword">return</span> <span class="py-src-variable">UserStatusXR</span><span class="py-src-op">(</span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-variable">components</span><span class="py-src-op">.</span><span class="py-src-variable">registerAdapter</span><span class="py-src-op">(</span><span class="py-src-variable">UserStatusTree</span><span class="py-src-op">,</span> <span class="py-src-variable">IFingerService</span><span class="py-src-op">,</span> <span class="py-src-variable">resource</span><span class="py-src-op">.</span><span class="py-src-variable">IResource</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-nl">
</span><span class="py-src-keyword">class</span> <span class="py-src-identifier">UserStatus</span><span class="py-src-op">(</span><span class="py-src-parameter">page</span><span class="py-src-op">.</span><span class="py-src-parameter">Page</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-variable">template</span><span class="py-src-op">=</span><span class="py-src-string">'''&lt;html&gt;&lt;head&gt;&lt;title view=&quot;Text&quot; model=&quot;user&quot;/&gt;&lt;/head&gt;
    &lt;body&gt;&lt;h1 view=&quot;Text&quot; model=&quot;user&quot;/&gt;
    &lt;p model=&quot;status&quot; view=&quot;Text&quot; /&gt;
    &lt;/body&gt;&lt;/html&gt;'''</span>                     <span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-keyword">def</span> <span class="py-src-identifier">initialize</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-op">**</span><span class="py-src-parameter">kwargs</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">user</span> <span class="py-src-op">=</span> <span class="py-src-variable">kwargs</span><span class="py-src-op">[</span><span class="py-src-string">'user'</span><span class="py-src-op">]</span><span class="py-src-newline">
</span>        <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span> <span class="py-src-op">=</span> <span class="py-src-variable">kwargs</span><span class="py-src-op">[</span><span class="py-src-string">'service'</span><span class="py-src-op">]</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">wmfactory_user</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">request</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-keyword">return</span> <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">user</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">wmfactory_status</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">request</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-keyword">return</span> <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span><span class="py-src-op">.</span><span class="py-src-variable">getUser</span><span class="py-src-op">(</span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">user</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-keyword">class</span> <span class="py-src-identifier">UserStatusXR</span><span class="py-src-op">(</span><span class="py-src-parameter">xmlrpc</span><span class="py-src-op">.</span><span class="py-src-parameter">XMLRPC</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-keyword">def</span> <span class="py-src-identifier">__init__</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">service</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">xmlrpc</span><span class="py-src-op">.</span><span class="py-src-variable">XMLRPC</span><span class="py-src-op">.</span><span class="py-src-variable">__init__</span><span class="py-src-op">(</span><span class="py-src-variable">self</span><span class="py-src-op">)</span><span class="py-src-newline">
</span>        <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span> <span class="py-src-op">=</span> <span class="py-src-variable">service</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">xmlrpc_getUser</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">user</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-keyword">return</span> <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span><span class="py-src-op">.</span><span class="py-src-variable">getUser</span><span class="py-src-op">(</span><span class="py-src-variable">user</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">xmlrpc_getUsers</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-keyword">return</span> <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">service</span><span class="py-src-op">.</span><span class="py-src-variable">getUsers</span><span class="py-src-op">(</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-keyword">class</span> <span class="py-src-identifier">FingerService</span><span class="py-src-op">(</span><span class="py-src-parameter">service</span><span class="py-src-op">.</span><span class="py-src-parameter">Service</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-indent">    </span><span class="py-src-variable">__implements__</span> <span class="py-src-op">=</span> <span class="py-src-variable">IFingerService</span><span class="py-src-op">,</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-keyword">def</span> <span class="py-src-identifier">__init__</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">filename</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">filename</span> <span class="py-src-op">=</span> <span class="py-src-variable">filename</span><span class="py-src-newline">
</span>        <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">_read</span><span class="py-src-op">(</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">_read</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">users</span> <span class="py-src-op">=</span> <span class="py-src-op">{</span><span class="py-src-op">}</span><span class="py-src-newline">
</span>        <span class="py-src-keyword">for</span> <span class="py-src-variable">line</span> <span class="py-src-keyword">in</span> <span class="py-src-variable">file</span><span class="py-src-op">(</span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">filename</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">            </span><span class="py-src-variable">user</span><span class="py-src-op">,</span> <span class="py-src-variable">status</span> <span class="py-src-op">=</span> <span class="py-src-variable">line</span><span class="py-src-op">.</span><span class="py-src-variable">split</span><span class="py-src-op">(</span><span class="py-src-string">':'</span><span class="py-src-op">,</span> <span class="py-src-number">1</span><span class="py-src-op">)</span><span class="py-src-newline">
</span>            <span class="py-src-variable">user</span> <span class="py-src-op">=</span> <span class="py-src-variable">user</span><span class="py-src-op">.</span><span class="py-src-variable">strip</span><span class="py-src-op">(</span><span class="py-src-op">)</span><span class="py-src-newline">
</span>            <span class="py-src-variable">status</span> <span class="py-src-op">=</span> <span class="py-src-variable">status</span><span class="py-src-op">.</span><span class="py-src-variable">strip</span><span class="py-src-op">(</span><span class="py-src-op">)</span><span class="py-src-newline">
</span>            <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">users</span><span class="py-src-op">[</span><span class="py-src-variable">user</span><span class="py-src-op">]</span> <span class="py-src-op">=</span> <span class="py-src-variable">status</span><span class="py-src-newline">
</span>        <span class="py-src-dedent"></span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">call</span> <span class="py-src-op">=</span> <span class="py-src-variable">reactor</span><span class="py-src-op">.</span><span class="py-src-variable">callLater</span><span class="py-src-op">(</span><span class="py-src-number">30</span><span class="py-src-op">,</span> <span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">_read</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">getUser</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">,</span> <span class="py-src-parameter">user</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-keyword">return</span> <span class="py-src-variable">defer</span><span class="py-src-op">.</span><span class="py-src-variable">succeed</span><span class="py-src-op">(</span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">users</span><span class="py-src-op">.</span><span class="py-src-variable">get</span><span class="py-src-op">(</span><span class="py-src-variable">user</span><span class="py-src-op">,</span> <span class="py-src-string">&quot;No such user&quot;</span><span class="py-src-op">)</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span>    <span class="py-src-dedent"></span><span class="py-src-keyword">def</span> <span class="py-src-identifier">getUsers</span><span class="py-src-op">(</span><span class="py-src-parameter">self</span><span class="py-src-op">)</span><span class="py-src-op">:</span><span class="py-src-newline">
</span><span class="py-src-indent">        </span><span class="py-src-keyword">return</span> <span class="py-src-variable">defer</span><span class="py-src-op">.</span><span class="py-src-variable">succeed</span><span class="py-src-op">(</span><span class="py-src-variable">self</span><span class="py-src-op">.</span><span class="py-src-variable">users</span><span class="py-src-op">.</span><span class="py-src-variable">keys</span><span class="py-src-op">(</span><span class="py-src-op">)</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-nl">
</span><span class="py-src-nl">
</span><span class="py-src-dedent"></span><span class="py-src-dedent"></span><span class="py-src-variable">application</span> <span class="py-src-op">=</span> <span class="py-src-variable">service</span><span class="py-src-op">.</span><span class="py-src-variable">Application</span><span class="py-src-op">(</span><span class="py-src-string">'finger'</span><span class="py-src-op">,</span> <span class="py-src-variable">uid</span><span class="py-src-op">=</span><span class="py-src-number">1</span><span class="py-src-op">,</span> <span class="py-src-variable">gid</span><span class="py-src-op">=</span><span class="py-src-number">1</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-variable">f</span> <span class="py-src-op">=</span> <span class="py-src-variable">FingerService</span><span class="py-src-op">(</span><span class="py-src-string">'/etc/users'</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-variable">serviceCollection</span> <span class="py-src-op">=</span> <span class="py-src-variable">service</span><span class="py-src-op">.</span><span class="py-src-variable">IServiceCollection</span><span class="py-src-op">(</span><span class="py-src-variable">application</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-variable">internet</span><span class="py-src-op">.</span><span class="py-src-variable">TCPServer</span><span class="py-src-op">(</span><span class="py-src-number">79</span><span class="py-src-op">,</span> <span class="py-src-variable">IFingerFactory</span><span class="py-src-op">(</span><span class="py-src-variable">f</span><span class="py-src-op">)</span><span class="py-src-nl">
</span>                   <span class="py-src-op">)</span><span class="py-src-op">.</span><span class="py-src-variable">setServiceParent</span><span class="py-src-op">(</span><span class="py-src-variable">serviceCollection</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-variable">internet</span><span class="py-src-op">.</span><span class="py-src-variable">TCPServer</span><span class="py-src-op">(</span><span class="py-src-number">8000</span><span class="py-src-op">,</span> <span class="py-src-variable">server</span><span class="py-src-op">.</span><span class="py-src-variable">Site</span><span class="py-src-op">(</span><span class="py-src-variable">resource</span><span class="py-src-op">.</span><span class="py-src-variable">IResource</span><span class="py-src-op">(</span><span class="py-src-variable">f</span><span class="py-src-op">)</span><span class="py-src-op">)</span><span class="py-src-nl">
</span>                   <span class="py-src-op">)</span><span class="py-src-op">.</span><span class="py-src-variable">setServiceParent</span><span class="py-src-op">(</span><span class="py-src-variable">serviceCollection</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-variable">i</span> <span class="py-src-op">=</span> <span class="py-src-variable">IIRCClientFactory</span><span class="py-src-op">(</span><span class="py-src-variable">f</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-variable">i</span><span class="py-src-op">.</span><span class="py-src-variable">nickname</span> <span class="py-src-op">=</span> <span class="py-src-string">'fingerbot'</span><span class="py-src-newline">
</span><span class="py-src-variable">internet</span><span class="py-src-op">.</span><span class="py-src-variable">TCPClient</span><span class="py-src-op">(</span><span class="py-src-string">'irc.freenode.org'</span><span class="py-src-op">,</span> <span class="py-src-number">6667</span><span class="py-src-op">,</span> <span class="py-src-variable">i</span><span class="py-src-nl">
</span>                   <span class="py-src-op">)</span><span class="py-src-op">.</span><span class="py-src-variable">setServiceParent</span><span class="py-src-op">(</span><span class="py-src-variable">serviceCollection</span><span class="py-src-op">)</span><span class="py-src-newline">
</span><span class="py-src-endmarker"></span></pre><div class="caption">Source listing - <a href="listings/finger/finger20.py"><span class="filename">listings/finger/finger20.py</span></a></div></div></div><p><a href="../howto/index.html">Index</a></p><span class="version">Version: 1.3.0</span></body></html>