Version 4.5.0

This commit is contained in:
Neo committed 2025-12-19 05:51:58 -08:00
1 parent 1a0c7fd3c2
commit f79dcf067a
3791 files changed
+248032 -76372

No files matched your search

@@ -11,7 +11,7 @@
namespace IPS\core\Messenger;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
@@ -43,6 +43,11 @@ class _Conversation extends \IPS\Content\Item
* @brief [Content\Item] Include the ability to search this content item in global site searches
*/
public static $includeInSiteSearch = FALSE;
/**
* @brief [Content\Comment] Icon
*/
public static $icon = 'envelope';
/**
* Delete Record
@@ -185,6 +190,17 @@ class _Conversation extends \IPS\Content\Item
return TRUE;
}
/**
* Can Merge?
*
* @param \IPS\Member|NULL $member The member to check for (NULL for currently logged in member)
* @return bool
*/
public function canMerge( $member=NULL )
{
return FALSE;
}
/**
* Get elements for add/edit form
*
@@ -215,7 +231,7 @@ class _Conversation extends \IPS\Content\Item
$return['to'] = new \IPS\Helpers\Form\Member( 'messenger_to', $member, TRUE, array( 'multiple' => ( \IPS\Member::loggedIn()->group['g_max_mass_pm'] == -1 ) ? NULL : \IPS\Member::loggedIn()->group['g_max_mass_pm'] ), function ( $members )
{
if ( is_array( $members ) )
if ( \is_array( $members ) )
{
foreach ( $members as $m )
{
@@ -301,7 +317,7 @@ class _Conversation extends \IPS\Content\Item
protected function processBeforeCreate( $values )
{
$this->maps = array();
$this->to_count = count( $values['messenger_to'] );
$this->to_count = \count( $values['messenger_to'] );
parent::processBeforeCreate( $values );
}
@@ -319,7 +335,7 @@ class _Conversation extends \IPS\Content\Item
$this->first_msg_id = $comment->id;
$this->save();
if ( is_array( $values['messenger_to'] ) )
if ( \is_array( $values['messenger_to'] ) )
{
$members = array_map( function( $member )
{
@@ -377,7 +393,7 @@ class _Conversation extends \IPS\Content\Item
try
{
$report = \IPS\core\Reports\Report::load( $report );
if ( $report->class == 'IPS\core\Messenger\Message' and in_array( $report->content_id, iterator_to_array( \IPS\Db::i()->select( 'msg_id', 'core_message_posts', array( 'msg_topic_id=?', $this->id ) ) ) ) )
if ( $report->class == 'IPS\core\Messenger\Message' and \in_array( $report->content_id, iterator_to_array( \IPS\Db::i()->select( 'msg_id', 'core_message_posts', array( 'msg_topic_id=?', $this->id ) ) ) ) )
{
$_SESSION['report'] = $report->id;
return TRUE;
@@ -422,6 +438,11 @@ class _Conversation extends \IPS\Content\Item
*/
public function canDelete( $member=NULL )
{
if( \IPS\Member::loggedIn()->modPermission( 'can_view_reports' ) )
{
return TRUE; // Moderators who can manage reported content can "delete" conversations
}
return FALSE; // You don't delete a conversation. It gets deleted automatically when everyone has left.
}
@@ -473,7 +494,7 @@ class _Conversation extends \IPS\Content\Item
*/
public function get_activeParticipants()
{
return count( array_filter( $this->maps, function( $map )
return \count( array_filter( $this->maps, function( $map )
{
return $map['map_user_active'];
} ) );
@@ -574,7 +595,7 @@ class _Conversation extends \IPS\Content\Item
/**
* @brief Maps cache
*/
protected $maps = NULL;
public $maps = NULL;
/**
* Get maps
@@ -594,17 +615,17 @@ class _Conversation extends \IPS\Content\Item
/**
* Grant a member access
*
* @param \IPS\Member|array $member The member(s) to grant access
* @param \IPS\Member|array $members The member(s) to grant access
* @return bool
*/
public function authorize( $members )
{
$members = is_array( $members ) ? $members : array( $members );
$members = \is_array( $members ) ? $members : array( $members );
/* Go through each member */
foreach ( $members as $member )
{
if ( is_int( $member ) )
if ( \is_int( $member ) )
{
$member = \IPS\Member::load( $member );
}
@@ -672,12 +693,12 @@ class _Conversation extends \IPS\Content\Item
*/
public function deauthorize( $members, $banned=FALSE )
{
$members = is_array( $members ) ? $members : array( $members );
$members = \is_array( $members ) ? $members : array( $members );
foreach ( $members as $member )
{
unset( $this->maps[ $member->member_id ] );
\IPS\Db::i()->update( 'core_message_topic_user_map', array( 'map_user_active' => 0, 'map_user_banned' => $banned ), array( 'map_user_id=? AND map_topic_id=?', $member->member_id, $this->id ) );
\IPS\Db::i()->delete( 'core_notifications', array( 'notification_key=? AND item_id = ? AND member=?', 'new_private_message', $this->id, $member->member_id ) );
\IPS\Db::i()->delete( 'core_notifications', array( 'notification_key=? AND item_id = ? AND `member`=?', 'new_private_message', $this->id, $member->member_id ) );
static::rebuildMessageCounts( $member );
}
$this->rebuildParticipants();
@@ -709,6 +730,11 @@ class _Conversation extends \IPS\Content\Item
$this->delete();
}
}
/**
* @brief Cache member data we've already looked up so we don't have to do it again
*/
public static $participantMembers = array();
/**
* @brief Particpant blurb
@@ -728,13 +754,37 @@ class _Conversation extends \IPS\Content\Item
}
$people = array();
foreach( \IPS\Db::i()->select( 'member_id, name', 'core_members', array( \IPS\Db::i()->in( 'member_id', array_keys( $this->maps() ) ) ) ) as $member )
$memberIds = array_keys( $this->maps() );
foreach( $memberIds as $_idx => $memberId )
{
if ( $member['member_id'] === \IPS\Member::loggedIn()->member_id )
if( isset( static::$participantMembers[ $memberId ] ) )
{
$member['name'] = ( $member['member_id'] == $this->starter_id ) ? \IPS\Member::loggedIn()->language()->addToStack('participant_you_upper') : \IPS\Member::loggedIn()->language()->addToStack('participant_you_lower');
if ( $memberId === \IPS\Member::loggedIn()->member_id )
{
$people[ $memberId ] = ( $memberId == $this->starter_id ) ? \IPS\Member::loggedIn()->language()->addToStack('participant_you_upper') : \IPS\Member::loggedIn()->language()->addToStack('participant_you_lower');
}
else
{
$people[ $memberId ] = static::$participantMembers[ $memberId ];
}
unset( $memberIds[ $_idx ] );
}
}
if( \count( $memberIds ) )
{
foreach( \IPS\Db::i()->select( 'member_id, name', 'core_members', array( \IPS\Db::i()->in( 'member_id', $memberIds ) ) ) as $member )
{
if ( $member['member_id'] === \IPS\Member::loggedIn()->member_id )
{
$member['name'] = ( $member['member_id'] == $this->starter_id ) ? \IPS\Member::loggedIn()->language()->addToStack('participant_you_upper') : \IPS\Member::loggedIn()->language()->addToStack('participant_you_lower');
}
$people[ $member['member_id'] ] = $member['name'];
static::$participantMembers[ $member['member_id'] ] = $member['name'];
}
$people[ $member['member_id'] ] = $member['name'];
}
/* Move the starter to the front of the array */
@@ -743,13 +793,13 @@ class _Conversation extends \IPS\Content\Item
array_unshift( $people, $starter );
unset( $starter );
if ( count( $people ) == 1 )
if ( \count( $people ) == 1 )
{
$id = key( $people );
$name = array_pop( $people );
$this->participantBlurb = \IPS\Member::loggedIn()->member_id === $id ? \IPS\Member::loggedIn()->language()->addToStack( 'participant_you_upper' ) : $name;
}
elseif ( count( $people ) == 2 )
elseif ( \count( $people ) == 2 )
{
$this->participantBlurb = \IPS\Member::loggedIn()->language()->addToStack( 'participant_two', FALSE, array( 'sprintf' => $people ) );
}
@@ -773,9 +823,9 @@ class _Conversation extends \IPS\Content\Item
}
$sprintf[] = \IPS\Member::loggedIn()->language()->formatList( $others );
$sprintf[] = count( $others );
$sprintf[] = \count( $others );
$this->participantBlurb = \IPS\Member::loggedIn()->language()->addToStack( 'participant_three_plus', FALSE, array( 'pluralize' => array( count( $others ) ), 'sprintf' => $sprintf ) );
$this->participantBlurb = \IPS\Member::loggedIn()->language()->addToStack( 'participant_three_plus', FALSE, array( 'pluralize' => array( \count( $others ) ), 'sprintf' => $sprintf ) );
}
return $this->participantBlurb;
@@ -793,7 +843,7 @@ class _Conversation extends \IPS\Content\Item
{
$member = ( $member != NULL ) ? $member : \IPS\Member::loggedIn();
if ( in_array( $to, array_merge( array( 'myconvo' ), array_keys( json_decode( $member->pconversation_filters, TRUE ) ) ) ) )
if ( \in_array( $to, array_merge( array( 'myconvo' ), array_keys( json_decode( $member->pconversation_filters, TRUE ) ) ) ) )
{
\IPS\Db::i()->update( 'core_message_topic_user_map', array( 'map_folder_id' => $to ), array( 'map_user_id=? AND map_topic_id=?', $member->member_id, $this->id ) );
}