evennia/docs/2.x/Howtos/Web-Tweeting-Game-Stats.html
2023-12-20 18:20:52 +01:00

211 lines
No EOL
15 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
<title>Automatically Tweet game stats &#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" />
<link rel="next" title="Parsing command arguments, theory and best practices" href="Tutorial-Parsing-Commands.html" />
<link rel="prev" title="Extending the REST API" href="Web-Extending-the-REST-API.html" />
</head><body>
<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="right" >
<a href="Tutorial-Parsing-Commands.html" title="Parsing command arguments, theory and best practices"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="Web-Extending-the-REST-API.html" title="Extending the REST API"
accesskey="P">previous</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="Howtos-Overview.html" accesskey="U">Tutorials and Howtos</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">Automatically Tweet game stats</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>
<h4>Previous topic</h4>
<p class="topless"><a href="Web-Extending-the-REST-API.html"
title="previous chapter">Extending the REST API</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="Tutorial-Parsing-Commands.html"
title="next chapter">Parsing command arguments, theory and best practices</a></p>
<div role="note" aria-label="source link">
<!--h3>This Page</h3-->
<ul class="this-page-menu">
<li><a href="../_sources/Howtos/Web-Tweeting-Game-Stats.md.txt"
rel="nofollow">Show Page Source</a></li>
</ul>
</div><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">
<section class="tex2jax_ignore mathjax_ignore" id="automatically-tweet-game-stats">
<h1>Automatically Tweet game stats<a class="headerlink" href="#automatically-tweet-game-stats" title="Permalink to this headline"></a></h1>
<p>This tutorial will create a simple script that will send a tweet to your already configured twitter account. Please see: <a class="reference internal" href="../Setup/Channels-to-Twitter.html"><span class="doc std std-doc">How to connect Evennia to Twitter</span></a> if you havent already done so.</p>
<p>The script could be expanded to cover a variety of statistics you might wish to tweet about
regularly, from player deaths to how much currency is in the economy etc.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># evennia/typeclasses/tweet_stats.py</span>
<span class="kn">import</span> <span class="nn">twitter</span>
<span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">randint</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</span> <span class="kn">import</span> <span class="n">ObjectDB</span>
<span class="kn">from</span> <span class="nn">evennia.prototypes</span> <span class="kn">import</span> <span class="n">prototypes</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">logger</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">DefaultScript</span>
<span class="k">class</span> <span class="nc">TweetStats</span><span class="p">(</span><span class="n">DefaultScript</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This implements the tweeting of stats to a registered twitter account</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># standard Script hooks </span>
<span class="k">def</span> <span class="nf">at_script_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="s2">&quot;Called when script is first created&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;tweet_stats&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">desc</span> <span class="o">=</span> <span class="s2">&quot;Tweets interesting stats about the game&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">interval</span> <span class="o">=</span> <span class="mi">86400</span> <span class="c1"># 1 day timeout</span>
<span class="bp">self</span><span class="o">.</span><span class="n">start_delay</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">def</span> <span class="nf">at_repeat</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 is called every self.interval seconds to </span>
<span class="sd"> tweet interesting stats about the game.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">api</span> <span class="o">=</span> <span class="n">twitter</span><span class="o">.</span><span class="n">Api</span><span class="p">(</span><span class="n">consumer_key</span><span class="o">=</span><span class="s1">&#39;consumer_key&#39;</span><span class="p">,</span>
<span class="n">consumer_secret</span><span class="o">=</span><span class="s1">&#39;consumer_secret&#39;</span><span class="p">,</span>
<span class="n">access_token_key</span><span class="o">=</span><span class="s1">&#39;access_token_key&#39;</span><span class="p">,</span>
<span class="n">access_token_secret</span><span class="o">=</span><span class="s1">&#39;access_token_secret&#39;</span><span class="p">)</span>
<span class="c1"># Game Chars, Rooms, Objects taken from `stats` command</span>
<span class="n">nobjs</span> <span class="o">=</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
<span class="n">base_char_typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_CHARACTER_TYPECLASS</span>
<span class="n">nchars</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_typeclass_path</span><span class="o">=</span><span class="n">base_char_typeclass</span><span class="p">)</span>
<span class="o">.</span><span class="n">count</span><span class="p">()</span>
<span class="p">)</span>
<span class="n">nrooms</span> <span class="o">=</span><span class="p">(</span>
<span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_location__isnull</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="o">.</span><span class="n">exclude</span><span class="p">(</span><span class="n">db_typeclass_path</span><span class="o">=</span><span class="n">base_char_typeclass</span><span class="p">)</span>
<span class="o">.</span><span class="n">count</span><span class="p">()</span>
<span class="p">)</span>
<span class="n">nexits</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_location__isnull</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">db_destination__isnull</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="o">.</span><span class="n">count</span><span class="p">()</span>
<span class="p">)</span>
<span class="n">nother</span> <span class="o">=</span> <span class="n">nobjs</span> <span class="o">-</span> <span class="n">nchars</span> <span class="o">-</span> <span class="n">nrooms</span> <span class="o">-</span> <span class="n">nexits</span>
<span class="n">tweet</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Chars: </span><span class="si">{</span><span class="n">ncars</span><span class="si">}</span><span class="s2">, Rooms: </span><span class="si">{</span><span class="n">nrooms</span><span class="si">}</span><span class="s2">, Objects: </span><span class="si">{</span><span class="n">nother</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="c1"># post the tweet </span>
<span class="k">try</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">PostUpdate</span><span class="p">(</span><span class="n">tweet</span><span class="p">)</span>
<span class="k">except</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="sa">f</span><span class="s2">&quot;Tweet Error: When attempting to tweet </span><span class="si">{</span><span class="n">tweet</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>In the <code class="docutils literal notranslate"><span class="pre">at_script_creation</span></code> method, we configure the script to fire immediately (useful for testing)
and setup the delay (1 day) as well as script information seen when you use <code class="docutils literal notranslate"><span class="pre">&#64;scripts</span></code></p>
<p>In the <code class="docutils literal notranslate"><span class="pre">at_repeat</span></code> method (which is called immediately and then at interval seconds later) we setup
the Twitter API (just like in the initial configuration of twitter). We then show the number of Player Characters, Rooms and Other/Objects.</p>
<p>The <a class="reference internal" href="../Components/Scripts.html"><span class="doc std std-doc">Scripts docs</span></a> will show you how to add it as a Global script, however, for testing
it may be useful to start/stop it quickly from within the game. Assuming that you create the file
as <code class="docutils literal notranslate"><span class="pre">mygame/typeclasses/tweet_stats.py</span></code> it can be started by using the following command</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>script Here = tweet_stats.TweetStats
</pre></div>
</div>
</section>
</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="right" >
<a href="Tutorial-Parsing-Commands.html" title="Parsing command arguments, theory and best practices"
>next</a> |</li>
<li class="right" >
<a href="Web-Extending-the-REST-API.html" title="Extending the REST API"
>previous</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="Howtos-Overview.html" >Tutorials and Howtos</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">Automatically Tweet game stats</a></li>
</ul>
</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>