Example #1
0
    def lobby(self):
        user = self.user

        if user.game_state == 'playing':
            return redirect(url(controller="game", action="game"))


        send('/lobby', dict(type='enter',
                            user=user.to_dict()))

        #so, the lobby shows (somehow) a list of users not in games.
        #load the initial list
        free_users = User.select((User.q.game_state == None) & ((User.q.logged_in >= User.q.logged_out) | (User.q.logged_out == None)))

        free_users = [user for user in free_users if user.is_logged_in()]
        
        c.free_users = free_users

        c.initial_data = '""'
        #is there a pending invitation?
        if user.game and user.game.state == "invite":
            game = user.game
            user.game_state == "" #unaccept
            invited = [u.display_name for u in User.selectBy(game=game) if u != game.inviter]
            message = {'type' : 'invite', 'game' : game.channel, 
                       'inviter' : game.inviter.display_name, 
                       'min_word_len' : game.min_word_len,
                       'other_players' : invited}

            c.initial_data = dumps(message)
        return render("lobby/lobby.mako")
Example #2
0
    def accept(self):
        accepted = request.params.get('accept') == "accept"
        actor = self.user
        game = actor.game
        print "accept", game
        if not game:
            #game already cancelled or something
            if accepted:
                send(actor.password, {'type' : 'message', 'message' : 'that game does not exist'})
            return {'status' : 'OK' }
        
        if accepted:
            actor.game_state = "accepted"
            type = 'accepted'
        else:
            actor.game = None
            type = 'rejected'
            send("/lobby", {'type' : 'enable', 'user': {'display_name' : actor.display_name}})

        message = "%s %s" % (actor.display_name, type)
        users = User.select(User.q.game == game)
        ready = True
        for user in users:
            if user.game_state != 'accepted':
               ready = False
            send(user.password, {'type' : 'message', 'message' : message})

        if ready:
            game.state = "playing"
            for user in users:
                user.init_game()
                send("/lobby", {'type' : 'leave', 'user' : {'display_name' : user.display_name}})
                send(user.password, {'type' : 'begin', 'game' : user.game.channel})
Example #3
0
    def invite(self):
        #create a new game

        min_word_len = int(request.params['min_word_len'])

        def invite():
            user = self.user
            game = Game.create(user, min_word_len)

            invited = request.params.getall("invite") + [user.id]

            users = []
            for id in invited:
                player = list(User.select(User.q.id==id, forUpdate=True))
                if not player:
                    print "no such user", player
                    return None, None #no such user
                else:
                    player = player[0]
                if player.game:
                    continue
                users.append(player)
                player.game = game

            return game, users

        game, users = sqlhub.doInTransaction(invite)

        user = self.user
        user.game = game

        if game is None:
            print "Could not create game"
            return {'status' : 'Failed'} #can't create game; user will see why soon
        channel = game.channel
        create_channel(game.channel)

        invited = [u.display_name for u in users]

        for player in users:
            my_invited = invited[:]
            my_invited.remove(player.display_name)
            if user.display_name in my_invited:
                my_invited.remove(user.display_name)
            send(player.password, {'type' : 'invite', 'game' : channel, 'inviter' : user.display_name, 'other_players' : my_invited, 'min_word_len' : min_word_len})
            send("/lobby", {'type' : 'disable', 'user': {'display_name' : user.display_name}})
        return {'status' : 'OK'}
Example #4
0
            def implement():
                statuses = []
                players = game.users
                players_by_id = {}
                for player in players:
                    if player.id == user.id:
                        players_by_id[str(player.id)] = user
                    else:
                        players_by_id[str(player.id)] = player

                game.center = "".join(remaining_center_letters)
                for id, word in to_destroy_by_id:
                    player = players_by_id.get(id)
                    player.remove_word(word)
                    statuses.append({
                            'type' : 'remove',
                            'user' : player.to_dict(),
                            'word' : word
                            })

                for word in to_make:
                    user.add_word(word)
                    statuses.append({
                            'type' : 'add',
                            'user' : user.to_dict(),
                            'word' : word
                            })

                #send messages
                destroyed = ''
                if to_destroy:
                    destroyed = "destroyed %s and " % ", ".join(to_destroy)

                send(game.channel, {'type' : 'message', 'message' : '%s %s made %s ' % (user.display_name, destroyed, ", ".join(to_make))})

                message = {'type' : 'status', 'status' : statuses}
                send(game.channel, message)
                send(game.channel, dumps({
                            'type' : 'center',
                            'letters' : game.center,
                            'bag' : len(game.bag)
                            }))
                if len(game.center) == 0 and len(game.bag) == 0:
                    send(game.channel, dumps({
                                'type' : 'game_over'
                                }))
Example #5
0
    def turnup(self):
        user = self.user
        game = user.game
        with LockFile(lock_file_path(game.id)):
            letter = game.turnup()
            if letter:
                send(game.channel, dumps({
                            'type' : 'center',
                            'letters' : game.center,
                            'bag' : len(game.bag)
                            }))

                if len(game.bag) == 0:
                    send(game.channel, dumps({
                                'type' : 'bag_empty'
                                }))
            else:
                send(game.channel, dumps({
                            'type' : 'message',
                            'message' : "The bag is empty."
                            }))
Example #6
0
 def chat(self):
     user = self.user
     game = user.game
     message = "<%s> %s" % (user.display_name, 
                                  request.params.get('chat'))
     send(game.channel, {'type' : 'message', 'message' : message})