aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--phpBB/develop/create_schema_files.php41
-rw-r--r--phpBB/includes/notifications/method/base.php32
-rw-r--r--phpBB/includes/notifications/method/interface.php1
-rw-r--r--phpBB/includes/notifications/service.php38
-rw-r--r--phpBB/install/database_update.php47
5 files changed, 140 insertions, 19 deletions
diff --git a/phpBB/develop/create_schema_files.php b/phpBB/develop/create_schema_files.php
index 6eb4a80199..88aa9b70dd 100644
--- a/phpBB/develop/create_schema_files.php
+++ b/phpBB/develop/create_schema_files.php
@@ -1295,6 +1295,28 @@ function get_schema_struct()
),
);
+ $schema_data['phpbb_notifications'] = array(
+ 'COLUMNS' => array(
+ 'item_type' => array('UINT', 0),
+ 'item_id' => array('UINT', 0),
+ 'user_id' => array('UINT', 0),
+ 'unread' => array('BOOL', 1),
+ 'time' => array('TIMESTAMP', 1),
+ 'data' => array('TEXT_UNI', ''),
+ ),
+ 'PRIMARY_KEY' => array(
+ 'item_type',
+ 'item_id',
+ 'user_id',
+ ),
+ 'KEYS' => array(
+ 'item_type' => array('INDEX', 'item_type'),
+ 'item_id' => array('INDEX', 'item_id'),
+ 'user_id' => array('INDEX', 'user_id'),
+ 'time' => array('INDEX', 'time'),
+ ),
+ );
+
$schema_data['phpbb_poll_options'] = array(
'COLUMNS' => array(
'poll_option_id' => array('TINT:4', 0),
@@ -1751,6 +1773,25 @@ function get_schema_struct()
),
);
+ $schema_data['phpbb_user_notifications'] = array(
+ 'COLUMNS' => array(
+ 'item_type' => array('UINT', 0),
+ 'item_id' => array('UINT', 0),
+ 'user_id' => array('UINT', 0),
+ 'method' => array('VCHAR:25', ''),
+ ),
+ 'PRIMARY_KEY' => array(
+ 'item_type',
+ 'item_id',
+ 'user_id',
+ 'method',
+ ),
+ 'KEYS' => array(
+ 'it' => array('INDEX', 'item_type'),
+ 'uid' => array('INDEX', 'user_id'),
+ ),
+ );
+
$schema_data['phpbb_user_group'] = array(
'COLUMNS' => array(
'group_id' => array('UINT', 0),
diff --git a/phpBB/includes/notifications/method/base.php b/phpBB/includes/notifications/method/base.php
index 1c223df045..dbf851a059 100644
--- a/phpBB/includes/notifications/method/base.php
+++ b/phpBB/includes/notifications/method/base.php
@@ -27,6 +27,13 @@ abstract class phpbb_notifications_method_base implements phpbb_notifications_me
protected $db;
protected $user;
+ /**
+ * Queue of messages to be sent
+ *
+ * @var array
+ */
+ protected $queue = array();
+
public function __construct(ContainerBuilder $phpbb_container, $data = array())
{
// phpBB Container
@@ -36,4 +43,29 @@ abstract class phpbb_notifications_method_base implements phpbb_notifications_me
$this->db = $phpbb_container->get('dbal.conn');
$this->user = $phpbb_container->get('user');
}
+
+ /**
+ * Add a notification to the queue
+ *
+ * @param phpbb_notifications_type_interface $notification
+ */
+ public function add_to_queue(phpbb_notifications_type_interface $notification)
+ {
+ $this->queue[] = $notification;
+ }
+
+ /**
+ * Basic run queue function.
+ * Child methods should override this function if there are more efficient methods to mass-notification
+ */
+ public function run_queue()
+ {
+ foreach ($this->queue as $notification)
+ {
+ $this->notify($notification);
+ }
+
+ // Empty queue
+ $this->queue = array();
+ }
}
diff --git a/phpBB/includes/notifications/method/interface.php b/phpBB/includes/notifications/method/interface.php
index 2d8a8b605e..f18d005b8b 100644
--- a/phpBB/includes/notifications/method/interface.php
+++ b/phpBB/includes/notifications/method/interface.php
@@ -21,4 +21,5 @@ if (!defined('IN_PHPBB'))
*/
interface phpbb_notifications_method_interface
{
+ public function notify($notification);
}
diff --git a/phpBB/includes/notifications/service.php b/phpBB/includes/notifications/service.php
index 059c2b420d..32211b26cf 100644
--- a/phpBB/includes/notifications/service.php
+++ b/phpBB/includes/notifications/service.php
@@ -33,25 +33,6 @@ class phpbb_notifications_service
*/
protected $users;
- /**
- * Desired notifications
- * unique by (type, type_id, user_id, method)
- * if multiple methods are desired, multiple rows will exist.
- *
- * method of "none" will over-ride any other options
- *
- * type
- * type_id
- * user_id
- * method
- * none (will never receive notifications)
- * standard (listed in notifications window
- * popup?
- * email
- * jabber
- * sms?
- */
-
public function __construct(ContainerBuilder $phpbb_container)
{
$this->phpbb_container = $phpbb_container;
@@ -140,6 +121,25 @@ class phpbb_notifications_service
$notification_objects = $notification_methods = array();
$new_rows = array();
+ /**
+ * Desired notifications
+ * unique by (type, type_id, user_id, method)
+ * if multiple methods are desired, multiple rows will exist.
+ *
+ * method of "none" will over-ride any other options
+ *
+ * item_type
+ * item_id
+ * user_id
+ * method
+ * none (will never receive notifications)
+ * standard (listed in notifications window
+ * popup?
+ * email
+ * jabber
+ * sms?
+ */
+
// find out which users want to receive this type of notification
$sql = 'SELECT user_id FROM ' . USERS_TABLE . '
WHERE ' . $this->db->sql_in_set('user_id', array(2));
diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php
index 0b470ced26..99e40ddee9 100644
--- a/phpBB/install/database_update.php
+++ b/phpBB/install/database_update.php
@@ -106,6 +106,14 @@ if (!defined('EXT_TABLE'))
{
define('EXT_TABLE', $table_prefix . 'ext');
}
+if (!defined('NOTIFICATIONS_TABLE'))
+{
+ define('NOTIFICATIONS_TABLE', $table_prefix . 'notifications');
+}
+if (!defined('USER_NOTIFICATIONS_TABLE'))
+{
+ define('USER_NOTIFICATIONS_TABLE', $table_prefix . 'user_notifications');
+}
$phpbb_class_loader_ext = new phpbb_class_loader('phpbb_ext_', $phpbb_root_path . 'ext/', ".$phpEx");
$phpbb_class_loader_ext->register();
@@ -1097,6 +1105,45 @@ function database_update_info()
'ext_name' => array('UNIQUE', 'ext_name'),
),
),
+ NOTIFICATIONS_TABLE => array(
+ 'COLUMNS' => array(
+ 'item_type' => array('UINT', 0),
+ 'item_id' => array('UINT', 0),
+ 'user_id' => array('UINT', 0),
+ 'unread' => array('BOOL', 1),
+ 'time' => array('TIMESTAMP', 1),
+ 'data' => array('TEXT_UNI', ''),
+ ),
+ 'PRIMARY_KEY' => array(
+ 'item_type',
+ 'item_id',
+ 'user_id',
+ ),
+ 'KEYS' => array(
+ 'item_type' => array('INDEX', 'item_type'),
+ 'item_id' => array('INDEX', 'item_id'),
+ 'user_id' => array('INDEX', 'user_id'),
+ 'time' => array('INDEX', 'time'),
+ ),
+ ),
+ USER_NOTIFICATIONS_TABLE => array(
+ 'COLUMNS' => array(
+ 'item_type' => array('UINT', 0),
+ 'item_id' => array('UINT', 0),
+ 'user_id' => array('UINT', 0),
+ 'method' => array('VCHAR:25', ''),
+ ),
+ 'PRIMARY_KEY' => array(
+ 'item_type',
+ 'item_id',
+ 'user_id',
+ 'method',
+ ),
+ 'KEYS' => array(
+ 'it' => array('INDEX', 'item_type'),
+ 'uid' => array('INDEX', 'user_id'),
+ ),
+ ),
),
'add_columns' => array(
GROUPS_TABLE => array(