]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - actions/apistatusesupdate.php
Merge branch 'master' into mmn_fixes
[quix0rs-gnu-social.git] / actions / apistatusesupdate.php
index 73b87cac988de4f596433441fe6d5819ddb3b9f8..de00325494497d69fa8dacc4364d3d783b46abf1 100644 (file)
@@ -46,7 +46,7 @@
     /api/statuses/update.:format
 
     @par Formats (:format)
-    xml, json
+    xml, json, atom
 
     @par HTTP Method(s)
     POST
@@ -152,6 +152,7 @@ class ApiStatusesUpdateAction extends ApiAuthAction
     var $in_reply_to_status_id = null;
     var $lat                   = null;
     var $lon                   = null;
+    var $media_ids             = array();   // file_id in the keys
 
     /**
      * Take arguments for running
@@ -167,6 +168,19 @@ class ApiStatusesUpdateAction extends ApiAuthAction
         $this->status = $this->trimmed('status');
         $this->lat    = $this->trimmed('lat');
         $this->lon    = $this->trimmed('long');
+        $matches = array();
+        common_debug(get_called_class().': media_ids=='._ve($this->trimmed('media_ids')));
+        if (preg_match_all('/\d+/', $this->trimmed('media_ids'), $matches) !== false) {
+            foreach (array_unique($matches[0]) as $match) {
+                try {
+                    $this->media_ids[$match] = File::getByID($match);
+                } catch (EmptyPkeyValueException $e) {
+                    // got a zero from the client, at least Twidere does this on occasion
+                } catch (NoResultException $e) {
+                    // File ID was not found. Do we abort and report to the client?
+                }
+            }
+        }
 
         $this->in_reply_to_status_id
             = intval($this->trimmed('in_reply_to_status_id'));
@@ -211,7 +225,7 @@ class ApiStatusesUpdateAction extends ApiAuthAction
             $this->clientError(_('No such user.'), 404);
         }
 
-        /* Do not call shortenlinks until the whole notice has been build */
+        /* Do not call shortenLinks until the whole notice has been build */
 
         // Check for commands
 
@@ -244,25 +258,27 @@ class ApiStatusesUpdateAction extends ApiAuthAction
                 }
             }
 
-            $upload = null;
+            foreach(array_keys($this->media_ids) as $media_id) {
+                // FIXME: Validation on this... Worst case is that if someone sends bad media_ids then
+                // we'll fill the notice with non-working links, so no real harm, done, but let's fix.
+                // The File objects are in the array, so we could get URLs from them directly.
+                $this->status .= ' ' . common_local_url('attachment', array('attachment' => $media_id));
+            }
 
+            $upload = null;
             try {
                 $upload = MediaFile::fromUpload('media', $this->scoped);
-            } catch (Exception $e) {
-                $this->clientError($e->getMessage(), $e->getCode());
-            }
-
-            if (isset($upload)) {
                 $this->status .= ' ' . $upload->shortUrl();
-
-                /* Do not call shortenlinks until the whole notice has been build */
+                /* Do not call shortenLinks until the whole notice has been build */
+            } catch (NoUploadedMediaException $e) {
+                // There was no uploaded media for us today.
             }
 
             /* Do call shortenlinks here & check notice length since notice is about to be saved & sent */
-            $status_shortened = $this->auth_user->shortenlinks($this->status);
+            $status_shortened = $this->auth_user->shortenLinks($this->status);
 
             if (Notice::contentTooLong($status_shortened)) {
-                if (isset($upload)) {
+                if ($upload instanceof MediaFile) {
                     $upload->delete();
                 }
                 // TRANS: Client error displayed exceeding the maximum notice length.
@@ -323,6 +339,8 @@ class ApiStatusesUpdateAction extends ApiAuthAction
                 $this->showSingleXmlStatus($this->notice);
             } elseif ($this->format == 'json') {
                 $this->show_single_json_status($this->notice);
+            } elseif ($this->format == 'atom') {
+                $this->showSingleAtomStatus($this->notice);
             }
         }
     }
@@ -336,13 +354,15 @@ class ApiStatusesUpdateAction extends ApiAuthAction
      */
     function supported($cmd)
     {
-        static $cmdlist = array('MessageCommand', 'SubCommand', 'UnsubCommand',
-            'FavCommand', 'OnCommand', 'OffCommand', 'JoinCommand', 'LeaveCommand');
+        static $cmdlist = array('SubCommand', 'UnsubCommand',
+            'OnCommand', 'OffCommand', 'JoinCommand', 'LeaveCommand');
+
+        $supported = null;
 
-        if (in_array(get_class($cmd), $cmdlist)) {
-            return true;
+        if (Event::handle('CommandSupportedAPI', array($cmd, &$supported))) {
+            $supported = $supported || in_array(get_class($cmd), $cmdlist);
         }
 
-        return false;
+        return $supported;
     }
 }