<?php
/**
* @package XenCentral Feedback System
* @author DNF Technology
* @copyright Drnoyan & Nalyan LDA, Portugal, EU
* @license http://dnf.technology/terms/
* @link http://customers.dnf.technology
* @version 2.0.0 Beta 10
* @revision 12
*/
namespace XenCentral\Feedback\Repository;
use XF\Db\Exception;
use XF\Mvc\Entity\Finder;
use XF\Mvc\Entity\Repository;
use XenCentral\Feedback\PreferencesContainer;
class Notification
{
use FeedbackAbstractRepository;
public function notifyNewFeedback($feedbackId)
{
$feedback = $this->_getFeedbackModel()->getFeedbackById($feedbackId);
$userPreferences = new \XenCentral\Feedback\PreferencesContainer(
$this->_getPreferencesModel()->getUserNotificationPreferences($feedback['rateduser']['user_id']),
$feedback
);
$adminPreferences = new \XenCentral\Feedback\PreferencesContainer(
$this->_getPreferencesModel()->getAdminPreferences(),
$feedback
);
$fromUserId = $feedback['rateruser']['user_id'];
$toUserId = $feedback['rateduser']['user_id'];
$fromUserName = $feedback['rateruser']['username'];
$toUserName = $feedback['rateduser']['username'];
if ($userPreferences->sendNotification()) {
if ($feedback['has_reply'] == 0) {
$this->_sendNewFeedbackAlert($toUserId, $fromUserId, $fromUserName, $feedbackId, '_moderated');
} else {
$this->_sendNewFeedbackAlert($toUserId, $fromUserId, $fromUserName, $feedbackId);
}
} else if ($feedback['has_reply'] == 0) {
$this->_sendNewFeedbackAlert($toUserId, $fromUserId, $fromUserName, $feedbackId, '_moderated');
}
if ($adminPreferences->sendAdminNotification()) {
$admins=\XF::options()->xcfs_admin_username;
foreach ($admins as $admin) {
$admin = \XF::app()->em()->find('XF:User', [
'user_id' => $admin
]);
if (isset($admin)) {
$this->_sendNewFeedbackAdminAlert($admin, $fromUserId, $fromUserName, $toUserName, $feedback);
}
}
}
if ($userPreferences->sendEmail()) {
if ($userPreferences->getEmailNotificationType() == 0) {
// send email
$this->_sendSeparateNewFeedbackEmail($feedback);
} else {
$this->_queueNewFeedbackEmail($feedback);
}
}
$admins=\XF::options()->xcfs_admin_username;
foreach ($admins as $admin) {
$toAdmin = \XF::app()->em()->find('XF:User', [
'user_id' => $admin
]);
if ($adminPreferences->sendAdminEmail()) {
if ($adminPreferences->getEmailAdminNotificationType() == 0) {
// send email
$this->_sendSeparateNewFeedbackEmail($feedback, $toAdmin['user_id'], '_admin');
} else {
$this->_queueNewFeedbackEmail($feedback, $toAdmin['user_id']);
}
}
}
if ($userPreferences->sendPm()) {
if ($userPreferences->getPmNotificationType() == 0) {
// send pm
$this->_sendSeparateNewFeedbackPM($feedback);
} else {
$this->_queueNewFeedbackPM($feedback);
}
}
if ($adminPreferences->sendAdminPm()) {
$admins=\XF::options()->xcfs_admin_username;
foreach ($admins as $admin) {
$toAdmin = \XF::app()->em()->find('XF:User', [
'user_id' => $admin
]);
if ($adminPreferences->getPmAdminNotificationType() == 0) {
$this->_sendSeparateNewFeedbackAdminPM($feedback, $toAdmin['user_id']);
} else {
$this->_queueNewFeedbackPM($feedback, $toAdmin['user_id']);
}
}
}
}
public function _sendSeparateNewFeedbackEmail($feedback, $toUserId = false, $postfix = '')
{
$feedbackUrl = \XF::app()->router('public')->buildLink('full:feedback/feedback/view', $feedback);
if ($toUserId == false) {
$user= \XF::app()->em()->find('XF:User', [
'user_id' => $feedback['foruserid']
]);
} else {
$user= \XF::app()->em()->find('XF:User', [
'user_id' => $toUserId
]);
}
$params = array(
'user' => $user,
'feedbackType' => \XF::phrase('xcfs_' . $feedback['feedback_string']),
'boardTitle' => $boardTitle = \XF::options()->boardTitle,
'feedback' => $feedback,
'feedbackURL' => $feedbackUrl
);
\XF::app()->mailer()->newMail()
->setToUser($user)
->setTemplate('xcfs_new_feedback', $params)
->queue();
return true;
}
public function _queueNewFeedbackEmail($feedback, $userId = false)
{
if (!$userId) {
$userId = $feedback['rateduser']['user_id'];
}
$q = "
INSERT INTO xf_xc_feedback_notification_queue (
`forUserId`,
`date`,
`handler`,
`sent`,
`extraData`)
VALUES (
" . $userId . ",
" . \XF::$time . ",
'XenCentral\\\\Feedback\\\\NotificationQueue\\\\Email',
0,
" . \XF::db()->quote(serialize($feedback)) . "
)
";
\XF::db()->query($q);
}
public function _sendSeparateNewFeedbackPM($feedback, $toUserId = false, $postfix = '')
{
$userFrom = \XF::app()->em()->find('XF:User', [
'user_id' => $feedback['fromuserid']
]);
$userTo = \XF::app()->em()->find('XF:User', [
'user_id' => $feedback['foruserid']
]);
$creator = \XF::service('XF:Conversation\Creator', $userFrom);
//$creator->setIsAutomated();
$creator->setRecipientsTrusted($userTo);
$creator->setContent($feedback['review'], $feedback['review']);
if (!$creator->validate())
{
return;
}
$creator->save();
}
public function _sendSeparateNewFeedbackAdminPM($feedback, $toUserId = false, $postfix = '')
{
$user = \XF::app()->em()->find('XF:User', [
'user_id' => $toUserId
]);
$fromuser = \XF::app()->em()->find('XF:User', [
'user_id' => $feedback['fromuserid']
]);
$creator = \XF::service('XF:Conversation\Creator', $fromuser);
//$creator->isAutomated();
$creator->setRecipientsTrusted($user);
$creator->setContent($feedback['review'], $feedback['review']);
if (!$creator->validate())
{
return;
}
$creator->save();
}
public function _queueNewFeedbackPM($feedback, $userId = false)
{
if (!$userId) {
$userId = $feedback['rateduser']['user_id'];
}
$q = "
INSERT INTO xf_xc_feedback_notification_queue (
`forUserId`,
`date`,
`handler`,
`sent`,
`extraData`)
VALUES (
" . $userId . ",
" . \XF::$time . ",
'XenCentral\\\\Feedback\\\\NotificationQueue\\\\PM',
0,
" . \XF::db()->quote(serialize($feedback)) . "
)
";
\XF::db()->query($q);
}
public function _sendNewFeedbackAlert($toUserId, $fromUserId, $fromUserName, $feedbackId, $postfix='')
{
$toUserId = \XF::app()->em()->find('XF:User', [
'user_id' => $toUserId
]);
$alertRepo = \XF::repository('XF:UserAlert');
$alertRepo->alert(
$toUserId,
$fromUserId,
$fromUserName,
'feedback',
$feedbackId,
'feedback'.$postfix
);
}
protected function _sendNewFeedbackAdminAlert($toUserId, $fromUserId, $fromUserName, $toUsername, $feedback)
{
$alertRepo = \XF::repository('XF:UserAlert');
$alertRepo->alert(
$toUserId,
$fromUserId,
$fromUserName,
'feedback',
$feedback['fb_id'],
'feedback',
array()
);
}
public static function runQueue()
{
$self = new self();
$orderedNotifications = array();
$notifications = \XF::db()->fetchAll("
SELECT * FROM xf_xc_feedback_notification_queue
WHERE sent=0
ORDER BY `date` ASC
");
// $userCache=array();
$handlerCache = array();
$markAsRead = array();
foreach ($notifications AS $notification) {
$notification['extraData'] = $notification['extraData'] ? unserialize($notification['extraData']) : array();
if ($notification['forUserId'] != $notification['extraData']['foruserid']) {
$notification['extraData']['isAdmin'] = true;
} else {
$notification['extraData']['isAdmin'] = false;
}
if (!isset($handlerCache[$notification['handler']])) {
$handlerCache[$notification['handler']] = new $notification['handler']();
}
/* @var $notificationHandler XenCentral_Feedback_NotificationQueue_Abstract */
$notificationHandler = $handlerCache[$notification['handler']];
$adminPreferences = new \XenCentral\Feedback\PreferencesContainer(
$self->_getPreferencesModel()->getAdminPreferences(),
$notification['extraData']);
$userPreferences = new \XenCentral\Feedback\PreferencesContainer(
$self->_getPreferencesModel()->getUserNotificationPreferences($notification['forUserId']),
$notification['extraData']);
$userPreferences->setUserId($notification['forUserId']);
if (!$notificationHandler->checkSendDate($notification, $userPreferences->getPreferencesArray())) {
continue;
}
if (!$notificationHandler->checkSendAdminDate($notification, $adminPreferences->getPreferencesArray())) {
continue;
}
$notification['extraData']['userPreferences'] = $userPreferences;
$orderedNotifications[$notification['forUserId']][$notification['handler']]['dateline'][] = $notification['extraData'];
$markAsRead[] = $notification['id'];
}
unset($notifications);
foreach ($orderedNotifications AS $userId => $handlers) {
foreach ($handlers AS $handlerName => $notifications) {
$handlerObject = $handlerCache[$handlerName];
$notifications = $notifications['dateline'];
$allFeedback = array();
$userPreferences = false;
foreach ($notifications AS $extraData) {
$userPreferences = $extraData['userPreferences'];
$allFeedback[$extraData['isAdmin'] + 1][] = $extraData;
}
if (!empty($allFeedback[1])) {
$handlerObject->send(
$userPreferences->getUser(),
$allFeedback[1]
);
}
if (!empty(\XF::options()->xcfs_admin_username)) {
$admins=\XF::options()->xcfs_admin_username;
foreach ($admins as $admin) {
$admin = \XF::app()->em()->find('XF:User', [
'user_id' => $admin
]);
$userPreferences->setUserId($admin['user_id']);
if (!empty($allFeedback[2])) {
$handlerObject->send(
$userPreferences->getUser(),
$allFeedback[2],
'_admin'
);
}
}
} else {
return;
}
}
}
if (!empty($markAsRead)) {
\XF::db()->query("
UPDATE xf_xc_feedback_notification_queue
SET sent=1
WHERE id IN(" . implode(',', $markAsRead) . ")
");
}
}
/*protected function _getAdministrators()
{
static $administrators;
if (is_null($administrators)) {
$administrators = array();
$usergroupIds = \XF::options()->xcfs_admin_username;
if (!empty($usergroupIds)) {
$administrators = \XF::db()->fetchPairs(
'
SELECT user_id, is_primary
FROM xf_user_group_relation
WHERE user_group_id IN (?)
ORDER BY user_id
',
array(implode(',', (array)$usergroupIds))
);
}
}
return $administrators;
}*/
}