X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FEvent%2FRSVP.php;h=1f47958e9a266b4e07fdd3828c614b6f0d46f813;hb=14f03a237e1a67a764a75cfa8e6fed34f0074a4b;hp=dc7166b9ce4972ff8d360deec89c21a46c3902cf;hpb=a63e1418a83f92f0db9fa80f88c63b51f25b3d3e;p=quix0rs-gnu-social.git
diff --git a/plugins/Event/RSVP.php b/plugins/Event/RSVP.php
index dc7166b9ce..1f47958e9a 100644
--- a/plugins/Event/RSVP.php
+++ b/plugins/Event/RSVP.php
@@ -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,7 +63,6 @@ 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)
{
@@ -77,7 +75,6 @@ class RSVP extends Managed_DataObject
* @param array $kv array of key-value mappings
*
* @return Bookmark object found, or null for no hits
- *
*/
function pkeyGet($kv)
@@ -119,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),
),
@@ -135,12 +133,13 @@ class RSVP extends Managed_DataObject
);
}
- function saveNew($profile, $event, $result, $options=array())
+ 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.'));
}
}
@@ -148,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();
@@ -156,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'];
@@ -173,16 +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();
- $options = array_merge(array('object_type' => $result),
+ $rendered = $rsvp->asHTML();
+
+ $options = array_merge(array('object_type' => $verb),
$options);
if (!array_key_exists('uri', $options)) {
@@ -206,21 +205,47 @@ 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));
+ }
}
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()
{
$notice = Notice::staticGet('uri', $this->uri);
if (empty($notice)) {
- throw new ServerException("RSVP {$this->id} does not correspond to a notice in the DB.");
+ // 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;
}
@@ -232,21 +257,177 @@ class RSVP extends Managed_DataObject
static function forEvent($event)
{
+ $keypart = sprintf('rsvp:for-event:%s', $event->id);
+
+ $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;
+
+ 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());
- $rsvp = new RSVP();
-
- $rsvp->event_id = $event->id;
-
- if ($rsvp->find()) {
- while ($rsvp->fetch()) {
- $verb = self::verbFor($rsvp->result);
- $rsvps[$verb][] = clone($rsvp);
+ 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("%2\$s is attending %4\$s.");
+ 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("%2\$s is not attending %4\$s.");
+ 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("%2\$s might attend %4\$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)) {
+ $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();
+ }
}