2009-10-03 09:23:48 +09:00
< ? php
2020-07-28 12:46:10 +09:00
// This file is part of GNU social - https://www.gnu.org/software/social
//
// GNU social is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// GNU social is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with GNU social. If not, see <http://www.gnu.org/licenses/>.
2009-10-03 09:23:48 +09:00
/**
2020-07-28 12:46:10 +09:00
* Direct messaging implementation for GNU social
2009-10-03 09:23:48 +09:00
*
2020-07-28 12:46:10 +09:00
* @ package GNUsocial
2009-10-13 08:36:00 +09:00
* @ author Adrian Lang < mail @ adrianlang . de >
* @ author Evan Prodromou < evan @ status . net >
* @ author Robin Millette < robin @ millette . info >
2009-10-03 09:23:48 +09:00
* @ author Zach Copley < zach @ status . net >
2020-07-28 12:46:10 +09:00
* @ copyright 2009 , 2020 Free Software Foundation , Inc http :// www . fsf . org
* @ license https :// www . gnu . org / licenses / agpl . html GNU AGPL v3 or later
2009-10-03 09:23:48 +09:00
*/
2020-07-28 12:46:10 +09:00
defined ( 'GNUSOCIAL' ) || die ();
2009-10-03 09:23:48 +09:00
/**
* Creates a new direct message from the authenticating user to
2020-07-28 12:46:10 +09:00
* the user specified by id
2009-10-03 09:23:48 +09:00
*
2020-07-28 12:46:10 +09:00
* @ category Plugin
* @ package GNUsocial
2009-10-13 08:36:00 +09:00
* @ author Adrian Lang < mail @ adrianlang . de >
* @ author Evan Prodromou < evan @ status . net >
* @ author Robin Millette < robin @ millette . info >
2009-10-03 09:23:48 +09:00
* @ author Zach Copley < zach @ status . net >
2020-07-28 12:46:10 +09:00
* @ license https :// www . gnu . org / licenses / agpl . html GNU AGPL v3 or later
2009-10-03 09:23:48 +09:00
*/
class ApiDirectMessageNewAction extends ApiAuthAction
{
2013-10-15 09:54:10 +09:00
protected $needPost = true ;
2020-07-28 12:46:10 +09:00
public $other = null ; // Profile we're sending to
public $content = null ;
2009-10-03 09:23:48 +09:00
/**
* Take arguments for running
*
* @ param array $args $_REQUEST args
*
* @ return boolean success flag
*/
2020-07-28 12:46:10 +09:00
protected function prepare ( array $args = [])
2009-10-03 09:23:48 +09:00
{
parent :: prepare ( $args );
2015-07-08 02:18:45 +09:00
if ( ! $this -> scoped instanceof Profile ) {
2010-10-26 06:51:00 +09:00
// TRANS: Client error when user not found for an API direct message action.
2013-10-15 09:54:10 +09:00
$this -> clientError ( _ ( 'No such user.' ), 404 );
2009-10-03 09:23:48 +09:00
}
$this -> content = $this -> trimmed ( 'text' );
$user_param = $this -> trimmed ( 'user' );
$user_id = $this -> arg ( 'user_id' );
$screen_name = $this -> trimmed ( 'screen_name' );
if ( isset ( $user_param ) || isset ( $user_id ) || isset ( $screen_name )) {
2014-04-30 03:37:58 +09:00
$this -> other = $this -> getTargetProfile ( $user_param );
2009-10-03 09:23:48 +09:00
}
return true ;
}
/**
* Handle the request
*
* Save the new message
*
* @ return void
*/
2013-10-15 09:54:10 +09:00
protected function handle ()
2009-10-03 09:23:48 +09:00
{
2013-10-15 09:54:10 +09:00
parent :: handle ();
2009-10-03 09:23:48 +09:00
if ( empty ( $this -> content )) {
2013-10-15 09:54:10 +09:00
// TRANS: Client error displayed when no message text was submitted (406).
$this -> clientError ( _ ( 'No message text!' ), 406 );
2009-10-03 09:23:48 +09:00
} else {
2010-12-03 03:56:44 +09:00
$content_shortened = $this -> auth_user -> shortenLinks ( $this -> content );
2020-07-30 01:50:29 +09:00
if ( MessageModel :: contentTooLong ( $content_shortened )) {
2013-10-15 09:54:10 +09:00
// TRANS: Client error displayed when message content is too long.
// TRANS: %d is the maximum number of characters for a message.
2009-10-03 09:23:48 +09:00
$this -> clientError (
2020-07-30 01:50:29 +09:00
sprintf ( _m ( 'That\'s too long. Maximum message size is %d character.' , 'That\'s too long. Maximum message size is %d characters.' , MessageModel :: maxContent ()), MessageModel :: maxContent ()),
2020-07-28 12:46:10 +09:00
406
);
2009-10-03 09:23:48 +09:00
}
}
2014-04-30 03:37:58 +09:00
if ( ! $this -> other instanceof Profile ) {
2010-10-16 21:38:12 +09:00
// TRANS: Client error displayed if a recipient user could not be found (403).
2013-10-15 09:54:10 +09:00
$this -> clientError ( _ ( 'Recipient user not found.' ), 403 );
2020-07-30 01:50:29 +09:00
} elseif (
$this -> other -> isLocal ()
&& ! $this -> scoped -> mutuallySubscribed ( $this -> other )
) {
2013-10-15 09:54:10 +09:00
// TRANS: Client error displayed trying to direct message another user who's not a friend (403).
$this -> clientError ( _ ( 'Cannot send direct messages to users who aren\'t your friend.' ), 403 );
2020-07-28 12:46:10 +09:00
} elseif ( $this -> scoped -> getID () === $this -> other -> getID ()) {
2009-10-03 09:23:48 +09:00
// Note: sending msgs to yourself is allowed by Twitter
2010-10-16 21:38:12 +09:00
// TRANS: Client error displayed trying to direct message self (403).
2013-10-15 09:54:10 +09:00
$this -> clientError ( _ ( 'Do not send a message to yourself; just say it to yourself quietly instead.' ), 403 );
2009-10-03 09:23:48 +09:00
}
2020-07-30 01:50:29 +09:00
// push other profile to the content, it will be
// detected during Notice save
if ( $this -> other -> isLocal ()) {
$this -> content = " @ { $this -> other -> getNickname () } { $this -> content } " ;
} else {
$this -> content = '@' . substr ( $this -> other -> getAcctUri (), 5 ) . $this -> content ;
}
$message = MessageModel :: saveNew (
2015-07-08 02:18:45 +09:00
$this -> scoped -> getID (),
2020-07-30 01:50:29 +09:00
$this -> content ,
2009-10-03 09:23:48 +09:00
$this -> source
);
2020-07-30 01:50:29 +09:00
Event :: handle ( 'SendDirectMessage' , [ $message ]);
mail_notify_message ( $message );
2009-10-03 09:23:48 +09:00
if ( $this -> format == 'xml' ) {
$this -> showSingleXmlDirectMessage ( $message );
} elseif ( $this -> format == 'json' ) {
$this -> showSingleJsondirectMessage ( $message );
}
}
}