src/Service/ChatService.php line 358

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use App\Entity\DiscussionGroup;
  4. use App\Entity\Message;
  5. use Symfony\Component\Mercure\HubInterface;
  6. use Symfony\Component\Mercure\Update;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use App\Entity\Campaign;
  9. use App\Entity\Mission;
  10. use App\Entity\User;
  11. use Symfony\Component\Routing\RouterInterface;
  12. use Symfony\Component\Serializer\SerializerInterface;
  13. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  14. use Twig\Environment;
  15. use Symfony\Component\Security\Core\Security;
  16. use App\Service\MessageService;
  17. /**
  18.  * author : anthony@softibox.com
  19.  */
  20. class ChatService
  21. {
  22.     private HubInterface $hub;
  23.     private EntityManagerInterface $entityManager;
  24.     private RouterInterface $router;
  25.     private SerializerInterface $serializer;
  26.     private $twig;
  27.     private $security;
  28.     private $messageService;
  29.     public function __construct(
  30.                 HubInterface $hub,
  31.                 EntityManagerInterface $entityManager,
  32.                 RouterInterface $router,
  33.                 SerializerInterface $serializer,
  34.                 Environment $twig,
  35.                 Security $security,
  36.                 MessageService $messageService
  37.         )
  38.     {
  39.         $this->hub $hub;
  40.         $this->entityManager $entityManager;
  41.         $this->router $router;
  42.         $this->serializer $serializer;
  43.         $this->twig $twig;
  44.         $this->security $security;
  45.         $this->messageService $messageService;
  46.     }
  47.     public function marqueAllInMissionMessageReadWithGroup($mission,$user,$groupedMessage){
  48.         $this->messageService->marqueAllInMissionMessageReadWithGroup(mission$mission,user$user,groupedMessage$groupedMessage);
  49.     }
  50.           /**
  51.      * Publie une notification liée à une campagne via une mission donnée.
  52.      *
  53.      * Cette méthode récupère une mission spécifique, puis publie des notifications
  54.      * associées à toutes les missions de la campagne liée.
  55.      *
  56.      * @param string $idMission L'identifiant de la mission à partir de laquelle la notification sera publiée.
  57.      * @param array|object $message Le message de la notification. Peut être un tableau ou un objet.
  58.     */
  59.     public function publishMessageNotificationCampaignHashed(string $idMission$message,$group null): void
  60.     {
  61.         // Récupère l'entité Mission correspondant à l'identifiant fourni.
  62.         $mission $this->entityManager->getRepository(Mission::class)->find($idMission);
  63.         
  64.         // Vérifie que la mission existe et qu'elle est liée à une campagne
  65.         if (!$mission || !$mission->getCampaign()) {
  66.             throw new \InvalidArgumentException('Mission ou campagne introuvable.');
  67.         }
  68.         
  69.             
  70.         // Parcourt toutes les missions associées à la campagne de la mission initiale.
  71.         foreach ($mission->getCampaign()->getMissions() as $mission) {
  72.             // Génère l'URL absolue pour la page d'édition de la mission.
  73.             $absoluteUrl = !is_null($group) ? $this->router->generate('mission_discussion_group', ['id' => $mission->getId(),'groupId'=>$group->getId()], RouterInterface::ABSOLUTE_URL) : $this->router->generate('mission_edit', ['id' => $mission->getId()], RouterInterface::ABSOLUTE_URL);
  74.          
  75.             $absoluteUrl DataHasherService::hash($absoluteUrl);
  76.        
  77.             // Si le message est un objet, il est sérialisé avec un groupe de normalisation .
  78.             $message is_object($message
  79.                 ? $this->serializer->normalize($messagenull, [AbstractNormalizer::GROUPS => ['message_read']]) 
  80.                 : $message;
  81.             $update = new Update(
  82.                 $absoluteUrl
  83.                 json_encode($message)
  84.             );
  85.             try {
  86.                 if($this->security->getUser() instanceof User)
  87.                        $this->hub->publish($update);
  88.             } catch (\Throwable $th) {
  89.                 //throw $th;
  90.             }
  91.             // Crée une mise à jour (Update) contenant l'URL et le message encodé en JSON.
  92.      
  93.             // Publie la mise à jour via le hub (messagerie en temps réel ou système de notifications).
  94.         }
  95.         $update = new Update(
  96.             "messageUpdate/{$mission->getCampaign()->getId()}"
  97.             'messageUpdated'
  98.         );
  99.         try {
  100.             if($this->security->getUser() instanceof User)
  101.                 $this->hub->publish($update);
  102.            
  103.         } catch (\Throwable $th) {
  104.             //throw $th;
  105.         }
  106.         $this->publicOnCampaignUpdate();
  107.        
  108.     }
  109.     /**
  110.      * Publie une notification à un sujet.
  111.      *
  112.      * @param string $topic Le sujet auquel la notification est envoyée.
  113.      * @param array $message Le message de la notification.
  114.      */
  115.      public function publishNotificationMessageUnread(string $topic, array $message): void
  116.     {
  117.         try {
  118.             $update = new Update(
  119.                 $topic,
  120.                 json_encode($message)
  121.             );
  122.             if($this->security->getUser() instanceof User)
  123.                 $this->hub->publish($update);
  124.         } catch (\Throwable $th) {
  125.             //throw $th;
  126.         }
  127.     }
  128.      
  129.     /**
  130.      * Publie une notification liée à une campagne via une mission donnée.
  131.      *
  132.      * Cette méthode récupère une mission spécifique, puis publie des notifications
  133.      * associées à toutes les missions de la campagne liée.
  134.      *
  135.      * @param string $idMission L'identifiant de la mission à partir de laquelle la notification sera publiée.
  136.      * @param array|object $message Le message de la notification. Peut être un tableau ou un objet.
  137.     */
  138.     public function publishMessageNotificationCampaign(string $idMission$message,$group null): void
  139.     {
  140.         // Récupère l'entité Mission correspondant à l'identifiant fourni.
  141.         $mission $this->entityManager->getRepository(Mission::class)->find($idMission);
  142.         
  143.         // Vérifie que la mission existe et qu'elle est liée à une campagne
  144.         if (!$mission || !$mission->getCampaign()) {
  145.             throw new \InvalidArgumentException('Mission ou campagne introuvable.');
  146.         }
  147.         
  148.             
  149.         // Parcourt toutes les missions associées à la campagne de la mission initiale.
  150.         foreach ($mission->getCampaign()->getMissions() as $mission) {
  151.             // Génère l'URL absolue pour la page d'édition de la mission.
  152.             $absoluteUrl = !is_null($group) ? $this->router->generate('mission_discussion_group', ['id' => $mission->getId(),'groupId'=>$group->getId()], RouterInterface::ABSOLUTE_URL) : $this->router->generate('mission_edit', ['id' => $mission->getId()], RouterInterface::ABSOLUTE_URL);
  153.             // Si le message est un objet, il est sérialisé avec un groupe de normalisation .
  154.             $message is_object($message
  155.                 ? $this->serializer->normalize($messagenull, [AbstractNormalizer::GROUPS => ['message_read']]) 
  156.                 : $message;
  157.             $update = new Update(
  158.                 $absoluteUrl
  159.                 json_encode($message)
  160.             );
  161.             try {
  162.                 if($this->security->getUser() instanceof User)
  163.                        $this->hub->publish($update);
  164.             } catch (\Throwable $th) {
  165.                 //throw $th;
  166.             }
  167.             // Crée une mise à jour (Update) contenant l'URL et le message encodé en JSON.
  168.      
  169.             // Publie la mise à jour via le hub (messagerie en temps réel ou système de notifications).
  170.         }
  171.         $update = new Update(
  172.             "messageUpdate/{$mission->getCampaign()->getId()}"
  173.             'messageUpdated'
  174.         );
  175.         try {
  176.             if($this->security->getUser() instanceof User)
  177.                 $this->hub->publish($update);
  178.            
  179.         } catch (\Throwable $th) {
  180.             //throw $th;
  181.         }
  182.         $this->publicOnCampaignUpdate();
  183.        
  184.     }
  185.     public function publicOnCampaignUpdate(){
  186.         $update = new Update(
  187.             "campaignUpdate"
  188.             "campaignUpdate"
  189.        );
  190.        $this->hub->publish($update);
  191.     }
  192.     public function publishUserDesktopEnterInTchat(Message $message){
  193.         $campaignId $message->getCampaign()->getId();
  194.         $message $this->serializer->normalize($messagenull, [AbstractNormalizer::GROUPS => ['message_read']]);
  195.         $update = new Update(
  196.             "campaign/message-read-in-entered-desktop/$campaignId"
  197.             json_encode($message)
  198.        );
  199.        $this->hub->publish($update);
  200.     }
  201.     public function publishUserReadMessage(Message $message){
  202.         $message->setUserListWhoRead($this->messageService->getBullUsersWhoReadMessageByIds($message)); 
  203.         $campaignId $message->getCampaign()->getId();
  204.         $message $this->serializer->normalize($messagenull, [AbstractNormalizer::GROUPS => ['message_read']]);
  205.         ; 
  206.         
  207.         $update = new Update(
  208.             "campaign/message-read/$campaignId"
  209.             json_encode($message)
  210.        );
  211.        $this->hub->publish($update);
  212.     }
  213.     public function publishUserEnterInDiscussion(Message $message){
  214.         $message->setUserListWhoRead($this->messageService->getBullUsersWhoReadMessageByIds($message)); 
  215.         $campaignId $message->getCampaign()->getId();
  216.         $message $this->serializer->normalize($messagenull, [AbstractNormalizer::GROUPS => ['message_read']]);
  217.         ; 
  218.         
  219.         $update = new Update(
  220.             "campaign/user-entered-in-discussion/$campaignId"
  221.             json_encode($message)
  222.        );
  223.        try {
  224.             if($this->security->getUser() instanceof User)
  225.                 $this->hub->publish($update);
  226.        } catch (\Throwable $th) {
  227.         //throw $th;
  228.        }
  229.     }
  230.     public function publishOnMessagePinned($message){
  231.        
  232.         $update = new Update(
  233.             "pinnedMessage/{$message->getCampaign()->getId()}"
  234.             $this->serializer->serialize$message'json', ['groups' => 'message_read'])
  235.        );
  236.        try {
  237.             if($this->security->getUser() instanceof User)
  238.               $this->hub->publish($update);
  239.        } catch (\Throwable $th) {
  240.         //throw $th;
  241.        }
  242.     }
  243.     public function publishOnDiscussionGroupUpdate(string $typeDiscussionGroup  $discussionGroup){
  244.         
  245.         $data = [
  246.             'group'=>$discussionGroup,
  247.             'type'=>$type
  248.         ];
  249.         $update = new Update(
  250.             "discussionEditGroup/{$discussionGroup->getCampaign()->getId()}"
  251.             $this->serializer->serialize$data'json', ['groups' => 'message_read'])
  252.        );
  253.        try {
  254.          if($this->security->getUser() instanceof User)
  255.              $this->hub->publish($update);
  256.        } catch (\Throwable $th) {
  257.         //throw $th;
  258.        }
  259.        
  260.     }
  261.      public function getHtmlToRenderInViewForLastMessage(?Mission $mission,$message,$dateOffSetHour)
  262.     {
  263.        
  264.         return $this->twig->render("mission/_chat_by_item.html.twig", [
  265.             "message" => $message,
  266.             "mission" => $mission,
  267.             "date_off_setHour" => abs($dateOffSetHour),
  268.             'currentUser' => $this->security->getUser()
  269.         ]);
  270.     }
  271.     public function getHtmlContentToRenderInViewForLastMessage(?Mission $mission,$message,$dateOffSetHour)
  272.     {
  273.        
  274.         return $this->twig->render("mission/_chat_content_by_item.html.twig", [
  275.             "message" => $message,
  276.             "mission" => $mission,
  277.             "date_off_setHour" => abs($dateOffSetHour),
  278.             'currentUser' => $this->security->getUser(),
  279.             'position'=>0
  280.         ]);
  281.     }
  282.     /*
  283.     * "planning" => $this->twig->render("mission/_planning_item.html.twig", [
  284.                     "mission" => $mission,
  285.                     "campaign" => $mission->getCampaign(),
  286.                 ]),
  287.     */
  288.      public function getHtmlToRenderPlanning(?Mission $mission)
  289.     {
  290.         return $this->twig->render("mission/_planning_item.html.twig", [
  291.                     "mission" => $mission,
  292.                     "campaign" => $mission->getCampaign(),
  293.                     'currentUser' => $this->security->getUser()
  294.                 ]);
  295.     }
  296.     public function getHtmlToRenderPlanningByUser(User $user , ?Mission $mission)
  297.     {
  298.         return $this->twig->render("mission/_planning_item_by_user.html.twig", [
  299.                     "mission" => $mission,
  300.                     "campaign" => $mission->getCampaign(),
  301.                     'currentUser' => $this->security->getUser(),
  302.                     'user' => $user
  303.                 ]);
  304.     }
  305.     public function userTyping(User $user)
  306.     {
  307.         return $this->twig->render('services/messages/one_user_typing_message.html.twig',[
  308.             'user_is_typing' => $user
  309.         ]);
  310.     }
  311.     public function userWhoRead($message)
  312.     {
  313.         $users $this->messageService->getBullUsersWhoReadMessage($message);
  314.         return $this->twig->render('services/messages/all_users_who_read.html.twig',[
  315.             'user_list' => $users
  316.         ]);
  317.     }
  318.     
  319.     public function messagePinned($message,$user,$dateOffSetHour){
  320.          return $this->twig->render('mission/Ux/_one_pinned_message.html.twig',[
  321.             'pinned' => $message,
  322.             'currentUser' => $user,
  323.             'date_off_setHour' => abs($dateOffSetHour),
  324.         ]);
  325.     }
  326.     public function extractReplyMetadata(string $text){
  327.         $patterns = [
  328.             
  329.             '/(.+)##-+\[CAMPAIGN_ID=(.+)\] +\[MESSAGE_ID=(.+)\]-## /ms',
  330.             '/(.+)##- Conservez cette ligne sur vos réponses\. Tout ce qui se trouve au-dessus de cette ligne sera inséré sur la mission et partagé avec l\'ensemble des participants au projet +\[CAMPAIGN_ID=(.+)\] +\[MESSAGE_ID=(.+)\]-## /ms',
  331.             '/(.+)##- Conservez cette ligne sur vos réponses\. Tout ce qui se trouve au-dessus de cette ligne sera inséré sur la mission et partagé avec l\'ensemble des participants au projet +\[CAMPAIGN_ID=(.+)\] -## /ms',
  332.             
  333.         ] ;
  334.         
  335.         
  336.         foreach ($patterns as $pattern) {
  337.             preg_match($pattern$text$matches);
  338.             if(isset($matches[1]) && isset($matches[2])){
  339.                return [
  340.                     'messageText'=> $matches[1],
  341.                     'campaignId'=> $matches[2] ?? null
  342.                     'messageId'=>$matches[3] ?? null
  343.                ] ;
  344.             }
  345.         }
  346.         return [
  347.             'messageText'=> null
  348.             'campaignId'=> null 
  349.             'messageId'=>  null 
  350.         ];
  351.     
  352.     }
  353. }