145 lines
5.2 KiB
Python
145 lines
5.2 KiB
Python
###
|
|
# Copyright (c) 2010, Terence Simpson <tsimpson@ubuntu.com>
|
|
# 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.utils as utils
|
|
from supybot.commands import *
|
|
import supybot.plugins as plugins
|
|
import supybot.ircutils as ircutils
|
|
import supybot.callbacks as callbacks
|
|
import supybot.ircdb as ircdb
|
|
import random as rdm
|
|
import string
|
|
import time
|
|
|
|
|
|
class Random(callbacks.Plugin):
|
|
"""Add the help for "@plugin help Random" here
|
|
This should describe *how* to use this plugin."""
|
|
threaded = True
|
|
|
|
def __init__(self, irc):
|
|
callbacks.Plugin.__init__(self, irc)
|
|
self.rdm = rdm.Random(time.time())
|
|
self.pwchars = string.ascii_letters + string.digits + string.punctuation
|
|
|
|
def _seed(self, num=None):
|
|
if num is None:
|
|
num = time.time()
|
|
self.rdm.seed(num)
|
|
|
|
def makePassword(self, pwlen=16):
|
|
self._seed()
|
|
return ''.join(self.rdm.sample(self.pwchars, pwlen))
|
|
|
|
def seed(self, irc, msg, args, num):
|
|
"""[<number>]
|
|
|
|
Seeds the random number generator with the given <number>, which can
|
|
either be an integer or a floating-point number. When no argument is
|
|
given, the random number generator is seeded with the current time.
|
|
"""
|
|
self._seed(num)
|
|
irc.replySuccess()
|
|
seed = wrap(seed, [optional(first('long', 'float'))])
|
|
|
|
def random(self, irc, msg, args, words):
|
|
"""word1 word2 ...wordN
|
|
Picks a word at random.
|
|
"""
|
|
wordl = [x for x in words.split(' ') if x]
|
|
wordl = [_ for _ in wordl if not ('tsimpson',).__contains__(_.lower())]
|
|
if len(wordl) == 1:
|
|
irc.reply(wordl[0]);
|
|
return
|
|
|
|
if self.rdm.randrange(0, 2):
|
|
self.rdm.seed(time.time())
|
|
|
|
irc.reply(self.rdm.choice(wordl))
|
|
random = wrap(random, ['text'])
|
|
|
|
def randrange(self, irc, msg, args, min, max):
|
|
"""<min> <max>
|
|
Picks a random number in range <min>-<max>
|
|
"""
|
|
if max <= min:
|
|
irc.error("<min> must be less than <max>")
|
|
return
|
|
max += 1
|
|
irc.reply(str(rdm.randrange(min, max)))
|
|
randrange = wrap(randrange, ["nonNegativeInt", "nonNegativeInt"])
|
|
|
|
def adduser(self, irc, msg, args, name, hostmask):
|
|
"""<name> [<hostmask>]
|
|
|
|
Registers <name> with the bot and, optionally, assigns the given
|
|
<hostmask> to the new account.
|
|
"""
|
|
# This try-block checks if the user calling this command is an admin (or owner)
|
|
try:
|
|
u = ircdb.users.getUser(msg.prefix)
|
|
if not u._checkCapability('admin'):
|
|
irc.errorNoCapability('admin', Raise=True)
|
|
except KeyError:
|
|
pass
|
|
|
|
if ircutils.isUserHostmask(name):
|
|
irc.errorInvalid('username', name, "Hostmasks are not valid usernames", Raise=True)
|
|
|
|
# This try-block checks if the username is already registered
|
|
try:
|
|
ircdb.users.getUserId(name)
|
|
irc.error("That name is already registered", Raise=True)
|
|
except KeyError:
|
|
pass
|
|
|
|
if hostmask:
|
|
# This try-block checks if the hostmask given is already assigned to another user
|
|
try:
|
|
u = ircdb.users.getUser(hostmask)
|
|
irc.error("That hostmask is already registered to %s" % u.name)
|
|
return
|
|
except KeyError:
|
|
pass
|
|
|
|
user = ircdb.users.newUser()
|
|
user.name = name
|
|
user.setPassword(self.makePassword())
|
|
if hostmask:
|
|
user.addHostmask(hostmask)
|
|
ircdb.users.setUser(user)
|
|
irc.replySuccess()
|
|
# adduser = wrap(adduser, ['something', additional('hostmask')])
|
|
|
|
Class = Random
|
|
|
|
|
|
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:
|