]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/Event/RSVP.php
Update translator documentation.
[quix0rs-gnu-social.git] / plugins / Event / RSVP.php
index 36c6b32ec748a8b84b4fd6bceeb9e462d4eddc5f..1f47958e9a266b4e07fdd3828c614b6f0d46f813 100644 (file)
@@ -42,7 +42,6 @@ if (!defined('STATUSNET')) {
  *
  * @see      Managed_DataObject
  */
-
 class RSVP extends Managed_DataObject
 {
     const POSITIVE = 'http://activitystrea.ms/schema/1.0/rsvp-yes';
@@ -54,7 +53,7 @@ class RSVP extends Managed_DataObject
     public $uri;               // varchar(255)
     public $profile_id;        // int
     public $event_id;          // varchar(36) UUID
-    public $result;            // tinyint
+    public $response;            // tinyint
     public $created;           // datetime
 
     /**
@@ -64,20 +63,46 @@ class RSVP extends Managed_DataObject
      * @param mixed  $v Value to lookup
      *
      * @return RSVP object found, or null for no hits
-     *
      */
     function staticGet($k, $v=null)
     {
         return Memcached_DataObject::staticGet('RSVP', $k, $v);
     }
 
+    /**
+     * Get an instance by compound key
+     *
+     * @param array $kv array of key-value mappings
+     *
+     * @return Bookmark object found, or null for no hits
+     */
+
+    function pkeyGet($kv)
+    {
+        return Memcached_DataObject::pkeyGet('RSVP', $kv);
+    }
+
+    /**
+     * Add the compound profile_id/event_id index to our cache keys
+     * since the DB_DataObject stuff doesn't understand compound keys
+     * except for the primary.
+     *
+     * @return array
+     */
+    function _allCacheKeys() {
+        $keys = parent::_allCacheKeys();
+        $keys[] = self::multicacheKey('RSVP', array('profile_id' => $this->profile_id,
+                                                    'event_id' => $this->event_id));
+        return $keys;
+    }
+
     /**
      * The One True Thingy that must be defined and declared.
      */
     public static function schemaDef()
     {
         return array(
-            'description' => 'A real-world event',
+            'description' => 'Plan to attend event',
             'fields' => array(
                 'id' => array('type' => 'char',
                               'length' => 36,
@@ -91,8 +116,9 @@ class RSVP extends Managed_DataObject
                               'length' => 36,
                               'not null' => true,
                               'description' => 'UUID'),
-                'result' => array('type' => 'tinyint',
-                                  'description' => '1, 0, or null for three-state yes, no, maybe'),
+                'response' => array('type' => 'char',
+                                  'length' => '1',
+                                  'description' => 'Y, N, or ? for three-state yes, no, maybe'),
                 'created' => array('type' => 'datetime',
                                    'not null' => true),
             ),
@@ -107,12 +133,13 @@ class RSVP extends Managed_DataObject
         );
     }
 
-    function saveNew($profile, $event, $result, $options)
+    function saveNew($profile, $event, $verb, $options=array())
     {
         if (array_key_exists('uri', $options)) {
             $other = RSVP::staticGet('uri', $options['uri']);
             if (!empty($other)) {
-                throw new ClientException(_('RSVP already exists.'));
+                // TRANS: Client exception thrown when trying to save an already existing RSVP ("please respond").
+                throw new ClientException(_m('RSVP already exists.'));
             }
         }
 
@@ -120,7 +147,8 @@ class RSVP extends Managed_DataObject
                                      'event_id' => $event->id));
 
         if (!empty($other)) {
-            throw new ClientException(_('RSVP already exists.'));
+            // TRANS: Client exception thrown when trying to save an already existing RSVP ("please respond").
+            throw new ClientException(_m('RSVP already exists.'));
         }
 
         $rsvp = new RSVP();
@@ -128,7 +156,7 @@ class RSVP extends Managed_DataObject
         $rsvp->id          = UUID::gen();
         $rsvp->profile_id  = $profile->id;
         $rsvp->event_id    = $event->id;
-        $rsvp->result      = self::codeFor($result);
+        $rsvp->response      = self::codeFor($verb);
 
         if (array_key_exists('created', $options)) {
             $rsvp->created = $options['created'];
@@ -145,15 +173,15 @@ class RSVP extends Managed_DataObject
 
         $rsvp->insert();
 
+        self::blow('rsvp:for-event:%s', $event->id);
+
         // XXX: come up with something sexier
 
-        $content = sprintf(_('RSVPed %s for an event.'),
-                           ($result == RSVP::POSITIVE) ? _('positively') :
-                           ($result == RSVP::NEGATIVE) ? _('negatively') : _('possibly'));
-        
-        $rendered = $content;
+        $content = $rsvp->asString();
+
+        $rendered = $rsvp->asHTML();
 
-        $options = array_merge(array('object_type' => $result),
+        $options = array_merge(array('object_type' => $verb),
                                $options);
 
         if (!array_key_exists('uri', $options)) {
@@ -177,19 +205,49 @@ class RSVP extends Managed_DataObject
 
     function codeFor($verb)
     {
-        return ($verb == RSVP::POSITIVE) ? 1 :
-            ($verb == RSVP::NEGATIVE) ? 0 : null;
+        switch ($verb) {
+        case RSVP::POSITIVE:
+            return 'Y';
+            break;
+        case RSVP::NEGATIVE:
+            return 'N';
+            break;
+        case RSVP::POSSIBLE:
+            return '?';
+            break;
+        default:
+            // TRANS: Exception thrown when requesting an undefined verb for RSVP.
+            throw new Exception(sprintf(_m('Unknown verb "%s".'),$verb));
+        }
     }
 
-    function verbFor($code)
+    static function verbFor($code)
     {
-        return ($code == 1) ? RSVP::POSITIVE :
-            ($code == 0) ? RSVP::NEGATIVE : null;
+        switch ($code) {
+        case 'Y':
+            return RSVP::POSITIVE;
+            break;
+        case 'N':
+            return RSVP::NEGATIVE;
+            break;
+        case '?':
+            return RSVP::POSSIBLE;
+            break;
+        default:
+            // TRANS: Exception thrown when requesting an undefined code for RSVP.
+            throw new Exception(sprintf(_m('Unknown code "%s".'),$code));
+        }
     }
 
     function getNotice()
     {
-        return Notice::staticGet('uri', $this->uri);
+        $notice = Notice::staticGet('uri', $this->uri);
+        if (empty($notice)) {
+            // TRANS: Server exception thrown when requesting a non-exsting notice for an RSVP ("please respond").
+            // TRANS: %s is the RSVP with the missing notice.
+            throw new ServerException(sprintf(_m('RSVP %s does not correspond to a notice in the database.'),$this->id));
+        }
+        return $notice;
     }
 
     static function fromNotice($notice)
@@ -199,19 +257,177 @@ class RSVP extends Managed_DataObject
 
     static function forEvent($event)
     {
-        $rsvps = array(RSVP::POSITIVE => array(), RSVP::NEGATIVE => array(), RSVP::POSSIBLE => array());
+        $keypart = sprintf('rsvp:for-event:%s', $event->id);
 
-        $rsvp = new RSVP();
+        $idstr = self::cacheGet($keypart);
+
+        if ($idstr !== false) {
+            $ids = explode(',', $idstr);
+        } else {
+            $ids = array();
+
+            $rsvp = new RSVP();
+
+            $rsvp->selectAdd();
+            $rsvp->selectAdd('id');
 
-        $rsvp->event_id = $event->id;
+            $rsvp->event_id = $event->id;
 
-        if ($rsvp->find()) {
-            while ($rsvp->fetch()) {
-                $verb = $this->verbFor($rsvp->code);
-                $rsvps[$verb][] = clone($rsvp);
+            if ($rsvp->find()) {
+                while ($rsvp->fetch()) {
+                    $ids[] = $rsvp->id;
+                }
+            }
+            self::cacheSet($keypart, implode(',', $ids));
+        }
+
+        $rsvps = array(RSVP::POSITIVE => array(),
+                       RSVP::NEGATIVE => array(),
+                       RSVP::POSSIBLE => array());
+
+        foreach ($ids as $id) {
+            $rsvp = RSVP::staticGet('id', $id);
+            if (!empty($rsvp)) {
+                $verb = self::verbFor($rsvp->response);
+                $rsvps[$verb][] = $rsvp;
             }
         }
 
         return $rsvps;
     }
+
+    function getProfile()
+    {
+        $profile = Profile::staticGet('id', $this->profile_id);
+        if (empty($profile)) {
+            // TRANS: Exception thrown when requesting a non-existing profile.
+            // TRANS: %s is the ID of the non-existing profile.
+            throw new Exception(sprintf(_m('No profile with ID %s.'),$this->profile_id));
+        }
+        return $profile;
+    }
+
+    function getEvent()
+    {
+        $event = Happening::staticGet('id', $this->event_id);
+        if (empty($event)) {
+            // TRANS: Exception thrown when requesting a non-existing event.
+            // TRANS: %s is the ID of the non-existing event.
+            throw new Exception(sprintf(_m('No event with ID %s.'),$this->event_id));
+        }
+        return $event;
+    }
+
+    function asHTML()
+    {
+        $event = Happening::staticGet('id', $this->event_id);
+
+        return self::toHTML($this->getProfile(),
+                            $event,
+                            $this->response);
+    }
+
+    function asString()
+    {
+        $event = Happening::staticGet('id', $this->event_id);
+
+        return self::toString($this->getProfile(),
+                              $event,
+                              $this->response);
+    }
+
+    static function toHTML($profile, $event, $response)
+    {
+        $fmt = null;
+
+        switch ($response) {
+        case 'Y':
+            // TRANS: HTML version of an RSVP ("please respond") status for a user.
+            // TRANS: %1$s is a profile URL, %2$s a profile name,
+            // TRANS: %3$s is an event URL, %4$s an event title.
+            $fmt = _m("<span class='automatic event-rsvp'><a href='%1\$s'>%2\$s</a> is attending <a href='%3\$s'>%4\$s</a>.</span>");
+            break;
+        case 'N':
+            // TRANS: HTML version of an RSVP ("please respond") status for a user.
+            // TRANS: %1$s is a profile URL, %2$s a profile name,
+            // TRANS: %3$s is an event URL, %4$s an event title.
+            $fmt = _m("<span class='automatic event-rsvp'><a href='%1\$s'>%2\$s</a> is not attending <a href='%3\$s'>%4\$s</a>.</span>");
+            break;
+        case '?':
+            // TRANS: HTML version of an RSVP ("please respond") status for a user.
+            // TRANS: %1$s is a profile URL, %2$s a profile name,
+            // TRANS: %3$s is an event URL, %4$s an event title.
+            $fmt = _m("<span class='automatic event-rsvp'><a href='%1\$s'>%2\$s</a> might attend <a href='%3\$s'>%4\$s</a>.</span>");
+            break;
+        default:
+            // TRANS: Exception thrown when requesting a user's RSVP status for a non-existing response code.
+            // TRANS: %s is the non-existing response code.
+            throw new Exception(sprintf(_m('Unknown response code %s.'),$response));
+            break;
+        }
+
+        if (empty($event)) {
+            $eventUrl = '#';
+            // TRANS: Used as event title when not event title is available.
+            // TRANS: Used as: Username [is [not ] attending|might attend] an unknown event.
+            $eventTitle = _m('an unknown event');
+        } else {
+            $notice = $event->getNotice();
+            $eventUrl = $notice->bestUrl();
+            $eventTitle = $event->title;
+        }
+
+        return sprintf($fmt,
+                       htmlspecialchars($profile->profileurl),
+                       htmlspecialchars($profile->getBestName()),
+                       htmlspecialchars($eventUrl),
+                       htmlspecialchars($eventTitle));
+    }
+
+    static function toString($profile, $event, $response)
+    {
+        $fmt = null;
+
+        switch ($response) {
+        case 'Y':
+            // TRANS: Plain text version of an RSVP ("please respond") status for a user.
+            // TRANS: %1$s is a profile name, %2$s is an event title.
+            $fmt = _m('%1$s is attending %2$s.');
+            break;
+        case 'N':
+            // TRANS: Plain text version of an RSVP ("please respond") status for a user.
+            // TRANS: %1$s is a profile name, %2$s is an event title.
+            $fmt = _m('%1$s is not attending %2$s.');
+            break;
+        case '?':
+            // TRANS: Plain text version of an RSVP ("please respond") status for a user.
+            // TRANS: %1$s is a profile name, %2$s is an event title.
+            $fmt = _m('%1$s might attend %2$s.');
+            break;
+        default:
+            // TRANS: Exception thrown when requesting a user's RSVP status for a non-existing response code.
+            // TRANS: %s is the non-existing response code.
+            throw new Exception(sprintf(_m('Unknown response code %s.'),$response));
+            break;
+        }
+
+        if (empty($event)) {
+            // TRANS: Used as event title when not event title is available.
+            // TRANS: Used as: Username [is [not ] attending|might attend] an unknown event.
+            $eventTitle = _m('an unknown event');
+        } else {
+            $notice = $event->getNotice();
+            $eventTitle = $event->title;
+        }
+
+        return sprintf($fmt,
+                       $profile->getBestName(),
+                       $eventTitle);
+    }
+
+    function delete()
+    {
+        self::blow('rsvp:for-event:%s', $event->id);
+        parent::delete();
+    }
 }