RecalculateReputationCommand.php 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. namespace Muzich\CoreBundle\Command;
  3. use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
  4. use Symfony\Component\Console\Input\InputArgument;
  5. use Symfony\Component\Console\Input\InputInterface;
  6. use Symfony\Component\Console\Input\InputOption;
  7. use Symfony\Component\Console\Output\OutputInterface;
  8. use Muzich\CoreBundle\Entity\EventArchive;
  9. class RecalculateReputationCommand extends ContainerAwareCommand
  10. {
  11. protected function configure()
  12. {
  13. $this
  14. ->setName('users:reputation:recalculate')
  15. ->setDescription('Recalcul des scores de reputation')
  16. ->addOption('user', null, InputOption::VALUE_REQUIRED, 'username du compte a traiter')
  17. // ->addArgument('sites', InputArgument::OPTIONAL, 'Liste exhaustive des site a traiter')
  18. // ->addOption('yell', null, InputOption::VALUE_NONE, 'If set, the task will yell in uppercase letters')
  19. ;
  20. }
  21. protected function execute(InputInterface $input, OutputInterface $output)
  22. {
  23. $doctrine = $this->getContainer()->get('doctrine');
  24. $em = $doctrine->getEntityManager();
  25. $output->writeln('#');
  26. $output->writeln('## Script de recalcul des scores de reputation ##');
  27. $output->writeln('#');
  28. $output->writeln('<info>Début du traitement ...</info>');
  29. if (($username = $input->getOption('user')))
  30. {
  31. $output->writeln('<info>Utilisateur choisis: '.$username.'</info>');
  32. $user = $em->createQuery(
  33. "SELECT u FROM MuzichCoreBundle:User u"
  34. . " WHERE u.username = :username"
  35. )->setParameter('username', $username)
  36. ->getResult()
  37. ;
  38. if (count($user))
  39. {
  40. $output->writeln('<info>Utilisateur trouvé</info>');
  41. $users = array($user[0]);
  42. }
  43. }
  44. else
  45. {
  46. // Sinon on traite tout les utilisateurs
  47. $users = $em->createQuery(
  48. "SELECT u FROM MuzichCoreBundle:User u"
  49. )
  50. ->getResult()
  51. ;
  52. }
  53. // Pour chaque utilisateur a traiter
  54. foreach ($users as $user)
  55. {
  56. $user_points = 0;
  57. /*
  58. * On calcule pour les éléments
  59. */
  60. $elements = $em->createQuery(
  61. "SELECT e FROM MuzichCoreBundle:Element e"
  62. . " WHERE e.owner = :uid"
  63. )->setParameter('uid', $user->getId())
  64. ->getResult()
  65. ;
  66. $coef_element_point = $this->getContainer()->getParameter('reputation_element_point_value');
  67. $element_points = 0;
  68. foreach ($elements as $element)
  69. {
  70. $element_points += $element->getPoints();
  71. }
  72. /*
  73. * On calcule pour les favoris
  74. */
  75. $coef_element_fav = $this->getContainer()->getParameter('reputation_element_favorite_value');
  76. $count_favs = 0;
  77. $fav = $em->createQuery(
  78. "SELECT COUNT(f) FROM MuzichCoreBundle:UsersElementsFavorites f"
  79. . " JOIN f.element e"
  80. . " WHERE e.owner = :uid AND f.user != :uid"
  81. )->setParameter('uid', $user->getId())
  82. ->getScalarResult()
  83. ;
  84. if (count($fav))
  85. {
  86. if (count($fav[0]))
  87. {
  88. $count_favs = $fav[0][1];
  89. }
  90. }
  91. /*
  92. * Calcul pour les utilisateurs suivis
  93. */
  94. $coef_follow = $this->getContainer()->getParameter('reputation_element_follow_value');
  95. $count_follow = 0;
  96. $fol = $em->createQuery(
  97. "SELECT COUNT(f) FROM MuzichCoreBundle:FollowUser f"
  98. . " WHERE f.followed = :uid"
  99. )->setParameter('uid', $user->getId())
  100. ->getScalarResult()
  101. ;
  102. if (count($fol))
  103. {
  104. if (count($fol[0]))
  105. {
  106. $count_follow = $fol[0][1];
  107. }
  108. }
  109. /*
  110. * Calcul pour les tags proposés sur des éléments
  111. */
  112. $coef_tag_prop = $this->getContainer()->getParameter('reputation_element_tags_element_prop_value');
  113. try {
  114. $count_tag_prop = $em->createQuery(
  115. "SELECT a.count FROM MuzichCoreBundle:EventArchive a"
  116. . " WHERE a.user = :uid AND a.type = :type"
  117. )->setParameters(array(
  118. 'uid' => $user->getId(),
  119. 'type' => EventArchive::PROP_TAGS_ELEMENT_ACCEPTED
  120. ))
  121. ->getSingleScalarResult()
  122. ;
  123. } catch (\Doctrine\ORM\NoResultException $exc) {
  124. $count_tag_prop = 0;
  125. }
  126. $points =
  127. ($element_points * $coef_element_point)
  128. + ($count_favs * $coef_element_fav)
  129. + ($count_follow * $coef_follow)
  130. + ($count_tag_prop * $coef_tag_prop)
  131. ;
  132. $user->setReputation($points);
  133. $em->persist($user);
  134. $em->flush();
  135. }
  136. $output->writeln('<info>Terminé !</info>');
  137. }
  138. }