diff options
| author | drewslater <drewslater@users.sourceforge.net> | 2005-10-12 20:11:32 +0000 |
|---|---|---|
| committer | drewslater <drewslater@users.sourceforge.net> | 2005-10-12 20:11:32 +0000 |
| commit | 6aaea44c126ba997101e7e738dbf6668e9e1e48c (patch) | |
| tree | 08ea843950b3bf033915248c4867ceabce4b83cf | |
| parent | 48c7ee37f318167687d06718de97b288fc74cbcd (diff) | |
| download | messages-6aaea44c126ba997101e7e738dbf6668e9e1e48c.tar.gz messages-6aaea44c126ba997101e7e738dbf6668e9e1e48c.tar.bz2 messages-6aaea44c126ba997101e7e738dbf6668e9e1e48c.zip | |
extensions for broadcast messaging
| -rw-r--r-- | admin/schema_inc.php | 13 | ||||
| -rw-r--r-- | broadcast.php | 97 | ||||
| -rw-r--r-- | message_box.php | 6 | ||||
| -rw-r--r-- | messu_lib.php | 204 | ||||
| -rw-r--r-- | templates/messu_broadcast.tpl | 11 |
5 files changed, 232 insertions, 99 deletions
diff --git a/admin/schema_inc.php b/admin/schema_inc.php index a487165..aabf2f5 100644 --- a/admin/schema_inc.php +++ b/admin/schema_inc.php @@ -16,8 +16,21 @@ $tables = array( is_read C(1), is_replied C(1), is_flagged C(1), + group_id I4 priority I4 +", + +'messu_system_message_map' => " + msg_id I4 + to_user_id I4 NOTNULL, + is_read C(1), + is_flagged C(1), + is_replied C(1), + priority I4, + is_hidden C(1) + CONSTRAINTS ', CONSTRAINT `tiki_messu_system_message_ref` FOREIGN KEY (`msg_id`) REFERENCES `".BIT_DB_PREFIX."messu_messages` (`msg_id`)' " + // CONSTRAINT ', CONSTRAINT tiki_messu_to_user_ref FOREIGN KEY (to_user_id) REFERENCES `".BIT_DB_PREFIX."users_users` (user_id) // , CONSTRAINT tiki_messu_from_user_ref FOREIGN KEY (from_user_id) REFERENCES `".BIT_DB_PREFIX."users_users` (user_id)' diff --git a/broadcast.php b/broadcast.php index 1818be8..e421095 100644 --- a/broadcast.php +++ b/broadcast.php @@ -3,7 +3,7 @@ * message package modules * * @author -* @version $Header: /cvsroot/bitweaver/_bit_messages/broadcast.php,v 1.4 2005/08/07 17:41:17 squareing Exp $ +* @version $Header: /cvsroot/bitweaver/_bit_messages/broadcast.php,v 1.5 2005/10/12 20:11:32 drewslater Exp $ * @package messages * @subpackage functions */ @@ -19,26 +19,15 @@ require_once( '../bit_setup_inc.php' ); include_once( MESSU_PKG_PATH.'messu_lib.php' ); -if (!$user) { +if (!$gBitUser->isRegistered()) { $gBitSmarty->assign('msg', tra("You are not logged in")); $gBitSystem->display( 'error.tpl' ); die; } -if ($feature_messages != 'y') { - $gBitSmarty->assign('msg', tra("This feature is disabled").": feature_messages"); - - $gBitSystem->display( 'error.tpl' ); - die; -} - -if ($bit_p_broadcast != 'y') { - $gBitSmarty->assign('msg', tra("Permission denied")); - - $gBitSystem->display( 'error.tpl' ); - die; -} +$gBitSystem->isPackageActive( 'messu', TRUE ); +$gBitSystem->verifyPermission( 'bit_p_broeadcast_messages' ); if (!isset($_REQUEST['to'])) $_REQUEST['to'] = ''; @@ -65,7 +54,7 @@ $gBitSmarty->assign('subject', $_REQUEST['subject']); $gBitSmarty->assign('body', $_REQUEST['body']); $gBitSmarty->assign('priority', $_REQUEST['priority']); -$gBitSystem->display( 'bitpackage:messu/messu_broadcast.tpl'); + $gBitSmarty->assign('sent', 0); @@ -73,75 +62,41 @@ if (isset($_REQUEST['reply']) || isset($_REQUEST['replyall'])) { $messulib->flag_message($user, $_REQUEST['msg_id'], 'is_replied', 'y'); } -if (isset($_REQUEST['group'])) { - if ($_REQUEST['group'] == 'all') { - $a_all_users = $userlib->get_users(0, -1, 'login_desc', ''); - - $all_users = array(); - - foreach ($a_all_users['data'] as $a_user) { - $all_users[] = $a_user['user']; - } - } else { - $all_users = $userlib->get_group_users($_REQUEST['group']); - } -} if (isset($_REQUEST['send'])) { - - $gBitSmarty->assign('sent', 1); + $gBitSmarty->assign('sent', 1); $message = ''; - + $errors = array(); // Validation: // must have a subject or body non-empty (or both) if (empty($_REQUEST['subject']) && empty($_REQUEST['body'])) { - $gBitSmarty->assign('message', tra('ERROR: Either the subject or body must be non-empty')); - - die; + $errors[] = tra("Subject or body must not be empty"); } - - // Remove invalid users from the to, cc and bcc fields - $users = array(); - - foreach ($all_users as $a_user) { - if (!empty($a_user)) { - if ($messulib->user_exists($a_user)) { - if ($messulib->getPreference('allowMsgs', 'y',$a_user )) { - $users[] = $a_user; - } else { - // TODO: needs translation as soon as there is a solution for strings with embedded variables - $message .= "User $a_user can not receive messages<br/>"; - } - } else { - $message .= tra("Invalid user"). "$a_user<br/>"; - } - } - } - - $users = array_unique($users); - - // Validation: either to, cc or bcc must have a valid user - if (count($users) > 0) { - $message .= tra("Message will be sent to: <ul><li>"). implode('<li> ', $users). "</ul><br/>"; - } else { - $message = tra('ERROR: No valid users to send the message'); - - $gBitSmarty->assign('message', $message); - die; + if (empty($_REQUEST['group'])) { + $errors[] = tra("You must select a group to broadcast this message to"); } - - // Insert the message in the inboxes of each user - foreach ($users as $a_user) { - $messulib->post_message($a_user, $user, $a_user, '', $_REQUEST['subject'], $_REQUEST['body'], $_REQUEST['priority']); + + if (!count($errors)) { + $messulib->post_system_message($_REQUEST['subject'], $_REQUEST['body'], $_REQUEST['group']); + $message = "Message successfully broadcast"; } - $gBitSmarty->assign('message', $message); + $gBitSmarty->assign('errors', $errors); } -$groups = $userlib->get_groups(0, -1, 'group_name_asc', ''); -$gBitSmarty->assign_by_ref('groups', $groups["data"]); +if ($gBitUser->isAdmin()) { + $pListHash = array(); + $groups = $gBitUser->getAllGroups($pListHash); +} else { + $gBitUser->loadGroups(); + $groups = &$gBitUser->mGroups; + +} + +$gBitSmarty->assign('groups', $groups["data"]); $section = 'user_messages'; +$gBitSystem->display( 'bitpackage:messu/messu_broadcast.tpl'); ?> diff --git a/message_box.php b/message_box.php index 1ead1a2..7f0b35b 100644 --- a/message_box.php +++ b/message_box.php @@ -2,8 +2,8 @@ /** * message package modules * -* @author -* @version $Header: /cvsroot/bitweaver/_bit_messages/message_box.php,v 1.4 2005/10/12 15:13:53 spiderr Exp $ +* @author +* @version $Header: /cvsroot/bitweaver/_bit_messages/message_box.php,v 1.5 2005/10/12 20:11:32 drewslater Exp $ * @package messages * @subpackage functions */ @@ -39,7 +39,7 @@ if (isset($_REQUEST["mark"]) && isset($_REQUEST["msg"])) { // Delete messages if the delete button was pressed if (isset($_REQUEST["delete"]) && isset($_REQUEST["msg"])) { - + foreach (array_keys($_REQUEST["msg"])as $msg) { $messulib->delete_message( $gBitUser->mUserId, $msg ); } diff --git a/messu_lib.php b/messu_lib.php index ab3e64b..c00aff1 100644 --- a/messu_lib.php +++ b/messu_lib.php @@ -3,7 +3,7 @@ * message package modules * * @author -* @version $Revision: 1.6 $ +* @version $Revision: 1.7 $ * @package messages */ @@ -19,7 +19,7 @@ class Messu extends BitBase { BitBase::BitBase(); } - function post_message( $pToLogin, $to, $cc, $bcc, $subject, $body, $priority) { + function post_message( $pToLogin, $to, $cc, $bcc, $subject, $body, $priority, $group_id = NULL) { global $gBitSmarty, $gBitUser, $gBitSystem; $userInfo = $gBitUser->getUserInfo( array('login' => $pToLogin) ); @@ -42,9 +42,9 @@ class Messu extends BitBase { $now = $gBitSystem->getUTCTime(); $query = "INSERT INTO `".BIT_DB_PREFIX."messu_messages` - (`to_user_id`, `from_user_id`, `msg_to`, `msg_cc`, `msg_bcc`, `subject`, `body`, `date`, `is_read`, `is_replied`, `is_flagged`, `priority`, `hash` ) - VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)"; - $this->mDb->query( $query, array( $userInfo['user_id'], $gBitUser->mUserId, $to, $cc, $bcc, $subject, $body,(int) $now,'n','n','n',(int) $priority,$hash ) ); + (`to_user_id`, `from_user_id`, `msg_to`, `msg_cc`, `msg_bcc`, `subject`, `body`, `date`, `is_read`, `is_replied`, `is_flagged`, `priority`, `hash`, `group_id` ) + VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + $this->mDb->query( $query, array( $userInfo['user_id'], $gBitUser->mUserId, $to, $cc, $bcc, $subject, $body,(int) $now,'n','n','n',(int) $priority,$hash, $group_id ) ); // Now check if the user should be notified by email $foo = parse_url($_SERVER["REQUEST_URI"]); @@ -77,8 +77,41 @@ class Messu extends BitBase { return( count( $this->mErrors ) == 0 ); } - + + function post_system_message($subject, $body, $group_id) { + return $this->post_message(ROOT_USER_ID, ROOT_USER_ID,NULL,NULL,$subject, $body, 1, $group_id); + } + + function list_system_messages() { + $sql = "SELECT mm.* FROM `".BIT_DB_PREFIX."messu_messages` mm WHERE mm.`from_user_id` = ?"; + $rs = $this->mDb->query($sql, array(ROOT_USER_ID)); + + return $rs->getRows(); + } + + function remove_system_message($pMessageID = NULL) { + if ($pMessageID) { + $sql = "DELETE FROM `".BIT_DB_PREFIX."messu_system_message_map` WHERE msg_id = ?"; + $rs = $this->mDb->query($sql, array($pMessageID)); + + $sql = "DELETE FROM `".BIT_DB_PREFIX."messu_messages` WHERE msg_id = ?"; + $rs = $this->mDb->query($sql, array($pMessageID)); + } + + } + + function is_system_message($pMessageID = NULL) { + $ret = FALSE; + if ($pMessageID) { + $query = "SELECT COUNT(msg_id) FROM `".BIT_DB_PREFIX."messu_messages` WHERE `to_user_id` = ? AND `msg_id` = ?"; + $ret = $this->mDb->getOne($query, array(ROOT_USER_ID, $pMessageID)); + } + return $ret; + } + function list_messages( $pUserId, $offset, $maxRecords, $sort_mode, $find, $flag = '', $flagval = '', $prio = '' ) { + + // Load all normal messages (user to user) $bindvars = array($pUserId); $mid=""; if ($prio) { @@ -104,7 +137,7 @@ class Messu extends BitBase { $query_cant = "select count(*) from `".BIT_DB_PREFIX."messu_messages` where `to_user_id`=? $mid"; $result = $this->mDb->query($query,$bindvars,$maxRecords,$offset); $cant = $this->mDb->getOne($query_cant,$bindvars); - $ret = array(); + $normalMessages = array(); while ($res = $result->fetchRow()) { $res["len"] = strlen($res["body"]); @@ -112,27 +145,144 @@ class Messu extends BitBase { if (empty($res['subject'])) $res['subject'] = tra('NONE'); - $ret[] = $res; + $normalMessages[] = $res; + } + + // Load system messages (i.e. broadcast messages) + $bindvars = array($pUserId, ROOT_USER_ID, $pUserId); + $mid=""; + if ($prio) { + $mid = " and mm.priority=? "; + $bindvars[] = $prio; } + if ($flag) { + // Process the flags + $mid.= " and mm.`$flag`=? "; + $bindvars[] = $flagval; + } + if ($find) { + $findesc = '%'.strtoupper( $find ).'%'; + $mid.= " and (UPPER(mm.`subject`) like ? or UPPER(mm.`body`) like ?)"; + $bindvars[] = $findesc; + $bindvars[] = $findesc; + } + + $query = "SELECT uu.`login` AS `user`, uu.`real_name`, uu.`user_id`, mm.`msg_id` as `msg_id_foo`, mm.`msg_to`, mm.`msg_cc`, mm.`msg_bcc`, mm.`subject`, mm.`body`, mm.`hash`, mm.`date`, msm.* + FROM `".BIT_DB_PREFIX."messu_messages` mm + INNER JOIN `".BIT_DB_PREFIX."users_users` uu ON (mm.`from_user_id` = uu.`user_id`) + LEFT OUTER JOIN `".BIT_DB_PREFIX."messu_system_message_map` msm ON (mm.`msg_id` = msm.`msg_id` AND msm.`to_user_id` = ?) + WHERE mm.`to_user_id` = ? AND mm.`group_id` IN (SELECT `group_id` FROM `".BIT_DB_PREFIX."users_groups_map` WHERE `user_id` = ?) $mid + ORDER BY ".$this->mDb->convert_sortmode($sort_mode).",".$this->mDb->convert_sortmode("mm.msg_id_desc"); + + $query_cant = "SELECT COUNT(mm.*) + FROM `".BIT_DB_PREFIX."messu_messages` mm + LEFT OUTER JOIN `".BIT_DB_PREFIX."messu_system_message_map` msm ON (mm.`msg_id` = msm.`msg_id` AND msm.`to_user_id` = ?) + WHERE mm.`to_user_id` = ? AND mm.`group_id` IN (SELECT `group_id` FROM `".BIT_DB_PREFIX."users_groups_map` WHERE `user_id` = ?) $mid"; + $result2 = $this->mDb->query($query, $bindvars); + $cant2 = $this->mDb->getOne($query_cant, $bindvars); + $systemMessages = array(); + while ($res = $result2->fetchRow()) { + $res['len'] = strlen($res['body']); + $res['is_broadcast_message'] = TRUE; + if (empty($res['subject'])) { + $res['subject'] = tra('NONE'); + } + $res['msg_id'] = $res['msg_id_foo']; // Due to the left outer join this madness is neccessary + unset($res['msg_id_foo']); + if ($res['is_hidden'] != 'y') { + $systemMessages[] = $res; + } + } + + // Now we merge normalMessages and systemMessages and put them in order + $ret = array(); + $normalMessageCount = count($normalMessages); + $systemMessageCount = count($systemMessages); + $normalMsg = $systemMsg = NULL; + if (strpos($sort_mode, '_asc') !== FALSE) { + $sortType = '_asc'; + $sortKey = substr($sort_mode, 0, strlen($sort_mode)-4); + } else { + $sortType = '_desc'; + $sortKey = substr($sort_mode, 0, strlen($sort_mode)-5); + } + + while ($normalMessageCount > 0 || $systemMessageCount > 0) { + if (!$normalMsg && $normalMessageCount > 0) { + $normalMsg = array_shift($normalMessages); + } + if (!$systemMsg && $systemMessageCount > 0) { + $systemMsg = array_shift($systemMessages); + } + if ($normalMessageCount == 0) { + $ret[] = $systemMsg; + $systemMsg = NULL; + $systemMessageCount--; + } elseif ($systemMessageCount == 0) { + $ret[] = $normalMsg; + $normalMsg = NULL; + $normalMessageCount--; + }elseif ($sortType == '_asc') { + if ($normalMsg[$sortKey] < $systemMsg[$sortKey]) { + $ret[] = $normalMsg; + $normalMsg = NULL; + $normalMessageCount--; + } else { + $ret[] = $systemMsg; + $systemMsg = NULL; + $systemMessageCount--; + } + } else { + if ($normalMsg[$sortKey] > $systemMsg[$sortKey]) { + $ret[] = $normalMsg; + $normalMsg = NULL; + $normalMessageCount--; + } else { + $ret[] = $systemMsg; + $systemMsg = NULL; + $systemMessageCount--; + } + } + } + $retval = array(); $retval["data"] = $ret; - $retval["cant"] = $cant; + $retval["cant"] = $cant + $cant2; return $retval; } function flag_message( $pUserId, $msg_id, $flag, $val ) { if (!$msg_id) return false; - $query = "update `".BIT_DB_PREFIX."messu_messages` set `$flag`=? where `to_user_id`=? and `msg_id`=?"; - $this->mDb->query($query,array($val,$pUserId,(int)$msg_id)); + if ($this->is_system_message($msg_id)) { + $query = "SELECT COUNT(*) FROM `".BIT_DB_PREFIX."messu_system_message_map` WHERE `to_user_id` = ? AND `msg_id` = ?"; + $rowExists = $this->mDb->getOne($query, array($pUserId, $msg_id)); + if ($rowExists) { + $query = "UPDATE `".BIT_DB_PREFIX."messu_system_message_map` SET `$flag`=? WHERE `to_user_id` = ? AND `msg_id` = ?"; + $this->mDb->query($query, array($val, $pUserId, (int)$msg_id)); + } else { + $query = "INSERT INTO `".BIT_DB_PREFIX."messu_system_message_map` (`msg_id`, `to_user_id`, `$flag`) VALUES (?,?,?)"; + $this->mDb->query($query, array((int)$msg_id, $pUserId, $val)); + } + + } else { + $query = "update `".BIT_DB_PREFIX."messu_messages` set `$flag`=? where `to_user_id`=? and `msg_id`=?"; + $this->mDb->query($query,array($val,$pUserId,(int)$msg_id)); + } } function delete_message($pUserId, $msg_id) { if (!$msg_id) return false; - $query = "delete from `".BIT_DB_PREFIX."messu_messages` where `to_user_id`=? and `msg_id`=?"; - $this->mDb->query($query,array($pUserId,(int)$msg_id)); + if ($this->is_system_message($msg_id)) { + // We just mark this user's messu_system_message_map row is_hidden = 'y' + $query = "UPDATE `".BIT_DB_PREFIX."messu_system_message_map` SET `is_hidden` = 'y' WHERE `to_user_id` = ? AND `msg_id` = ?"; + $this->mDb->query($query, array($pUserId, $msg_id)); + } else { + $query = "delete from `".BIT_DB_PREFIX."messu_messages` where `to_user_id`=? and `msg_id`=?"; + $this->mDb->query($query,array($pUserId,(int)$msg_id)); + } } function get_next_message($pUserId, $msg_id, $sort_mode, $find, $flag, $flagval, $prio) { @@ -200,13 +350,26 @@ class Messu extends BitBase { } function get_message( $pUserId, $msg_id ) { - $bindvars = array( $pUserId, (int)$msg_id ); - $query = "select * from `".BIT_DB_PREFIX."messu_messages` WHERE `to_user_id`=? and `msg_id`=?"; - $result = $this->mDb->query($query,$bindvars); - $res = $result->fetchRow(); + if (!$this->is_system_message($msg_id)) { + $bindvars = array( $pUserId, (int)$msg_id ); + $query = "select * from `".BIT_DB_PREFIX."messu_messages` WHERE `to_user_id`=? and `msg_id`=?"; + $result = $this->mDb->query($query,$bindvars); + $res = $result->fetchRow(); + } else { + $bindvars = array($pUserId, (int)$msg_id); + $query = "SELECT msm.*, ug.`group_name`, mm.`from_user_id`, mm.`msg_id` as `msg_id_foo`, mm.`msg_to`, mm.`msg_cc`, mm.`msg_bcc`, mm.`subject`, mm.`body`, mm.`hash`, mm.`date` + FROM `".BIT_DB_PREFIX."messu_messages` mm + INNER JOIN `".BIT_DB_PREFIX."users_groups` ug ON (ug.`group_id` = mm.`group_id`) + LEFT OUTER JOIN `".BIT_DB_PREFIX."messu_system_message_map` msm ON (mm.`msg_id` = msm.`msg_id` AND msm.`to_user_id` = ?) + WHERE mm.`msg_id` = ?"; + $result = $this->mDb->query($query, $bindvars); + $res = $result->fetchRow(); + $res['is_broadcast_message'] = TRUE; + } + $content = new LibertyContent(); $res['parsed'] = $content->parseData( $res['body'], PLUGIN_GUID_TIKIWIKI ); - + if (empty($res['subject'])) $res['subject'] = tra('NONE'); @@ -215,7 +378,10 @@ class Messu extends BitBase { /*shared*/ function user_unread_messages( $pUserId ) { - return $this->mDb->getOne( "select count( * ) from `".BIT_DB_PREFIX."messu_messages` where `to_user_id`=? and `is_read`=?",array( $pUserId,'n' ) ); + $normalCount = $this->mDb->getOne( "select count( * ) from `".BIT_DB_PREFIX."messu_messages` where `to_user_id`=? and `is_read`=?",array( $pUserId,'n' ) ); + $broadcastCount = $this->mDb->getOne("SELECT COUNT(mm.`msg_id`) FROM `".BIT_DB_PREFIX."messu_messages` mm INNER JOIN `".BIT_DB_PREFIX."messu_system_message_map` msm ON (mm.`msg_id` = msm.`msg_id` AND msm.`is_read` <> 'y' AND `is_hidden` <> 'y' AND msm.`to_user_id`= ?) WHERE mm.`to_user_id` = ?", array($pUserId, ROOT_USER_ID)); + $broadcastCount2 = $this->mDb->getOne("SELECT COUNT(mm.`msg_id`) FROM `".BIT_DB_PREFIX."messu_messages` mm WHERE mm.`to_user_id` = ? AND NOT EXISTS ( SELECT msm.`msg_id` FROM `".BIT_DB_PREFIX."messu_system_message_map` msm WHERE msm.`msg_id` = mm.`msg_id` AND msm.`to_user_id` = ?)", array(ROOT_USER_ID, $pUserId)); + return $normalCount + $broadcastCount + $broadcastCount2; } } diff --git a/templates/messu_broadcast.tpl b/templates/messu_broadcast.tpl index 7068d82..2a584fc 100644 --- a/templates/messu_broadcast.tpl +++ b/templates/messu_broadcast.tpl @@ -5,10 +5,9 @@ </div> {include file="bitpackage:users/my_bitweaver_bar.tpl"} -{include file="bitpackage:messu/messu_nav.tpl"} <div class="body"> - +{formfeedback error=$errors success=$message} {if $sent} {$message} {else} @@ -18,11 +17,11 @@ <td><label for="broadcast-group">{tr}Group{/tr}:</label></td> <td> <select name="group" id="broadcast-group"> - {if $bit_p_broadcast_all eq 'y'} - <option value="all" selected="selected">{tr}All users{/tr}</option> - {/if} + {section name=ix loop=$groups} - <option value="{$groups[ix].group_name|escape}">{$groups[ix].group_name}</option> + {if $groups[ix].group_id && $groups[ix].group_name} + <option value="{$groups[ix].group_id}">{$groups[ix].group_name}</option> + {/if} {/section} </select> </td> |
