handler = $handler; if ($params) { foreach ($params as $k => $v) $NOTIFICATION_HANDLERS[$method]->$k = $v; } return true; } return false; } /** * Notify a user via their preferences. * * @param mixed $to Either a guid or an array of guid's to notify. * @param int $from GUID of the sender, which may be a user, site or object. * @param string $subject Message subject. * @param string $message Message body. * @param array $params Misc additional parameters specific to various methods. * @param mixed $methods_override A string, or an array of strings specifying the delivery methods to use - or leave blank * for delivery using the user's chosen delivery methods. * @return array Compound array of each delivery user/delivery method's success or failure. * @throws NotificationException */ function notify_user($to, $from, $subject, $message, array $params = NULL, $methods_override = "") { global $NOTIFICATION_HANDLERS, $CONFIG; // Sanitise if (!is_array($to)) $to = array((int)$to); $from = (int)$from; //$subject = sanitise_string($subject); // Get notification methods if (($methods_override) && (!is_array($methods_override))) $methods_override = array($methods_override); $result = array(); foreach ($to as $guid) { // Results for a user are... $result[$guid] = array(); // Are we overriding delivery? $methods = $methods_override; if (!$methods) { $tmp = (array)get_user_notification_settings($guid); $methods = array(); foreach($tmp as $k => $v) if ($v) $methods[] = $k; // Add method if method is turned on for user! } if ($methods) { // Deliver foreach ($methods as $method) { // Extract method details from list $details = $NOTIFICATION_HANDLERS[$method]; $handler = $details->handler; if ((!$NOTIFICATION_HANDLERS[$method]) || (!$handler)) throw new NotificationException(sprintf(elgg_echo('NotificationException:NoHandlerFound'), $method)); if ($CONFIG->debug) error_log("Sending message to $guid using $method"); // Trigger handler and retrieve result. $result[$guid][$method] = $handler( $from ? get_entity($from) : NULL, // From entity get_entity($guid), // To entity $subject, // The subject $message, // Message $params // Params ); } } } return $result; } /** * Get the notification settings for a given user. * * @param int $user_guid The user id * @return stdClass */ function get_user_notification_settings($user_guid = 0) { $user_guid = (int)$user_guid; if ($user_guid == 0) $user_guid = $_SESSION['user']->guid; $all_metadata = get_metadata_for_entity($user_guid); if ($all_metadata) { $prefix = "notification:method:"; $return = new stdClass; foreach ($all_metadata as $meta) { $name = substr($meta->name, strlen($prefix)); $value = $meta->value; if (strpos($meta->name, $prefix) === 0) $return->$name = $value; } return $return; } return false; } /** * Set a user notification pref. * * @param int $user_guid The user id. * @param string $method The delivery method (eg. email) * @param bool $value On(true) or off(false). * @return bool */ function set_user_notification_setting($user_guid, $method, $value) { $user_guid = (int)$user_guid; $method = sanitise_string($method); if ($user_guid == 0) $user_guid = $_SESSION['user']->guid; $user = get_entity($user_guid); if (($user) && ($user instanceof ElggUser)) { $prefix = "notification:method:$method"; $user->$prefix = $value; $user->save(); return true; } return false; } /** * Notification exception. * @author Marcus Povey */ class NotificationException extends Exception {} /** * Send a notification via email. * * @param ElggEntity $from The from user/site/object * @param ElggUser $to To which user? * @param string $subject The subject of the message. * @param string $message The message body * @param array $params Optional parameters (none taken in this instance) * @return bool */ function email_notify_handler(ElggEntity $from, ElggUser $to, $subject, $message, array $params = NULL) { global $CONFIG; if (!$from) throw new NotificationException(sprintf(elgg_echo('NotificationException:MissingParameter'), 'from')); if (!$to) throw new NotificationException(sprintf(elgg_echo('NotificationException:MissingParameter'), 'to')); if ($to->email=="") throw new NotificationException(sprintf(elgg_echo('NotificationException:NoEmailAddress'), $to->guid)); $to = $to->email; /*if (!$hide_sender) { if ($from->email) $from = $from->email; // Handle users else if ($from->url) { $breakdown = parse_url($from->url); $from = 'noreply@' . $breakdown['host']; // Handle anything with a url } else { $from = 'noreply@' . get_site_domain($CONFIG->site_guid); // Handle a fallback } } else*/ $from = 'noreply@' . get_site_domain($CONFIG->site_guid); // Handle a fallback $headers = "From: $from\r\n"; return mail($to, $subject, wordwrap($message), $headers); } /** * Correctly initialise notifications and register the email handler. * */ function notification_init() { // Register a notification handler for the default email method register_notification_handler("email", "email_notify_handler"); // Add settings view to user settings & register action extend_elgg_settings_page('notifications/settings/usersettings', 'usersettings/user'); register_plugin_hook('usersettings:save','user','notification_user_settings_save'); //register_action("notifications/settings/usersettings/save"); } function notification_user_settings_save() { global $CONFIG; @include($CONFIG->path . "actions/notifications/settings/usersettings/save.php"); } // Register a startup event register_elgg_event_handler('init','system','notification_init',0); ?>