Ir para conteúdo

POWERED BY:

Arquivado

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

arldin

Chat estilo facebook

Recommended Posts

Boa noite a todos e o seguinte eu tenho um script que cria um chat estilo facebook.

Abre um div com os usuarios abre uma janela para mensagens

amostra os usuarios que estão online, ate ai tudo certo.

Se eu me logo e deixo uma mensagem para um usuario que não

esta online, quando este usuario entrar no site abre a janela com a mensagem. ate ai tudo certo.

quando o usuario fechar esta janela deveria fazer uma mudança de estado de não lido para lido

Esta e a parte do script para mostrar os usuario e começar a conversa

<div style="width:85%;float: left;height:75px;top:0px;"> 
<div id="contatos">
<span class="online" id="<?php echo $_SESSION['id_user'];?>"></span>
	<ul>
	<?php
		$selecionar_se_users = BD::conn()->prepare("SELECT * FROM `se_users` WHERE id != ?");
		$selecionar_se_users->execute(array($_SESSION['id_user']));
		if($selecionar_se_users->rowCount() == 0){
			echo '<p>Desculpla, não há contatos ainda!</p>';
		}else{
		while($se_users = $selecionar_se_users->fetchObject()){
	?>
		<li><span class="type" id="<?php echo $se_users->id;?>"></span>
		<a href="javascript:void(0);" nome="<?php echo $se_users->user_fname;?>" id="<?php echo $se_users->id;?>" class="comecar">
		<img width=30 height=30 src="<?php echo $se_users->profImage;?>" id="<?php echo $uploadedimage; ?>" />  
		<?php echo $se_users->user_fname;?></a></li>
	<?php }}?>
	</ul>
</div>
<div style="position:absolute; top:0; right:0;" id="retorno"><div>
<div id="janelas"></div>

E este e o script que deveria fazer a mudança de status

<?php
 session_start();
	include_once "../config1.php";
	require_once('../classes/BD.class.php');
	BD::conn();

	$acao = $_POST['acao'];

	switch($acao){
		case 'inserir':
			$para = $_POST['para'];
			$mensagem = strip_tags($_POST['mensagem']);

			$pegar_user_fname = BD::conn()->prepare("SELECT user_fname FROM `se_users` WHERE id = ?");
			$pegar_user_fname->execute(array($_SESSION['id_user']));
			$ft = $pegar_user_fname->fetchObject();

			$inserir = BD::conn()->prepare("INSERT INTO `mensagens` (id_de, id_para, data, mensagem, lido) VALUES(?,?,NOW(),?,'0')");
			if($inserir->execute(array($_SESSION['id_user'], $para, $mensagem))){
				echo '<li><span>'.$ft->user_fname.' disse:</span><p>'.$mensagem.'</p></li>';
			}

		break;

		case 'verificar':
			$ids = (isset($_POST['ids'])) ? $_POST['ids'] : '';
			$users = (isset($_POST['users'])) ? $_POST['users'] : '';
			$retorno = array();

			if($users != ''){
				foreach($users as $indice => $id_u){
					$sel = BD::conn()->prepare("SELECT horario, limite FROM `se_users` WHERE id = ?");
					$sel->execute(array($id_u));
					$fet = $sel->fetchObject();

                    $atual = date('Y-m-d H:i:s');
					$mais1 = date('Y-m-d H:i:s', strtotime('+1 min'));

					if($id_u == $_SESSION['id_user']){
						$up = BD::conn()->prepare("UPDATE `se_users` SET limite = ? WHERE id = ?");
						$up->execute(array($mais1, $id_u));
					}

					if($atual >= $fet->limite)
						$retorno['useronoff'][$id_u] = 'off';
					else
						$retorno['useronoff'][$id_u] = 'on';

				}
			}

			if($ids == ''){
				$retorno['mensagens'] == '';
			}else{
				foreach($ids as $indice => $id){
					$selecionar = BD::conn()->prepare("SELECT * FROM `mensagens` WHERE id_de = ? AND id_para = ? OR id_de = ? AND id_para = ?");
					$selecionar->execute(array($_SESSION['id_user'], $id, $id, $_SESSION['id_user']));

					$mensagem = '';
					while($ft = $selecionar->fetchObject()){
						$user_fname = BD::conn()->prepare("SELECT user_fname FROM `se_users` WHERE id = ?");

						$user_fname->execute(array($ft->id_de));
						$user_fname = $user_fname->fetchObject();

						$mensagem .= '<li><span>'.$user_fname->user_fname.' disse:</span><p>'.$ft->mensagem.'</p></li>';
					}
					$retorno['mensagens'][$id] = $mensagem;
				}
			}

			$verificar = BD::conn()->prepare("SELECT id_de FROM `mensagens` WHERE id_para = ? AND lido = ? GROUP BY id_de");
			$verificar->execute(array($_SESSION['id_user'], 0));

            if($verificar->rowCount() == 0){
				if(isset($retorno['nao_lidos']))
                  $retorno['nao_lidos'] == '';
			}else{
				while($user = $verificar->fetchObject()){
					$retorno['nao_lidos'][] = $user->id_de;
				}
			}
			$retorno = json_encode($retorno);
			echo $retorno;
		break;
		
		case 'mudar_status':
			$user = $_POST['user'];
			$mudar_st = BD::conn()->prepare("UPDATE `mensagens` SET lido =`1` WHERE id_de = ? AND id_para = ?");
			$mudar_st->execute(array($user, $_SESSION['id_user']));
			

		break;
	}
?>

E também tem um js que e este

$(document).ready(function(){
var janelas = new Array();
var users = new Array();

	function add_janelas(id, nome){
		var html_add = '<div class="janela" id="jan_'+id+'"><div class="topo" id="'+id+'"><span>'+nome+'</span><a href="javascript:void(0);" id="fechar">X</a></div><div id="corpo"><div class="mensagens"><ul class="listar"></ul></div><input type="text" class="mensagem" id="'+id+'" maxlength="255" /></div></div>';
		$('#janelas').append(html_add);
	}
	
	function abrir_janelas(x){
		$('#contatos ul li a').each(function(){
			var link = $(this);
			var id = link.attr('id');
			
			if(id == x){
				link.click();
			}
		});
	}
	var antes = -1;
	var depois = 0;
	function verificar(){
		beforeSend: antes = depois;
		$('#contatos ul li a').each(function(){
			var id_u = $(this).attr('id');
			users.push(id_u);
		});
		var u_online = $('span.online').attr('id');
		users.push(u_online);

		$.post('sys/chat.php', {acao: 'verificar', ids: janelas, users: users}, function(x){
			
			if(x.nao_lidos != ''){
				var arr = x.nao_lidos;
				for(i in arr){
					abrir_janelas(arr[i]);
				}
			}
			
			if(janelas.length > 0){
				var mens = x.mensagens;
				if(mens != ''){
					for(i in mens){
						$('#jan_'+i+' ul.listar').html(mens[i]);
					}
				}
			}

			var users_onlines = x.useronoff;
			for(i in users_onlines){
				$('#contatos ul li span#'+i+'').removeClass('on off').addClass(users_onlines[i]);
			}

			depois += 1;
			
		}, 'jSON');
			
	}
	verificar();
	
	
	$('.janela').on('click', function(){
		var id = $(this).children('.topo').attr('id');
		$.post('sys/chat.php',{acao: 'mudar_status', user: id});
	});
	
	$('body').on('click', '.comecar', function(){
		var id = $(this).attr('id');
		var nome = $(this).attr('nome');
		janelas.push(id);
		for(var i = 0; i < janelas.length; i++){
			if(janelas[i] == undefined){
				janelas.splice(i, 1);
				i--;
			}
		}
		
		add_janelas(id, nome);
		$(this).removeClass('comecar');
		return false;
	});
	
	$('body').on('click', 'a#fechar', function(){
		var id = $(this).parent().attr('id');
		var parent = $(this).parent().parent().hide();
		$('#contatos a#'+id+'').addClass('comecar');
		
		var n = janelas.length;
		for(i = 0; i < n; i++){
			if(janelas[i] != undefined){
				if(janelas[i] == id){
					delete janelas[i];
				}
			}
		}verificar();

		$.post('sys/chat.php',{acao: 'mudar_status', user: id});
	});
	
	$('body').delegate('.topo', 'click', function(){
		var pai = $(this).parent();
		var isto = $(this);
		
		if(pai.children('#corpo').is(':hidden')){
			isto.removeClass('fixar');
			pai.children('#corpo').toggle(100);
		}else{
			isto.addClass('fixar');
			pai.children('#corpo').toggle(100);
		}
	});
	
	setInterval(function(){
		if(antes != depois){
			verificar();
		}
	}, 2000);
})

como posso resolver isto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver o erro estava nesta parte

case 'mudar_status':
			$user = $_POST['user'];
			$mudar_st = BD::conn()->prepare("UPDATE `mensagens` SET lido =`1` WHERE id_de = ? AND id_para = ?");
			$mudar_st->execute(array($user, $_SESSION['id_user']));
			

fiz a mudança para

case 'mudar_status':
			$user = $_POST['user'];
			$mudar_st = BD::conn()->prepare("UPDATE `mensagens` SET `lido`='1' WHERE `id_de` = ? AND `id_para`= ?");
			$mudar_st->execute(array($user, $_SESSION['id_user']));
			

Agora muda o stats

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.