| Server IP : 54.36.91.62 / Your IP : 216.73.217.112 Web Server : Apache System : Linux webm013.cluster127.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64 User : coopiak ( 151928) PHP Version : 8.3.23 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/coopiak/amisdesseniors-fr/lemans/libraries/kunena/src/Forum/Message/ |
Upload File : |
<?php
/**
* Kunena Component
*
* @package Kunena.Framework
* @subpackage Forum.Message
*
* @copyright Copyright (C) 2008 - @currentyear@ Kunena Team. All rights reserved.
* @license https://www.gnu.org/copyleft/gpl.html GNU/GPL
* @link https://www.kunena.org
**/
namespace Kunena\Forum\Libraries\Forum\Message;
\defined('_JEXEC') or die();
use Exception;
use Joomla\CMS\Factory;
use Joomla\CMS\User\User;
use Joomla\Database\Exception\ExecutionFailureException;
use Kunena\Forum\Libraries\Access\KunenaAccess;
use Kunena\Forum\Libraries\Error\KunenaError;
use Kunena\Forum\Libraries\Factory\KunenaFactory;
use Kunena\Forum\Libraries\Forum\Category\KunenaCategoryHelper;
use Kunena\Forum\Libraries\Forum\Topic\KunenaTopicHelper;
use Kunena\Forum\Libraries\User\KunenaUser;
use Kunena\Forum\Libraries\User\KunenaUserHelper;
use stdClass;
/**
* Kunena Forum Message Helper Class
*
* @since Kunena 6.0
*/
abstract class KunenaMessageHelper
{
/**
* @var KunenaMessage[]
* @since Kunena 6.0
*/
protected static $_instances = [];
/**
* @var array
* @since Kunena 6.0
*/
protected static $_location = [];
/**
* @param bool|array|int $ids ids
* @param string $authorise authorise
*
* @return KunenaMessage[]
*
* @since Kunena
*
* @throws Exception
* @throws null
*/
public static function getMessages($ids = false, $authorise = 'read'): array
{
if ($ids === false) {
return self::$_instances;
}
if (\is_array($ids)) {
$ids = array_unique($ids);
} else {
$ids = [$ids];
}
self::loadMessages($ids);
$list = [];
foreach ($ids as $id) {
// TODO: authorisation needs topics to be loaded, make sure that they are! (performance increase)
if (!empty(self::$_instances [$id]) && self::$_instances [$id]->isAuthorised($authorise, null)) {
$list [$id] = self::$_instances [$id];
}
}
return $list;
}
/**
* @param array $ids ids
*
* @return void
*
* @since Kunena 6.0
*
* @throws Exception
*/
protected static function loadMessages(array $ids): void
{
foreach ($ids as $i => $id) {
$id = \intval($id);
if (!$id || isset(self::$_instances [$id])) {
unset($ids[$i]);
}
}
if (empty($ids)) {
return;
}
$idlist = implode(',', $ids);
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->createQuery();
$query->select('m.*, t.message')
->from($db->quoteName('#__kunena_messages', 'm'))
->innerJoin($db->quoteName('#__kunena_messages_text', 't') . ' ON m.id = t.mesid')
->where($db->quoteName('m.id') . ' IN (' . $idlist . ')');
$db->setQuery($query);
try {
$results = (array) $db->loadAssocList('id');
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
}
foreach ($ids as $id) {
if (isset($results[$id])) {
$instance = new KunenaMessage($results[$id]);
$instance->exists(true);
self::$_instances [$id] = $instance;
} else {
self::$_instances [$id] = null;
}
}
unset($results);
}
/**
* @param mixed $topic topic
* @param int $start start
* @param int $limit limit
* @param string $ordering ordering
* @param int $hold hold
* @param bool $orderbyid orderbyid
*
* @return KunenaMessage[]
*
* @since Kunena 6.0
*
* @throws Exception
*/
public static function getMessagesByTopic($topic, $start = 0, $limit = 0, $ordering = 'ASC', $hold = 0, $orderbyid = false): array
{
$topic = KunenaTopicHelper::get($topic);
if (!$topic->exists()) {
return [];
}
$total = $topic->getTotal();
if ($start < 0) {
$start = 0;
}
if ($limit < 1) {
$limit = KunenaFactory::getConfig()->messagesPerPage;
}
// If out of range, use last page
if ($total < $start) {
$start = \intval($total / $limit) * $limit;
}
$ordering = strtoupper($ordering);
if ($ordering != 'DESC') {
$ordering = 'ASC';
}
return self::loadMessagesByTopic($topic->id, $start, $limit, $ordering, $hold, $orderbyid);
}
/**
* @param int $topic_id topic id
* @param int $start start
* @param int $limit limit
* @param string $ordering ordering
* @param int $hold hold
* @param bool $orderbyid orderbyid
*
* @return array
*
* @since Kunena 6.0
*
* @throws Exception
*/
protected static function loadMessagesByTopic(int $topic_id, $start = 0, $limit = 0, $ordering = 'ASC', $hold = 0, $orderbyid = false): array
{
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->createQuery();
$query->select('m.*,t.message')
->from($db->quoteName('#__kunena_messages', 'm'))
->innerJoin($db->quoteName('#__kunena_messages_text', 't') . ' ON ' . $db->quoteName('m.id') . ' = ' . $db->quoteName('t.mesid'))
->where($db->quoteName('m.thread') . ' = ' . $db->quote($topic_id))
->andWhere($db->quoteName('m.hold') . ' IN (' . $hold . ')')
->order($db->quoteName('m.time') . $ordering);
$query->setLimit($limit, $start);
$db->setQuery($query);
try {
$results = (array) $db->loadAssocList('id');
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
}
$location = ($orderbyid || $ordering == 'ASC') ? $start : KunenaTopicHelper::get($topic_id)->getTotal($hold) - $start - 1;
$order = ($ordering == 'ASC') ? 1 : -1;
$list = [];
if (!empty($results)) {
foreach ($results as $id => $result) {
$instance = new KunenaMessage($result);
$instance->exists(true);
self::$_instances [$id] = $instance;
$list[$orderbyid ? $id : $location] = $instance;
$location += $order;
}
}
unset($results);
return $list;
}
/**
* @param bool|array|int $categories categories
* @param int $limitstart limitstart
* @param int $limit limit
* @param array $params params
*
* @return array
*
* @since Kunena 6.0
*
* @throws Exception
* @throws null
*/
public static function getLatestMessages($categories = false, $limitstart = 0, $limit = 0, $params = []): array
{
$db = Factory::getContainer()->get('DatabaseDriver');
$reverse = isset($params['reverse']) ? (int) $params['reverse'] : 0;
$orderby = isset($params['orderby']) ? (string) $params['orderby'] : $db->quoteName('m.time') . ' DESC';
$starttime = isset($params['starttime']) ? (int) $params['starttime'] : 0;
$mode = isset($params['mode']) ? $params['mode'] : 'recent';
$user = isset($params['user']) ? $params['user'] : false;
$where = isset($params['where']) ? (string) $params['where'] : '';
$childforums = isset($params['childforums']) ? (bool) $params['childforums'] : false;
$view = Factory::getApplication()->input->getCmd('view');
if ($limit < 1 && empty($params['nolimit'])) {
if ($view == 'search') {
$limit = KunenaFactory::getConfig()->messagesPerPageSearch;
} elseif ($view == 'topics') {
$limit = KunenaFactory::getConfig()->threadsPerPage;
} else {
$limit = KunenaFactory::getConfig()->messagesPerPage;
}
}
$query = $db->createQuery();
$query->select('m.*')
->select($db->quoteName('t.message'))
->from($db->quoteName('#__kunena_messages', 'm'))
->innerJoin($db->quoteName('#__kunena_messages_text', 't') . ' ON ' . $db->quoteName('m.id') . ' = ' . $db->quoteName('t.mesid'))
->order($orderby);
$authorise = 'read';
$hold = 'm.hold = 0';
$userfield = 'm.userid';
switch ($mode) {
case 'unapproved':
$authorise = 'approve';
$hold = $db->quoteName('m.hold') . '= 1';
break;
case 'deleted':
$authorise = 'undelete';
$hold = $db->quoteName('m.hold') . ' >= 2';
break;
case 'mythanks':
$userfield = 'th.userid';
$query->innerJoin($db->quoteName('#__kunena_thankyou', 'th') . ' ON ' . $db->quoteName('m.id') . ' = ' . $db->quoteName('th.postid'));
break;
case 'thankyou':
$userfield = 'th.targetuserid';
$query->innerJoin($db->quoteName('#__kunena_thankyou', 'th') . ' ON ' . $db->quoteName('m.id') . ' = ' . $db->quoteName('th.postid'));
break;
case 'recent':
default:
}
if (\is_array($categories) && \in_array(0, $categories)) {
$categories = false;
}
$categories = KunenaCategoryHelper::getCategories($categories, $reverse, 'topic.' . $authorise);
if ($childforums) {
$categories += KunenaCategoryHelper::getChildren($categories, -1, ['action' => 'topic.' . $authorise]);
}
$catlist = [];
foreach ($categories as $category) {
if ($view == 'search') {
if ($category->isAuthorised('read')) {
$catlist += $category->getChannels();
}
} else {
$catlist += $category->getChannels();
}
}
if (\count($catlist) > 0) {
$allowed = implode(',', array_keys($catlist));
$query->where($db->quoteName('m.catid') . ' IN (' . $allowed . ')');
} else {
$catlist = '';
}
$query->where($hold);
if ($user) {
$query->where($db->quoteName($userfield) . ' = ' . $db->quote($user));
}
// Negative time means no time
if ($starttime == 0) {
$starttime = KunenaFactory::getSession()->lasttime;
} elseif ($starttime > 0) {
$starttime = Factory::getDate()->toUnix() - ($starttime * 3600);
}
if ($starttime > 0) {
$query->where('m.time > ' . $db->quote($starttime));
}
if ($where) {
$query->where($where);
}
$cquery = clone $query;
$cquery->clear('select')
->clear('order')
->select('COUNT(*)');
$db->setQuery($cquery);
try {
$total = (int) $db->loadResult();
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
return [0, []];
}
if (!$total) {
return [0, []];
}
// If out of range, use last page
if ($limit && $total < $limitstart) {
$limitstart = \intval($total / $limit) * $limit;
}
$query->setLimit($limit, $limitstart);
$db->setQuery($query);
try {
$results = $db->loadAssocList();
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
return [0, []];
}
$messages = [];
if (!empty($results)) {
foreach ($results as $result) {
$instance = new KunenaMessage($result);
$instance->exists(true);
self::$_instances [$instance->id] = $instance;
$messages[$instance->id] = $instance;
}
}
unset($results);
return [$total, $messages];
}
/**
* @param int $mesid mesid
* @param null|string $direction direction
* @param null|array $hold hold
*
* @return integer
*
* @since Kunena 6.0
*
* @throws Exception
*/
public static function getLocation(int $mesid, $direction = null, $hold = null): int
{
if (\is_null($direction)) {
$direction = KunenaUserHelper::getMyself()->getMessageOrdering();
}
if (!$hold) {
$me = KunenaUserHelper::getMyself();
$mes_instance = self::get($mesid);
if ($mes_instance->exists()) {
$hold = KunenaAccess::getInstance()->getAllowedHold($me->userid, $mes_instance->catid, false);
}
}
if (!isset(self::$_location [$mesid])) {
self::loadLocation([$mesid]);
}
$location = self::$_location [$mesid];
$count = 0;
foreach ($location->hold as $meshold => $values) {
if (isset($hold[$meshold])) {
$count += $values[$direction == 'asc' ? 'before' : 'after'];
if ($direction == 'both') {
$count += $values['before'];
}
}
}
return $count;
}
/**
* Returns \Kunena\Forum\Libraries\Forum\Message\Message object.
*
* @param null $identifier The message to load - Can be only an integer.
* @param bool $reload reload
*
* @return KunenaMessage The message object.
*
* @since Kunena 6.0
*
* @throws Exception
*/
public static function get($identifier = null, $reload = false): KunenaMessage
{
if ($identifier instanceof KunenaMessage) {
return $identifier;
}
$id = (int) $identifier;
if ($id < 1) {
return new KunenaMessage();
}
if (empty(self::$_instances[$id])) {
$instance = new KunenaMessage();
// Only load messages which haven't been preloaded before (including missing ones).
$instance->load(!\array_key_exists($id, self::$_instances) ? $id : null);
$instance->id = $id;
self::$_instances[$id] = $instance;
} elseif ($reload) {
self::$_instances[$id]->load();
}
return self::$_instances[$id];
}
/**
* @param array|string $mesids mesid
*
* @return void
*
* @since Kunena 6.0
*
* @throws Exception
*/
public static function loadLocation($mesids): void
{
// NOTE: if you already know the location using this code just takes resources
if (!\is_array($mesids)) {
$mesids = explode(',', $mesids);
}
$ids = [];
foreach ($mesids as $id) {
if ($id instanceof KunenaMessage) {
$id = $id->id;
} else {
$id = (int) $id;
}
if (!isset(self::$_location [$id])) {
$ids[$id] = $id;
self::$_location [$id] = new stdClass();
self::$_location [$id]->hold = ['before' => 0, 'after' => 0];
}
}
if (empty($ids)) {
return;
}
$idlist = implode(',', $ids);
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->createQuery();
$query->select(
'm.id, mm.hold, m.catid AS category_id, m.thread AS topic_id,
SUM(mm.time<m.time) AS before_count,
SUM(mm.time>m.time) AS after_count'
)
->from($db->quoteName('#__kunena_messages', 'm'))
->innerJoin($db->quoteName('#__kunena_messages', 'mm') . ' ON ' . $db->quoteName('m.thread') . ' = ' . $db->quoteName('mm.thread'))
->where($db->quoteName('m.id') . ' IN (' . $idlist . ')')
->group([$db->quoteName('m.id'), $db->quoteName('mm.hold')]);
$db->setQuery($query);
try {
$results = (array) $db->loadObjectList();
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
}
if (!empty($results)) {
foreach ($results as $result) {
$instance = self::$_location [$result->id];
if (!isset($instance->id)) {
$instance->id = $result->id;
$instance->category_id = $result->category_id;
$instance->topic_id = $result->topic_id;
self::$_location [$instance->id] = $instance;
}
$instance->hold[$result->hold] = ['before' => $result->before_count, 'after' => $result->after_count];
}
}
}
/**
* Free up memory by cleaning up all cached items.
*
* @return void
*
* @since Kunena 6.0
*/
public static function cleanup(): void
{
self::$_instances = [];
self::$_location = [];
}
/**
* @param bool|array|int $topicids topicids
*
* @return boolean|integer
*
* @since Kunena 6.0
*
* @throws Exception
*/
public static function recount($topicids = false)
{
$db = Factory::getContainer()->get('DatabaseDriver');
if (\is_array($topicids)) {
$where = $db->quoteName('m.thread') . ' IN (' . implode(',', $topicids) . ')';
} elseif ((int) $topicids) {
$where = $db->quoteName('m.thread') . ' = ' . $db->quote((int) $topicids);
} else {
$where = '';
}
// Update catid in all messages
$query = $db->createQuery();
$query->update($db->quoteName('#__kunena_messages', 'm'))
->innerJoin($db->quoteName('#__kunena_attachments', 'tt') . ' ON ' . $db->quoteName('tt.id') . ' = ' . $db->quoteName('m.thread'))
->set($db->quoteName('m.catid') . ' = ' . $db->quoteName('tt.category_id'))
->where($where);
$db->setQuery($query);
try {
$db->execute();
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
return false;
}
return $db->getAffectedRows();
}
/**
* @param array $ids ids
*
* @return array|boolean
*
* @since Kunena 5.0.3
*
* @throws Exception
*/
public static function getMessagesByTopics(array $ids)
{
if (empty($ids)) {
return false;
}
$db = Factory::getContainer()->get('DatabaseDriver');
$idlist = implode(',', $ids);
$query = $db->createQuery();
$query->select(array('m.*', 't.message'))
->from($db->quoteName('#__kunena_messages', 'm'))
->innerJoin($db->quoteName('#__kunena_messages_text', 't') . ' ON ' . $db->quoteName('m.id') . ' = ' . $db->quoteName('t.mesid'))
->where($db->quoteName('m.thread') . ' IN (' . $idlist . ')')
->andWhere($db->quoteName('m.hold') . ' = 0');
$db->setQuery($query);
try {
$results = (array) $db->loadAssocList('id');
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
}
return $results;
}
/**
* Get last IP address used by the user
*
* @param int $userid userid
*
* @return bool
*
* @since Kunena 6.0
*
* @throws \Exception
*/
public static function getLastUserIP(int $userid): bool
{
if (!$userid) {
return false;
}
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->createQuery();
$query->select($db->quoteName('ip'))
->from($db->quoteName('#__kunena_messages'))
->where($db->quoteName('userid') . ' = ' . $db->quote($userid))
->group($db->quoteName('ip'))
->order($db->quoteName('time') . ' DESC');
$query->setLimit(1);
$db->setQuery($query);
try {
$ip = $db->loadResult();
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
}
return $ip;
}
/**
* Get the messages from users given
*
* @param array $users
*
* @return object
*
* @since Kunena 6.0
*
* @throws \Exception
*/
public static function getMessagesFromUsers(array $users)
{
$list = [];
foreach ($users as $user) {
if ($user instanceof KunenaUser) {
$list[] = (int) $user->userid;
} elseif ($user instanceof User) {
$list[] = (int) $user->id;
} else {
$list[] = (int) $user;
}
}
if (empty($list)) {
return;
}
$userlist = implode(',', $list);
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->createQuery();
$query->select($db->quoteName('thread'))
->from($db->quoteName('#__kunena_messages'))
->where($db->quoteName('userid') . ' IN (' . $userlist . ')')
->group($db->quoteName('thread'));
$db->setQuery($query);
try {
$threads = $db->loadObjectList();
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
}
return $threads;
}
}