2012-09-08 10:49:58 -05:00
< ? php
/**
*
* @ package notifications
* @ copyright ( c ) 2012 phpBB Group
* @ license http :// opensource . org / licenses / gpl - 2.0 . php GNU General Public License v2
*
*/
/**
* @ ignore
*/
if ( ! defined ( 'IN_PHPBB' ))
{
exit ;
}
/**
* Notifications service class
* @ package notifications
*/
2012-10-04 13:39:54 -05:00
class phpbb_notification_manager
2012-09-08 10:49:58 -05:00
{
2012-10-04 14:27:43 -05:00
protected $db , $cache , $template , $extension_manager , $user , $auth , $config , $phpbb_root_path , $php_ext = null ;
2012-09-08 10:49:58 -05:00
/**
* Users loaded from the DB
*
* @ var array Array of user data that we ' ve loaded from the DB
*/
2012-09-09 10:19:46 -05:00
protected $users = array ();
2012-09-08 10:49:58 -05:00
2012-10-04 21:39:17 -05:00
public function __construct ( dbal $db , phpbb_cache_driver_interface $cache , phpbb_template $template , phpbb_extension_manager $extension_manager , $user , phpbb_auth $auth , phpbb_config $config , $phpbb_root_path , $php_ext )
2012-09-08 10:49:58 -05:00
{
2012-10-04 14:27:43 -05:00
$this -> db = $db ;
$this -> cache = $cache ;
$this -> template = $template ;
$this -> extension_manager = $extension_manager ;
$this -> user = $user ;
$this -> auth = $auth ;
$this -> config = $config ;
$this -> phpbb_root_path = $phpbb_root_path ;
$this -> php_ext = $php_ext ;
2012-09-08 10:49:58 -05:00
}
/**
* Load the user ' s notifications
*
* @ param array $options Optional options to control what notifications are loaded
2012-09-20 10:36:11 -05:00
* notification_id Notification id to load ( or array of notification ids )
* user_id User id to load notifications for ( Default : $user -> data [ 'user_id' ])
* order_by Order by ( Default : time )
* order_dir Order direction ( Default : DESC )
* limit Number of notifications to load ( Default : 5 )
* start Notifications offset ( Default : 0 )
* all_unread Load all unread messages ? If set to true , count_unread is set to true ( Default : false )
* count_unread Count all unread messages ? ( Default : false )
2012-09-08 10:49:58 -05:00
*/
public function load_notifications ( $options = array ())
{
// Merge default options
$options = array_merge ( array (
2012-09-20 10:36:11 -05:00
'notification_id' => false ,
2012-10-04 14:27:43 -05:00
'user_id' => $this -> user -> data [ 'user_id' ],
2012-09-20 10:36:11 -05:00
'order_by' => 'time' ,
'order_dir' => 'DESC' ,
'limit' => 0 ,
'start' => 0 ,
'all_unread' => false ,
'count_unread' => false ,
2012-09-08 10:49:58 -05:00
), $options );
2012-09-20 10:36:11 -05:00
// If all_unread, count_unread mus be true
$options [ 'count_unread' ] = ( $options [ 'all_unread' ]) ? true : $options [ 'count_unread' ];
2012-09-15 11:59:30 -05:00
// Anonymous users and bots never receive notifications
2012-10-04 14:27:43 -05:00
if ( $options [ 'user_id' ] == $this -> user -> data [ 'user_id' ] && ( $this -> user -> data [ 'user_id' ] == ANONYMOUS || $this -> user -> data [ 'user_type' ] == USER_IGNORE ))
2012-09-15 11:59:30 -05:00
{
2012-09-15 13:51:02 -05:00
return array (
'notifications' => array (),
'unread_count' => 0 ,
);
2012-09-15 11:59:30 -05:00
}
2012-09-08 10:49:58 -05:00
$notifications = $user_ids = array ();
2012-09-12 22:29:48 -05:00
$load_special = array ();
2012-09-20 10:36:11 -05:00
$count = 0 ;
2012-09-08 10:49:58 -05:00
2012-09-20 10:36:11 -05:00
if ( $options [ 'count_unread' ])
{
// Get the total number of unread notifications
$sql = ' SELECT COUNT ( * ) AS count
FROM ' . NOTIFICATIONS_TABLE . '
WHERE user_id = ' . (int) $options[' user_id '] . '
AND unread = 1 ' ;
$result = $this -> db -> sql_query ( $sql );
$count = ( int ) $this -> db -> sql_fetchfield ( 'count' , $result );
$this -> db -> sql_freeresult ( $result );
}
2012-09-14 18:30:12 -05:00
$rowset = array ();
// Get the main notifications
2012-09-09 17:23:32 -05:00
$sql = ' SELECT *
FROM ' . NOTIFICATIONS_TABLE . '
2012-09-20 10:36:11 -05:00
WHERE user_id = ' . (int) $options[' user_id ' ] .
(( $options [ 'notification_id' ]) ? (( is_array ( $options [ 'notification_id' ])) ? ' AND ' . $this -> db -> sql_in_set ( 'notification_id' , $options [ 'notification_id' ]) : ' AND notification_id = ' . ( int ) $options [ 'notification_id' ]) : '' ) . '
2012-09-08 17:28:13 -05:00
ORDER BY ' . $this->db->sql_escape($options[' order_by ']) . ' ' . $this->db->sql_escape($options[' order_dir ' ]);
2012-09-08 10:49:58 -05:00
$result = $this -> db -> sql_query_limit ( $sql , $options [ 'limit' ], $options [ 'start' ]);
while ( $row = $this -> db -> sql_fetchrow ( $result ))
2012-09-14 18:30:12 -05:00
{
$rowset [ $row [ 'notification_id' ]] = $row ;
}
$this -> db -> sql_freeresult ( $result );
// Get all unread notifications
2012-09-20 10:36:11 -05:00
if ( $count && $options [ 'all_unread' ] && ! empty ( $rowset ))
2012-09-14 18:30:12 -05:00
{
$sql = ' SELECT *
FROM ' . NOTIFICATIONS_TABLE . '
WHERE user_id = ' . (int) $options[' user_id '] . '
AND unread = 1
AND ' . $this->db->sql_in_set(' notification_id ', array_keys($rowset), true) . '
ORDER BY ' . $this->db->sql_escape($options[' order_by ']) . ' ' . $this->db->sql_escape($options[' order_dir ' ]);
$result = $this -> db -> sql_query_limit ( $sql , $options [ 'limit' ], $options [ 'start' ]);
while ( $row = $this -> db -> sql_fetchrow ( $result ))
{
$rowset [ $row [ 'notification_id' ]] = $row ;
}
$this -> db -> sql_freeresult ( $result );
}
foreach ( $rowset as $row )
2012-09-08 10:49:58 -05:00
{
2012-09-08 12:28:58 -05:00
$item_type_class_name = $this -> get_item_type_class_name ( $row [ 'item_type' ], true );
2012-09-08 10:49:58 -05:00
2012-10-04 14:27:43 -05:00
$notification = $this -> get_item_type_class ( $item_type_class_name , $row );
2012-09-08 10:49:58 -05:00
2012-09-12 22:29:48 -05:00
// Array of user_ids to query all at once
2012-09-08 10:49:58 -05:00
$user_ids = array_merge ( $user_ids , $notification -> users_to_query ());
2012-09-12 22:29:48 -05:00
// Some notification types also require querying additional tables themselves
if ( ! isset ( $load_special [ $row [ 'item_type' ]]))
{
$load_special [ $row [ 'item_type' ]] = array ();
}
$load_special [ $row [ 'item_type' ]] = array_merge ( $load_special [ $row [ 'item_type' ]], $notification -> get_load_special ());
2012-09-08 12:05:55 -05:00
$notifications [] = $notification ;
2012-09-08 10:49:58 -05:00
}
2012-09-09 10:19:46 -05:00
$this -> load_users ( $user_ids );
2012-09-08 10:49:58 -05:00
2012-10-04 14:27:43 -05:00
// Allow each type to load its own special items
2012-09-12 22:29:48 -05:00
foreach ( $load_special as $item_type => $data )
{
$item_type_class_name = $this -> get_item_type_class_name ( $item_type , true );
2012-10-04 14:27:43 -05:00
$item_class = $this -> get_item_type_class ( $item_type_class_name );
$item_class -> load_special ( $data , $notifications );
2012-09-12 22:29:48 -05:00
}
2012-09-14 18:30:12 -05:00
return array (
'notifications' => $notifications ,
'unread_count' => $count ,
);
2012-09-08 10:49:58 -05:00
}
2012-09-14 15:59:13 -05:00
/**
* Mark notifications read
*
2012-09-14 16:54:20 -05:00
* @ param string | array $item_type Type identifier or array of item types ( only acceptable if the $data is identical for the specified types )
2012-09-14 15:59:13 -05:00
* @ param bool | int | array $item_id Item id or array of item ids . False to mark read for all item ids
* @ param bool | int | array $user_id User id or array of user ids . False to mark read for all user ids
* @ param bool | int $time Time at which to mark all notifications prior to as read . False to mark all as read . ( Default : False )
*/
public function mark_notifications_read ( $item_type , $item_id , $user_id , $time = false )
{
2012-09-14 16:54:20 -05:00
if ( is_array ( $item_type ))
{
foreach ( $item_type as $type )
{
$this -> mark_notifications_read ( $type , $item_id , $user_id , $time );
}
return ;
}
2012-09-14 15:59:13 -05:00
$time = ( $time ) ? : time ();
$this -> get_item_type_class_name ( $item_type );
$sql = 'UPDATE ' . NOTIFICATIONS_TABLE . "
SET unread = 0
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND time <= " . $time .
(( $item_id !== false ) ? ' AND ' . ( is_array ( $item_id ) ? $this -> db -> sql_in_set ( 'item_id' , $item_id ) : 'item_id = ' . ( int ) $item_id ) : '' ) .
(( $user_id !== false ) ? ' AND ' . ( is_array ( $user_id ) ? $this -> db -> sql_in_set ( 'user_id' , $user_id ) : 'user_id = ' . ( int ) $user_id ) : '' );
$this -> db -> sql_query ( $sql );
}
/**
* Mark notifications read from a parent identifier
*
2012-09-14 16:54:20 -05:00
* @ param string | array $item_type Type identifier or array of item types ( only acceptable if the $data is identical for the specified types )
2012-09-14 15:59:13 -05:00
* @ param bool | int | array $item_parent_id Item parent id or array of item parent ids . False to mark read for all item parent ids
* @ param bool | int | array $user_id User id or array of user ids . False to mark read for all user ids
* @ param bool | int $time Time at which to mark all notifications prior to as read . False to mark all as read . ( Default : False )
*/
public function mark_notifications_read_by_parent ( $item_type , $item_parent_id , $user_id , $time = false )
{
2012-09-14 16:54:20 -05:00
if ( is_array ( $item_type ))
{
foreach ( $item_type as $type )
{
2012-09-14 18:05:13 -05:00
$this -> mark_notifications_read_by_parent ( $type , $item_parent_id , $user_id , $time );
2012-09-14 16:54:20 -05:00
}
return ;
}
2012-09-14 15:59:13 -05:00
$time = ( $time ) ? : time ();
$item_type_class_name = $this -> get_item_type_class_name ( $item_type );
$sql = 'UPDATE ' . NOTIFICATIONS_TABLE . "
SET unread = 0
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND time <= " . $time .
(( $item_parent_id !== false ) ? ' AND ' . ( is_array ( $item_parent_id ) ? $this -> db -> sql_in_set ( 'item_parent_id' , $item_parent_id ) : 'item_parent_id = ' . ( int ) $item_parent_id ) : '' ) .
(( $user_id !== false ) ? ' AND ' . ( is_array ( $user_id ) ? $this -> db -> sql_in_set ( 'user_id' , $user_id ) : 'user_id = ' . ( int ) $user_id ) : '' );
$this -> db -> sql_query ( $sql );
}
2012-09-20 10:36:11 -05:00
/**
* Mark notifications read
*
* @ param int | array $notification_id Notification id or array of notification ids .
* @ param bool | int $time Time at which to mark all notifications prior to as read . False to mark all as read . ( Default : False )
*/
public function mark_notifications_read_by_id ( $notification_id , $time = false )
{
$time = ( $time ) ? : time ();
$sql = 'UPDATE ' . NOTIFICATIONS_TABLE . "
SET unread = 0
WHERE time <= " . $time . '
AND ' . ((is_array($notification_id)) ? $this->db->sql_in_set(' notification_id ', $notification_id) : ' notification_id = ' . ( int ) $notification_id );
$this -> db -> sql_query ( $sql );
}
2012-09-08 11:40:02 -05:00
/**
* Add a notification
*
2012-09-14 16:54:20 -05:00
* @ param string | array $item_type Type identifier or array of item types ( only acceptable if the $data is identical for the specified types )
2012-09-27 20:11:28 -05:00
* Note : If you send an array of types , any user who could receive multiple notifications from this single item will only receive
* a single notification . If they MUST receive multiple notifications , call this function multiple times instead of sending an array
2012-09-08 11:40:02 -05:00
* @ param array $data Data specific for this type that will be inserted
*/
2012-09-27 20:05:06 -05:00
public function add_notifications ( $item_type , $data , $options = array ())
2012-09-08 10:49:58 -05:00
{
2012-09-27 20:05:06 -05:00
$options = array_merge ( array (
'ignore_users' => array (),
), $options );
2012-09-14 16:54:20 -05:00
if ( is_array ( $item_type ))
{
2012-09-27 20:05:06 -05:00
$notified_users = array ();
$temp_options = $options ;
2012-09-14 16:54:20 -05:00
foreach ( $item_type as $type )
{
2012-09-27 20:05:06 -05:00
$temp_options [ 'ignore_users' ] = $options [ 'ignore_users' ] + $notified_users ;
$notified_users += $this -> add_notifications ( $type , $data , $temp_options );
2012-09-14 16:54:20 -05:00
}
2012-09-27 20:05:06 -05:00
return $notified_users ;
2012-09-14 16:54:20 -05:00
}
2012-09-08 12:28:58 -05:00
$item_type_class_name = $this -> get_item_type_class_name ( $item_type );
$item_id = $item_type_class_name :: get_item_id ( $data );
2012-09-08 10:49:58 -05:00
// find out which users want to receive this type of notification
2012-10-04 14:27:43 -05:00
$notify_users = $this -> get_item_type_class ( $item_type_class_name ) -> find_users_for_notification ( $data , $options );
2012-09-08 10:49:58 -05:00
2012-09-14 14:55:14 -05:00
$this -> add_notifications_for_users ( $item_type , $data , $notify_users );
2012-09-27 20:05:06 -05:00
return $notify_users ;
2012-09-14 14:55:14 -05:00
}
/**
* Add a notification for specific users
*
2012-09-14 16:54:20 -05:00
* @ param string | array $item_type Type identifier or array of item types ( only acceptable if the $data is identical for the specified types )
2012-09-14 14:55:14 -05:00
* @ param array $data Data specific for this type that will be inserted
* @ param array $notify_users User list to notify
*/
public function add_notifications_for_users ( $item_type , $data , $notify_users )
{
2012-09-14 16:54:20 -05:00
if ( is_array ( $item_type ))
{
foreach ( $item_type as $type )
{
2012-09-15 14:33:15 -05:00
$this -> add_notifications_for_users ( $type , $data , $notify_users );
2012-09-14 16:54:20 -05:00
}
return ;
}
2012-09-14 14:55:14 -05:00
$item_type_class_name = $this -> get_item_type_class_name ( $item_type );
$item_id = $item_type_class_name :: get_item_id ( $data );
$user_ids = array ();
$notification_objects = $notification_methods = array ();
$new_rows = array ();
2012-09-15 13:51:02 -05:00
// Never send notifications to the anonymous user!
unset ( $notify_users [ ANONYMOUS ]);
2012-09-09 10:19:46 -05:00
2012-09-08 12:28:58 -05:00
// Make sure not to send new notifications to users who've already been notified about this item
// This may happen when an item was added, but now new users are able to see the item
2012-09-14 14:55:14 -05:00
// todo Users should not receive notifications from multiple events from the same item (ex: for a topic reply with a quote including your username)
// Probably should be handled within each type?
2012-09-09 17:23:32 -05:00
$sql = ' SELECT user_id
FROM ' . NOTIFICATIONS_TABLE . "
2012-09-08 12:28:58 -05:00
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND item_id = " . (int) $item_id ;
$result = $this -> db -> sql_query ( $sql );
while ( $row = $this -> db -> sql_fetchrow ( $result ))
{
unset ( $notify_users [ $row [ 'user_id' ]]);
}
$this -> db -> sql_freeresult ( $result );
2012-09-08 16:02:32 -05:00
if ( ! sizeof ( $notify_users ))
{
return ;
}
2012-09-08 11:40:02 -05:00
// Go through each user so we can insert a row in the DB and then notify them by their desired means
foreach ( $notify_users as $user => $methods )
{
2012-10-04 14:27:43 -05:00
$notification = $this -> get_item_type_class ( $item_type_class_name );
2012-09-08 10:49:58 -05:00
2012-09-08 11:40:02 -05:00
$notification -> user_id = ( int ) $user ;
2012-09-08 10:49:58 -05:00
2012-09-09 10:19:46 -05:00
// Store the creation array in our new rows that will be inserted later
2012-09-08 10:49:58 -05:00
$new_rows [] = $notification -> create_insert_array ( $data );
2012-09-09 10:19:46 -05:00
// Users are needed to send notifications
$user_ids = array_merge ( $user_ids , $notification -> users_to_query ());
2012-09-08 11:40:02 -05:00
foreach ( $methods as $method )
2012-09-08 10:49:58 -05:00
{
2012-09-08 11:40:02 -05:00
// setup the notification methods and add the notification to the queue
2012-09-09 14:55:40 -05:00
if ( $method ) // blank means we just insert it as a notification, but do not notify them by any other means
2012-09-08 10:49:58 -05:00
{
2012-09-08 16:12:20 -05:00
if ( ! isset ( $notification_methods [ $method ]))
2012-09-08 11:40:02 -05:00
{
2012-10-04 13:40:40 -05:00
$method_class_name = 'phpbb_notification_method_' . $method ;
2012-10-04 14:27:43 -05:00
$notification_methods [ $method ] = $this -> get_method_class ( $method_class_name );
2012-09-08 11:40:02 -05:00
}
2012-09-09 10:19:46 -05:00
2012-09-08 16:12:20 -05:00
$notification_methods [ $method ] -> add_to_queue ( $notification );
2012-09-08 11:40:02 -05:00
}
2012-09-08 10:49:58 -05:00
}
}
// insert into the db
$this -> db -> sql_multi_insert ( NOTIFICATIONS_TABLE , $new_rows );
2012-09-09 10:19:46 -05:00
// We need to load all of the users to send notifications
$this -> load_users ( $user_ids );
2012-09-08 10:49:58 -05:00
// run the queue for each method to send notifications
2012-09-08 11:40:02 -05:00
foreach ( $notification_methods as $method )
2012-09-08 10:49:58 -05:00
{
2012-09-09 10:36:22 -05:00
$method -> notify ();
2012-09-08 10:49:58 -05:00
}
}
2012-09-08 11:40:02 -05:00
/**
* Update a notification
*
2012-09-14 16:54:20 -05:00
* @ param string | array $item_type Type identifier or array of item types ( only acceptable if the $data is identical for the specified types )
2012-09-08 11:40:02 -05:00
* @ param array $data Data specific for this type that will be updated
*/
2012-09-09 10:19:46 -05:00
public function update_notifications ( $item_type , $data )
2012-09-08 10:49:58 -05:00
{
2012-09-14 16:54:20 -05:00
if ( is_array ( $item_type ))
{
foreach ( $item_type as $type )
{
2012-09-15 14:33:15 -05:00
$this -> update_notifications ( $type , $data );
2012-09-14 16:54:20 -05:00
}
return ;
}
2012-09-08 12:28:58 -05:00
$item_type_class_name = $this -> get_item_type_class_name ( $item_type );
2012-09-08 10:49:58 -05:00
2012-09-14 14:55:14 -05:00
// Allow the notifications class to over-ride the update_notifications functionality
if ( method_exists ( $item_type_class_name , 'update_notifications' ))
{
// Return False to over-ride the rest of the update
2012-10-04 14:27:43 -05:00
if ( $this -> get_item_type_class ( $item_type_class_name ) -> update_notifications ( $data ) === false )
2012-09-14 14:55:14 -05:00
{
return ;
}
}
2012-09-09 10:19:46 -05:00
$item_id = $item_type_class_name :: get_item_id ( $data );
2012-10-04 14:27:43 -05:00
$notification = $this -> get_item_type_class ( $item_type_class_name );
2012-09-08 11:40:02 -05:00
$update_array = $notification -> create_update_array ( $data );
2012-09-08 10:49:58 -05:00
$sql = 'UPDATE ' . NOTIFICATIONS_TABLE . '
2012-09-08 11:40:02 -05:00
SET ' . $this->db->sql_build_array(' UPDATE ' , $update_array ) . "
2012-09-08 12:28:58 -05:00
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND item_id = " . (int) $item_id ;
$this -> db -> sql_query ( $sql );
}
/**
* Delete a notification
*
2012-09-15 14:33:15 -05:00
* @ param string | array $item_type Type identifier or array of item types ( only acceptable if the $item_id is identical for the specified types )
2012-09-09 10:19:46 -05:00
* @ param int | array $item_id Identifier within the type ( or array of ids )
2012-09-08 12:28:58 -05:00
* @ param array $data Data specific for this type that will be updated
*/
public function delete_notifications ( $item_type , $item_id )
{
2012-09-15 14:33:15 -05:00
if ( is_array ( $item_type ))
{
foreach ( $item_type as $type )
{
$this -> delete_notifications ( $type , $item_id );
}
return ;
}
2012-09-14 15:59:13 -05:00
$this -> get_item_type_class_name ( $item_type );
2012-09-08 12:28:58 -05:00
$sql = 'DELETE FROM ' . NOTIFICATIONS_TABLE . "
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
2012-09-09 10:19:46 -05:00
AND " . (is_array( $item_id ) ? $this->db ->sql_in_set('item_id', $item_id ) : 'item_id = ' . (int) $item_id );
2012-09-08 11:40:02 -05:00
$this -> db -> sql_query ( $sql );
}
2012-09-08 10:49:58 -05:00
2012-09-26 21:48:59 -05:00
/**
* Get all of the subscription types
*
* @ return array Array of item types
*/
public function get_subscription_types ()
{
$subscription_types = array ();
2012-10-04 21:39:17 -05:00
foreach ( $this -> get_subscription_files ( 'notification/type/' ) as $class_name => $file )
2012-09-26 21:48:59 -05:00
{
2012-10-04 14:27:43 -05:00
$class_name = $this -> get_item_type_class_name ( $class_name );
2012-09-26 21:48:59 -05:00
2012-10-04 14:27:43 -05:00
$class = $this -> get_item_type_class ( $class_name );
if ( $class -> is_available () && method_exists ( $class_name , 'get_item_type' ))
2012-09-26 21:48:59 -05:00
{
2012-10-04 14:27:43 -05:00
if ( $class_name :: $notification_option === false )
2012-09-27 10:37:37 -05:00
{
2012-10-04 14:27:43 -05:00
$subscription_types [ $class_name :: get_item_type ()] = $class_name :: get_item_type ();
2012-09-27 10:37:37 -05:00
}
else
{
2012-10-04 14:27:43 -05:00
$subscription_types [ $class_name :: $notification_option [ 'id' ]] = $class_name :: $notification_option ;
2012-09-27 10:37:37 -05:00
}
2012-09-26 21:48:59 -05:00
}
}
return $subscription_types ;
}
/**
* Get all of the subscription methods
*
* @ return array Array of methods
*/
public function get_subscription_methods ()
{
2012-09-26 22:39:12 -05:00
$subscription_methods = array ();
2012-10-04 21:39:17 -05:00
foreach ( $this -> get_subscription_files ( 'notification/method/' ) as $method_name => $file )
2012-09-26 22:39:12 -05:00
{
2012-10-04 13:40:40 -05:00
$class_name = 'phpbb_notification_method_' . $method_name ;
2012-09-26 22:39:12 -05:00
2012-10-04 14:27:43 -05:00
$method = $this -> get_method_class ( $class_name );
2012-09-26 22:39:12 -05:00
if ( $method -> is_available ())
{
$subscription_methods [] = $method_name ;
}
}
return $subscription_methods ;
2012-09-26 21:48:59 -05:00
}
2012-09-27 18:25:37 -05:00
/**
* Get subscriptions
*
* @ param bool | int $user_id The user_id to add the subscription for ( bool false for current user )
* @ param bool $only_global True to select only global subscription options ( item_id = 0 )
*
* @ return array Subscriptions
*/
public function get_subscriptions ( $user_id = false , $only_global = false )
{
2012-10-04 14:27:43 -05:00
$user_id = ( $user_id === false ) ? $this -> user -> data [ 'user_id' ] : $user_id ;
2012-09-27 18:25:37 -05:00
$subscriptions = array ();
$sql = ' SELECT *
FROM ' . USER_NOTIFICATIONS_TABLE . '
WHERE user_id = ' . ( int ) $user_id .
(( $only_global ) ? ' AND item_id = 0' : '' );
$result = $this -> db -> sql_query ( $sql );
while ( $row = $this -> db -> sql_fetchrow ( $result ))
{
if ( $only_global )
{
if ( ! isset ( $subscriptions [ $row [ 'item_type' ]]))
{
$subscriptions [ $row [ 'item_type' ]] = array ();
}
$subscriptions [ $row [ 'item_type' ]][] = $row [ 'method' ];
}
else
{
$subscriptions [] = $row ;
}
}
$this -> db -> sql_freeresult ( $result );
return $subscriptions ;
}
2012-09-25 10:35:50 -05:00
/**
* Add a subscription
*
* @ param string $item_type Type identifier of the subscription
* @ param int $item_id The id of the item
* @ param string $method The method of the notification e . g . '' , 'email' , or 'jabber'
* @ param bool | int $user_id The user_id to add the subscription for ( bool false for current user )
*/
2012-09-27 18:25:37 -05:00
public function add_subscription ( $item_type , $item_id = 0 , $method = '' , $user_id = false )
2012-09-09 17:20:39 -05:00
{
$this -> get_item_type_class_name ( $item_type );
2012-10-04 14:27:43 -05:00
$user_id = ( $user_id === false ) ? $this -> user -> data [ 'user_id' ] : $user_id ;
2012-09-25 10:35:50 -05:00
2012-09-09 17:20:39 -05:00
$sql = 'INSERT INTO ' . USER_NOTIFICATIONS_TABLE . ' ' .
$this -> db -> sql_build_array ( 'INSERT' , array (
'item_type' => $item_type ,
'item_id' => ( int ) $item_id ,
2012-09-25 10:35:50 -05:00
'user_id' => ( int ) $user_id ,
2012-09-09 17:20:39 -05:00
'method' => $method ,
));
$this -> db -> sql_query ( $sql );
}
2012-09-25 10:35:50 -05:00
/**
* Delete a subscription
*
* @ param string $item_type Type identifier of the subscription
* @ param int $item_id The id of the item
* @ param string $method The method of the notification e . g . '' , 'email' , or 'jabber'
* @ param bool | int $user_id The user_id to add the subscription for ( bool false for current user )
*/
2012-09-27 18:25:37 -05:00
public function delete_subscription ( $item_type , $item_id = 0 , $method = '' , $user_id = false )
2012-09-25 10:35:50 -05:00
{
$this -> get_item_type_class_name ( $item_type );
2012-10-04 14:27:43 -05:00
$user_id = ( $user_id === false ) ? $this -> user -> data [ 'user_id' ] : $user_id ;
2012-09-25 10:35:50 -05:00
$sql = 'DELETE FROM ' . USER_NOTIFICATIONS_TABLE . "
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND item_id = " . (int) $item_id . '
AND user_id = ' . ( int ) $user_id . "
AND method = '" . $this->db->sql_escape($method) . "' " ;
$this -> db -> sql_query ( $sql );
}
2012-09-09 17:20:39 -05:00
2012-09-09 10:19:46 -05:00
/**
* Load user helper
*
* @ param array $user_ids
*/
public function load_users ( $user_ids )
{
2012-09-27 10:37:37 -05:00
$user_ids [] = ANONYMOUS ;
2012-09-09 10:19:46 -05:00
// Load the users
$user_ids = array_unique ( $user_ids );
// Do not load users we already have in $this->users
$user_ids = array_diff ( $user_ids , array_keys ( $this -> users ));
if ( sizeof ( $user_ids ))
{
2012-09-09 17:23:32 -05:00
$sql = ' SELECT *
FROM ' . USERS_TABLE . '
2012-09-09 10:19:46 -05:00
WHERE ' . $this->db->sql_in_set(' user_id ' , $user_ids );
$result = $this -> db -> sql_query ( $sql );
while ( $row = $this -> db -> sql_fetchrow ( $result ))
{
$this -> users [ $row [ 'user_id' ]] = $row ;
}
$this -> db -> sql_freeresult ( $result );
}
}
/**
* Get a user row from our users cache
*
* @ param int $user_id
* @ return array
*/
public function get_user ( $user_id )
{
2012-09-27 10:37:37 -05:00
return ( isset ( $this -> users [ $user_id ])) ? $this -> users [ $user_id ] : $this -> users [ ANONYMOUS ];
2012-09-09 10:19:46 -05:00
}
2012-09-08 11:40:02 -05:00
/**
2012-09-08 12:28:58 -05:00
* Helper to get the notifications item type class name and clean it if unsafe
2012-09-08 11:40:02 -05:00
*/
2012-09-08 12:28:58 -05:00
private function get_item_type_class_name ( & $item_type , $safe = false )
2012-09-08 11:40:02 -05:00
{
if ( ! $safe )
2012-09-08 10:49:58 -05:00
{
2012-10-05 00:07:48 -05:00
$item_type = preg_replace ( '#[^a-z_-]#' , '' , $item_type );
}
if ( strpos ( $item_type , 'ext_' ) === 0 )
{
$item_type_ary = explode ( '-' , substr ( $item_type , 4 ), 2 );
return 'phpbb_ext_' . $item_type_ary [ 0 ] . '_notification_type_' . $item_type_ary [ 1 ];
2012-09-08 10:49:58 -05:00
}
2012-09-08 11:40:02 -05:00
2012-10-04 13:40:40 -05:00
return 'phpbb_notification_type_' . $item_type ;
2012-09-08 10:49:58 -05:00
}
2012-09-26 21:48:59 -05:00
2012-10-04 14:27:43 -05:00
/**
* Helper to get the notifications item type class and set it up
*/
2012-10-05 00:07:48 -05:00
public function get_item_type_class ( $item_type , $data = array ())
2012-10-04 14:27:43 -05:00
{
2012-10-05 18:12:48 -05:00
if ( ! strpos ( $item_type , 'notification_type_' ))
{
$item_class = $this -> get_item_type_class_name ( $item_type );
$item_type = $item_class ;
}
2012-10-04 14:27:43 -05:00
$item = new $item_type ( $this , $this -> db , $this -> cache , $this -> template , $this -> extension_manager , $this -> user , $this -> auth , $this -> config , $this -> phpbb_root_path , $this -> php_ext );
$item -> set_initial_data ( $data );
return $item ;
}
/**
* Helper to get the notifications method class and set it up
*/
2012-10-05 00:07:48 -05:00
public function get_method_class ( $method_name )
2012-10-04 14:27:43 -05:00
{
return new $method_name ( $this , $this -> db , $this -> cache , $this -> template , $this -> extension_manager , $this -> user , $this -> auth , $this -> config , $this -> phpbb_root_path , $this -> php_ext );
}
2012-09-26 21:48:59 -05:00
/**
* Helper to get subscription related files with the finder
*/
private function get_subscription_files ( $path )
{
2012-10-04 14:27:43 -05:00
$finder = $this -> extension_manager -> get_finder ();
2012-09-26 21:48:59 -05:00
$subscription_files = array ();
$files = $finder
-> core_path ( 'includes/' . $path )
-> extension_directory ( $path )
-> get_files ();
foreach ( $files as $file )
{
2012-10-05 00:07:48 -05:00
$name = substr ( $file , strrpos ( $file , '/' ));
$name = substr ( $name , 1 , ( strpos ( $name , '.' . $this -> php_ext ) - 1 ));
2012-09-26 21:48:59 -05:00
2012-10-05 00:07:48 -05:00
if ( $name == 'interface' || $name == 'base' )
2012-09-26 21:48:59 -05:00
{
continue ;
}
2012-10-05 00:07:48 -05:00
if ( ! strpos ( $file , 'includes/' )) // is an extension
{
$ext_name = substr ( $file , ( strpos ( $file , 'ext/' ) + 4 ));
$ext_name = substr ( $ext_name , 0 , strpos ( $ext_name , '/' ));
$name = 'ext_' . $ext_name . '-' . $name ;
}
$subscription_files [ $name ] = $file ;
2012-09-26 21:48:59 -05:00
}
return $subscription_files ;
}
2012-09-08 10:49:58 -05:00
}