');
if ($firstDivPosition !== false) {
$data['message'] = preg_replace('/<\/div>
/', '
', $data['message']);
}
}
include('fns/HTMLPurifier/load.php');
$allowed_tags = 'p,span[class],';
$allowed_tags .= 'a[href],br';
if (Registry::load('settings')->message_text_formatting !== 'disable') {
$allowed_tags .= ',b,em,i,u,strong,s,ol,ul,li';
}
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.Allowed', $allowed_tags);
$config->set('Attr.AllowedClasses', array());
$config->set('HTML.Nofollow', true);
$config->set('HTML.TargetBlank', true);
$config->set('AutoFormat.RemoveEmpty', true);
$define = $config->getHTMLDefinition(true);
$define->addAttribute('span', 'class', new CustomClassDef(array('emoji_icon'), array('emoji-')));
$purifier = new HTMLPurifier($config);
$message = $purifier->purify(trim($data['message']));
if (isset($attachments[0]) && $permission['generate_link_preview']) {
$links = $urlHighlight->getUrls($message);
if (!empty($links)) {
if (Registry::load('settings')->link_filter === 'enable') {
include_once('fns/link_filter/load.php');
if (!link_filter(['links' => $links])) {
$alert_message = Registry::load('strings')->contains_blacklisted_links;
$result['alert'] = ['message' => $alert_message];
return;
}
}
}
if (isset($links[0])) {
include('fns/url_metadata/load.php');
$url_meta_data = url_metadata($links[0]);
if ($url_meta_data['success']) {
unset($url_meta_data['success']);
$attachments = ['url_meta' => $url_meta_data];
}
}
}
if ($message !== '') {
if (!preg_match('/[^.]/', $message)) {
$message = '';
}
}
if ($message !== '') {
$nobr_message = preg_replace('/
(\s|
)*<\/p>/', '', $message);
if ($nobr_message === '') {
$message = '';
}
if (isset(Registry::load('settings')->normalize_text_message) && Registry::load('settings')->normalize_text_message === 'yes') {
if (class_exists('Normalizer')) {
try {
$normalized_message = Normalizer::normalize($message, Normalizer::FORM_KC);
if (!empty($normalized_message)) {
$message = $normalized_message;
}
} catch (Exception $e) {}
}
}
if (isset(Registry::load('settings')->text_moderation) && Registry::load('settings')->text_moderation !== 'disable') {
include_once('fns/text_moderation/load.php');
$text_moderation = moderate_text_content($message);
if (!$text_moderation['success']) {
$alert_message = Registry::load('strings')->detected_forbidden_words_content;
$result['alert'] = ['message' => $alert_message];
return;
}
}
}
if ($message !== '') {
if (Registry::load('settings')->profanity_filter !== 'disable') {
try {
$safe_mode = true;
$convert_unicode_text = false;
if (Registry::load('settings')->profanity_filter === 'strict_mode') {
$safe_mode = false;
}
$censor = new CensorWords();
if ($convert_unicode_text) {
$message = $censor->convert_unicode_text($message);
}
$message = $censor->censorString($message, $safe_mode);
$message = $message['clean'];
} catch(Exception $e) {}
}
if (isset($data['group_id']) && !empty($data['group_id']) && $permission['mention_users']) {
if ($message !== '') {
$advanced_mention_system = true;
$mention_pattern = "/\@\[[^\]]*\]/";
if ($advanced_mention_system) {
$mention_pattern = "/(\@\[[^\]]*\])|(@\w+)/i";
}
$mentions = [];
preg_match_all($mention_pattern, $message, $mention_matches);
$mention_matches = $mention_matches[0];
$mention_everyone = false;
foreach ($mention_matches as $mention) {
$mention = str_replace(array('\'', '"', ',', '@', ';', '(', ')', '[', ']', '<', '>', '{', '}'), '', $mention);
$mention = trim($mention);
if ($mention === 'everyone' && $permission['mention_everyone']) {
$mention_everyone = true;
$replace_with = '@everyone';
$message = str_replace(['@everyone', '@[everyone]'], $replace_with, $message);
} else {
$mentions[] = $mention;
}
}
if (!empty($mentions)) {
$db_columns = ['site_users.user_id', 'site_users.username', 'group_members.group_member_id'];
$notify_users = [];
$db_join["[>]group_members"] = [
"site_users.user_id" => "user_id",
"AND" => ["group_id" => $data['group_id']]
];
$db_join["[>]site_users_settings"] = ["site_users.user_id" => "user_id"];
$db_where = ['site_users.username' => $mentions, 'site_users_settings.deactivated' => 0, 'LIMIT' => 10];
$mentioned_users = DB::connect()->select("site_users", $db_join, $db_columns, $db_where);
foreach ($mentioned_users as $mention) {
if (isset($mention['group_member_id']) && !empty($mention['group_member_id'])) {
$replace_with = '@'.$mention['username'].'';
if ($advanced_mention_system) {
$message = str_replace('@'.$mention['username'], $replace_with, $message);
}
$message = str_replace('@['.$mention['username'].']', $replace_with, $message);
}
}
}
}
}
}
if (isset($data['attach_message']) && !empty($data['attach_message']) && $permission['reply_messages']) {
$data['attach_message'] = filter_var($data['attach_message'], FILTER_SANITIZE_NUMBER_INT);
if (!empty($data['attach_message'])) {
if (isset($data['group_id'])) {
$verify_attached_message = DB::connect()->select(
"group_messages",
["group_message_id", "user_id"],
['group_message_id' => $data['attach_message'], 'group_id' => $data['group_id']]
);
} elseif (isset($data['user_id'])) {
$verify_attached_message = DB::connect()->select(
"private_chat_messages",
["private_chat_message_id", "user_id"],
['private_chat_message_id' => $data['attach_message'], 'private_conversation_id' => $conversation_id]
);
}
if (isset($verify_attached_message[0])) {
$parent_message_id = $data['attach_message'];
}
}
}
}
$message_criteria = true;
$message = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $message);
$check_message = html_entity_decode(strip_tags($message, ''));
$check_message = trim(preg_replace("/\s+/", "", $check_message));
$check_message = trim($check_message, " \t\n\r\0\x0B\xC2\xA0");
if ($check_message === '') {
$message_criteria = false;
}
$total_characters = mb_strlen(strip_tags($message));
if (empty(Registry::load('settings')->minimum_message_length)) {
Registry::load('settings')->minimum_message_length = 1;
}
if ((int)$total_characters < (int)Registry::load('settings')->minimum_message_length) {
$message_criteria = false;
}
if ($empty_message || $message_criteria) {
$loop_count = 1;
foreach ($attachments as $index => $attachment) {
if (!empty($index)) {
$attachment_type = $index;
} else {
$attachment_type = '';
}
if (!empty($attachment)) {
if ($uploaded_files) {
$attachment = array_values($attachment);
}
$attachment = json_encode($attachment);
}
if ($loop_count > 1) {
$message = '';
}
if ($message === '' && empty($attachment)) {
continue;
}
if (!isset($data['message'])) {
$data['message'] = '';
}
if (isset($data['group_id'])) {
DB::connect()->insert("group_messages", [
"original_message" => $data['message'],
"filtered_message" => $message,
"group_id" => $data['group_id'],
"user_id" => $current_user_id,
"parent_message_id" => $parent_message_id,
"attachment_type" => $attachment_type,
"attachments" => $attachment,
"link_preview" => $link_preview,
"created_on" => Registry::load('current_user')->time_stamp,
"updated_on" => Registry::load('current_user')->time_stamp,
]);
} elseif (isset($data['user_id'])) {
DB::connect()->insert("private_chat_messages", [
"original_message" => $data['message'],
"filtered_message" => $message,
"private_conversation_id" => $conversation_id,
"user_id" => $current_user_id,
"parent_message_id" => $parent_message_id,
"attachment_type" => $attachment_type,
"attachments" => $attachment,
"link_preview" => $link_preview,
"created_on" => Registry::load('current_user')->time_stamp,
"updated_on" => Registry::load('current_user')->time_stamp,
]);
}
if ((int)$loop_count === 1) {
if (!DB::connect()->error) {
$message_id = DB::connect()->id();
}
}
$loop_count = $loop_count+1;
}
if (!DB::connect()->error) {
if (!isset($message_id)) {
$message_id = DB::connect()->id();
}
if (isset($data['group_id'])) {
$update_time_stamp = date('Y-m-d H:i:s', strtotime("2022-01-01"));
DB::connect()->update(
"typing_status",
["updated_on" => $update_time_stamp],
["group_id" => $data['group_id'], "user_id" => $current_user_id]
);
} elseif (isset($data['user_id']) && isset($conversation_id)) {
$update_time_stamp = date('Y-m-d H:i:s', strtotime("2022-01-01"));
DB::connect()->update(
"typing_status",
["updated_on" => $update_time_stamp],
["private_conversation_id" => $conversation_id, "user_id" => $current_user_id]
);
}
if (isset($verify_attached_message[0])) {
if (isset(Registry::load('settings')->site_notifications->on_reply_group_messages)) {
if (isset($data['group_id']) && (int)$verify_attached_message[0]['user_id'] !== (int)$current_user_id) {
DB::connect()->insert("site_notifications", [
"user_id" => $verify_attached_message[0]['user_id'],
"notification_type" => 'replied_group_message',
"related_group_id" => $data['group_id'],
"related_message_id" => $message_id,
"related_user_id" => $current_user_id,
"created_on" => Registry::load('current_user')->time_stamp,
"updated_on" => Registry::load('current_user')->time_stamp,
]);
}
}
if (isset(Registry::load('settings')->send_push_notification->on_reply_group_messages)) {
if (isset($data['group_id']) && (int)$verify_attached_message[0]['user_id'] !== (int)$current_user_id) {
include_once('fns/push_notification/load.php');
$web_push = [
'user_id' => $verify_attached_message[0]['user_id'],
'title' => Registry::load('strings')->someone,
'message' => Registry::load('strings')->web_push_sent_reply_message,
];
if (isset(Registry::load('current_user')->name)) {
$web_push['title'] = Registry::load('current_user')->name;
}
if ($message !== '') {
$web_push_message = preg_replace('/]*>(.*?)<\/span>/i', '', $message);
$web_push_message = strip_tags($web_push_message);
if (!empty($web_push_message)) {
$web_push['message'] = $web_push_message;
}
}
push_notification($web_push);
}
}
}
if (isset($data['group_id'])) {
if ($mention_everyone) {
$realtime_log_data = array();
$realtime_log_data["log_type"] = 'mention_everyone';
$realtime_log_data["related_parameters"] = [
"group_id" => $data['group_id'],
"user_id" => $current_user_id,
"message_id" => $message_id,
];
if ($message !== '') {
$realtime_log_data["related_parameters"]["message"] = $message;
}
$realtime_log_data["related_parameters"] = json_encode($realtime_log_data["related_parameters"]);
$realtime_log_data["created_on"] = Registry::load('current_user')->time_stamp;
DB::connect()->insert("realtime_logs", $realtime_log_data);
}
if (!$mention_everyone && isset($mentioned_users)) {
if (isset(Registry::load('settings')->site_notifications->on_user_mention_group_chat) || isset(Registry::load('settings')->send_push_notification->on_user_mention_group_chat)) {
$add_site_notification = array();
$notify_user_ids = array();
foreach ($mentioned_users as $mention) {
if (isset($mention['user_id']) && !empty($mention['user_id'])) {
if ((int)$mention['user_id'] !== (int)$current_user_id) {
$notify_user_ids[] = $mention['user_id'];
$add_site_notification[] = [
"user_id" => $mention['user_id'],
"notification_type" => 'mentioned_group_chat',
"related_group_id" => $data['group_id'],
"related_message_id" => $message_id,
"related_user_id" => $current_user_id,
"created_on" => Registry::load('current_user')->time_stamp,
"updated_on" => Registry::load('current_user')->time_stamp,
];
}
}
}
if (isset(Registry::load('settings')->site_notifications->on_user_mention_group_chat) && !empty($add_site_notification)) {
DB::connect()->insert("site_notifications", $add_site_notification);
}
if (isset(Registry::load('settings')->send_push_notification->on_user_mention_group_chat) && !empty($notify_user_ids)) {
include_once('fns/push_notification/load.php');
$web_push = [
'user_id' => $notify_user_ids,
'title' => Registry::load('strings')->someone,
'message' => Registry::load('strings')->web_push_mentioned_user_message,
];
if (isset(Registry::load('current_user')->name)) {
$web_push['title'] = Registry::load('current_user')->name;
}
if ($message !== '') {
$web_push_message = preg_replace('/]*>(.*?)<\/span>/i', '', $message);
$web_push_message = strip_tags($web_push_message);
if (!empty($web_push_message)) {
$web_push['message'] = $web_push_message;
}
}
push_notification($web_push);
}
}
}
}
if (isset($data['group_id'])) {
DB::connect()->update("groups", ["updated_on" => Registry::load('current_user')->time_stamp], ['group_id' => $data['group_id']]);
} elseif (isset($data['user_id'])) {
DB::connect()->update("private_conversations", ["updated_on" => Registry::load('current_user')->time_stamp], ['private_conversation_id' => $conversation_id]);
if (isset(Registry::load('settings')->send_push_notification->on_private_message) || isset(Registry::load('settings')->send_push_notification->on_private_message_offline)) {
$send_push_notification = true;
if (!isset(Registry::load('settings')->send_push_notification->on_private_message)) {
if ((int)$user_info['online_status'] !== 0) {
$send_push_notification = false;
}
}
if ($send_push_notification && $user_info['site_role_attribute'] !== 'banned_users') {
include_once('fns/push_notification/load.php');
$web_push = [
'user_id' => $data['user_id'],
'title' => Registry::load('strings')->someone,
'message' => Registry::load('strings')->web_push_new_pm_message,
];
if (isset(Registry::load('current_user')->name)) {
$web_push['title'] = Registry::load('current_user')->name;
}
if ($message !== '') {
$web_push_message = preg_replace('/]*>(.*?)<\/span>/i', '', $message);
$web_push_message = strip_tags($web_push_message);
if (!empty($web_push_message)) {
$web_push['message'] = $web_push_message;
}
}
push_notification($web_push);
}
}
if (isset(Registry::load('settings')->send_email_notification->on_private_message_offline)) {
if ((int)$user_info['online_status'] === 0) {
if ($user_info['site_role_attribute'] !== 'banned_users') {
include_once('fns/mailer/load.php');
$message_info = '
';
if (isset(Registry::load('current_user')->name)) {
$message_info .= Registry::load('strings')->name.' : '.Registry::load('current_user')->name.'
';
}
if ($message !== '') {
$email_message = preg_replace('/]*>(.*?)<\/span>/i', '', $message);
$email_message = strip_tags($email_message);
if (!empty($email_message)) {
$message_info .= Registry::load('strings')->message.' : '.$email_message;
}
}
$mail = array();
$mail['email_addresses'] = $user_info['email_address'];
$mail['category'] = 'new_private_message';
$mail['user_id'] = $data['user_id'];
$mail['parameters'] = ['link' => Registry::load('config')->site_url, 'append_content' => $message_info];
$mail['send_now'] = true;
mailer('compose', $mail);
}
}
}
}
include('fns/load/load.php');
$result['success'] = true;
if (!$api_request) {
if (isset($data['group_id'])) {
$result['message'] = load(['load' => 'group_messages', 'group_id' => $data['group_id'], 'return' => true, 'message_id_from' => $message_id]);
} elseif (isset($data['user_id'])) {
$result['message'] = load(['load' => 'private_chat_messages', 'user_id' => $data['user_id'], 'return' => true, 'message_id_from' => $message_id]);
}
}
} else {
$result['error_message'] = Registry::load('strings')->went_wrong;
$result['error_key'] = 'something_went_wrong';
}
}
}
}