Skip to content

Commit

Permalink
GH-126 Move reply form data fetching to utilities
Browse files Browse the repository at this point in the history
  • Loading branch information
mdziekon committed Sep 13, 2020
1 parent b1f17f4 commit a70e259
Show file tree
Hide file tree
Showing 5 changed files with 194 additions and 46 deletions.
61 changes: 15 additions & 46 deletions messages.php
Original file line number Diff line number Diff line change
Expand Up @@ -88,61 +88,30 @@
$_POST['text'] = $_GET['insert'];
}

if(!empty($_GET['replyto']) OR !empty($_POST['replyto']))
{
if(!empty($_POST['replyto']))
{
if (!empty($_GET['replyto']) OR !empty($_POST['replyto'])) {
if (!empty($_POST['replyto'])) {
$ReplyID = round($_POST['replyto']);
}
else
{
} else {
$ReplyID = round($_GET['replyto']);
}
if($ReplyID > 0)
{
$GetReplyMsg = '';
$GetReplyMsg .= "SELECT `m`.`id`, `m`.`Thread_ID`, `m`.`subject`, `m`.`text`, `u`.`id` AS `user_id`, `u`.`username`, `u`.`authlevel` FROM {{table}} AS `m` ";
$GetReplyMsg .= "LEFT JOIN `{{prefix}}users` AS `u` ON `u`.`id` = IF(`m`.`id_owner` != {$_User['id']}, `m`.`id_owner`, `m`.`id_sender`) ";
$GetReplyMsg .= "WHERE (`m`.`id` = {$ReplyID} OR `m`.`Thread_ID` = {$ReplyID}) AND (`m`.`id_owner` = {$_User['id']} OR `m`.`id_sender` = {$_User['id']}) AND `deleted` = false LIMIT 1;";

$ReplyMsg = doquery($GetReplyMsg, 'messages', true);
if($ReplyMsg['id'] > 0)
{
if(preg_match('/^\{COPY\_MSG\_\#([0-9]{1,}){1}\}$/D', $ReplyMsg['text'], $ThisMatch))
{
$GetCopyMsg = doquery("SELECT `subject` FROM {{table}} WHERE `id` = {$ThisMatch[1]} LIMIT 1;", 'messages', true);
$ReplyMsg['subject'] = $GetCopyMsg['subject'];
}
if ($ReplyID > 0) {
$replyFormData = Messages\Utils\fetchFormDataForReply([
'replyToMessageId' => $ReplyID,
'senderUser' => &$_User,
]);

$FormData['username'] = $ReplyMsg['username'];
$FormData['uid'] = $ReplyMsg['user_id'];
$FormData['authlevel'] = $ReplyMsg['authlevel'];
$FormData['subject'] = $ReplyMsg['subject'];
$FormData['replyto'] = $ReplyID;
$FormData['Thread_Started'] = ($ReplyMsg['Thread_ID'] > 0 ? true : false);
if($FormData['Thread_Started'] === false)
{
$CreateReCounter = 1;
}
else
{
$GetThreadCount = doquery("SELECT COUNT(*) AS `Count` FROM {{table}} WHERE `Thread_ID` = {$ReplyID};", 'messages', true);
$CreateReCounter = $GetThreadCount['Count'];
}
$FormData['lock_username'] = true;
$FormData['lock_subject'] = true;
if ($replyFormData['isSuccess']) {
$AllowSend = true;

$FormData['subject'] = preg_replace('#'.$_Lang['mess_answer_prefix'].'\[[0-9]{1,}\]\: #si', '', $FormData['subject']);
$FormData['subject'] = $_Lang['mess_answer_prefix'].'['.$CreateReCounter.']: '.$FormData['subject'];
}
else
{
$FormData = array_merge(
$FormData,
$replyFormData['payload']
);
} else {
$MsgBox[] = array('color' => 'red', 'text' => $_Lang['Errors_CantReply']);
}
}
else
{
} else {
$MsgBox[] = array('color' => 'red', 'text' => $_Lang['Errors_CantReply']);
}
}
Expand Down
3 changes: 3 additions & 0 deletions modules/messages/_includes.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
include($includePath . './input/batchActions.userCommands.php');
include($includePath . './utils/batchDeleteMessages.utils.php');
include($includePath . './utils/batchMessageUpdates.utils.php');
include($includePath . './utils/createReplyMessageSubject.utils.php');
include($includePath . './utils/fetchFormDataForReply.utils.php');
include($includePath . './utils/getMessageCopyId.utils.php');
include($includePath . './utils/sendMessage.utils.php');
include($includePath . './validators/validateWithIgnoreSystem.validators.php');

Expand Down
28 changes: 28 additions & 0 deletions modules/messages/utils/createReplyMessageSubject.utils.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace UniEngine\Engine\Modules\Messages\Utils;

/**
* Creates new subject by increasing reply counter on the previous subject.
*
* @param array $params
* @param string $params['previousSubject']
* @param number $params['replyCounter']
*/
function createReplyMessageSubject($params) {
global $_Lang;

$previousSubject = $params['previousSubject'];
$replyCounter = $params['replyCounter'];

$cleanSubject = preg_replace(
'#' . $_Lang['mess_answer_prefix'] . '\[[0-9]{1,}\]\: #si',
'',
$previousSubject
);
$newReplySubject = "{$_Lang['mess_answer_prefix']} [{$replyCounter}]: {$cleanSubject}";

return $newReplySubject;
}

?>
111 changes: 111 additions & 0 deletions modules/messages/utils/fetchFormDataForReply.utils.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
<?php

namespace UniEngine\Engine\Modules\Messages\Utils;

use UniEngine\Engine\Modules\Messages;

/**
* Fetches necessary data when trying to reply to an existing message.
*
* @param array $params
* @param number $params['replyToMessageId']
* @param &array $params['senderUser']
*/
function fetchFormDataForReply($params) {
$senderUser = &$params['senderUser'];
$replyToMessageId = $params['replyToMessageId'];

$senderUserId = $senderUser['id'];

$query_GetReferencedMessage = (
"SELECT " .
"`m`.`id`, `m`.`Thread_ID`, `m`.`subject`, `m`.`text`, `u`.`id` AS `user_id`, `u`.`username`, `u`.`authlevel` " .
"FROM " .
"{{table}} AS `m` " .
"LEFT JOIN " .
"`{{prefix}}users` AS `u` ON `u`.`id` = IF(`m`.`id_owner` != {$senderUserId}, `m`.`id_owner`, `m`.`id_sender`) " .
"WHERE " .
"( " .
"`m`.`id` = {$replyToMessageId} OR " .
"`m`.`Thread_ID` = {$replyToMessageId} " .
") AND ( " .
"`m`.`id_owner` = {$senderUserId} OR " .
"`m`.`id_sender` = {$senderUserId} " .
") AND " .
"`deleted` = false " .
"LIMIT 1 " .
";"
);

$referencedMessage = doquery($query_GetReferencedMessage, 'messages', true);

if (!$referencedMessage || $referencedMessage['id'] <= 0) {
return [
'isSuccess' => false,
'error' => [
'messageNotFound' => true,
],
];
}


$isInOngoingThread = ($referencedMessage['Thread_ID'] > 0);
$previousSubject = $referencedMessage['subject'];
$replyCounter = 1;

$formData = [
'username' => $referencedMessage['username'],
'uid' => $referencedMessage['user_id'],
'authlevel' => $referencedMessage['authlevel'],
'subject' => null,
'replyto' => $replyToMessageId,
'Thread_Started' => $isInOngoingThread,
'lock_username' => true,
'lock_subject' => true,
];

$checkIsMessageCopy = Messages\Utils\getMessageCopyId([
'messageData' => &$referencedMessage,
]);

if ($checkIsMessageCopy['isSuccess']) {
$query_GetOriginalMessage = (
"SELECT `subject` " .
"FROM {{table}} " .
"WHERE `id` = {$checkIsMessageCopy['payload']['originalMessageId']} " .
"LIMIT 1 " .
";"
);

$originalMessage = doquery($query_GetOriginalMessage, 'messages', true);

$previousSubject = $originalMessage['subject'];
}

if ($isInOngoingThread) {
$query_GetThreadLength = (
"SELECT " .
"COUNT(*) AS `Count` " .
"FROM {{table}} " .
"WHERE " .
"`Thread_ID` = {$replyToMessageId} " .
";"
);

$result_GetThreadLength = doquery($query_GetThreadLength, 'messages', true);

$replyCounter = $result_GetThreadLength['Count'];
}

$formData['subject'] = Messages\Utils\createReplyMessageSubject([
'previousSubject' => $previousSubject,
'replyCounter' => $replyCounter,
]);

return [
'isSuccess' => true,
'payload' => $formData,
];
}

?>
37 changes: 37 additions & 0 deletions modules/messages/utils/getMessageCopyId.utils.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace UniEngine\Engine\Modules\Messages\Utils;

/**
* Extracts message's carbon copy reference ID, as long as the message is indeed
* a copy of another message. Otherwise, returns an error.
*
* @param array $params
* @param &array $params['messageData']
* @param string $params['messageData']['text']
*/
function getMessageCopyId($params) {
$messageContent = $params['messageData']['text'];

$extractedMatches = null;

$isCopy = preg_match('/^\{COPY\_MSG\_\#([0-9]{1,}){1}\}$/D', $messageContent, $extractedMatches);

if ($isCopy !== 1) {
return [
'isSuccess' => false,
'error' => [
'isNotCopy' => true,
],
];
}

return [
'isSuccess' => true,
'payload' => [
'originalMessageId' => $extractedMatches[1],
],
];
}

?>

0 comments on commit a70e259

Please sign in to comment.