vgomes
8/3/2016 - 12:06 PM

queue.php

<?php
if (Picture::queue()->count() > 0) {
    /* array con los ids del usuario que envió cada imagen al grupo, ordenado del último al primero */
    $ids_users_sent_images = Picture::sent()->orderBy('sent_at', 'desc')->pluck('user_id')->toArray();

    $total_tickets = [];

    /* para cada usuario, ejecuto lo siguiente */
    User::all()->each(function (User $user) use ($ids_users_sent_images, &$total_tickets) {
        $pictures_queued = $user->pictures()->queue()->count(); // cuento cuantas tiene en cola cada uno
        $images_since_his_last_sent = array_search($user->telegram_id, $ids_users_sent_images) + 1; // miro hace "cuantas" desde la ultima que envió; le sumo 1 porque el array empieza en 0

        $num_tickets = min(20, $images_since_his_last_sent) * $pictures_queued; // formula para calcular cuantos "billetes" tiene cada uno

         /* en vez de dividir entre el total y sacar aleatorio entre 1 y 0, creo un
         array de longitud igual al numero de "billetes" de ese usuario, conteniendo
         en cada posicion del array el id del usuario */
        $tickets = array_fill(0, $num_tickets, $user->telegram_id);

        /* al array global, le añado los resultados parciales de cada uno, de esa forma si yo tengo 50 billetes,
        tú tienes 30 y paco 10, al final es un array de 90 elementos, 50 de ellos son mi id de usuario, 30 son tu id
        y 10 son el id de paco */      
        $total_tickets = array_merge($total_tickets, $tickets);
    });

    /* el ganador es aquel cuyo id figura en la posicion generada aleatoriamente del array de billetes */
    $winner = $total_tickets[mt_rand(0, count($total_tickets) - 1)];

    /* del usuario elegido, intento cojo una al azar entre las mas antiguas (las ordeno por fecha de creacion y de esas, limito a 10) */
    $picture = Picture::queue()->where('user_id', $winner)->orderBy('created_at')->take(10)->get()->random();

    // de aqui en adelante, es enviar al grupo y marcar como enviada
    $picture->sendToGroup();
    $picture->sent_at = Carbon::now();
    $picture->save();
}

?>