Added groups isolation

This commit is contained in:
Dmitriy Simushev 2012-02-25 19:40:05 +00:00
parent a5243fa1f3
commit 61c52eb127
12 changed files with 109 additions and 23 deletions

View File

@ -695,6 +695,7 @@ $settings = array(
'forcessl' => '0',
'usercanchangename' => '1',
'enablegroups' => '0',
'enablegroupsisolation' => '0',
'enablestatistics' => '1',
'enabletracking' => '0',
'enablepresurvey' => '1',

View File

@ -80,6 +80,25 @@ function operator_get_all()
return $operators;
}
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;
}
function operator_is_online($operator)
{
global $settings;
@ -286,18 +305,23 @@ function logout_operator()
}
}
function setup_redirect_links($threadid, $token)
function setup_redirect_links($threadid, $operator, $token)
{
global $page, $webimroot, $settings, $mysqlprefix;
loadsettings();
$link = connect();
$operatorscount = db_rows_count("${mysqlprefix}chatoperator", array(), "", $link);
$operator_in_isolation = in_isolation($operator);
$operators = $operator_in_isolation?get_operators_from_adjacent_groups($operator):operator_get_all();
$operatorscount = count($operators);
$link = connect();
$groupscount = 0;
$groups = array();
if ($settings['enablegroups'] == "1") {
foreach (get_groups($link, true) as $group) {
$groupslist = $operator_in_isolation?get_groups_for_operator($link, $operator, true):get_groups($link, true);
foreach ($groupslist as $group) {
if ($group['inumofagents'] == 0) {
continue;
}
@ -305,17 +329,14 @@ function setup_redirect_links($threadid, $token)
}
$groupscount = count($groups);
}
close_connection($link);
prepare_pagination(max($operatorscount, $groupscount), 8);
$p = $page['pagination'];
$limit = $p['limit'];
$operators = select_multi_assoc(db_build_select(
"operatorid, vclogin, vclocalename, vccommonname, istatus, (unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time",
"${mysqlprefix}chatoperator", array(), "order by vclogin $limit"), $link);
$operators = array_slice($operators, $p['start'], $p['end'] - $p['start']);
$groups = array_slice($groups, $p['start'], $p['end'] - $p['start']);
close_connection($link);
$agent_list = "";
$params = array('thread' => $threadid, 'token' => $token);
@ -375,6 +396,13 @@ function is_capable($perm, $operator)
return $perm >= 0 && $perm < 32 && ($permissions & (1 << $perm)) != 0;
}
function in_isolation($operator)
{
global $settings, $can_administrate;
loadsettings();
return (!is_capable($can_administrate, $operator) && $settings['enablegroups'] && $settings['enablegroupsisolation']);
}
function prepare_menu($operator, $hasright = true)
{
global $page, $settings, $can_administrate;
@ -395,6 +423,18 @@ function get_all_groups($link)
return get_sorted_child_groups_(select_multi_assoc($query, $link));
}
function get_all_groups_for_operator($operator, $link)
{
global $mysqlprefix;
$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));
}
function get_sorted_child_groups_($groupslist, $skipgroups = array(), $maxlevel = -1, $groupid = NULL, $level = 0)
{
$child_groups = array();
@ -410,10 +450,10 @@ function get_sorted_child_groups_($groupslist, $skipgroups = array(), $maxlevel
return $child_groups;
}
function get_groups($link, $checkaway)
function get_groups_($link, $operator, $checkaway)
{
global $mysqlprefix;
$query = "select ${mysqlprefix}chatgroup.groupid as groupid, parent, vclocalname, vclocaldescription, iweight" .
$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 " .
@ -427,10 +467,27 @@ function get_groups($link, $checkaway)
"and ${mysqlprefix}chatgroupoperator.operatorid = ${mysqlprefix}chatoperator.operatorid) as ilastseenaway"
: ""
) .
" from ${mysqlprefix}chatgroup order by iweight, vclocalname";
" 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 iweight, vclocalname";
return get_sorted_child_groups_(select_multi_assoc($query, $link));
}
function get_groups($link, $checkaway)
{
return get_groups_($link, NULL, $checkaway);
}
function get_groups_for_operator($link, $operator, $checkaway)
{
return get_groups_($link, $operator, $checkaway);
}
function get_operator_groupids($operatorid)
{
global $mysqlprefix;

View File

@ -478,6 +478,8 @@ settings.enableban.description=Using it you can block attacks from specific IPs
settings.enableban=Enable feature "Malicious Visitors"
settings.enablegroups.description=Use it to have separate queues for different questions.
settings.enablegroups=Enable "Groups"
settings.enablegroupsisolation=Enable "Groups Isolation"
settings.enablegroupsisolation.description=Use it to completely isolate groups from each other.
settings.enablepresurvey.description=Forces the user to fill out a special form to start a chat.
settings.enablepresurvey=Enable "Pre-chat survey"
settings.enablessl.description=Please note that your web server should be configured to support https requests.

View File

@ -476,6 +476,8 @@ settings.enableban.description=
settings.enableban=Включить функцию "Нежелательные посетители"
settings.enablegroups.description=Позволяет объединять операторов в группы и организовывать для них отдельные очереди.
settings.enablegroups=Включить функцию "Группы"
settings.enablegroupsisolation=Âêëþ÷èòü ôóíêöèþ "Èçîëÿöèÿ ãðóïï"
settings.enablegroupsisolation.description=Ïîçâîëÿåò ïîëíîñòüþ èçîëèðîâàòü ãðóïïû äðóã îò äðóãà.
settings.enablepresurvey.description=Предлагает посетителю заполнить специальную форму перед началом чата.
settings.enablepresurvey=Включить "Опрос перед началом диалога"
settings.enablessl.description=Ваш сервер должен быть настроен для обработки https запросов.

View File

@ -123,7 +123,7 @@ start_html_output();
$pparam = verifyparam("act", "/^(redirect)$/", "default");
if ($pparam == "redirect") {
setup_redirect_links($threadid, $token);
setup_redirect_links($threadid, $operator, $token);
expand("../styles/dialogs", getchatstyle(), "redirect.tpl");
} else {
expand("../styles/dialogs", getchatstyle(), "chat.tpl");

View File

@ -61,7 +61,7 @@ if ($groupid) {
}
$link = connect();
$allgroups = get_all_groups($link);
$allgroups = in_isolation($operator)?get_all_groups_for_operator($operator, $link):get_all_groups($link);
close_connection($link);
$page['groups'] = array();
$page['groups'][] = array('groupid' => '', 'vclocalname' => getlocal("page.gen_button.default_group"));

View File

@ -29,7 +29,9 @@ $page = array('agentId' => '');
$errors = array();
$options = array(
'enableban', 'usercanchangename', 'enablegroups', 'enablestatistics', 'enabletracking',
'enableban', 'usercanchangename',
'enablegroups', 'enablegroupsisolation',
'enablestatistics', 'enabletracking',
'enablessl', 'forcessl',
'enablepresurvey', 'surveyaskmail', 'surveyaskgroup', 'surveyaskmessage',
'enablepopupnotification', 'showonlineoperators',

View File

@ -92,7 +92,7 @@ if (isset($_GET['act'])) {
}
$page = array();
$page['allowedAgents'] = operator_get_all();
$page['allowedAgents'] = in_isolation($operator)?get_operators_from_adjacent_groups($operator):operator_get_all();
$page['canmodify'] = is_capable($can_administrate, $operator);
setlocale(LC_TIME, getstring("time.locale"));

View File

@ -36,11 +36,12 @@ function update_operator_groups($operatorid, $newvalue)
close_connection($link);
}
$operator_in_isolation = in_isolation($operator);
$opId = verifyparam("op", "/^\d{1,9}$/");
$page = array('opid' => $opId);
$link = connect();
$page['groups'] = get_all_groups($link);
$page['groups'] = $operator_in_isolation?get_all_groups_for_operator($operator, $link):get_all_groups($link);
close_connection($link);
$errors = array();

View File

@ -79,7 +79,7 @@ if ($show == 'redirect' || $show == 'redirected' || $show == 'agentchat' || $sho
'operatorid' => ($show == 'agentrochat' ? 2 : 1),
));
if ($show == 'redirect') {
setup_redirect_links(0, $show == 'agentrochat' ? 124 : 123);
setup_redirect_links(0, $operator, $show == 'agentrochat' ? 124 : 123);
} elseif ($show == 'redirected') {
$page['message'] = getlocal2("chat.redirected.content", array("Administrator"));
}

View File

@ -151,11 +151,11 @@ function print_pending_threads($groupids, $since)
echo "</threads>";
}
function print_operators()
function print_operators($operator)
{
global $webim_encoding;
global $webim_encoding, $settings;
echo "<operators>";
$operators = operator_get_all();
$operators = in_isolation($operator)?get_operators_from_adjacent_groups($operator):operator_get_all();
foreach ($operators as $operator) {
if (!operator_is_online($operator))
@ -278,7 +278,7 @@ $groupids = $_SESSION["${mysqlprefix}operatorgroups"];
start_xml_output();
echo '<update>';
if ($showonline) {
print_operators();
print_operators($operator);
}
print_pending_threads($groupids, $since);
if ($showvisitors) {

View File

@ -45,6 +45,14 @@ function updateSSL() {
}
}
function updateGroups(){
if($("#enablegroups").is(":checked")) {
$(".undergroups").show();
} else {
$(".undergroups").hide();
}
}
$(function(){
$("#enablepresurvey").change(function() {
updateSurvey();
@ -52,8 +60,12 @@ $(function(){
$("#enablessl").change(function() {
updateSSL();
});
$("#enablegroups").change(function() {
updateGroups();
});
updateSurvey();
updateSSL();
updateGroups();
});
</script>
<?php
@ -109,10 +121,19 @@ require_once('inc_errors.php');
<div class="field">
<div class="flabel"><?php echo getlocal('settings.enablegroups') ?></div>
<div class="fvalue">
<input type="checkbox" name="enablegroups" value="on"<?php echo form_value_cb('enablegroups') ? " checked=\"checked\"" : "" ?><?php echo $page['canmodify'] ? "" : " disabled=\"disabled\"" ?>/>
<input id="enablegroups" type="checkbox" name="enablegroups" value="on"<?php echo form_value_cb('enablegroups') ? " checked=\"checked\"" : "" ?><?php echo $page['canmodify'] ? "" : " disabled=\"disabled\"" ?>/>
</div>
<div class="fdescr"> &mdash; <?php echo getlocal('settings.enablegroups.description') ?></div>
<br clear="all"/>
<div class="subfield undergroups">
<div class="flabel"><?php echo getlocal('settings.enablegroupsisolation') ?></div>
<div class="fvalue">
<input type="checkbox" name="enablegroupsisolation" value="on"<?php echo form_value_cb('enablegroupsisolation') ? " checked=\"checked\"" : "" ?><?php echo $page['canmodify'] ? "" : " disabled=\"disabled\"" ?>/>
</div>
<div class="fdescr"> &mdash; <?php echo getlocal('settings.enablegroupsisolation.description') ?></div>
<br clear="all"/>
</div>
</div>
<div class="field">