summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--classes/Profile_tag.php15
-rw-r--r--lib/util.php38
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;
+ }
+ }
}
}
}