]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Make replies to @#
authorEvan Prodromou <evan@prodromou.name>
Mon, 24 Nov 2008 03:49:52 +0000 (22:49 -0500)
committerEvan Prodromou <evan@prodromou.name>
Mon, 24 Nov 2008 03:49:52 +0000 (22:49 -0500)
darcs-hash:20081124034952-84dde-e059f0800780de879ffa922e5ce379682a4f275a.gz

classes/Profile_tag.php
lib/util.php

index 9943ebfa06195efe4b6eeabf5ae6ba9bad528ae3..dde19aea250a5e1dc724202cd50cefc802d15ce1 100644 (file)
@@ -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;
+       }
 }
index 07e0ea0535e75406edf8fe48c08d3180785348e1..c77f3028c3ecc607e05bd13829ee75617361c2e1 100644 (file)
@@ -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;
+                               }
+                       }
                }
        }
 }