Replace database functions with Database class methods

This commit is contained in:
Dmitriy Simushev 2012-07-13 12:56:50 +00:00
parent 12883cfbe2
commit 3e4163cbfe
40 changed files with 1003 additions and 909 deletions

View File

@ -22,13 +22,11 @@ require_once('libs/groups.php');
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
if($referer && isset($_SESSION['threadid'])) {
$link = connect();
$thread = thread_by_id_($_SESSION['threadid'], $link);
$thread = thread_by_id($_SESSION['threadid']);
if ($thread && $thread['istate'] != $state_closed) {
$msg = getstring2_("chat.client.visited.page", array($referer), $thread['locale']);
post_message_($thread['threadid'], $kind_for_agent,$msg,$link);
post_message_($thread['threadid'], $kind_for_agent,$msg);
}
close_connection($link);
}
$image = verifyparam(isset($_GET['image']) ? "image" : "i", "/^\w+$/", "webim");

View File

@ -94,50 +94,46 @@ if( !isset($_GET['token']) || !isset($_GET['thread']) ) {
exit;
}
$link = connect();
$invitation_state = invitation_state($_SESSION['visitorid'], $link);
$invitation_state = invitation_state($_SESSION['visitorid']);
$visitor_is_invited = $settings['enabletracking'] && $invitation_state['invited'] && !$invitation_state['threadid'];
if($settings['enablepresurvey'] == '1' && !(isset($_POST['survey']) && $_POST['survey'] == 'on') && !$visitor_is_invited) {
$page = array();
setup_logo($group);
setup_survey($visitor['name'], $email, $groupid, $info, $referrer);
expand("styles/dialogs", getchatstyle(), "survey.tpl");
close_connection($link);
exit;
}
$remoteHost = get_remote_host();
$userbrowser = $_SERVER['HTTP_USER_AGENT'];
if(!check_connections_from_remote($remoteHost, $link)) {
close_connection($link);
if(!check_connections_from_remote($remoteHost)) {
die("number of connections from your IP is exceeded, try again later");
}
$thread = create_thread($groupid,$visitor['name'], $remoteHost, $referrer,$current_locale,$visitor['id'], $userbrowser,$state_loading,$link);
$thread = create_thread($groupid,$visitor['name'], $remoteHost, $referrer,$current_locale,$visitor['id'], $userbrowser,$state_loading);
$_SESSION['threadid'] = $thread['threadid'];
$operator = invitation_accept($_SESSION['visitorid'], $thread['threadid'], $link);
$operator = invitation_accept($_SESSION['visitorid'], $thread['threadid']);
if ($operator) {
$operator = operator_by_id_($operator, $link);
$operator = operator_by_id($operator);
$operatorName = ($current_locale == $home_locale) ? $operator['vclocalename'] : $operator['vccommonname'];
post_message_($thread['threadid'], $kind_for_agent, getstring2('chat.visitor.invitation.accepted', array($operatorName)), $link);
post_message_($thread['threadid'], $kind_for_agent, getstring2('chat.visitor.invitation.accepted', array($operatorName)));
}
if( $referrer ) {
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.came.from',array($referrer)),$link);
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.came.from',array($referrer)));
}
post_message_($thread['threadid'],$kind_info,getstring('chat.wait'),$link);
post_message_($thread['threadid'],$kind_info,getstring('chat.wait'));
if($email) {
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.email',array($email)),$link);
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.email',array($email)));
}
if($info) {
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.info',array($info)),$link);
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.info',array($info)));
}
if($firstmessage) {
$postedid = post_message_($thread['threadid'],$kind_user,$firstmessage,$link,$visitor['name']);
commit_thread( $thread['threadid'], array('shownmessageid' => $postedid), $link);
$postedid = post_message_($thread['threadid'],$kind_user,$firstmessage,$visitor['name']);
commit_thread( $thread['threadid'], array('shownmessageid' => $postedid));
}
close_connection($link);
}
$threadid = $thread['threadid'];
$token = $thread['ltoken'];

View File

@ -231,9 +231,12 @@ function create_table($id, $link)
mysql_query($query, $link) or show_install_err(' Query failed: ' . mysql_error($link));
if ($id == "${mysqlprefix}chatoperator") {
create_operator_("admin", "", "", "Administrator", "Administrator", "", $link);
create_operator("admin", "", "", "Administrator", "Administrator", "");
} else if ($id == "${mysqlprefix}chatrevision") {
perform_query("INSERT INTO ${mysqlprefix}chatrevision VALUES (1)", $link);
$result = mysql_query("INSERT INTO ${mysqlprefix}chatrevision VALUES (1)", $link);
if (! $result) {
die(' Query failed: ' . mysql_error($link));
}
}
}

View File

@ -30,19 +30,17 @@ function store_message($name, $email, $info, $message,$groupid,$referrer) {
$remoteHost = get_remote_host();
$userbrowser = $_SERVER['HTTP_USER_AGENT'];
$visitor = visitor_from_request();
$link = connect();
$thread = create_thread($groupid,$name,$remoteHost,$referrer,$current_locale,$visitor['id'], $userbrowser,$state_left,$link);
$thread = create_thread($groupid,$name,$remoteHost,$referrer,$current_locale,$visitor['id'], $userbrowser,$state_left);
if( $referrer ) {
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.came.from',array($referrer)),$link);
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.came.from',array($referrer)));
}
if($email) {
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.email',array($email)),$link);
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.email',array($email)));
}
if($info) {
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.info',array($info)),$link);
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.info',array($info)));
}
post_message_($thread['threadid'],$kind_user,$message,$link,$name);
close_connection($link);
post_message_($thread['threadid'],$kind_user,$message,$name);
}
$groupid = "";
@ -121,9 +119,7 @@ if (empty($inbox_mail)) {
}
if($inbox_mail) {
$link = connect();
webim_mail($inbox_mail, $email, $subject, $body, $link);
close_connection($link);
webim_mail($inbox_mail, $email, $subject, $body);
}
setup_logo($group);

View File

@ -17,47 +17,54 @@
function load_canned_messages($locale, $groupid)
{
global $mysqlprefix;
$link = connect();
$query = "select id, vctitle, vcvalue from ${mysqlprefix}chatresponses " .
"where locale = '" . $locale . "' AND (" .
($groupid
? "groupid = $groupid"
: "groupid is NULL OR groupid = 0") .
") order by vcvalue";
$result = select_multi_assoc($query, $link);
close_connection($link);
return $result;
$db = Database::getInstance();
$values = array(':locale' => $locale);
if ($groupid) {
$values[':groupid'] = $groupid;
}
return $db->query(
"select id, vctitle, vcvalue from {chatresponses} " .
"where locale = :locale AND (" .
($groupid ? "groupid = :groupid" : "groupid is NULL OR groupid = 0") .
") order by vcvalue",
$values,
array('return_rows' => Database::RETURN_ALL_ROWS)
);
}
function load_canned_message($key)
{
global $mysqlprefix;
$link = connect();
$result = select_one_row("select vctitle, vcvalue from ${mysqlprefix}chatresponses where id = $key", $link);
close_connection($link);
$db = Database::getInstance();
$result = $db->query(
"select vctitle, vcvalue from {chatresponses} where id = ?",
array($key),
array('return_rows' => Database::RETURN_ONE_ROW)
);
return $result ? $result : null;
}
function save_canned_message($key, $title, $message)
{
global $mysqlprefix;
$link = connect();
perform_query("update ${mysqlprefix}chatresponses set vcvalue = '" . db_escape_string($message, $link) . "', " .
"vctitle = '" . db_escape_string($title, $link) . "' " .
"where id = $key", $link);
close_connection($link);
$db = Database::getInstance();
$db->query(
"update {chatresponses} set vcvalue = ?, vctitle = ? where id = ?",
array($message, $title, $key)
);
}
function add_canned_message($locale, $groupid, $title, $message)
{
global $mysqlprefix;
$link = connect();
perform_query("insert into ${mysqlprefix}chatresponses (locale,groupid,vctitle,vcvalue) values ('$locale'," .
($groupid ? "$groupid, " : "null, ") .
"'" . db_escape_string($title, $link) . "', " .
"'" . db_escape_string($message, $link) . "')", $link);
close_connection($link);
$db = Database::getInstance();
$db->query(
"insert into {chatresponses} (locale,groupid,vctitle,vcvalue) " .
"values (?, ?, ?, ?)",
array(
$locale,
($groupid ? $groupid : "null"),
$title,
$message
)
);
}
?>

View File

@ -50,36 +50,40 @@ function next_token()
return rand(99999, 99999999);
}
function next_revision($link)
function next_revision()
{
global $mysqlprefix;
perform_query("update ${mysqlprefix}chatrevision set id=LAST_INSERT_ID(id+1)", $link);
$val = db_insert_id($link);
$db = Database::getInstance();
$db->query("update {chatrevision} set id=LAST_INSERT_ID(id+1)");
$val = $db->insertedId();
return $val;
}
function post_message_($threadid, $kind, $message, $link, $from = null, $utime = null, $opid = null)
/**
* @todo Think about post_message_ and post_message diffrence
*/
function post_message_($threadid, $kind, $message, $from = null, $utime = null, $opid = null)
{
global $mysqlprefix;
$query = sprintf(
"insert into ${mysqlprefix}chatmessage (threadid,ikind,tmessage,tname,agentId,dtmcreated) values (%s, %s,'%s',%s,%s,%s)",
$db = Database::getInstance();
$query = "insert into {chatmessage} " .
"(threadid,ikind,tmessage,tname,agentId,dtmcreated) " .
"values (?,?,?,?,?,".($utime?"FROM_UNIXTIME(?)":"CURRENT_TIMESTAMP").")";
$values = array(
$threadid,
$kind,
db_escape_string($message, $link),
$from ? "'" . db_escape_string($from, $link) . "'" : "null",
$opid ? $opid : "0",
$utime ? "FROM_UNIXTIME($utime)" : "CURRENT_TIMESTAMP");
perform_query($query, $link);
return db_insert_id($link);
$message,
($from ? $from : "null"),
($opid ? $opid : 0)
);
if ($utime) {
$values[] = $utime;
}
$db->query($query, $values);
return $db->insertedId();
}
function post_message($threadid, $kind, $message, $from = null, $agentid = null)
{
$link = connect();
$id = post_message_($threadid, $kind, $message, $link, $from, null, $agentid);
close_connection($link);
return $id;
return post_message_($threadid, $kind, $message, $from, null, $agentid);
}
function prepare_html_message($text, $allow_formating)
@ -127,16 +131,23 @@ function message_to_text($msg)
function get_messages($threadid, $meth, $isuser, &$lastid)
{
global $kind_for_agent, $kind_avatar, $webim_encoding, $mysqlprefix;
$link = connect();
global $kind_for_agent, $kind_avatar, $webim_encoding;
$db = Database::getInstance();
$query = sprintf(
"select messageid,ikind,unix_timestamp(dtmcreated) as created,tname,tmessage from ${mysqlprefix}chatmessage " .
"where threadid = %s and messageid > %s %s order by messageid",
$threadid, $lastid, $isuser ? "and ikind <> $kind_for_agent" : "");
$msgs = $db->query(
"select messageid,ikind,unix_timestamp(dtmcreated) as created,tname,tmessage from {chatmessage} " .
"where threadid = :threadid and messageid > :lastid " .
($isuser ? "and ikind <> {$kind_for_agent} " : "") .
"order by messageid",
array(
':threadid' => $threadid,
':lastid' => $lastid,
),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
$messages = array();
$msgs = select_multi_assoc($query, $link);
foreach ($msgs as $msg) {
$message = "";
if ($meth == 'xml') {
@ -159,7 +170,6 @@ function get_messages($threadid, $meth, $isuser, &$lastid)
}
}
close_connection($link);
return $messages;
}
@ -355,15 +365,12 @@ function setup_groups_select($groupid, $markoffline)
{
global $settings;
$link = connect();
$showgroups = ($groupid == '')?true:group_has_children($groupid, $link);
$showgroups = ($groupid == '')?true:group_has_children($groupid);
if (!$showgroups) {
close_connection($link);
return false;
}
$allgroups = get_groups($link, false);
close_connection($link);
$allgroups = get_groups(false);
if (empty($allgroups)) {
return false;
@ -404,7 +411,7 @@ function setup_chatview_for_user($thread, $level)
global $page, $webimroot, $settings;
loadsettings();
$page = array();
if (! is_null($thread['groupid'])) {
if (! empty($thread['groupid'])) {
$group = group_by_id($thread['groupid']);
$group = get_top_level_group($group);
} else {
@ -483,11 +490,9 @@ function setup_chatview_for_operator($thread, $operator)
$page['historyParams'] = array("userid" => "" . $thread['userid']);
$page['historyParamsLink'] = add_params($webimroot . "/operator/userhistory.php", $page['historyParams']);
if ($settings['enabletracking']) {
$link = connect();
$visitor = track_get_visitor_by_threadid($thread['threadid'], $link);
$visitor = track_get_visitor_by_threadid($thread['threadid']);
$page['trackedParams'] = array("visitor" => "" . $visitor['visitorid']);
$page['trackedParamsLink'] = add_params($webimroot . "/operator/tracked.php", $page['trackedParams']);
close_connection($link);
}
$predefinedres = "";
$canned_messages = load_canned_messages($thread['locale'], 0);
@ -510,24 +515,29 @@ function setup_chatview_for_operator($thread, $operator)
$page['frequency'] = $settings['updatefrequency_chat'];
}
function update_thread_access($threadid, $params, $link)
function update_thread_access($threadid, $params)
{
global $mysqlprefix;
$db = Database::getInstance();
$clause = "";
$values = array();
foreach ($params as $k => $v) {
if (strlen($clause) > 0)
$clause .= ", ";
$clause .= $k . "=" . $v;
$clause .= $k . "=?";
$values[] = $v;
}
perform_query(
"update ${mysqlprefix}chatthread set $clause " .
"where threadid = $threadid", $link);
$values[] = $threadid;
$db->query(
"update {chatthread} set {$clause} where threadid = ?",
$values
);
}
function ping_thread($thread, $isuser, $istyping)
{
global $kind_for_agent, $state_queue, $state_loading, $state_chatting, $state_waiting, $kind_conn, $connection_timeout;
$link = connect();
$params = array(($isuser ? "lastpinguser" : "lastpingagent") => "CURRENT_TIMESTAMP",
($isuser ? "userTyping" : "agentTyping") => ($istyping ? "1" : "0"));
@ -536,8 +546,7 @@ function ping_thread($thread, $isuser, $istyping)
if ($thread['istate'] == $state_loading && $isuser) {
$params['istate'] = $state_queue;
commit_thread($thread['threadid'], $params, $link);
close_connection($link);
commit_thread($thread['threadid'], $params);
return;
}
@ -545,161 +554,176 @@ function ping_thread($thread, $isuser, $istyping)
$params[$isuser ? "lastpingagent" : "lastpinguser"] = "0";
if (!$isuser) {
$message_to_post = getstring_("chat.status.user.dead", $thread['locale']);
post_message_($thread['threadid'], $kind_for_agent, $message_to_post, $link, null, $lastping + $connection_timeout);
post_message_($thread['threadid'], $kind_for_agent, $message_to_post, null, $lastping + $connection_timeout);
} else if ($thread['istate'] == $state_chatting) {
$message_to_post = getstring_("chat.status.operator.dead", $thread['locale']);
post_message_($thread['threadid'], $kind_conn, $message_to_post, $link, null, $lastping + $connection_timeout);
post_message_($thread['threadid'], $kind_conn, $message_to_post, null, $lastping + $connection_timeout);
$params['istate'] = $state_waiting;
$params['nextagent'] = 0;
commit_thread($thread['threadid'], $params, $link);
close_connection($link);
commit_thread($thread['threadid'], $params);
return;
}
}
update_thread_access($thread['threadid'], $params, $link);
close_connection($link);
update_thread_access($thread['threadid'], $params);
}
function commit_thread($threadid, $params, $link)
function commit_thread($threadid, $params)
{
global $mysqlprefix;
$query = "update ${mysqlprefix}chatthread t set lrevision = " . next_revision($link) . ", dtmmodified = CURRENT_TIMESTAMP";
foreach ($params as $k => $v) {
$query .= ", " . $k . "=" . $v;
}
$query .= " where threadid = $threadid";
$db = Database::getInstance();
perform_query($query, $link);
$query = "update {chatthread} t " .
"set lrevision = ?, dtmmodified = CURRENT_TIMESTAMP";
$values = array(next_revision());
foreach ($params as $k => $v) {
$query .= ", " . $k . "=?";
$values[] = $v;
}
$query .= " where threadid = ?";
$values[] = $threadid;
$db->query($query, $values);
}
function rename_user($thread, $newname)
{
global $kind_events;
$link = connect();
commit_thread($thread['threadid'], array('userName' => "'" . db_escape_string($newname, $link) . "'"), $link);
commit_thread($thread['threadid'], array('userName' => $newname));
if ($thread['userName'] != $newname) {
post_message_($thread['threadid'], $kind_events,
getstring2_("chat.status.user.changedname", array($thread['userName'], $newname), $thread['locale']), $link);
getstring2_("chat.status.user.changedname", array($thread['userName'], $newname), $thread['locale']));
}
close_connection($link);
}
function close_thread($thread, $isuser)
{
global $state_closed, $kind_events, $mysqlprefix;
global $state_closed, $kind_events;
$link = connect();
if ($thread['istate'] != $state_closed) {
commit_thread($thread['threadid'], array('istate' => $state_closed,
'messageCount' => "(SELECT COUNT(*) FROM ${mysqlprefix}chatmessage WHERE ${mysqlprefix}chatmessage.threadid = t.threadid AND ikind = 1)"), $link);
commit_thread(
$thread['threadid'],
array(
'istate' => $state_closed,
'messageCount' => "(SELECT COUNT(*) FROM {chatmessage} WHERE {chatmessage}.threadid = t.threadid AND ikind = 1)"
)
);
}
$message = $isuser ? getstring2_("chat.status.user.left", array($thread['userName']), $thread['locale'])
: getstring2_("chat.status.operator.left", array($thread['agentName']), $thread['locale']);
post_message_($thread['threadid'], $kind_events, $message, $link);
close_connection($link);
post_message_($thread['threadid'], $kind_events, $message);
}
function close_old_threads($link)
function close_old_threads()
{
global $state_closed, $state_left, $state_chatting, $mysqlprefix, $settings;
global $state_closed, $state_left, $state_chatting, $settings;
if ($settings['thread_lifetime'] == 0) {
return;
}
$next_revision = next_revision($link);
$query = "update ${mysqlprefix}chatthread set lrevision = $next_revision, dtmmodified = CURRENT_TIMESTAMP, istate = $state_closed " .
"where istate <> $state_closed and istate <> $state_left and lastpingagent <> 0 and lastpinguser <> 0 and " .
"(ABS(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(lastpinguser)) > " . $settings['thread_lifetime'] . " and " .
"ABS(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(lastpingagent)) > " . $settings['thread_lifetime'] . ")";
perform_query($query, $link);
}
$db = Database::getInstance();
function close_old_threads($link)
{
global $state_closed, $state_left, $state_chatting, $mysqlprefix, $settings;
if ($settings['thread_lifetime'] == 0) {
return;
}
$next_revision = next_revision($link);
$query = "update ${mysqlprefix}chatthread set lrevision = $next_revision, dtmmodified = CURRENT_TIMESTAMP, istate = $state_closed " .
"where istate <> $state_closed and istate <> $state_left and lastpingagent <> 0 and lastpinguser <> 0 and " .
"(ABS(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(lastpinguser)) > " . $settings['thread_lifetime'] . " and " .
"ABS(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(lastpingagent)) > " . $settings['thread_lifetime'] . ")";
$query = "update {chatthread} set lrevision = :next_revision, " .
"dtmmodified = CURRENT_TIMESTAMP, istate = :state_closed " .
"where istate <> :state_closed and istate <> :state_left " .
"and lastpingagent <> 0 and lastpinguser <> 0 and " .
"(ABS(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(lastpinguser)) > ".
":thread_lifetime and " .
"ABS(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(lastpingagent)) > ".
":thread_lifetime)";
perform_query($query, $link);
}
function thread_by_id_($id, $link)
{
global $mysqlprefix;
return select_one_row("select threadid,userName,agentName,agentId,lrevision,istate,ltoken,userTyping,agentTyping" .
",unix_timestamp(dtmmodified) as modified, unix_timestamp(dtmcreated) as created, unix_timestamp(dtmchatstarted) as chatstarted" .
",remote,referer,locale,unix_timestamp(lastpinguser) as lpuser,unix_timestamp(lastpingagent) as lpagent, unix_timestamp(CURRENT_TIMESTAMP) as current,nextagent,shownmessageid,userid,userAgent,groupid" .
" from ${mysqlprefix}chatthread where threadid = " . $id, $link);
}
function ban_for_addr_($addr, $link)
{
global $mysqlprefix;
return select_one_row("select banid,comment from ${mysqlprefix}chatban where unix_timestamp(dtmtill) > unix_timestamp(CURRENT_TIMESTAMP) AND address = '" . db_escape_string($addr, $link) . "'", $link);
$db->query(
$query,
array(
':next_revision' => next_revision(),
':state_closed' => $state_closed,
':state_left' => $state_left,
':thread_lifetime' => $settings['thread_lifetime']
)
);
}
function thread_by_id($id)
{
$link = connect();
$thread = thread_by_id_($id, $link);
close_connection($link);
return $thread;
$db = Database::getInstance();
return $db->query(
"select threadid,userName,agentName,agentId,lrevision,istate,ltoken,userTyping, " .
"agentTyping,unix_timestamp(dtmmodified) as modified, " .
"unix_timestamp(dtmcreated) as created, " .
"unix_timestamp(dtmchatstarted) as chatstarted,remote,referer,locale," .
"unix_timestamp(lastpinguser) as lpuser,unix_timestamp(lastpingagent) as lpagent," .
"unix_timestamp(CURRENT_TIMESTAMP) as current,nextagent,shownmessageid,userid, " .
"userAgent,groupid from {chatthread} where threadid = ?",
array($id),
array('return_rows' => Database::RETURN_ONE_ROW)
);
}
function create_thread($groupid, $username, $remoteHost, $referer, $lang, $userid, $userbrowser, $initialState, $link)
function ban_for_addr($addr)
{
global $mysqlprefix;
$query = sprintf(
"insert into ${mysqlprefix}chatthread (userName,userid,ltoken,remote,referer,lrevision,locale,userAgent,dtmcreated,dtmmodified,istate" . ($groupid ? ",groupid" : "") . ") values " .
"('%s','%s',%s,'%s','%s',%s,'%s','%s',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,$initialState" . ($groupid ? ",$groupid" : "") . ")",
db_escape_string($username, $link),
db_escape_string($userid, $link),
$db = Database::getInstance();
return $db->query(
"select banid,comment from {chatban} " .
"where unix_timestamp(dtmtill) > unix_timestamp(CURRENT_TIMESTAMP) AND address = ?",
array($addr),
array('return_rows' => Database::RETURN_ONE_ROW)
);
}
function create_thread($groupid, $username, $remoteHost, $referer, $lang, $userid, $userbrowser, $initialState)
{
$db = Database::getInstance();
$query = "insert into {chatthread} (userName,userid,ltoken,remote,referer, " .
"lrevision,locale,userAgent,dtmcreated,dtmmodified,istate" .
($groupid ? ",groupid" : "") . ") values " .
"(?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,?" .
($groupid ? ", ?" : "") . ")";
$values = array(
$username,
$userid,
next_token(),
db_escape_string($remoteHost, $link),
db_escape_string($referer, $link),
next_revision($link),
db_escape_string($lang, $link),
db_escape_string($userbrowser, $link));
$remoteHost,
$referer,
next_revision(),
$lang,
$userbrowser,
$initialState
);
perform_query($query, $link);
$id = db_insert_id($link);
if ($groupid) {
$values[] = $groupid;
}
$newthread = thread_by_id_($id, $link);
$db->query($query, $values);
$id = $db->insertedId();
$newthread = thread_by_id($id);
return $newthread;
}
function do_take_thread($threadid, $operatorId, $operatorName, $chatstart = false)
{
global $state_chatting;
$link = connect();
$params = array("istate" => $state_chatting,
"nextagent" => 0,
"agentId" => $operatorId,
"agentName" => "'" . db_escape_string($operatorName, $link) . "'");
"agentName" => $operatorName);
if ($chatstart){
$params['dtmchatstarted'] = "CURRENT_TIMESTAMP";
}
commit_thread($threadid, $params, $link);
close_connection($link);
commit_thread($threadid, $params);
}
function reopen_thread($threadid)
{
global $state_queue, $state_loading, $state_waiting, $state_chatting, $state_closed, $state_left, $kind_events, $settings;
$link = connect();
$thread = thread_by_id_($threadid, $link);
$thread = thread_by_id($threadid);
if (!$thread)
return FALSE;
@ -712,12 +736,13 @@ function reopen_thread($threadid)
return FALSE;
if ($thread['istate'] != $state_chatting && $thread['istate'] != $state_queue && $thread['istate'] != $state_loading) {
commit_thread($threadid,
array("istate" => $state_waiting, "nextagent" => 0), $link);
commit_thread(
$threadid,
array("istate" => $state_waiting, "nextagent" => 0)
);
}
post_message_($thread['threadid'], $kind_events, getstring_("chat.status.user.reopenedthread", $thread['locale']), $link);
close_connection($link);
post_message_($thread['threadid'], $kind_events, getstring_("chat.status.user.reopenedthread", $thread['locale']));
return $thread;
}
@ -779,15 +804,21 @@ function check_for_reassign($thread, $operator)
}
}
function check_connections_from_remote($remote, $link)
function check_connections_from_remote($remote)
{
global $settings, $state_closed, $state_left, $mysqlprefix;
global $settings, $state_closed, $state_left;
if ($settings['max_connections_from_one_host'] == 0) {
return true;
}
$result = select_one_row(
"select count(*) as opened from ${mysqlprefix}chatthread " .
"where remote = '" . db_escape_string($remote, $link) . "' AND istate <> $state_closed AND istate <> $state_left", $link);
$db = Database::getInstance();
$result = $db->query(
"select count(*) as opened from {chatthread} " .
"where remote = ? AND istate <> ? AND istate <> ?",
array($remote, $state_closed, $state_left),
array('return_rows' => Database::RETURN_ONE_ROW)
);
if ($result && isset($result['opened'])) {
return $result['opened'] < $settings['max_connections_from_one_host'];
}

View File

@ -19,6 +19,7 @@ session_start();
require_once(dirname(__FILE__) . '/converter.php');
require_once(dirname(__FILE__) . '/config.php');
require_once(dirname(__FILE__) . '/database.php');
$version = '1.6.5';
$jsver = "165";
@ -350,111 +351,6 @@ function cutstring($string, $length = 75, $ellipsis = '')
return $result;
}
function connect()
{
global $mysqlhost, $mysqllogin, $mysqlpass, $mysqldb, $dbencoding, $force_charset_in_connection, $use_persistent_connection;
if (!extension_loaded("mysql")) {
die('Mysql extension is not loaded');
}
if ($use_persistent_connection) {
$link = @mysql_pconnect($mysqlhost, $mysqllogin, $mysqlpass);
}else{
$link = @mysql_connect($mysqlhost, $mysqllogin, $mysqlpass);
}
if (! $link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db($mysqldb, $link) or die('Could not select database');
if ($force_charset_in_connection) {
perform_query("SET NAMES '$dbencoding'", $link);
}
return $link;
}
function close_connection($link)
{
global $use_persistent_connection;
if (! $use_persistent_connection) {
mysql_close($link);
}
}
function db_escape_string($string, $link = NULL)
{
if ( is_null($link) ) {
return mysql_real_escape_string($string);
}
return mysql_real_escape_string($string, $link);
}
function db_error($link)
{
return mysql_error($link);
}
function db_insert_id($link)
{
return mysql_insert_id($link);
}
function db_fetch_row($result)
{
return mysql_fetch_row($result);
}
function db_fetch_assoc($result){
return mysql_fetch_assoc($result);
}
function perform_query($query, $link)
{
$result = mysql_query($query, $link);
if (! $result) {
die(' Query failed: ' . db_error($link));
}
return $result;
}
function db_free_result($result)
{
mysql_free_result($result);
}
function select_one_row($query, $link)
{
$result = perform_query($query, $link);
$line = db_fetch_assoc($result);
db_free_result($result);
return $line;
}
function select_multi_assoc($query, $link)
{
$sqlresult = perform_query($query, $link);
$result = array();
while ($row = db_fetch_assoc($sqlresult)) {
$result[] = $row;
}
db_free_result($sqlresult);
return $result;
}
function db_build_select($fields, $table, $conditions, $orderandgroup)
{
$condition = count($conditions) > 0 ? " where " . implode(" and ", $conditions) : "";
if ($orderandgroup) $orderandgroup = " " . $orderandgroup;
return "select $fields from $table$condition$orderandgroup";
}
function db_rows_count($table, $conditions, $countfields, $link)
{
$result = perform_query(db_build_select("count(" . ($countfields ? $countfields : "*") . ")", $table, $conditions, ""), $link);
$line = db_fetch_row($result);
db_free_result($result);
return $line[0];
}
function start_xml_output()
{
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
@ -716,32 +612,25 @@ $settings = array(
$settingsloaded = false;
$settings_in_db = array();
function loadsettings_($link)
function loadsettings()
{
global $settingsloaded, $settings_in_db, $settings, $mysqlprefix;
global $settingsloaded, $settings_in_db, $settings;
if ($settingsloaded) {
return;
}
$settingsloaded = true;
$sqlresult = perform_query("select vckey,vcvalue from ${mysqlprefix}chatconfig", $link);
while ($row = db_fetch_assoc($sqlresult)) {
$db = Database::getInstance();
$rows = $db->query(
"select vckey,vcvalue from {chatconfig}",
NULL,
array('return_rows' => Database::RETURN_ALL_ROWS)
);
foreach ($rows as $row) {
$name = $row['vckey'];
$settings[$name] = $row['vcvalue'];
$settings_in_db[$name] = true;
}
db_free_result($sqlresult);
}
function loadsettings()
{
global $settingsloaded;
if (!$settingsloaded) {
$link = connect();
loadsettings_($link);
close_connection($link);
}
}
function getchatstyle()

View File

@ -65,9 +65,7 @@ function verifyparam_groupid($paramid)
function get_groups_list()
{
$result = array();
$link = connect();
$allgroups = get_all_groups($link);
close_connection($link);
$allgroups = get_all_groups();
$result[] = array('groupid' => '', 'vclocalname' => getlocal("page.gen_button.default_group"), 'level' => 0);
foreach ($allgroups as $g) {
$result[] = $g;

View File

@ -17,11 +17,12 @@
function group_by_id($id)
{
global $mysqlprefix;
$link = connect();
$group = select_one_row(
"select * from ${mysqlprefix}chatgroup where groupid = $id", $link);
close_connection($link);
$db = Database::getInstance();
$group = $db->query(
"select * from {chatgroup} where groupid = ?",
array($id),
array('return_rows' => Database::RETURN_ONE_ROW)
);
return $group;
}
@ -47,12 +48,17 @@ function setup_group_settings_tabs($gid, $active)
}
}
function get_operator_groupslist($operatorid, $link)
function get_operator_groupslist($operatorid)
{
global $settings, $mysqlprefix;
global $settings;
$db = Database::getInstance();
if ($settings['enablegroups'] == '1') {
$groupids = array(0);
$allgroups = select_multi_assoc("select groupid from ${mysqlprefix}chatgroupoperator where operatorid = $operatorid order by groupid", $link);
$allgroups = $db->query(
"select groupid from {chatgroupoperator} where operatorid = ? order by groupid",
array($operatorid),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
foreach ($allgroups as $g) {
$groupids[] = $g['groupid'];
}
@ -64,10 +70,13 @@ function get_operator_groupslist($operatorid, $link)
function get_available_parent_groups($skipgroup)
{
global $mysqlprefix;
$link = connect();
$query = "select ${mysqlprefix}chatgroup.groupid as groupid, parent, vclocalname from ${mysqlprefix}chatgroup order by vclocalname";
$groupslist = select_multi_assoc($query, $link);
$db = Database::getInstance();
$groupslist = $db->query(
"select {chatgroup}.groupid as groupid, parent, vclocalname " .
"from {chatgroup} order by vclocalname",
NULL,
array('return_rows' => Database::RETURN_ALL_ROWS)
);
$result = array(array('groupid' => '', 'level' => '', 'vclocalname' => getlocal("form.field.groupparent.root")));
if ($skipgroup) {
@ -77,15 +86,17 @@ function get_available_parent_groups($skipgroup)
}
$result = array_merge($result, get_sorted_child_groups_($groupslist, $skipgroup, 0) );
close_connection($link);
return $result;
}
function group_has_children($groupid, $link)
function group_has_children($groupid)
{
global $mysqlprefix;
$children = select_one_row(sprintf("select COUNT(*) as count from ${mysqlprefix}chatgroup where parent = %u", $groupid),
$link);
$db = Database::getInstance();
$children = $db->query(
"select COUNT(*) as count from {chatgroup} where parent = ?",
array($groupid),
array('return_rows' => Database::RETURN_ONE_ROW)
);
return ($children['count'] > 0);
}

View File

@ -15,11 +15,14 @@
* limitations under the License.
*/
function invitation_state($visitorid, $link)
function invitation_state($visitorid)
{
global $mysqlprefix;
$query = "select invited, threadid from ${mysqlprefix}chatsitevisitor where visitorid = '" . db_escape_string($visitorid) . "'";
$result = select_one_row($query, $link);
$db = Database::getInstance();
$result = $db->query(
"select invited, threadid from {chatsitevisitor} where visitorid = ?",
array($visitorid),
array('return_rows' => Database::RETURN_ONE_ROW)
);
if (!$result) {
$result['invited'] = 0;
$result['threadid'] = 0;
@ -27,46 +30,51 @@ function invitation_state($visitorid, $link)
return $result;
}
function invitation_invite($visitorid, $operatorid, $link)
function invitation_invite($visitorid, $operatorid)
{
global $mysqlprefix;
if (!invitation_check($visitorid, $link)) {
$query = "update ${mysqlprefix}chatsitevisitor set invited = 1, invitedby = '" . db_escape_string($operatorid) . "', invitationtime = now(), invitations = invitations + 1 where visitorid = '" . db_escape_string($visitorid) . "'";
perform_query($query, $link);
return invitation_check($visitorid, $link);
}
else {
return FALSE;
if (!invitation_check($visitorid)) {
$db = Database::getInstance();
$db->query(
"update {chatsitevisitor} set invited = 1, invitedby = ?, " .
"invitationtime = now(), invitations = invitations + 1 where visitorid = ?",
array($operatorid, $visitorid)
);
return invitation_check($visitorid);
} else {
return FALSE;
}
}
function invitation_check($visitorid, $link)
function invitation_check($visitorid)
{
global $mysqlprefix;
$query = "select invitedby from ${mysqlprefix}chatsitevisitor where invited and visitorid = '" . db_escape_string($visitorid) . "'" .
" and lasttime < invitationtime and threadid is null";
$result = select_one_row($query, $link);
$db = Database::getInstance();
$result = $db->query(
"select invitedby from {chatsitevisitor} where invited and visitorid = ? " .
" and lasttime < invitationtime and threadid is null",
array($visitorid),
array('return_rows' => Database::RETURN_ONE_ROW)
);
return ($result && isset($result['invitedby']) && $result['invitedby']) ? $result['invitedby'] : FALSE;
}
function invitation_accept($visitorid, $threadid, $link)
function invitation_accept($visitorid, $threadid)
{
global $mysqlprefix;
$db = Database::getInstance();
$db->query(
"update {chatsitevisitor} set threadid = ?, chats = chats + 1 where visitorid = ?",
array($threadid, $visitorid)
);
$query = "update ${mysqlprefix}chatsitevisitor set threadid = " . $threadid . ", chats = chats + 1 where visitorid = " . db_escape_string($visitorid) . "";
perform_query($query, $link);
$query = "select invitedby from ${mysqlprefix}chatsitevisitor where visitorid = '" . db_escape_string($visitorid) . "'";
$result = select_one_row($query, $link);
$result = $db->query(
"select invitedby from {chatsitevisitor} where visitorid = ?",
array($visitorid),
array('return_rows' => Database::RETURN_ONE_ROW)
);
if ($result && isset($result['invitedby']) && $result['invitedby']) {
return $result['invitedby'];
}
else {
return FALSE;
return $result['invitedby'];
} else {
return FALSE;
}
}

View File

@ -15,7 +15,7 @@
* limitations under the License.
*/
function webim_mail($toaddr, $reply_to, $subject, $body, $link)
function webim_mail($toaddr, $reply_to, $subject, $body)
{
global $webim_encoding, $webim_mailbox, $mail_encoding, $current_locale;

400
src/messenger/webim/libs/operator.php Executable file → Normal file
View File

@ -31,37 +31,32 @@ $permission_ids = array(
function operator_by_login($login)
{
global $mysqlprefix;
$link = connect();
$operator = select_one_row(
"select * from ${mysqlprefix}chatoperator where vclogin = '" . db_escape_string($login) . "'", $link);
close_connection($link);
return $operator;
$db = Database::getInstance();
return $db->query(
"select * from {chatoperator} where vclogin = ?",
array($login),
array('return_rows' => Database::RETURN_ONE_ROW)
);
}
function operator_by_email($mail)
{
global $mysqlprefix;
$link = connect();
$operator = select_one_row(
"select * from ${mysqlprefix}chatoperator where vcemail = '" . db_escape_string($mail) . "'", $link);
close_connection($link);
return $operator;
}
function operator_by_id_($id, $link)
{
global $mysqlprefix;
return select_one_row(
"select * from ${mysqlprefix}chatoperator where operatorid = $id", $link);
$db = Database::getInstance();
return $db->query(
"select * from {chatoperator} where vcemail = ?",
array($mail),
array('return_rows', Database::RETURN_ONE_ROW)
);
}
function operator_by_id($id)
{
$link = connect();
$operator = operator_by_id_($id, $link);
close_connection($link);
return $operator;
$db = Database::getInstance();
return $db->query(
"select * from {chatoperator} where operatorid = ?",
array($id),
array('return_rows' => Database::RETURN_ONE_ROW)
);
}
/**
@ -80,8 +75,7 @@ function operator_by_id($id)
*/
function get_operators_list($options)
{
global $mysqlprefix;
$link = connect();
$db = Database::getInstance();
if ( !empty($options['sort']) && isset($options['sort']['by']) && isset($options['sort']['desc'])) {
switch ($options['sort']['by']) {
@ -103,54 +97,67 @@ function get_operators_list($options)
$orderby = "vclogin";
}
$query = "select distinct ${mysqlprefix}chatoperator.operatorid, vclogin, vclocalename, vccommonname, istatus, idisabled, (unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
"from ${mysqlprefix}chatoperator" .
$query = "select distinct {chatoperator}.operatorid, vclogin, vclocalename, vccommonname, istatus, idisabled, (unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
"from {chatoperator}" .
(
empty($options['isolated_operator_id']) ? "" :
sprintf(", ${mysqlprefix}chatgroupoperator " .
" where ${mysqlprefix}chatoperator.operatorid = ${mysqlprefix}chatgroupoperator.operatorid and ${mysqlprefix}chatgroupoperator.groupid in " .
"(select g.groupid from ${mysqlprefix}chatgroup g, " .
"(select distinct parent from ${mysqlprefix}chatgroup, ${mysqlprefix}chatgroupoperator " .
"where ${mysqlprefix}chatgroup.groupid = ${mysqlprefix}chatgroupoperator.groupid and ${mysqlprefix}chatgroupoperator.operatorid = %u) i " .
"where g.groupid = i.parent or g.parent = i.parent " .
")", $options['isolated_operator_id'])
", {chatgroupoperator} " .
" where {chatoperator}.operatorid = {chatgroupoperator}.operatorid and {chatgroupoperator}.groupid in " .
"(select g.groupid from {chatgroup} g, " .
"(select distinct parent from {chatgroup}, {chatgroupoperator} " .
"where {chatgroup}.groupid = {chatgroupoperator}.groupid and {chatgroupoperator}.operatorid = :operatorid) i " .
"where g.groupid = i.parent or g.parent = i.parent " .
")"
) .
" order by " . $orderby;
$operators = select_multi_assoc($query, $link);
close_connection($link);
$operators = $db->query(
$query,
(
empty($options['isolated_operator_id'])
? array()
: array(':operatorid' => $options['isolated_operator_id'])
),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
return $operators;
}
function operator_get_all()
{
global $mysqlprefix;
$link = connect();
$query = "select operatorid, vclogin, vclocalename, vccommonname, istatus, idisabled, (unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
"from ${mysqlprefix}chatoperator order by vclogin";
$operators = select_multi_assoc($query, $link);
close_connection($link);
return $operators;
$db = Database::getInstance();
return $operators = $db->query(
"select operatorid, vclogin, vclocalename, vccommonname, istatus, idisabled, " .
"(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
"from {chatoperator} order by vclogin",
NULL,
array('return_rows' => Database::RETURN_ALL_ROWS)
);
}
function get_operators_from_adjacent_groups($operator)
{
global $mysqlprefix;
$link = connect();
$query = "select distinct ${mysqlprefix}chatoperator.operatorid, vclogin, vclocalename, vccommonname, istatus, idisabled, (unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
"from ${mysqlprefix}chatoperator, ${mysqlprefix}chatgroupoperator " .
" where ${mysqlprefix}chatoperator.operatorid = ${mysqlprefix}chatgroupoperator.operatorid and ${mysqlprefix}chatgroupoperator.groupid in " .
"(select g.groupid from ${mysqlprefix}chatgroup g, " .
"(select distinct parent from ${mysqlprefix}chatgroup, ${mysqlprefix}chatgroupoperator " .
"where ${mysqlprefix}chatgroup.groupid = ${mysqlprefix}chatgroupoperator.groupid and ${mysqlprefix}chatgroupoperator.operatorid = ".$operator['operatorid'].") i " .
"where g.groupid = i.parent or g.parent = i.parent " .
") order by vclogin";
$operators = select_multi_assoc($query, $link);
close_connection($link);
return $operators;
$db = Database::getInstance();
$query = "select distinct {chatoperator}.operatorid, vclogin, vclocalename,vccommonname, " .
"istatus, idisabled, " .
"(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
"from {chatoperator}, {chatgroupoperator} " .
"where {chatoperator}.operatorid = {chatgroupoperator}.operatorid " .
"and {chatgroupoperator}.groupid in " .
"(select g.groupid from {chatgroup} g, " .
"(select distinct parent from {chatgroup}, {chatgroupoperator} " .
"where {chatgroup}.groupid = {chatgroupoperator}.groupid " .
"and {chatgroupoperator}.operatorid = ?) i " .
"where g.groupid = i.parent or g.parent = i.parent " .
") order by vclogin";
return $db->query(
$query,
array($operator['operatorid']),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
}
function operator_is_online($operator)
@ -178,100 +185,116 @@ function operator_is_disabled($operator)
function update_operator($operatorid, $login, $email, $password, $localename, $commonname)
{
global $mysqlprefix;
$link = connect();
$query = sprintf(
"update ${mysqlprefix}chatoperator set vclogin = '%s',%s vclocalename = '%s', vccommonname = '%s'" .
", vcemail = '%s', vcjabbername= '%s'" .
" where operatorid = %s",
db_escape_string($login),
($password ? " vcpassword='" . md5($password) . "'," : ""),
db_escape_string($localename),
db_escape_string($commonname),
db_escape_string($email),
'',
$operatorid);
perform_query($query, $link);
close_connection($link);
$db = Database::getInstance();
$db->query(
"update {chatoperator} set vclogin = :login, " .
($password ? " vcpassword=:password, " : "") .
"vclocalename = :localname, vccommonname = :commonname, " .
"vcemail = :email, vcjabbername= :jabbername " .
"where operatorid = :operatorid",
array(
':login' => $login,
':password' => $password,
':localname' => $localename,
':commonname' => $commonname,
':email' => $email,
':jabbername' => '',
':operatorid' => $operatorid
)
);
}
function update_operator_avatar($operatorid, $avatar)
{
global $mysqlprefix;
$link = connect();
$query = sprintf(
"update ${mysqlprefix}chatoperator set vcavatar = '%s' where operatorid = %s",
db_escape_string($avatar), $operatorid);
perform_query($query, $link);
close_connection($link);
}
function create_operator_($login, $email, $password, $localename, $commonname, $avatar, $link)
{
global $mysqlprefix;
$query = sprintf(
"insert into ${mysqlprefix}chatoperator (vclogin,vcpassword,vclocalename,vccommonname,vcavatar,vcemail,vcjabbername) values ('%s','%s','%s','%s','%s','%s','%s')",
db_escape_string($login),
md5($password),
db_escape_string($localename),
db_escape_string($commonname),
db_escape_string($avatar),
db_escape_string($email), '');
perform_query($query, $link);
$id = db_insert_id($link);
return select_one_row("select * from ${mysqlprefix}chatoperator where operatorid = $id", $link);
$db = Database::getInstance();
$db->query(
"update {chatoperator} set vcavatar = ? where operatorid = ?",
array($avatar, $operatorid)
);
}
/**
* @todo Rename create_operator_ function to create_operator and remove any usage of create_operator_
*/
function create_operator($login, $email, $password, $localename, $commonname, $avatar)
{
$link = connect();
$newop = create_operator_($login, $email, $password, $localename, $commonname, $avatar, $link);
close_connection($link);
return $newop;
$db = Database::getInstance();
$db->query(
"insert into {chatoperator} " .
"(vclogin,vcpassword,vclocalename,vccommonname,vcavatar,vcemail,vcjabbername) " .
"values (?, ?, ?, ?, ?, ?, ?)",
array(
$login,
md5($password),
$localename,
$commonname,
$avatar,
$email,
''
)
);
$id = $db->insertedId();
return $db->query(
"select * from {chatoperator} where operatorid = ?",
array($id),
array('return_rows' => Database::RETURN_ONE_ROW)
);
}
function notify_operator_alive($operatorid, $istatus)
{
global $mysqlprefix;
$link = connect();
perform_query("update ${mysqlprefix}chatoperator set istatus = $istatus, dtmlastvisited = CURRENT_TIMESTAMP where operatorid = $operatorid", $link);
close_connection($link);
$db = Database::getInstance();
$db->query(
"update {chatoperator} set istatus = ?, dtmlastvisited = CURRENT_TIMESTAMP " .
"where operatorid = ?",
array($istatus, $operatorid)
);
}
function has_online_operators($groupid = "")
{
global $settings, $mysqlprefix;
global $settings;
loadsettings();
$link = connect();
$query = "select count(*) as total, min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time from ${mysqlprefix}chatoperator";
$db = Database::getInstance();
$query = "select count(*) as total, min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time from {chatoperator}";
if ($groupid) {
$query .= ", ${mysqlprefix}chatgroupoperator, ${mysqlprefix}chatgroup where ${mysqlprefix}chatgroup.groupid = ${mysqlprefix}chatgroupoperator.groupid and " .
"(${mysqlprefix}chatgroup.groupid = $groupid or ${mysqlprefix}chatgroup.parent = $groupid) and ${mysqlprefix}chatoperator.operatorid = " .
"${mysqlprefix}chatgroupoperator.operatorid and istatus = 0";
$query .= ", {chatgroupoperator}, {chatgroup} where {chatgroup}.groupid = {chatgroupoperator}.groupid and " .
"({chatgroup}.groupid = :groupid or {chatgroup}.parent = :groupid) and {chatoperator}.operatorid = " .
"{chatgroupoperator}.operatorid and istatus = 0";
} else {
if ($settings['enablegroups'] == 1) {
$query .= ", ${mysqlprefix}chatgroupoperator where ${mysqlprefix}chatoperator.operatorid = " .
"${mysqlprefix}chatgroupoperator.operatorid and istatus = 0";
$query .= ", {chatgroupoperator} where {chatoperator}.operatorid = " .
"{chatgroupoperator}.operatorid and istatus = 0";
} else {
$query .= " where istatus = 0";
}
}
$row = select_one_row($query, $link);
close_connection($link);
$row = $db->query(
$query,
array(':groupid'=>$groupid),
array('return_rows' => Database::RETURN_ONE_ROW)
);
return $row['time'] < $settings['online_timeout'] && $row['total'] > 0;
}
function is_operator_online($operatorid, $link)
function is_operator_online($operatorid)
{
global $settings, $mysqlprefix;
loadsettings_($link);
$query = "select count(*) as total, min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
"from ${mysqlprefix}chatoperator where operatorid = $operatorid";
$row = select_one_row($query, $link);
global $settings;
loadsettings();
$db = Database::getInstance();
$row = $db->query(
"select count(*) as total, " .
"min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
"from {chatoperator} where operatorid = ?",
array($operatorid),
array('return_rows' => Database::RETURN_ONE_ROW)
);
return $row['time'] < $settings['online_timeout'] && $row['total'] == 1;
}
@ -361,7 +384,7 @@ function logout_operator()
function setup_redirect_links($threadid, $operator, $token)
{
global $page, $webimroot, $settings, $mysqlprefix;
global $page, $webimroot, $settings;
loadsettings();
$operator_in_isolation = in_isolation($operator);
@ -370,12 +393,10 @@ function setup_redirect_links($threadid, $operator, $token)
$operators = get_operators_list($list_options);
$operatorscount = count($operators);
$link = connect();
$groupscount = 0;
$groups = array();
if ($settings['enablegroups'] == "1") {
$groupslist = $operator_in_isolation?get_groups_for_operator($link, $operator, true):get_groups($link, true);
$groupslist = $operator_in_isolation?get_groups_for_operator($operator, true):get_groups(true);
foreach ($groupslist as $group) {
if ($group['inumofagents'] == 0) {
continue;
@ -384,7 +405,6 @@ function setup_redirect_links($threadid, $operator, $token)
}
$groupscount = count($groups);
}
close_connection($link);
prepare_pagination(max($operatorscount, $groupscount), 8);
$p = $page['pagination'];
@ -471,23 +491,35 @@ function prepare_menu($operator, $hasright = true)
}
}
function get_all_groups($link)
function get_all_groups()
{
global $mysqlprefix;
$query = "select ${mysqlprefix}chatgroup.groupid as groupid, parent, vclocalname, vclocaldescription from ${mysqlprefix}chatgroup order by vclocalname";
return get_sorted_child_groups_(select_multi_assoc($query, $link));
$db = Database::getInstance();
$groups = $db->query(
"select {chatgroup}.groupid as groupid, parent, vclocalname, vclocaldescription " .
"from {chatgroup} order by vclocalname",
NULL,
array('return_rows' => Database::RETURN_ALL_ROWS)
);
return get_sorted_child_groups_($groups);
}
function get_all_groups_for_operator($operator, $link)
function get_all_groups_for_operator($operator)
{
global $mysqlprefix;
$db = Database::getInstance();
$query = "select g.groupid as groupid, g.parent, g.vclocalname, g.vclocaldescription " .
"from ${mysqlprefix}chatgroup g, " .
"(select distinct parent from ${mysqlprefix}chatgroup, ${mysqlprefix}chatgroupoperator " .
"where ${mysqlprefix}chatgroup.groupid = ${mysqlprefix}chatgroupoperator.groupid and ${mysqlprefix}chatgroupoperator.operatorid = ".$operator['operatorid'].") i " .
"where g.groupid = i.parent or g.parent = i.parent " .
"order by vclocalname";
return get_sorted_child_groups_(select_multi_assoc($query, $link));
"from {chatgroup} g, " .
"(select distinct parent from {chatgroup}, {chatgroupoperator} " .
"where {chatgroup}.groupid = {chatgroupoperator}.groupid " .
"and {chatgroupoperator}.operatorid = ?) i " .
"where g.groupid = i.parent or g.parent = i.parent " .
"order by vclocalname";
$groups = $db->query(
$query,
array($operator['operatorid']),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
return get_sorted_child_groups_($groups);
}
function get_sorted_child_groups_($groupslist, $skipgroups = array(), $maxlevel = -1, $groupid = NULL, $level = 0)
@ -505,10 +537,9 @@ function get_sorted_child_groups_($groupslist, $skipgroups = array(), $maxlevel
return $child_groups;
}
function get_groups_($link, $checkaway, $operator, $order = NULL)
function get_groups_($checkaway, $operator, $order = NULL)
{
global $mysqlprefix;
$db = Database::getInstance();
if($order){
switch($order['by']){
case 'weight':
@ -518,63 +549,68 @@ function get_groups_($link, $checkaway, $operator, $order = NULL)
$orderby = "ilastseen";
break;
default:
$orderby = "${mysqlprefix}chatgroup.vclocalname";
$orderby = "{chatgroup}.vclocalname";
}
$orderby = sprintf(" IF(ISNULL(${mysqlprefix}chatgroup.parent),CONCAT('_',%s),'') %s, ${mysqlprefix}chatgroup.iweight ",
$orderby = sprintf(" IF(ISNULL({chatgroup}.parent),CONCAT('_',%s),'') %s, {chatgroup}.iweight ",
$orderby,
($order['desc']?'DESC':'ASC'));
}else{
$orderby = "iweight, vclocalname";
}
$query = "select ${mysqlprefix}chatgroup.groupid as groupid, ${mysqlprefix}chatgroup.parent as parent, vclocalname, vclocaldescription, iweight" .
", (SELECT count(*) from ${mysqlprefix}chatgroupoperator where ${mysqlprefix}chatgroup.groupid = " .
"${mysqlprefix}chatgroupoperator.groupid) as inumofagents" .
", (SELECT min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
"from ${mysqlprefix}chatgroupoperator, ${mysqlprefix}chatoperator where istatus = 0 and " .
"${mysqlprefix}chatgroup.groupid = ${mysqlprefix}chatgroupoperator.groupid " .
"and ${mysqlprefix}chatgroupoperator.operatorid = ${mysqlprefix}chatoperator.operatorid) as ilastseen" .
($checkaway
? ", (SELECT min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
"from ${mysqlprefix}chatgroupoperator, ${mysqlprefix}chatoperator where istatus <> 0 and " .
"${mysqlprefix}chatgroup.groupid = ${mysqlprefix}chatgroupoperator.groupid " .
"and ${mysqlprefix}chatgroupoperator.operatorid = ${mysqlprefix}chatoperator.operatorid) as ilastseenaway"
: ""
) .
" from ${mysqlprefix}chatgroup" .
($operator
? ", (select distinct parent from ${mysqlprefix}chatgroup, ${mysqlprefix}chatgroupoperator " .
"where ${mysqlprefix}chatgroup.groupid = ${mysqlprefix}chatgroupoperator.groupid and ${mysqlprefix}chatgroupoperator.operatorid = ".$operator['operatorid'].") i " .
"where ${mysqlprefix}chatgroup.groupid = i.parent or ${mysqlprefix}chatgroup.parent = i.parent "
: ""
) .
" order by " . $orderby;
return get_sorted_child_groups_(select_multi_assoc($query, $link));
$query = "select {chatgroup}.groupid as groupid, {chatgroup}.parent as parent, vclocalname, vclocaldescription, iweight" .
", (SELECT count(*) from {chatgroupoperator} where {chatgroup}.groupid = " .
"{chatgroupoperator}.groupid) as inumofagents" .
", (SELECT min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
"from {chatgroupoperator}, {chatoperator} where istatus = 0 and " .
"{chatgroup}.groupid = {chatgroupoperator}.groupid " .
"and {chatgroupoperator}.operatorid = {chatoperator}.operatorid) as ilastseen" .
($checkaway
? ", (SELECT min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
"from {chatgroupoperator}, {chatoperator} where istatus <> 0 and " .
"{chatgroup}.groupid = {chatgroupoperator}.groupid " .
"and {chatgroupoperator}.operatorid = {chatoperator}.operatorid) as ilastseenaway"
: ""
) .
" from {chatgroup} " .
($operator
? ", (select distinct parent from {chatgroup}, {chatgroupoperator} " .
"where {chatgroup}.groupid = {chatgroupoperator}.groupid and {chatgroupoperator}.operatorid = ?) i " .
"where {chatgroup}.groupid = i.parent or {chatgroup}.parent = i.parent "
: ""
) .
" order by " . $orderby;
$groups = $db->query(
$query,
array($operator['operatorid']),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
return get_sorted_child_groups_($groups);
}
function get_groups($link, $checkaway)
function get_groups($checkaway)
{
return get_groups_($link, $checkaway, NULL);
return get_groups_($checkaway, NULL);
}
function get_groups_for_operator($link, $operator, $checkaway)
function get_groups_for_operator($operator, $checkaway)
{
return get_groups_($link, $checkaway, $operator);
return get_groups_($checkaway, $operator);
}
function get_sorted_groups($link, $order)
function get_sorted_groups($order)
{
return get_groups_($link, true, NULL, $order);
return get_groups_(true, NULL, $order);
}
function get_operator_groupids($operatorid)
{
global $mysqlprefix;
$link = connect();
$query = "select groupid from ${mysqlprefix}chatgroupoperator where operatorid = $operatorid";
$result = select_multi_assoc($query, $link);
close_connection($link);
return $result;
$db = Database::getInstance();
return $db->query(
"select groupid from {chatgroupoperator} where operatorid = ?",
array($operatorid),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
}
?>

View File

@ -72,15 +72,47 @@ function setup_pagination($items, $default_items_per_page = 15)
}
}
function select_with_pagintation($fields, $table, $conditions, $order, $countfields, $link)
/**
* Selects rows from database taking pagination into account.
*
* @global array $page
* @param string $fields Selected fields
* @param string $table Table name in database
* @param string $conditions Where close
* @param string $order Order clause
* @param string $countfields Field, substituted in SQL COUNT function
* @param array $values Associative array of substituted values. Keys are named placeholders in the
* query(see Database::query() and its $values parameter description)
*
* @see Database::query()
*/
function select_with_pagintation($fields, $table, $conditions, $order, $countfields, $values)
{
global $page;
$count = db_rows_count($table, $conditions, $countfields, $link);
$db = Database::getInstance();
list($count) = $db->query(
"select count(". ($countfields ? $countfieds : "*") .") from {$table} " .
"where " . (count($conditions) ? implode(" and ", $conditions) : "") .
($order ? " " . $order : ""),
$values,
array(
'return_rows' => Database::RETURN_ONE_ROW,
'fetch_type' => Database::FETCH_NUM
)
);
prepare_pagination($count);
if ($count) {
$p = $page['pagination'];
$limit = $p['limit'];
$page['pagination.items'] = select_multi_assoc(db_build_select($fields, $table, $conditions, $order) . " " . $limit, $link);
$page['pagination.items'] = $db->query(
"select {$fields} from {$table} " .
"where " . (count($conditions) ? implode(" and ", $conditions) : "") .
($order ? " " . $order : "") . " " . $limit,
$values,
array('return_rows' => Database::RETURN_ALL_ROWS)
);
} else {
$page['pagination.items'] = false;
}

View File

@ -17,17 +17,14 @@
function update_settings()
{
global $settings, $settings_in_db, $mysqlprefix;
$link = connect();
global $settings, $settings_in_db;
$db = Database::getInstance();
foreach ($settings as $key => $value) {
if (!isset($settings_in_db[$key])) {
perform_query("insert into ${mysqlprefix}chatconfig (vckey) values ('$key')", $link);
$db->query("insert into {chatconfig} (vckey) values (?)", array($key));
}
$query = sprintf("update ${mysqlprefix}chatconfig set vcvalue='%s' where vckey='$key'", db_escape_string($value));
perform_query($query, $link);
$db->query("update {chatconfig} set vcvalue=? where vckey=?", array($value, $key));
}
close_connection($link);
}
function setup_settings_tabs($active)

View File

@ -17,88 +17,108 @@
require_once(dirname(__FILE__).'/chat.php');
function track_visitor($visitorid, $entry, $referer, $link)
function track_visitor($visitorid, $entry, $referer)
{
global $mysqlprefix;
$visitor = track_get_visitor_by_id($visitorid, $link);
$visitor = track_get_visitor_by_id($visitorid);
if (FALSE === $visitor) {
$visitor = track_visitor_start($entry, $referer, $link);
return $visitor;
}
else {
perform_query("update ${mysqlprefix}chatsitevisitor set lasttime = CURRENT_TIMESTAMP where visitorid=" . $visitor['visitorid'], $link);
track_visit_page($visitor['visitorid'], $referer, $link);
return $visitor['visitorid'];
$visitor = track_visitor_start($entry, $referer);
return $visitor;
} else {
$db = Database::getInstance();
$db->query(
"update {chatsitevisitor} set lasttime = CURRENT_TIMESTAMP " .
"where visitorid=?",
array($visitor['visitorid'])
);
track_visit_page($visitor['visitorid'], $referer);
return $visitor['visitorid'];
}
}
function track_visitor_start($entry, $referer, $link)
function track_visitor_start($entry, $referer)
{
global $mysqlprefix;
$visitor = visitor_from_request();
perform_query(sprintf("insert into ${mysqlprefix}chatsitevisitor (userid, username, firsttime, lasttime, entry, details) values ('%s', '%s', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, '%s', '%s')",
db_escape_string($visitor['id']),
db_escape_string($visitor['name']),
db_escape_string($entry),
db_escape_string(track_build_details())), $link);
$id = db_insert_id($link);
$db = Database::getInstance();
$db->query(
"insert into {chatsitevisitor} (userid,username,firsttime,lasttime,entry,details) ".
"values (?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ?, ?)",
array(
$visitor['id'],
$visitor['name'],
$entry,
track_build_details()
)
);
$id = $db->insertedId();
if ($id) {
track_visit_page($id, $referer, $link);
track_visit_page($id, $referer);
}
return $id ? $id : 0;
}
function track_get_visitor_by_id($visitorid, $link)
function track_get_visitor_by_id($visitorid)
{
global $mysqlprefix;
$visitor = select_one_row(
"select * from ${mysqlprefix}chatsitevisitor where visitorid = $visitorid", $link);
return $visitor;
$db = Database::getInstance();
return $db->query(
"select * from {chatsitevisitor} where visitorid = ?",
array($visitorid),
array('return_rows' => Database::RETURN_ONE_ROW)
);
}
function track_get_visitor_by_threadid($threadid, $link)
function track_get_visitor_by_threadid($threadid)
{
global $mysqlprefix;
$visitor = select_one_row(
"select * from ${mysqlprefix}chatsitevisitor where threadid = $threadid", $link);
return $visitor;
$db = Database::getInstance();
return $db->query(
"select * from {chatsitevisitor} where threadid = ?",
array($threadid),
array('return_rows' => Database::RETURN_ONE_ROW)
);
}
function track_visit_page($visitorid, $page, $link)
function track_visit_page($visitorid, $page)
{
global $mysqlprefix;
$db = Database::getInstance();
if (empty($page)) {
return;
}
$lastpage = select_one_row(sprintf("select address from ${mysqlprefix}visitedpage where visitorid = '%s' order by visittime desc limit 1",
db_escape_string($visitorid)), $link);
$lastpage = $db->query(
"select address from {visitedpage} where visitorid = ? " .
"order by visittime desc limit 1",
array($visitorid),
array('return_rows' => Database::RETURN_ONE_ROW)
);
if ( $lastpage['address'] != $page ) {
perform_query(sprintf("insert into ${mysqlprefix}visitedpage (visitorid, address, visittime) values ('%s', '%s', CURRENT_TIMESTAMP)",
db_escape_string($visitorid),
db_escape_string($page)), $link);
perform_query(sprintf("insert into ${mysqlprefix}visitedpagestatistics (address, visittime) values ('%s', CURRENT_TIMESTAMP)",
db_escape_string($page)), $link);
$db->query(
"insert into {visitedpage} (visitorid, address, visittime) " .
"values (?, ?, CURRENT_TIMESTAMP)",
array($visitorid, $page)
);
$db->query(
"insert into {visitedpagestatistics} (address, visittime) " .
"values (?, CURRENT_TIMESTAMP)",
array($page)
);
}
}
function track_get_path($visitor, $link)
function track_get_path($visitor)
{
global $mysqlprefix;
$query_result = perform_query(sprintf("select address, UNIX_TIMESTAMP(visittime) as visittime from ${mysqlprefix}visitedpage where visitorid = '%s'",
db_escape_string($visitor['visitorid'])), $link);
$db = Database::getInstance();
$query_result = $db->query(
"select address, UNIX_TIMESTAMP(visittime) as visittime from {visitedpage} " .
"where visitorid = ?",
array($visitor['visitorid']),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
$result = array();
while( $page = db_fetch_assoc($query_result) ){
foreach ($query_result as $page) {
$result[$page['visittime']] = $page['address'];
}
return $result;

View File

@ -63,9 +63,7 @@ loadsettings();
$subject = getstring("mail.user.history.subject");
$body = getstring2("mail.user.history.body", array($thread['userName'],$history,$settings['title'],$settings['hosturl']) );
$link = connect();
webim_mail($email, $webim_mailbox, $subject, $body, $link);
close_connection($link);
webim_mail($email, $webim_mailbox, $subject, $body);
setup_logo($group);
expand("styles/dialogs", getchatstyle(), "mailsent.tpl");

View File

@ -46,9 +46,7 @@ if (isset($_POST['address'])) {
$errors[] = no_field("form.field.ban_comment");
}
$link = connect();
$existing_ban = ban_for_addr_($address, $link);
close_connection($link);
$existing_ban = ban_for_addr($address);
if ((!$banId && $existing_ban) ||
($banId && $existing_ban && $banId != $existing_ban['banid'])) {
@ -56,24 +54,30 @@ if (isset($_POST['address'])) {
}
if (count($errors) == 0) {
$link = connect();
$db = Database::getInstance();
$utime = time() + $days * 24 * 60 * 60;
if (!$banId) {
$query = sprintf(
"insert into ${mysqlprefix}chatban (dtmcreated,dtmtill,address,comment) values (CURRENT_TIMESTAMP,%s,'%s','%s')",
"FROM_UNIXTIME($utime)",
db_escape_string($address, $link),
db_escape_string($comment, $link));
perform_query($query, $link);
$db->query(
"insert into {chatban} (dtmcreated,dtmtill,address,comment) " .
"values (CURRENT_TIMESTAMP,FROM_UNIXTIME(?),?,?)",
array(
$utime,
$address,
$comment
)
);
} else {
$query = sprintf(
"update ${mysqlprefix}chatban set dtmtill = %s,address = '%s',comment = '%s' where banid = $banId",
"FROM_UNIXTIME($utime)",
db_escape_string($address, $link),
db_escape_string($comment, $link));
perform_query($query, $link);
$db->query(
"update {chatban} set dtmtill = FROM_UNIXTIME(?),address = ?, " .
"comment = ? where banid = ?",
array(
$utime,
$address,
$comment,
$banId
)
);
}
close_connection($link);
if (!$threadid) {
header("Location: $webimroot/operator/blocked.php");
@ -91,9 +95,13 @@ if (isset($_POST['address'])) {
}
} else if (isset($_GET['id'])) {
$banId = verifyparam('id', "/^\d{1,9}$/");
$link = connect();
$ban = select_one_row("select banid,(unix_timestamp(dtmtill)-unix_timestamp(CURRENT_TIMESTAMP)) as days,address,comment from ${mysqlprefix}chatban where banid = $banId", $link);
close_connection($link);
$db = Database::getInstance();
$ban = $db->query(
"select banid,(unix_timestamp(dtmtill)-unix_timestamp(CURRENT_TIMESTAMP))" .
" as days,address,comment from {chatban} where banid = ?",
array($banId),
array('return_rows' => Database::RETURN_ONE_ROW)
);
if ($ban) {
$page['banId'] = topage($ban['banid']);

View File

@ -26,7 +26,7 @@ $errors = array();
setlocale(LC_TIME, getstring("time.locale"));
$link = connect();
$db = Database::getInstance();
if (isset($_GET['act']) && $_GET['act'] == 'del') {
$banId = isset($_GET['id']) ? $_GET['id'] : "";
@ -36,15 +36,17 @@ if (isset($_GET['act']) && $_GET['act'] == 'del') {
}
if (count($errors) == 0) {
perform_query("delete from ${mysqlprefix}chatban where banid = $banId", $link);
$db->query("delete from {chatban} where banid = ?", array($banId));
header("Location: $webimroot/operator/blocked.php");
exit;
}
}
$blockedList = select_multi_assoc("select banid,unix_timestamp(dtmtill) as till,address,comment from ${mysqlprefix}chatban", $link);
close_connection($link);
$blockedList = $db->query(
"select banid,unix_timestamp(dtmtill) as till,address,comment from {chatban}",
NULL,
array('return_rows' => Database::RETURN_ONE_ROW)
);
setup_pagination($blockedList);

View File

@ -57,9 +57,7 @@ if ($groupid) {
}
}
$link = connect();
$allgroups = in_isolation($operator)?get_all_groups_for_operator($operator, $link):get_all_groups($link);
close_connection($link);
$allgroups = in_isolation($operator)?get_all_groups_for_operator($operator):get_all_groups();
$page['groups'] = array();
$page['groups'][] = array('groupid' => '', 'vclocalname' => getlocal("page.gen_button.default_group"));
foreach ($allgroups as $g) {
@ -76,9 +74,8 @@ if (isset($_GET['act']) && $_GET['act'] == 'delete') {
}
if (count($errors) == 0) {
$link = connect();
perform_query("delete from ${mysqlprefix}chatresponses where id = $key", $link);
close_connection($link);
$db = Database::getInstance();
$db->query("delete from {chatresponses} where id = ?", array($key));
header("Location: $webimroot/operator/canned.php?lang=$lang&group=$groupid");
exit;
}

View File

@ -27,11 +27,12 @@ $groupid = '';
function group_by_name($name)
{
global $mysqlprefix;
$link = connect();
$group = select_one_row(
"select * from ${mysqlprefix}chatgroup where vclocalname = '" . db_escape_string($name) . "'", $link);
close_connection($link);
$db = Database::getInstance();
$group = $db->query(
"select * from {chatgroup} where vclocalname = ?",
array($name),
array('return_rows' => Database::RETURN_ONE_ROW)
);
return $group;
}
@ -55,39 +56,49 @@ function check_group_params($group, $extra_params = NULL)
}
/**
* Creates group
*
* @param array $group Operators' group.
* The $group array must contains following keys:
* name, description, commonname, commondescription,
* email, weight, parent, title, chattitle, hosturl, logo
* @return array Created group
*/
function create_group($group)
{
global $mysqlprefix;
$db = Database::getInstance();
check_group_params($group);
$link = connect();
$query = sprintf(
"insert into ${mysqlprefix}chatgroup (parent, vclocalname,vclocaldescription,vccommonname,vccommondescription,vcemail,vctitle,vcchattitle,vchosturl,vclogo,iweight) values (%s, '%s','%s','%s','%s','%s','%s','%s','%s','%s',%u)",
($group['parent']?(int)$group['parent']:'NULL'),
db_escape_string($group['name']),
db_escape_string($group['description']),
db_escape_string($group['commonname']),
db_escape_string($group['commondescription']),
db_escape_string($group['email']),
db_escape_string($group['title']),
db_escape_string($group['chattitle']),
db_escape_string($group['hosturl']),
db_escape_string($group['logo']),
$group['weight']);
$db->query(
"insert into {chatgroup} (parent, vclocalname,vclocaldescription,vccommonname, " .
"vccommondescription,vcemail,vctitle,vcchattitle,vchosturl,vclogo,iweight) " .
"values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
array(
($group['parent'] ? (int)$group['parent'] : 'NULL'),
$group['name'],
$group['description'],
$group['commonname'],
$group['commondescription'],
$group['email'],
$group['title'],
$group['chattitle'],
$group['hosturl'],
$group['logo'],
$group['weight']
)
);
$id = $db->insertedId();
perform_query($query, $link);
$id = db_insert_id($link);
$newdep = select_one_row("select * from ${mysqlprefix}chatgroup where groupid = $id", $link);
close_connection($link);
$newdep = $db->query(
"select * from {chatgroup} where groupid = ?",
array($id),
array('return_rows' => Database::RETURN_ONE_ROW)
);
return $newdep;
}
/**
* Updates group info
*
* @param array $group Operators' group.
* The $group array must contains following keys:
* id, name, description, commonname, commondescription,
@ -95,30 +106,34 @@ function create_group($group)
*/
function update_group($group)
{
global $mysqlprefix;
$db = Database::getInstance();
check_group_params($group, array('id'));
$link = connect();
$query = sprintf(
"update ${mysqlprefix}chatgroup set parent = %s, vclocalname = '%s', vclocaldescription = '%s', vccommonname = '%s', vccommondescription = '%s', vcemail = '%s', vctitle = '%s', vcchattitle = '%s', vchosturl = '%s', vclogo = '%s', iweight = %u where groupid = %s",
($group['parent']?(int)$group['parent']:'NULL'),
db_escape_string($group['name']),
db_escape_string($group['description']),
db_escape_string($group['commonname']),
db_escape_string($group['commondescription']),
db_escape_string($group['email']),
db_escape_string($group['title']),
db_escape_string($group['chattitle']),
db_escape_string($group['hosturl']),
db_escape_string($group['logo']),
$group['weight'],
$group['id']);
perform_query($query, $link);
$db->query(
"update {chatgroup} set parent = ?, vclocalname = ?, vclocaldescription = ?, " .
"vccommonname = ?, vccommondescription = ?, vcemail = ?, vctitle = ?, " .
"vcchattitle = ?, vchosturl = ?, vclogo = ?, iweight = ? where groupid = ?",
array(
($group['parent'] ? (int)$group['parent'] : 'NULL'),
$group['name'],
$group['description'],
$group['commonname'],
$group['commondescription'],
$group['email'],
$group['title'],
$group['chattitle'],
$group['hosturl'],
$group['logo'],
$group['weight'],
$group['id']
)
);
if ($group['parent']) {
$query = sprintf("update ${mysqlprefix}chatgroup set parent = NULL where parent = %u", $group['id']);
perform_query($query, $link);
$db->query(
"update {chatgroup} set parent = NULL where parent = ?",
array($group['id'])
);
}
close_connection($link);
}
if (isset($_POST['name'])) {

View File

@ -23,34 +23,35 @@ $operator = check_login();
function get_group_members($groupid)
{
global $mysqlprefix;
$link = connect();
$query = "select operatorid from ${mysqlprefix}chatgroupoperator where groupid = $groupid";
$result = select_multi_assoc($query, $link);
close_connection($link);
return $result;
$db = Database::getInstance();
return $db->query(
"select operatorid from {chatgroupoperator} where groupid = ?",
array($groupid),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
}
function update_group_members($groupid, $newvalue)
{
global $mysqlprefix;
$link = connect();
perform_query("delete from ${mysqlprefix}chatgroupoperator where groupid = $groupid", $link);
$db = Database::getInstance();
$db->query("delete from {chatgroupoperator} where groupid = ?", array($groupid));
foreach ($newvalue as $opid) {
perform_query("insert into ${mysqlprefix}chatgroupoperator (groupid, operatorid) values ($groupid,$opid)", $link);
$db->query(
"insert into {chatgroupoperator} (groupid, operatorid) values (?, ?)",
array($groupid,$opid)
);
}
close_connection($link);
}
function get_operators()
{
global $mysqlprefix;
$link = connect();
$query = "select * from ${mysqlprefix}chatoperator order by vclogin";
$result = select_multi_assoc($query, $link);
close_connection($link);
return $result;
$db = Database::getInstance();
return $db->query(
"select * from {chatoperator} order by vclogin",
NULL,
array('return_rows' => Database::RETURN_ALL_ROWS)
);
}
$groupid = verifyparam("gid", "/^\d{1,9}$/");

View File

@ -33,11 +33,10 @@ if (isset($_GET['act']) && $_GET['act'] == 'del') {
}
if (count($errors) == 0) {
$link = connect();
perform_query("delete from ${mysqlprefix}chatgroup where groupid = $groupid", $link);
perform_query("delete from ${mysqlprefix}chatgroupoperator where groupid = $groupid", $link);
perform_query("update ${mysqlprefix}chatthread set groupid = 0 where groupid = $groupid", $link);
close_connection($link);
$db = Database::getInstance();
$db->query("delete from {chatgroup} where groupid = ?", array($groupid));
$db->query("delete from {chatgroupoperator} where groupid = ?", array($groupid));
$db->query("update {chatthread} set groupid = 0 where groupid = ?",array($groupid));
header("Location: $webimroot/operator/groups.php");
exit;
}
@ -59,9 +58,7 @@ function is_away($group)
$page = array();
$sort['by'] = verifyparam("sortby", "/^(name|lastseen|weight)$/", "name");
$sort['desc'] = (verifyparam("sortdirection", "/^(desc|asc)$/", "desc") == "desc");
$link = connect();
$page['groups'] = get_sorted_groups($link, $sort);
close_connection($link);
$page['groups'] = get_sorted_groups($sort);
$page['formsortby'] = $sort['by'];
$page['formsortdirection'] = $sort['desc']?'desc':'asc';
$page['canmodify'] = is_capable($can_administrate, $operator);

View File

@ -35,44 +35,50 @@ $searchType = verifyparam('type', '/^(all|message|operator|visitor)$/', 'all');
$searchInSystemMessages = (verifyparam('insystemmessages', '/^on$/', 'off') == 'on') || !$query;
if ($query !== false) {
$link = connect();
$db = Database::getInstance();
$groups = $db->query(
"select {chatgroup}.groupid as groupid, vclocalname " .
"from {chatgroup} order by vclocalname",
NULL,
array('return_rows' => Database::RETURN_ALL_ROWS)
);
$result = perform_query("select ${mysqlprefix}chatgroup.groupid as groupid, vclocalname " .
"from ${mysqlprefix}chatgroup order by vclocalname", $link);
$groupName = array();
while ($group = db_fetch_assoc($result)) {
foreach ($groups as $group) {
$groupName[$group['groupid']] = $group['vclocalname'];
}
db_free_result($result);
$page['groupName'] = $groupName;
$escapedQuery = db_escape_string($query, $link);
$values = array(
':query' => "%{$escapedQuery}%",
':kind_user' => $kind_user,
':kind_agent' => $kind_agent
);
$searchConditions = array();
if ($searchType == 'message' || $searchType == 'all') {
$searchConditions[] = "(${mysqlprefix}chatmessage.tmessage LIKE '%%$escapedQuery%%'" .
($searchInSystemMessages?'':" AND (${mysqlprefix}chatmessage.ikind = $kind_user OR ${mysqlprefix}chatmessage.ikind = $kind_agent)") .
$searchConditions[] = "({chatmessage}.tmessage LIKE :query" .
($searchInSystemMessages?'':" AND ({chatmessage}.ikind = :kind_user OR {chatmessage}.ikind = :kind_agent)") .
")";
}
if ($searchType == 'operator' || $searchType == 'all') {
$searchConditions[] = "(${mysqlprefix}chatthread.agentName LIKE '%%$escapedQuery%%')";
$searchConditions[] = "({chatthread}.agentName LIKE :query)";
}
if ($searchType == 'visitor' || $searchType == 'all') {
$searchConditions[] = "(${mysqlprefix}chatthread.userName LIKE '%%$escapedQuery%%')";
$searchConditions[] = "(${mysqlprefix}chatthread.remote LIKE '%%$escapedQuery%%')";
$searchConditions[] = "({chatthread}.userName LIKE :query)";
$searchConditions[] = "({chatthread}.remote LIKE :query)";
}
select_with_pagintation("DISTINCT unix_timestamp(${mysqlprefix}chatthread.dtmcreated) as created, " .
"unix_timestamp(${mysqlprefix}chatthread.dtmmodified) as modified, ${mysqlprefix}chatthread.threadid, " .
"${mysqlprefix}chatthread.remote, ${mysqlprefix}chatthread.agentName, ${mysqlprefix}chatthread.userName, groupid, " .
"messageCount as size",
"${mysqlprefix}chatthread, ${mysqlprefix}chatmessage",
array(
"${mysqlprefix}chatmessage.threadid = ${mysqlprefix}chatthread.threadid",
"(" . implode(' or ', $searchConditions) . ")"
),
"order by created DESC",
"DISTINCT ${mysqlprefix}chatthread.dtmcreated", $link);
close_connection($link);
select_with_pagintation("DISTINCT unix_timestamp({chatthread}.dtmcreated) as created, " .
"unix_timestamp({chatthread}.dtmmodified) as modified, {chatthread}.threadid, " .
"{chatthread}.remote, {chatthread}.agentName, {chatthread}.userName, groupid, " .
"messageCount as size",
"{chatthread}, {chatmessage}",
array(
"{chatmessage}.threadid = {chatthread}.threadid",
"(" . implode(' or ', $searchConditions) . ")"
),
"order by created DESC",
"DISTINCT {chatthread}.dtmcreated", $values);
$page['formq'] = topage($query);
} else {

View File

@ -21,10 +21,8 @@ require_once('../libs/operator.php');
$operator = check_login();
force_password($operator);
$link = connect();
loadsettings_($link);
$isonline = is_operator_online($operator['operatorid'], $link);
close_connection($link);
loadsettings();
$isonline = is_operator_online($operator['operatorid']);
$page = array(
'version' => $version,

View File

@ -27,9 +27,7 @@ $visitorid = verifyparam("visitor", "/^\d{1,8}$/");
$errors = array();
$link = connect();
$invitation = invitation_state($visitorid, $link);
close_connection($link);
$invitation = invitation_state($visitorid);
start_xml_output();
echo '<invitation>';

View File

@ -25,11 +25,9 @@ loadsettings();
$visitorid = verifyparam("visitor", "/^\d{1,8}$/");
$link = connect();
if (!invitation_invite($visitorid, $operator['operatorid'], $link)) {
if (!invitation_invite($visitorid, $operator['operatorid'])) {
die("Invitation failed!");
}
close_connection($link);
$page = array();
$page['visitor'] = $visitorid;

View File

@ -48,11 +48,15 @@ if (isset($_GET['act'])) {
}
if (count($errors) == 0) {
$link = connect();
perform_query("delete from ${mysqlprefix}chatgroupoperator where operatorid = $operatorid", $link);
perform_query("delete from ${mysqlprefix}chatoperator where operatorid = $operatorid", $link);
close_connection($link);
$db = Database::getInstance();
$db->query(
"delete from {chatgroupoperator} where operatorid = ?",
array($operatorid)
);
$db->query(
"delete from {chatoperator} where operatorid = ?",
array($operatorid)
);
header("Location: $webimroot/operator/operators.php");
exit;
}
@ -77,9 +81,11 @@ if (isset($_GET['act'])) {
}
if (count($errors) == 0) {
$link = connect();
perform_query("update ${mysqlprefix}chatoperator set idisabled = ".($act_disable?'1':'0')." where operatorid = $operatorid", $link);
close_connection($link);
$db = Database::getInstance();
$db->query(
"update {chatoperator} set idisabled = ? where operatorid = ?",
array(($act_disable ? '1' : '0'), $operatorid)
);
header("Location: $webimroot/operator/operators.php");
exit;

View File

@ -23,22 +23,25 @@ $operator = check_login();
function update_operator_groups($operatorid, $newvalue)
{
global $mysqlprefix;
$link = connect();
perform_query("delete from ${mysqlprefix}chatgroupoperator where operatorid = $operatorid", $link);
$db = Database::getInstance();
$db->query(
"delete from {chatgroupoperator} where operatorid = ?",
array($operatorid)
);
foreach ($newvalue as $groupid) {
perform_query("insert into ${mysqlprefix}chatgroupoperator (groupid, operatorid) values ($groupid,$operatorid)", $link);
$db->query(
"insert into {chatgroupoperator} (groupid, operatorid) values (?,?)",
array($groupid, $operatorid)
);
}
close_connection($link);
}
$operator_in_isolation = in_isolation($operator);
$opId = verifyparam("op", "/^\d{1,9}$/");
$page = array('opid' => $opId);
$link = connect();
$page['groups'] = $operator_in_isolation?get_all_groups_for_operator($operator, $link):get_all_groups($link);
close_connection($link);
$page['groups'] = $operator_in_isolation?get_all_groups_for_operator($operator):get_all_groups();
$errors = array();
$canmodify = is_capable($can_administrate, $operator);

View File

@ -24,12 +24,11 @@ csrfchecktoken();
function update_operator_permissions($operatorid, $newvalue)
{
global $mysqlprefix;
$link = connect();
$query = "update ${mysqlprefix}chatoperator set iperm = $newvalue where operatorid = $operatorid";
perform_query($query, $link);
close_connection($link);
$db = Database::getInstance();
$db->query(
"update {chatoperator} set iperm = ? where operatorid = ?",
array($newvalue, $operatorid)
);
}
$opId = verifyparam("op", "/^\d{1,9}$/");

View File

@ -41,13 +41,11 @@ if (isset($_GET['nextGroup'])) {
if ($nextGroup) {
$page['message'] = getlocal2("chat.redirected.group.content", array(topage(get_group_name($nextGroup))));
if ($thread['istate'] == $state_chatting) {
$link = connect();
commit_thread($threadid,
array("istate" => $state_waiting, "nextagent" => 0, "groupid" => $nextid, "agentId" => 0, "agentName" => "''"), $link);
array("istate" => $state_waiting, "nextagent" => 0, "groupid" => $nextid, "agentId" => 0, "agentName" => "''"));
post_message_($thread['threadid'], $kind_events,
getstring2_("chat.status.operator.redirect",
array(get_operator_name($operator)), $thread['locale']), $link);
close_connection($link);
array(get_operator_name($operator)), $thread['locale']));
} else {
$errors[] = getlocal("chat.redirect.cannot");
}
@ -62,18 +60,26 @@ if (isset($_GET['nextGroup'])) {
if ($nextOperator) {
$page['message'] = getlocal2("chat.redirected.content", array(topage(get_operator_name($nextOperator))));
if ($thread['istate'] == $state_chatting) {
$link = connect();
$threadupdate = array("istate" => $state_waiting, "nextagent" => $nextid, "agentId" => 0);
if ($thread['groupid'] != 0) {
if (FALSE === select_one_row("select groupid from ${mysqlprefix}chatgroupoperator where operatorid = $nextid and groupid = " . $thread['groupid'], $link)) {
$db = Database::getInstance();
list($groups_count) = $db->query(
"select count(*) AS count from {chatgroupoperator} " .
"where operatorid = ? and groupid = ?",
array($nextid, $thread['groupid']),
array(
'return_rows' => Database::RETURN_ONE_ROW,
'fetch_type' => Database::FETCH_NUM
)
);
if ($groups_count === 0) {
$threadupdate['groupid'] = 0;
}
}
commit_thread($threadid, $threadupdate, $link);
commit_thread($threadid, $threadupdate);
post_message_($thread['threadid'], $kind_events,
getstring2_("chat.status.operator.redirect",
array(get_operator_name($operator)), $thread['locale']), $link);
close_connection($link);
array(get_operator_name($operator)), $thread['locale']));
} else {
$errors[] = getlocal("chat.redirect.cannot");
}

View File

@ -48,10 +48,12 @@ if (count($errors) == 0 && isset($_POST['password'])) {
if (count($errors) == 0) {
$page['isdone'] = true;
$link = connect();
$query = "update ${mysqlprefix}chatoperator set vcpassword = '" . md5($password) . "', vcrestoretoken = '' where operatorid = " . $opId;
perform_query($query, $link);
close_connection($link);
$db = Database::getInstance();
$db->query(
"update {chatoperator} set vcpassword = ?, vcrestoretoken = '' " .
"where operatorid = ?",
array(md5($password), $opId)
);
$page['loginname'] = $operator['vclogin'];
start_html_output();

View File

@ -40,13 +40,15 @@ if (isset($_POST['loginoremail'])) {
if (count($errors) == 0) {
$token = md5((time() + microtime()) . rand(0, 99999999));
$link = connect();
$query = "update ${mysqlprefix}chatoperator set dtmrestore = CURRENT_TIMESTAMP, vcrestoretoken = '$token' where operatorid = " . $torestore['operatorid'];
perform_query($query, $link);
$db = Database::getInstance();
$db->query(
"update {chatoperator} set dtmrestore = CURRENT_TIMESTAMP, " .
"vcrestoretoken = ? where operatorid = ?",
array($token, $torestore['operatorid'])
);
$href = get_app_location(true, false) . "/operator/resetpwd.php?id=" . $torestore['operatorid'] . "&token=$token";
webim_mail($email, $email, getstring("restore.mailsubj"), getstring2("restore.mailtext", array(get_operator_name($torestore), $href)), $link);
close_connection($link);
webim_mail($email, $email, getstring("restore.mailsubj"), getstring2("restore.mailtext", array(get_operator_name($torestore), $href)));
$page['isdone'] = true;
require('../view/restore.php');

View File

@ -71,31 +71,61 @@ if ($start > $end) {
}
$activetab = 0;
$link = connect();
$db = Database::getInstance();
if ($statisticstype == 'bydate') {
$page['reportByDate'] = select_multi_assoc("select DATE(t.dtmcreated) as date, COUNT(distinct t.threadid) as threads, SUM(m.ikind = $kind_agent) as agents, SUM(m.ikind = $kind_user) as users, ROUND(AVG(unix_timestamp(t.dtmchatstarted)-unix_timestamp(t.dtmcreated)),1) as avgwaitingtime, ROUND(AVG(tmp.lastmsgtime - unix_timestamp(t.dtmchatstarted)),1) as avgchattime " .
"from ${mysqlprefix}chatmessage m, ${mysqlprefix}chatthread t, (SELECT i.threadid, unix_timestamp(MAX(i.dtmcreated)) AS lastmsgtime FROM ${mysqlprefix}chatmessage i WHERE (ikind = $kind_user OR ikind = $kind_agent) GROUP BY i.threadid) tmp " .
"where m.threadid = t.threadid AND tmp.threadid = t.threadid AND unix_timestamp(t.dtmchatstarted) <> 0 AND unix_timestamp(m.dtmcreated) >= $start AND unix_timestamp(m.dtmcreated) < $end group by DATE(m.dtmcreated) order by m.dtmcreated desc", $link);
$page['reportByDateTotal'] = select_one_row("select DATE(t.dtmcreated) as date, COUNT(distinct t.threadid) as threads, SUM(m.ikind = $kind_agent) as agents, SUM(m.ikind = $kind_user) as users, ROUND(AVG(unix_timestamp(t.dtmchatstarted)-unix_timestamp(t.dtmcreated)),1) as avgwaitingtime, ROUND(AVG(tmp.lastmsgtime - unix_timestamp(t.dtmchatstarted)),1) as avgchattime " .
"from ${mysqlprefix}chatmessage m, ${mysqlprefix}chatthread t, (SELECT i.threadid, unix_timestamp(MAX(i.dtmcreated)) AS lastmsgtime FROM ${mysqlprefix}chatmessage i WHERE (ikind = $kind_user OR ikind = $kind_agent) GROUP BY i.threadid) tmp " .
"where m.threadid = t.threadid AND tmp.threadid = t.threadid AND unix_timestamp(t.dtmchatstarted) <> 0 AND unix_timestamp(m.dtmcreated) >= $start AND unix_timestamp(m.dtmcreated) < $end", $link);
$page['reportByDate'] = $db->query(
"select DATE(t.dtmcreated) as date, COUNT(distinct t.threadid) as threads, SUM(m.ikind = :kind_agent) as agents, SUM(m.ikind = :kind_user) as users, ROUND(AVG(unix_timestamp(t.dtmchatstarted)-unix_timestamp(t.dtmcreated)),1) as avgwaitingtime, ROUND(AVG(tmp.lastmsgtime - unix_timestamp(t.dtmchatstarted)),1) as avgchattime " .
"from {chatmessage} m, {chatthread} t, (SELECT i.threadid, unix_timestamp(MAX(i.dtmcreated)) AS lastmsgtime FROM {chatmessage} i WHERE (ikind = :kind_user OR ikind = :kind_agent) GROUP BY i.threadid) tmp " .
"where m.threadid = t.threadid AND tmp.threadid = t.threadid AND unix_timestamp(t.dtmchatstarted) <> 0 AND unix_timestamp(m.dtmcreated) >= :start AND unix_timestamp(m.dtmcreated) < :end group by DATE(m.dtmcreated) order by m.dtmcreated desc",
array(
':kind_agent' => $kind_agent,
':kind_user' => $kind_user,
':start' => $start,
':end' => $end
),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
$page['reportByDateTotal'] = $db->query(
"select DATE(t.dtmcreated) as date, COUNT(distinct t.threadid) as threads, SUM(m.ikind = :kind_agent) as agents, SUM(m.ikind = :kind_user) as users, ROUND(AVG(unix_timestamp(t.dtmchatstarted)-unix_timestamp(t.dtmcreated)),1) as avgwaitingtime, ROUND(AVG(tmp.lastmsgtime - unix_timestamp(t.dtmchatstarted)),1) as avgchattime " .
"from {chatmessage} m, {chatthread} t, (SELECT i.threadid, unix_timestamp(MAX(i.dtmcreated)) AS lastmsgtime FROM {chatmessage} i WHERE (ikind = :kind_user OR ikind = :kind_agent) GROUP BY i.threadid) tmp " .
"where m.threadid = t.threadid AND tmp.threadid = t.threadid AND unix_timestamp(t.dtmchatstarted) <> 0 AND unix_timestamp(m.dtmcreated) >= :start AND unix_timestamp(m.dtmcreated) < :end",
array(
':kind_agent' => $kind_agent,
':kind_user' => $kind_user,
':start' => $start,
':end' => $end
),
array('return_rows' => Database::RETURN_ONE_ROW)
);
$activetab = 0;
} elseif($statisticstype == 'byagent') {
$page['reportByAgent'] = select_multi_assoc("select vclocalename as name, COUNT(distinct threadid) as threads, SUM(ikind = $kind_agent) as msgs, AVG(CHAR_LENGTH(tmessage)) as avglen " .
"from ${mysqlprefix}chatmessage, ${mysqlprefix}chatoperator " .
"where agentId = operatorid AND unix_timestamp(dtmcreated) >= $start AND unix_timestamp(dtmcreated) < $end group by operatorid", $link);
$page['reportByAgent'] = $db->query(
"select vclocalename as name, COUNT(distinct threadid) as threads, " .
"SUM(ikind = :kind_agent) as msgs, AVG(CHAR_LENGTH(tmessage)) as avglen " .
"from {chatmessage}, {chatoperator} " .
"where agentId = operatorid AND unix_timestamp(dtmcreated) >= :start " .
"AND unix_timestamp(dtmcreated) < :end group by operatorid",
array(
':kind_agent' => $kind_agent,
':start' => $start,
':end' => $end
),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
$activetab = 1;
} elseif($statisticstype == 'bypage') {
$page['reportByPage'] = select_multi_assoc("SELECT COUNT(DISTINCT p.pageid) as visittimes, p.address, COUNT(DISTINCT t.threadid) as chattimes " .
"FROM ${mysqlprefix}visitedpagestatistics p LEFT OUTER JOIN ${mysqlprefix}chatthread t ON (p.address = t.referer AND DATE(p.visittime) = DATE(t.dtmcreated)) " .
"WHERE unix_timestamp(p.visittime) >= $start AND unix_timestamp(p.visittime) < $end GROUP BY p.address", $link);
$page['reportByPage'] = $db->query(
"SELECT COUNT(DISTINCT p.pageid) as visittimes, p.address, COUNT(DISTINCT t.threadid) as chattimes " .
"FROM {visitedpagestatistics} p LEFT OUTER JOIN {chatthread} t ON (p.address = t.referer AND DATE(p.visittime) = DATE(t.dtmcreated)) " .
"WHERE unix_timestamp(p.visittime) >= :start AND unix_timestamp(p.visittime) < :end GROUP BY p.address",
array(':start' => $start, ':end' => $end),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
$activetab = 2;
}
$page['showresults'] = count($errors) == 0;
close_connection($link);
prepare_menu($operator);
setup_statistics_tabs($activetab);
start_html_output();

View File

@ -29,15 +29,16 @@ setlocale(LC_TIME, getstring("time.locale"));
function thread_info($id)
{
global $mysqlprefix;
$link = connect();
$thread = select_one_row("select userName,agentName,remote,userAgent," .
"unix_timestamp(dtmmodified) as modified, unix_timestamp(dtmcreated) as created," .
"vclocalname as groupName " .
"from ${mysqlprefix}chatthread left join ${mysqlprefix}chatgroup on ${mysqlprefix}chatthread.groupid = ${mysqlprefix}chatgroup.groupid " .
"where threadid = " . $id, $link);
close_connection($link);
return $thread;
$db = Database::getInstance();
return $db->query(
"select userName,agentName,remote,userAgent," .
"unix_timestamp(dtmmodified) as modified, unix_timestamp(dtmcreated) as created," .
"vclocalname as groupName " .
"from {chatthread} left join {chatgroup} on {chatthread}.groupid = {chatgroup}.groupid " .
"where threadid = ?",
array($id),
array('return_rows' => Database::RETURN_ONE_ROW)
);
}

View File

@ -36,21 +36,19 @@ else {
$visitorid = verifyparam("visitor", "/^\d{1,8}$/");
}
$link = connect();
if (isset($threadid)) {
$visitor = track_get_visitor_by_threadid($threadid, $link);
$visitor = track_get_visitor_by_threadid($threadid);
if (!$visitor) {
die("Wrong thread!");
}
}
else {
$visitor = track_get_visitor_by_id($visitorid, $link);
$visitor = track_get_visitor_by_id($visitorid);
if (!$visitor) {
die("Wrong visitor!");
}
}
$path = track_get_path($visitor, $link);
close_connection($link);
$path = track_get_path($visitor);
$page['entry'] = htmlspecialchars($visitor['entry']);
$page['history'] = array();

View File

@ -46,18 +46,18 @@ $threadstate_key = array(
$state_loading => "chat.thread.state_loading"
);
function thread_to_xml($thread, $link)
function thread_to_xml($thread)
{
global $state_chatting, $threadstate_to_string, $threadstate_key,
$webim_encoding, $operator, $settings,
$can_viewthreads, $can_takeover, $mysqlprefix;
$webim_encoding, $operator, $settings,
$can_viewthreads, $can_takeover;
$state = $threadstate_to_string[$thread['istate']];
$result = "<thread id=\"" . $thread['threadid'] . "\" stateid=\"$state\"";
if ($state == "closed")
return $result . "/>";
$state = getstring($threadstate_key[$thread['istate']]);
$nextagent = $thread['nextagent'] != 0 ? operator_by_id_($thread['nextagent'], $link) : null;
$nextagent = $thread['nextagent'] != 0 ? operator_by_id($thread['nextagent']) : null;
$threadoperator = $nextagent ? get_operator_name($nextagent)
: ($thread['agentName'] ? $thread['agentName'] : "-");
@ -76,7 +76,7 @@ $can_viewthreads, $can_takeover, $mysqlprefix;
$result .= " canban=\"true\"";
}
$banForThread = $settings['enableban'] == "1" ? ban_for_addr_($thread['remote'], $link) : false;
$banForThread = $settings['enableban'] == "1" ? ban_for_addr($thread['remote']) : false;
if ($banForThread) {
$result .= " ban=\"blocked\" banid=\"" . $banForThread['banid'] . "\"";
}
@ -99,8 +99,12 @@ $can_viewthreads, $can_takeover, $mysqlprefix;
$userAgent = get_useragent_version($thread['userAgent']);
$result .= "<useragent>" . $userAgent . "</useragent>";
if ($thread["shownmessageid"] != 0) {
$query = "select tmessage from ${mysqlprefix}chatmessage where messageid = " . $thread["shownmessageid"];
$line = select_one_row($query, $link);
$db = Database::getInstance();
$line = $db->query(
"select tmessage from {chatmessage} where messageid = ?",
array($thread["shownmessageid"]),
array('return_rows' => Database::RETURN_ONE_ROW)
);
if ($line) {
$message = preg_replace("/[\r\n\t]+/", " ", $line["tmessage"]);
$result .= "<message>" . htmlspecialchars(htmlspecialchars($message)) . "</message>";
@ -112,34 +116,42 @@ $can_viewthreads, $can_takeover, $mysqlprefix;
function print_pending_threads($groupids, $since)
{
global $webim_encoding, $settings, $state_closed, $state_left, $mysqlprefix;
$link = connect();
global $webim_encoding, $settings, $state_closed, $state_left;
$db = Database::getInstance();
$revision = $since;
$output = array();
$query = "select threadid, userName, agentName, unix_timestamp(dtmcreated), userTyping, " .
"unix_timestamp(dtmmodified), lrevision, istate, remote, nextagent, agentId, userid, shownmessageid, userAgent, (select vclocalname from ${mysqlprefix}chatgroup where ${mysqlprefix}chatgroup.groupid = ${mysqlprefix}chatthread.groupid) as groupname " .
"from ${mysqlprefix}chatthread where lrevision > $since " .
($since <= 0
? "AND istate <> $state_closed AND istate <> $state_left "
: "") .
($settings['enablegroups'] == '1'
? "AND (groupid is NULL" . ($groupids
? " OR groupid IN ($groupids) OR groupid IN (SELECT parent FROM ${mysqlprefix}chatgroup WHERE groupid IN ($groupids)) "
: "") .
") "
: "") .
"ORDER BY threadid";
$rows = select_multi_assoc($query, $link);
"unix_timestamp(dtmmodified), lrevision, istate, remote, nextagent, agentId, " .
"userid, shownmessageid, userAgent, (select vclocalname from {chatgroup} where {chatgroup}.groupid = {chatthread}.groupid) as groupname " .
"from {chatthread} where lrevision > :since " .
($since <= 0
? "AND istate <> :state_closed AND istate <> :state_left "
: "") .
($settings['enablegroups'] == '1'
? "AND (groupid is NULL" . ($groupids
? " OR groupid IN ($groupids) OR groupid IN (SELECT parent FROM {chatgroup} WHERE groupid IN ($groupids)) "
: "") .
") "
: "") .
"ORDER BY threadid";
$rows = $db->query(
$query,
array(
':since' => $since,
':state_closed' => $state_closed,
':state_left' => $state_left
),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
$output = array();
foreach ($rows as $row) {
$thread = thread_to_xml($row, $link);
$thread = thread_to_xml($row);
$output[] = $thread;
if ($row['lrevision'] > $revision)
$revision = $row['lrevision'];
}
close_connection($link);
echo "<threads revision=\"$revision\" time=\"" . time() . "000\">";
foreach ($output as $thr) {
print myiconv($webim_encoding, "utf-8", $thr);
@ -167,7 +179,7 @@ function print_operators($operator)
echo "</operators>";
}
function visitor_to_xml($visitor, $link)
function visitor_to_xml($visitor)
{
$result = "<visitor id=\"" . $visitor['visitorid'] . "\">";
@ -197,7 +209,7 @@ function visitor_to_xml($visitor, $link)
$result .= "<invitation>";
if ($visitor['invited']) {
$result .= "<invitationtime>" . $visitor['unix_timestamp(invitationtime)'] . "000</invitationtime>";
$operator = get_operator_name(operator_by_id_($visitor['invitedby'], $link));
$operator = get_operator_name(operator_by_id($visitor['invitedby']));
$result .= "<operator>" . htmlspecialchars(htmlspecialchars($operator)) . "</operator>";
}
$result .= "</invitation>";
@ -208,50 +220,56 @@ function visitor_to_xml($visitor, $link)
function print_visitors()
{
global $webim_encoding, $settings, $state_closed, $state_left, $mysqlprefix;
global $webim_encoding, $settings, $state_closed, $state_left;
$link = connect();
$db = Database::getInstance();
// Remove old visitors
$query = "DELETE FROM ${mysqlprefix}chatsitevisitor WHERE (UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(lasttime)) > " . $settings['tracking_lifetime'] .
" AND (threadid IS NULL OR (SELECT count(*) FROM ${mysqlprefix}chatthread WHERE threadid = ${mysqlprefix}chatsitevisitor.threadid" .
" AND istate <> $state_closed AND istate <> $state_left) = 0)";
perform_query($query, $link);
$db->query(
"DELETE FROM {chatsitevisitor} " .
"WHERE (UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(lasttime)) > ? ".
"AND (threadid IS NULL OR " .
"(SELECT count(*) FROM {chatthread} WHERE threadid = {chatsitevisitor}.threadid " .
"AND istate <> {$state_closed} AND istate <> {$state_left}) = 0)",
array($settings['tracking_lifetime'])
);
// Remove old invitations
$query = "UPDATE ${mysqlprefix}chatsitevisitor SET invited = 0, invitationtime = NULL, invitedby = NULL" .
" WHERE threadid IS NULL AND (UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(invitationtime)) > " .
$settings['invitation_lifetime'];
perform_query($query, $link);
$db->query(
"UPDATE {chatsitevisitor} SET invited = 0, invitationtime = NULL, invitedby = NULL".
" WHERE threadid IS NULL AND (UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(invitationtime)) > ?",
array($settings['invitation_lifetime'])
);
// Remove associations of visitors with closed threads
$query = "UPDATE ${mysqlprefix}chatsitevisitor SET threadid = NULL WHERE threadid IS NOT NULL AND" .
" (SELECT count(*) FROM ${mysqlprefix}chatthread WHERE threadid = ${mysqlprefix}chatsitevisitor.threadid" .
" AND istate <> $state_closed AND istate <> $state_left) = 0";
perform_query($query, $link);
$db->query(
"UPDATE {chatsitevisitor} SET threadid = NULL WHERE threadid IS NOT NULL AND" .
" (SELECT count(*) FROM {chatthread} WHERE threadid = {chatsitevisitor}.threadid" .
" AND istate <> {$state_closed} AND istate <> {$state_left}) = 0"
);
// Remove old visitors' tracks
$query = "DELETE FROM ${mysqlprefix}visitedpage WHERE (UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(visittime)) > " . $settings['tracking_lifetime'] .
" AND visitorid NOT IN (SELECT visitorid FROM ${mysqlprefix}chatsitevisitor)";
perform_query($query, $link);
$output = array();
$db->query(
"DELETE FROM {visitedpage} WHERE (UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(visittime)) > ? " .
" AND visitorid NOT IN (SELECT visitorid FROM {chatsitevisitor})",
array($settings['tracking_lifetime'])
);
$query = "SELECT visitorid, userid, username, unix_timestamp(firsttime), unix_timestamp(lasttime), " .
"entry, details, invited, unix_timestamp(invitationtime), invitedby, invitations, chats " .
"FROM ${mysqlprefix}chatsitevisitor " .
"FROM {chatsitevisitor} " .
"WHERE threadid IS NULL " .
"ORDER BY invited, lasttime DESC, invitations";
$query .= ($settings['visitors_limit'] == '0') ? "" : " LIMIT " . $settings['visitors_limit'];
$rows = select_multi_assoc($query, $link);
$rows = $db->query($query, NULL, array('return_rows' => Database::RETURN_ALL_ROWS));
$output = array();
foreach ($rows as $row) {
$visitor = visitor_to_xml($row, $link);
$visitor = visitor_to_xml($row);
$output[] = $visitor;
}
close_connection($link);
echo "<visitors>";
foreach ($output as $thr) {
print myiconv($webim_encoding, "utf-8", $thr);
@ -264,13 +282,11 @@ $status = verifyparam("status", "/^\d{1,2}$/", 0);
$showonline = verifyparam("showonline", "/^1$/", 0);
$showvisitors = verifyparam("showvisitors", "/^1$/", 0);
$link = connect();
loadsettings_($link);
loadsettings();
if (!isset($_SESSION["${mysqlprefix}operatorgroups"])) {
$_SESSION["${mysqlprefix}operatorgroups"] = get_operator_groupslist($operator['operatorid'], $link);
$_SESSION["${mysqlprefix}operatorgroups"] = get_operator_groupslist($operator['operatorid']);
}
close_old_threads($link);
close_connection($link);
close_old_threads();
$groupids = $_SESSION["${mysqlprefix}operatorgroups"];
start_xml_output();

View File

@ -35,21 +35,19 @@ if (isset($_GET['userid'])) {
function threads_by_userid($userid)
{
global $mysqlprefix;
$db = Database::getInstance();
if ($userid == "") {
return null;
}
$link = connect();
$query = sprintf("select unix_timestamp(dtmcreated) as created, unix_timestamp(dtmmodified) as modified, " .
" threadid, remote, agentName, userName " .
"from ${mysqlprefix}chatthread " .
"where userid=\"$userid\" order by created DESC", $userid);
$foundThreads = select_multi_assoc($query, $link);
close_connection($link);
return $foundThreads;
return $db->query(
"select unix_timestamp(dtmcreated) as created, " .
"unix_timestamp(dtmmodified) as modified, threadid, remote, agentName, userName " .
"from {chatthread} " .
"where userid=? order by created DESC",
array($userid),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
}
$found = threads_by_userid($userid);

View File

@ -26,10 +26,8 @@ $status = isset($_GET['away']) ? 1 : 0;
notify_operator_alive($operator['operatorid'], $status);
$link = connect();
loadsettings_($link);
$_SESSION["${mysqlprefix}operatorgroups"] = get_operator_groupslist($operator['operatorid'], $link);
close_connection($link);
loadsettings();
$_SESSION["${mysqlprefix}operatorgroups"] = get_operator_groupslist($operator['operatorid']);
$page = array();
$page['havemenu'] = isset($_GET['nomenu']) ? "0" : "1";

View File

@ -30,14 +30,12 @@ if ($settings['enabletracking'] == '1') {
$entry = isset($_GET['entry']) ? $_GET['entry'] : "";
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
$link = connect();
if (isset($_SESSION['visitorid']) && preg_match('/^[0-9]+$/', $_SESSION['visitorid'])) {
$invited = invitation_check($_SESSION['visitorid'], $link);
$visitorid = track_visitor($_SESSION['visitorid'], $entry, $referer, $link);
$invited = invitation_check($_SESSION['visitorid']);
$visitorid = track_visitor($_SESSION['visitorid'], $entry, $referer);
}
else {
$visitorid = track_visitor_start($entry, $referer, $link);
$visitorid = track_visitor_start($entry, $referer);
}
if ($visitorid) {
@ -45,10 +43,9 @@ if ($settings['enabletracking'] == '1') {
}
if ($invited !== FALSE) {
$operator = operator_by_id_($invited, $link);
$operator = operator_by_id($invited);
}
close_connection($link);
}
$response = array();

View File

@ -73,12 +73,10 @@ if( $act == "refresh" ) {
show_error("cannot send");
}
$link = connect();
$postedid = post_message_($threadid,$kind,$message,$link,$from,null,$isuser ? null : $operator['operatorid'] );
$postedid = post_message_($threadid,$kind,$message,$from,null,$isuser ? null : $operator['operatorid'] );
if($isuser && $thread["shownmessageid"] == 0) {
commit_thread( $thread['threadid'], array('shownmessageid' => $postedid), $link);
commit_thread( $thread['threadid'], array('shownmessageid' => $postedid));
}
close_connection($link);
print_thread_messages($thread, $token, $lastid, $isuser, $outformat, $isuser ? null : $operator['operatorid']);
exit;