vtigerossez/modules/Home/chat.php

381 lines
10 KiB
PHP

<?php
/*
Copyright 2005 Rolando Gonzalez (rolosworld@gmail.com)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**** config *****/
/**
* MySQL server configuration
*/
include_once('config.php');
require_once('include/utils/utils.php');
$db = array();
$db['host'] = $dbconfig['db_server']."".$dbconfig['db_port'];
$db['user'] = $dbconfig['db_username'];
$db['pass'] = $dbconfig['db_password'];
$db['database'] = $dbconfig['db_name'];
/**
* Constants for the chat
*/
$chat_conf = array();
$chat_conf['alive_time'] = "30"; // time users should report to be online, in seconds.
$chat_conf['msg_limit'] = "10"; // maximum msg's to send in one request.
/*************************************************************/
/*** YOU SHOULD NOT NEED TO EDIT ANYTHING ELSE BELOW THIS. ***/
/*************************************************************/
session_name("AjaxPopupChat");
//session_save_path("sessions");
session_start();
$dbh = mysql_connect($db['host'], $db['user'],$db['pass']) or die ('I cannot connect to the database');
mysql_select_db($db['database']);
function mysqlQuery($query)
{
$result = mysql_query($query);
if(!$result)
{
die("DB Error.<br />\n".mysql_error()."<br />\n".$query);
}
return $result;
}
/**** handler *****/
/**
* Chat object
*/
class Chat
{
// stores the string to be returned
var $json;
function Chat()
{
global $adb;
$this->json = '';
// las message id received by user
if(!isset($_SESSION["mlid"]))
{
$res = $adb->pquery("show table status like 'vtiger_chat_msg'", array());
$line = $adb->fetch_array($res);
if(intval($line['Auto_increment']) == 0)
$_SESSION["mlid"] = 0;
else
$_SESSION["mlid"] = intval($line['Auto_increment']) - 1;
}
// when the las user list was sended.
if(!isset($_SESSION["lul"]))
{
$_SESSION["lul"] = 0;
}
// check if user is active.
if(!isset($_SESSION['chat_user']))
{
$this->setUserNick();
}
else
{
$res = $adb->pquery("update vtiger_chat_users set ping=now() where session=?", array(session_id()));
if($adb->getAffectedRowCount($res) == 0)
{
$this->setUserNick();
}
}
switch($_POST['submode'])
{
// request all the json data at once.
case 'get_all':
global $chat_conf;
$this->lastMsgId();
$this->json = '[%s]';
$this->getAllPVChat();
$pvchat = $this->json;
$this->json = '[%s]';
$this->getPubChat();
$pchat = $this->json;
$this->json = '';
if(time() - $_SESSION["lul"] > $chat_conf['alive_time'])
{
$_SESSION["lul"] = time();
$this->json = '[%s]';
$this->getUserList();
}
$ulist = $this->json;
$tmp = array();
$this->json = '{%s}';
if(strlen($ulist) > 0)
$tmp[] = '"ulist":'.$ulist;
if(strlen($pvchat) > 0)
$tmp[] = '"pvchat":'.$pvchat;
if(strlen($pchat) > 0)
$tmp[] = '"pchat":'.$pchat;
$this->json = sprintf($this->json, implode(',',$tmp));
break;
// user is submiting a msg
case 'submit':
$this->submit($_POST['msg'],intval($_POST['to']));
break;
// user closed a private chat
case 'pvclose':
$this->pvClose(intval($_POST['to']));
break;
default:
break;
}
}
/**
* returns the JSON created
*/
function getAJAX()
{
return $this->json;
}
/**
* Sets the user initial nickname.
*/
function setUserNick()
{
global $current_user, $adb;
$res = $adb->pquery("select id from vtiger_chat_users where session=?", array(session_id()));
if($adb->num_rows($res) > 0)
{
$line = $adb->fetch_array($res);
$_SESSION['chat_user'] = $line['id'];
return;
}
$res = $adb->pquery("show table status like 'vtiger_chat_users'", array());
$line = $adb->fetch_array($res);
if(intval($line['Auto_increment']) == 0)
$line['Auto_increment'] = 1;
$_SESSION['chat_user'] = $line['Auto_increment'];
$sql = "insert into vtiger_chat_users(nick,session,ping,ip) values (?,?, now(), ?)";
$params = array($current_user->user_name, session_id(), $_SERVER['REMOTE_ADDR']);
$res = $adb->pquery($sql, $params);
}
/**
* generate the available users list
*/
function getUserList()
{
global $chat_conf, $adb;
$tmp = '';
$sql = "delete from vtiger_chat_users where ((unix_timestamp(now())-unix_timestamp(ping))>?)";
$params = array($chat_conf['alive_time']);
$res = $adb->pquery($sql, $params);
$res = $adb->pquery("select id,nick from vtiger_chat_users", array());
if($adb->num_rows($res)==0)
{
$this->json = '';
return;
}
while($line = $adb->fetch_array($res))
{
if($line['id'] != $_SESSION['chat_user'])
$tmp .= '{"uid":'.$line['id'].',"nick":"'.$line['nick'].'"},';
}
$tmp = trim($tmp,',');
$this->json = sprintf($this->json,$tmp);
}
/**
* Sets user last post received.
*/
function lastMsgId()
{
if(isset($_POST['mlid']) && intval($_POST['mlid']) > $_SESSION["mlid"])
$_SESSION["mlid"] = intval($_POST['mlid']);
}
/**
* generates the private chat data
*/
function getAllPVChat()
{
global $chat_conf, $adb;
$format = '{"mlid":%s,"chat":%s,"from":"%s","msg":"%s"},';
$sql ="select ms.id mid,ms.chat_from mfrom,ms.chat_to mto,pv.id id,us.nick `chat_from`,ms.msg msg from vtiger_chat_users us,vtiger_chat_pvchat pv,vtiger_chat_msg ms where pv.msg=ms.id and us.id=ms.chat_from and ms.id>? and ((ms.chat_from=? and ms.chat_to>0) or (ms.chat_to=? and ms.chat_from>0)) order by ms.born limit 0, " . $chat_conf['msg_limit'];
$params = array($_SESSION['mlid'], $_SESSION['chat_user'], $_SESSION['chat_user']);
$res = $adb->pquery($sql, $params);
if($adb->num_rows($res)==0)
{
$this->json = '';
return;
}
$tmp = '';
while($line = $adb->fetch_array($res))
{
if($line['mfrom'] == $_SESSION['chat_user'])
$cid = $line['mto'];
else
$cid = $line['mfrom'];
$tmp .= sprintf($format,$line['mid'],$cid,$line['chat_from'],addslashes($line['msg']));
}
$tmp = trim($tmp,',');
$this->json = sprintf($this->json,$tmp);
}
/**
* generates the public chat data
* NOTE: this is alpha
*/
function getPubChat()
{
global $chat_conf, $adb;
$format = '{"mlid":%s,"from":"%s","msg":"%s"},';
$sql = "select ms.id mid,ms.chat_from mfrom,ms.chat_to mto,p.id id,us.nick `chat_from`,ms.msg msg from vtiger_chat_users us,vtiger_chat_pchat p,vtiger_chat_msg ms where p.msg=ms.id and us.id=ms.chat_from and ms.id>? and ms.chat_to=0 order by ms.born limit 0," . $chat_conf['msg_limit'];
$params = array($_SESSION['mlid']);
$res = $adb->pquery($sql, $params);
if($adb->num_rows($res)==0)
{
$this->json = '';
return;
}
$tmp = '';
while($line = $adb->fetch_array($res))
{
$tmp .= sprintf($format,$line['mid'],$line['chat_from'],addslashes($line['msg']));
}
$tmp = trim($tmp,',');
$this->json = sprintf($this->json,$tmp);
}
/**
* Check for special commands on message.
*/
function msgParse($msg)
{
global $adb;
if(strlen($msg) == 0) return '';
$msg = stripslashes($msg);
if($msg[0] == '\\')
{
$today_date = getdate();
$words = explode(" ",$msg);
switch($words[0])
{
case '\nick':
if(isset($words[1]) && strlen($words[1]) > 3)
{
$res = $adb->pquery("select nick from vtiger_chat_users where id=?", array($_SESSION['chat_user']));
$line = $adb->fetch_array($res);
$res = $adb->pquery("update vtiger_chat_users set nick=? where id=?", array($words[1], $_SESSION['chat_user']));
$msg = '\sys <span class="sysb">'.$line['nick'].'</span> changed nick to <span class="sysb">'.$words[1].'</span>';
}
break;
case '\help':
$msg = '\sys <br><span class="sysb">\\\\nick "nickname" </span> - change nick<br><span class="sysb">\\\\date </span> - date<br><span class="sysb">\\\\time </span> - time<br><span class="sysb">\\\\month </span> - month<br><span class="sysb">\\\\day </span> - weekday';
break;
case '\date':
$msg = '\sys Today is <span class="sysb">'.date('d-m-Y').'</span>';
break;
case '\time':
$msg = '\sys The Current time is <span class="sysb">'.$today_date["hours"].':'.$today_date["minutes"].':'.$today_date["hours"].'</span>'; break;
case '\month':
$msg = '\sys <span class="sysb">'.$today_date["month"].'</span>';
break;
case '\day':
$msg = '\sys <span class="sysb">'.$today_date["weekday"].'</span>';
break;
default:
$msg = '\sys Bad command: '.$words[0];
break;
}
}
return $msg;
}
/**
* process a submited msg
*/
function submit($msg, $to=0)
{
global $adb;
//UTF-8 support added - ding
$msg = utf8RawUrlDecode($msg);
$msg = $this->msgParse($msg);
$msg = htmlentities($msg);
if(strlen($msg) == 0) return;
//$sql = "insert into vtiger_chat_msg set chat_from=?, chat_to=?, born=now(), msg=?";
$sql = "insert into vtiger_chat_msg(chat_from, chat_to, born, msg) values (?,?, now(), ?)";
$params = array($_SESSION['chat_user'], $to, $msg);
$res = $adb->pquery($sql, $params);
$chat = "p";
if($to != 0)
$chat .= "v";
$res = $adb->pquery("insert into vtiger_chat_".$chat."chat set msg=LAST_INSERT_ID()", array());
}
/**
* removes the private conversation msg's because someone closed it
*/
function pvClose($to)
{
global $adb;
$sql = "delete from vtiger_chat_msg where (`chat_from`=? and `chat_to`=?) or (`chat_from`=? and `chat_to`=?)";
$params = array($to, $_SESSION['chat_user'], $_SESSION['chat_user'], $to);
$res = $adb->pquery($sql, $params);
}
}
/**** caller ****/
$chat = new Chat();
echo $chat->getAJAX();
?>