diff options
Diffstat (limited to 'classes/Notice.php')
-rw-r--r-- | classes/Notice.php | 179 |
1 files changed, 107 insertions, 72 deletions
diff --git a/classes/Notice.php b/classes/Notice.php index 4a06c9258..907239b08 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -34,22 +34,23 @@ class Notice extends Memcached_DataObject ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ - public $__table = 'notice'; // table name - public $id; // int(4) primary_key not_null - public $profile_id; // int(4) not_null + public $__table = 'notice'; // table name + public $id; // int(4) primary_key not_null + public $profile_id; // int(4) not_null public $uri; // varchar(255) unique_key public $content; // varchar(140) - public $rendered; // text() + public $rendered; // text() public $url; // varchar(255) - public $created; // datetime() not_null - public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP - public $reply_to; // int(4) - public $is_local; // tinyint(1) - public $source; // varchar(32) + public $created; // datetime() not_null + public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + public $reply_to; // int(4) + public $is_local; // tinyint(1) + public $source; // varchar(32) /* Static get */ - function staticGet($k,$v=null) - { return Memcached_DataObject::staticGet('Notice',$k,$v); } + function staticGet($k,$v=NULL) { + return Memcached_DataObject::staticGet('Notice',$k,$v); + } /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE @@ -63,8 +64,24 @@ class Notice extends Memcached_DataObject { $this->blowCaches(true); $this->blowFavesCache(true); - $this->blowInboxes(); - return parent::delete(); + $this->blowSubsCache(true); + + $this->query('BEGIN'); + $related = array('Reply', + 'Fave', + 'Notice_tag', + 'Group_inbox', + 'Queue_item'); + if (common_config('inboxes', 'enabled')) { + $related[] = 'Notice_inbox'; + } + foreach ($related as $cls) { + $inst = new $cls(); + $inst->notice_id = $this->id; + $inst->delete(); + } + $result = parent::delete(); + $this->query('COMMIT'); } function saveTags() @@ -75,26 +92,31 @@ class Notice extends Memcached_DataObject return true; } - /* elide characters we don't want in the tag */ - $match[1] = str_replace(array('-', '_', '.'), '', $match[1]); - /* Add them to the database */ foreach(array_unique($match[1]) as $hashtag) { - $tag = DB_DataObject::factory('Notice_tag'); - $tag->notice_id = $this->id; - $tag->tag = $hashtag; - $tag->created = $this->created; - $id = $tag->insert(); - if (!$id) { - $last_error = PEAR::getStaticProperty('DB_DataObject','lastError'); - common_log(LOG_ERR, 'DB error inserting hashtag: ' . $last_error->message); - common_server_error(sprintf(_('DB error inserting hashtag: %s'), $last_error->message)); - return; - } + /* elide characters we don't want in the tag */ + $this->saveTag($hashtag); } return true; } + function saveTag($hashtag) + { + $hashtag = common_canonical_tag($hashtag); + + $tag = new Notice_tag(); + $tag->notice_id = $this->id; + $tag->tag = $hashtag; + $tag->created = $this->created; + $id = $tag->insert(); + + if (!$id) { + throw new ServerException(sprintf(_('DB error inserting hashtag: %s'), + $last_error->message)); + return; + } + } + static function saveNew($profile_id, $content, $source=null, $is_local=1, $reply_to=null, $uri=null) { $profile = Profile::staticGet($profile_id); @@ -120,10 +142,12 @@ class Notice extends Memcached_DataObject $notice->profile_id = $profile_id; $blacklist = common_config('public', 'blacklist'); + $autosource = common_config('public', 'autosource'); # Blacklisted are non-false, but not 1, either - if ($blacklist && in_array($profile_id, $blacklist)) { + if (($blacklist && in_array($profile_id, $blacklist)) || + ($source && $autosource && in_array($source, $autosource))) { $notice->is_local = -1; } else { $notice->is_local = $is_local; @@ -138,32 +162,37 @@ class Notice extends Memcached_DataObject $notice->source = $source; $notice->uri = $uri; - $id = $notice->insert(); - - if (!$id) { - common_log_db_error($notice, 'INSERT', __FILE__); - return _('Problem saving notice.'); - } + if (Event::handle('StartNoticeSave', array(&$notice))) { - # Update the URI after the notice is in the database - if (!$uri) { - $orig = clone($notice); - $notice->uri = common_notice_uri($notice); + $id = $notice->insert(); - if (!$notice->update($orig)) { - common_log_db_error($notice, 'UPDATE', __FILE__); + if (!$id) { + common_log_db_error($notice, 'INSERT', __FILE__); return _('Problem saving notice.'); } - } - # XXX: do we need to change this for remote users? + # Update the URI after the notice is in the database + if (!$uri) { + $orig = clone($notice); + $notice->uri = common_notice_uri($notice); + + if (!$notice->update($orig)) { + common_log_db_error($notice, 'UPDATE', __FILE__); + return _('Problem saving notice.'); + } + } + + # XXX: do we need to change this for remote users? - $notice->saveReplies(); - $notice->saveTags(); - $notice->saveGroups(); + $notice->saveReplies(); + $notice->saveTags(); + $notice->saveGroups(); - $notice->addToInboxes(); - $notice->query('COMMIT'); + $notice->addToInboxes(); + $notice->query('COMMIT'); + + Event::handle('EndNoticeSave', array($notice)); + } # Clear the cache for subscribed users, so they'll update at next request # XXX: someone clever could prepend instead of clearing the cache @@ -257,8 +286,10 @@ class Notice extends Memcached_DataObject if ($cache) { $user = new User(); + $UT = common_config('db','type')=='pgsql'?'"user"':'user'; $user->query('SELECT id ' . - 'FROM user JOIN subscription ON user.id = subscription.subscriber ' . + + "FROM $UT JOIN subscription ON $UT.id = subscription.subscriber " . 'WHERE subscription.subscribed = ' . $this->profile_id); while ($user->fetch()) { @@ -552,38 +583,23 @@ class Notice extends Memcached_DataObject if ($enabled === true || $enabled === 'transitional') { $inbox = new Notice_inbox(); + $UT = common_config('db','type')=='pgsql'?'"user"':'user'; $qry = 'INSERT INTO notice_inbox (user_id, notice_id, created) ' . - 'SELECT user.id, ' . $this->id . ', "' . $this->created . '" ' . - 'FROM user JOIN subscription ON user.id = subscription.subscriber ' . + "SELECT $UT.id, " . $this->id . ", '" . $this->created . "' " . + "FROM $UT JOIN subscription ON $UT.id = subscription.subscriber " . 'WHERE subscription.subscribed = ' . $this->profile_id . ' ' . 'AND NOT EXISTS (SELECT user_id, notice_id ' . 'FROM notice_inbox ' . - 'WHERE user_id = user.id ' . + "WHERE user_id = $UT.id " . 'AND notice_id = ' . $this->id . ' )'; if ($enabled === 'transitional') { - $qry .= ' AND user.inboxed = 1'; + $qry .= " AND $UT.inboxed = 1"; } $inbox->query($qry); } return; } - # Delete from inboxes if we're deleted. - - function blowInboxes() - { - - $enabled = common_config('inboxes', 'enabled'); - - if ($enabled === true || $enabled === 'transitional') { - $inbox = new Notice_inbox(); - $inbox->notice_id = $this->id; - $inbox->delete(); - } - - return; - } - function saveGroups() { $enabled = common_config('inboxes', 'enabled'); @@ -611,6 +627,15 @@ class Notice extends Memcached_DataObject continue; } + // we automatically add a tag for every group name, too + + $tag = Notice_tag::pkeyGet(array('tag' => common_canonical_tag($nickname), + 'notice_id' => $this->id)); + + if (is_null($tag)) { + $this->saveTag($nickname); + } + if ($profile->isMember($group)) { $gi = new Group_inbox(); @@ -628,16 +653,17 @@ class Notice extends Memcached_DataObject // FIXME: do this in an offline daemon $inbox = new Notice_inbox(); + $UT = common_config('db','type')=='pgsql'?'"user"':'user'; $qry = 'INSERT INTO notice_inbox (user_id, notice_id, created, source) ' . - 'SELECT user.id, ' . $this->id . ', "' . $this->created . '", 2 ' . - 'FROM user JOIN group_member ON user.id = group_member.profile_id ' . + "SELECT $UT.id, " . $this->id . ", '" . $this->created . "', 2 " . + "FROM $UT JOIN group_member ON $UT.id = group_member.profile_id " . 'WHERE group_member.group_id = ' . $group->id . ' ' . 'AND NOT EXISTS (SELECT user_id, notice_id ' . 'FROM notice_inbox ' . - 'WHERE user_id = user.id ' . + "WHERE user_id = $UT.id " . 'AND notice_id = ' . $this->id . ' )'; if ($enabled === 'transitional') { - $qry .= ' AND user.inboxed = 1'; + $qry .= " AND $UT.inboxed = 1"; } $result = $inbox->query($qry); } @@ -721,10 +747,19 @@ class Notice extends Memcached_DataObject if (!$id) { common_log_db_error($reply, 'INSERT', __FILE__); return; + } else { + $replied[$recipient->id] = 1; } } } } } + + foreach (array_keys($replied) as $recipient) { + $user = User::staticGet('id', $recipient); + if ($user) { + mail_notify_attn($user, $this); + } + } } } |