diff options
-rw-r--r-- | classes/Profile_tag.php | 15 | ||||
-rw-r--r-- | lib/util.php | 38 |
2 files changed, 53 insertions, 0 deletions
diff --git a/classes/Profile_tag.php b/classes/Profile_tag.php index 9943ebfa0..dde19aea2 100644 --- a/classes/Profile_tag.php +++ b/classes/Profile_tag.php @@ -83,4 +83,19 @@ class Profile_tag extends Memcached_DataObject return true; } + + # Return profiles with a given tag + static function getTagged($tagger, $tag) { + $profile = new Profile(); + $profile->query('SELECT profile.* ' . + 'FROM profile JOIN profile_tag ' . + 'ON profile.id = profile_tag.tagged ' . + 'WHERE profile_tag.tagger = ' . $tagger . ' ' . + 'AND profile_tag.tag = "' . $tag . '" '); + $tagged = array(); + while ($profile->fetch()) { + $tagged[] = clone($profile); + } + return $tagged; + } } diff --git a/lib/util.php b/lib/util.php index 07e0ea053..c77f3028c 100644 --- a/lib/util.php +++ b/lib/util.php @@ -710,6 +710,7 @@ function common_render_content($text, $notice) { $id = $notice->profile_id; $r = preg_replace('/(^|\s+)@([A-Za-z0-9]{1,64})/e', "'\\1@'.common_at_link($id, '\\2')", $r); $r = preg_replace('/^T ([A-Z0-9]{1,64}) /e', "'T '.common_at_link($id, '\\1').' '", $r); + $r = preg_replace('/(^|\s+)@#([A-Za-z0-9]{1,64})/e', "'\\1@'.common_at_hash_link($id, '\\2')", $r); return $r; } @@ -860,6 +861,22 @@ function common_at_link($sender_id, $nickname) { } } +function common_at_hash_link($sender_id, $tag) { + $user = User::staticGet($sender_id); + if (!$user) { + return $tag; + } + $tagged = Profile_tag::getTagged($user->id, common_canonical_tag($tag)); + if ($tagged) { + $url = common_local_url('subscriptions', + array('nickname' => $user->nickname, + 'tag' => $tag)); + return '<a href="'.htmlspecialchars($url).'" class="atlink">'.$tag.'</a>'; + } else { + return $tag; + } +} + function common_relative_profile($sender, $nickname, $dt=NULL) { # Try to find profiles this profile is subscribed to that have this nickname $recipient = new Profile(); @@ -1274,6 +1291,8 @@ function common_save_replies($notice) { $sender = Profile::staticGet($notice->profile_id); # store replied only for first @ (what user/notice what the reply directed, # we assume first @ is it) + $replied = array(); + for ($i=0; $i<count($names); $i++) { $nickname = $names[$i]; $recipient = common_relative_profile($sender, $nickname, $notice->created); @@ -1298,6 +1317,25 @@ function common_save_replies($notice) { common_log(LOG_ERR, 'DB error inserting reply: ' . $last_error->message); common_server_error(sprintf(_('DB error inserting reply: %s'), $last_error->message)); return; + } else { + $replied[$recipient->id] = 1; + } + } + # Hash format replies, too + $cnt = preg_match_all('/(?:^|\s)@#([a-z0-9]{1,64})/', $notice->content, $match); + foreach ($match as $tag) { + $tagged = Profile_tag::getTagged($sender->id, $tag); + foreach ($tagged as $t) { + if (!$replied[$t->id]) { + $reply = new Reply(); + $reply->notice_id = $notice->id; + $reply->profile_id = $t->id; + $id = $reply->insert(); + if (!$id) { + common_log_db_error($reply, 'INSERT', __FILE__); + return; + } + } } } } |