From 4e92689e6f8a57439427fa642893a0743d8de86c Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Thu, 8 Aug 2024 20:14:50 +0900 Subject: [PATCH] Add Twilio SMS driver --- common/framework/drivers/sms/twilio.php | 130 ++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 common/framework/drivers/sms/twilio.php diff --git a/common/framework/drivers/sms/twilio.php b/common/framework/drivers/sms/twilio.php new file mode 100644 index 000000000..3c534a164 --- /dev/null +++ b/common/framework/drivers/sms/twilio.php @@ -0,0 +1,130 @@ + 100, + 'sms_max_length' => 70, + 'sms_max_length_in_charset' => 'UTF-16LE', + 'lms_supported' => true, + 'lms_supported_country_codes' => array(), + 'lms_max_length' => 1600, + 'lms_max_length_in_charset' => 'UTF-16LE', + 'lms_subject_supported' => false, + 'lms_subject_max_length' => 0, + 'mms_supported' => true, + 'mms_supported_country_codes' => array(), + 'mms_max_length' => 1600, + 'mms_max_length_in_charset' => 'UTF-16LE', + 'mms_subject_supported' => false, + 'mms_subject_max_length' => 0, + 'image_allowed_types' => array('jpg', 'gif', 'png'), + 'image_max_dimensions' => array(2048, 2048), + 'image_max_filesize' => 5000000, + 'delay_supported' => true, + ); + + /** + * Config keys used by this driver are stored here. + */ + protected static $_required_config = ['api_key', 'api_secret']; + protected static $_optional_config = []; + + /** + * Check if the current SMS driver is supported on this server. + * + * This method returns true on success and false on failure. + * + * @return bool + */ + public static function isSupported() + { + return true; + } + + /** + * Send a message. + * + * This method returns true on success and false on failure. + * + * @param array $messages + * @param object $original + * @return bool + */ + public function send(array $messages, \Rhymix\Framework\SMS $original) + { + $status = true; + $url = sprintf('%s/Accounts/%s/Messages.json', self::BASEURL, $this->_config['api_key']); + $settings = [ + 'auth' => [$this->_config['api_key'], $this->_config['api_secret']], + 'timeout => 10', + ]; + + foreach ($messages as $i => $message) + { + $from = '+' . preg_replace('/[^0-9]/', '', $message->from); + foreach ($message->to as $recipient) + { + $data = []; + $data['To'] = sprintf('+%s%s', $message->country ?: 82, preg_replace('/[^0-9]/', '', $recipient)); + $data['From'] = $from; + $data['Body'] = $message->content; + if ($message->delay && $message->delay > time()) + { + $data['SendAt'] = gmdate('Y-m-d\TH:i:s\Z', $message->delay); + } + if ($message->type === 'MMS') + { + $data['SendAsMms'] = true; + } + if ($message->image && Storage::isFile($message->image)) + { + $media_url = URL::fromServerPath($message->image); + if ($media_url) + { + $data['MediaUrl'][] = $media_url; + } + } + + $request = HTTP::request($url, 'POST', $data, [], [], $settings); + $status_code = $request->getStatusCode(); + if ($status_code < 200 || $status_code >= 400) + { + $response = $request->getBody()->getContents(); + if ($response) + { + $response = json_decode($response); + $error_code = $response->error_code; + $error_message = $response->error_message; + } + else + { + $error_code = null; + $error_message = null; + } + $original->addError('Error (' . $status_code . ') while sending message ' . ($i + 1) . ' of ' . count($messages) . + ' to ' . $data['To'] . ': ' . trim($error_code . ' ' . $error_message)); + $status = false; + } + } + } + + return $status; + } +}