diff options
Diffstat (limited to 'modules/notification/helpers')
| -rw-r--r-- | modules/notification/helpers/notification.php | 218 | ||||
| -rw-r--r-- | modules/notification/helpers/notification_event.php | 149 | ||||
| -rw-r--r-- | modules/notification/helpers/notification_installer.php | 54 |
3 files changed, 421 insertions, 0 deletions
diff --git a/modules/notification/helpers/notification.php b/modules/notification/helpers/notification.php new file mode 100644 index 0000000..96493a2 --- /dev/null +++ b/modules/notification/helpers/notification.php @@ -0,0 +1,218 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2013 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class notification { + static function get_subscription($item_id, $user=null) { + if (empty($user)) { + $user = identity::active_user(); + } + + return ORM::factory("subscription") + ->where("item_id", "=", $item_id) + ->where("user_id", "=", $user->id) + ->find(); + } + + static function is_watching($item, $user=null) { + if (empty($user)) { + $user = identity::active_user(); + } + + return ORM::factory("subscription") + ->where("item_id", "=", $item->id) + ->where("user_id", "=", $user->id) + ->find() + ->loaded(); + } + + static function add_watch($item, $user=null) { + if ($item->is_album()) { + if (empty($user)) { + $user = identity::active_user(); + } + $subscription = ORM::factory("subscription"); + $subscription->item_id = $item->id; + $subscription->user_id = $user->id; + $subscription->save(); + } + } + + static function remove_watch($item, $user=null) { + if ($item->is_album()) { + if (empty($user)) { + $user = identity::active_user(); + } + + $subscription = ORM::factory("subscription") + ->where("item_id", "=", $item->id) + ->where("user_id", "=", $user->id) + ->find()->delete(); + } + } + + static function get_subscribers($item) { + $subscriber_ids = array(); + foreach (ORM::factory("subscription") + ->select("user_id") + ->join("items", "subscriptions.item_id", "items.id") + ->where("items.left_ptr", "<=", $item->left_ptr) + ->where("items.right_ptr", ">", $item->right_ptr) + ->find_all() + ->as_array() as $subscriber) { + $subscriber_ids[] = $subscriber->user_id; + } + + if (empty($subscriber_ids)) { + return array(); + } + $users = identity::get_user_list($subscriber_ids); + + $subscribers = array(); + foreach ($users as $user) { + if (access::user_can($user, "view", $item) && !empty($user->email)) { + $subscribers[$user->email] = $user->locale; + } + } + return $subscribers; + } + + static function send_item_updated($original, $item) { + foreach (self::get_subscribers($item) as $email => $locale) { + $v = new View("item_updated.html"); + $v->original = $original; + $v->item = $item; + $v->subject = $item->is_album() ? + t("Album \"%title\" updated", array("title" => $original->title, "locale" => $locale)) : + ($item->is_photo() ? + t("Photo \"%title\" updated", array("title" => $original->title, "locale" => $locale)) + : t("Movie \"%title\" updated", array("title" => $original->title, "locale" => $locale))); + self::_notify($email, $locale, $item, $v->render(), $v->subject); + } + } + + static function send_item_add($item) { + $parent = $item->parent(); + foreach (self::get_subscribers($item) as $email => $locale) { + $v = new View("item_added.html"); + $v->item = $item; + $v->subject = $item->is_album() ? + t("Album \"%title\" added to \"%parent_title\"", + array("title" => $item->title, "parent_title" => $parent->title, "locale" => $locale)) : + ($item->is_photo() ? + t("Photo \"%title\" added to \"%parent_title\"", + array("title" => $item->title, "parent_title" => $parent->title, "locale" => $locale)) : + t("Movie \"%title\" added to \"%parent_title\"", + array("title" => $item->title, "parent_title" => $parent->title, "locale" => $locale))); + self::_notify($email, $locale, $item, $v->render(), $v->subject); + } + } + + static function send_item_deleted($item) { + $parent = $item->parent(); + foreach (self::get_subscribers($item) as $email => $locale) { + $v = new View("item_deleted.html"); + $v->item = $item; + $v->subject = $item->is_album() ? + t("Album \"%title\" removed from \"%parent_title\"", + array("title" => $item->title, "parent_title" => $parent->title, "locale" => $locale)) : + ($item->is_photo() ? + t("Photo \"%title\" removed from \"%parent_title\"", + array("title" => $item->title, "parent_title" => $parent->title, "locale" => $locale)) + : t("Movie \"%title\" removed from \"%parent_title\"", + array("title" => $item->title, "parent_title" => $parent->title, + "locale" => $locale))); + self::_notify($email, $locale, $item, $v->render(), $v->subject); + } + } + + static function send_comment_published($comment) { + $item = $comment->item(); + foreach (self::get_subscribers($item) as $email => $locale) { + $v = new View("comment_published.html"); + $v->comment = $comment; + $v->subject = $item->is_album() ? + t("A new comment was published for album \"%title\"", + array("title" => $item->title, "locale" => $locale)) : + ($item->is_photo() ? + t("A new comment was published for photo \"%title\"", + array("title" => $item->title, "locale" => $locale)) + : t("A new comment was published for movie \"%title\"", + array("title" => $item->title, "locale" => $locale))); + self::_notify($email, $locale, $item, $v->render(), $v->subject); + } + } + + static function send_pending_notifications() { + foreach (db::build() + ->select(db::expr("DISTINCT `email`")) + ->from("pending_notifications") + ->execute() as $row) { + $email = $row->email; + $result = ORM::factory("pending_notification") + ->where("email", "=", $email) + ->find_all(); + if ($result->count() == 1) { + $pending = $result->current(); + Sendmail::factory() + ->to($email) + ->subject($pending->subject) + ->header("Mime-Version", "1.0") + ->header("Content-Type", "text/html; charset=UTF-8") + ->message($pending->text) + ->send(); + $pending->delete(); + } else { + $text = ""; + $locale = null; + foreach ($result as $pending) { + $text .= $pending->text; + $locale = $pending->locale; + $pending->delete(); + } + Sendmail::factory() + ->to($email) + ->subject(t("New activity for %site_name", + array("site_name" => item::root()->title, "locale" => $locale))) + ->header("Mime-Version", "1.0") + ->header("Content-Type", "text/html; charset=UTF-8") + ->message($text) + ->send(); + } + } + } + + private static function _notify($email, $locale, $item, $text, $subject) { + if (!batch::in_progress()) { + Sendmail::factory() + ->to($email) + ->subject($subject) + ->header("Mime-Version", "1.0") + ->header("Content-Type", "text/html; charset=UTF-8") + ->message($text) + ->send(); + } else { + $pending = ORM::factory("pending_notification"); + $pending->subject = $subject; + $pending->text = $text; + $pending->email = $email; + $pending->locale = $locale; + $pending->save(); + } + } +} diff --git a/modules/notification/helpers/notification_event.php b/modules/notification/helpers/notification_event.php new file mode 100644 index 0000000..264ec55 --- /dev/null +++ b/modules/notification/helpers/notification_event.php @@ -0,0 +1,149 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2013 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class notification_event_Core { + // The assumption is that the exception was logged at a lower level, but we + // don't want to screw up the processing that was generating the notification + // so we don't pass the exception up the call stack + static function item_created($item) { + try { + notification::send_item_add($item); + } catch (Exception $e) { + Kohana_Log::add("error", "@todo notification_event::item_created() failed"); + Kohana_Log::add("error", $e->getMessage() . "\n" . $e->getTraceAsString()); + } + } + + static function item_deleted($item) { + try { + notification::send_item_deleted($item); + + if (notification::is_watching($item)) { + notification::remove_watch($item); + } + } catch (Exception $e) { + Kohana_Log::add("error", "@todo notification_event::item_deleted() failed"); + Kohana_Log::add("error", $e->getMessage() . "\n" . $e->getTraceAsString()); + } + } + + static function user_deleted($user) { + db::build() + ->delete("subscriptions") + ->where("user_id", "=", $user->id) + ->execute(); + } + + static function identity_provider_changed($old_provider, $new_provider) { + db::build() + ->delete("subscriptions") + ->execute(); + } + + static function comment_created($comment) { + try { + if ($comment->state == "published") { + notification::send_comment_published($comment); + } + } catch (Exception $e) { + Kohana_Log::add("error", "@todo notification_event::comment_created() failed"); + Kohana_Log::add("error", $e->getMessage() . "\n" . $e->getTraceAsString()); + } + } + + static function comment_updated($original, $new) { + try { + if ($new->state == "published" && $original->state != "published") { + notification::send_comment_published($new); + } + } catch (Exception $e) { + Kohana_Log::add("error", "@todo notification_event::comment_updated() failed"); + Kohana_Log::add("error", $e->getMessage() . "\n" . $e->getTraceAsString()); + } + } + + static function user_before_delete($user) { + try { + db::build() + ->delete("subscriptions") + ->where("user_id", "=", $user->id) + ->execute(); + } catch (Exception $e) { + Kohana_Log::add("error", "@todo notification_event::user_before_delete() failed"); + Kohana_Log::add("error", $e->getMessage() . "\n" . $e->getTraceAsString()); + } + } + + static function batch_complete() { + try { + notification::send_pending_notifications(); + } catch (Exception $e) { + Kohana_Log::add("error", "@todo notification_event::batch_complete() failed"); + Kohana_Log::add("error", $e->getMessage() . "\n" . $e->getTraceAsString()); + } + } + + static function site_menu($menu, $theme) { + if (!identity::active_user()->guest) { + $item = $theme->item(); + + if ($item && $item->is_album() && access::can("view", $item)) { + $watching = notification::is_watching($item); + + $label = $watching ? t("Remove notifications") : t("Enable notifications"); + + $menu->get("options_menu") + ->append(Menu::factory("link") + ->id("watch") + ->label($label) + ->css_id("g-notify-link") + ->url(url::site("notification/watch/$item->id?csrf=" . access::csrf_token()))); + } + } + } + + static function show_user_profile($data) { + // Guests don't see comment listings + if (identity::active_user()->guest) { + return; + } + + // Only logged in users can see their comment listings + if (identity::active_user()->id != $data->user->id) { + return; + } + + $view = new View("user_profile_notification.html"); + $view->subscriptions = array(); + foreach(ORM::factory("subscription") + ->where("user_id", "=", $data->user->id) + ->find_all() as $subscription) { + $item = ORM::factory("item") + ->where("id", "=", $subscription->item_id) + ->find(); + if ($item->loaded()) { + $view->subscriptions[] = (object)array("id" => $subscription->id, "title" => $item->title, + "url" => $item->url()); + } + } + if (count($view->subscriptions) > 0) { + $data->content[] = (object)array("title" => t("Watching"), "view" => $view); + } + } +}
\ No newline at end of file diff --git a/modules/notification/helpers/notification_installer.php b/modules/notification/helpers/notification_installer.php new file mode 100644 index 0000000..f6b05c1 --- /dev/null +++ b/modules/notification/helpers/notification_installer.php @@ -0,0 +1,54 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2013 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class notification_installer { + static function install() { + $db = Database::instance(); + $db->query("CREATE TABLE IF NOT EXISTS {subscriptions} ( + `id` int(9) NOT NULL auto_increment, + `item_id` int(9) NOT NULL, + `user_id` int(9) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY (`item_id`, `user_id`), + UNIQUE KEY (`user_id`, `item_id`)) + DEFAULT CHARSET=utf8;"); + $db->query("CREATE TABLE IF NOT EXISTS {pending_notifications} ( + `id` int(9) NOT NULL auto_increment, + `locale` char(10) default NULL, + `email` varchar(128) NOT NULL, + `subject` varchar(255) NOT NULL, + `text` text, + PRIMARY KEY (`id`)) + DEFAULT CHARSET=utf8;"); + } + + static function upgrade($version) { + $db = Database::instance(); + if ($version == 1) { + $db->query("ALTER TABLE {pending_notifications} ADD COLUMN `locale` char(10) default NULL"); + module::set_version("notification", $version = 2); + } + } + + static function uninstall() { + $db = Database::instance(); + $db->query("DROP TABLE IF EXISTS {subscriptions};"); + $db->query("DROP TABLE IF EXISTS {pending_notifications};"); + } +} |
