+
+ if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+ common_user_error(_('API method not found!'), $code = 404);
+ return;
+ }
+
+ if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+ $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
+ return;
+ }
+
+ foreach ($_POST as $p => $v) {
+ common_debug("_POST: $p = $v");
+ }
+
+ $this->auth_user = $apidata['user'];
+ $user = $this->auth_user;
+ $status = $this->trimmed('status');
+ $source = $this->trimmed('source');
+ $in_reply_to_status_id = intval($this->trimmed('in_reply_to_status_id'));
+
+ if (!$source) {
+ $source = 'api';
+ }
+
+ if (!$status) {
+
+ // XXX: Note: In this case, Twitter simply returns '200 OK'
+ // No error is given, but the status is not posted to the
+ // user's timeline. Seems bad. Shouldn't we throw an
+ // errror? -- Zach
+ return;
+
+ } else if (mb_strlen($status) > 140) {
+
+ // XXX: Twitter truncates anything over 140, flags the status
+ // as "truncated." Sending this error may screw up some clients
+ // that assume Twitter will truncate for them. Should we just
+ // truncate too? -- Zach
+ $this->client_error(_('That\'s too long. Max notice size is 140 chars.'), $code = 406, $apidata['content-type']);
+ return;
+ }
+
+ // Check for commands
+ $inter = new CommandInterpreter();
+ $cmd = $inter->handle_command($user, $status);
+
+ if ($cmd) {
+
+ if ($this->supported($cmd)) {
+ $cmd->execute(new Channel());
+ }
+
+ // cmd not supported? Twitter just returns your latest status.
+ // And, it returns your last status whether the cmd was successful
+ // or not!
+ $n = $user->getCurrentNotice();
+ $apidata['api_arg'] = $n->id;
+ } else {
+
+ $reply_to = NULL;
+
+ if ($in_reply_to_status_id) {
+
+ // check whether notice actually exists
+ $reply = Notice::staticGet($in_reply_to_status_id);
+
+ if ($reply) {
+ $reply_to = $in_reply_to_status_id;
+ } else {
+ $this->client_error(_('Not found'), $code = 404, $apidata['content-type']);
+ return;
+ }
+ }
+
+ $notice = Notice::saveNew($user->id, $status, $source, 1, $reply_to);
+
+ if (is_string($notice)) {
+ $this->server_error($notice);
+ return;
+ }
+
+ common_broadcast_notice($notice);
+ $apidata['api_arg'] = $notice->id;
+ }
+
+ $this->show($args, $apidata);