]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - actions/invite.php
Merge remote-tracking branch 'upstream/master' into social-master
[quix0rs-gnu-social.git] / actions / invite.php
index 7a1f8b3f5b16d4f9aac0ac8df6d9dc9a64d34bd9..0deb7a76ee2d997a5dd66236fc5fc1774e31e1cc 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
  * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2008, 2009, StatusNet, Inc.
+ * Copyright (C) 2008-2011, StatusNet, Inc.
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as published by
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
+if (!defined('GNUSOCIAL')) { exit(1); }
 
 // @todo XXX: Add documentation.
-class InviteAction extends CurrentUserDesignAction
+class InviteAction extends Action
 {
     var $mode = null;
     var $error = null;
@@ -28,12 +28,17 @@ class InviteAction extends CurrentUserDesignAction
     var $subbed = null;
     var $sent = null;
 
-    function isReadOnly($args)
+    function showNoticeForm()
+    {
+        return;
+    }
+
+    function isReadOnly(array $args=array())
     {
         return false;
     }
 
-    function handle($args)
+    function handle(array $args=array())
     {
         parent::handle($args);
         if (!common_config('invite', 'enabled')) {
@@ -54,55 +59,85 @@ class InviteAction extends CurrentUserDesignAction
 
     function sendInvitations()
     {
-        // CSRF protection
-        $token = $this->trimmed('token');
-        if (!$token || $token != common_session_token()) {
-            // TRANS: Client error displayed when the session token does not match or is not given.
-            $this->showForm(_('There was a problem with your session token. Try again, please.'));
-            return;
-        }
+        if (Event::handle('StartSendInvitations', array(&$this))) {
+            // CSRF protection
+            $token = $this->trimmed('token');
+            if (!$token || $token != common_session_token()) {
+                // TRANS: Client error displayed when the session token does not match or is not given.
+                $this->showForm(_('There was a problem with your session token. Try again, please.'));
+                return;
+            }
 
-        $user = common_current_user();
-        $profile = $user->getProfile();
+            $user = common_current_user();
+            $profile = $user->getProfile();
 
-        $bestname = $profile->getBestName();
-        $sitename = common_config('site', 'name');
-        $personal = $this->trimmed('personal');
+            $bestname = $profile->getBestName();
+            $sitename = common_config('site', 'name');
+            $personal = $this->trimmed('personal');
+            $language = $this->trimmed('language');
 
-        $addresses = explode("\n", $this->trimmed('addresses'));
+            $addresses = explode("\n", $this->trimmed('addresses'));
+            foreach ($addresses as $email) {
+                $email = trim($email);
+                $valid = null;
 
-        foreach ($addresses as $email) {
-            $email = trim($email);
-            if (!Validate::email($email, common_config('email', 'check_domain'))) {
-                // TRANS: Form validation message when providing an e-mail address that does not validate.
-                // TRANS: %s is an invalid e-mail address.
-                $this->showForm(sprintf(_('Invalid email address: %s.'), $email));
-                return;
+                try {
+
+                    if (Event::handle('StartValidateUserEmail', array(null, $email, &$valid))) {
+                        $valid = Validate::email($email, common_config('email', 'check_domain'));
+                        Event::handle('EndValidateUserEmail', array(null, $email, &$valid));
+                    }
+
+                    if ($valid) {
+                        if (Event::handle('StartValidateEmailInvite', array($user, $email, &$valid))) {
+                            $valid = true;
+                            Event::handle('EndValidateEmailInvite', array($user, $email, &$valid));
+                        }
+                    }
+
+                    if (!$valid) {
+                        // TRANS: Form validation message when providing an e-mail address that does not validate.
+                        // TRANS: %s is an invalid e-mail address.
+                        $this->showForm(sprintf(_('Invalid email address: %s.'), $email));
+                        return;
+                    }
+                } catch (ClientException $e) {
+                    $this->showForm($e->getMessage());
+                    return;
+                }
             }
-        }
 
-        $this->already = array();
-        $this->subbed = array();
-
-        foreach ($addresses as $email) {
-            $email = common_canonical_email($email);
-            $other = User::staticGet('email', $email);
-            if ($other) {
-                if ($user->isSubscribed($other)) {
-                    $this->already[] = $other;
-                } else {
-                    subs_subscribe_to($user, $other);
-                    $this->subbed[] = $other;
+            $this->already = array();
+            $this->subbed = array();
+
+            foreach ($addresses as $email) {
+                $email = common_canonical_email($email);
+                try {
+                    // If this user is already registered, subscribe to it!
+                    $other = Profile::getByEmail($email);
+                    if ($user->isSubscribed($other)) {
+                        $this->already[] = $other;
+                    } else {
+                        try {
+                            Subscription::ensureStart($profile, $other);
+                            $this->subbed[] = $other;
+                        } catch (Exception $e) {
+                            // subscription failed, but keep working
+                            common_debug('Invitation-based subscription failed: '.$e->getMessage());
+                        }
+                    }
+                } catch (NoSuchUserException $e) {
+                    // If email was not known, let's send an invite!
+                    $this->sent[] = $email;
+                    $this->sendInvitation($email, $user, $personal, $language);
                 }
-            } else {
-                $this->sent[] = $email;
-                $this->sendInvitation($email, $user, $personal);
             }
-        }
 
-        $this->mode = 'sent';
+            $this->mode = 'sent';
 
-        $this->showPage();
+            $this->showPage();
+            Event::handle('EndSendInvitations', array($this));
+        }
     }
 
     function showScripts()
@@ -133,50 +168,53 @@ class InviteAction extends CurrentUserDesignAction
 
     function showInvitationSuccess()
     {
-        if ($this->already) {
-            // TRANS: Message displayed inviting users to use a StatusNet site while the inviting user
-            // TRANS: is already subscribed to one or more users with the given e-mail address(es).
-            // TRANS: Plural form is based on the number of reported already subscribed e-mail addresses.
-            // TRANS: Followed by a bullet list.
-            $this->element('p', null, _m('You are already subscribed to this user:',
-                                         'You are already subscribed to these users:',
-                                         count($this->already)));
-            $this->elementStart('ul');
-            foreach ($this->already as $other) {
-                // TRANS: Used as list item for already subscribed users (%1$s is nickname, %2$s is e-mail address).
-                $this->element('li', null, sprintf(_m('INVITE','%1$s (%2$s)'), $other->nickname, $other->email));
+        if (Event::handle('StartShowInvitationSuccess', array($this))) {
+            if ($this->already) {
+                // TRANS: Message displayed inviting users to use a StatusNet site while the inviting user
+                // TRANS: is already subscribed to one or more users with the given e-mail address(es).
+                // TRANS: Plural form is based on the number of reported already subscribed e-mail addresses.
+                // TRANS: Followed by a bullet list.
+                $this->element('p', null, _m('You are already subscribed to this user:',
+                                             'You are already subscribed to these users:',
+                                             count($this->already)));
+                $this->elementStart('ul');
+                foreach ($this->already as $other) {
+                    // TRANS: Used as list item for already subscribed users (%1$s is nickname, %2$s is e-mail address).
+                    $this->element('li', null, sprintf(_m('INVITE','%1$s (%2$s)'), $other->nickname, $other->email));
+                }
+                $this->elementEnd('ul');
             }
-            $this->elementEnd('ul');
-        }
-        if ($this->subbed) {
-            // TRANS: Message displayed inviting users to use a StatusNet site while the invited user
-            // TRANS: already uses a this StatusNet site. Plural form is based on the number of
-            // TRANS: reported already present people. Followed by a bullet list.
-            $this->element('p', null, _m('This person is already a user and you were automatically subscribed:',
-                                         'These people are already users and you were automatically subscribed to them:',
-                                         count($this->subbed)));
-            $this->elementStart('ul');
-            foreach ($this->subbed as $other) {
-                // TRANS: Used as list item for already registered people (%1$s is nickname, %2$s is e-mail address).
-                $this->element('li', null, sprintf(_m('INVITE','%1$s (%2$s)'), $other->nickname, $other->email));
+            if ($this->subbed) {
+                // TRANS: Message displayed inviting users to use a StatusNet site while the invited user
+                // TRANS: already uses a this StatusNet site. Plural form is based on the number of
+                // TRANS: reported already present people. Followed by a bullet list.
+                $this->element('p', null, _m('This person is already a user and you were automatically subscribed:',
+                                             'These people are already users and you were automatically subscribed to them:',
+                                             count($this->subbed)));
+                $this->elementStart('ul');
+                foreach ($this->subbed as $other) {
+                    // TRANS: Used as list item for already registered people (%1$s is nickname, %2$s is e-mail address).
+                    $this->element('li', null, sprintf(_m('INVITE','%1$s (%2$s)'), $other->nickname, $other->email));
+                }
+                $this->elementEnd('ul');
             }
-            $this->elementEnd('ul');
-        }
-        if ($this->sent) {
-            // TRANS: Message displayed inviting users to use a StatusNet site. Plural form is
-            // TRANS: based on the number of invitations sent. Followed by a bullet list of
-            // TRANS: e-mail addresses to which invitations were sent.
-            $this->element('p', null, _m('Invitation sent to the following person:',
-                                         'Invitations sent to the following people:',
-                                         count($this->sent)));
-            $this->elementStart('ul');
-            foreach ($this->sent as $other) {
-                $this->element('li', null, $other);
+            if ($this->sent) {
+                // TRANS: Message displayed inviting users to use a StatusNet site. Plural form is
+                // TRANS: based on the number of invitations sent. Followed by a bullet list of
+                // TRANS: e-mail addresses to which invitations were sent.
+                $this->element('p', null, _m('Invitation sent to the following person:',
+                                             'Invitations sent to the following people:',
+                                             count($this->sent)));
+                $this->elementStart('ul');
+                foreach ($this->sent as $other) {
+                    $this->element('li', null, $other);
+                }
+                $this->elementEnd('ul');
+                // TRANS: Generic message displayed after sending out one or more invitations to
+                // TRANS: people to join a StatusNet site.
+                $this->element('p', null, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!'));
             }
-            $this->elementEnd('ul');
-            // TRANS: Generic message displayed after sending out one or more invitations to
-            // TRANS: people to join a StatusNet site.
-            $this->element('p', null, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!'));
+            Event::handle('EndShowInvitationSuccess', array($this));
         }
     }
 
@@ -204,38 +242,14 @@ class InviteAction extends CurrentUserDesignAction
 
     function showInviteForm()
     {
-        $this->elementStart('form', array('method' => 'post',
-                                           'id' => 'form_invite',
-                                           'class' => 'form_settings',
-                                           'action' => common_local_url('invite')));
-        $this->elementStart('fieldset');
-        // TRANS: Form legend.
-        $this->element('legend', null, 'Send an invitation');
-        $this->hidden('token', common_session_token());
-
-        $this->elementStart('ul', 'form_data');
-        $this->elementStart('li');
-        // TRANS: Field label for a list of e-mail addresses.
-        $this->textarea('addresses', _('Email addresses'),
-                        $this->trimmed('addresses'),
-                        // TRANS: Tooltip for field label for a list of e-mail addresses.
-                        _('Addresses of friends to invite (one per line).'));
-        $this->elementEnd('li');
-        $this->elementStart('li');
-        // TRANS: Field label for a personal message to send to invitees.
-        $this->textarea('personal', _('Personal message'),
-                        $this->trimmed('personal'),
-                        // TRANS: Tooltip for field label for a personal message to send to invitees.
-                        _('Optionally add a personal message to the invitation.'));
-        $this->elementEnd('li');
-        $this->elementEnd('ul');
-        // TRANS: Send button for inviting friends
-        $this->submit('send', _m('BUTTON', 'Send'));
-        $this->elementEnd('fieldset');
-        $this->elementEnd('form');
+        if (Event::handle('StartShowInviteForm', array($this))) {
+            $form = new InviteForm($this);
+            $form->show();
+            Event::handle('EndShowInviteForm', array($this));
+        }
     }
 
-    function sendInvitation($email, $user, $personal)
+    function sendInvitation($email, $user, $personal, $language)
     {
         $profile = $user->getProfile();
         $bestname = $profile->getBestName();
@@ -255,44 +269,31 @@ class InviteAction extends CurrentUserDesignAction
             return false;
         }
 
+        $confirmUrl = common_local_url('register', array('code' => $invite->code));
+
         $recipients = array($email);
 
         $headers['From'] = mail_notify_from();
         $headers['To'] = trim($email);
+        $headers['Content-Type'] = 'text/html; charset=UTF-8';
+
         // TRANS: Subject for invitation email. Note that 'them' is correct as a gender-neutral
         // TRANS: singular 3rd-person pronoun in English. %1$s is the inviting user, $2$s is
         // TRANS: the StatusNet sitename.
         $headers['Subject'] = sprintf(_('%1$s has invited you to join them on %2$s'), $bestname, $sitename);
 
-        // TRANS: Body text for invitation email. Note that 'them' is correct as a gender-neutral
-        // TRANS: singular 3rd-person pronoun in English. %1$s is the inviting user, %2$s is the
-        // TRANS: StatusNet sitename, %3$s is the site URL, %4$s is the personal message from the
-        // TRANS: inviting user, %s%5 a link to the timeline for the inviting user, %s$6 is a link
-        // TRANS: to register with the StatusNet site.
-        $body = sprintf(_("%1\$s has invited you to join them on %2\$s (%3\$s).\n\n".
-                          "%2\$s is a micro-blogging service that lets you keep up-to-date with people you know and people who interest you.\n\n".
-                          "You can also share news about yourself, your thoughts, or your life online with people who know about you. ".
-                          "It's also great for meeting new people who share your interests.\n\n".
-                          "%1\$s said:\n\n%4\$s\n\n".
-                          "You can see %1\$s's profile page on %2\$s here:\n\n".
-                          "%5\$s\n\n".
-                          "If you'd like to try the service, click on the link below to accept the invitation.\n\n".
-                          "%6\$s\n\n".
-                          "If not, you can ignore this message. Thanks for your patience and your time.\n\n".
-                          "Sincerely, %2\$s\n"),
-                        $bestname,
-                        $sitename,
-                        common_root_url(),
-                        $personal,
-                        common_local_url('showstream', array('nickname' => $user->nickname)),
-                        common_local_url('register', array('code' => $invite->code)));
+        $title = (empty($personal)) ? 'invite' : 'invitepersonal';
 
-        mail_send($recipients, $headers, $body);
-    }
+        // @todo FIXME: i18n issue.
+        $inviteTemplate = DocFile::forTitle($title, DocFile::mailPaths(), $language);
 
-    function showObjectNav()
-    {
-        $nav = new SubGroupNav($this, common_current_user());
-        $nav->show();
+        $body = $inviteTemplate->toHTML(array('inviter' => $bestname,
+                                              'inviterurl' => $profile->profileurl,
+                                              'confirmurl' => $confirmUrl,
+                                              'personal' => $personal));
+
+        common_debug('Confirm URL is ' . common_local_url('register', array('code' => $invite->code)));
+
+        mail_send($recipients, $headers, $body);
     }
 }