0byt3m1n1
Path:
/
data
/
applications
/
aps.bak
/
vtiger
/
5.0.4
/
standard
/
htdocs
/
modules
/
Home
/
[
Home
]
File: chat.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); 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(); ?>