Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RobertoSilva007

Como chamar usuário no Chat IM?

Recommended Posts

Salve, salve galera...não sei se me expressei bem aí no titulo, mas...fiquei sem ideias de como abordar esse problema. Espero que eu possa expressá-lo bem nas proximas linhas.

 

Enfim...criei um Chat IM do zero, é feiozinho(ainda está sem css, rsss) mas funciona que é uma beleza. Agora..a minha dúvida é, por exemplo, o usuario 1 chama o usuario 2 para conversar, como eu faço para que o usuario 2 veja a solicitação do usuario 1?

 

Bom...pensando agora, existem duas formas:

1 - Geralmente nesses sites com Chat's IM, quando o usuário 1 chama o usuario 2 para um papo, geralmente na tela do usuario 2 surge uma janela popup avisando da solicitação ou...

2 - Fazer igual ao MSN, Facebook, G-Talk, enfim...que...o usuário 1 escolhe um usuario qualquer(entre sua lista de amigos, é clado) e manda uma mensagem para ele, então...na tela do usuario escolhido, já aparece a janelinha com a mensagem do usuario 1, daí ele pode ou não responder a mensagem sem que, aja a necessidade de aparecer um alerta perguntando se você aceita ou não o pedido de conversa.

 

Tipo, no facebook, um amigo seu lhe manda uma mensagem...e o facebook já abre um popup com a mensagem enviada.

 

Bom...qualquer ajuda será bem vinda, seja lá qual das opções vier.

 

Bom...será que é muito complicado para fazer isso?

 

Abraços galera...e desde já...grato pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

~vou dar uma sugestão, mas não sei se é a melhor. Afinal, sou o tipo de pessoa q tenta resolver tudo sozinho e dps acabo perdendo no desempenho :s

 

uma vez eu fiz o seguinte: criei uma tabela new_talk, nela coloquei 2 chaves estrangeiras(id_destino, id_mensagem) e uma coluna lido do tipo boolean... quando o usuário enviava uma mensagem eu armazenava a mensagem na tabela talk e o id e destino na tabela new_talk com lido false;

 

então fiz, na página principal, verificar se tinha o id do usuário q ta logado na tabela new_talk de 5 em 5 segundos e q tivesse lido com false; se sim eu dava um update para true e fazia aparecer um box com a mensagem.

 

da também pra deixar apenas o id de talk e id_destino na tabela new_talk e toda vez q verificar q o usuário q ta logado tiver o id dele na tabela new_talk, excluir aquela linha e assim a tabela new_talk não ficaria enorme...

 

o id do remetente da mensagem ficava armazenado na tabela talk(id, id_remetente, id_destino, mensagem, date);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Grande Jhon Paulo, beleza cara???

 

Bom...primeiramente tenho que lhe agradecer por sua ajuda...suas ideias são ótimas...essa que você deu aí em cima(a ideia ok....a ideia...rsss), eu tava meio que...na metade dela sem saber como continuar...daí você veio e...me esclareceu alguns pontos e...fiz o que você falou aí e...tá funcionando tudo legal...

 

Em relação à tabela new_talk ficar muito grande, eu ainda não fiz, mas...irei começar a fazer agora.

A ideia é a seguinte...toda vez que ele buscar um novo registro na tela new_talk, após ter marcado a msg como lido, eu faço um delete de todos os registros onde o campo lido está como true e o id do destinatario seja igual ao do usuario logado.

Assim, o próprio usuário irá deletando apenas os seus proprios registros...enfim...acho que vai funfar assim.

 

Agora..já que...você é bom das ideias...me diga uma coisa...

Como eu faço para saber, através do banco de dados se um usuario tá on-line ou não?

Na verdade, é o seguinte, como eu já disse em um outro topico(você participou dele também), é um site de relacionamentos...e eu preciso saber quais usuarios estão on-line, daí os que tiver, eu coloco uma imagem/botão falando que tal usuario está on-line, daí eu posso chamar ele para conversar.

 

Bom...a explicação ficou meio grande, mas...a ideia é basica: Apenas saber quais usuarios estão on-line.

 

 

Abraços e...desde já...agradeço pela sua atenção...você ajudou bastante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

velho pra te falar a verdade deve ter maneiras de configurar o servidor pra fazer inúmeras coisas úteis como essa, mas como não entendo nada de servidor eu tenho umas dicas :D

 

tipo, você faz um novo campo na tabela usuario(junto com o login, senha, etc.) e põe lá online(algo assim) do tipo datetime... ahh e lógico põe um campo pra saber se ele quer conversar com alguém né :D

 

então toda vez que o usuário for verificar se tem alguma atualização pra ele no site, ele atualiza o campo online para a hora e a data atual. (agora vai de acordo com o tempo q você colocou pra ver se tem novas mensagens).

 

ai pra saber se uma pessoa está online você verifica se ela atualizou o campo nos últimos 10 segundos, supondo que o tempo q é pra verificar se tem mensagens é 5 segundos. Se ela atualizou, com certeza ela está online.

 

isso foi só pra você ter uma idéia. devem ter inúmeras maneiras de se fazer isso, eu pensei nisso, pode vim outro e pensar de outra maneira melhor. :clap:

 

 

ahh.. tenho uma dica aki pro new_talk.

- o cara que recebeu a mensagem coloca lido como true.

- o usuário q mandou a mensagem vai saber que o destinatário já leu.

- então oq enviou vai deletar a mensagem no new_talk pois não terá mais serventia.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E aí Jhon Paulo, beleza cara?

 

Bom...quero lhe agradecer por todas as suas dicas e principalmente, por sua atenção, obrigado mesmo cara.

 

Bom...fiz o que você falou à risca...rsss...e deu tudo certo...tá funcionando legal...

A cada nova msg, o sistema verifica os registros na tabela new_talk e deleta os já lidos

Criei uma tabela online e nela coloco os registros de id e login os usuários que estão logados e com sessão ativa, juntamente com um campo chamado tempo, então...como você disse...o sistema faz atualização dessa tabela de 20 em 20 segundos, e o usuário que não atualizou a tabela online nos últimos 20 segundos significa que ele não está em nenhum lugar do site...então...como o sistema deleta registros maiores que 20 segundos...então só ficará quem realmente estiver perambulando pelo site.

 

Bom...o sistema teste está meio simplesinho...e preciso organizar ele...aí...depois que estiver tudo ok...vou criar um post aki com um passo-a-passo para a galera...pq...modestia à parte...ficou muito bom e bem simples esse sistema de IM.

 

Se alguem quiser, pode está solicitando que eu envio por e-mail ou algo do tipo, como eu disse...ainda vou melhora-lo para depois disponibilizar aqui.

 

Amigo...um grande abraço...você foi de grande ajuda...

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu tenho só uma dica sobre as solicitações pra ver se tem mensagem. Consiste no seguinte:

 

Você ta pedindo o servidor de 20 em 20 segundos pra saber se tem novas mensagens. (ta toda hora consumindo o tráfigo do servidor)

 

se você usar o modelo server push, você pedirá o servidor uma coisa e ele só te responde a hora q tiver essa coisa. Entendeu? (aprendi isso ontem :D. vivendo e aprendendo, né.)

 

Em vez de você ficar falando: 'tem alguma coisa pra mim?' de 20 em 20 segundos, você pede uma vez só. Depois espera o servidor responder.

 

-atahh, como eu faço isso?

 

É bem simples. Você faz um script pra pedir informações via ajax ao servidor, esse ajax só vai pedir informações novamente a hora q a resposta do servidor chegar:

<!doctype HTML>
<html>
       <head>
               <title>Long Pooling Test</title>
               <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
               <script type="text/javascript">
                       var user_id = 1; //id do usuário que ta buscando a mensagem

					//função para buscar novas mensagens
                       function waitForMessage() {
                               $.ajax({
                                       type: 'POST',
                                       data: {'user_id' : user_id}, //enviamos o id para a página chat.php
                                       url: 'chat_server.php',
                                       cache: false,
                                       dataType: 'json',
                                       success: function(json) {
									    mensagem = 'id_usuario: '+json.id+', nome: '+json.nome+', foto: '+json.foto+', mensagem: 'json.mensagem;
										document.getElementById('talk_box').append(mensagem);
                                           setTimeout(waitForMessage, 500); // espera meio segundo pra buscar novas mensagens
                                       }                                       
                               });
                       }                       
                       $(document).ready(waitForMessage); // após carregamento da pagina chama a função
               </script>
       </head>
       <body>
			<!-- janela do chat -->
               <div id="talk_box"></div>
       </body>
</html>

 

e o servidor, por sua vez, só irá retornar informações a hora que tiver alguma pra retornar:

 

<?php

// se tiver o _POST['user_id'] eu passo para a variavel $user_id, se não, eu interrompo a conexão
$user_id = isset($_POST['user_id'] ? $_POST['user_id'] : die()); // acho que da pra fazer isso nunca tentei rsrs'

$retornar_informacoes = false; // não tenho informações pra retornar ainda

//o segredo esta nesse while
while($retornar_informacoes===false) { //enquanto não tiver informaçoes para retornar, vai ficar buscando. :D

       usleep(300000); // dorme 300ms para poupar o servidor; pode ser mais ou menos;

       clearstatcache(); // limpa o cache

	//nova consulta ao banco de dados
	// pego id do remetente, nome, foto e a mensagem
       $select = $banco->query("select u.id, u.nome, u.foto, t.mensagem from new_talk as n inner join talk as t on (t.id=n.id_talk) inner join usuario as u on (u.id=t.id_remetente) where n.id_destino=$user_id and n.lido=false");

	$cont = count($select->fetchAll()); // vejo o número de linhas afetadas pela query


	if ($cont>0) { //se tiver pelo menos uma linha afetada

		$mensagem=$select->fetchAll(PDO::FETCH_ASSOC); // pego todos os resultados como um array associativo 

		$retornar_informacoes=true; //temos informações para retornar (agora irá sair do while)

	}
}

echo json_encode($mensagem); // retorna as informações
?>

é bem simples, tentei resumir o máximo possível como me foi passado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa...vou estudar essa parada aí para ver como funciona, pq...você acertou bem em cima de algo que eu muito preocupado...que é essa requisição ao servidor constantemente...

 

Analisando aqui...

 

Voltarei com mais informações assim que eu fazer alguns testes ok.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Jhon Paulo, beleza cara?

 

Bom...eu havia dito na mensagem anterior...eu estava muito preocupado em relação à requisição ao servidor, isso seria um grande problema.

Apenas para testar...coloquei os meus testes(sem o Server Push) e...cara...apenas com alguns poucos usuários o servidor ficou super lento... e o servidor é um VPS até consideravel em desempenho.

 

Enfim...dei uma olhada neste seu exemplo aí, mas...não entendi muita coisa(procurei na net, dizem que é simples, mas a implementação é meio complicada...ou sou eu que não entendi mesmo...sei lá...rsss).

 

Fiz algumas alterações pq...eu nunca trabalhei com PDO, enfim...será que...você pode me dar alguma ajudinha à mais? Pq estou meio rodado...rsss

 

SQL

 

CREATE TABLE `msg` (
 `id_msg` int(11) NOT NULL AUTO_INCREMENT,
 `id_usuLogado` int(11) NOT NULL,
 `id_usuSelecionado` int(11) DEFAULT NULL,
 `msg_mensagens` varchar(1000) DEFAULT NULL,
 `msg_data` varchar(8) DEFAULT NULL,
 `msg_hora` varchar(20) DEFAULT NULL,
 PRIMARY KEY (`id_msg`),
 UNIQUE KEY `id_msg` (`id_msg`)
) ENGINE=InnoDB;

 

chat.php

 

<!doctype HTML>
<html>
       <head>
               <title>Long Pooling Test</title>
               <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
               <script type="text/javascript">
                       var user_id = 1; //id do usuário que ta buscando a mensagem

                                               //função para buscar novas mensagens
                       function waitForMessage() {
                               $.ajax({
                                       type: 'POST',
                                       data: {'user_id' : user_id}, //enviamos o id para a página chat.php
                                       url: 'chat_server.php',
                                       cache: false,
                                       dataType: 'json',
                                       success: function(json) {
                                                                                   mensagem = 'id_usuLogado: '+json.id+', msg_mensagens: 'json.mensagem;
                                                                                       document.getElementById('talk_box').append(mensagem);
                                           setTimeout(waitForMessage, 500); // espera meio segundo pra buscar novas mensagens
                                       }                                       
                               });
                       }                       
                       $(document).ready(waitForMessage); // após carregamento da pagina chama a função
               </script>
       </head>
       <body>
                               <!-- janela do chat -->
               <div id="talk_box"></div>
       </body>
</html>

 

chat_server.php

<?php
//Na variavel $user_id, coloquei um valor manualmente apenas para teste ok...tipo...para ver se...ele consulta mesmo no banco...e consulta...agora retornar para a outra tela...que é o chat.php...aí eu já não sei como...

mysql_connect('localhost', 'root', 'root');
mysql_select_db('im');

// se tiver o _POST['user_id'] eu passo para a variavel $user_id, se não, eu interrompo a conexão
$user_id = 1;

       $retornar_informacoes = true;


$retornar_informacoes = false; // não tenho informações pra retornar ainda

//o segredo esta nesse while
while($retornar_informacoes===false) { //enquanto não tiver informaçoes para retornar, vai ficar buscando. :D

       usleep(300000); // dorme 300ms para poupar o servidor; pode ser mais ou menos;

       clearstatcache(); // limpa o cache

               //nova consulta ao banco de dados
               // pego id do remetente, nome, foto e a mensagem
       $select = mysql_query("select msg_mensagens from msg where id_usuLogado = ".$user_id."");

               $cont = mysql_numrows($select); // vejo o número de linhas afetadas pela query


               if ($cont>0) { //se tiver pelo menos uma linha afetada

                       $mensagem= mysql_fetch_assoc($select); // pego todos os resultados como um array associativo 

                       $retornar_informacoes=true; //temos informações para retornar (agora irá sair do while)

               }
}

echo $mensagem["msg_mensagens"]; // retorna as informações
?>

 

Bom...como pode ver...tentei fazer bem simples mesmo, para ver se funfa, mas...sinceramente...não faço a minima ideia de como fazer isso...rsss

 

Alguma ajudinha??

 

Grato deste já...

Compartilhar este post


Link para o post
Compartilhar em outros sites
procurei na net, dizem que é simples, mas a implementação é meio complicada

não, não, é muito simples.

 

uma simples implementação:

[tabela: im]

id (int)
id_remetente(int)
id_destino(int)
mensagem (varchar 500)
lida (int)

 

chat.php

<!doctype HTML>
<html>
   <head>
       <title>Long Pooling Test</title>
       <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
       <script type="text/javascript">
           var user_id = 1; //id do usuário que ta buscando a mensagem

		//função para buscar novas mensagens
           function waitForMessage() {
               $.ajax({
                   type: 'POST',
                   data: {'user_id' : user_id}, //enviamos o id para a página chat.php
                   url: 'chat_server.php',
                   cache: false,
                   dataType: 'html',
                   success: function(json) {
					alert(json);
					$('#talk_box').append(json);
                       setTimeout(waitForMessage, 500); // espera meio segundo pra buscar novas mensagens
                   }                                       
               });
           }                       
           $(document).ready(waitForMessage); // após carregamento da pagina chama a função
       </script>
   </head>
   <body>
       <!-- janela do chat -->
       <div id="talk_box"></div>
   </body>
</html>

 

chat_server.php

<?php
//Na variavel $user_id, coloquei um valor manualmente apenas para teste ok...tipo...para ver se...ele consulta mesmo no banco...e consulta...agora retornar para a outra tela...que é o chat.php...aí eu já não sei como...

$host="localhost";
$adm="root";
$pw="";
$db="seubanco";
$server=mysql_connect($host,$adm,$pw) or die ("não foi possível conectar ao servidor");
$banco=mysql_select_db ($db,$server) or die ("não foi possível conectar ao banco $db");

$user_id = 1; //id q irá verificar se tem novas mensagens
set_time_limit(99999999); // pra não cair a conexão após 30 segundos

$retornar_informacoes = false; // não tenho informações pra retornar ainda

//o segredo esta nesse while
do { //enquanto não tiver informaçoes para retornar, vai ficar buscando. :D

       usleep(300); // dorme 300ms para poupar o servidor; pode ser mais ou menos;

       clearstatcache(); // limpa o cache

       //nova consulta ao banco de dados
       // pego id do remetente, nome, foto e a mensagem
       $select = mysql_query("select id, mensagem from im where id_destino=$user_id AND lida=0");

       $cont = mysql_num_rows($select); // vejo o número de linhas afetadas pela query

       if ($cont>0) { //se tiver pelo menos uma linha afetada

           $mensagem= mysql_fetch_assoc($select); // pego todos os resultados como um array associativo 
		$id_mensagem = $mensagem['id']; // pego o id da mensagem que foi encontrada
           $update = mysql_query("UPDATE `im` SET `lida` = '1' WHERE `id` = $id_mensagem"); // dou um update pra falar que a mensagem já foi lida
           $retornar_informacoes=true; //temos informações para retornar (agora irá sair do while)

       }
} while($retornar_informacoes===false); // irá dar um loop novamente, até que tenha informações

echo ("você recebeu a mensagem: " . $mensagem["mensagem"] . "<br>"); // retorna as informações
?>

 

pra testar, você entra na página chat.php e deixa ela aberta;

daí você vai no seu banco de dados e cria uma nova mensagem na tabela im com id_destino=1 e lida=0;

após você executar a inserção no banco de dados, notará que a mensagem já estará aparecendo na página chat.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.