2021-10-03 16:18:46 +05:30

704 lines
59 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">
<title>discord.ext.tasks asyncio.Task helpers</title>
<!-- end extra head -->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/basic.css" />
<link rel="stylesheet" href="../../_static/style.css" type="text/css" />
<link rel="stylesheet" href="../../_static/codeblocks.css" type="text/css" />
<link rel="stylesheet" href="../../_static/icons.css" type="text/css" />
<script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script data-url_root="../../" id="documentation_options" 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/custom.js"></script>
<script src="../../_static/settings.js"></script>
<script src="../../_static/copy.js"></script>
<script src="../../_static/sidebar.js"></script>
<link rel="shortcut icon" href="../../_static/discord_py_logo.ico"/>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="API Reference" href="../../api.html" />
<link rel="prev" title="API Reference" href="../commands/api.html" />
</head>
<body>
<div class="main-grid">
<header class="grid-item">
<nav>
<a href="../../index.html" class="main-heading">discord.py</a>
<a href="https://github.com/Rapptz/discord.py" title="GitHub"><span class="material-icons custom-icons">github</span></a>
<a href="https://discord.gg/TvqYBrGXEm" title="Discord"><span class="material-icons custom-icons">discord</span></a>
<a href="../../faq.html" title="FAQ"><span class="material-icons">help_center</span></a>
<a onclick="mobileSearch.open();" title="Search" id="open-search" class="mobile-only"><span class="material-icons">search</span></a>
<a onclick="mobileSearch.close();" title="Close" id="close-search" class="mobile-only" hidden><span class="material-icons">close</span></a>
</nav>
<nav class="mobile-only">
<form role="search" class="search" action="../../search.html" method="get">
<div class="search-wrapper">
<input type="search" name="q" placeholder="Search documentation" />
<button type="submit">
<span class="material-icons">search</span>
</button>
</div>
</form>
</nav>
</header>
<div class="sub-header grid-item">
<label for="documentation_select">View Documentation For</label>
<select id="documentation_select" onchange="window.location = this.value;">
<option value="../../index.html">discord</option>
<option value="../commands/index.html" >discord.ext.commands</option>
<option value="#" selected>discord.ext.tasks</option>
</select>
<form role="search" class="search" action="../../search.html" method="get">
<div class="search-wrapper">
<input type="search" name="q" placeholder="Search documentation" />
<button type="submit">
<span class="material-icons">search</span>
</button>
</div>
</form>
<a accesskey="S" class="settings" onclick="settingsModal.open();"><span class="material-icons">settings</span></a>
</div>
<aside class="grid-item">
<span id="hamburger-toggle">
<span class="material-icons">menu</span>
</span>
<span id="settings-toggle" class="settings" onclick="settingsModal.open();">
<span class="material-icons">settings</span>
</span>
<div id="sidebar">
<h3><a href="../../index.html">Table of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">discord.ext.tasks</span></code> asyncio.Task helpers</a><ul>
<li><a class="reference internal" href="#recipes">Recipes</a></li>
<li><a class="reference internal" href="#api-reference">API Reference</a></li>
</ul>
</li>
</ul>
</div>
</aside>
<main class="grid-item" role="main">
<section id="discord-ext-tasks-asyncio-task-helpers">
<span id="discord-ext-tasks"></span><h1><code class="docutils literal notranslate"><span class="pre">discord.ext.tasks</span></code> asyncio.Task helpers<a class="headerlink" href="#discord-ext-tasks-asyncio-task-helpers" title="Permalink to this headline"></a></h1>
<div class="versionadded">
<p><span class="versionmodified added">New in version 1.1.0.</span></p>
</div>
<p>One of the most common operations when making a bot is having a loop run in the background at a specified interval. This pattern is very common but has a lot of things you need to look out for:</p>
<ul class="simple">
<li><p>How do I handle <a class="reference external" href="https://docs.python.org/3/library/asyncio-exceptions.html#asyncio.CancelledError" title="(in Python v3.9)"><code class="xref py py-exc docutils literal notranslate"><span class="pre">asyncio.CancelledError</span></code></a>?</p></li>
<li><p>What do I do if the internet goes out?</p></li>
<li><p>What is the maximum number of seconds I can sleep anyway?</p></li>
</ul>
<p>The goal of this discord.py extension is to abstract all these worries away from you.</p>
<section id="recipes">
<h2>Recipes<a class="headerlink" href="#recipes" title="Permalink to this headline"></a></h2>
<p>A simple background task in a <a class="reference internal" href="../commands/api.html#discord.ext.commands.Cog" title="discord.ext.commands.Cog"><code class="xref py py-class docutils literal notranslate"><span class="pre">Cog</span></code></a>:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">discord.ext</span> <span class="kn">import</span> <span class="n">tasks</span><span class="p">,</span> <span class="n">commands</span>
<span class="k">class</span> <span class="nc">MyCog</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">Cog</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">printer</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">cog_unload</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">printer</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
<span class="nd">@tasks</span><span class="o">.</span><span class="n">loop</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="mf">5.0</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">printer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">1</span>
</pre></div>
</div>
<p>Adding an exception to handle during reconnect:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">asyncpg</span>
<span class="kn">from</span> <span class="nn">discord.ext</span> <span class="kn">import</span> <span class="n">tasks</span><span class="p">,</span> <span class="n">commands</span>
<span class="k">class</span> <span class="nc">MyCog</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">Cog</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bot</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bot</span> <span class="o">=</span> <span class="n">bot</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">batch_update</span><span class="o">.</span><span class="n">add_exception_type</span><span class="p">(</span><span class="n">asyncpg</span><span class="o">.</span><span class="n">PostgresConnectionError</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">batch_update</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">cog_unload</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">batch_update</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
<span class="nd">@tasks</span><span class="o">.</span><span class="n">loop</span><span class="p">(</span><span class="n">minutes</span><span class="o">=</span><span class="mf">5.0</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">batch_update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">async</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">bot</span><span class="o">.</span><span class="n">pool</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span> <span class="k">as</span> <span class="n">con</span><span class="p">:</span>
<span class="c1"># batch update here...</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Looping a certain amount of times before exiting:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">discord.ext</span> <span class="kn">import</span> <span class="n">tasks</span>
<span class="nd">@tasks</span><span class="o">.</span><span class="n">loop</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="mf">5.0</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">slow_count</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="n">slow_count</span><span class="o">.</span><span class="n">current_loop</span><span class="p">)</span>
<span class="nd">@slow_count</span><span class="o">.</span><span class="n">after_loop</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">after_slow_count</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;done!&#39;</span><span class="p">)</span>
<span class="n">slow_count</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
</pre></div>
</div>
<p>Waiting until the bot is ready before the loop starts:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">discord.ext</span> <span class="kn">import</span> <span class="n">tasks</span><span class="p">,</span> <span class="n">commands</span>
<span class="k">class</span> <span class="nc">MyCog</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">Cog</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bot</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bot</span> <span class="o">=</span> <span class="n">bot</span>
<span class="bp">self</span><span class="o">.</span><span class="n">printer</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">cog_unload</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">printer</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
<span class="nd">@tasks</span><span class="o">.</span><span class="n">loop</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="mf">5.0</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">printer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="nd">@printer</span><span class="o">.</span><span class="n">before_loop</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">before_printer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;waiting...&#39;</span><span class="p">)</span>
<span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">bot</span><span class="o">.</span><span class="n">wait_until_ready</span><span class="p">()</span>
</pre></div>
</div>
<p>Doing something during cancellation:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">discord.ext</span> <span class="kn">import</span> <span class="n">tasks</span><span class="p">,</span> <span class="n">commands</span>
<span class="kn">import</span> <span class="nn">asyncio</span>
<span class="k">class</span> <span class="nc">MyCog</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">Cog</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bot</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bot</span><span class="o">=</span> <span class="n">bot</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_batch</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lock</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bulker</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">do_bulk</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># bulk insert data here</span>
<span class="o">...</span>
<span class="nd">@tasks</span><span class="o">.</span><span class="n">loop</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="mf">10.0</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">bulker</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">async</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">lock</span><span class="p">:</span>
<span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">do_bulk</span><span class="p">()</span>
<span class="nd">@bulker</span><span class="o">.</span><span class="n">after_loop</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">on_bulker_cancel</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">bulker</span><span class="o">.</span><span class="n">is_being_cancelled</span><span class="p">()</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_batch</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># if we&#39;re cancelled and we have some data left...</span>
<span class="c1"># let&#39;s insert it to our database</span>
<span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">do_bulk</span><span class="p">()</span>
</pre></div>
</div>
</section>
<section id="api-reference">
<span id="ext-tasks-api"></span><h2>API Reference<a class="headerlink" href="#api-reference" title="Permalink to this headline"></a></h2>
<div class="py-attribute-table" data-move-to-id="discord.ext.tasks.Loop"><div class="py-attribute-table-column">
<span>
Attributes</span><ul>
<li class="py-attribute-table-entry">
<a class="reference internal" href="#discord.ext.tasks.Loop.current_loop">current_loop</a></li><li class="py-attribute-table-entry">
<a class="reference internal" href="#discord.ext.tasks.Loop.hours">hours</a></li><li class="py-attribute-table-entry">
<a class="reference internal" href="#discord.ext.tasks.Loop.minutes">minutes</a></li><li class="py-attribute-table-entry">
<a class="reference internal" href="#discord.ext.tasks.Loop.next_iteration">next_iteration</a></li><li class="py-attribute-table-entry">
<a class="reference internal" href="#discord.ext.tasks.Loop.seconds">seconds</a></li><li class="py-attribute-table-entry">
<a class="reference internal" href="#discord.ext.tasks.Loop.time">time</a></li></ul>
</div><div class="py-attribute-table-column">
<span>
Methods</span><ul>
<li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="coroutine">
async</span><a class="reference internal" href="#discord.ext.tasks.Loop.__call__">__call__</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="method">
def</span><a class="reference internal" href="#discord.ext.tasks.Loop.add_exception_type">add_exception_type</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="decorator">
&#64;</span><a class="reference internal" href="#discord.ext.tasks.Loop.after_loop">after_loop</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="decorator">
&#64;</span><a class="reference internal" href="#discord.ext.tasks.Loop.before_loop">before_loop</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="method">
def</span><a class="reference internal" href="#discord.ext.tasks.Loop.cancel">cancel</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="method">
def</span><a class="reference internal" href="#discord.ext.tasks.Loop.change_interval">change_interval</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="method">
def</span><a class="reference internal" href="#discord.ext.tasks.Loop.clear_exception_types">clear_exception_types</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="decorator">
&#64;</span><a class="reference internal" href="#discord.ext.tasks.Loop.error">error</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="method">
def</span><a class="reference internal" href="#discord.ext.tasks.Loop.failed">failed</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="method">
def</span><a class="reference internal" href="#discord.ext.tasks.Loop.get_task">get_task</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="method">
def</span><a class="reference internal" href="#discord.ext.tasks.Loop.is_being_cancelled">is_being_cancelled</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="method">
def</span><a class="reference internal" href="#discord.ext.tasks.Loop.is_running">is_running</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="method">
def</span><a class="reference internal" href="#discord.ext.tasks.Loop.remove_exception_type">remove_exception_type</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="method">
def</span><a class="reference internal" href="#discord.ext.tasks.Loop.restart">restart</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="method">
def</span><a class="reference internal" href="#discord.ext.tasks.Loop.start">start</a></li><li class="py-attribute-table-entry">
<span class="py-attribute-table-badge" title="method">
def</span><a class="reference internal" href="#discord.ext.tasks.Loop.stop">stop</a></li></ul>
</div></div><dl class="py class">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">discord.ext.tasks.</span></span><span class="sig-name descname"><span class="pre">Loop</span></span><a class="headerlink" href="#discord.ext.tasks.Loop" title="Permalink to this definition"></a></dt>
<dd><p>A background task helper that abstracts the loop and reconnection logic for you.</p>
<p>The main interface to create this is through <a class="reference internal" href="#discord.ext.tasks.loop" title="discord.ext.tasks.loop"><code class="xref py py-func docutils literal notranslate"><span class="pre">loop()</span></code></a>.</p>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.after_loop">
<span class="sig-prename descclassname"><span class="pre">&#64;</span></span><span class="sig-name descname"><span class="pre">after_loop</span></span><a class="headerlink" href="#discord.ext.tasks.Loop.after_loop" title="Permalink to this definition"></a></dt>
<dd><p>A decorator that register a coroutine to be called after the loop finished running.</p>
<p>The coroutine must take no arguments (except <code class="docutils literal notranslate"><span class="pre">self</span></code> in a class context).</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>This coroutine is called even during cancellation. If it is desirable
to tell apart whether something was cancelled or not, check to see
whether <a class="reference internal" href="#discord.ext.tasks.Loop.is_being_cancelled" title="discord.ext.tasks.Loop.is_being_cancelled"><code class="xref py py-meth docutils literal notranslate"><span class="pre">is_being_cancelled()</span></code></a> is <code class="docutils literal notranslate"><span class="pre">True</span></code> or not.</p>
</div>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>coro</strong> (<a class="reference external" href="https://docs.python.org/3/library/asyncio-task.html#coroutine" title="(in Python v3.9)"><span class="xref std std-ref">coroutine</span></a>) The coroutine to register after the loop finishes.</p>
</dd>
<dt class="field-even">Raises</dt>
<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#TypeError" title="(in Python v3.9)"><strong>TypeError</strong></a> The function was not a coroutine.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.before_loop">
<span class="sig-prename descclassname"><span class="pre">&#64;</span></span><span class="sig-name descname"><span class="pre">before_loop</span></span><a class="headerlink" href="#discord.ext.tasks.Loop.before_loop" title="Permalink to this definition"></a></dt>
<dd><p>A decorator that registers a coroutine to be called before the loop starts running.</p>
<p>This is useful if you want to wait for some bot state before the loop starts,
such as <a class="reference internal" href="../../api.html#discord.Client.wait_until_ready" title="discord.Client.wait_until_ready"><code class="xref py py-meth docutils literal notranslate"><span class="pre">discord.Client.wait_until_ready()</span></code></a>.</p>
<p>The coroutine must take no arguments (except <code class="docutils literal notranslate"><span class="pre">self</span></code> in a class context).</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>coro</strong> (<a class="reference external" href="https://docs.python.org/3/library/asyncio-task.html#coroutine" title="(in Python v3.9)"><span class="xref std std-ref">coroutine</span></a>) The coroutine to register before the loop runs.</p>
</dd>
<dt class="field-even">Raises</dt>
<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#TypeError" title="(in Python v3.9)"><strong>TypeError</strong></a> The function was not a coroutine.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.error">
<span class="sig-prename descclassname"><span class="pre">&#64;</span></span><span class="sig-name descname"><span class="pre">error</span></span><a class="headerlink" href="#discord.ext.tasks.Loop.error" title="Permalink to this definition"></a></dt>
<dd><p>A decorator that registers a coroutine to be called if the task encounters an unhandled exception.</p>
<p>The coroutine must take only one argument the exception raised (except <code class="docutils literal notranslate"><span class="pre">self</span></code> in a class context).</p>
<p>By default this prints to <a class="reference external" href="https://docs.python.org/3/library/sys.html#sys.stderr" title="(in Python v3.9)"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.stderr</span></code></a> however it could be
overridden to have a different implementation.</p>
<div class="versionadded">
<p><span class="versionmodified added">New in version 1.4.</span></p>
</div>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>coro</strong> (<a class="reference external" href="https://docs.python.org/3/library/asyncio-task.html#coroutine" title="(in Python v3.9)"><span class="xref std std-ref">coroutine</span></a>) The coroutine to register in the event of an unhandled exception.</p>
</dd>
<dt class="field-even">Raises</dt>
<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#TypeError" title="(in Python v3.9)"><strong>TypeError</strong></a> The function was not a coroutine.</p>
</dd>
</dl>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.seconds">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">seconds</span></span><a class="headerlink" href="#discord.ext.tasks.Loop.seconds" title="Permalink to this definition"></a></dt>
<dd><p>Read-only value for the number of seconds
between each iteration. <code class="docutils literal notranslate"><span class="pre">None</span></code> if an explicit <code class="docutils literal notranslate"><span class="pre">time</span></code> value was passed instead.</p>
<div class="versionadded">
<p><span class="versionmodified added">New in version 2.0.</span></p>
</div>
<dl class="field-list simple">
<dt class="field-odd">Type</dt>
<dd class="field-odd"><p>Optional[<a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">float</span></code></a>]</p>
</dd>
</dl>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.minutes">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">minutes</span></span><a class="headerlink" href="#discord.ext.tasks.Loop.minutes" title="Permalink to this definition"></a></dt>
<dd><p>Read-only value for the number of minutes
between each iteration. <code class="docutils literal notranslate"><span class="pre">None</span></code> if an explicit <code class="docutils literal notranslate"><span class="pre">time</span></code> value was passed instead.</p>
<div class="versionadded">
<p><span class="versionmodified added">New in version 2.0.</span></p>
</div>
<dl class="field-list simple">
<dt class="field-odd">Type</dt>
<dd class="field-odd"><p>Optional[<a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">float</span></code></a>]</p>
</dd>
</dl>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.hours">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">hours</span></span><a class="headerlink" href="#discord.ext.tasks.Loop.hours" title="Permalink to this definition"></a></dt>
<dd><p>Read-only value for the number of hours
between each iteration. <code class="docutils literal notranslate"><span class="pre">None</span></code> if an explicit <code class="docutils literal notranslate"><span class="pre">time</span></code> value was passed instead.</p>
<div class="versionadded">
<p><span class="versionmodified added">New in version 2.0.</span></p>
</div>
<dl class="field-list simple">
<dt class="field-odd">Type</dt>
<dd class="field-odd"><p>Optional[<a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">float</span></code></a>]</p>
</dd>
</dl>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.time">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">time</span></span><a class="headerlink" href="#discord.ext.tasks.Loop.time" title="Permalink to this definition"></a></dt>
<dd><p>Read-only list for the exact times this loop runs at.
<code class="docutils literal notranslate"><span class="pre">None</span></code> if relative times were passed instead.</p>
<div class="versionadded">
<p><span class="versionmodified added">New in version 2.0.</span></p>
</div>
<dl class="field-list simple">
<dt class="field-odd">Type</dt>
<dd class="field-odd"><p>Optional[List[<a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.time" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.time</span></code></a>]]</p>
</dd>
</dl>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.current_loop">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">current_loop</span></span><a class="headerlink" href="#discord.ext.tasks.Loop.current_loop" title="Permalink to this definition"></a></dt>
<dd><p>The current iteration of the loop.</p>
<dl class="field-list simple">
<dt class="field-odd">Type</dt>
<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a></p>
</dd>
</dl>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.next_iteration">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">next_iteration</span></span><a class="headerlink" href="#discord.ext.tasks.Loop.next_iteration" title="Permalink to this definition"></a></dt>
<dd><p>When the next iteration of the loop will occur.</p>
<div class="versionadded">
<p><span class="versionmodified added">New in version 1.3.</span></p>
</div>
<dl class="field-list simple">
<dt class="field-odd">Type</dt>
<dd class="field-odd"><p>Optional[<a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.datetime" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.datetime</span></code></a>]</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.__call__">
<em class="property"><span class="pre">await</span> </em><span class="sig-name descname"><span class="pre">__call__</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.Loop.__call__" title="Permalink to this definition"></a></dt>
<dd><p>This function is a <a class="reference external" href="https://docs.python.org/3/library/asyncio-task.html#coroutine"><em>coroutine</em></a>.</p>
<p>Calls the internal callback that the task holds.</p>
<div class="versionadded">
<p><span class="versionmodified added">New in version 1.6.</span></p>
</div>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>*args</strong> The arguments to use.</p></li>
<li><p><strong>**kwargs</strong> The keyword arguments to use.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.start">
<span class="sig-name descname"><span class="pre">start</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.Loop.start" title="Permalink to this definition"></a></dt>
<dd><p>Starts the internal task in the event loop.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>*args</strong> The arguments to use.</p></li>
<li><p><strong>**kwargs</strong> The keyword arguments to use.</p></li>
</ul>
</dd>
<dt class="field-even">Raises</dt>
<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#RuntimeError" title="(in Python v3.9)"><strong>RuntimeError</strong></a> A task has already been launched and is running.</p>
</dd>
<dt class="field-odd">Returns</dt>
<dd class="field-odd"><p>The task that has been created.</p>
</dd>
<dt class="field-even">Return type</dt>
<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/asyncio-task.html#asyncio.Task" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncio.Task</span></code></a></p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.stop">
<span class="sig-name descname"><span class="pre">stop</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.Loop.stop" title="Permalink to this definition"></a></dt>
<dd><p>Gracefully stops the task from running.</p>
<p>Unlike <a class="reference internal" href="#discord.ext.tasks.Loop.cancel" title="discord.ext.tasks.Loop.cancel"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cancel()</span></code></a>, this allows the task to finish its
current iteration before gracefully exiting.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>If the internal function raises an error that can be
handled before finishing then it will retry until
it succeeds.</p>
<p>If this is undesirable, either remove the error handling
before stopping via <a class="reference internal" href="#discord.ext.tasks.Loop.clear_exception_types" title="discord.ext.tasks.Loop.clear_exception_types"><code class="xref py py-meth docutils literal notranslate"><span class="pre">clear_exception_types()</span></code></a> or
use <a class="reference internal" href="#discord.ext.tasks.Loop.cancel" title="discord.ext.tasks.Loop.cancel"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cancel()</span></code></a> instead.</p>
</div>
<div class="versionadded">
<p><span class="versionmodified added">New in version 1.2.</span></p>
</div>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.cancel">
<span class="sig-name descname"><span class="pre">cancel</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.Loop.cancel" title="Permalink to this definition"></a></dt>
<dd><p>Cancels the internal task, if it is running.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.restart">
<span class="sig-name descname"><span class="pre">restart</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.Loop.restart" title="Permalink to this definition"></a></dt>
<dd><p>A convenience method to restart the internal task.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Due to the way this function works, the task is not
returned like <a class="reference internal" href="#discord.ext.tasks.Loop.start" title="discord.ext.tasks.Loop.start"><code class="xref py py-meth docutils literal notranslate"><span class="pre">start()</span></code></a>.</p>
</div>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>*args</strong> The arguments to use.</p></li>
<li><p><strong>**kwargs</strong> The keyword arguments to use.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.add_exception_type">
<span class="sig-name descname"><span class="pre">add_exception_type</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">exceptions</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.Loop.add_exception_type" title="Permalink to this definition"></a></dt>
<dd><p>Adds exception types to be handled during the reconnect logic.</p>
<p>By default the exception types handled are those handled by
<a class="reference internal" href="../../api.html#discord.Client.connect" title="discord.Client.connect"><code class="xref py py-meth docutils literal notranslate"><span class="pre">discord.Client.connect()</span></code></a>, which includes a lot of internet disconnection
errors.</p>
<p>This function is useful if youre interacting with a 3rd party library that
raises its own set of exceptions.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>*exceptions</strong> (Type[<a class="reference external" href="https://docs.python.org/3/library/exceptions.html#BaseException" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseException</span></code></a>]) An argument list of exception classes to handle.</p>
</dd>
<dt class="field-even">Raises</dt>
<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#TypeError" title="(in Python v3.9)"><strong>TypeError</strong></a> An exception passed is either not a class or not inherited from <a class="reference external" href="https://docs.python.org/3/library/exceptions.html#BaseException" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseException</span></code></a>.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.clear_exception_types">
<span class="sig-name descname"><span class="pre">clear_exception_types</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.Loop.clear_exception_types" title="Permalink to this definition"></a></dt>
<dd><p>Removes all exception types that are handled.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>This operation obviously cannot be undone!</p>
</div>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.remove_exception_type">
<span class="sig-name descname"><span class="pre">remove_exception_type</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">exceptions</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.Loop.remove_exception_type" title="Permalink to this definition"></a></dt>
<dd><p>Removes exception types from being handled during the reconnect logic.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>*exceptions</strong> (Type[<a class="reference external" href="https://docs.python.org/3/library/exceptions.html#BaseException" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseException</span></code></a>]) An argument list of exception classes to handle.</p>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>Whether all exceptions were successfully removed.</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">bool</span></code></a></p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.get_task">
<span class="sig-name descname"><span class="pre">get_task</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.Loop.get_task" title="Permalink to this definition"></a></dt>
<dd><p>Optional[<a class="reference external" href="https://docs.python.org/3/library/asyncio-task.html#asyncio.Task" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncio.Task</span></code></a>]: Fetches the internal task or <code class="docutils literal notranslate"><span class="pre">None</span></code> if there isnt one running.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.is_being_cancelled">
<span class="sig-name descname"><span class="pre">is_being_cancelled</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.Loop.is_being_cancelled" title="Permalink to this definition"></a></dt>
<dd><p>Whether the task is being cancelled.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.failed">
<span class="sig-name descname"><span class="pre">failed</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.Loop.failed" title="Permalink to this definition"></a></dt>
<dd><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">bool</span></code></a>: Whether the internal task has failed.</p>
<div class="versionadded">
<p><span class="versionmodified added">New in version 1.2.</span></p>
</div>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.is_running">
<span class="sig-name descname"><span class="pre">is_running</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.Loop.is_running" title="Permalink to this definition"></a></dt>
<dd><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">bool</span></code></a>: Check if the task is currently running.</p>
<div class="versionadded">
<p><span class="versionmodified added">New in version 1.4.</span></p>
</div>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="discord.ext.tasks.Loop.change_interval">
<span class="sig-name descname"><span class="pre">change_interval</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">seconds</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">minutes</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">hours</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">time</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">...</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.Loop.change_interval" title="Permalink to this definition"></a></dt>
<dd><p>Changes the interval for the sleep time.</p>
<div class="versionadded">
<p><span class="versionmodified added">New in version 1.2.</span></p>
</div>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>seconds</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">float</span></code></a>) The number of seconds between every iteration.</p></li>
<li><p><strong>minutes</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">float</span></code></a>) The number of minutes between every iteration.</p></li>
<li><p><strong>hours</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">float</span></code></a>) The number of hours between every iteration.</p></li>
<li><p><strong>time</strong> (Union[<a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.time" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.time</span></code></a>, Sequence[<a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.time" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.time</span></code></a>]]) <p>The exact times to run this loop at. Either a non-empty list or a single
value of <a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.time" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.time</span></code></a> should be passed.
This cannot be used in conjunction with the relative time parameters.</p>
<div class="versionadded">
<p><span class="versionmodified added">New in version 2.0.</span></p>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Duplicate times will be ignored, and only run once.</p>
</div>
</p></li>
</ul>
</dd>
<dt class="field-even">Raises</dt>
<dd class="field-even"><ul class="simple">
<li><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#ValueError" title="(in Python v3.9)"><strong>ValueError</strong></a> An invalid value was given.</p></li>
<li><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#TypeError" title="(in Python v3.9)"><strong>TypeError</strong></a> An invalid value for the <code class="docutils literal notranslate"><span class="pre">time</span></code> parameter was passed, or the
<code class="docutils literal notranslate"><span class="pre">time</span></code> parameter was passed in conjunction with relative time parameters.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="discord.ext.tasks.loop">
<span class="sig-prename descclassname"><span class="pre">discord.ext.tasks.</span></span><span class="sig-name descname"><span class="pre">loop</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">seconds</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">...</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">minutes</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">...</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">hours</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">...</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">time</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">...</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">count</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">reconnect</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">loop</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">...</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#discord.ext.tasks.loop" title="Permalink to this definition"></a></dt>
<dd><p>A decorator that schedules a task in the background for you with
optional reconnect logic. The decorator returns a <a class="reference internal" href="#discord.ext.tasks.Loop" title="discord.ext.tasks.Loop"><code class="xref py py-class docutils literal notranslate"><span class="pre">Loop</span></code></a>.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>seconds</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">float</span></code></a>) The number of seconds between every iteration.</p></li>
<li><p><strong>minutes</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">float</span></code></a>) The number of minutes between every iteration.</p></li>
<li><p><strong>hours</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">float</span></code></a>) The number of hours between every iteration.</p></li>
<li><p><strong>time</strong> (Union[<a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.time" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.time</span></code></a>, Sequence[<a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.time" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.time</span></code></a>]]) <p>The exact times to run this loop at. Either a non-empty list or a single
value of <a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.time" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.time</span></code></a> should be passed. Timezones are supported.
If no timezone is given for the times, it is assumed to represent UTC time.</p>
<p>This cannot be used in conjunction with the relative time parameters.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Duplicate times will be ignored, and only run once.</p>
</div>
<div class="versionadded">
<p><span class="versionmodified added">New in version 2.0.</span></p>
</div>
</p></li>
<li><p><strong>count</strong> (Optional[<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a>]) The number of loops to do, <code class="docutils literal notranslate"><span class="pre">None</span></code> if it should be an
infinite loop.</p></li>
<li><p><strong>reconnect</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">bool</span></code></a>) Whether to handle errors and restart the task
using an exponential back-off algorithm similar to the
one used in <a class="reference internal" href="../../api.html#discord.Client.connect" title="discord.Client.connect"><code class="xref py py-meth docutils literal notranslate"><span class="pre">discord.Client.connect()</span></code></a>.</p></li>
<li><p><strong>loop</strong> (<a class="reference external" href="https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.AbstractEventLoop" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncio.AbstractEventLoop</span></code></a>) The loop to use to register the task, if not given
defaults to <a class="reference external" href="https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.get_event_loop" title="(in Python v3.9)"><code class="xref py py-func docutils literal notranslate"><span class="pre">asyncio.get_event_loop()</span></code></a>.</p></li>
</ul>
</dd>
<dt class="field-even">Raises</dt>
<dd class="field-even"><ul class="simple">
<li><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#ValueError" title="(in Python v3.9)"><strong>ValueError</strong></a> An invalid value was given.</p></li>
<li><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#TypeError" title="(in Python v3.9)"><strong>TypeError</strong></a> The function was not a coroutine, an invalid value for the <code class="docutils literal notranslate"><span class="pre">time</span></code> parameter was passed,
or <code class="docutils literal notranslate"><span class="pre">time</span></code> parameter was passed in conjunction with relative time parameters.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
</section>
</section>
</main>
<footer class="grid-item">
&#169; Copyright 2015-present, Rapptz.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.2.0.
</footer>
</div>
<div id="settings" class="modal" onclick="if (event.target == this){ settingsModal.close(); }" hidden>
<div class="modal-content">
<span class="close" onclick="settingsModal.close();" title="Close">
<span class="material-icons">close</span>
</span>
<h1>Settings</h1>
<h2>Font</h2>
<div class="setting">
<h3>Use a serif font:
<label class="toggle"
title="Use a serif font? Your system font will be used, falling back to serif.">
<input type="checkbox" name="useSerifFont" onclick="updateSetting(this);">
<span class="toggle-slider"></span>
</label>
</h3>
</div>
<h2>Theme</h2>
<div class="setting">
<h3>
<label class="toggle" title="Set your theme based on your system preferences">
<input type="radio" name="setTheme" onclick="updateSetting(this);" value="automatic" checked>
</label>
Automatic
</h3>
<h3>
<label class="toggle" title="Set your theme to light theme">
<input type="radio" name="setTheme" onclick="updateSetting(this);" value="light">
</label>
Light
</h3>
<h3>
<label class="toggle" title="Set your theme to dark theme">
<input type="radio" name="setTheme" onclick="updateSetting(this);" value="dark">
</label>
Dark
</h3>
</div>
</div>
</div>
<div id="to-top" onclick="scrollToTop()" hidden>
<span><span class="material-icons">arrow_upward</span> to top</span>
</div>
</body>
</html>