Exemplo n.º 1
0
    def add(self, call, args):
        """!add [game [game ..]]

        Signs you up for one or more games"""
        self.get_games(call, args,
            config.getboolean("Pickup", "implicit all games in add"))\
            .add(call, call.nick)
Exemplo n.º 2
0
    def __init__(self, bot, user, channel, message):
        self.bot = bot
        self.user = user
        self.nick = user.split('!',1)[0]
        self.channel = channel
        command = str()

        if channel[0]=='#':
            if message.startswith(config.get('Bot', 'command prefix')):
                command = message[len(config.get('Bot', 'command prefix')):]
                self.context = self.CONTEXT_COMMAND
            else:
                m = re.match( '^'+re.escape(self.bot.nickname)+'[^A-Za-z0-9 ]\W*(.*)', message )
                if m and config.getboolean('Bot', 'allow mentions'):
                    command = m.group(1)
                    self.context = self.CONTEXT_MENTION
                else:
                    # chanmsg
                    return
        elif channel == self.bot.nickname:
            command = message
            self.context = self.CONTEXT_PRIVATE
            self.channel = 'PM'
        else:
            return

        self.args = command.split()
        self.cmd = self.args.pop(0).lower()

        if self.cmd in ['yes', 'no']:
            self._handle_confirm_reply()
            return

        if self.cmd == 'more':
            log.msg(_("{0} asked for more"))
            self._handleMore()
            return

        if self.cmd not in self.bot.commands:
            log.msg(_("{0} attempted to use unknown command {1}.").format(self.nick, self.cmd))
            if config.getboolean('Bot', 'warn on unknown command'):
                self.reply(_("Unknown command %s.") % self.cmd)
            return

        flags = self.bot.commands[self.cmd][1]
        can_run = []
        if flags & COMMAND.ADMIN:
            def _knowIs_admin(is_admin):
                if not is_admin:
                    log.msg(_("{0} attempted to use admin command {1}.").format(self.nick, self.cmd))
                    raise InputError(_("Command %s is only available to admins.") % self.cmd)
                else:
                    return True
            can_run.append(
                self.bot.is_admin(self.user, self.nick)\
                    .addCallback(_knowIs_admin)
                )

        if self.context == self.CONTEXT_PRIVATE and flags & COMMAND.NOT_FROM_PM:
            log.msg(_("{0} attempted to use command {1} in a PM.").format(self.nick, self.cmd))
            can_run.append(defer.fail(InputError(
                _("Command %s cannot be used in private.") % self.cmd)))
        else:
            can_run.append(defer.succeed(True))

        if self.context == self.CONTEXT_COMMAND and flags & COMMAND.NOT_FROM_CHANNEL:
            log.msg(_("{0} attempted to use command {1} in a channel.").format(self.nick, self.cmd))
            can_run.append(defer.fail(InputError(
                _("Command {0} cannot be used in public.").format(self.cmd))))
        else:
            can_run.append(defer.succeed(True))

        def _canRun(true):
            log.msg(message)
            try:
                d = log.callWithContext({'system': 'pypickupbot %s %s'%(self.channel,self.cmd)}, self.bot.commands[self.cmd][0], self, self.args)
                if isinstance(d, defer.Deferred):
                    d.addErrback(_catchInputError).addErrback(_catchInternalError)
            except InputError as e:
                self.reply(str(e))
            except Exception as e:
                self.reply(_("Internal error."))
                log.err()

        def _catchInputError(f):
            t = f.trap(InputError)
            self.reply(str(f.value))
        
        def _catchInternalError(f):
            f.trap(Exception)
            self.reply(_("Internal error."))
            f.printTraceback()

        defer.DeferredList(can_run, fireOnOneErrback=True, consumeErrors=True)\
            .addCallbacks(_canRun, _catchInputError).addErrback(_catchInternalError)
Exemplo n.º 3
0
    def do_start(self):
        """Does the actual starting of the game"""
        if self.abort_start or not self.starting:
            self.abort_start = False
            self.starting = False
            return

        players = self.players[:self.maxplayers]
        for player in players:
            self.pickup.all_games().force_remove(player)

        self.pickup.update_topic()

        self.pickup.pypickupbot.notice(self.pickup.pypickupbot.channel, 
            _("%(gamenick)s game ready to start in %(channel)s")
                % {'gamenick': self.nick, 'channel': self.pickup.pypickupbot.channel})

        captains = []

        if not self.autopick:
            pickpool = sorted(players)
            captains = random.sample(pickpool,2)

            self.pickup.pypickupbot.fire('pickup_game_starting', self, players, captains)
            if len( captains ) > 0:
                self.pickup.pypickupbot.msg( self.pickup.pypickupbot.channel,
                    config.get('Pickup messages', 'game ready').decode('string-escape')%
                    {
                        'nick': self.nick,
                        'playernum': len(self.players),
                        'playermax': self.maxplayers,
                        'name': self.name,
                        'numcaps': self.caps,
                        'playerlist': ', '.join(players),
                        'captainlist': ', '.join(captains)
                    })
                if config.getboolean("Pickup", "PM each player on start"):
                    for player in players:
                        self.pickup.pypickupbot.msg(player, 
                            config.get("Pickup messages", "youre needed").decode('string-escape')%
                            {
                                'channel': self.pickup.pypickupbot.channel,
                                'name': self.name,
                                'nick': self.nick,
                                'numcaps': self.caps,
                                'playerlist': ', '.join(players),
                                'captainlist': ', '.join(captains)
                            })
            else:
                self.pickup.pypickupbot.msg( self.pickup.pypickupbot.channel,
                    config.get('Pickup messages', 'game ready nocaptains').decode('string-escape')%
                    {
                        'nick': self.nick,
                        'playernum': len(self.players),
                        'playermax': self.maxplayers,
                        'name': self.name,
                        'numcaps': self.caps,
                        'playerlist': ', '.join(players)
                    })
                if config.getboolean("Pickup", "PM each player on start"):
                    for player in players:
                        self.pickup.pypickupbot.msg(player, 
                            config.get("Pickup messages", "youre needed nocaptains").decode('string-escape')%
                            {
                                'channel': self.pickup.pypickupbot.channel,
                                'name': self.name,
                                'nick': self.nick,
                                'numcaps': self.caps,
                                'playerlist': ', '.join(players),
                            })
        else:
            teams = [[] for i in range(self.caps)]
            players_ = sorted(players)
            for i in range(len(players)):
                player = random.choice(players_)
                players_.remove(player)
                teams[i % self.caps].append(player)

            self.pickup.pypickupbot.fire('pickup_game_starting', self, teams, captains)
            self.pickup.pypickupbot.cmsg(
                config.get('Pickup messages', 'game ready autopick').decode('string-escape')%
                {
                    'nick': self.nick,
                    'playernum': len(players),
                    'playermax': self.maxplayers,
                    'name': self.name,
                    'numcaps': self.caps,
                    'teamslist': ', '.join([
                        config.get('Pickup messages', 'game ready autopick team').decode('string-escape')%
                        {
                            'name': self.teamname(i),
                            'players': ', '.join(team)
                        }
                        for i, team in enumerate(teams)])
                })

        self.pickup.pypickupbot.fire('pickup_game_started', self, players, captains)

        self.starting = False