public function eliminaGrupales($id_equipo) { $grupales = AccionesGrupales::model()->findAllByAttributes(array('equipos_id_equipo' => $id_equipo, 'completada' => 1)); foreach ($grupales as $gp) { Participaciones::model()->deleteAllByAttributes(array('acciones_grupales_id_accion_grupal' => $gp->id_accion_grupal)); AccionesGrupales::model()->deleteByPk($gp->id_accion_grupal); } }
/** * Devuelve los recursos de las acciones grupales a los participantes * * Selecciona las acciones grupales finalizadas sin éxito y devuelve los recursos a sus * participantes y creador. * * @route JugadorNum12/scripts/finalizaGrupales * * @throws \Exception excepcion interna * @return void */ public function actionFinalizaGrupales() { //Traer acciones y Helper Yii::import('application.components.Acciones.*'); $tiempo = time(); $busqueda = new CDbCriteria(); $busqueda->addCondition(':bTiempo >= finalizacion'); $busqueda->addCondition('completada = :bCompletada'); $busqueda->params = array(':bTiempo' => $tiempo, ':bCompletada' => 0); $grupales = AccionesGrupales::model()->findAll($busqueda); //Iterar sobre las acciones grupales resultantes de la búsqueda foreach ($grupales as $gp) { $transaction = Yii::app()->db->beginTransaction(); try { //Tomar participaciones $participantes = Participaciones::model()->findAllByAttributes(array('acciones_grupales_id_accion_grupal' => $gp->id_accion_grupal)); //Recorro todos los participantes devolviendoles sus recursos. //Esto incluye el creador de la acción. foreach ($participantes as $participante) { //Cojo el dinero,influencia y animo aportado por el usuario $dinero = $participante->dinero_aportado; $influencia = $participante->influencias_aportadas; $animo = $participante->animo_aportado; //Utilizo el helper para ingresarle al usuario los recursos Recursos::aumentar_recursos($participante->usuarios_id_usuario, 'dinero', $dinero); Recursos::aumentar_recursos($participante->usuarios_id_usuario, 'animo', $animo); Recursos::aumentar_recursos($participante->usuarios_id_usuario, 'influencias', $influencia); //Eliminar ese modelo Participaciones::model()->deleteAllByAttributes(array('acciones_grupales_id_accion_grupal' => $gp->id_accion_grupal, 'usuarios_id_usuario' => $participante->usuarios_id_usuario)); } //Borro esa accion grupal iniciada por el usuario que quiere cambiar de equipo AccionesGrupales::model()->deleteByPk($gp->id_accion_grupal); //Finalizar transacción con éxito $transaction->commit(); } catch (Exception $ex) { //Rollback de la transacción en caso de error $transaction->rollback(); throw $ex; } } }
/** * Funcion que agrega una participacion a una accion grupal * * - actualiza los recursos del usuario * - suma exp al jugador en funcion de los recursos aportados * - actualiza los recursos de la accion * - agrega la participacion (o actualiza una ya existente) * - si se completa la accion, la ejecuta * * Comprobaciones de seguridad realizadas: * 1. la participacion es para el equipo del usuario * 2. la accion no ha terminado * 3. el jugador tiene suficientes recursos * 4. la participacion no es mayor que los recursos restantes de la accion * 5. error al actualizar la participacion en la base de datos * 6. la participacion es vacia (ignorarla) * * @static * @param $id_accion * @param $recursosAportados * @param $accion * @param $habilidad * @param $participacion * @param $nuevo_participante * * @throws \Exception 'No puedes participar en esta accion' * @throws \Exception 'La accion ya ha acabado' * @throws \Exception 'No se puede obtener el modelo de recursos' * @throws \Exception 'No tienes suficientes recursos.' * @throws \Exception 'Error en la BBDD.' * @throws \Exception 'El usuario se ha saltado una validación.' * @throws \Exception 'No has aportado nada a la acción.' * @return void */ public static function participar($id_accion, $recursosAportados, $accion, $habilidad, $participacion, $nuevo_participante) { // 1) Comprobacion: la accion es del equipo del user if ($accion['equipos_id_equipo'] != Yii::app()->user->usAfic) { Yii::app()->user->setFlash('equipo', 'No puedes participar en esta acción. No es de tu equipo'); throw new Exception('No puedes participar en esta acción.'); } // 2) Comprobacion: la accion no ha terminado if ($accion['completada'] != 0) { Yii::app()->user->setFlash('acabada', 'La acción ya ha acabado.'); throw new Exception('La acción ya ha acabado.'); } // id_usuario y recursos $id_user = Yii::app()->user->usIdent; $recursosUsuario = Recursos::model()->findByAttributes(array('usuarios_id_usuario' => $id_user)); if ($recursosUsuario === null) { //Comprobación de seguridad Yii::app()->user->setFlash('recursos', 'No se puede obtener el modelo de recursos. (actionParticipar,AccionesController).'); throw new Exception('No se puede obtener el modelo de recursos.'); } $dineroUsuario = $recursosUsuario['dinero']; $influenciasUsuario = $recursosUsuario['influencias']; $animoUsuario = $recursosUsuario['animo']; $dineroAportado = $recursosAportados['dinero_nuevo']; $animoAportado = $recursosAportados['animo_nuevo']; $influenciasAportadas = $recursosAportados['influencia_nueva']; // Se actualiza la participacion $participacion->setAttributes(array('dinero_nuevo' => $dineroAportado, 'animo_nuevo' => $animoAportado, 'influencia_nueva' => $influenciasAportadas)); // 3) Comprobacion: el usuario tiene suficientes recursos if ($dineroAportado > $dineroUsuario || $animoAportado > $animoUsuario || $influenciasAportadas > $influenciasUsuario) { //No tiene suficientes recursos Yii::app()->user->setFlash('recursos', 'No tienes suficientes recursos.'); throw new Exception('No tienes suficientes recursos.'); } // 4) Comprobacion: los recursos aportados no sobrepasan los que faltan para terminar la acción $dineroAportado = min($dineroAportado, $habilidad['dinero_max'] - $accion['dinero_acc']); $animoAportado = min($animoAportado, $habilidad['animo_max'] - $accion['animo_acc']); $influenciasAportadas = min($influenciasAportadas, $habilidad['influencias_max'] - $accion['influencias_acc']); // 5) Comprobacion: error al actualizar la participacion en la base de datos if ($dineroAportado < 0 || $animoAportado < 0 || $influenciasAportadas < 0) { if ($habilidad['dinero_max'] < $accion['dinero_acc']) { Yii::log('[DATABASE_ERROR] La accion ' . $id_accion . ' más dinero del maximo (' . $accion['dinero_acc'] . '/' . $habilidad['dinero_max'] . ').', 'error'); Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.'); throw new Exception('Error en la BBDD.'); } elseif ($habilidad['animo_max'] < $accion['animo_acc']) { Yii::log('[DATABASE_ERROR] La accion ' . $id_accion . ' más animo del maximo (' . $accion['animo_acc'] . '/' . $habilidad['animo_max'] . ').', 'error'); Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.'); throw new Exception('Error en la BBDD.'); } elseif ($habilidad['influencias_max'] < $accion['influencias_acc']) { Yii::log('[DATABASE_ERROR] La accion ' . $id_accion . ' más influencia del maximo (' . $accion['influencias_acc'] . '/' . $habilidad['influencias_max'] . ').', 'error'); Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.'); throw new Exception('Error en la BBDD.'); } Yii::log('[MALICIOUS_REQUEST] El usuario ' . $id_user . ' se ha saltado una validación de seguridad, intentando robar recursos de la accion ' . $id_accion, 'warning'); Yii::app()->user->setFlash('aviso', 'Se ha registrado un intento de ataque al sistema. De no ser así, póngase en contacto con el administrador. Ten cuidado o acabarás baneado.'); throw new Exception('El usuario se ha saltado una validación.'); } //6 ) Comprobacion: la participacion es vacia (ignorarla) if ($dineroAportado == 0 && $animoAportado == 0 && $influenciasAportadas == 0) { Yii::app()->user->setFlash('aporte', 'No has aportado nada a la acción.'); throw new Exception('No has aportado nada a la acción.'); } // Actualizar los recursos del user $recursosUsuario['dinero'] = $dineroUsuario - $dineroAportado; $recursosUsuario['animo'] = $animoUsuario - $animoAportado; $recursosUsuario['influencias'] = $influenciasUsuario - $influenciasAportadas; $recursosUsuario['influencias_bloqueadas'] += $influenciasAportadas; $recursosUsuario->save(); // Actualizar la experiencia acumulada del usuario $usuario = Usuarios::model()->findByPk($id_user); if ($usuario === null) { //Comprobación de seguridad Yii::log('[DATABASE_ERROR] La accion ' . $id_accion . ' No se encuentra el usuario (' . $id_user . ').', 'error'); Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.'); throw new Exception('Error en la BBDD.'); } $exp_ganada = (int) ($dineroAportado * Usuarios::MOD_EXP_DINERO + $animoAportado * Usuarios::MOD_EXP_ANIMO + $influenciasAportadas * Usuarios::MOD_EXP_INFLUENCIAS); $usuario->sumarExp($exp_ganada); // Actualizar la acciones_grupales $accion['dinero_acc'] += $dineroAportado; $accion['influencias_acc'] += $influenciasAportadas; $accion['animo_acc'] += $animoAportado; if ($nuevo_participante) { $accion['jugadores_acc'] += 1; } if ($accion['dinero_acc'] == $habilidad['dinero_max'] && $accion['influencias_acc'] == $habilidad['influencias_max'] && $accion['animo_acc'] == $habilidad['animo_max']) { $accion['completada'] = 1; } // Actualizar la participación if ($nuevo_participante) { $participacion['dinero_aportado'] = $dineroAportado; $participacion['influencias_aportadas'] = $influenciasAportadas; $participacion['animo_aportado'] = $animoAportado; $participacion->save(); } else { $n = $participacion->updateAll(array('dinero_aportado' => $participacion['dinero_aportado'] + $dineroAportado, 'influencias_aportadas' => $participacion['influencias_aportadas'] + $influenciasAportadas, 'animo_aportado' => $participacion['animo_aportado'] + $animoAportado), "acciones_grupales_id_accion_grupal=:id_accion && usuarios_id_usuario=:id_user", array(':id_accion' => $id_accion, ':id_user' => $id_user)); if ($n != 1) { //Si salta esto es que había más de una participación del mismo usuario en la acción Yii::log('[DATABASE_ERROR] El usuario ' . $id_user . ' tiene ' . $n . ' participaciones en la acción ' . $id_accion, 'error'); Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.'); throw new Exception('Error en la BBDD.'); } } // 1) Si la accion esta completada con esa aportacion // - se ejecuta la accion // - bonificacion de experencia a los participantes de la accion // 2) Se guardas los cambios en la accion if ($accion['completada'] == 1) { //Si se ha completado creamos una notificación $notificacion = new Notificaciones(); $notificacion->fecha = time(); $notificacion->mensaje = Usuarios::model()->findByPk($id_user)->nick . " ha completado la acción " . Habilidades::model()->findByPk($habilidad->id_habilidad)->nombre; $notificacion->imagen = "images/iconos/notificaciones/completa_grupal.png"; $notificacion->save(); //Enviamos la notificación a la afición $componentes = Usuarios::model()->findAllByAttributes(array('equipos_id_equipo' => Usuarios::model()->findByPk($id_user)->equipos_id_equipo)); foreach ($componentes as $componente) { $usrnotif = new Usrnotif(); $usrnotif->notificaciones_id_notificacion = $notificacion->id_notificacion; $usrnotif->usuarios_id_usuario = $componente->id_usuario; $usrnotif->save(); } Yii::import('application.components.Acciones.*'); $nombreHabilidad = $habilidad->codigo; //Llamar al singleton correspondiente y ejecutar dicha acción $nombreHabilidad::getInstance()->ejecutar($id_accion); // actualizar la exp de todos los participantes $participantes = $accion->participaciones; $u; foreach ($participantes as $p) { $u = Usuarios::model()->findByPk($p->usuarios_id_usuario); $u->sumarExp(Usuarios::MUCHA_EXP); } } $accion->save(); if ($accion['completada'] == 1) { Yii::app()->user->setFlash('completada', '¡Enhorabuena, has completado la acción¡'); } else { //si se ha aportado algo creamos notivicación $participaciones = Participaciones::model()->findAllByAttributes(array('acciones_grupales_id_accion_grupal' => $id_accion)); //Si soy el unico en participar no creamos la notificacion if (count($participaciones) > 1) { $notificacion = new Notificaciones(); $notificacion->fecha = time(); $notificacion->mensaje = Usuarios::model()->findByPk($id_user)->nick . " ha participado en la acción " . Habilidades::model()->findByPk($habilidad->id_habilidad)->nombre; $notificacion->imagen = "images/iconos/notificaciones/participacion_grupal.png"; $notificacion->save(); //enviamos notificaciones a los participantes de la acción foreach ($participaciones as $participacion) { if ($participacion->usuarios_id_usuario != $id_user) { $usrnotif = new Usrnotif(); $usrnotif->notificaciones_id_notificacion = $notificacion->id_notificacion; $usrnotif->usuarios_id_usuario = $participacion->usuarios_id_usuario; //$habilidad->id_habilidad;// $usrnotif->save(); } } } Yii::app()->user->setFlash('aporte', 'Tu equipo agradece tu generosa contribución.'); } }
/** * Permite participar en una accion grupal abierta por tu aficion. * * Muestra el formulario que define que recursos va a aportar a la accion que se recogen por $_POST * * > El id del jugador se recoge de la variable de sesion * * @param int $id_accion id de la accion en la que se va a participar * * @route jugadorNum12/acciones/participar/{$id} * @redirect jugadorNum12/accion/participar/{$id_accion} * * @throws \Exception accion inexistente * @throws \Exception habilidad inexistente * @throws \Excepcion la accion no permite mas participantes * @throws \Excepcion fallo en la transaccion * * @return void */ public function actionParticipar($id_accion) { // TODO: pasar logica al modelo /* Actualizar datos de usuario (recuros,individuales y grupales) */ Usuarios::model()->actualizaDatos(Yii::app()->user->usIdent); /* Fin de actualización */ // Saco el usuario $usuario = Yii::app()->user->usIdent; // Cojo la acción de la tabla acciones_grupales $accionGrupal = AccionesGrupales::model()->with('habilidades')->with('participaciones')->with('usuarios')->findByPk($id_accion); // Saco el propietario de la acción $propietarioAccion = $accionGrupal['usuarios_id_usuario']; //Iniciamos la transacción $transaccion = Yii::app()->db->beginTransaction(); try { //Recojo los datos de la acción $accion = AccionesGrupales::model()->findByPK($id_accion); if ($accion === null) { Yii::app()->user->setFlash('accion', 'Acción inexistente.'); throw new Exception('Acción inexistente.'); } //Recojo los datos de la habilidad $habilidad = Habilidades::model()->findByPk($accion['habilidades_id_habilidad']); if ($habilidad == null) { Yii::app()->user->setFlash('habilidad', 'Habilidad inexistente.'); throw new Exception('La habilidad no existe.'); } //Saco el usuario que quiere participar en la acción $id_user = Yii::app()->user->usIdent; //Compuebo si el jugador ya ha participado en la acción $participacion = Participaciones::model()->findByAttributes(array('acciones_grupales_id_accion_grupal' => $id_accion, 'usuarios_id_usuario' => $id_user)); $nuevo_participante = $participacion === null; if ($nuevo_participante) { //Compruebo que no se sobrepase el límite de jugadores if ($accion['jugadores_acc'] >= $habilidad['participantes_max']) { Yii::app()->user->setFlash('participantes', 'La acción no permite más participantes.'); //$this-> redirect(array('acciones/index')); throw new Exception('La acción no permite más participantes.'); } //Saco el modelo que le voy a pasar a la vista $participacion = new Participaciones(); $participacion['acciones_grupales_id_accion_grupal'] = $id_accion; $participacion['usuarios_id_usuario'] = $id_user; } $participacion->setScenario('participar'); // Comprobar si hay recursos a aportar if (!isset($_POST['Participaciones'])) { $transaccion->rollback(); //Petición GET: Muestro el formulario $this->render('participar', array('habilidad' => $habilidad, 'participacion' => $participacion, 'accion' => $accion, 'accionGrupal' => $accionGrupal, 'usuario' => $usuario, 'propietarioAccion' => $propietarioAccion)); return; } //Petición POST $recursosAportados = $_POST['Participaciones']; // Llamar a función del modelo AccionesGrupales para participar en la misma AccionesGrupales::participar($id_accion, $recursosAportados, $accion, $habilidad, $participacion, $nuevo_participante); $transaccion->commit(); $this->redirect(array('acciones/participar', 'id_accion' => $id_accion)); } catch (Exception $exc) { $transaccion->rollback(); $this->redirect(array('usuarios/index')); throw $exc; } }