<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use App\Chat\Chat;
use App\Entity\Message;
use App\Repository\MessageRepository;
use App\Repository\OffersRepository;
use App\Repository\UserRepository;
use App\Repository\AccountFormRepository;
use App\Repository\ProposalRepository;
use App\Form\QuotationType;
class ChatController extends AbstractController
{
private $sessionInterface;
public function __construct( SessionInterface $session)
{
$this->session = $session;
}
/**
* @Route("/sendMessageChater/{statut}/{idStatut}/{offerId?}/{proposalId?}", name="sendMessageChater")
*/
public function sendMessageChater(ProposalRepository $proposalRepository, AccountFormRepository $accountFormRepository, Request $request, MessageRepository $messageRepository,UserRepository $userRepository , $idStatut, $statut, OffersRepository $offersRepository, $offerId, $proposalId)
{
$this->denyAccessUnlessGranted('ROLE_USER');
$messages = $messageRepository->findBy(["{$statut}" =>$idStatut]);
$messageReceiver = $userRepository->find($idStatut);
//$accountForm = $accountFormRepository->find()
if(isset($offerId)){
$offer = $offersRepository->find($offerId);
$offerMessage = $messageRepository->findBy(["offers" => $offerId, "visitor" => $offer->getUser(), "vendor" => $messageReceiver]);
$proposal = $proposalRepository->find($proposalId);
array_pop($offerMessage);
return $this->render('chat.html.twig', ['messages' => $offerMessage, 'messageReceiver' => $messageReceiver, 'offer' => $offer, 'proposal' => $proposal]);
}
/*if(isset($messageChat) && $messageChat !== null )
{
$response = JsonResponse::fromJsonString('{"message-status" : " message envoyé"}');
}
else
{
$response = JsonResponse::fromJsonString('{"message-status" : " message non envoyé"}');
}*/
//$response->setStatusCode(Response::HTTP_OK);
//$this->denyAccessUnlessGranted('IS_AUTHENTICATED_REMEMBERED');
return $this->render('chat.html.twig', ['messages' => $messages, 'messageReceiver' => $messageReceiver/*, 'proposal' => $proposal*/]);
}
/**
* @Route("/chat/{statut}/{idStatut?}/{offerId?}/{proposalId?}", name="chat")
*/
public function chat(ProposalRepository $proposalRepository, AccountFormRepository $accountFormRepository, Request $request, MessageRepository $messageRepository,UserRepository $userRepository , $idStatut, $statut, OffersRepository $offersRepository, $offerId, $proposalId)
{
/*var_dump($idStatut);
var_dump($this->getUser()->getId());*/
$this->denyAccessUnlessGranted('ROLE_USER');
if($statut === 'vendor')
{
$messages = $messageRepository->findBy(["vendor" => $this->getUser()->getId(), "visitor" => $idStatut]);
}
else
{
$messages = $messageRepository->findBy(["visitor" => $this->getUser()->getId(), "vendor" => $idStatut]);
}
$messageReceiver = $userRepository->find($idStatut);
//$accountForm = $accountFormRepository->find()
if(isset($offerId)){
$offer = $offersRepository->find($offerId);
$offerMessage = $messageRepository->findBy(["offers" => $offerId, "visitor" => $offer->getUser(), "vendor" => $messageReceiver]);
$proposal = $proposalRepository->find($proposalId);
array_pop($offerMessage);
return $this->render('chat_individual.html.twig', ['messages' => $offerMessage, 'messageReceiver' => $messageReceiver, 'offer' => $offer, 'proposal' => $proposal]);
}
return $this->render('chat_individual.html.twig', ['messages' => $messages, 'messageReceiver' => $messageReceiver/*, 'proposal' => $proposal*/]);
}
/**
* @Route("/allMessageChater/{statut}/{idStatut?}/", name="allMessageChater")
*/
public function allMessageChater(Request $request, MessageRepository $messageRepository,UserRepository $userRepository , $idStatut, $statut)
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_REMEMBERED');
// $messages = $messageRepository->findBy(["{$statut}" =>$idStatut]);
$user = $this->getUser();
$messages = $messageRepository->findBy(["{$statut}" => $user->getId()]);
$chaters =array();
foreach( $messages as $message)
{
switch ($statut ){
case 'vendor':
$participants = $message->getVisitor();
if(!in_array($participants, $chaters))
$chaters[] = $participants;
break;
case 'visitor':
$participants = $message->getVendor();
if(!in_array($participants, $chaters))
$chaters[] = $participants;
break;
}
if($idStatut !== null)
{
$newParticipant = $userRepository->find($idStatut);
if(!in_array($newParticipant, $chaters))
{
$chaters[] = $newParticipant;
}
}
//$userVisitor = $userRepository->find($idVisitor);
}
/*if(isset($messageChat) && $messageChat !== null )
{
$response = JsonResponse::fromJsonString('{"message-status" : " message envoyé"}');
}
else
{
$response = JsonResponse::fromJsonString('{"message-status" : " message non envoyé"}');
}*/
//$response->setStatusCode(Response::HTTP_OK);
return $this->render('chatAllMessage.html.twig', ['participants' => $chaters, 'statut' => $statut, 'messages' => $messages]);
}
/**
* @Route("/checkMessageChater", name="checkMessageChater")
*/
public function checkMessageChater(Request $request, MessageRepository $messageRepository,UserRepository $userRepository)
{
// $this->denyAccessUnlessGranted('ROLE_USER');
if($this->isGranted('ROLE_USER') === false)
{
return new JsonResponse(['message' => 'identifiez vous pour accéder à cette page']);
}
$user = $this->getUser();
$accountForm = $userRepository->find($user->getId());
$messagesVisitor = $messageRepository->findBy(["visitor" => $user->getId(), "isRead" => false]);
if(!empty($messagesVisitor)){
$numberMessageVisitor = count($messagesVisitor);
$messagesVisitor[$numberMessageVisitor-1]->getMessageOwner();
}
if($accountForm){
$messagesJobber = $messageRepository->findBy(["vendor" => $user->getId(), "isRead" => false]);
}
//dd($messagesVisitor);
if(count($messagesVisitor) > 0 || count($messagesJobber) > 0)
{
return new JsonResponse(['status' => 'ok', 'message' => 'message trouvé']);
}
else
{
return new JsonResponse(['status' => 'ko', 'message' => 'aucun message trouvé']);
}
}
/**
* @Route("/chater/{statut}/{idStatut}/{offerId?}", name="chater")
*/
public function startChat( OffersRepository $offersRepository, Request $request, MessageRepository $messageRepository, UserRepository $userRepository, $statut, $idStatut, $offerId)
{
$this->denyAccessUnlessGranted('ROLE_USER');
//dd($offerId);
//$offer = $offersRepository->find($offerId);
// if statement set status vendor / visitor with retrieving the parameter url status (?status=vendor/visitor)
// get the id of the status's owner with the parameter url idStatus (?idStatus=idOwnerStatus)
//$status = $request->query->get('status');
//$idStatus = $request->query->get('idStatus');
if(isset($statut) && $statut === 'vendor')
{
$jobber = $this->getUser();
$receiver = $user = $userRepository->find($idStatut);
}
else
{
$user = $this->getUser();
$receiver = $jobber = $userRepository->find($idStatut);
}
//getter
$lastMessages = $messageRepository->findBy(['vendor' => $jobber->getId(), 'visitor' => $user->getId()]);
$lastMessage = count($lastMessages);
if ($lastMessage > 0)
{
$lastMessageId = $lastMessages[$lastMessage - 1]->getLastMessageId();
}
// if($request->request->get('messageId') !== $lastMessageId)
//{
$messageChat = $request->request->get('message');
$messageId = $request->request->get('messageId');
$lastMessageId = $request->request->get('lastMessageId');
$vendorId = $request->request->get('vendor');
//setter
$message = new Message($jobber, $user/*, $offer*/);
if( !empty($lastMessages) && count($lastMessages) > 0)
{
$lastMessage = count($lastMessages);
$lastMessageId = $lastMessages[$lastMessage - 1]->getLastMessageId();
$lastMessageId++;
}
else
{
$lastMessageId = 0;
}
if($messageChat !== null)
{
//$message->setOffers($offer);
$message->setIsRead(false);
$message->setLastMessageId($lastMessageId);
$message->setContent($messageChat);
$message->setMessageOwner($this->getUser());
$message->setMessageReceiver($receiver);
$em = $this->getDoctrine()->getManager();
$em->persist($message);
$em->flush();
}
//}
//foreach($messages as $message )
//{
ob_start();
// $testy = "id: {$visitor->getFirstname()}";
// $testy = "id: ".ceil(microtime(true));
if(count($lastMessages) > 0 )
{
$content = "id: ".$lastMessages[$lastMessage - 1]->getLastMessageId();
$content .= "\n";
$content .= "event: chatter";
$content .= "\n";
$content .= "data: {\"content\" : \"{$lastMessages[$lastMessage -1]->getContent()} \", \"owner\": {$lastMessages[$lastMessage - 1]->getMessageOwner()->getId()} } ";
$content .= "\n\n";
echo $content;
}
//}
// }
$response = new StreamedResponse(function(){
ob_end_flush();
//if(isset($messageChat) && $messageChat !== null)
//{
//$this->session->remove('message');
//}
});
//$response->setStatusCode(Response::HTTP_OK);
$response->headers->set('Content-Type', 'text/event-stream');
$response->headers->set('Connection', 'keep-alive');
$response->headers->set('Cache-Control', 'no-cache');
return $response;
}
/**
* @Route("chatDatetime/{statut}/{idStatut}/{offerId?}", name="chatDatetime")
*/
public function chatDatetime( OffersRepository $offersRepository, Request $request, MessageRepository $messageRepository, UserRepository $userRepository, $statut, $idStatut, $offerId) {
$this->denyAccessUnlessGranted('ROLE_USER');
$user = $this->getUser();
//dd($user->getId());
if(isset($statut) && $statut === 'vendor')
{
$messages = $messageRepository->findBy(['vendor' => $user->getId(), 'visitor' => $idStatut]);
}
else
{
$user = $this->getUser();
$messages = $messageRepository->findBy(['vendor' => $idStatut, 'visitor' => $user->getId()]);
}
if (!empty($messages) )
{
$lastMessages = $messages[count($messages)-1];
return new JsonResponse(['datetime' => $lastMessages->getDate()]);
}
else
{
return new JsonResponse(['message' => 'aucun message trouvé']);
}
}
}