Files
resourcespace/pages/ajax/message.php
2025-07-18 16:20:14 +07:00

399 lines
15 KiB
PHP

<?php
DEFINE("MESSAGE_POLLING_ABSENT_USER_TIMEOUT_SECONDS", 30);
DEFINE("MESSAGE_FADEOUT_SECONDS", 5);
// check for callback, i.e. this file being called directly to get any new messages
if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])) {
include_once __DIR__ . "/../../include/boot.php";
include __DIR__ . "/../../include/authenticate.php";
if ($actions_on) {
include_once __DIR__ . "/../../include/action_functions.php";
include_once __DIR__ . "/../../include/request_functions.php";
}
if (getval("check_upgrade_in_progress", "") != "") {
$data["upgrade_in_progress"] = false;
if (is_process_lock("process_lock_upgrade_in_progress")) {
$data["upgrade_in_progress"] = true;
}
echo json_encode(array(
"status" => "success",
"data" => $data));
exit();
}
$user = getval('user', 0, true);
$seen = getval('seen', 0, true);
$unseen = getval('unseen', 0, true);
$allseen = getval('allseen', 0, true);
$deleteselusrmsg = getval('deleteselusrmsg', "");
$selectedseen = getval('selectedseen', "");
$selectedunseen = getval('selectedunseen', "");
$getrefs = getval('getrefs', 0, true);
if (0 < $user) {
if (is_numeric($user) && !checkperm_user_edit($user)) {
exit($lang['error-permissiondenied']);
}
} else {
// no user specified so default to the current user
$user = $userref;
}
// It is an acknowledgement so set as seen and get out of here
if (0 < $seen) {
message_seen($seen);
return;
}
if (0 < $unseen) {
message_unseen($unseen);
return;
}
// Acknowledgement all messages then get out of here
if (0 < $allseen) {
message_seen_all($allseen);
return;
}
// Purge messages that have an expired TTL then get out of here
if ('' != getval('purge', '')) {
message_purge();
return;
}
// Delete all selected messages
if ($deleteselusrmsg != "") {
message_deleteselusrmsg($deleteselusrmsg);
return;
}
// Mark all selected messages as seen
if ($selectedseen != "") {
message_selectedseen($selectedseen);
return;
}
// Mark all selected messages as unseen
if ($selectedunseen != "") {
message_selectedunseen($selectedunseen);
return;
}
// Return list of references of all messages
if ($getrefs > 0) {
message_getrefs($getrefs);
return;
}
// Check if there are messages
$messages = array();
message_get($messages, $user); // note: messages are passed by reference
$extramessage = array('ref' => 0);
$extramessages = false;
if ($actions_on) {
$actioncount = get_user_actions(true);
if ($actioncount > 0) {
$extramessage['actioncount'] = $actioncount;
$extramessages = true;
}
}
if ($offline_job_queue) {
$userfailedjobs = count(job_queue_get_jobs("", STATUS_ERROR, (checkperm('a') ? 0 : $userref)));
$allfailedjobs = count(job_queue_get_jobs("", STATUS_ERROR));
$jobcounts = [];
if ($userfailedjobs > 0) {
$jobcounts['user'] = $userfailedjobs;
}
if ($allfailedjobs > 0) {
$jobcounts['all'] = $allfailedjobs;
}
if (!empty($jobcounts)) {
$extramessage['failedjobcount'] = $jobcounts;
$extramessages = true;
}
}
if ($extramessages) {
$messages[] = $extramessage;
}
ob_clean(); // just in case we have any stray whitespace at the start of this file
echo json_encode($messages);
return;
}
?><script>
var activeSeconds=<?php echo MESSAGE_POLLING_ABSENT_USER_TIMEOUT_SECONDS; ?>;
var message_timer = null;
var message_refs = new Array();
var message_poll_first_run = true;
function message_poll()
{
if (message_timer != null)
{
clearTimeout(message_timer);
message_timer = null;
}
activeSeconds-=<?php echo $message_polling_interval_seconds; ?>;
<?php
if ($message_polling_interval_seconds > 0) {
?>if(activeSeconds < 0)
{
message_timer = window.setTimeout(message_poll,<?php echo $message_polling_interval_seconds; ?> * 1000);
return;
}
<?php
}
?>
jQuery.ajax({
url: '<?php echo $baseurl; ?>/pages/ajax/message.php?ajax=true',
type: 'GET',
success: function(messages, textStatus, xhr) {
if(xhr.status==200 && isJson(messages) && (messages=jQuery.parseJSON(messages)) && jQuery(messages).length>0)
{
messagecount = messages.length;
if(messages[messages.length - 1]['ref'] == 0)
{
// The last message is a dummy entry with a count of actions and failed jobs
messagecount = messagecount-1;
}
totalcount = messagecount;
actioncount=0;
failedjobcount=0;
if (typeof(messages[messages.length - 1]['actioncount']) !== 'undefined') // There are actions as well as messages
{
actioncount=parseInt(messages[messagecount]['actioncount']);
totalcount=totalcount+actioncount;
}
if (typeof(messages[messages.length - 1]['failedjobcount']) !== 'undefined')
{
userfailedjobcount = parseInt(messages[messagecount]['failedjobcount']['user']);
totalcount = totalcount + userfailedjobcount;
failedjobcount = parseInt(messages[messagecount]['failedjobcount']['all']);
}
jQuery('span.MessageTotalCountPill').html(totalcount).fadeIn();
if (activeSeconds > 0 || message_poll_first_run)
{
for(var i=0; i < messagecount; i++)
{
var ref = messages[i]['ref'];
if (message_poll_first_run)
{
message_refs.push(ref);
continue;
}
if (message_refs.indexOf(ref)!=-1)
{
continue;
}
message_refs.push(ref);
var message = nl2br(messages[i]['message']);
var url = messages[i]['url'];
if(messages[i]['type'] & <?php echo MESSAGE_ENUM_NOTIFICATION_TYPE_USER_MESSAGE ?> && pagename =='user_message' && parseInt(messages[i]['ownerid']) == parseInt(msgto))
{
// Show the message directly on the page if on user_message.php and communicating with this user
showUserMessage(messages[i]['message'],false);
}
else
{
// Show message popup if configured
<?php
if ($user_pref_show_notifications) {
?>
message_display(message, url, ref, function (ref) {
jQuery.get('<?php echo $baseurl; ?>/pages/ajax/message.php?ajax=true&seen=' + ref);
});
<?php
}
?>
}
message_poll();
}
}
if (actioncount>0)
{
jQuery('span.ActionCountPill').html(actioncount).fadeIn();
}
else
{
jQuery('span.ActionCountPill').hide();
}
if (messagecount>0)
{
jQuery('span.MessageCountPill').html(messagecount).fadeIn();
}
else
{
jQuery('span.MessageCountPill').hide();
}
if (failedjobcount>0)
{
jQuery('span.FailedJobCountPill').html(failedjobcount).fadeIn();
let teampill = jQuery('#TeamMessages');
if(teampill.attr('data-value') != undefined)
{
failedjobcount = failedjobcount + teampill.attr('data-value');
}
teampill.html(failedjobcount).fadeIn();
}
else
{
jQuery('span.FailedJobCountPill').hide();
}
}
else
{
jQuery('span.MessageTotalCountPill').hide();
jQuery('span.MessageCountPill').hide();
jQuery('span.ActionCountPill').hide();
}
}
}).done(function() {
<?php if ($message_polling_interval_seconds > 0) {
?>message_timer = window.setTimeout(message_poll,<?php echo $message_polling_interval_seconds; ?> * 1000);
<?php
}
?>
message_poll_first_run = false;
});
check_upgrade_in_progress();
}
jQuery(document).bind("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error",
function() {
activeSeconds=<?php echo MESSAGE_POLLING_ABSENT_USER_TIMEOUT_SECONDS; ?>;
});
jQuery(document).ready(function () {
message_poll();
});
function message_display(message, url, ref, callback)
{
if (typeof ref==="undefined")
{
ref=new Date().getTime();
}
if (typeof url==="undefined")
{
url="";
}
if (url!="")
{
url=decodeURIComponent(url);
url="<a href='" + url + "'><?php echo escape($lang['link']); ?></a>";
}
var id='message' + ref;
if (jQuery("#" + id).length) // already being displayed
{
return;
}
jQuery('div#MessageContainer')
.append("<div class='MessageBox' style='display: none;' id='" + id + "'>" + nl2br(DOMPurify.sanitize(message)) + "<br />" + url + "</div>")
.after(function()
{
var t = window.setTimeout(function()
{
jQuery("div#" + id).fadeOut("fast",function()
{
this.remove()
}
)
},<?php echo MESSAGE_FADEOUT_SECONDS; ?>000);
jQuery("div#" + id).show().bind("click",function()
{
jQuery("div#" + id).fadeOut("fast", function()
{
jQuery("div#" + id).remove();
jQuery.get('<?php echo $baseurl; ?>/pages/ajax/message.php?ajax=true&seen=' + ref);
if (typeof callback === 'function')
{
callback();
}
});
});
jQuery("div#" + id).bind("mouseenter",function()
{
window.clearTimeout(t);
jQuery("div#" + id).fadeIn("fast");
});
jQuery("div#" + id).bind("mouseleave",function()
{
window.clearTimeout(t);
t = window.setTimeout(function()
{
jQuery("div#" + id).fadeOut("fast",function()
{
this.remove();
}
)},<?php echo ceil(MESSAGE_FADEOUT_SECONDS / 2); ?>000);
});
});
}
function message_modal(message, url, ref, owner)
{
if (typeof ref==="undefined")
{
ref=new Date().getTime();
}
if (typeof url==="undefined")
{
url="";
}
if (url!="")
{
url=decodeURIComponent(url);
url=DOMPurify.sanitize(url);
url="<a class='message_link' href='" + url + "'><?php echo escape($lang['link']); ?></a>";
}
if (typeof owner==="undefined" || owner=='')
{
owner = '<?php echo escape($applicationname); ?>';
}
jQuery("#modal_dialog").html("<div class='MessageText'>" + nl2br(DOMPurify.sanitize(message)) + "</div>" + url);
jQuery("#modal_dialog").addClass('message_dialog');
jQuery("#modal_dialog").dialog({
title: '<?php echo escape($lang['message'] . " " . strtolower($lang["from"])) . " "; ?>' + owner,
modal: true,
resizable: false,
buttons: [{text: "<?php echo escape($lang['ok']); ?>",
click: function() {
jQuery( this ).dialog( "close" );
}}],
dialogClass: 'message',
width: (jQuery(window).width() <= 1280) ? jQuery(window).width()*0.7 : 600,
maxHeight: jQuery(window).height()*0.8,
draggable: true,
open: function(event, ui) {
jQuery('.ui-widget-overlay').bind('click', function(){ jQuery("#modal_dialog").dialog('close'); });
jQuery( ".ui-dialog-content" ).scrollTop(0);
},
close: function( event, ui ) {
jQuery('#modal_dialog').html('');
jQuery("#modal_dialog").removeClass('message_dialog');
jQuery.get('<?php echo $baseurl; ?>/pages/ajax/message.php?ajax=true&seen=' + ref);
},
dialogClass: 'no-close'
});
}
</script>