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)
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)
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