/** * Sends a file to the channel if it is a text channel. * * @param string $filepath * @param string $filename * @return Message|boolean */ public function sendFile($filepath, $filename) { if ($this->type != self::TYPE_TEXT) { return false; } if (!file_exists($filepath)) { throw new FileNotFoundException("File does not exist at path {$filepath}."); } $guzzle = new GuzzleClient(['http_errors' => false, 'allow_redirects' => true]); $url = Guzzle::$base_url . "/channels/{$this->id}/messages"; $headers = ['User-Agent' => Guzzle::getUserAgent(), 'authorization' => DISCORD_TOKEN]; $done = false; $finalRes = null; while (!$done) { $response = $guzzle->request('post', $url, ['headers' => $headers, 'multipart' => [['name' => 'file', 'contents' => fopen($filepath, 'r'), 'filename' => $filename]]]); // Rate limiting if ($response->getStatusCode() == 429) { $tts = $response->getHeader('Retry-After') * 1000; usleep($tts); continue; } // Not good! if ($response->getStatusCode() < 200 || $response->getStatusCode() > 226) { Guzzle::handleError($response->getStatusCode(), $response->getReasonPhrase()); continue; } $done = true; $finalRes = $response; } $request = json_decode($finalRes->getBody()); $message = new Message(['id' => $request->id, 'channel_id' => $request->channel_id, 'content' => $request->content, 'mentions' => $request->mentions, 'author' => $request->author, 'mention_everyone' => $request->mention_everyone, 'timestamp' => $request->timestamp, 'edited_timestamp' => $request->edited_timestamp, 'tts' => $request->tts, 'attachments' => $request->attachments, 'embeds' => $request->embeds], true); if (!isset($this->attributes_cache['messages'])) { $this->attributes_cache['messages'] = new Collection(); } $this->attributes_cache['messages']->push($message); return $message; }