Forked from oddluck

This commit is contained in:
Pratyush Desai 2021-08-01 23:43:20 +05:30
commit 9dc1765571
8 changed files with 2352 additions and 0 deletions

41
README.md Normal file
View File

@ -0,0 +1,41 @@
The classic game of IRC Duck Hunt.
Forked from https://github.com/veggiematts/supybot-duckhunt
Requires Python3, Limnoria.
Python 3 and score fixes. Plugin working.
\_o< ~ DuckHunt game for supybot ~ >o_/
=======================================
How to play
-----------
* Use the "starthunt" command to start a game.
* The bot will randomly launch ducks. Whenever a duck is launched, the first person to use the "bang" command wins a point.
* Using the "bang" command when there is no duck launched costs a point.
* Using the "bang" command two or more times while reloading costs a point.
* If a player shoots all the ducks during a hunt, it's a perfect! This player gets extra bonus points.
* The best scores for a channel are recorded and can be displayed with the "listscores" command.
* The quickest and longest shoots are also recorded and can be displayed with the "listtimes" command.
* The "launched" command tells if there is currently a duck to shoot.
How to install
--------------
Just place the DuckHunt plugin in the plugins directory of your supybot installation and load the module.
How to configure
----------------
Several per-channel configuration variables are available (look at the "channel" command to learn more on how to configure per-channel configuration variables):
* autoRestart: Does a new hunt automatically start when the previous one is over?
* ducks: Number of ducks during a hunt?
* minthrottle: The minimum amount of time before a new duck may be launched (in seconds)
* maxthrottle: The maximum amount of time before a new duck may be launched (in seconds)
* reloadTime: The time it takes to reload your rifle once you have shot (in seconds)
* kickMode: If someone shoots when there is no duck, should he be kicked from the channel? (this requires the bot to be op on the channel)
* autoFriday: Do we need to automatically launch more ducks on friday?
* missProbability: The probability to miss the duck
Update
------
Get latest version at : https://github.com/veggiematts/supybot-duckhunt

72
__init__.py Normal file
View File

@ -0,0 +1,72 @@
###
# Copyright (c) 2012, Matthias Meusburger
# Copyright (c) 2020, oddluck <oddluck@riseup.net>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the author of this software nor the name of
# contributors to this software may be used to endorse or promote products
# derived from this software without specific prior written consent.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
###
"""
DuckHunt: an IRC Duck Hunt game for Limnoria
"""
import supybot
import supybot.world as world
import importlib
# Use this for the version of this plugin. You may wish to put a CVS keyword
# in here if you're keeping the plugin in CVS or some similar system.
__version__ = "2020.02.24+git"
# XXX Replace this with an appropriate author or supybot.Author instance.
__author__ = supybot.Author("Matthias Meusburger", "veggiematts", "")
__maintainer__ = getattr(
supybot.authors,
"oddluck",
supybot.Author("oddluck", "oddluck", "oddluck@riseup.net"),
)
# This is a dictionary mapping supybot.Author instances to lists of
# contributions.
__contributors__ = {}
# This is a url where the most recent plugin package can be downloaded.
__url__ = "https://github.com/oddluck/limnoria-plugins/"
from . import config
from . import plugin
importlib.reload(plugin) # In case we're being reloaded.
# Add more reloads here if you add third-party modules and want them to be
# reloaded when this plugin is reloaded. Don't forget to import them as well!
if world.testing:
from . import test
Class = plugin.Class
configure = config.configure
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:

111
config.py Normal file
View File

@ -0,0 +1,111 @@
###
# Copyright (c) 2012, Matthias Meusburger
# Copyright (c) 2020, oddluck <oddluck@riseup.net>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the author of this software nor the name of
# contributors to this software may be used to endorse or promote products
# derived from this software without specific prior written consent.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
###
import supybot.conf as conf
import supybot.registry as registry
def configure(advanced):
# This will be called by supybot to configure this module. advanced is
# a bool that specifies whether the user identified himself as an advanced
# user or not. You should effect your configuration by manipulating the
# registry as appropriate.
from supybot.questions import expect, anything, something, yn
conf.registerPlugin("DuckHunt", True)
DuckHunt = conf.registerPlugin("DuckHunt")
# This is where your configuration variables (if any) should go. For example:
# conf.registerGlobalValue(Quote, 'someConfigVariableName',
# registry.Boolean(False, """Help for someConfigVariableName."""))
conf.registerChannelValue(
DuckHunt,
"autoRestart",
registry.Boolean(
False, """Does a new hunt automatically start when the previous one is over?"""
),
)
conf.registerChannelValue(
DuckHunt, "ducks", registry.Integer(5, """Number of ducks during a hunt?""")
)
conf.registerChannelValue(
DuckHunt,
"minthrottle",
registry.Integer(
30,
"""The minimum amount of time before a new duck may be launched (in seconds)""",
),
)
conf.registerChannelValue(
DuckHunt,
"maxthrottle",
registry.Integer(
300,
"""The maximum amount of time before a new duck may be launched (in seconds)""",
),
)
conf.registerChannelValue(
DuckHunt,
"reloadTime",
registry.Integer(
5, """The time it takes to reload your rifle once you have shot (in seconds)"""
),
)
conf.registerChannelValue(
DuckHunt,
"missProbability",
registry.Probability(0.2, """The probability to miss the duck"""),
)
conf.registerChannelValue(
DuckHunt,
"kickMode",
registry.Boolean(
True,
"""If someone shoots when there is no duck, should he be kicked from the channel? (this requires the bot to be op on the channel)""",
),
)
conf.registerChannelValue(
DuckHunt,
"autoFriday",
registry.Boolean(
True, """ Do we need to automatically launch more ducks on friday? """
),
)
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

415
doc/DuckHunt.html Normal file
View File

@ -0,0 +1,415 @@
<?xml version="1.0" encoding="utf-8" ?>
<!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" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.7: http://docutils.sourceforge.net/" />
<title>Documentation for the DuckHunt plugin for Supybot</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 6253 2010-03-02 00:24:53Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: left }
/* div.align-center * { */
/* text-align: left } */
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block {
margin-left: 2em ;
margin-right: 2em }
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="documentation-for-the-duckhunt-plugin-for-supybot">
<h1 class="title">Documentation for the DuckHunt plugin for Supybot</h1>
<div class="section" id="purpose">
<h1>Purpose</h1>
<p>This is a DuckHunt game for supybot</p>
</div>
<div class="section" id="usage">
<h1>Usage</h1>
<p>A DuckHunt game for supybot. Use the &quot;start&quot; command to start a game. The
bot will randomly launch ducks. Whenever a duck is launched, the first
person to use the &quot;bang&quot; command wins a point. Using the &quot;bang&quot; command
when there is no duck launched costs a point.</p>
</div>
<div class="section" id="commands">
<h1>Commands</h1>
<dl class="docutils">
<dt>bang</dt>
<dd>Shoots the duck!</dd>
<dt>dayscores</dt>
<dd>[&lt;channel&gt;] Shows the score list of the day for &lt;channel&gt;.</dd>
<dt>dbg</dt>
<dd>This is a debug command. If debug mode is not enabled, it won't do anything</dd>
<dt>fridaymode</dt>
<dd>[&lt;status&gt;] Enable/disable friday mode! (there are lots of ducks on friday :))</dd>
<dt>launched</dt>
<dd>Is there a duck right now?</dd>
<dt>listscores</dt>
<dd>[&lt;size&gt;] [&lt;channel&gt;] Shows the &lt;size&gt;-sized score list for &lt;channel&gt; (or for
the current channel if no channel is given)</dd>
<dt>listtimes</dt>
<dd>[&lt;size&gt;] [&lt;channel&gt;] Shows the &lt;size&gt;-sized time list for &lt;channel&gt; (or for
the current channel if no channel is given)</dd>
<dt>mergescores</dt>
<dd>[&lt;channel&gt;] &lt;nickto&gt; &lt;nickfrom&gt; nickto gets the points of nickfrom and
nickfrom is removed from the scorelist</dd>
<dt>mergetimes</dt>
<dd>[&lt;channel&gt;] &lt;nickto&gt; &lt;nickfrom&gt; nickto gets the best time of nickfrom if
nickfrom time is better than nickto time, and nickfrom is removed from the
timelist. Also works with worst times.</dd>
<dt>rmscore</dt>
<dd>[&lt;channel&gt;] &lt;nick&gt; Remove &lt;nick&gt;'s score</dd>
<dt>rmtime</dt>
<dd>[&lt;channel&gt;] &lt;nick&gt; Remove &lt;nick&gt;'s best time</dd>
<dt>score</dt>
<dd>&lt;nick&gt; Shows the score for a given nick</dd>
<dt>start</dt>
<dd>Starts the hunt</dd>
<dt>stop</dt>
<dd>Stops the current hunt</dd>
<dt>total</dt>
<dd>Shows the total amount of ducks shot in &lt;channel&gt; (or in the current channel
if no channel is given)</dd>
<dt>weekscores</dt>
<dd>[&lt;week&gt;] [&lt;nick&gt;] [&lt;channel&gt;] Shows the score list of the week for &lt;channel&gt;.
If &lt;nick&gt; is provided, it will only show &lt;nick&gt;'s scores.</dd>
</dl>
</div>
<div class="section" id="configuration">
<h1>Configuration</h1>
<dl class="docutils">
<dt>supybot.plugins.DuckHunt.public</dt>
<dd><p class="first">This config variable defaults to True and is not channel specific.</p>
<p class="last">Determines whether this plugin is publicly visible.</p>
</dd>
<dt>supybot.plugins.DuckHunt.autoRestart</dt>
<dd><p class="first">This config variable defaults to False and is channel specific.</p>
<p class="last">Does a new hunt automatically start when the previous one is over?</p>
</dd>
<dt>supybot.plugins.DuckHunt.ducks</dt>
<dd><p class="first">This config variable defaults to 5 and is channel specific.</p>
<p class="last">Number of ducks during a hunt?</p>
</dd>
<dt>supybot.plugins.DuckHunt.minthrottle</dt>
<dd><p class="first">This config variable defaults to 30 and is channel specific.</p>
<p class="last">The minimum amount of time before a new duck may be launched (in seconds)</p>
</dd>
<dt>supybot.plugins.DuckHunt.maxthrottle</dt>
<dd><p class="first">This config variable defaults to 300 and is channel specific.</p>
<p class="last">The maximum amount of time before a new duck may be launched (in seconds)</p>
</dd>
<dt>supybot.plugins.DuckHunt.reloadTime</dt>
<dd><p class="first">This config variable defaults to 5 and is channel specific.</p>
<p class="last">The time it takes to reload your rifle once you have shot (in seconds)</p>
</dd>
<dt>supybot.plugins.DuckHunt.missProbability</dt>
<dd><p class="first">This config variable defaults to 0.20000000000000001 and is channel specific.</p>
<p class="last">The probability to miss the duck</p>
</dd>
<dt>supybot.plugins.DuckHunt.kickMode</dt>
<dd><p class="first">This config variable defaults to True and is channel specific.</p>
<p class="last">If someone shoots when there is no duck, should he be kicked from the
channel? (this requires the bot to be op on the channel)</p>
</dd>
<dt>supybot.plugins.DuckHunt.autoFriday</dt>
<dd><p class="first">This config variable defaults to True and is channel specific.</p>
<p class="last">Do we need to automatically launch more ducks on friday?</p>
</dd>
</dl>
</div>
</div>
</body>
</html>

119
doc/DuckHunt.rst Normal file
View File

@ -0,0 +1,119 @@
Documentation for the DuckHunt plugin for Supybot
=================================================
Purpose
-------
This is a DuckHunt game for supybot
Usage
-----
A DuckHunt game for supybot. Use the "start" command to start a game. The
bot will randomly launch ducks. Whenever a duck is launched, the first
person to use the "bang" command wins a point. Using the "bang" command
when there is no duck launched costs a point.
Commands
--------
bang
Shoots the duck!
dayscores
[<channel>] Shows the score list of the day for <channel>.
dbg
This is a debug command. If debug mode is not enabled, it won't do anything
fridaymode
[<status>] Enable/disable friday mode! (there are lots of ducks on friday :))
launched
Is there a duck right now?
listscores
[<size>] [<channel>] Shows the <size>-sized score list for <channel> (or for
the current channel if no channel is given)
listtimes
[<size>] [<channel>] Shows the <size>-sized time list for <channel> (or for
the current channel if no channel is given)
mergescores
[<channel>] <nickto> <nickfrom> nickto gets the points of nickfrom and
nickfrom is removed from the scorelist
mergetimes
[<channel>] <nickto> <nickfrom> nickto gets the best time of nickfrom if
nickfrom time is better than nickto time, and nickfrom is removed from the
timelist. Also works with worst times.
rmscore
[<channel>] <nick> Remove <nick>'s score
rmtime
[<channel>] <nick> Remove <nick>'s best time
score
<nick> Shows the score for a given nick
start
Starts the hunt
stop
Stops the current hunt
total
Shows the total amount of ducks shot in <channel> (or in the current channel
if no channel is given)
weekscores
[<week>] [<nick>] [<channel>] Shows the score list of the week for <channel>.
If <nick> is provided, it will only show <nick>'s scores.
Configuration
-------------
supybot.plugins.DuckHunt.public
This config variable defaults to True and is not channel specific.
Determines whether this plugin is publicly visible.
supybot.plugins.DuckHunt.autoRestart
This config variable defaults to False and is channel specific.
Does a new hunt automatically start when the previous one is over?
supybot.plugins.DuckHunt.ducks
This config variable defaults to 5 and is channel specific.
Number of ducks during a hunt?
supybot.plugins.DuckHunt.minthrottle
This config variable defaults to 30 and is channel specific.
The minimum amount of time before a new duck may be launched (in seconds)
supybot.plugins.DuckHunt.maxthrottle
This config variable defaults to 300 and is channel specific.
The maximum amount of time before a new duck may be launched (in seconds)
supybot.plugins.DuckHunt.reloadTime
This config variable defaults to 5 and is channel specific.
The time it takes to reload your rifle once you have shot (in seconds)
supybot.plugins.DuckHunt.missProbability
This config variable defaults to 0.20000000000000001 and is channel specific.
The probability to miss the duck
supybot.plugins.DuckHunt.kickMode
This config variable defaults to True and is channel specific.
If someone shoots when there is no duck, should he be kicked from the
channel? (this requires the bot to be op on the channel)
supybot.plugins.DuckHunt.autoFriday
This config variable defaults to True and is channel specific.
Do we need to automatically launch more ducks on friday?

146
doc/DuckHunt.stx Normal file
View File

@ -0,0 +1,146 @@
Documentation for the DuckHunt plugin for Supybot
Purpose
This is a DuckHunt game for supybot
Usage
A DuckHunt game for supybot. Use the "start" command to start a game.
The bot will randomly launch ducks. Whenever a duck is launched, the first
person to use the "bang" command wins a point. Using the "bang" command
when there is no duck launched costs a point.
Commands
* bang
Shoots the duck!
* dayscores
[<channel>] Shows the score list of the day for <channel>.
* dbg
This is a debug command. If debug mode is not enabled, it won't do
anything
* fridaymode
[<status>] Enable/disable friday mode! (there are lots of ducks on friday
:))
* launched
Is there a duck right now?
* listscores
[<size>] [<channel>] Shows the <size>-sized score list for <channel> (or
for the current channel if no channel is given)
* listtimes
[<size>] [<channel>] Shows the <size>-sized time list for <channel> (or
for the current channel if no channel is given)
* mergescores
[<channel>] <nickto> <nickfrom> nickto gets the points of nickfrom and
nickfrom is removed from the scorelist
* mergetimes
[<channel>] <nickto> <nickfrom> nickto gets the best time of nickfrom if
nickfrom time is better than nickto time, and nickfrom is removed from
the timelist. Also works with worst times.
* rmscore
[<channel>] <nick> Remove <nick>'s score
* rmtime
[<channel>] <nick> Remove <nick>'s best time
* score
<nick> Shows the score for a given nick
* start
Starts the hunt
* stop
Stops the current hunt
* total
Shows the total amount of ducks shot in <channel> (or in the current
channel if no channel is given)
* weekscores
[<week>] [<nick>] [<channel>] Shows the score list of the week for
<channel>. If <nick> is provided, it will only show <nick>'s scores.
Configuration
* supybot.plugins.DuckHunt.public
This config variable defaults to True and is not channel specific.
Determines whether this plugin is publicly visible.
* supybot.plugins.DuckHunt.autoRestart
This config variable defaults to False and is channel specific.
Does a new hunt automatically start when the previous one is over?
* supybot.plugins.DuckHunt.ducks
This config variable defaults to 5 and is channel specific.
Number of ducks during a hunt?
* supybot.plugins.DuckHunt.minthrottle
This config variable defaults to 30 and is channel specific.
The minimum amount of time before a new duck may be launched (in seconds)
* supybot.plugins.DuckHunt.maxthrottle
This config variable defaults to 300 and is channel specific.
The maximum amount of time before a new duck may be launched (in seconds)
* supybot.plugins.DuckHunt.reloadTime
This config variable defaults to 5 and is channel specific.
The time it takes to reload your rifle once you have shot (in seconds)
* supybot.plugins.DuckHunt.missProbability
This config variable defaults to 0.20000000000000001 and is channel
specific.
The probability to miss the duck
* supybot.plugins.DuckHunt.kickMode
This config variable defaults to True and is channel specific.
If someone shoots when there is no duck, should he be kicked from the
channel? (this requires the bot to be op on the channel)
* supybot.plugins.DuckHunt.autoFriday
This config variable defaults to True and is channel specific.
Do we need to automatically launch more ducks on friday?

1400
plugin.py Normal file

File diff suppressed because it is too large Load Diff

48
test.py Normal file
View File

@ -0,0 +1,48 @@
###
# Copyright (c) 2012, Matthias Meusburger
# Copyright (c) 2020, oddluck <oddluck@riseup.net>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the author of this software nor the name of
# contributors to this software may be used to endorse or promote products
# derived from this software without specific prior written consent.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
###
from supybot.test import *
class DuckHuntTestCase(ChannelPluginTestCase):
plugins = ('DuckHunt',)
def tests(self):
self.assertResponse("bang", "There is no hunt right now! You can start a hunt with the 'start' command")
self.assertResponse("stop", "Nothing to stop: there's no hunt right now.")
self.assertResponse("start", "The hunt starts now!")
self.assertResponse("start", "There is already a hunt right now!")
self.assertRegexp("bang", "^There was no duck!")
self.assertResponse("stop", "The hunt stops now!")
self.assertNotError("listscores")
self.assertNotError("weekscores")
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: