├── index.php ├── .gitignore ├── includes ├── twilio-php │ ├── docs │ │ ├── requirements.txt │ │ ├── _themes │ │ │ ├── kr │ │ │ │ ├── theme.conf │ │ │ │ ├── relations.html │ │ │ │ ├── static │ │ │ │ │ └── small_flask.css │ │ │ │ └── layout.html │ │ │ ├── kr_small │ │ │ │ ├── theme.conf │ │ │ │ ├── layout.html │ │ │ │ └── static │ │ │ │ │ └── flasky.css_t │ │ │ ├── README.rst │ │ │ ├── LICENSE │ │ │ └── flask_theme_support.py │ │ ├── api │ │ │ ├── twiml.rst │ │ │ └── services.rst │ │ ├── usage │ │ │ ├── rest │ │ │ │ ├── transcriptions.rst │ │ │ │ ├── notifications.rst │ │ │ │ ├── accounts.rst │ │ │ │ ├── callerids.rst │ │ │ │ ├── members.rst │ │ │ │ ├── sms-messages.rst │ │ │ │ ├── applications.rst │ │ │ │ ├── conferences.rst │ │ │ │ ├── queues.rst │ │ │ │ ├── messages.rst │ │ │ │ ├── recordings.rst │ │ │ │ ├── usage-triggers.rst │ │ │ │ ├── usage-records.rst │ │ │ │ ├── sip.rst │ │ │ │ └── calls.rst │ │ │ ├── token-generation.rst │ │ │ ├── validation.rst │ │ │ └── rest.rst │ │ ├── quickstart.rst │ │ ├── Makefile │ │ └── index.rst │ ├── tests │ │ ├── README │ │ ├── phpunit.xml │ │ ├── resources │ │ │ ├── NotificationTest.php │ │ │ ├── CallsTest.php │ │ │ ├── ShortCodesTest.php │ │ │ ├── SandboxTest.php │ │ │ ├── AccountsTest.php │ │ │ ├── ApplicationsTest.php │ │ │ ├── QueuesTest.php │ │ │ ├── MediaTest.php │ │ │ ├── OutgoingCallerIdsTest.php │ │ │ ├── SMSMessagesTest.php │ │ │ ├── ConnectAppsTest.php │ │ │ ├── AvailablePhoneNumbersTest.php │ │ │ ├── MembersTest.php │ │ │ ├── IncomingPhoneNumbersTest.php │ │ │ ├── UsageTriggersTest.php │ │ │ └── MessagesTest.php │ │ ├── Bootstrap.php │ │ ├── BuildQueryTest.php │ │ ├── RequestValidatorTest.php │ │ └── CapabilityTest.php │ ├── Services │ │ └── Twilio │ │ │ ├── HttpException.php │ │ │ ├── Rest │ │ │ ├── Sandbox.php │ │ │ ├── Conferences.php │ │ │ ├── ConnectApp.php │ │ │ ├── Recordings.php │ │ │ ├── ShortCode.php │ │ │ ├── SmsMessage.php │ │ │ ├── UsageRecord.php │ │ │ ├── Application.php │ │ │ ├── Notification.php │ │ │ ├── Notifications.php │ │ │ ├── Transcriptions.php │ │ │ ├── UsageTrigger.php │ │ │ ├── Transcription.php │ │ │ ├── OutgoingCallerId.php │ │ │ ├── AuthorizedConnectApp.php │ │ │ ├── AvailablePhoneNumber.php │ │ │ ├── Participant.php │ │ │ ├── Queue.php │ │ │ ├── Recording.php │ │ │ ├── ConnectApps.php │ │ │ ├── Conference.php │ │ │ ├── AuthorizedConnectApps.php │ │ │ ├── ShortCodes.php │ │ │ ├── Applications.php │ │ │ ├── OutgoingCallerIds.php │ │ │ ├── Participants.php │ │ │ ├── SmsMessages.php │ │ │ ├── Queues.php │ │ │ ├── Sip.php │ │ │ ├── Member.php │ │ │ ├── Calls.php │ │ │ ├── Credential.php │ │ │ ├── CredentialLists.php │ │ │ ├── IpAddress.php │ │ │ ├── Accounts.php │ │ │ ├── CredentialListMapping.php │ │ │ ├── IpAccessControlListMapping.php │ │ │ ├── CredentialListMappings.php │ │ │ ├── Domains.php │ │ │ ├── IpAccessControlLists.php │ │ │ ├── IpAccessControlListMappings.php │ │ │ ├── Credentials.php │ │ │ ├── Members.php │ │ │ ├── Account.php │ │ │ ├── CredentialList.php │ │ │ ├── MediaInstance.php │ │ │ ├── Media.php │ │ │ ├── IpAccessControlList.php │ │ │ ├── UsageRecords.php │ │ │ ├── IpAddresses.php │ │ │ ├── Message.php │ │ │ ├── UsageTriggers.php │ │ │ ├── Domain.php │ │ │ ├── AvailablePhoneNumbers.php │ │ │ ├── IncomingPhoneNumbers.php │ │ │ ├── Messages.php │ │ │ ├── IncomingPhoneNumber.php │ │ │ └── Call.php │ │ │ ├── SIPListResource.php │ │ │ ├── UsageResource.php │ │ │ ├── RequestValidator.php │ │ │ ├── NumberType.php │ │ │ ├── PartialApplicationHelper.php │ │ │ ├── TimeRangeResource.php │ │ │ ├── RestException.php │ │ │ ├── Page.php │ │ │ ├── InstanceResource.php │ │ │ ├── HttpStream.php │ │ │ ├── AutoPagingIterator.php │ │ │ ├── Resource.php │ │ │ ├── TinyHttp.php │ │ │ └── Twiml.php │ ├── AUTHORS.md │ ├── composer.json │ ├── LICENSE │ ├── Makefile │ ├── package.php │ └── README.md ├── SAMPLE-config.inc.php └── master.inc.php ├── nest.php ├── sms.php ├── travel.php └── README.md /index.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | config.inc.php 2 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/requirements.txt: -------------------------------------------------------------------------------- 1 | sphinxcontrib-phpdomain 2 | hg+https://bitbucket.org/tk0miya/tk.phpautodoc 3 | 4 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/README: -------------------------------------------------------------------------------- 1 | # To run the tests, navigate to the twilio-php home directory, then run: 2 | 3 | make test 4 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/HttpException.php: -------------------------------------------------------------------------------- 1 | setAway($value)); -------------------------------------------------------------------------------- /sms.php: -------------------------------------------------------------------------------- 1 | account->sms_messages->create(TWILIO_FROM, $_GET['to'], $_GET['msg']); 6 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ./ 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/api/twiml.rst: -------------------------------------------------------------------------------- 1 | ########################################### 2 | API for TwiML Generation 3 | ########################################### 4 | 5 | .. phpautoclass:: Services_Twilio_Twiml 6 | :filename: ../Services/Twilio/Twiml.php 7 | :members: 8 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Participant.php: -------------------------------------------------------------------------------- 1 | update('Muted', 'true'); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Queue.php: -------------------------------------------------------------------------------- 1 | setupSubresources('members'); 8 | } 9 | } 10 | 11 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/_themes/kr_small/theme.conf: -------------------------------------------------------------------------------- 1 | [theme] 2 | inherit = basic 3 | stylesheet = flasky.css 4 | nosidebar = true 5 | pygments_style = flask_theme_support.FlaskyStyle 6 | 7 | [options] 8 | index_logo = '' 9 | index_logo_height = 120px 10 | github_fork = '' 11 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Recording.php: -------------------------------------------------------------------------------- 1 | setupSubresources('transcriptions'); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/ConnectApps.php: -------------------------------------------------------------------------------- 1 | setupSubresources( 9 | 'participants' 10 | ); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/AuthorizedConnectApps.php: -------------------------------------------------------------------------------- 1 | $name 10 | ) + $params); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/OutgoingCallerIds.php: -------------------------------------------------------------------------------- 1 | $phoneNumber, 10 | ) + $params); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Participants.php: -------------------------------------------------------------------------------- 1 | account->transcriptions as $t) { 12 | print $t->transcription_text; 13 | } 14 | -------------------------------------------------------------------------------- /travel.php: -------------------------------------------------------------------------------- 1 | rows[0]->elements[0]->duration->text; 9 | 10 | echo json_encode(array('time' => $time)); -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/rest/notifications.rst: -------------------------------------------------------------------------------- 1 | =============== 2 | Notifications 3 | =============== 4 | 5 | Filter Notifications by Log Level 6 | ================================= 7 | 8 | .. code-block:: php 9 | 10 | $client = new Services_Twilio('AC123', '123'); 11 | foreach ($client->account->notifications->getIterator(0, 50, array("LogLevel" => 0)) as $n) { 12 | print $n->error_code; 13 | } 14 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/SIPListResource.php: -------------------------------------------------------------------------------- 1 | $from, 14 | 'To' => $to, 15 | 'Body' => $body 16 | ) + $params); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Queues.php: -------------------------------------------------------------------------------- 1 | $friendly_name, 16 | ) + $params); 17 | } 18 | } 19 | 20 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Sip.php: -------------------------------------------------------------------------------- 1 | setupSubresources( 10 | 'domains', 11 | 'ip_access_control_lists', 12 | 'credential_lists' 13 | ); 14 | } 15 | 16 | public function getResourceName($camelized = false) { 17 | return "SIP"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/NotificationTest.php: -------------------------------------------------------------------------------- 1 | shouldReceive('delete')->once() 9 | ->with('/2010-04-01/Accounts/AC123/Notifications/NO123.json') 10 | ->andReturn(array(204, array(), '')); 11 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 12 | $client->account->notifications->delete('NO123'); 13 | } 14 | 15 | function tearDown() 16 | { 17 | m::close(); 18 | } 19 | } 20 | 21 | -------------------------------------------------------------------------------- /includes/twilio-php/AUTHORS.md: -------------------------------------------------------------------------------- 1 | Authors 2 | ======= 3 | 4 | A huge thanks to all of our contributors: 5 | 6 | 7 | - =noloh 8 | - Adam Ballai 9 | - Alex Chan 10 | - Alex Rowley 11 | - Brett Gerry 12 | - Bulat Shakirzyanov 13 | - Chris Barr 14 | - D Keith Casey Jr 15 | - D. Keith Casey, Jr. 16 | - Doug Black 17 | - John Britton 18 | - Jordi Boggiano 19 | - Keith Casey 20 | - Kevin Burke 21 | - Kyle 22 | - Kyle Conroy 23 | - Luke Waite 24 | - Neuman 25 | - Neuman Vong 26 | - Peter Meth 27 | - Ryan Brideau 28 | - Sam Kimbrel 29 | - Shawn Parker 30 | - Stuart Langley 31 | - Taichiro Yoshida 32 | - Trenton McManus 33 | - aaronfoss 34 | - sashalaundy 35 | - till 36 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/_themes/kr/relations.html: -------------------------------------------------------------------------------- 1 |

Related Topics

2 | 20 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Member.php: -------------------------------------------------------------------------------- 1 | $url, 19 | 'Method' => $method, 20 | )); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Calls.php: -------------------------------------------------------------------------------- 1 | ` information is really easy: 9 | 10 | .. code-block:: php 11 | 12 | $client = new Services_Twilio('AC123', '123'); 13 | $account = $client->account; 14 | $account->update(array('FriendlyName' => 'My Awesome Account')); 15 | 16 | Creating a Subaccount 17 | ============================== 18 | 19 | .. code-block:: php 20 | 21 | $client = new Services_Twilio('AC123', '123'); 22 | $subaccount = $client->accounts->create(array( 23 | 'FriendlyName' => 'My Awesome SubAccount' 24 | )); 25 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Credential.php: -------------------------------------------------------------------------------- 1 | register(); 23 | 24 | require_once 'Twilio.php'; 25 | 26 | unset($root, $library, $tests, $path); 27 | 28 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/CallsTest.php: -------------------------------------------------------------------------------- 1 | assertEquals($expected, $result); 13 | } 14 | 15 | function sidProvider() 16 | { 17 | return array( 18 | array("AP2a0747eba6abf96b7e3c3ff0b4530f6e", true), 19 | array("CA2a0747eba6abf96b7e3c3ff0b4530f6e", false), 20 | array("AP2a0747eba6abf96b7e3c3ff0b4530f", false), 21 | array("http://www.google.com/asdfasdfAP", false), 22 | ); 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/UsageResource.php: -------------------------------------------------------------------------------- 1 | 6 | * @license http://creativecommons.org/licenses/MIT/ MIT 7 | * @link http://pear.php.net/package/Services_Twilio 8 | */ 9 | class Services_Twilio_UsageResource extends Services_Twilio_ListResource { 10 | public function getResourceName($camelized = false) { 11 | $this->instance_name = 'Services_Twilio_Rest_UsageRecord'; 12 | return $camelized ? 'UsageRecords' : 'usage_records'; 13 | } 14 | 15 | public function __construct($client, $uri) { 16 | $uri = preg_replace("#UsageRecords#", "Usage/Records", $uri); 17 | parent::__construct($client, $uri); 18 | } 19 | } 20 | 21 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/ShortCodesTest.php: -------------------------------------------------------------------------------- 1 | shouldReceive('get')->once() 10 | ->with('/2010-04-01/Accounts/AC123/SMS/ShortCodes/SC123.json') 11 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 12 | json_encode(array('sid' => 'SC123', 'short_code' => '1234')) 13 | )); 14 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 15 | $sms = $client->account->short_codes->get('SC123'); 16 | $this->assertSame('1234', $sms->short_code); 17 | } 18 | } 19 | 20 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/_themes/kr_small/layout.html: -------------------------------------------------------------------------------- 1 | {% extends "basic/layout.html" %} 2 | {% block header %} 3 | {{ super() }} 4 | {% if pagename == 'index' %} 5 |
6 | {% endif %} 7 | {% endblock %} 8 | {% block footer %} 9 | {% if pagename == 'index' %} 10 |
11 | {% endif %} 12 | {% endblock %} 13 | {# do not display relbars #} 14 | {% block relbar1 %}{% endblock %} 15 | {% block relbar2 %} 16 | {% if theme_github_fork %} 17 | Fork me on GitHub 19 | {% endif %} 20 | {% endblock %} 21 | {% block sidebar1 %}{% endblock %} 22 | {% block sidebar2 %}{% endblock %} 23 | -------------------------------------------------------------------------------- /includes/twilio-php/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twilio/sdk", 3 | "type": "library", 4 | "description": "A PHP wrapper for Twilio's API", 5 | "keywords": ["twilio", "sms", "api"], 6 | "homepage": "http://github.com/twilio/twilio-php", 7 | "license": "MIT", 8 | "authors": [ 9 | { 10 | "name": "Kevin Burke", 11 | "email": "kevin@twilio.com" 12 | }, 13 | { 14 | "name": "Kyle Conroy", 15 | "email": "kyle+pear@twilio.com" 16 | } 17 | ], 18 | "require": { 19 | "php": ">=5.2.1" 20 | }, 21 | "require-dev": { 22 | "mockery/mockery": ">=0.7.2", 23 | "phpunit/phpunit": "3.7.*" 24 | }, 25 | "autoload": { 26 | "psr-0": { 27 | "Services_Twilio": "" 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/CredentialLists.php: -------------------------------------------------------------------------------- 1 | account->sip->credential_lists->create("MyFriendlyName"); 13 | * 14 | * :param string $friendly_name: the friendly name of this credential list 15 | * :param array $params: a single array of parameters which is serialized and 16 | * sent directly to the Twilio API. 17 | */ 18 | public function create($friendly_name, $params = array()) { 19 | return parent::_create(array( 20 | 'FriendlyName' => $friendly_name, 21 | ) + $params); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/IpAddress.php: -------------------------------------------------------------------------------- 1 | account->outgoing_caller_ids->create('+15554441234'); 13 | print $response->validation_code; 14 | 15 | Twilio will call the provided number and for the validation code to be entered. 16 | 17 | Listing all Validated Phone Numbers 18 | =================================== 19 | 20 | Show all the current caller_ids: 21 | 22 | .. code-block:: php 23 | 24 | $client = new Services_Twilio('AC123', '123'); 25 | foreach ($client->account->outgoing_caller_ids as $caller_id) { 26 | print $caller_id->friendly_name; 27 | } 28 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Accounts.php: -------------------------------------------------------------------------------- 1 | `_ documentation. 6 | */ 7 | class Services_Twilio_Rest_Accounts extends Services_Twilio_ListResource { 8 | 9 | /** 10 | * Create a new subaccount. 11 | * 12 | * :param array $params: An array of parameters describing the new 13 | * subaccount. The ``$params`` array can contain the following keys: 14 | * 15 | * *FriendlyName* 16 | * A description of this account, up to 64 characters long 17 | * 18 | * :returns: The new subaccount 19 | * :rtype: :php:class:`Services_Twilio_Rest_Account` 20 | * 21 | */ 22 | public function create($params = array()) { 23 | return parent::_create($params); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/CredentialListMapping.php: -------------------------------------------------------------------------------- 1 | setupSubresources( 34 | 'credentials' 35 | ); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /includes/master.inc.php: -------------------------------------------------------------------------------- 1 | setupSubresources( 33 | 'ip_addresses' 34 | ); 35 | } 36 | } 37 | 38 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/CredentialListMappings.php: -------------------------------------------------------------------------------- 1 | account->sip->domains->get('SDXXX')->credential_list_mappings->create("CLXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); 13 | * 14 | * :param string $credential_list_sid: the sid of the CredentialList you're adding to this domain. 15 | * :param array $params: a single array of parameters which is serialized and 16 | * sent directly to the Twilio API. 17 | */ 18 | public function create($credential_list_sid, $params = array()) { 19 | return parent::_create(array( 20 | 'CredentialListSid' => $credential_list_sid, 21 | ) + $params); 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/SandboxTest.php: -------------------------------------------------------------------------------- 1 | 'application/x-www-form-urlencoded'); 7 | function testUpdateVoiceUrl() 8 | { 9 | $http = m::mock(new Services_Twilio_TinyHttp); 10 | $http->shouldReceive('post')->once() 11 | ->with('/2010-04-01/Accounts/AC123/Sandbox.json', $this->formHeaders, 'VoiceUrl=foo') 12 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 13 | json_encode(array('voice_url' => 'foo')) 14 | )); 15 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 16 | $client->account->sandbox->update('VoiceUrl', 'foo'); 17 | $this->assertEquals('foo', $client->account->sandbox->voice_url); 18 | } 19 | 20 | function tearDown() { 21 | m::close(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/quickstart.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | Quickstart 3 | ============= 4 | 5 | Making a Call 6 | ============== 7 | 8 | .. code-block:: php 9 | 10 | $sid = "ACXXXXXX"; // Your Twilio account sid 11 | $token = "YYYYYY"; // Your Twilio auth token 12 | 13 | $client = new Services_Twilio($sid, $token); 14 | $call = $client->account->calls->create( 15 | '9991231234', // From this number 16 | '8881231234', // Call this number 17 | 'http://foo.com/call.xml' 18 | ); 19 | 20 | Generating TwiML 21 | ================== 22 | 23 | To control phone calls, your application need to output TwiML. Use :class:`Services_Twilio_Twiml` to easily create such responses. 24 | 25 | .. code-block:: php 26 | 27 | $response = new Services_Twilio_Twiml(); 28 | $response->say('Hello'); 29 | print $response; 30 | 31 | .. code-block:: xml 32 | 33 | 34 | monkey.mp3 35 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Domains.php: -------------------------------------------------------------------------------- 1 | account->sip->domains->create( 13 | * "MyFriendlyName", "MyDomainName" 14 | * ); 15 | * 16 | * :param string $friendly_name: the friendly name of this domain 17 | * :param string $domain_name: the domain name for this domain 18 | * :param array $params: a single array of parameters which is serialized and 19 | * sent directly to the Twilio API. 20 | */ 21 | public function create($friendly_name, $domain_name, $params = array()) { 22 | return parent::_create(array( 23 | 'FriendlyName' => $friendly_name, 24 | 'DomainName' => $domain_name, 25 | ) + $params); 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/IpAccessControlLists.php: -------------------------------------------------------------------------------- 1 | account->sip->ip_access_control_lists->create("MyFriendlyName"); 13 | * 14 | * :param string $friendly_name: the friendly name of this ip access control list 15 | * :param array $params: a single array of parameters which is serialized and 16 | * sent directly to the Twilio API. 17 | * :return: the created list 18 | * :rtype: :class:`Services_Twilio_Rest_IpAccessControlList` 19 | * 20 | */ 21 | public function create($friendly_name, $params = array()) { 22 | return parent::_create(array( 23 | 'FriendlyName' => $friendly_name, 24 | ) + $params); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/AccountsTest.php: -------------------------------------------------------------------------------- 1 | 'application/x-www-form-urlencoded'); 8 | function testPost() 9 | { 10 | $http = m::mock(new Services_Twilio_TinyHttp); 11 | $http->shouldReceive('post')->once() 12 | ->with('/2010-04-01/Accounts.json', 13 | $this->formHeaders, 'FriendlyName=foo') 14 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 15 | json_encode(array('sid' => 'AC345')) 16 | )); 17 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 18 | $account = $client->accounts->create(array( 19 | 'FriendlyName' => 'foo', 20 | )); 21 | $this->assertEquals('AC345', $account->sid); 22 | } 23 | 24 | function tearDown() 25 | { 26 | m::close(); 27 | } 28 | } 29 | 30 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/IpAccessControlListMappings.php: -------------------------------------------------------------------------------- 1 | account->sip->domains->get('SDXXX')->ip_access_control_list_mappings->create("ALXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); 13 | * 14 | * :param string $ip_access_control_list_sid: the sid of the IpAccessControList 15 | * you're adding to this domain. 16 | * :param array $params: a single array of parameters which is serialized and 17 | * sent directly to the Twilio API. 18 | */ 19 | public function create($ip_access_control_list_sid, $params = array()) { 20 | return parent::_create(array( 21 | 'IpAccessControlListSid' => $ip_access_control_list_sid, 22 | ) + $params); 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Credentials.php: -------------------------------------------------------------------------------- 1 | account->sip->credential_lists->get('CLXXX')->credentials->create( 13 | * "AwesomeUsername", "SuperSecretPassword", 14 | * ); 15 | * 16 | * :param string $username: the username for the new Credential object 17 | * :param string $password: the password for the new Credential object 18 | * :param array $params: a single array of parameters which is serialized and 19 | * sent directly to the Twilio API. 20 | */ 21 | public function create($username, $password, $params = array()) { 22 | return parent::_create(array( 23 | 'Username' => $username, 24 | 'Password' => $password, 25 | ) + $params); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Members.php: -------------------------------------------------------------------------------- 1 | instance_name($this->client, $this->uri . '/Front'); 15 | } 16 | 17 | /* Participants are identified by CallSid, not like ME123 */ 18 | public function getObjectFromJson($params, $idParam = 'sid') { 19 | return parent::getObjectFromJson($params, 'call_sid'); 20 | } 21 | 22 | public function getResourceName($camelized = false) 23 | { 24 | // The JSON property name is atypical. 25 | return $camelized ? 'Members' : 'queue_members'; 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Account.php: -------------------------------------------------------------------------------- 1 | setupSubresources( 7 | 'applications', 8 | 'available_phone_numbers', 9 | 'outgoing_caller_ids', 10 | 'calls', 11 | 'conferences', 12 | 'incoming_phone_numbers', 13 | 'media', 14 | 'messages', 15 | 'notifications', 16 | 'outgoing_callerids', 17 | 'recordings', 18 | 'sms_messages', 19 | 'short_codes', 20 | 'transcriptions', 21 | 'connect_apps', 22 | 'authorized_connect_apps', 23 | 'usage_records', 24 | 'usage_triggers', 25 | 'queues', 26 | 'sip' 27 | ); 28 | 29 | $this->sandbox = new Services_Twilio_Rest_Sandbox( 30 | $client, $uri . '/Sandbox' 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/ApplicationsTest.php: -------------------------------------------------------------------------------- 1 | 'application/x-www-form-urlencoded'); 7 | function testPost() 8 | { 9 | $http = m::mock(new Services_Twilio_TinyHttp); 10 | $http->shouldReceive('post')->once() 11 | ->with('/2010-04-01/Accounts/AC123/Applications.json', 12 | $this->formHeaders, 'FriendlyName=foo&VoiceUrl=bar') 13 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 14 | json_encode(array('sid' => 'AP123')) 15 | )); 16 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 17 | $app = $client->account->applications->create('foo', array( 18 | 'VoiceUrl' => 'bar', 19 | )); 20 | $this->assertEquals('AP123', $app->sid); 21 | } 22 | 23 | function tearDown() 24 | { 25 | m::close(); 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/CredentialList.php: -------------------------------------------------------------------------------- 1 | setupSubresources( 38 | 'credentials' 39 | ); 40 | } 41 | } 42 | 43 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/QueuesTest.php: -------------------------------------------------------------------------------- 1 | 'application/x-www-form-urlencoded'); 8 | 9 | function testCreate() { 10 | $http = m::mock(new Services_Twilio_TinyHttp); 11 | $http->shouldReceive('post')->once() 12 | ->with('/2010-04-01/Accounts/AC123/Queues.json', $this->formHeaders, 13 | 'FriendlyName=foo&MaxSize=123') 14 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 15 | json_encode(array('sid' => 'QQ123', 'average_wait_time' => 0)) 16 | )); 17 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 18 | $queue = $client->account->queues->create('foo', 19 | array('MaxSize' => 123)); 20 | $this->assertSame($queue->sid, 'QQ123'); 21 | $this->assertSame($queue->average_wait_time, 0); 22 | } 23 | 24 | function tearDown() { 25 | m::close(); 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/MediaInstance.php: -------------------------------------------------------------------------------- 1 | `_. 6 | * 7 | * .. php:attr:: sid 8 | * 9 | * A 34 character string that identifies this object 10 | * 11 | * .. php:attr:: account_sid 12 | * 13 | * A 34 character string representing the account that sent the message 14 | * 15 | * .. php:attr:: parent_sid 16 | * 17 | * The sid of the message that created this media. 18 | * 19 | * .. php:attr:: date_created 20 | * 21 | * The date the message was created 22 | * 23 | * .. php:attr:: date_updated 24 | * 25 | * The date the message was updated 26 | * 27 | * .. php:attr:: content_type 28 | * 29 | * The content-type of the media. 30 | */ 31 | class Services_Twilio_Rest_MediaInstance extends Services_Twilio_InstanceResource { 32 | public function __construct($client, $uri) { 33 | $uri = str_replace('MediaInstance', 'Media', $uri); 34 | parent::__construct($client, $uri); 35 | } 36 | } 37 | 38 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Media.php: -------------------------------------------------------------------------------- 1 | ` objects. 5 | * For the definitive reference, see the `Twilio Media List Documentation 6 | * `_. 7 | */ 8 | class Services_Twilio_Rest_Media extends Services_Twilio_ListResource { 9 | 10 | 11 | // This is overridden because the list key in the Twilio response 12 | // is "media_list", not "media". 13 | public function getResourceName($camelized = false) 14 | { 15 | if ($camelized) { 16 | return "MediaList"; 17 | } else { 18 | return "media_list"; 19 | } 20 | } 21 | 22 | // We manually set the instance name here so that the parent 23 | // constructor doesn't attempt to figure out it. It would do it 24 | // incorrectly because we override getResourceName above. 25 | public function __construct($client, $uri) { 26 | $this->instance_name = "Services_Twilio_Rest_MediaInstance"; 27 | parent::__construct($client, $uri); 28 | } 29 | 30 | } 31 | 32 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/IpAccessControlList.php: -------------------------------------------------------------------------------- 1 | setupSubresources( 37 | 'ip_addresses' 38 | ); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/RequestValidator.php: -------------------------------------------------------------------------------- 1 | AuthToken = $token; 11 | } 12 | 13 | public function computeSignature($url, $data = array()) 14 | { 15 | // sort the array by keys 16 | ksort($data); 17 | 18 | // append them to the data string in order 19 | // with no delimiters 20 | foreach($data as $key => $value) 21 | $url .= "$key$value"; 22 | 23 | // This function calculates the HMAC hash of the data with the key 24 | // passed in 25 | // Note: hash_hmac requires PHP 5 >= 5.1.2 or PECL hash:1.1-1.5 26 | // Or http://pear.php.net/package/Crypt_HMAC/ 27 | return base64_encode(hash_hmac("sha1", $url, $this->AuthToken, true)); 28 | } 29 | 30 | public function validate($expectedSignature, $url, $data = array()) 31 | { 32 | return $this->computeSignature($url, $data) 33 | == $expectedSignature; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/MediaTest.php: -------------------------------------------------------------------------------- 1 | shouldReceive('get')->once() 10 | ->with('/2010-04-01/Accounts/AC123/Messages/MM123/Media.json?Page=0&PageSize=50') 11 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 12 | json_encode(array( 13 | 'end' => '0', 14 | 'total' => '2', 15 | 'media_list' => array( 16 | array('sid' => 'ME123'), 17 | array('sid' => 'ME456') 18 | ), 19 | 'next_page_uri' => 'null', 20 | 'start' => 0 21 | )) 22 | )); 23 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 24 | $media_list = $client->account->messages->get('MM123')->media->getPage()->getItems(); 25 | $this->assertEquals(count($media_list), 2); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/UsageRecords.php: -------------------------------------------------------------------------------- 1 | setupSubresources( 7 | 'today', 8 | 'yesterday', 9 | 'all_time', 10 | 'this_month', 11 | 'last_month', 12 | 'daily', 13 | 'monthly', 14 | 'yearly' 15 | ); 16 | } 17 | } 18 | 19 | class Services_Twilio_Rest_Today extends Services_Twilio_TimeRangeResource { } 20 | 21 | class Services_Twilio_Rest_Yesterday extends Services_Twilio_TimeRangeResource { } 22 | 23 | class Services_Twilio_Rest_LastMonth extends Services_Twilio_TimeRangeResource { } 24 | 25 | class Services_Twilio_Rest_ThisMonth extends Services_Twilio_TimeRangeResource { } 26 | 27 | class Services_Twilio_Rest_AllTime extends Services_Twilio_TimeRangeResource { } 28 | 29 | class Services_Twilio_Rest_Daily extends Services_Twilio_UsageResource { } 30 | 31 | class Services_Twilio_Rest_Monthly extends Services_Twilio_UsageResource { } 32 | 33 | class Services_Twilio_Rest_Yearly extends Services_Twilio_UsageResource { } 34 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/IpAddresses.php: -------------------------------------------------------------------------------- 1 | instance_name = "Services_Twilio_Rest_IpAddress"; 7 | parent::__construct($client, $uri); 8 | } 9 | 10 | /** 11 | * Creates a new IpAddress instance 12 | * 13 | * Example usage: 14 | * 15 | * .. code-block:: php 16 | * 17 | * $client->account->sip->ip_access_control_lists->get('ALXXX')->ip_addresses->create( 18 | * "FriendlyName", "127.0.0.1" 19 | * ); 20 | * 21 | * :param string $friendly_name: the friendly name for the new IpAddress object 22 | * :param string $ip_address: the ip address for the new IpAddress object 23 | * :param array $params: a single array of parameters which is serialized and 24 | * sent directly to the Twilio API. 25 | */ 26 | public function create($friendly_name, $ip_address, $params = array()) { 27 | return parent::_create(array( 28 | 'FriendlyName' => $friendly_name, 29 | 'IpAddress' => $ip_address, 30 | ) + $params); 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /includes/twilio-php/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (C) 2011, Twilio, Inc. 4 | Copyright (C) 2011, Neuman Vong 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy of 7 | this software and associated documentation files (the "Software"), to deal in 8 | the Software without restriction, including without limitation the rights to 9 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 10 | of the Software, and to permit persons to whom the Software is furnished to do 11 | so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/NumberType.php: -------------------------------------------------------------------------------- 1 | instance_name = 'Services_Twilio_Rest_IncomingPhoneNumber'; 7 | return $camelized ? 'IncomingPhoneNumbers' : 'incoming_phone_numbers'; 8 | } 9 | 10 | /** 11 | * Purchase a new phone number. 12 | * 13 | * Example usage: 14 | * 15 | * .. code-block:: php 16 | * 17 | * $marlosBurner = '+14105551234'; 18 | * $client->account->incoming_phone_numbers->local->purchase($marlosBurner); 19 | * 20 | * :param string $phone_number: The phone number to purchase 21 | * :param array $params: An optional array of parameters to pass along with 22 | * the request (to configure the phone number) 23 | */ 24 | public function purchase($phone_number, array $params = array()) { 25 | $postParams = array( 26 | 'PhoneNumber' => $phone_number 27 | ); 28 | return $this->create($postParams + $params); 29 | } 30 | 31 | public function create(array $params = array()) { 32 | return parent::_create($params); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/PartialApplicationHelper.php: -------------------------------------------------------------------------------- 1 | 10 | * @license http://creativecommons.org/licenses/MIT/ MIT 11 | * @link http://pear.php.net/package/Services_Twilio 12 | */ 13 | class Services_Twilio_PartialApplicationHelper 14 | { 15 | private $callbacks; 16 | 17 | public function __construct() 18 | { 19 | $this->callbacks = array(); 20 | } 21 | 22 | public function set($method, $callback, array $args) 23 | { 24 | if (!is_callable($callback)) { 25 | return FALSE; 26 | } 27 | $this->callbacks[$method] = array($callback, $args); 28 | } 29 | 30 | public function __call($method, $args) 31 | { 32 | if (!isset($this->callbacks[$method])) { 33 | throw new Exception("Method not found: $method"); 34 | } 35 | list($callback, $cb_args) = $this->callbacks[$method]; 36 | return call_user_func_array( 37 | $callback, 38 | array_merge($cb_args, $args) 39 | ); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HomeAway 2 | A collection of PHP scripts I use for controlling my house via [GeoHooks.io](https://geohooks.io) 3 | 4 | These scripts are all called based on changes in my family's location via [GeoHooks](https://geohooks.io). 5 | 6 | ## Setup 7 | 8 | 1. Rename `SAMPLE-config.inc.php` to `config.inc.php`. 9 | 2. Edit `config.inc.php` and insert your own various API keys, etc. 10 | 3. Host these scripts at a public URL where GeoHooks can ping them. 11 | 12 | ## Scripts 13 | 14 | `nest.php` - accepts a single `GET` parameter `away`. If set to `0`, it sets your Nest (and Dropcam) to home. 15 | If set to `1` it sets them to away. 16 | 17 | `sms.php` - takes the `GET` parameters `to` and `msg` and sends the contents of `msg` as an SMS to the phone number 18 | listed in `to`. I use this to send arbitrary commands to [IFTTT](http://ifttt.com)'s phone number. For example, this 19 | allows me to tell IFTTT to turn off the lights in my house. It saves me from having to write my own library to 20 | access my lights' API. You'll just need to add your Twilio API keys to start sending texts. 21 | 22 | `travel.php` - uses the Google Maps Distance API to return the drive time between two locations. The two locations 23 | are currently hard coded in `config.inc.php`, but you can change them to `GET` parameters easily enough. 24 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/TimeRangeResource.php: -------------------------------------------------------------------------------- 1 | 6 | * @license http://creativecommons.org/licenses/MIT/ MIT 7 | * @link http://pear.php.net/package/Services_Twilio 8 | */ 9 | class Services_Twilio_TimeRangeResource extends Services_Twilio_UsageResource { 10 | 11 | /** 12 | * Return a UsageRecord corresponding to the given category. 13 | * 14 | * @param string $category The category of usage to retrieve. For a full 15 | * list of valid categories, please see the documentation at 16 | * http://www.twilio.com/docs/api/rest/usage-records#usage-all-categories 17 | * @return Services_Twilio_Rest_UsageRecord 18 | * @throws Services_Twilio_RestException 19 | */ 20 | public function getCategory($category) { 21 | $page = $this->getPage(0, 1, array( 22 | 'Category' => $category, 23 | )); 24 | $items = $page->getItems(); 25 | if (!is_array($items) || count($items) === 0) { 26 | throw new Services_Twilio_RestException( 27 | 400, "Usage record data is unformattable."); 28 | } 29 | return $items[0]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/RestException.php: -------------------------------------------------------------------------------- 1 | status = $status; 27 | $this->info = $info; 28 | parent::__construct($message, $code); 29 | } 30 | 31 | /** 32 | * Get the HTTP status code 33 | */ 34 | public function getStatus() { 35 | return $this->status; 36 | } 37 | 38 | /** 39 | * Get a link to more information 40 | */ 41 | public function getInfo() { 42 | return $this->info; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Message.php: -------------------------------------------------------------------------------- 1 | setupSubresources( 49 | 'media' 50 | ); 51 | } 52 | } 53 | 54 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/_themes/kr/static/small_flask.css: -------------------------------------------------------------------------------- 1 | /* 2 | * small_flask.css_t 3 | * ~~~~~~~~~~~~~~~~~ 4 | * 5 | * :copyright: Copyright 2010 by Armin Ronacher. 6 | * :license: Flask Design License, see LICENSE for details. 7 | */ 8 | 9 | body { 10 | margin: 0; 11 | padding: 20px 30px; 12 | } 13 | 14 | div.documentwrapper { 15 | float: none; 16 | background: white; 17 | } 18 | 19 | div.sphinxsidebar { 20 | display: block; 21 | float: none; 22 | width: 102.5%; 23 | margin: 50px -30px -20px -30px; 24 | padding: 10px 20px; 25 | background: #333; 26 | color: white; 27 | } 28 | 29 | div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, 30 | div.sphinxsidebar h3 a { 31 | color: white; 32 | } 33 | 34 | div.sphinxsidebar a { 35 | color: #aaa; 36 | } 37 | 38 | div.sphinxsidebar p.logo { 39 | display: none; 40 | } 41 | 42 | div.document { 43 | width: 100%; 44 | margin: 0; 45 | } 46 | 47 | div.related { 48 | display: block; 49 | margin: 0; 50 | padding: 10px 0 20px 0; 51 | } 52 | 53 | div.related ul, 54 | div.related ul li { 55 | margin: 0; 56 | padding: 0; 57 | } 58 | 59 | div.footer { 60 | display: none; 61 | } 62 | 63 | div.bodywrapper { 64 | margin: 0; 65 | } 66 | 67 | div.body { 68 | min-height: 0; 69 | padding: 0; 70 | } 71 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/OutgoingCallerIdsTest.php: -------------------------------------------------------------------------------- 1 | 'application/x-www-form-urlencoded'); 7 | function testPost() { 8 | $http = m::mock(new Services_Twilio_TinyHttp); 9 | $http->shouldReceive('post')->once() 10 | ->with('/2010-04-01/Accounts/AC123/OutgoingCallerIds.json', 11 | $this->formHeaders, 'PhoneNumber=%2B14158675309&FriendlyName=My+Home+Phone+Number') 12 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 13 | json_encode(array( 14 | 'account_sid' => 'AC123', 15 | 'phone_number' => '+14158675309', 16 | 'friendly_name' => 'My Home Phone Number', 17 | 'validation_code' => 123456, 18 | )) 19 | )); 20 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 21 | $request = $client->account->outgoing_caller_ids->create('+14158675309', array( 22 | 'FriendlyName' => 'My Home Phone Number', 23 | )); 24 | $this->assertEquals(123456, $request->validation_code); 25 | } 26 | 27 | function tearDown() { 28 | m::close(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/UsageTriggers.php: -------------------------------------------------------------------------------- 1 | `_. 13 | * @param string $value Fire the trigger when usage crosses this value. 14 | * @param string $url The URL to request when the trigger fires. 15 | * @param array $params Optional parameters for this trigger. A full list of parameters can be found in the `Usage Trigger documentation `_. 16 | * @return Services_Twilio_Rest_UsageTrigger The created trigger 17 | */ 18 | function create($category, $value, $url, array $params = array()) { 19 | return parent::_create(array( 20 | 'UsageCategory' => $category, 21 | 'TriggerValue' => $value, 22 | 'CallbackUrl' => $url, 23 | ) + $params); 24 | } 25 | 26 | } 27 | 28 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/rest/members.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | Members 3 | ============= 4 | 5 | List All Members in a Queue 6 | ============================ 7 | 8 | Each queue instance resource has a list of members. 9 | 10 | .. code-block:: php 11 | 12 | $client = new Services_Twilio('AC123', '123'); 13 | $queue_sid = 'QQ123'; 14 | $queue = $client->account->queues->get('QQ123'); 15 | foreach ($queue->members as $member) { 16 | echo "Call Sid: {$member->call_sid}\nWait Time: {$member->wait_time}\n"; 17 | } 18 | 19 | Dequeue a Member 20 | ================= 21 | 22 | .. code-block:: php 23 | 24 | $client = new Services_Twilio('AC123', '123'); 25 | $queue = $client->account->queues->get('QQ123'); 26 | foreach ($queue->members as $member) { 27 | // Dequeue the first member and fetch the Forward twimlet for that 28 | // member. 29 | $member->dequeue('http://twimlets.com/forward', 'GET'); 30 | break; 31 | } 32 | 33 | Retrieve the Member at the Front of a Queue 34 | =========================================== 35 | 36 | The Members class has a method called ``front`` which can be used to retrieve 37 | the member at the front of the queue. 38 | 39 | .. code-block:: php 40 | 41 | $client = new Services_Twilio('AC123', '123'); 42 | $queue = $client->account->queues->get('QQ123'); 43 | $firstMember = $queue->members->front(); 44 | echo $firstMember->position; 45 | echo $firstMember->call_sid; 46 | 47 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/_themes/kr/layout.html: -------------------------------------------------------------------------------- 1 | {%- extends "basic/layout.html" %} 2 | {%- block extrahead %} 3 | {{ super() }} 4 | {% if theme_touch_icon %} 5 | 6 | {% endif %} 7 | 9 | {% endblock %} 10 | {%- block relbar2 %}{% endblock %} 11 | {%- block footer %} 12 | 15 | 28 | 29 | Fork me on GitHub 30 | 31 | 32 | {%- endblock %} 33 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/rest/sms-messages.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | SMS Messages 3 | ============= 4 | 5 | Sending a SMS Message 6 | ===================== 7 | 8 | 9 | The :php:class:`Services_Twilio_Rest_SmsMessages` resource allows you to send 10 | outgoing text messages. 11 | 12 | .. code-block:: php 13 | 14 | require('/path/to/twilio-php/Services/Twilio.php'); 15 | 16 | $client = new Services_Twilio('AC123', '123'); 17 | $message = $client->account->sms_messages->create( 18 | '+14085551234', // From a Twilio number in your account 19 | '+12125551234', // Text any number 20 | "Hello monkey!" 21 | ); 22 | 23 | print $message->sid; 24 | 25 | Listing SMS Messages 26 | ==================== 27 | 28 | It's easy to iterate over your SMS messages. 29 | 30 | .. code-block:: php 31 | 32 | $client = new Services_Twilio('AC123', '123'); 33 | foreach ($client->account->sms_messages as $message) { 34 | echo "From: {$message->from}\nTo: {$message->to}\nBody: " . $message->body; 35 | } 36 | 37 | Filtering SMS Messages 38 | ====================== 39 | 40 | Let's say you want to find all of the SMS messages that have been sent from 41 | a particular number. You can do so by constructing an iterator explicitly: 42 | 43 | .. code-block:: php 44 | 45 | $client = new Services_Twilio('AC123', '123'); 46 | foreach ($client->account->sms_messages->getIterator(0, 50, array( 47 | 'From' => '+14105551234', 48 | )) as $message) { 49 | echo "From: {$message->from}\nTo: {$message->to}\nBody: " . $message->body; 50 | } 51 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/BuildQueryTest.php: -------------------------------------------------------------------------------- 1 | 'bar', 10 | 'baz' => 'bin', 11 | ); 12 | 13 | $this->assertEquals(Services_Twilio::buildQuery($data), 'foo=bar&baz=bin'); 14 | } 15 | 16 | public function testSameKey() { 17 | $data = array( 18 | 'foo' => array( 19 | 'bar', 20 | 'baz', 21 | 'bin', 22 | ), 23 | 'boo' => 'bah', 24 | ); 25 | 26 | $this->assertEquals(Services_Twilio::buildQuery($data), 27 | 'foo=bar&foo=baz&foo=bin&boo=bah'); 28 | } 29 | 30 | public function testKeylessData() { 31 | $data = array( 32 | 'bar', 33 | 'baz', 34 | 'bin', 35 | ); 36 | 37 | $this->assertEquals(Services_Twilio::buildQuery($data), '0=bar&1=baz&2=bin'); 38 | } 39 | 40 | public function testKeylessDataPrefix() { 41 | $data = array( 42 | 'bar', 43 | 'baz', 44 | 'bin', 45 | ); 46 | 47 | $this->assertEquals(Services_Twilio::buildQuery($data, 'var'), 'var0=bar&var1=baz&var2=bin'); 48 | } 49 | 50 | public function testQualifiedUserAgent() { 51 | $expected = Services_Twilio::USER_AGENT . " (php 5.4)"; 52 | $this->assertEquals(Services_Twilio::qualifiedUserAgent("5.4"), $expected); 53 | } 54 | 55 | } 56 | 57 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/rest/applications.rst: -------------------------------------------------------------------------------- 1 | ================== 2 | Applications 3 | ================== 4 | 5 | Creating Applications 6 | ============================== 7 | 8 | .. code-block:: php 9 | 10 | $client = new Services_Twilio('AC123', '123'); 11 | $application = $client->account->applications->create('Application Friendly Name', 12 | array( 13 | 'FriendlyName' => 'My Application Name', 14 | 'VoiceUrl' => 'http://foo.com/voice/url', 15 | 'VoiceFallbackUrl' => 'http://foo.com/voice/fallback/url', 16 | 'VoiceMethod' => 'POST', 17 | 'SmsUrl' => 'http://foo.com/sms/url', 18 | 'SmsFallbackUrl' => 'http://foo.com/sms/fallback/url', 19 | 'SmsMethod' => 'POST' 20 | ) 21 | ); 22 | 23 | 24 | Updating An Application 25 | ============================== 26 | 27 | .. code-block:: php 28 | 29 | $client = new Services_Twilio('AC123', '123'); 30 | $application = $client->account->applications->get('AP123'); 31 | $application->update(array( 32 | 'VoiceUrl' => 'http://foo.com/new/voice/url' 33 | )); 34 | 35 | 36 | Finding an Application by Name 37 | ============================== 38 | 39 | Find an :class:`Application` by its name (full name match). 40 | 41 | .. code-block:: php 42 | 43 | $client = new Services_Twilio('AC123', '123'); 44 | $application = false; 45 | $params = array( 46 | 'FriendlyName' => 'My Application Name' 47 | ); 48 | foreach($client->account->applications->getIterator(0, 1, $params) as $_application) { 49 | $application = $_application; 50 | } -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/rest/conferences.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | Conferences 3 | ============= 4 | 5 | List All Conferences 6 | ==================== 7 | 8 | .. code-block:: php 9 | 10 | $client = new Services_Twilio('AC123', '123'); 11 | foreach ($client->account->conferences as $conference) { 12 | print $conference->friendly_name; 13 | } 14 | 15 | For a full list of properties available on a conference, as well as a full list 16 | of ways to filter a conference, please see the `Conference API Documentation 17 | `_ on our website. 18 | 19 | Filter Conferences by Status 20 | ============================ 21 | 22 | .. code-block:: php 23 | 24 | $client = new Services_Twilio('AC123', '123'); 25 | foreach ($client->account->conferences->getIterator(0, 50, array( 26 | 'Status' => 'in-progress' 27 | )) as $conf) { 28 | print $conf->sid; 29 | } 30 | 31 | Mute all participants 32 | ===================== 33 | 34 | At the moment, using an iterator directly will cause this method to infinitely 35 | loop. Instead, use the getPage function. As conferences are limited to 40 36 | participants, getPage(0, 50) should return a list of every participant in 37 | a conference. 38 | 39 | .. code-block:: php 40 | 41 | $sid = "CO119231312"; 42 | $client = new Services_Twilio('AC123', '123'); 43 | $conference = $client->account->conferences->get($sid); 44 | $page = $conference->participants->getPage(0, 50); 45 | $participants = $page->participants; 46 | foreach ($participants as $p) { 47 | $p->mute(); 48 | } 49 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/rest/queues.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | Queues 3 | ============= 4 | 5 | Create a New Queue 6 | ===================== 7 | 8 | To create a new queue, make an HTTP POST request to the Queues resource. 9 | 10 | .. code-block:: php 11 | 12 | require('/path/to/twilio-php/Services/Twilio.php'); 13 | 14 | $client = new Services_Twilio('AC123', '123'); 15 | // Default MaxSize is 100. Or change it by adding a parameter, like so 16 | $queue = $client->account->queues->create('First Queue', 17 | array('MaxSize' => 10)); 18 | 19 | print $queue->sid; 20 | print $queue->friendly_name; 21 | 22 | Listing Queues 23 | ==================== 24 | 25 | It's easy to iterate over your list of queues. 26 | 27 | .. code-block:: php 28 | 29 | $client = new Services_Twilio('AC123', '123'); 30 | foreach ($client->account->queues as $queue) { 31 | echo $queue->sid; 32 | } 33 | 34 | Deleting Queues 35 | ==================== 36 | 37 | .. code-block:: php 38 | 39 | $client = new Services_Twilio('AC123', '123'); 40 | $queue_sid = 'QQ123'; 41 | $client->account->queues->delete('QQ123'); 42 | 43 | Retrieve the Member at the Front of a Queue 44 | =========================================== 45 | 46 | The Members class has a method called ``front`` which can be used to retrieve 47 | the member at the front of the queue. 48 | 49 | .. code-block:: php 50 | 51 | $client = new Services_Twilio('AC123', '123'); 52 | $queue = $client->account->queues->get('QQ123'); 53 | $firstMember = $queue->members->front(); 54 | echo $firstMember->position; 55 | echo $firstMember->call_sid; 56 | 57 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/rest/messages.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | Messages 3 | ============= 4 | 5 | Sending a Message 6 | ===================== 7 | 8 | The :class:`Messages ` resource allows you to 9 | send outgoing SMS or MMS messages. 10 | 11 | .. code-block:: php 12 | 13 | require('/path/to/twilio-php/Services/Twilio.php'); 14 | 15 | $client = new Services_Twilio('AC123', '123'); 16 | $message = $client->account->messages->sendMessage( 17 | '+14085551234', // From a Twilio number in your account 18 | '+12125551234', // Text any number 19 | 'Hello monkey!', // Message body (if any) 20 | array('http://example.com/image.jpg'), // An array of MediaUrls 21 | ); 22 | 23 | echo $message->sid; 24 | 25 | Listing Messages 26 | ==================== 27 | 28 | It's easy to iterate over your messages. 29 | 30 | .. code-block:: php 31 | 32 | $client = new Services_Twilio('AC123', '123'); 33 | foreach ($client->account->messages as $message) { 34 | echo "From: {$message->from}\nTo: {$message->to}\nBody: " . $message->body; 35 | } 36 | 37 | Filtering Messages 38 | ====================== 39 | 40 | Let's say you want to find all of the messages that have been sent from 41 | a particular number. You can do so by constructing an iterator explicitly: 42 | 43 | .. code-block:: php 44 | 45 | $client = new Services_Twilio('AC123', '123'); 46 | foreach ($client->account->messages->getIterator(0, 50, array( 47 | 'From' => '+14105551234', 48 | )) as $message) { 49 | echo "From: {$message->from}\nTo: {$message->to}\nBody: " . $message->body; 50 | } 51 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Page.php: -------------------------------------------------------------------------------- 1 | 9 | * @license http://creativecommons.org/licenses/MIT/ MIT 10 | * @link http://pear.php.net/package/Services_Twilio 11 | */ 12 | class Services_Twilio_Page 13 | implements IteratorAggregate 14 | { 15 | 16 | /** 17 | * The item list. 18 | * 19 | * @var array $items 20 | */ 21 | protected $items; 22 | 23 | /** 24 | * Constructs a page. 25 | * 26 | * @param object $page The page object 27 | * @param string $name The key of the item list 28 | */ 29 | public function __construct($page, $name, $next_page_uri = null) 30 | { 31 | $this->page = $page; 32 | $this->items = $page->{$name}; 33 | $this->next_page_uri = $next_page_uri; 34 | } 35 | 36 | /** 37 | * The item list of the page. 38 | * 39 | * @return array A list of instance resources 40 | */ 41 | public function getItems() 42 | { 43 | return $this->items; 44 | } 45 | 46 | /** 47 | * Magic method to allow retrieving the properties of the wrapped page. 48 | * 49 | * @param string $prop The property name 50 | * 51 | * @return mixed Could be anything 52 | */ 53 | public function __get($prop) 54 | { 55 | return $this->page->$prop; 56 | } 57 | 58 | /** 59 | * Implementation of IteratorAggregate::getIterator(). 60 | * 61 | * @return Traversable 62 | */ 63 | public function getIterator() 64 | { 65 | return $this->getItems(); 66 | } 67 | } 68 | 69 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/SMSMessagesTest.php: -------------------------------------------------------------------------------- 1 | 'application/x-www-form-urlencoded'); 7 | 8 | function testCreateMessage() { 9 | $http = m::mock(new Services_Twilio_TinyHttp); 10 | $http->shouldReceive('post')->once() 11 | ->with('/2010-04-01/Accounts/AC123/SMS/Messages.json', $this->formHeaders, 12 | 'From=%2B1222&To=%2B44123&Body=Hi+there') 13 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 14 | json_encode(array('sid' => 'SM123')) 15 | )); 16 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 17 | $sms = $client->account->sms_messages->create('+1222', '+44123', 'Hi there'); 18 | $this->assertSame('SM123', $sms->sid); 19 | } 20 | 21 | function testBadMessageThrowsException() { 22 | $this->setExpectedException('Services_Twilio_RestException'); 23 | $http = m::mock(new Services_Twilio_TinyHttp); 24 | $http->shouldReceive('post')->once() 25 | ->with('/2010-04-01/Accounts/AC123/SMS/Messages.json', $this->formHeaders, 26 | 'From=%2B1222&To=%2B44123&Body=' . str_repeat('hi', 81)) 27 | ->andReturn(array(400, array('Content-Type' => 'application/json'), 28 | json_encode(array( 29 | 'status' => '400', 30 | 'message' => 'Too long', 31 | )) 32 | )); 33 | $client = new Services_Twilio('AC123', '123', null, $http); 34 | $sms = $client->account->sms_messages->create('+1222', '+44123', 35 | str_repeat('hi', 81)); 36 | } 37 | } 38 | 39 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Domain.php: -------------------------------------------------------------------------------- 1 | setupSubresources( 66 | 'ip_access_control_list_mappings', 67 | 'credential_list_mappings' 68 | ); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/RequestValidatorTest.php: -------------------------------------------------------------------------------- 1 | "94612", 14 | "AccountSid" => "AC9a9f9392lad99kla0sklakjs90j092j3", 15 | "ApiVersion" => "2010-04-01", 16 | "CallSid" => "CAd800bb12c0426a7ea4230e492fef2a4f", 17 | "CallStatus" => "ringing", 18 | "Called" => "+15306384866", 19 | "CalledCity" => "OAKLAND", 20 | "CalledCountry" => "US", 21 | "CalledState" => "CA", 22 | "Caller" => "+15306666666", 23 | "CallerCity" => "SOUTH LAKE TAHOE", 24 | "CallerCountry" => "US", 25 | "CallerName" => "CA Wireless Call", 26 | "CallerState" => "CA", 27 | "CallerZip" => "89449", 28 | "Direction" => "inbound", 29 | "From" => "+15306666666", 30 | "FromCity" => "SOUTH LAKE TAHOE", 31 | "FromCountry" => "US", 32 | "FromState" => "CA", 33 | "FromZip" => "89449", 34 | "To" => "+15306384866", 35 | "ToCity" => "OAKLAND", 36 | "ToCountry" => "US", 37 | "ToState" => "CA", 38 | "ToZip" => "94612", 39 | ); 40 | 41 | $expected = "fF+xx6dTinOaCdZ0aIeNkHr/ZAA="; 42 | 43 | $this->assertEquals( 44 | $validator->computeSignature($uri, $params), $expected); 45 | $this->assertTrue($validator->validate($expected, $uri, $params)); 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/AvailablePhoneNumbers.php: -------------------------------------------------------------------------------- 1 | set( 9 | 'getList', 10 | array($this, 'getList'), 11 | array($country, 'Local') 12 | ); 13 | return $curried; 14 | } 15 | public function getTollFree($country) { 16 | $curried = new Services_Twilio_PartialApplicationHelper(); 17 | $curried->set( 18 | 'getList', 19 | array($this, 'getList'), 20 | array($country, 'TollFree') 21 | ); 22 | return $curried; 23 | } 24 | 25 | public function getMobile($country) 26 | { 27 | $curried = new Services_Twilio_PartialApplicationHelper(); 28 | $curried->set( 29 | 'getList', 30 | array($this, 'getList'), 31 | array($country, 'Mobile') 32 | ); 33 | return $curried; 34 | } 35 | 36 | /** 37 | * Get a list of available phone numbers. 38 | * 39 | * @param string $country The 2-digit country code you'd like to search for 40 | * numbers e.g. ('US', 'CA', 'GB') 41 | * @param string $type The type of number ('Local', 'TollFree', or 'Mobile') 42 | * @return object The object representation of the resource 43 | */ 44 | public function getList($country, $type, array $params = array()) 45 | { 46 | return $this->client->retrieveData($this->uri . "/$country/$type", $params); 47 | } 48 | 49 | public function getResourceName($camelized = false) { 50 | // You can't page through the list of available phone numbers. 51 | $this->instance_name = 'Services_Twilio_Rest_AvailablePhoneNumber'; 52 | return $camelized ? 'Countries' : 'countries'; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/_themes/LICENSE: -------------------------------------------------------------------------------- 1 | Modifications: 2 | 3 | Copyright (c) 2011 Kenneth Reitz. 4 | 5 | 6 | Original Project: 7 | 8 | Copyright (c) 2010 by Armin Ronacher. 9 | 10 | 11 | Some rights reserved. 12 | 13 | Redistribution and use in source and binary forms of the theme, with or 14 | without modification, are permitted provided that the following conditions 15 | are met: 16 | 17 | * Redistributions of source code must retain the above copyright 18 | notice, this list of conditions and the following disclaimer. 19 | 20 | * Redistributions in binary form must reproduce the above 21 | copyright notice, this list of conditions and the following 22 | disclaimer in the documentation and/or other materials provided 23 | with the distribution. 24 | 25 | * The names of the contributors may not be used to endorse or 26 | promote products derived from this software without specific 27 | prior written permission. 28 | 29 | We kindly ask you to only use these themes in an unmodified manner just 30 | for Flask and Flask-related products, not for unrelated projects. If you 31 | like the visual style and want to use it for your own projects, please 32 | consider making some larger changes to the themes (such as changing 33 | font faces, sizes, colors or margins). 34 | 35 | THIS THEME IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 36 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 37 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 38 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 39 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 40 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 41 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 42 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 43 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 44 | ARISING IN ANY WAY OUT OF THE USE OF THIS THEME, EVEN IF ADVISED OF THE 45 | POSSIBILITY OF SUCH DAMAGE. 46 | -------------------------------------------------------------------------------- /includes/twilio-php/Makefile: -------------------------------------------------------------------------------- 1 | # Twilio API helper library. 2 | # See LICENSE file for copyright and license details. 3 | 4 | define LICENSE 5 | 13 | * @license http://creativecommons.org/licenses/MIT/ MIT 14 | * @link http://pear.php.net/package/Services_Twilio 15 | */ 16 | endef 17 | export LICENSE 18 | 19 | COMPOSER = $(shell which composer) 20 | ifeq ($(strip $(COMPOSER)),) 21 | COMPOSER = php composer.phar 22 | endif 23 | 24 | all: test 25 | 26 | clean: 27 | @rm -rf dist venv 28 | 29 | PHP_FILES = `find dist -name \*.php` 30 | dist: clean 31 | @mkdir dist 32 | @git archive master | (cd dist; tar xf -) 33 | @for php in $(PHP_FILES); do\ 34 | echo "$$LICENSE" > $$php.new; \ 35 | tail -n+2 $$php >> $$php.new; \ 36 | mv $$php.new $$php; \ 37 | done 38 | 39 | test-install: 40 | # Composer: http://getcomposer.org/download/ 41 | $(COMPOSER) install 42 | 43 | install: 44 | pear channel-discover twilio.github.com/pear 45 | pear install twilio/Services_Twilio 46 | 47 | # if these fail, you may need to install the helper library - run "make 48 | # test-install" 49 | test: 50 | @PATH=vendor/bin:$(PATH) phpunit --strict --colors --configuration tests/phpunit.xml; 51 | 52 | venv: 53 | virtualenv venv 54 | 55 | docs-install: venv 56 | . venv/bin/activate; pip install -r docs/requirements.txt 57 | 58 | docs: 59 | . venv/bin/activate; cd docs && make html 60 | 61 | release-install: 62 | pear channel-discover twilio.github.com/pear || true 63 | pear channel-discover pear.pirum-project.org || true 64 | pear install pirum/Pirum || true 65 | pear install XML_Serializer-0.20.2 || true 66 | pear install PEAR_PackageFileManager2 || true 67 | 68 | authors: 69 | echo "Authors\n=======\n\nA huge thanks to all of our contributors:\n\n" > AUTHORS.md 70 | git log --raw | grep "^Author: " | cut -d ' ' -f2- | cut -d '<' -f1 | sed 's/^/- /' | sort | uniq >> AUTHORS.md 71 | 72 | .PHONY: all clean dist test docs docs-install test-install authors 73 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/IncomingPhoneNumbers.php: -------------------------------------------------------------------------------- 1 | `_ 7 | * documentation at twilio.com. 8 | */ 9 | class Services_Twilio_Rest_IncomingPhoneNumbers extends Services_Twilio_ListResource { 10 | function init($client, $uri) { 11 | $this->setupSubresources( 12 | 'local', 13 | 'toll_free', 14 | 'mobile' 15 | ); 16 | } 17 | 18 | function create(array $params = array()) { 19 | return parent::_create($params); 20 | } 21 | 22 | function getList($type, array $params = array()) 23 | { 24 | return $this->client->retrieveData($this->uri . "/$type", $params); 25 | } 26 | 27 | /** 28 | * Return a phone number instance from its E.164 representation. If more 29 | * than one number matches the search string, returns the first one. 30 | * 31 | * Example usage: 32 | * 33 | * .. code-block:: php 34 | * 35 | * $number = $client->account->incoming_phone_numbers->getNumber('+14105551234'); 36 | * echo $number->sid; 37 | * 38 | * :param string $number: The number in E.164 format, eg "+684105551234" 39 | * :return: A :php:class:`Services_Twilio_Rest_IncomingPhoneNumber` object, or null 40 | * :raises: a A :php:class:`Services_Twilio_RestException` if the number is 41 | * invalid, not provided in E.164 format or for any other API exception. 42 | */ 43 | public function getNumber($number) { 44 | $page = $this->getPage(0, 1, array( 45 | 'PhoneNumber' => $number 46 | )); 47 | $items = $page->getItems(); 48 | if (is_null($items) || empty($items)) { 49 | return null; 50 | } 51 | return $items[0]; 52 | } 53 | } 54 | 55 | class Services_Twilio_Rest_Local extends Services_Twilio_NumberType { } 56 | 57 | class Services_Twilio_Rest_Mobile extends Services_Twilio_NumberType { } 58 | 59 | class Services_Twilio_Rest_TollFree extends Services_Twilio_NumberType { } 60 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/rest/recordings.rst: -------------------------------------------------------------------------------- 1 | ========== 2 | Recordings 3 | ========== 4 | 5 | Listing Recordings 6 | ------------------ 7 | 8 | Run the following to get a list of all of your recordings: 9 | 10 | .. code-block:: php 11 | 12 | $accountSid = 'AC1234567890abcdef1234567890a'; 13 | $authToken = 'abcdef1234567890abcdefabcde9'; 14 | $client = new Services_Twilio($accountSid, $authToken); 15 | 16 | foreach($client->account->recordings as $recording) { 17 | echo "Access recording {$recording->sid} at:" . "\n"; 18 | echo $recording->uri; 19 | } 20 | 21 | For more information about which properties are available for a recording 22 | object, please see the `Twilio Recordings API Documentation `_. 23 | 24 | Please note that the ``uri`` returned by default is a JSON dictionary 25 | containing metadata about the recording; you can access the .wav version by 26 | stripping the ``.json`` extension from the ``uri`` returned by the library. 27 | 28 | Filtering Recordings By Call Sid 29 | -------------------------------- 30 | 31 | Pass filters as an array to filter your list of recordings, with any of the 32 | filters listed in the `recording list documentation `_. 33 | 34 | .. code-block:: php 35 | 36 | $accountSid = 'AC1234567890abcdef1234567890a'; 37 | $authToken = 'abcdef1234567890abcdefabcde9'; 38 | $client = new Services_Twilio($accountSid, $authToken); 39 | 40 | foreach($client->account->recordings->getIterator(0, 50, array('DateCreated>' => '2011-01-01')) as $recording) { 41 | echo $recording->uri . "\n"; 42 | } 43 | 44 | Deleting a Recording 45 | -------------------- 46 | 47 | To delete a recording, get the sid of the recording, and then pass it to the 48 | client. 49 | 50 | .. code-block:: php 51 | 52 | $accountSid = 'AC1234567890abcdef1234567890a'; 53 | $authToken = 'abcdef1234567890abcdefabcde9'; 54 | $client = new Services_Twilio($accountSid, $authToken); 55 | 56 | foreach($client->account->recordings as $recording) { 57 | $client->account->recordings->delete($recording->sid); 58 | echo "Deleted recording {$recording->sid}, the first one in the list."; 59 | break; 60 | } 61 | 62 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/ConnectAppsTest.php: -------------------------------------------------------------------------------- 1 | shouldReceive('get')->once() 10 | ->with('/2010-04-01/Accounts/AC123/ConnectApps/CN123.json') 11 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 12 | json_encode(array('friendly_name' => 'foo')) 13 | )); 14 | $http->shouldReceive('post')->once() 15 | ->with('/2010-04-01/Accounts/AC123/ConnectApps/CN123.json', 16 | array('Content-Type' => 'application/x-www-form-urlencoded'), 17 | 'FriendlyName=Bar') 18 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 19 | json_encode(array('friendly_name' => 'Bar')) 20 | )); 21 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 22 | $cn = $client->account->connect_apps->get('CN123'); 23 | $this->assertEquals('foo', $cn->friendly_name); 24 | $cn->update(array('FriendlyName' => 'Bar')); 25 | $this->assertEquals('Bar', $cn->friendly_name); 26 | } 27 | 28 | function testUpdateWithOneParam() 29 | { 30 | $http = m::mock(new Services_Twilio_TinyHttp); 31 | $http->shouldReceive('get')->once() 32 | ->with('/2010-04-01/Accounts/AC123/ConnectApps/CN123.json') 33 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 34 | json_encode(array('friendly_name' => 'foo')) 35 | )); 36 | $http->shouldReceive('post')->once() 37 | ->with('/2010-04-01/Accounts/AC123/ConnectApps/CN123.json', 38 | array('Content-Type' => 'application/x-www-form-urlencoded'), 39 | 'FriendlyName=Bar') 40 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 41 | json_encode(array('friendly_name' => 'Bar')) 42 | )); 43 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 44 | $cn = $client->account->connect_apps->get('CN123'); 45 | $this->assertEquals('foo', $cn->friendly_name); 46 | $cn->update('FriendlyName', 'Bar'); 47 | $this->assertEquals('Bar', $cn->friendly_name); 48 | } 49 | 50 | function tearDown() 51 | { 52 | m::close(); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/AvailablePhoneNumbersTest.php: -------------------------------------------------------------------------------- 1 | shouldReceive('get')->once() 9 | ->with('/2010-04-01/Accounts/AC123/AvailablePhoneNumbers/US/Local.json?AreaCode=510') 10 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 11 | json_encode(array('available_phone_numbers' => array( 12 | 'friendly_name' => '(510) 564-7903' 13 | ))) 14 | )); 15 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 16 | $nums = $client->account->available_phone_numbers->getLocal('US'); 17 | $numsList = $nums->getList(array('AreaCode' => '510')); 18 | foreach ($numsList as $num) { 19 | $this->assertEquals('(510) 564-7903', $num->friendly_name); 20 | } 21 | } 22 | 23 | function testPagePhoneNumberResource() { 24 | $http = m::mock(new Services_Twilio_TinyHttp); 25 | $http->shouldReceive('get')->once() 26 | ->with('/2010-04-01/Accounts/AC123/AvailablePhoneNumbers.json?Page=0&PageSize=50') 27 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 28 | json_encode(array( 29 | 'total' => 1, 30 | 'countries' => array(array('country_code' => 'CA')) 31 | )) 32 | )); 33 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 34 | $page = $client->account->available_phone_numbers->getPage('0'); 35 | $this->assertEquals('CA', $page->countries[0]->country_code); 36 | } 37 | 38 | function testGetMobile() { 39 | $http = m::mock(new Services_Twilio_TinyHttp); 40 | $http->shouldReceive('get')->once() 41 | ->with('/2010-04-01/Accounts/AC123/AvailablePhoneNumbers/GB/Mobile.json') 42 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 43 | json_encode(array('available_phone_numbers' => array( 44 | 'friendly_name' => '(510) 564-7903' 45 | ))) 46 | )); 47 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 48 | $nums = $client->account->available_phone_numbers->getMobile('GB')->getList(); 49 | foreach ($nums as $num) { 50 | $this->assertEquals('(510) 564-7903', $num->friendly_name); 51 | } 52 | } 53 | 54 | function tearDown() { 55 | m::close(); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Messages.php: -------------------------------------------------------------------------------- 1 | account->messages->create(array( 13 | * "Body" => "foo", 14 | * "From" => "+14105551234", 15 | * "To" => "+14105556789", 16 | * )); 17 | * 18 | * :param array $params: a single array of parameters which is serialized and 19 | * sent directly to the Twilio API. You may find it easier to use the 20 | * sendMessage helper instead of this function. 21 | * 22 | */ 23 | public function create($params = array()) { 24 | return parent::_create($params); 25 | } 26 | 27 | /** 28 | * Send a message 29 | * 30 | * .. code-block:: php 31 | * 32 | * $client = new Services_Twilio('AC123', '123'); 33 | * $message = $client->account->messages->sendMessage( 34 | * '+14105551234', // From a Twilio number in your account 35 | * '+14105556789', // Text any number 36 | * 'Come at the king, you best not miss.' // Message body (if any) 37 | * array('https://demo.twilio.com/owl.png'), // An array of MediaUrls 38 | * ); 39 | * 40 | * :param string $from: the from number for the message, this must be a 41 | * number you purchased from Twilio 42 | * :param string $to: the message recipient's phone number 43 | * :param $mediaUrls: the URLs of images to send in this MMS 44 | * :type $mediaUrls: null (don't include media), a single URL, or an array 45 | * of URLs to send as media with this message 46 | * :param string $body: the text to include along with this MMS 47 | * :param array $params: Any additional params (callback, etc) you'd like to 48 | * send with this request, these are serialized and sent as POST 49 | * parameters 50 | * 51 | * :return: The created :class:`Services_Twilio_Rest_Message` 52 | * :raises: :class:`Services_Twilio_RestException` 53 | * An exception if the parameters are invalid (for example, the from 54 | * number is not a Twilio number registered to your account, or is 55 | * unable to send MMS) 56 | */ 57 | public function sendMessage($from, $to, $body = null, $mediaUrls = null, 58 | $params = array() 59 | ) { 60 | $postParams = array( 61 | 'From' => $from, 62 | 'To' => $to, 63 | ); 64 | // When the request is made, this will get serialized into MediaUrl=a&MediaUrl=b 65 | if (!is_null($mediaUrls)) { 66 | $postParams['MediaUrl'] = $mediaUrls; 67 | } 68 | if (!is_null($body)) { 69 | $postParams['Body'] = $body; 70 | } 71 | return self::create($postParams + $params); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/token-generation.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | Generate Capability Tokens 3 | =========================== 4 | 5 | `Twilio Client `_ allows you to make and recieve connections in the browser. You can place a call to a phone on the PSTN network, all without leaving your browser. See the `Twilio Client Quickstart `_ to get up and running with Twilio Client. 6 | 7 | Capability tokens are used by `Twilio Client `_ to provide connection security and authorization. The `Capability Token documentation `_ explains indepth the purpose and features of these tokens. 8 | 9 | :php:class:`Services_Twilio_Capability` is responsible for the creation of these capability tokens. You'll need your Twilio AccountSid and AuthToken. 10 | 11 | .. code-block:: php 12 | 13 | require('/path/to/twilio-php/Services/Twilio/Capability.php'); 14 | 15 | $accountSid = "AC123123"; 16 | $authToken = "secret"; 17 | 18 | $capability = new Services_Twilio_Capability($accountSid, $authToken); 19 | 20 | 21 | Allow Incoming Connections 22 | ============================== 23 | 24 | Before a device running `Twilio Client `_ can recieve incoming connections, the instance must first register a name (such as "Alice" or "Bob"). The :php:meth:`allowCclientIncoming` method adds the client name to the capability token. 25 | 26 | .. code-block:: php 27 | 28 | $capability->allowClientIncoming("Alice"); 29 | 30 | 31 | Allow Outgoing Connections 32 | ============================== 33 | 34 | To make an outgoing connection from a `Twilio Client `_ device, you'll need to choose a `Twilio Application `_ to handle TwiML URLs. A Twilio Application is a collection of URLs responsible for outputing valid TwiML to control phone calls and SMS. 35 | 36 | .. code-block:: php 37 | 38 | $applicationSid = "AP123123"; // Twilio Application Sid 39 | $capability->allowClientOutgoing($applicationSid); 40 | 41 | :php:meth:`allowClientOutgoing` accepts an optional array of parameters. These parameters will be passed along when Twilio requests TwiML from the application. 42 | 43 | .. code-block:: php 44 | 45 | $applicationSid = "AP123123"; // Twilio Application Sid 46 | $params = array("Foo" => "Bar"); // Parameters to be passed 47 | $capability->allowClientOutgoing($applicationSid, $params); 48 | 49 | 50 | Generate a Token 51 | ================== 52 | 53 | .. code-block:: php 54 | 55 | $token = $capability->generateToken(); 56 | 57 | By default, this token will expire in one hour. If you'd like to change the token expiration time, :php:meth:`generateToken` takes an optional argument which specifies `time to live` in seconds. 58 | 59 | .. code-block:: php 60 | 61 | $token = $capability->generateToken(600); 62 | 63 | This token will now expire in 10 minutes. 64 | 65 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/rest/usage-triggers.rst: -------------------------------------------------------------------------------- 1 | ============== 2 | Usage Triggers 3 | ============== 4 | 5 | Twilio offers a Usage Trigger API so you can get notifications when your Twilio 6 | usage exceeds a given level. Here are some examples of how you can 7 | use PHP to create new usage triggers or modify existing triggers. 8 | 9 | Retrieve A Usage Trigger's Properties 10 | ===================================== 11 | 12 | If you know the Sid of your usage trigger, retrieving it is easy. 13 | 14 | .. code-block:: php 15 | 16 | $client = new Services_Twilio('AC123', '456bef'); 17 | $usageSid = 'UT123'; 18 | $usageTrigger = $client->account->usage_triggers->get($usageSid); 19 | echo $usageTrigger->usage_category; 20 | 21 | Update Properties on a UsageTrigger 22 | =================================== 23 | 24 | .. code-block:: php 25 | 26 | $client = new Services_Twilio('AC123', '456bef'); 27 | $usageSid = 'UT123'; 28 | $usageTrigger = $client->account->usage_triggers->get($usageSid); 29 | $usageTrigger->update(array( 30 | 'FriendlyName' => 'New usage trigger friendly name', 31 | 'CallbackUrl' => 'http://example.com/new-trigger-url', 32 | )); 33 | 34 | Retrieve All Triggers 35 | ===================== 36 | 37 | .. code-block:: php 38 | 39 | $client = new Services_Twilio('AC123', '456bef'); 40 | foreach ($client->account->usage_triggers as $trigger) { 41 | echo "Category: {$trigger->usage_category}\nTriggerValue: {$trigger->trigger_value}\n"; 42 | } 43 | 44 | Filter Trigger List By Category 45 | =============================== 46 | 47 | Pass filters to the `getIterator` function to create a filtered list. 48 | 49 | .. code-block:: php 50 | 51 | $client = new Services_Twilio('AC123', '456bef'); 52 | foreach ($client->account->usage_triggers->getIterator( 53 | 0, 50, array( 54 | 'UsageCategory' => 'sms', 55 | )) as $trigger 56 | ) { 57 | echo "Value: " . $trigger->trigger_value . "\n"; 58 | } 59 | 60 | Create a New Trigger 61 | ==================== 62 | 63 | Pass a usage category, a value and a callback URL to the `create` method. 64 | 65 | .. code-block:: php 66 | 67 | $client = new Services_Twilio('AC123', '456bef'); 68 | $trigger = $client->account->usage_triggers->create( 69 | 'totalprice', 70 | '250.75', 71 | 'http://example.com/usage' 72 | ); 73 | 74 | Create a Recurring Trigger 75 | ========================== 76 | 77 | To have your trigger reset once every day, month, or year, pass the 78 | `Recurring` key as part of the params array. A list of optional 79 | trigger parameters can be found in the `Usage Triggers Documentation 80 | `_. 82 | 83 | .. code-block:: php 84 | 85 | $client = new Services_Twilio('AC123', '456bef'); 86 | $trigger = $client->account->usage_triggers->create( 87 | 'totalprice', 88 | '250.75', 89 | 'http://example.com/usage', 90 | array('Recurring' => 'monthly', 'TriggerBy' => 'price') 91 | ); 92 | 93 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/validation.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | Validate Incoming Requests 3 | =========================== 4 | 5 | Twilio requires that your TwiML-serving web server be open to the public. This is necessary so that Twilio can retrieve TwiML from urls and POST data back to your server. 6 | 7 | However, there may be people out there trying to spoof the Twilio service. Luckily, there's an easy way to validate that incoming requests are from Twilio and Twilio alone. 8 | 9 | An `indepth guide `_ to our security features can be found in our online documentation. 10 | 11 | Before you can validate requests, you'll need four pieces of information 12 | 13 | * your Twilio Auth Token 14 | * the POST data for the request 15 | * the requested URL 16 | * the X-Twilio-Signature header value 17 | 18 | Get your Auth Token from the `Twilio User Dashboard `_. 19 | 20 | Obtaining the other three pieces of information depends on the framework of your choosing. I will assume that you have the POST data as an array and the url and X-Twilio-Signature as strings. 21 | 22 | The below example will print out a confirmation message if the request is actually from Twilio.com 23 | 24 | .. code-block:: php 25 | 26 | // Your auth token from twilio.com/user/account 27 | $authToken = '12345'; 28 | 29 | // Download the twilio-php library from twilio.com/docs/php/install, include it 30 | // here 31 | require_once('/path/to/twilio-php/Services/Twilio.php'); 32 | $validator = new Services_Twilio_RequestValidator($authToken); 33 | 34 | // The Twilio request URL. You may be able to retrieve this from 35 | // $_SERVER['SCRIPT_URI'] 36 | $url = 'https://mycompany.com/myapp.php?foo=1&bar=2'; 37 | 38 | // The post variables in the Twilio request. You may be able to use 39 | // $postVars = $_POST 40 | $postVars = array( 41 | 'CallSid' => 'CA1234567890ABCDE', 42 | 'Caller' => '+14158675309', 43 | 'Digits' => '1234', 44 | 'From' => '+14158675309', 45 | 'To' => '+18005551212' 46 | ); 47 | 48 | // The X-Twilio-Signature header - in PHP this should be 49 | // $_SERVER["HTTP_X_TWILIO_SIGNATURE"]; 50 | $signature = 'RSOYDt4T1cUTdK1PDd93/VVr8B8='; 51 | 52 | if ($validator->validate($signature, $url, $postVars)) { 53 | echo "Confirmed to have come from Twilio."; 54 | } else { 55 | echo "NOT VALID. It might have been spoofed!"; 56 | } 57 | 58 | Trailing Slashes 59 | ================== 60 | 61 | If your URL uses an "index" page, such as index.php or index.html to handle the request, such as: https://mycompany.com/twilio where the real page is served from https://mycompany.com/twilio/index.php, then Apache or PHP may rewrite that URL a little bit so it's got a trailing slash... https://mycompany.com/twilio/ for example. 62 | 63 | Using the code above, or similar code in another language, you could end up with an incorrect hash because, Twilio built the hash using https://mycompany.com/twilio and you may have built the hash using https://mycompany.com/twilio/. 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/InstanceResource.php: -------------------------------------------------------------------------------- 1 | 7 | * @license http://creativecommons.org/licenses/MIT/ MIT 8 | * @link http://pear.php.net/package/Services_Twilio 9 | */ 10 | 11 | /** 12 | * Abstraction of an instance resource from the Twilio API. 13 | */ 14 | abstract class Services_Twilio_InstanceResource extends Services_Twilio_Resource { 15 | 16 | /** 17 | * Make a request to the API to update an instance resource 18 | * 19 | * :param mixed $params: An array of updates, or a property name 20 | * :param mixed $value: A value with which to update the resource 21 | * 22 | * :rtype: null 23 | * :throws: a :php:class:`RestException ` if 24 | * the update fails. 25 | */ 26 | public function update($params, $value = null) 27 | { 28 | if (!is_array($params)) { 29 | $params = array($params => $value); 30 | } 31 | $decamelizedParams = $this->client->createData($this->uri, $params); 32 | $this->updateAttributes($decamelizedParams); 33 | } 34 | 35 | /* 36 | * Add all properties from an associative array (the JSON response body) as 37 | * properties on this instance resource, except the URI 38 | * 39 | * :param stdClass $params: An object containing all of the parameters of 40 | * this instance 41 | * :return: Nothing, this is purely side effecting 42 | * :rtype: null 43 | */ 44 | public function updateAttributes($params) { 45 | unset($params->uri); 46 | foreach ($params as $name => $value) { 47 | $this->$name = $value; 48 | } 49 | } 50 | 51 | /** 52 | * Get the value of a property on this resource. 53 | * 54 | * Instead of defining all of the properties of an object directly, we rely 55 | * on the API to tell us which properties an object has. This method will 56 | * query the API to retrieve a property for an object, if it is not already 57 | * set on the object. 58 | * 59 | * If the call is to a subresource, eg ``$client->account->messages``, no 60 | * request is made. 61 | * 62 | * To help with lazy HTTP requests, we don't actually retrieve an object 63 | * from the API unless you really need it. Hence, this function may make API 64 | * requests even if the property you're requesting isn't available on the 65 | * resource. 66 | * 67 | * :param string $key: The property name 68 | * 69 | * :return mixed: Could be anything. 70 | * :throws: a :php:class:`RestException ` if 71 | * the update fails. 72 | */ 73 | public function __get($key) 74 | { 75 | if ($subresource = $this->getSubresources($key)) { 76 | return $subresource; 77 | } 78 | if (!isset($this->$key)) { 79 | $params = $this->client->retrieveData($this->uri); 80 | $this->updateAttributes($params); 81 | } 82 | return $this->$key; 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/rest/usage-records.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | Usage Records 3 | ============= 4 | 5 | Twilio offers a Usage Record API so you can better measure how much you've been 6 | using Twilio. Here are some examples of how you can use PHP to access the usage 7 | API. 8 | 9 | Retrieve All Usage Records 10 | ========================== 11 | 12 | .. code-block:: php 13 | 14 | $client = new Services_Twilio('AC123', '456bef'); 15 | foreach ($client->account->usage_records as $record) { 16 | echo "Record: $record"; 17 | } 18 | 19 | Retrieve Usage Records For A Time Interval 20 | ========================================== 21 | 22 | UsageRecords support `several convenience subresources 23 | `_ that 24 | can be accessed as properties on the `record` object. 25 | 26 | .. code-block:: php 27 | 28 | $client = new Services_Twilio('AC123', '456bef'); 29 | foreach ($client->account->usage_records->last_month as $record) { 30 | echo "Record: $record"; 31 | } 32 | 33 | Retrieve All Time Usage for A Usage Category 34 | ============================================ 35 | 36 | By default, Twilio will return your all-time usage for a given usage category. 37 | 38 | .. code-block:: php 39 | 40 | $client = new Services_Twilio('AC123', '456bef'); 41 | $callRecord = $client->account->usage_records->getCategory('calls'); 42 | echo $callRecord->usage; 43 | 44 | Retrieve All Usage for a Given Time Period 45 | ========================================== 46 | 47 | You can filter your UsageRecord list by providing `StartDate` and `EndDate` 48 | parameters. 49 | 50 | .. code-block:: php 51 | 52 | $client = new Services_Twilio('AC123', '456bef'); 53 | foreach ($client->account->usage_records->getIterator(0, 50, array( 54 | 'StartDate' => '2012-08-01', 55 | 'EndDate' => '2012-08-31', 56 | )) as $record) { 57 | echo $record->description . "\n"; 58 | echo $record->usage . "\n"; 59 | } 60 | 61 | Retrieve Today's SMS Usage 62 | ========================== 63 | 64 | You can use the `today` record subresource, and then retrieve the record 65 | directly with the `getCategory` function. 66 | 67 | .. code-block:: php 68 | 69 | $client = new Services_Twilio('AC123', '456bef'); 70 | // You can substitute 'yesterday', 'all_time' for 'today' below 71 | $smsRecord = $client->account->usage_records->today->getCategory('sms'); 72 | echo $smsRecord->usage; 73 | 74 | Retrieve Daily Usage Over a One-Month Period 75 | ============================================= 76 | 77 | The code below will retrieve daily summaries of recordings usage for August 78 | 2012. To retrieve all categories of usage, remove the 'Category' filter from 79 | the `getIterator` array. 80 | 81 | .. code-block:: php 82 | 83 | $client = new Services_Twilio('AC123', '456bef'); 84 | foreach ($client->account->usage_records->daily->getIterator(0, 50, array( 85 | 'StartDate' => '2012-08-01', 86 | 'EndDate' => '2012-08-31', 87 | 'Category' => 'recordings', 88 | )) as $record) { 89 | echo $record->usage; 90 | } 91 | 92 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/IncomingPhoneNumber.php: -------------------------------------------------------------------------------- 1 | `_ 7 | * documentation. 8 | * 9 | * .. php:attr:: sid 10 | * 11 | * A 34 character string that uniquely idetifies this resource. 12 | * 13 | * .. php:attr:: date_created 14 | * 15 | * The date that this resource was created, given as GMT RFC 2822 format. 16 | * 17 | * .. php:attr:: date_updated 18 | * 19 | * The date that this resource was last updated, given as GMT RFC 2822 format. 20 | * 21 | * .. php:attr:: friendly_name 22 | * 23 | * A human readable descriptive text for this resource, up to 64 24 | * characters long. By default, the FriendlyName is a nicely formatted 25 | * version of the phone number. 26 | * 27 | * .. php:attr:: account_sid 28 | * 29 | * The unique id of the Account responsible for this phone number. 30 | * 31 | * .. php:attr:: phone_number 32 | * 33 | * The incoming phone number. e.g., +16175551212 (E.164 format) 34 | * 35 | * .. php:attr:: api_version 36 | * 37 | * Calls to this phone number will start a new TwiML session with this 38 | * API version. 39 | * 40 | * .. php:attr:: voice_caller_id_lookup 41 | * 42 | * Look up the caller's caller-ID name from the CNAM database (additional charges apply). Either true or false. 43 | * 44 | * .. php:attr:: voice_url 45 | * 46 | * The URL Twilio will request when this phone number receives a call. 47 | * 48 | * .. php:attr:: voice_method 49 | * 50 | * The HTTP method Twilio will use when requesting the above Url. Either GET or POST. 51 | * 52 | * .. php:attr:: voice_fallback_url 53 | * 54 | * The URL that Twilio will request if an error occurs retrieving or executing the TwiML requested by Url. 55 | * 56 | * .. php:attr:: voice_fallback_method 57 | * 58 | * The HTTP method Twilio will use when requesting the VoiceFallbackUrl. Either GET or POST. 59 | * 60 | * .. php:attr:: status_callback 61 | * 62 | * The URL that Twilio will request to pass status parameters (such as call ended) to your application. 63 | * 64 | * .. php:attr:: status_callback_method 65 | * 66 | * The HTTP method Twilio will use to make requests to the StatusCallback URL. Either GET or POST. 67 | * 68 | * .. php:attr:: sms_url 69 | * 70 | * The URL Twilio will request when receiving an incoming SMS message to this number. 71 | * 72 | * .. php:attr:: sms_method 73 | * 74 | * The HTTP method Twilio will use when making requests to the SmsUrl. Either GET or POST. 75 | * 76 | * .. php:attr:: sms_fallback_url 77 | * 78 | * The URL that Twilio will request if an error occurs retrieving or executing the TwiML from SmsUrl. 79 | * 80 | * .. php:attr:: sms_fallback_method 81 | * 82 | * The HTTP method Twilio will use when requesting the above URL. Either GET or POST. 83 | * 84 | * .. php:attr:: uri 85 | * 86 | * The URI for this resource, relative to https://api.twilio.com. 87 | */ 88 | class Services_Twilio_Rest_IncomingPhoneNumber 89 | extends Services_Twilio_InstanceResource 90 | { 91 | } 92 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/rest/sip.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | Sip In 3 | ============= 4 | 5 | Getting started with Sip 6 | ========================== 7 | 8 | If you're unfamiliar with SIP, please see the `SIP API Documentation 9 | `_ on our website. 10 | 11 | Creating a Sip Domain 12 | ========================= 13 | 14 | The :class:`Domains ` resource allows you to 15 | create a new domain. To create a new domain, you'll need to choose a unique 16 | domain that lives under sip.twilio.com. For example, doug.sip.twilio.com. 17 | 18 | .. code-block:: php 19 | 20 | require('/path/to/twilio-php/Services/Twilio.php'); 21 | 22 | $client = new Services_Twilio('AC123', '123'); 23 | $domain = $client->account->sip->domains->create( 24 | "Doug's Domain", // The FriendlyName for your new domain 25 | "doug.sip.twilio.com", // The sip domain for your new domain 26 | array( 27 | 'VoiceUrl' => 'http://example.com/voice', 28 | )); 29 | 30 | echo $domain->sid; 31 | 32 | Creating a new IpAccessControlList 33 | ==================================== 34 | 35 | To control access to your new domain, you'll need to explicitly grant access 36 | to individual ip addresses. To do this, you'll first need to create an 37 | :class:`IpAccessControlList ` to hold 38 | the ip addresses you wish to allow. 39 | 40 | .. code-block:: php 41 | 42 | require('/path/to/twilio-php/Services/Twilio.php'); 43 | 44 | $client = new Services_Twilio('AC123', '123'); 45 | $ip_access_control_list = $client->account->sip->ip_access_control_lists->create( 46 | "Doug's IpAccessControlList", // The FriendlyName for your new ip access control list 47 | ); 48 | 49 | echo $ip_access_control_list->sid; 50 | 51 | Adding an IpAddress to an IpAccessControlList 52 | ============================================== 53 | 54 | Now it's time to add an :class:`IpAddress 55 | ` to your new :class:`IpAccessControlList 56 | `. 57 | 58 | .. code-block:: php 59 | 60 | require('/path/to/twilio-php/Services/Twilio.php'); 61 | 62 | $client = new Services_Twilio('AC123', '123'); 63 | $ip_address = $client->account->sip->ip_access_control_lists->get('AC123')->ip_addresses->create( 64 | "Doug's IpAddress", // The FriendlyName for this IpAddress 65 | '127.0.0.1', // The ip address for this IpAddress 66 | ); 67 | 68 | echo $ip_address->sid; 69 | 70 | Adding an IpAccessControlList to a Domain 71 | =========================================== 72 | 73 | Once you've created a :class:`Domain ` and an 74 | :class:`IpAccessControlList ` 75 | you need to associate them. To do this, 76 | create an :class:`IpAccessControlListMapping 77 | `. 78 | 79 | .. code-block:: php 80 | 81 | require('/path/to/twilio-php/Services/Twilio.php'); 82 | 83 | $client = new Services_Twilio('AC123', '123'); 84 | $ip_access_control_list_mapping = $client->account->sip->domains->get('SD123')->ip_access_control_list_mappings->create( 85 | 'AL123', // The sid of your IpAccessControlList 86 | ); 87 | 88 | echo $ip_access_control_list_mapping->sid; 89 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/HttpStream.php: -------------------------------------------------------------------------------- 1 | array( 16 | "headers" => "", 17 | "timeout" => 60, 18 | "follow_location" => true, 19 | "ignore_errors" => true, 20 | ), 21 | "ssl" => array(), 22 | ); 23 | private $options = array(); 24 | 25 | public function __construct($uri = '', $kwargs = array()) { 26 | $this->uri = $uri; 27 | if (isset($kwargs['debug'])) { 28 | $this->debug = true; 29 | } 30 | if (isset($kwargs['http_options'])) { 31 | $this->options = $kwargs['http_options'] + self::$default_options; 32 | } else { 33 | $this->options = self::$default_options; 34 | } 35 | } 36 | 37 | public function __call($name, $args) { 38 | list($res, $req_headers, $req_body) = $args + array(0, array(), ''); 39 | 40 | $request_options = $this->options; 41 | $url = $this->uri . $res; 42 | 43 | if (isset($req_body) && strlen($req_body) > 0) { 44 | $request_options['http']['content'] = $req_body; 45 | } 46 | 47 | foreach($req_headers as $key => $value) { 48 | $request_options['http']['header'] .= sprintf("%s: %s\r\n", $key, $value); 49 | } 50 | 51 | if (isset($this->auth_header)) { 52 | $request_options['http']['header'] .= $this->auth_header; 53 | } 54 | 55 | $request_options['http']['method'] = strtoupper($name); 56 | $request_options['http']['ignore_errors'] = true; 57 | 58 | if ($this->debug) { 59 | error_log(var_export($request_options, true)); 60 | } 61 | $ctx = stream_context_create($request_options); 62 | $result = file_get_contents($url, false, $ctx); 63 | 64 | if (false === $result) { 65 | throw new Services_Twilio_HttpStreamException( 66 | "Unable to connect to service"); 67 | } 68 | 69 | $status_header = array_shift($http_response_header); 70 | if (1 !== preg_match('#HTTP/\d+\.\d+ (\d+)#', $status_header, $matches)) { 71 | throw new Services_Twilio_HttpStreamException( 72 | "Unable to detect the status code in the HTTP result."); 73 | } 74 | 75 | $status_code = intval($matches[1]); 76 | $response_headers = array(); 77 | 78 | foreach($http_response_header as $header) { 79 | list($key, $val) = explode(":", $header); 80 | $response_headers[trim($key)] = trim($val); 81 | } 82 | 83 | return array($status_code, $response_headers, $result); 84 | } 85 | 86 | public function authenticate($user, $pass) { 87 | if (isset($user) && isset($pass)) { 88 | $this->auth_header = sprintf("Authorization: Basic %s", 89 | base64_encode(sprintf("%s:%s", $user, $pass))); 90 | } else { 91 | $this->auth_header = null; 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/AutoPagingIterator.php: -------------------------------------------------------------------------------- 1 | generator = $generator; 14 | $this->page = $page; 15 | $this->size = $size; 16 | $this->filters = $filters; 17 | $this->items = array(); 18 | 19 | // Save a backup for rewind() 20 | $this->_args = array( 21 | 'page' => $page, 22 | 'size' => $size, 23 | 'filters' => $filters, 24 | ); 25 | } 26 | 27 | public function current() 28 | { 29 | return current($this->items); 30 | } 31 | 32 | public function key() 33 | { 34 | return key($this->items); 35 | } 36 | 37 | /* 38 | * Return the next item in the list, making another HTTP call to the next 39 | * page of resources if necessary. 40 | */ 41 | public function next() 42 | { 43 | try { 44 | $this->loadIfNecessary(); 45 | return next($this->items); 46 | } 47 | catch (Services_Twilio_RestException $e) { 48 | // 20006 is an out of range paging error, everything else is valid 49 | if ($e->getCode() != 20006) { 50 | throw $e; 51 | } 52 | } 53 | } 54 | 55 | /* 56 | * Restore everything to the way it was before we began paging. This gets 57 | * called at the beginning of any foreach() loop 58 | */ 59 | public function rewind() 60 | { 61 | foreach ($this->_args as $arg => $val) { 62 | $this->$arg = $val; 63 | } 64 | $this->items = array(); 65 | $this->next_page_uri = null; 66 | } 67 | 68 | public function count() 69 | { 70 | throw new BadMethodCallException('Not allowed'); 71 | } 72 | 73 | public function valid() 74 | { 75 | try { 76 | $this->loadIfNecessary(); 77 | return key($this->items) !== null; 78 | } 79 | catch (Services_Twilio_RestException $e) { 80 | // 20006 is an out of range paging error, everything else is valid 81 | if ($e->getCode() != 20006) { 82 | throw $e; 83 | } 84 | } 85 | return false; 86 | } 87 | 88 | /* 89 | * Fill $this->items with a new page from the API, if necessary. 90 | */ 91 | protected function loadIfNecessary() 92 | { 93 | if (// Empty because it's the first time or last page was empty 94 | empty($this->items) 95 | // null key when the items list is iterated over completely 96 | || key($this->items) === null 97 | ) { 98 | $page = call_user_func_array($this->generator, array( 99 | $this->page, 100 | $this->size, 101 | $this->filters, 102 | $this->next_page_uri, 103 | )); 104 | $this->next_page_uri = $page->next_page_uri; 105 | $this->items = $page->getItems(); 106 | $this->page = $this->page + 1; 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/rest.rst: -------------------------------------------------------------------------------- 1 | .. _ref-rest: 2 | 3 | ========================== 4 | Using the Twilio REST API 5 | ========================== 6 | 7 | Since version 3.0, we've introduced an updated API for interacting with the 8 | Twilio REST API. Gone are the days of manual URL creation and XML parsing. 9 | 10 | Creating a REST Client 11 | ======================= 12 | 13 | Before querying the API, you'll need to create a :php:class:`Services_Twilio` 14 | instance. The constructor takes your Twilio Account Sid and Auth 15 | Token (both available through your `Twilio Account Dashboard 16 | `_). 17 | 18 | .. code-block:: php 19 | 20 | $ACCOUNT_SID = "AC123"; 21 | $AUTH_TOKEN = "secret"; 22 | $client = new Services_Twilio($ACCOUNT_SID, $AUTH_TOKEN); 23 | 24 | The :attr:`account` attribute 25 | ----------------------------- 26 | 27 | You access the Twilio API resources through this :attr:`$client`, 28 | specifically the :attr:`$account` attribute, which is an instance of 29 | :php:class:`Services_Twilio_Rest_Account`. We'll use the `Calls resource 30 | `_ as an example. 31 | 32 | Listing Resources 33 | ==================== 34 | 35 | Iterating over the :attr:`calls` attribute will iterate over all of your call 36 | records, handling paging for you. Only use this when you need to get all your 37 | records. 38 | 39 | The :attr:`$call` object is a :php:class:`Services_Twilio_Rest_Call`, which 40 | means you can easily access fields through it's properties. The attribute names 41 | are lowercase and use underscores for sepearators. All the available attributes 42 | are documented in the :doc:`/api/rest` documentation. 43 | 44 | .. code-block:: php 45 | 46 | // If you have many calls, this could take a while 47 | foreach($client->account->calls as $call) { 48 | print $call->price . '\n'; 49 | print $call->duration . '\n'; 50 | } 51 | 52 | Filtering Resources 53 | ------------------- 54 | 55 | Many Twilio list resources allow for filtering via :php:meth:`getIterator` 56 | which takes an optional array of filter parameters. These parameters correspond 57 | directlty to the listed query string parameters in the REST API documentation. 58 | 59 | You can create a filtered iterator like this: 60 | 61 | .. code-block:: php 62 | 63 | $filteredCalls = $client->account->calls->getIterator( 64 | 0, 50, array("Status" => "in-progress")); 65 | foreach($filteredCalls as $call) { 66 | print $call->price . '\n'; 67 | print $call->duration . '\n'; 68 | } 69 | 70 | Retrieving the Total Number of Resources 71 | ---------------------------------------- 72 | 73 | Each of the list resources supports the `Countable` interface, which means you 74 | can retrieve the total number of list items like so: 75 | 76 | .. code-block:: php 77 | 78 | echo count($client->account->calls); 79 | 80 | Getting a Specific Resource 81 | ============================= 82 | 83 | If you know the unique identifier for a resource, you can get that resource 84 | using the :php:meth:`get` method on the list resource. 85 | 86 | .. code-block:: php 87 | 88 | $call = $client->account->calls->get("CA123"); 89 | 90 | :php:meth:`get` fetches objects lazily, so it will only load a resource when it 91 | is needed. This allows you to get nested objects without making multiple HTTP 92 | requests. 93 | 94 | .. code-block:: php 95 | 96 | $participant = $client->account->conferences 97 | ->get("CO123")->participants->get("PF123"); 98 | 99 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/MembersTest.php: -------------------------------------------------------------------------------- 1 | 'application/x-www-form-urlencoded'); 8 | 9 | function testFront() { 10 | $http = m::mock(new Services_Twilio_TinyHttp); 11 | $http->shouldReceive('get')->once() 12 | ->with('/2010-04-01/Accounts/AC123/Queues/QQ123/Members/Front.json') 13 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 14 | json_encode(array('call_sid' => 'CA123', 'position' => 0)) 15 | )); 16 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 17 | $queue = $client->account->queues->get('QQ123'); 18 | $firstMember = $queue->members->front(); 19 | $this->assertSame($firstMember->call_sid, 'CA123'); 20 | } 21 | 22 | function testDequeueFront() { 23 | $http = m::mock(new Services_Twilio_TinyHttp); 24 | $http->shouldReceive('post')->once() 25 | ->with('/2010-04-01/Accounts/AC123/Queues/QQ123/Members/Front.json', 26 | $this->formHeaders, 'Url=http%3A%2F%2Ffoo.com&Method=POST') 27 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 28 | json_encode(array('call_sid' => 'CA123', 'position' => 0)) 29 | )); 30 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 31 | $queue = $client->account->queues->get('QQ123'); 32 | $firstMember = $queue->members->front(); 33 | $firstMember->dequeue('http://foo.com'); 34 | } 35 | 36 | function testDequeueSid() { 37 | $http = m::mock(new Services_Twilio_TinyHttp); 38 | $http->shouldReceive('post')->once() 39 | ->with('/2010-04-01/Accounts/AC123/Queues/QQ123/Members/CA123.json', 40 | $this->formHeaders, 'Url=http%3A%2F%2Ffoo.com&Method=GET') 41 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 42 | json_encode(array('call_sid' => 'CA123', 'position' => 0)) 43 | )); 44 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 45 | $queue = $client->account->queues->get('QQ123'); 46 | $firstMember = $queue->members->get('CA123'); 47 | $firstMember->dequeue('http://foo.com', 'GET'); 48 | } 49 | 50 | function testMemberIterate() { 51 | $http = m::mock(new Services_Twilio_TinyHttp); 52 | $resp = json_encode( 53 | array( 54 | 'queue_members' => array( 55 | array('call_sid' => 'CA123', 'wait_time' => 30) 56 | ), 57 | 'end' => 1, 58 | ) 59 | ); 60 | $http->shouldReceive('get')->once() 61 | ->with('/2010-04-01/Accounts/AC123/Queues/QQ123/Members.json?Page=0&PageSize=50') 62 | ->andReturn(array(200, array('Content-Type' => 'application/json'), $resp 63 | )); 64 | $http->shouldReceive('get')->once() 65 | ->with('/2010-04-01/Accounts/AC123/Queues/QQ123/Members.json?Page=1&PageSize=50') 66 | ->andReturn(array(400, array('Content-Type' => 'application/json'), 67 | '{"status":400,"message":"foo", "code": "20006"}' 68 | )); 69 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 70 | $queue = $client->account->queues->get('QQ123'); 71 | foreach($queue->members as $member) { 72 | $this->assertSame($member->call_sid, 'CA123'); 73 | $this->assertSame($member->wait_time, 30); 74 | } 75 | } 76 | 77 | function tearDown() { 78 | m::close(); 79 | } 80 | 81 | } 82 | 83 | 84 | -------------------------------------------------------------------------------- /includes/twilio-php/package.php: -------------------------------------------------------------------------------- 1 | 29 | * @copyright 2014 Twilio 30 | * @license http://creativecommons.org/licenses/MIT/ 31 | * @link http://pear.php.net/package/Services_Twilio 32 | */ 33 | 34 | ini_set('display_errors', '0'); 35 | error_reporting(0); 36 | require_once 'PEAR/PackageFileManager/File.php'; 37 | require_once 'PEAR/PackageFileManager2.php'; 38 | PEAR::setErrorHandling(PEAR_ERROR_DIE); 39 | 40 | $api_version = '3.12.4'; 41 | $api_state = 'stable'; 42 | 43 | $release_version = '3.12.4'; 44 | $release_state = 'stable'; 45 | $release_notes = 'Add transcription link to recordings'; 46 | 47 | $description = <<setOptions( 55 | array( 56 | 'filelistgenerator' => 'file', 57 | 'simpleoutput' => true, 58 | 'baseinstalldir' => '/', 59 | 'packagedirectory' => './', 60 | 'dir_roles' => array( 61 | 'Services' => 'php', 62 | 'Services/Twilio' => 'php', 63 | 'tests' => 'test' 64 | ), 65 | 'ignore' => array( 66 | 'package.php', 67 | '*.tgz', 68 | 'scratch/*', 69 | 'vendor/*', 70 | 'composer.*', 71 | 'coverage/*', 72 | '.travis.yml', 73 | 'venv/*', 74 | ) 75 | ) 76 | ); 77 | 78 | $package->setPackage('Services_Twilio'); 79 | $package->setSummary('PHP helper library for Twilio'); 80 | $package->setDescription($description); 81 | $package->setChannel('twilio.github.com/pear'); 82 | $package->setPackageType('php'); 83 | $package->setLicense( 84 | 'MIT License', 85 | 'http://creativecommons.org/licenses/MIT/' 86 | ); 87 | 88 | $package->setNotes($release_notes); 89 | $package->setReleaseVersion($release_version); 90 | $package->setReleaseStability($release_state); 91 | $package->setAPIVersion($api_version); 92 | $package->setAPIStability($api_state); 93 | 94 | $package->addMaintainer( 95 | 'lead', 96 | 'kevinburke', 97 | 'Kevin Burke', 98 | 'kevin@twilio.com' 99 | ); 100 | 101 | 102 | $package->setPhpDep('5.2.1'); 103 | 104 | $package->addPackageDepWithChannel('optional', 'Mockery', 'pear.survivethedeepend.com'); 105 | 106 | $package->setPearInstallerDep('1.9.3'); 107 | $package->generateContents(); 108 | $package->addRelease(); 109 | 110 | if (isset($_GET['make']) 111 | || (isset($_SERVER['argv']) && @$_SERVER['argv'][1] == 'make') 112 | ) { 113 | $package->writePackageFile(); 114 | } else { 115 | $package->debugPackageFile(); 116 | } 117 | 118 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Rest/Call.php: -------------------------------------------------------------------------------- 1 | `_ documentation. 5 | * 6 | * .. php:attr:: sid 7 | * 8 | * A 34 character string that uniquely identifies this resource. 9 | * 10 | * .. php:attr:: parent_call_sid 11 | * 12 | * A 34 character string that uniquely identifies the call that created this leg. 13 | * 14 | * .. php:attr:: date_created 15 | * 16 | * The date that this resource was created, given as GMT in RFC 2822 format. 17 | * 18 | * .. php:attr:: date_updated 19 | * 20 | * The date that this resource was last updated, given as GMT in RFC 2822 format. 21 | * 22 | * .. php:attr:: account_sid 23 | * 24 | * The unique id of the Account responsible for creating this call. 25 | * 26 | * .. php:attr:: to 27 | * 28 | * The phone number that received this call. e.g., +16175551212 (E.164 format) 29 | * 30 | * .. php:attr:: from 31 | * 32 | * The phone number that made this call. e.g., +16175551212 (E.164 format) 33 | * 34 | * .. php:attr:: phone_number_sid 35 | * 36 | * If the call was inbound, this is the Sid of the IncomingPhoneNumber that 37 | * received the call. If the call was outbound, it is the Sid of the 38 | * OutgoingCallerId from which the call was placed. 39 | * 40 | * .. php:attr:: status 41 | * 42 | * A string representing the status of the call. May be `QUEUED`, `RINGING`, 43 | * `IN-PROGRESS`, `COMPLETED`, `FAILED`, `BUSY` or `NO_ANSWER`. 44 | * 45 | * .. php:attr:: stat_time 46 | * 47 | * The start time of the call, given as GMT in RFC 2822 format. Empty if the call has not yet been dialed. 48 | * 49 | * .. php:attr:: end_time 50 | * 51 | * The end time of the call, given as GMT in RFC 2822 format. Empty if the call did not complete successfully. 52 | * 53 | * .. php:attr:: duration 54 | * 55 | * The length of the call in seconds. This value is empty for busy, failed, unanswered or ongoing calls. 56 | * 57 | * .. php:attr:: price 58 | * 59 | * The charge for this call in USD. Populated after the call is completed. May not be immediately available. 60 | * 61 | * .. php:attr:: direction 62 | * 63 | * A string describing the direction of the call. inbound for inbound 64 | * calls, outbound-api for calls initiated via the REST API or 65 | * outbound-dial for calls initiated by a verb. 66 | * 67 | * .. php:attr:: answered_by 68 | * 69 | * If this call was initiated with answering machine detection, either human or machine. Empty otherwise. 70 | * 71 | * .. php:attr:: forwarded_from 72 | * 73 | * If this call was an incoming call forwarded from another number, the 74 | * forwarding phone number (depends on carrier supporting forwarding). 75 | * Empty otherwise. 76 | * 77 | * .. php:attr:: caller_name 78 | * 79 | * If this call was an incoming call from a phone number with Caller ID Lookup enabled, the caller's name. Empty otherwise. 80 | */ 81 | class Services_Twilio_Rest_Call extends Services_Twilio_InstanceResource { 82 | 83 | /** 84 | * Hang up the call 85 | */ 86 | public function hangup() { 87 | $this->update('Status', 'completed'); 88 | } 89 | 90 | /** 91 | * Redirect the call to a new URL 92 | * 93 | * :param string $url: the new URL to retrieve call flow from. 94 | */ 95 | public function route($url) { 96 | $this->update('Url', $url); 97 | } 98 | 99 | protected function init($client, $uri) { 100 | $this->setupSubresources( 101 | 'notifications', 102 | 'recordings' 103 | ); 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Resource.php: -------------------------------------------------------------------------------- 1 | 9 | * @license http://creativecommons.org/licenses/MIT/ MIT 10 | * @link http://pear.php.net/package/Services_Twilio 11 | */ 12 | abstract class Services_Twilio_Resource { 13 | protected $subresources; 14 | 15 | public function __construct($client, $uri, $params = array()) 16 | { 17 | $this->subresources = array(); 18 | $this->client = $client; 19 | 20 | foreach ($params as $name => $param) { 21 | $this->$name = $param; 22 | } 23 | 24 | $this->uri = $uri; 25 | $this->init($client, $uri); 26 | } 27 | 28 | protected function init($client, $uri) 29 | { 30 | // Left empty for derived classes to implement 31 | } 32 | 33 | public function getSubresources($name = null) { 34 | if (isset($name)) { 35 | return isset($this->subresources[$name]) 36 | ? $this->subresources[$name] 37 | : null; 38 | } 39 | return $this->subresources; 40 | } 41 | 42 | protected function setupSubresources() 43 | { 44 | foreach (func_get_args() as $name) { 45 | $constantized = ucfirst(self::camelize($name)); 46 | $type = "Services_Twilio_Rest_" . $constantized; 47 | $this->subresources[$name] = new $type( 48 | $this->client, $this->uri . "/$constantized" 49 | ); 50 | } 51 | } 52 | 53 | /* 54 | * Get the resource name from the classname 55 | * 56 | * Ex: Services_Twilio_Rest_Accounts -> Accounts 57 | * 58 | * @param boolean $camelized Whether to return camel case or not 59 | */ 60 | public function getResourceName($camelized = false) 61 | { 62 | $name = get_class($this); 63 | $parts = explode('_', $name); 64 | $basename = end($parts); 65 | if ($camelized) { 66 | return $basename; 67 | } else { 68 | return self::decamelize($basename); 69 | } 70 | } 71 | 72 | public static function decamelize($word) 73 | { 74 | $callback = create_function('$matches', 75 | 'return strtolower(strlen("$matches[1]") ? "$matches[1]_$matches[2]" : "$matches[2]");'); 76 | 77 | return preg_replace_callback( 78 | '/(^|[a-z])([A-Z])/', 79 | $callback, 80 | $word 81 | ); 82 | } 83 | 84 | /** 85 | * Return camelized version of a word 86 | * Examples: sms_messages => SMSMessages, calls => Calls, 87 | * incoming_phone_numbers => IncomingPhoneNumbers 88 | * 89 | * @param string $word The word to camelize 90 | * @return string 91 | */ 92 | public static function camelize($word) { 93 | $callback = create_function('$matches', 'return strtoupper("$matches[2]");'); 94 | 95 | return preg_replace_callback('/(^|_)([a-z])/', 96 | $callback, 97 | $word); 98 | } 99 | 100 | /** 101 | * Get the value of a property on this resource. 102 | * 103 | * @param string $key The property name 104 | * @return mixed Could be anything. 105 | */ 106 | public function __get($key) { 107 | if ($subresource = $this->getSubresources($key)) { 108 | return $subresource; 109 | } 110 | return $this->$key; 111 | } 112 | 113 | /** 114 | * Print a JSON representation of this object. Strips the HTTP client 115 | * before returning. 116 | * 117 | * Note, this should mainly be used for debugging, and is not guaranteed 118 | * to correspond 1:1 with the JSON API output. 119 | * 120 | * Note that echoing an object before an HTTP request has been made to 121 | * "fill in" its properties may return an empty object 122 | */ 123 | public function __toString() { 124 | $out = array(); 125 | foreach ($this as $key => $value) { 126 | if ($key !== 'client' && $key !== 'subresources') { 127 | $out[$key] = $value; 128 | } 129 | } 130 | return json_encode($out, true); 131 | } 132 | 133 | } 134 | 135 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/CapabilityTest.php: -------------------------------------------------------------------------------- 1 | generateToken(), 'foo'); 10 | $this->assertEquals($payload->iss, "AC123"); 11 | $this->assertEquals($payload->scope, ''); 12 | } 13 | 14 | public function testInboundPermissions() { 15 | $token = new Services_Twilio_Capability('AC123', 'foo'); 16 | $token->allowClientIncoming("andy"); 17 | $payload = JWT::decode($token->generateToken(), 'foo'); 18 | 19 | $eurl = "scope:client:incoming?clientName=andy"; 20 | $this->assertEquals($payload->scope, $eurl); 21 | } 22 | 23 | public function testOutboundPermissions() { 24 | $token = new Services_Twilio_Capability('AC123', 'foo'); 25 | $token->allowClientOutgoing("AP123"); 26 | $payload = JWT::decode($token->generateToken(), 'foo');; 27 | $eurl = "scope:client:outgoing?appSid=AP123"; 28 | $this->assertContains($eurl, $payload->scope); 29 | } 30 | 31 | public function testOutboundPermissionsParams() { 32 | $token = new Services_Twilio_Capability('AC123', 'foo'); 33 | $token->allowClientOutgoing("AP123", array("foobar" => 3)); 34 | $payload = JWT::decode($token->generateToken(), 'foo'); 35 | 36 | $eurl = "scope:client:outgoing?appSid=AP123&appParams=foobar%3D3"; 37 | $this->assertEquals($payload->scope, $eurl); 38 | } 39 | 40 | public function testEvents() { 41 | $token = new Services_Twilio_Capability('AC123', 'foo'); 42 | $token->allowEventStream(); 43 | $payload = JWT::decode($token->generateToken(), 'foo'); 44 | 45 | $event_uri = "scope:stream:subscribe?path=%2F2010" 46 | . "-04-01%2FEvents¶ms="; 47 | $this->assertEquals($payload->scope, $event_uri); 48 | } 49 | 50 | public function testEventsWithFilters() { 51 | $token = new Services_Twilio_Capability('AC123', 'foo'); 52 | $token->allowEventStream(array("foobar" => "hey")); 53 | $payload = JWT::decode($token->generateToken(), 'foo'); 54 | 55 | $event_uri = "scope:stream:subscribe?path=%2F2010-" 56 | . "04-01%2FEvents¶ms=foobar%3Dhey"; 57 | $this->assertEquals($payload->scope, $event_uri); 58 | } 59 | 60 | 61 | public function testDecode() { 62 | $token = new Services_Twilio_Capability('AC123', 'foo'); 63 | $token->allowClientOutgoing("AP123", array("foobar"=> 3)); 64 | $token->allowClientIncoming("andy"); 65 | $token->allowEventStream(); 66 | 67 | $outgoing_uri = "scope:client:outgoing?appSid=" 68 | . "AP123&appParams=foobar%3D3&clientName=andy"; 69 | $incoming_uri = "scope:client:incoming?clientName=andy"; 70 | $event_uri = "scope:stream:subscribe?path=%2F2010-04-01%2FEvents"; 71 | 72 | $payload = JWT::decode($token->generateToken(), 'foo'); 73 | $scope = $payload->scope; 74 | 75 | $this->assertContains($outgoing_uri, $scope); 76 | $this->assertContains($incoming_uri, $scope); 77 | $this->assertContains($event_uri, $scope); 78 | } 79 | 80 | 81 | function testDecodeWithAuthToken() { 82 | try { 83 | $token = new Services_Twilio_Capability('AC123', 'foo'); 84 | $payload = JWT::decode($token->generateToken(), 'foo'); 85 | $this->assertSame($payload->iss, 'AC123'); 86 | } catch (UnexpectedValueException $e) { 87 | $this->assertTrue(false, "Could not decode with 'foo'"); 88 | } 89 | } 90 | 91 | function testClientNameValidation() { 92 | $this->setExpectedException('InvalidArgumentException'); 93 | $token = new Services_Twilio_Capability('AC123', 'foo'); 94 | $token->allowClientIncoming('@'); 95 | $this->fail('exception should have been raised'); 96 | } 97 | 98 | function zeroLengthNameInvalid() { 99 | $this->setExpectedException('InvalidArgumentException'); 100 | $token = new Services_Twilio_Capability('AC123', 'foo'); 101 | $token->allowClientIncoming(""); 102 | $this->fail('exception should have been raised'); 103 | } 104 | 105 | 106 | } 107 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/usage/rest/calls.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | Phone Calls 3 | ============= 4 | 5 | Making a Phone Call 6 | =================== 7 | 8 | The :class:`Calls` resource allows you to make outgoing calls: 9 | 10 | .. code-block:: php 11 | 12 | $client = new Services_Twilio('AC123', '123'); 13 | $call = $client->account->calls->create( 14 | '9991231234', // From this number 15 | '8881231234', // Call this number 16 | 'http://foo.com/call.xml' 17 | ); 18 | print $call->length; 19 | print $call->sid; 20 | 21 | Adding Extra Call Parameters 22 | ============================ 23 | 24 | Add extra parameters, like a `StatusCallback` when the call ends, like this: 25 | 26 | .. code-block:: php 27 | 28 | $client = new Services_Twilio('AC123', '123'); 29 | $call = $client->account->calls->create( 30 | '9991231234', // From this number 31 | '8881231234', // Call this number 32 | 'http://foo.com/call.xml', 33 | array( 34 | 'StatusCallback' => 'http://foo.com/callback', 35 | 'StatusCallbackMethod' => 'GET' 36 | ) 37 | ); 38 | 39 | A full list of extra parameters can be found `here 40 | `_. 41 | 42 | Listing Calls 43 | ============= 44 | 45 | It's easy to iterate over your list of calls. 46 | 47 | .. code-block:: php 48 | 49 | $client = new Services_Twilio('AC123', '123'); 50 | foreach ($client->account->calls as $call) { 51 | echo "From: {$call->from}\nTo: {$call->to}\nSid: {$call->sid}\n\n"; 52 | } 53 | 54 | Filtering Calls 55 | ====================== 56 | 57 | Let's say you want to find all of the calls that have been sent from 58 | a particular number. You can do so by constructing an iterator explicitly: 59 | 60 | .. code-block:: php 61 | 62 | $client = new Services_Twilio('AC123', '123'); 63 | foreach ($client->account->calls->getIterator(0, 50, array( 64 | 'From' => '+14105551234' 65 | )) as $call) { 66 | echo "From: {$call->from}\nTo: {$call->to}\nSid: {$call->sid}\n\n"; 67 | } 68 | 69 | Accessing Resources from a Specific Call 70 | ======================================== 71 | 72 | The :class:`Call` resource has some subresources you can access, such as 73 | notifications and recordings. If you have already have a :class:`Call` 74 | resource, they are easy to get: 75 | 76 | .. code-block:: php 77 | 78 | $client = new Services_Twilio('AC123', '123'); 79 | foreach ($client->account->calls as $call) { 80 | $notifications = $call->notifications; 81 | if (is_array($notifications)) { 82 | foreach ($notifications as $notification) { 83 | print $notification->sid; 84 | } 85 | } 86 | 87 | $transcriptions = $call->transcriptions; 88 | if (is_array($transcriptions)) { 89 | foreach ($transcriptions as $transcription) { 90 | print $transcription->sid; 91 | } 92 | } 93 | 94 | $recordings = $call->recordings; 95 | if (is_array($recordings)) { 96 | foreach ($recordings as $recording) { 97 | print $recording->sid; 98 | } 99 | } 100 | } 101 | 102 | Be careful, as the above code makes quite a few HTTP requests and may display 103 | PHP warnings for unintialized variables. 104 | 105 | Retrieve a Call Record 106 | ====================== 107 | 108 | If you already have a :class:`Call` sid, you can use the client to retrieve 109 | that record.: 110 | 111 | .. code-block:: php 112 | 113 | $client = new Services_Twilio('AC123', '123'); 114 | $sid = "CA12341234" 115 | $call = $client->account->calls->get($sid) 116 | 117 | Modifying live calls 118 | ==================== 119 | 120 | The :class:`Call` resource makes it easy to find current live calls and 121 | redirect them as necessary: 122 | 123 | .. code-block:: php 124 | 125 | $client = new Services_Twilio('AC123', '123'); 126 | $calls = $client->account->calls->getIterator(0, 50, array('Status' => 'in-progress')); 127 | foreach ($calls as $call) { 128 | $call->update(array('Url' => 'http://foo.com/new.xml', 'Method' => 'POST')); 129 | } 130 | 131 | Ending all live calls is also possible: 132 | 133 | .. code-block:: php 134 | 135 | $client = new Services_Twilio('AC123', '123'); 136 | $calls = $client->account->calls->getIterator(0, 50, array('Status' => 'in-progress')); 137 | foreach ($calls as $call) { 138 | $call->hangup(); 139 | } 140 | 141 | Note that :meth:`hangup` will also cancel calls currently queued. 142 | -------------------------------------------------------------------------------- /includes/twilio-php/README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://secure.travis-ci.org/twilio/twilio-php.png?branch=master)](http://travis-ci.org/twilio/twilio-php) 2 | 3 | ## Installation 4 | 5 | You can install **twilio-php** via PEAR or by downloading the source. 6 | 7 | #### Via PEAR (>= 1.9.3): 8 | 9 | PEAR is a package manager for PHP. Open a command line and use these PEAR 10 | commands to download the helper library: 11 | 12 | $ pear channel-discover twilio-pear.herokuapp.com/pear 13 | $ pear install twilio/Services_Twilio 14 | 15 | If you get the following message: 16 | 17 | $ -bash: pear: command not found 18 | 19 | you can install PEAR from their website, or download the source directly. 20 | 21 | #### Via Composer: 22 | 23 | **twilio-php** is available on Packagist as the 24 | [`twilio/sdk`](http://packagist.org/packages/twilio/sdk) package. 25 | 26 | #### Via ZIP file: 27 | 28 | [Click here to download the source 29 | (.zip)](https://github.com/twilio/twilio-php/zipball/master) which includes all 30 | dependencies. 31 | 32 | Once you download the library, move the twilio-php folder to your project 33 | directory and then include the library file: 34 | 35 | require '/path/to/twilio-php/Services/Twilio.php'; 36 | 37 | and you're good to go! 38 | 39 | ## A Brief Introduction 40 | 41 | With the twilio-php library, we've simplified interaction with the 42 | Twilio REST API. No need to manually create URLS or parse XML/JSON. 43 | You now interact with resources directly. Follow the [Quickstart 44 | Guide](http://readthedocs.org/docs/twilio-php/en/latest/#quickstart) 45 | to get up and running right now. The [User 46 | Guide](http://readthedocs.org/docs/twilio-php/en/latest/#user-guide) shows you 47 | how to get the most out of **twilio-php**. 48 | 49 | ## Quickstart 50 | 51 | ### Send an SMS 52 | 53 | ```php 54 | account->messages->sendMessage( 64 | '9991231234', // From a valid Twilio number 65 | '8881231234', // Text this number 66 | "Hello monkey!" 67 | ); 68 | 69 | print $message->sid; 70 | ``` 71 | 72 | ### Make a Call 73 | 74 | ```php 75 | account->calls->create( 85 | '9991231234', // From a valid Twilio number 86 | '8881231234', // Call this number 87 | 88 | // Read TwiML at this URL when a call connects (hold music) 89 | 'http://twimlets.com/holdmusic?Bucket=com.twilio.music.ambient' 90 | ); 91 | ``` 92 | 93 | ### Generating TwiML 94 | 95 | To control phone calls, your application needs to output 96 | [TwiML](http://www.twilio.com/docs/api/twiml/ "Twilio Markup Language"). Use 97 | `Services_Twilio_Twiml` to easily create such responses. 98 | 99 | ```php 100 | say('Hello'); 105 | $response->play('https://api.twilio.com/cowbell.mp3', array("loop" => 5)); 106 | print $response; 107 | ``` 108 | 109 | That will output XML that looks like this: 110 | 111 | ```xml 112 | 113 | 114 | Hello 115 | https://api.twilio.com/cowbell.mp3 116 | 117 | ``` 118 | 119 | ## [Full Documentation](http://readthedocs.org/docs/twilio-php/en/latest/ "Twilio PHP Library Documentation") 120 | 121 | The documentation for **twilio-php** is hosted 122 | at Read the Docs. [Click here to read our full 123 | documentation.](http://readthedocs.org/docs/twilio-php/en/latest/ "Twilio PHP 124 | Library Documentation") 125 | 126 | ## Prerequisites 127 | 128 | * PHP >= 5.2.3 129 | * The PHP JSON extension 130 | 131 | ## Reporting Issues 132 | 133 | We would love to hear your feedback. Report issues using the [Github 134 | Issue Tracker](https://github.com/twilio/twilio-php/issues) or email 135 | [help@twilio.com](mailto:help@twilio.com). 136 | 137 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/TinyHttp.php: -------------------------------------------------------------------------------- 1 | array( 27 | * CURLOPT_USERAGENT => self::USER_AGENT, 28 | * CURLOPT_HTTPHEADER => array('Accept-Charset: utf-8'), 29 | * CURLOPT_CAINFO => dirname(__FILE__) . '/cacert.pem', 30 | * )) 31 | * ); 32 | */ 33 | class Services_Twilio_TinyHttp { 34 | var $user, $pass, $scheme, $host, $port, $debug, $curlopts; 35 | 36 | public function __construct($uri = '', $kwargs = array()) { 37 | foreach (parse_url($uri) as $name => $value) $this->$name = $value; 38 | $this->debug = isset($kwargs['debug']) ? !!$kwargs['debug'] : NULL; 39 | $this->curlopts = isset($kwargs['curlopts']) ? $kwargs['curlopts'] : array(); 40 | } 41 | 42 | public function __call($name, $args) { 43 | list($res, $req_headers, $req_body) = $args + array(0, array(), ''); 44 | 45 | $opts = $this->curlopts + array( 46 | CURLOPT_URL => "$this->scheme://$this->host$res", 47 | CURLOPT_HEADER => TRUE, 48 | CURLOPT_RETURNTRANSFER => TRUE, 49 | CURLOPT_INFILESIZE => -1, 50 | CURLOPT_POSTFIELDS => NULL, 51 | CURLOPT_TIMEOUT => 60, 52 | ); 53 | 54 | foreach ($req_headers as $k => $v) $opts[CURLOPT_HTTPHEADER][] = "$k: $v"; 55 | if ($this->port) $opts[CURLOPT_PORT] = $this->port; 56 | if ($this->debug) $opts[CURLINFO_HEADER_OUT] = TRUE; 57 | if ($this->user && $this->pass) $opts[CURLOPT_USERPWD] = "$this->user:$this->pass"; 58 | switch ($name) { 59 | case 'get': 60 | $opts[CURLOPT_HTTPGET] = TRUE; 61 | break; 62 | case 'post': 63 | $opts[CURLOPT_POST] = TRUE; 64 | $opts[CURLOPT_POSTFIELDS] = $req_body; 65 | break; 66 | case 'put': 67 | $opts[CURLOPT_PUT] = TRUE; 68 | if (strlen($req_body)) { 69 | if ($buf = fopen('php://memory', 'w+')) { 70 | fwrite($buf, $req_body); 71 | fseek($buf, 0); 72 | $opts[CURLOPT_INFILE] = $buf; 73 | $opts[CURLOPT_INFILESIZE] = strlen($req_body); 74 | } else throw new Services_Twilio_TinyHttpException('unable to open temporary file'); 75 | } 76 | break; 77 | case 'head': 78 | $opts[CURLOPT_NOBODY] = TRUE; 79 | break; 80 | default: 81 | $opts[CURLOPT_CUSTOMREQUEST] = strtoupper($name); 82 | break; 83 | } 84 | try { 85 | if ($curl = curl_init()) { 86 | if (curl_setopt_array($curl, $opts)) { 87 | if ($response = curl_exec($curl)) { 88 | $parts = explode("\r\n\r\n", $response, 3); 89 | list($head, $body) = ($parts[0] == 'HTTP/1.1 100 Continue') 90 | ? array($parts[1], $parts[2]) 91 | : array($parts[0], $parts[1]); 92 | $status = curl_getinfo($curl, CURLINFO_HTTP_CODE); 93 | if ($this->debug) { 94 | error_log( 95 | curl_getinfo($curl, CURLINFO_HEADER_OUT) . 96 | $req_body 97 | ); 98 | } 99 | $header_lines = explode("\r\n", $head); 100 | array_shift($header_lines); 101 | foreach ($header_lines as $line) { 102 | list($key, $value) = explode(":", $line, 2); 103 | $headers[$key] = trim($value); 104 | } 105 | curl_close($curl); 106 | if (isset($buf) && is_resource($buf)) { 107 | fclose($buf); 108 | } 109 | return array($status, $headers, $body); 110 | } else { 111 | throw new Services_Twilio_TinyHttpException(curl_error($curl)); 112 | } 113 | } else throw new Services_Twilio_TinyHttpException(curl_error($curl)); 114 | } else throw new Services_Twilio_TinyHttpException('unable to initialize cURL'); 115 | } catch (ErrorException $e) { 116 | if (is_resource($curl)) curl_close($curl); 117 | if (isset($buf) && is_resource($buf)) fclose($buf); 118 | throw $e; 119 | } 120 | } 121 | 122 | public function authenticate($user, $pass) { 123 | $this->user = $user; 124 | $this->pass = $pass; 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /includes/twilio-php/Services/Twilio/Twiml.php: -------------------------------------------------------------------------------- 1 | 12 | * License: http://creativecommons.org/licenses/MIT/ MIT 13 | */ 14 | class Services_Twilio_Twiml { 15 | 16 | protected $element; 17 | 18 | /** 19 | * Constructs a Twiml response. 20 | * 21 | * :param SimpleXmlElement|array $arg: Can be any of 22 | * 23 | * - the element to wrap 24 | * - attributes to add to the element 25 | * - if null, initialize an empty element named 'Response' 26 | */ 27 | public function __construct($arg = null) { 28 | switch (true) { 29 | case $arg instanceof SimpleXmlElement: 30 | $this->element = $arg; 31 | break; 32 | case $arg === null: 33 | $this->element = new SimpleXmlElement(''); 34 | break; 35 | case is_array($arg): 36 | $this->element = new SimpleXmlElement(''); 37 | foreach ($arg as $name => $value) { 38 | $this->element->addAttribute($name, $value); 39 | } 40 | break; 41 | default: 42 | throw new TwimlException('Invalid argument'); 43 | } 44 | } 45 | 46 | /** 47 | * Converts method calls into Twiml verbs. 48 | * 49 | * A basic example: 50 | * 51 | * .. code-block:: php 52 | * 53 | * php> print $this->say('hello'); 54 | * hello 55 | * 56 | * An example with attributes: 57 | * 58 | * .. code-block:: php 59 | * 60 | * print $this->say('hello', array('voice' => 'woman')); 61 | * hello 62 | * 63 | * You could even just pass in an attributes array, omitting the noun: 64 | * 65 | * .. code-block:: php 66 | * 67 | * print $this->gather(array('timeout' => '20')); 68 | * 69 | * 70 | * :param string $verb: The Twiml verb. 71 | * :param array $args: 72 | * - (noun string) 73 | * - (noun string, attributes array) 74 | * - (attributes array) 75 | * 76 | * :return: A SimpleXmlElement 77 | * :rtype: SimpleXmlElement 78 | */ 79 | public function __call($verb, array $args) 80 | { 81 | list($noun, $attrs) = $args + array('', array()); 82 | if (is_array($noun)) { 83 | list($attrs, $noun) = array($noun, ''); 84 | } 85 | /* addChild does not escape XML, while addAttribute does. This means if 86 | * you pass unescaped ampersands ("&") to addChild, you will generate 87 | * an error. 88 | * 89 | * Some inexperienced developers will pass in unescaped ampersands, and 90 | * we want to make their code work, by escaping the ampersands for them 91 | * before passing the string to addChild. (with htmlentities) 92 | * 93 | * However other people will know what to do, and their code 94 | * already escapes ampersands before passing them to addChild. We don't 95 | * want to break their existing code by turning their &'s into 96 | * &amp; 97 | * 98 | * We also want to use numeric entities, not named entities so that we 99 | * are fully compatible with XML 100 | * 101 | * The following lines accomplish the desired behavior. 102 | */ 103 | $decoded = html_entity_decode($noun, ENT_COMPAT, 'UTF-8'); 104 | $normalized = htmlspecialchars($decoded, ENT_COMPAT, 'UTF-8', false); 105 | $child = empty($noun) 106 | ? $this->element->addChild(ucfirst($verb)) 107 | : $this->element->addChild(ucfirst($verb), $normalized); 108 | foreach ($attrs as $name => $value) { 109 | /* Note that addAttribute escapes raw ampersands by default, so we 110 | * haven't touched its implementation. So this is the matrix for 111 | * addAttribute: 112 | * 113 | * & turns into & 114 | * & turns into &amp; 115 | */ 116 | if (is_bool($value)) { 117 | $value = ($value === true) ? 'true' : 'false'; 118 | } 119 | $child->addAttribute($name, $value); 120 | } 121 | return new static($child); 122 | } 123 | 124 | /** 125 | * Returns the object as XML. 126 | * 127 | * :return: The response as an XML string 128 | * :rtype: string 129 | */ 130 | public function __toString() 131 | { 132 | $xml = $this->element->asXml(); 133 | return str_replace( 134 | '', 135 | '', $xml); 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/IncomingPhoneNumbersTest.php: -------------------------------------------------------------------------------- 1 | array( 9 | array( 10 | 'sid' => 'PN123', 11 | 'sms_fallback_method' => 'POST', 12 | 'voice_method' => 'POST', 13 | 'friendly_name' => '(510) 564-7903', 14 | ) 15 | ), 16 | ); 17 | 18 | function testGetNumberWithResult() { 19 | $http = m::mock(new Services_Twilio_TinyHttp); 20 | $http->shouldReceive('get')->once() 21 | ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers.json?Page=0&PageSize=1&PhoneNumber=%2B14105551234') 22 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 23 | json_encode($this->apiResponse) 24 | ) 25 | ); 26 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 27 | $number = $client->account->incoming_phone_numbers->getNumber('+14105551234'); 28 | $this->assertEquals('PN123', $number->sid); 29 | } 30 | 31 | function testGetNumberNoResults() { 32 | $http = m::mock(new Services_Twilio_TinyHttp); 33 | $http->shouldReceive('get')->once() 34 | ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers.json?Page=0&PageSize=1&PhoneNumber=%2B14105551234') 35 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 36 | json_encode(array( 37 | 'incoming_phone_numbers' => array(), 38 | 'page' => 0, 39 | 'page_size' => 1, 40 | )) 41 | ) 42 | ); 43 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 44 | $number = $client->account->incoming_phone_numbers->getNumber('+14105551234'); 45 | $this->assertNull($number); 46 | } 47 | 48 | function testGetMobile() { 49 | $http = m::mock(new Services_Twilio_TinyHttp); 50 | $http->shouldReceive('get')->once() 51 | ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/Mobile.json?Page=0&PageSize=50') 52 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 53 | json_encode($this->apiResponse) 54 | )); 55 | $http->shouldReceive('get')->once() 56 | ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/Mobile.json?Page=1&PageSize=50') 57 | ->andReturn(array(400, array('Content-Type' => 'application/json'), 58 | '{"status":400,"message":"foo", "code": "20006"}' 59 | )); 60 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 61 | foreach ($client->account->incoming_phone_numbers->mobile as $num) { 62 | $this->assertEquals('(510) 564-7903', $num->friendly_name); 63 | } 64 | } 65 | 66 | function testGetLocal() { 67 | $http = m::mock(new Services_Twilio_TinyHttp); 68 | $http->shouldReceive('get')->once() 69 | ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/Local.json?Page=0&PageSize=50') 70 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 71 | json_encode($this->apiResponse) 72 | )); 73 | $http->shouldReceive('get')->once() 74 | ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/Local.json?Page=1&PageSize=50') 75 | ->andReturn(array(400, array('Content-Type' => 'application/json'), 76 | '{"status":400,"message":"foo", "code": "20006"}' 77 | )); 78 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 79 | 80 | foreach ($client->account->incoming_phone_numbers->local as $num) { 81 | $this->assertEquals('(510) 564-7903', $num->friendly_name); 82 | } 83 | } 84 | 85 | function testGetTollFree() { 86 | $http = m::mock(new Services_Twilio_TinyHttp); 87 | $http->shouldReceive('get')->once() 88 | ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/TollFree.json?Page=0&PageSize=50') 89 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 90 | json_encode($this->apiResponse) 91 | )); 92 | $http->shouldReceive('get')->once() 93 | ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/TollFree.json?Page=1&PageSize=50') 94 | ->andReturn(array(400, array('Content-Type' => 'application/json'), 95 | '{"status":400,"message":"foo", "code": "20006"}' 96 | )); 97 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 98 | foreach ($client->account->incoming_phone_numbers->toll_free as $num) { 99 | $this->assertEquals('(510) 564-7903', $num->friendly_name); 100 | } 101 | } 102 | 103 | } 104 | 105 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/_themes/flask_theme_support.py: -------------------------------------------------------------------------------- 1 | # flasky extensions. flasky pygments style based on tango style 2 | from pygments.style import Style 3 | from pygments.token import Keyword, Name, Comment, String, Error, \ 4 | Number, Operator, Generic, Whitespace, Punctuation, Other, Literal 5 | 6 | 7 | class FlaskyStyle(Style): 8 | background_color = "#f8f8f8" 9 | default_style = "" 10 | 11 | styles = { 12 | # No corresponding class for the following: 13 | #Text: "", # class: '' 14 | Whitespace: "underline #f8f8f8", # class: 'w' 15 | Error: "#a40000 border:#ef2929", # class: 'err' 16 | Other: "#000000", # class 'x' 17 | 18 | Comment: "italic #8f5902", # class: 'c' 19 | Comment.Preproc: "noitalic", # class: 'cp' 20 | 21 | Keyword: "bold #004461", # class: 'k' 22 | Keyword.Constant: "bold #004461", # class: 'kc' 23 | Keyword.Declaration: "bold #004461", # class: 'kd' 24 | Keyword.Namespace: "bold #004461", # class: 'kn' 25 | Keyword.Pseudo: "bold #004461", # class: 'kp' 26 | Keyword.Reserved: "bold #004461", # class: 'kr' 27 | Keyword.Type: "bold #004461", # class: 'kt' 28 | 29 | Operator: "#582800", # class: 'o' 30 | Operator.Word: "bold #004461", # class: 'ow' - like keywords 31 | 32 | Punctuation: "bold #000000", # class: 'p' 33 | 34 | # because special names such as Name.Class, Name.Function, etc. 35 | # are not recognized as such later in the parsing, we choose them 36 | # to look the same as ordinary variables. 37 | Name: "#000000", # class: 'n' 38 | Name.Attribute: "#c4a000", # class: 'na' - to be revised 39 | Name.Builtin: "#004461", # class: 'nb' 40 | Name.Builtin.Pseudo: "#3465a4", # class: 'bp' 41 | Name.Class: "#000000", # class: 'nc' - to be revised 42 | Name.Constant: "#000000", # class: 'no' - to be revised 43 | Name.Decorator: "#888", # class: 'nd' - to be revised 44 | Name.Entity: "#ce5c00", # class: 'ni' 45 | Name.Exception: "bold #cc0000", # class: 'ne' 46 | Name.Function: "#000000", # class: 'nf' 47 | Name.Property: "#000000", # class: 'py' 48 | Name.Label: "#f57900", # class: 'nl' 49 | Name.Namespace: "#000000", # class: 'nn' - to be revised 50 | Name.Other: "#000000", # class: 'nx' 51 | Name.Tag: "bold #004461", # class: 'nt' - like a keyword 52 | Name.Variable: "#000000", # class: 'nv' - to be revised 53 | Name.Variable.Class: "#000000", # class: 'vc' - to be revised 54 | Name.Variable.Global: "#000000", # class: 'vg' - to be revised 55 | Name.Variable.Instance: "#000000", # class: 'vi' - to be revised 56 | 57 | Number: "#990000", # class: 'm' 58 | 59 | Literal: "#000000", # class: 'l' 60 | Literal.Date: "#000000", # class: 'ld' 61 | 62 | String: "#4e9a06", # class: 's' 63 | String.Backtick: "#4e9a06", # class: 'sb' 64 | String.Char: "#4e9a06", # class: 'sc' 65 | String.Doc: "italic #8f5902", # class: 'sd' - like a comment 66 | String.Double: "#4e9a06", # class: 's2' 67 | String.Escape: "#4e9a06", # class: 'se' 68 | String.Heredoc: "#4e9a06", # class: 'sh' 69 | String.Interpol: "#4e9a06", # class: 'si' 70 | String.Other: "#4e9a06", # class: 'sx' 71 | String.Regex: "#4e9a06", # class: 'sr' 72 | String.Single: "#4e9a06", # class: 's1' 73 | String.Symbol: "#4e9a06", # class: 'ss' 74 | 75 | Generic: "#000000", # class: 'g' 76 | Generic.Deleted: "#a40000", # class: 'gd' 77 | Generic.Emph: "italic #000000", # class: 'ge' 78 | Generic.Error: "#ef2929", # class: 'gr' 79 | Generic.Heading: "bold #000080", # class: 'gh' 80 | Generic.Inserted: "#00A000", # class: 'gi' 81 | Generic.Output: "#888", # class: 'go' 82 | Generic.Prompt: "#745334", # class: 'gp' 83 | Generic.Strong: "bold #000000", # class: 'gs' 84 | Generic.Subheading: "bold #800080", # class: 'gu' 85 | Generic.Traceback: "bold #a40000", # class: 'gt' 86 | } 87 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/Makefile: -------------------------------------------------------------------------------- 1 | # Makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | PAPER = 8 | BUILDDIR = _build 9 | 10 | # Internal variables. 11 | PAPEROPT_a4 = -D latex_paper_size=a4 12 | PAPEROPT_letter = -D latex_paper_size=letter 13 | ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . 14 | 15 | .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest 16 | 17 | help: 18 | @echo "Please use \`make ' where is one of" 19 | @echo " html to make standalone HTML files" 20 | @echo " dirhtml to make HTML files named index.html in directories" 21 | @echo " singlehtml to make a single large HTML file" 22 | @echo " pickle to make pickle files" 23 | @echo " json to make JSON files" 24 | @echo " htmlhelp to make HTML files and a HTML help project" 25 | @echo " qthelp to make HTML files and a qthelp project" 26 | @echo " devhelp to make HTML files and a Devhelp project" 27 | @echo " epub to make an epub" 28 | @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" 29 | @echo " latexpdf to make LaTeX files and run them through pdflatex" 30 | @echo " text to make text files" 31 | @echo " man to make manual pages" 32 | @echo " changes to make an overview of all changed/added/deprecated items" 33 | @echo " linkcheck to check all external links for integrity" 34 | @echo " doctest to run all doctests embedded in the documentation (if enabled)" 35 | 36 | clean: 37 | -rm -rf $(BUILDDIR)/* 38 | 39 | html: 40 | $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html 41 | @echo 42 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." 43 | 44 | dirhtml: 45 | $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml 46 | @echo 47 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." 48 | 49 | singlehtml: 50 | $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml 51 | @echo 52 | @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." 53 | 54 | pickle: 55 | $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle 56 | @echo 57 | @echo "Build finished; now you can process the pickle files." 58 | 59 | json: 60 | $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json 61 | @echo 62 | @echo "Build finished; now you can process the JSON files." 63 | 64 | htmlhelp: 65 | $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp 66 | @echo 67 | @echo "Build finished; now you can run HTML Help Workshop with the" \ 68 | ".hhp project file in $(BUILDDIR)/htmlhelp." 69 | 70 | qthelp: 71 | $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp 72 | @echo 73 | @echo "Build finished; now you can run "qcollectiongenerator" with the" \ 74 | ".qhcp project file in $(BUILDDIR)/qthelp, like this:" 75 | @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Services_Twilio.qhcp" 76 | @echo "To view the help file:" 77 | @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Services_Twilio.qhc" 78 | 79 | devhelp: 80 | $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp 81 | @echo 82 | @echo "Build finished." 83 | @echo "To view the help file:" 84 | @echo "# mkdir -p $$HOME/.local/share/devhelp/Services_Twilio" 85 | @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Services_Twilio" 86 | @echo "# devhelp" 87 | 88 | epub: 89 | $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub 90 | @echo 91 | @echo "Build finished. The epub file is in $(BUILDDIR)/epub." 92 | 93 | latex: 94 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 95 | @echo 96 | @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." 97 | @echo "Run \`make' in that directory to run these through (pdf)latex" \ 98 | "(use \`make latexpdf' here to do that automatically)." 99 | 100 | latexpdf: 101 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 102 | @echo "Running LaTeX files through pdflatex..." 103 | make -C $(BUILDDIR)/latex all-pdf 104 | @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." 105 | 106 | text: 107 | $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text 108 | @echo 109 | @echo "Build finished. The text files are in $(BUILDDIR)/text." 110 | 111 | man: 112 | $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man 113 | @echo 114 | @echo "Build finished. The manual pages are in $(BUILDDIR)/man." 115 | 116 | changes: 117 | $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes 118 | @echo 119 | @echo "The overview file is in $(BUILDDIR)/changes." 120 | 121 | linkcheck: 122 | $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck 123 | @echo 124 | @echo "Link check complete; look for any errors in the above output " \ 125 | "or in $(BUILDDIR)/linkcheck/output.txt." 126 | 127 | doctest: 128 | $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest 129 | @echo "Testing of doctests in the sources finished, look at the " \ 130 | "results in $(BUILDDIR)/doctest/output.txt." 131 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/index.rst: -------------------------------------------------------------------------------- 1 | .. Services_Twilio documentation master file, created by 2 | sphinx-quickstart on Tue Mar 8 04:02:01 2011. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | ================= 7 | **twilio-php** 8 | ================= 9 | 10 | Status 11 | ======= 12 | 13 | This documentation is for version 3.12.2 of `twilio-php 14 | `_. 15 | 16 | Quickstart 17 | ============ 18 | 19 | Send an SMS 20 | >>>>>>>>>>> 21 | 22 | .. code-block:: php 23 | 24 | // Download the library and copy into the folder containing this file. 25 | require('/path/to/twilio-php/Services/Twilio.php'); 26 | 27 | $account_sid = "ACXXXXXX"; // Your Twilio account sid 28 | $auth_token = "YYYYYY"; // Your Twilio auth token 29 | 30 | $client = new Services_Twilio($account_sid, $auth_token); 31 | $message = $client->account->messages->sendMessage( 32 | '+14085551234', // From a Twilio number in your account 33 | '+12125551234', // Text any number 34 | "Hello monkey!" 35 | ); 36 | 37 | print $message->sid; 38 | 39 | Make a Call 40 | >>>>>>>>>>>>>> 41 | 42 | .. code-block:: php 43 | 44 | // Download the library and copy into the folder containing this file. 45 | require('/path/to/twilio-php/Services/Twilio.php'); 46 | 47 | $account_sid = "ACXXXXXX"; // Your Twilio account sid 48 | $auth_token = "YYYYYY"; // Your Twilio auth token 49 | 50 | $client = new Services_Twilio($account_sid, $auth_token); 51 | $call = $client->account->calls->create( 52 | '+14085551234', // From a Twilio number in your account 53 | '+12125551234', // Call any number 54 | 55 | // Read TwiML at this URL when a call connects (hold music) 56 | 'http://twimlets.com/holdmusic?Bucket=com.twilio.music.ambient' 57 | ); 58 | 59 | Generating TwiML 60 | >>>>>>>>>>>>>>>> 61 | 62 | To control phone calls, your application needs to output `TwiML 63 | `_. Use :class:`Services_Twilio_Twiml` 64 | to easily create such responses. 65 | 66 | .. code-block:: php 67 | 68 | $response = new Services_Twilio_Twiml(); 69 | $response->say('Hello'); 70 | $response->play('https://api.twilio.com/cowbell.mp3', array("loop" => 5)); 71 | print $response; 72 | 73 | .. code-block:: xml 74 | 75 | 76 | 77 | Hello 78 | https://api.twilio.com/cowbell.mp3 79 | 80 | 81 | View more examples of TwiML generation here: :ref:`usage-twiml` 82 | 83 | Installation 84 | ============ 85 | 86 | There are two ways to install **twilio-php**: via the PEAR installer, or by 87 | downloading the source. 88 | 89 | Via PEAR 90 | >>>>>>>>>>>>> 91 | 92 | Use the ``Makefile`` in the repo's top 93 | 94 | .. code-block:: bash 95 | 96 | pear channel-discover twilio.github.com/pear 97 | pear install twilio/Services_Twilio 98 | 99 | From Source 100 | >>>>>>>>>>>>> 101 | 102 | If you aren't using PEAR, download the `source (.zip) 103 | `_, which includes all the 104 | dependencies. 105 | 106 | User Guide 107 | ================== 108 | 109 | REST API 110 | >>>>>>>>>> 111 | 112 | .. toctree:: 113 | :maxdepth: 2 114 | :glob: 115 | 116 | usage/rest 117 | usage/rest/* 118 | 119 | TwiML and other utilities 120 | >>>>>>>>>>>>>>>>>>>>>>>>>> 121 | 122 | .. toctree:: 123 | :maxdepth: 1 124 | 125 | usage/twiml 126 | usage/validation 127 | usage/token-generation 128 | faq/ 129 | 130 | API Documentation 131 | ================== 132 | 133 | .. toctree:: 134 | :maxdepth: 3 135 | :glob: 136 | 137 | api/* 138 | 139 | 140 | Support and Development 141 | =========================== 142 | 143 | All development occurs on `Github `_. To 144 | check out the source, run 145 | 146 | .. code-block:: bash 147 | 148 | git clone git@github.com:twilio/twilio-php.git 149 | 150 | Report bugs using the Github `issue tracker `_. 151 | 152 | If you've got questions that aren't answered by this documentation, ask the 153 | Twilio support team at help@twilio.com. 154 | 155 | Running the Tests 156 | >>>>>>>>>>>>>>>>>>>>>>>>> 157 | 158 | The unit tests depend on `Mockery `_ and 159 | `PHPUnit `_. First, 'discover' all 160 | the necessary `PEAR` channels: 161 | 162 | .. code-block:: bash 163 | 164 | make test-install 165 | 166 | After installation, run the tests with :data:`make`. 167 | 168 | .. code-block:: bash 169 | 170 | make test 171 | 172 | 173 | Making the Documentation 174 | >>>>>>>>>>>>>>>>>>>>>>>>>> 175 | 176 | Our documentation is written using `Sphinx `_. You'll 177 | need to install Sphinx and the Sphinx PHP domain before you can build the docs. 178 | 179 | .. code-block:: bash 180 | 181 | make docs-install 182 | 183 | Once you have those installed, making the docs is easy. 184 | 185 | .. code-block:: bash 186 | 187 | make docs 188 | 189 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/UsageTriggersTest.php: -------------------------------------------------------------------------------- 1 | shouldReceive('get')->once() 9 | ->with('/2010-04-01/Accounts/AC123/Usage/Triggers/UT123.json') 10 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 11 | json_encode(array( 12 | 'sid' => 'UT123', 13 | 'date_created' => 'Tue, 09 Oct 2012 19:27:24 +0000', 14 | 'recurring' => null, 15 | 'usage_category' => 'totalprice', 16 | )) 17 | )); 18 | $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); 19 | $usageSid = 'UT123'; 20 | $usageTrigger = $client->account->usage_triggers->get($usageSid); 21 | $this->assertSame('totalprice', $usageTrigger->usage_category); 22 | } 23 | 24 | protected $formHeaders = array('Content-Type' => 'application/x-www-form-urlencoded'); 25 | 26 | function testUpdateTrigger() { 27 | $http = m::mock(new Services_Twilio_TinyHttp); 28 | $usageSid = 'UT123'; 29 | $http->shouldReceive('post')->once() 30 | ->with('/2010-04-01/Accounts/AC123/Usage/Triggers/UT123.json', 31 | $this->formHeaders, 'FriendlyName=new') 32 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 33 | json_encode(array( 34 | 'friendly_name' => 'new', 35 | 'sid' => 'UT123', 36 | 'uri' => '/2010-04-01/Accounts/AC123/Usage/Triggers/UT123.json' 37 | )) 38 | )); 39 | $http->shouldReceive('get')->once() 40 | ->with('/2010-04-01/Accounts/AC123/Usage/Triggers/UT123.json') 41 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 42 | json_encode(array( 43 | 'sid' => 'UT123', 44 | 'friendly_name' => 'new', 45 | )) 46 | )); 47 | $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); 48 | $usageTrigger = $client->account->usage_triggers->get($usageSid); 49 | $usageTrigger->update(array( 50 | 'FriendlyName' => 'new', 51 | )); 52 | $usageTrigger2 = $client->account->usage_triggers->get($usageSid); 53 | $this->assertSame('new', $usageTrigger2->friendly_name); 54 | } 55 | 56 | function testFilterTriggerList() { 57 | $http = m::mock(new Services_Twilio_TinyHttp); 58 | $params = 'Page=0&PageSize=50&UsageCategory=sms'; 59 | $http->shouldReceive('get')->once() 60 | ->with('/2010-04-01/Accounts/AC123/Usage/Triggers.json?' . $params) 61 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 62 | json_encode(array('usage_triggers' => array( 63 | array( 64 | 'usage_category' => 'sms', 65 | 'current_value' => '4', 66 | 'trigger_value' => '100.30', 67 | ), 68 | array( 69 | 'usage_category' => 'sms', 70 | 'current_value' => '4', 71 | 'trigger_value' => '400.30', 72 | )), 73 | 'next_page_uri' => '/2010-04-01/Accounts/AC123/Usage/Triggers.json?UsageCategory=sms&Page=1&PageSize=50', 74 | )) 75 | )); 76 | $params = 'UsageCategory=sms&Page=1&PageSize=50'; 77 | $http->shouldReceive('get')->once() 78 | ->with('/2010-04-01/Accounts/AC123/Usage/Triggers.json?' . $params) 79 | ->andReturn(array(400, array('Content-Type' => 'application/json'), 80 | '{"status":400,"message":"foo", "code": "20006"}' 81 | )); 82 | $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); 83 | foreach ($client->account->usage_triggers->getIterator( 84 | 0, 50, array( 85 | 'UsageCategory' => 'sms', 86 | )) as $trigger 87 | ) { 88 | $this->assertSame($trigger->current_value, "4"); 89 | } 90 | } 91 | 92 | function testCreateTrigger() { 93 | $http = m::mock(new Services_Twilio_TinyHttp); 94 | $params = 'UsageCategory=sms&TriggerValue=100&CallbackUrl=foo'; 95 | $http->shouldReceive('post')->once() 96 | ->with('/2010-04-01/Accounts/AC123/Usage/Triggers.json', 97 | $this->formHeaders, $params) 98 | ->andReturn(array(201, array('Content-Type' => 'application/json'), 99 | json_encode(array( 100 | 'usage_category' => 'sms', 101 | 'sid' => 'UT123', 102 | 'uri' => '/2010-04-01/Accounts/AC123/Usage/Triggers/UT123.json' 103 | )) 104 | )); 105 | $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); 106 | $trigger = $client->account->usage_triggers->create( 107 | 'sms', 108 | '100', 109 | 'foo' 110 | ); 111 | $this->assertSame('sms', $trigger->usage_category); 112 | } 113 | } 114 | 115 | -------------------------------------------------------------------------------- /includes/twilio-php/docs/_themes/kr_small/static/flasky.css_t: -------------------------------------------------------------------------------- 1 | /* 2 | * flasky.css_t 3 | * ~~~~~~~~~~~~ 4 | * 5 | * Sphinx stylesheet -- flasky theme based on nature theme. 6 | * 7 | * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. 8 | * :license: BSD, see LICENSE for details. 9 | * 10 | */ 11 | 12 | @import url("basic.css"); 13 | 14 | /* -- page layout ----------------------------------------------------------- */ 15 | 16 | body { 17 | font-family: 'Georgia', serif; 18 | font-size: 17px; 19 | color: #000; 20 | background: white; 21 | margin: 0; 22 | padding: 0; 23 | } 24 | 25 | div.documentwrapper { 26 | float: left; 27 | width: 100%; 28 | } 29 | 30 | div.bodywrapper { 31 | margin: 40px auto 0 auto; 32 | width: 700px; 33 | } 34 | 35 | hr { 36 | border: 1px solid #B1B4B6; 37 | } 38 | 39 | div.body { 40 | background-color: #ffffff; 41 | color: #3E4349; 42 | padding: 0 30px 30px 30px; 43 | } 44 | 45 | img.floatingflask { 46 | padding: 0 0 10px 10px; 47 | float: right; 48 | } 49 | 50 | div.footer { 51 | text-align: right; 52 | color: #888; 53 | padding: 10px; 54 | font-size: 14px; 55 | width: 650px; 56 | margin: 0 auto 40px auto; 57 | } 58 | 59 | div.footer a { 60 | color: #888; 61 | text-decoration: underline; 62 | } 63 | 64 | div.related { 65 | line-height: 32px; 66 | color: #888; 67 | } 68 | 69 | div.related ul { 70 | padding: 0 0 0 10px; 71 | } 72 | 73 | div.related a { 74 | color: #444; 75 | } 76 | 77 | /* -- body styles ----------------------------------------------------------- */ 78 | 79 | a { 80 | color: #004B6B; 81 | text-decoration: underline; 82 | } 83 | 84 | a:hover { 85 | color: #6D4100; 86 | text-decoration: underline; 87 | } 88 | 89 | div.body { 90 | padding-bottom: 40px; /* saved for footer */ 91 | } 92 | 93 | div.body h1, 94 | div.body h2, 95 | div.body h3, 96 | div.body h4, 97 | div.body h5, 98 | div.body h6 { 99 | font-family: 'Garamond', 'Georgia', serif; 100 | font-weight: normal; 101 | margin: 30px 0px 10px 0px; 102 | padding: 0; 103 | } 104 | 105 | {% if theme_index_logo %} 106 | div.indexwrapper h1 { 107 | text-indent: -999999px; 108 | background: url({{ theme_index_logo }}) no-repeat center center; 109 | height: {{ theme_index_logo_height }}; 110 | } 111 | {% endif %} 112 | 113 | div.body h2 { font-size: 180%; } 114 | div.body h3 { font-size: 150%; } 115 | div.body h4 { font-size: 130%; } 116 | div.body h5 { font-size: 100%; } 117 | div.body h6 { font-size: 100%; } 118 | 119 | a.headerlink { 120 | color: white; 121 | padding: 0 4px; 122 | text-decoration: none; 123 | } 124 | 125 | a.headerlink:hover { 126 | color: #444; 127 | background: #eaeaea; 128 | } 129 | 130 | div.body p, div.body dd, div.body li { 131 | line-height: 1.4em; 132 | } 133 | 134 | div.admonition { 135 | background: #fafafa; 136 | margin: 20px -30px; 137 | padding: 10px 30px; 138 | border-top: 1px solid #ccc; 139 | border-bottom: 1px solid #ccc; 140 | } 141 | 142 | div.admonition p.admonition-title { 143 | font-family: 'Garamond', 'Georgia', serif; 144 | font-weight: normal; 145 | font-size: 24px; 146 | margin: 0 0 10px 0; 147 | padding: 0; 148 | line-height: 1; 149 | } 150 | 151 | div.admonition p.last { 152 | margin-bottom: 0; 153 | } 154 | 155 | div.highlight{ 156 | background-color: white; 157 | } 158 | 159 | dt:target, .highlight { 160 | background: #FAF3E8; 161 | } 162 | 163 | div.note { 164 | background-color: #eee; 165 | border: 1px solid #ccc; 166 | } 167 | 168 | div.seealso { 169 | background-color: #ffc; 170 | border: 1px solid #ff6; 171 | } 172 | 173 | div.topic { 174 | background-color: #eee; 175 | } 176 | 177 | div.warning { 178 | background-color: #ffe4e4; 179 | border: 1px solid #f66; 180 | } 181 | 182 | p.admonition-title { 183 | display: inline; 184 | } 185 | 186 | p.admonition-title:after { 187 | content: ":"; 188 | } 189 | 190 | pre, tt { 191 | font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; 192 | font-size: 0.85em; 193 | } 194 | 195 | img.screenshot { 196 | } 197 | 198 | tt.descname, tt.descclassname { 199 | font-size: 0.95em; 200 | } 201 | 202 | tt.descname { 203 | padding-right: 0.08em; 204 | } 205 | 206 | img.screenshot { 207 | -moz-box-shadow: 2px 2px 4px #eee; 208 | -webkit-box-shadow: 2px 2px 4px #eee; 209 | box-shadow: 2px 2px 4px #eee; 210 | } 211 | 212 | table.docutils { 213 | border: 1px solid #888; 214 | -moz-box-shadow: 2px 2px 4px #eee; 215 | -webkit-box-shadow: 2px 2px 4px #eee; 216 | box-shadow: 2px 2px 4px #eee; 217 | } 218 | 219 | table.docutils td, table.docutils th { 220 | border: 1px solid #888; 221 | padding: 0.25em 0.7em; 222 | } 223 | 224 | table.field-list, table.footnote { 225 | border: none; 226 | -moz-box-shadow: none; 227 | -webkit-box-shadow: none; 228 | box-shadow: none; 229 | } 230 | 231 | table.footnote { 232 | margin: 15px 0; 233 | width: 100%; 234 | border: 1px solid #eee; 235 | } 236 | 237 | table.field-list th { 238 | padding: 0 0.8em 0 0; 239 | } 240 | 241 | table.field-list td { 242 | padding: 0; 243 | } 244 | 245 | table.footnote td { 246 | padding: 0.5em; 247 | } 248 | 249 | dl { 250 | margin: 0; 251 | padding: 0; 252 | } 253 | 254 | dl dd { 255 | margin-left: 30px; 256 | } 257 | 258 | pre { 259 | padding: 0; 260 | margin: 15px -30px; 261 | padding: 8px; 262 | line-height: 1.3em; 263 | padding: 7px 30px; 264 | background: #eee; 265 | border-radius: 2px; 266 | -moz-border-radius: 2px; 267 | -webkit-border-radius: 2px; 268 | } 269 | 270 | dl pre { 271 | margin-left: -60px; 272 | padding-left: 60px; 273 | } 274 | 275 | tt { 276 | background-color: #ecf0f3; 277 | color: #222; 278 | /* padding: 1px 2px; */ 279 | } 280 | 281 | tt.xref, a tt { 282 | background-color: #FBFBFB; 283 | } 284 | 285 | a:hover tt { 286 | background: #EEE; 287 | } 288 | -------------------------------------------------------------------------------- /includes/twilio-php/tests/resources/MessagesTest.php: -------------------------------------------------------------------------------- 1 | 'application/x-www-form-urlencoded'); 8 | 9 | function testCreateMessage() { 10 | $http = m::mock(new Services_Twilio_TinyHttp); 11 | $http->shouldReceive('post')->once() 12 | ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, 13 | 'From=%2B1222&To=%2B44123&Body=Hi+there') 14 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 15 | json_encode(array('sid' => 'SM123')) 16 | )); 17 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 18 | $msg = $client->account->messages->sendMessage('+1222', '+44123', 'Hi there'); 19 | $this->assertSame('SM123', $msg->sid); 20 | } 21 | 22 | function testCreateMessageWithMedia() { 23 | $http = m::mock(new Services_Twilio_TinyHttp); 24 | $http->shouldReceive('post')->once() 25 | ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, 26 | 'From=%2B1222&To=%2B44123&MediaUrl=http%3A%2F%2Fexample.com%2Fimage1') 27 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 28 | json_encode(array('sid' => 'SM123')) 29 | )); 30 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 31 | $msg = $client->account->messages->sendMessage('+1222', '+44123', null, 32 | array('http://example.com/image1')); 33 | $this->assertSame('SM123', $msg->sid); 34 | } 35 | 36 | function testCreateMessageWithMediaAndBody() { 37 | $http = m::mock(new Services_Twilio_TinyHttp); 38 | $http->shouldReceive('post')->once() 39 | ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, 40 | 'From=%2B1222&To=%2B44123&MediaUrl=http%3A%2F%2Fexample.com%2Fimage1&Body=Hi+there') 41 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 42 | json_encode(array('sid' => 'SM123')) 43 | )); 44 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 45 | $msg = $client->account->messages->sendMessage('+1222', '+44123', 'Hi there', 46 | array('http://example.com/image1') 47 | ); 48 | $this->assertSame('SM123', $msg->sid); 49 | } 50 | 51 | function testCreateMessageWithMultipleMedia() { 52 | $http = m::mock(new Services_Twilio_TinyHttp); 53 | $http->shouldReceive('post')->once() 54 | ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, 55 | 'From=%2B1222&To=%2B44123&MediaUrl=http%3A%2F%2Fexample.com%2Fimage1&MediaUrl=http%3A%2F%2Fexample.com%2Fimage2') 56 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 57 | json_encode(array('sid' => 'SM123')) 58 | )); 59 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 60 | $msg = $client->account->messages->sendMessage('+1222', '+44123', null, 61 | array('http://example.com/image1', 'http://example.com/image2')); 62 | $this->assertSame('SM123', $msg->sid); 63 | } 64 | 65 | function testBadMessageThrowsException() { 66 | $this->setExpectedException('Services_Twilio_RestException'); 67 | $http = m::mock(new Services_Twilio_TinyHttp); 68 | $http->shouldReceive('post')->once() 69 | ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, 70 | 'From=%2B1222&To=%2B44123&Body=' . str_repeat('hi', 801)) 71 | ->andReturn(array(400, array('Content-Type' => 'application/json'), 72 | json_encode(array( 73 | 'status' => '400', 74 | 'message' => 'Too long', 75 | )) 76 | )); 77 | $client = new Services_Twilio('AC123', '123', null, $http); 78 | $msg = $client->account->messages->sendMessage('+1222', '+44123', str_repeat('hi', 801)); 79 | } 80 | 81 | function testRawCreate() { 82 | $http = m::mock(new Services_Twilio_TinyHttp); 83 | $http->shouldReceive('post')->once() 84 | ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, 85 | 'From=%2B1222&To=%2B44123&MediaUrl=http%3A%2F%2Fexample.com%2Fimage1&MediaUrl=http%3A%2F%2Fexample.com%2Fimage2') 86 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 87 | json_encode(array('sid' => 'SM123')) 88 | )); 89 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 90 | $msg = $client->account->messages->create(array( 91 | 'From' => '+1222', 92 | 'To' => '+44123', 93 | 'MediaUrl' => array('http://example.com/image1', 'http://example.com/image2') 94 | )); 95 | $this->assertSame('SM123', $msg->sid); 96 | } 97 | 98 | function testDeleteMessage() { 99 | $http = m::mock(new Services_Twilio_TinyHttp); 100 | $http->shouldReceive('delete')->once() 101 | ->with('/2010-04-01/Accounts/AC123/Messages/ME123.json') 102 | ->andReturn(array(204, array('Content-Type' => 'application/json'), '' 103 | )); 104 | $client = new Services_Twilio('AC123', '123', null, $http); 105 | $client->account->messages->delete('ME123'); 106 | } 107 | 108 | function testNewline() { 109 | $http = m::mock(new Services_Twilio_TinyHttp); 110 | $http->shouldReceive('post')->once() 111 | ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, 112 | 'Body=Hello%0A%0AHello') 113 | ->andReturn(array(200, array('Content-Type' => 'application/json'), 114 | json_encode(array('sid' => 'SM123')) 115 | )); 116 | $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); 117 | $msg = $client->account->messages->create(array( 118 | 'Body' => "Hello\n\nHello" 119 | )); 120 | $this->assertSame('SM123', $msg->sid); 121 | } 122 | } 123 | 124 | --------------------------------------------------------------------------------