voipfone_client 0.0.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/voipfone_client.rb +2 -7
- data/lib/voipfone_client/client.rb +0 -1
- data/lib/voipfone_client/divert_list_item.rb +48 -0
- data/lib/voipfone_client/global_divert.rb +101 -0
- data/lib/voipfone_client/phone_numbers.rb +10 -0
- data/lib/voipfone_client/registered_mobile.rb +18 -0
- data/lib/voipfone_client/sms.rb +33 -21
- data/lib/voipfone_client/version.rb +1 -1
- data/voipfone_client.gemspec +1 -0
- metadata +20 -3
- data/lib/voipfone_client/diverts.rb +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 301fd49404a1148d61c266b3277a9c2095f68c00
|
4
|
+
data.tar.gz: 406cbcf01334c54881834c36caa499c5bab12a93
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5f3cc00772a9f448bdc10cfbb09ef32bd2b81b2a024fd68c309e01f14a273642275015b7fbf8e8cd3932751da8fa2e7173159bb406d514353f8374f11b02ea3
|
7
|
+
data.tar.gz: 19aaea9bc58b10fca0f7a6349dcf08bc29150f8865e1fbab3fd0e023091246f4999f8e3f72e0db4ddda31a0c965da8e2a5374fab9ca9cb1843c101a37c157764
|
data/lib/voipfone_client.rb
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'mechanize'
|
3
|
-
require '
|
4
|
-
|
5
|
-
require 'voipfone_client/account_balance'
|
6
|
-
require 'voipfone_client/account_details'
|
7
|
-
require 'voipfone_client/diverts'
|
8
|
-
require 'voipfone_client/voicemail'
|
9
|
-
require 'voipfone_client/sms'
|
3
|
+
require 'require_all'
|
4
|
+
require_all 'lib/voipfone_client'
|
10
5
|
|
11
6
|
module VoipfoneClient
|
12
7
|
BASE_URL = "https://www.voipfone.co.uk"
|
@@ -19,7 +19,6 @@ module VoipfoneClient
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
private
|
23
22
|
# Responses from the private Voipfone API are always in the form ["message", {content}]
|
24
23
|
# We will strip the message (hopefully "OK"), raise if not OK, and return the content.
|
25
24
|
# @param request [JSON] The raw request response from the Voipfone API
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module VoipfoneClient
|
2
|
+
class DivertListItem < Client
|
3
|
+
attr_accessor :name, :number
|
4
|
+
|
5
|
+
# Constructor for `DivertListItem` which accepts the name and number of the phone number to add to the diverts list.
|
6
|
+
# @param name [String] the name of the phone to be diverted to
|
7
|
+
# @param number [String] the number of the phone to be diverted to.
|
8
|
+
def initialize(name: nil, number: nil)
|
9
|
+
@name = name
|
10
|
+
@number = number
|
11
|
+
super()
|
12
|
+
end
|
13
|
+
|
14
|
+
# Add a new number to the list of numbers which can be diverted to. Requires a name
|
15
|
+
# and a phone number, which will have spaces stripped from it. May be in international
|
16
|
+
# format.
|
17
|
+
# @return [Boolean] true on success or a failure message (in which case a `VoipfoneAPIError` will be raised)
|
18
|
+
def save
|
19
|
+
if @name.nil? || @number.nil?
|
20
|
+
raise ArgumentError, "You need to include a name and number to add to the diverts list"
|
21
|
+
end
|
22
|
+
@number = @number.gsub(" ","")
|
23
|
+
parameters = {
|
24
|
+
"div-list-name" => @name,
|
25
|
+
"div-list-num" => number
|
26
|
+
}
|
27
|
+
request = @browser.post("#{VoipfoneClient::API_POST_URL}?setDivertsList", parameters)
|
28
|
+
response = parse_response(request)
|
29
|
+
if response == [@name, @number]
|
30
|
+
return true
|
31
|
+
else
|
32
|
+
raise VoipfoneAPIError, "Although Voipfone returned an OK, the data they stored didn't match what you asked for: #{response}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class << self
|
37
|
+
# Get a list of phones which can be diverted to. Returns a nested array of name and phone number.
|
38
|
+
# @return [Array] of names and phone numbers
|
39
|
+
def all
|
40
|
+
d = self.new
|
41
|
+
request = d.browser.get("#{VoipfoneClient::API_GET_URL}?divertsCommon")
|
42
|
+
d.parse_response(request)["divertsCommon"].collect do |i|
|
43
|
+
DivertListItem.new(name: i.first, number: i.last)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module VoipfoneClient
|
2
|
+
# Set up a global (whole-account) divert on your account.
|
3
|
+
# You need to specify the type of divert and the number to which the divert will go to.
|
4
|
+
# There are 4 supported situations which can be
|
5
|
+
# diverted for, namely:
|
6
|
+
# - all calls (i.e. no calls will reach the pbx / phones - immediate divert)
|
7
|
+
# - when there is a failure in the phone system
|
8
|
+
# - when the phone(s) are busy
|
9
|
+
# - when there's no answer
|
10
|
+
class GlobalDivert < Client
|
11
|
+
attr_accessor :type, :number
|
12
|
+
|
13
|
+
# Constructor for `GlobalDivert` which allows you to pass in a `DivertListItem` to be used as the receiving number.
|
14
|
+
# @param divert_list_item [DivertListItem] a `DivertListItem` object which will be used to fill the `GlobalDivert` number.
|
15
|
+
# You still need to specify the divert type.
|
16
|
+
def initialize(divert_list_item = nil)
|
17
|
+
if divert_list_item.is_a?(DivertListItem)
|
18
|
+
@number = divert_list_item.number
|
19
|
+
end
|
20
|
+
super()
|
21
|
+
end
|
22
|
+
|
23
|
+
# A hash of voipfone divert names vs our divert names. Note that when we query
|
24
|
+
# voipfone the returned value of the divert type is UPPERCASE.
|
25
|
+
VOIPFONE_DIVERT_NAMES = {
|
26
|
+
"all" => "all",
|
27
|
+
"chanunavail" => "fail",
|
28
|
+
"busy" => "busy",
|
29
|
+
"noanswer" => "no_answer"
|
30
|
+
}
|
31
|
+
|
32
|
+
#Save the divert on your account
|
33
|
+
# @return [Boolean] true on success, or a failure message (in which case a `VoipfoneAPIError` will be raised)
|
34
|
+
def save
|
35
|
+
if @type.nil? || @number.nil?
|
36
|
+
raise ArgumentError, "You need to set a divert type and divert number before you can save the divert."
|
37
|
+
end
|
38
|
+
set_diverts(@type => @number)
|
39
|
+
end
|
40
|
+
|
41
|
+
#Clear all diverts
|
42
|
+
# @return [Boolean] true on success, or a failure message (in which case a `VoipfoneAPIError` will be raised)
|
43
|
+
def clear!
|
44
|
+
set_diverts()
|
45
|
+
end
|
46
|
+
class << self
|
47
|
+
# Get current diverts
|
48
|
+
# @return [Array] A nested set of arrays with divert information for each type of divert currently set
|
49
|
+
def all
|
50
|
+
g = self.new
|
51
|
+
request = g.browser.get("#{VoipfoneClient::API_GET_URL}?divertsMain")
|
52
|
+
g.parse_response(request)["divertsMain"].collect do |d|
|
53
|
+
divert = GlobalDivert.new
|
54
|
+
divert.number = d[1]
|
55
|
+
divert.type = VOIPFONE_DIVERT_NAMES[d[2].downcase].to_sym
|
56
|
+
divert
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
# Divert calls for different circumstances. There are 4 supported situations which can be
|
63
|
+
# diverted for, namely:
|
64
|
+
# - all calls (i.e. no calls will reach the pbx / phones - immediate divert)
|
65
|
+
# - when there is a failure in the phone system
|
66
|
+
# - when the phone(s) are busy
|
67
|
+
# - when there's no answer
|
68
|
+
# If no values are passed, all diverts are cleared.
|
69
|
+
# @param all [String] The number to which all calls will be diverted.
|
70
|
+
# @param fail [String] The number to which calls will be diverted in the event of a failure
|
71
|
+
# @param busy [String] The number to which calls will be diverted if the phones are busy
|
72
|
+
# @param no_answer [String] The number to which calls will be diverted if there's no answer
|
73
|
+
# @return [Boolean] true on success, or a failure message (in which case a `VoipfoneAPIError` will be raised)
|
74
|
+
def set_diverts(all: nil, fail: nil, busy: nil, no_answer: nil)
|
75
|
+
all ||= ""
|
76
|
+
fail ||= ""
|
77
|
+
busy ||= ""
|
78
|
+
no_answer ||= ""
|
79
|
+
parameters = {
|
80
|
+
"all" => all.gsub(" ",""),
|
81
|
+
"chanunavail" => fail.gsub(" ",""),
|
82
|
+
"busy" => busy.gsub(" ",""),
|
83
|
+
"noanswer" => no_answer.gsub(" ","")
|
84
|
+
}
|
85
|
+
request = @browser.post("#{VoipfoneClient::API_POST_URL}?divertsMain", parameters)
|
86
|
+
response = parse_response(request)
|
87
|
+
if response == "ok"
|
88
|
+
return true
|
89
|
+
else
|
90
|
+
raise VoipfoneAPIError, response.first
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module VoipfoneClient
|
2
|
+
class Client
|
3
|
+
# Return the phone numbers for this account, as strings
|
4
|
+
# @return [Array] Phone numbers as strings.
|
5
|
+
def phone_numbers
|
6
|
+
request = @browser.get("#{VoipfoneClient::API_GET_URL}?nums")
|
7
|
+
parse_response(request)["nums"].collect {|n| n.first}
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module VoipfoneClient
|
2
|
+
class RegisteredMobile < Client
|
3
|
+
attr_accessor :number, :name
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def all
|
7
|
+
r = RegisteredMobile.new
|
8
|
+
request = r.browser.get("#{VoipfoneClient::API_GET_URL}?registeredMobile")
|
9
|
+
r.parse_response(request)["registeredMobile"].collect do |m|
|
10
|
+
mobile = RegisteredMobile.new
|
11
|
+
mobile.number = m[0]
|
12
|
+
mobile.name = m[1]
|
13
|
+
mobile
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/voipfone_client/sms.rb
CHANGED
@@ -1,25 +1,37 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
1
|
+
module VoipfoneClient
|
2
|
+
class SMS < Client
|
3
|
+
attr_accessor :from, :to, :message
|
4
|
+
|
5
|
+
# Constructor to create an SMS - optionally pass in to, from and message
|
6
|
+
# @param to [String] the phone number to send the SMS to, as a string. Spaces will be stripped; + symbol allowed.
|
7
|
+
# @param from [String] the phone number to send the SMS from, as a string. Spaces will be stripped; + symbol allowed.
|
8
|
+
# @param message [String] the message to send. The first 160 characters only will be sent.
|
9
|
+
def initialize(to: nil, from: nil, message: nil)
|
10
|
+
@to = to
|
11
|
+
@from = from
|
12
|
+
@message = message
|
13
|
+
super()
|
9
14
|
end
|
10
|
-
|
11
|
-
from
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
|
16
|
+
# Send an sms from your account.
|
17
|
+
def send
|
18
|
+
if @to.nil? || @from.nil? || @message.nil?
|
19
|
+
raise ArgumentError, "You need to include 'to' and 'from' numbers and a message to send an SMS"
|
20
|
+
end
|
21
|
+
to = @to.gsub(" ","")
|
22
|
+
from = @from.gsub(" ","")
|
23
|
+
parameters = {
|
24
|
+
"sms-send-to" => to,
|
25
|
+
"sms-send-from" => from,
|
26
|
+
"sms-message" => @message[0..159]
|
27
|
+
}
|
28
|
+
request = @browser.post("#{VoipfoneClient::API_POST_URL}?smsSend", parameters)
|
29
|
+
response = parse_response(request)
|
30
|
+
if response == "ok"
|
31
|
+
return true
|
32
|
+
else
|
33
|
+
raise VoipfoneAPIError, response
|
34
|
+
end
|
23
35
|
end
|
24
36
|
end
|
25
37
|
end
|
data/voipfone_client.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: voipfone_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Error Creative Studio
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '2.7'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: require_all
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.3'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.3'
|
69
83
|
description: Voipfone are a brilliant SIP provider with loads of features, but no
|
70
84
|
API. This Gem hooks into the API which their web interfaces uses.
|
71
85
|
email:
|
@@ -85,8 +99,11 @@ files:
|
|
85
99
|
- lib/voipfone_client/account_balance.rb
|
86
100
|
- lib/voipfone_client/account_details.rb
|
87
101
|
- lib/voipfone_client/client.rb
|
88
|
-
- lib/voipfone_client/
|
102
|
+
- lib/voipfone_client/divert_list_item.rb
|
89
103
|
- lib/voipfone_client/errors.rb
|
104
|
+
- lib/voipfone_client/global_divert.rb
|
105
|
+
- lib/voipfone_client/phone_numbers.rb
|
106
|
+
- lib/voipfone_client/registered_mobile.rb
|
90
107
|
- lib/voipfone_client/sms.rb
|
91
108
|
- lib/voipfone_client/version.rb
|
92
109
|
- lib/voipfone_client/voicemail.rb
|
@@ -1,79 +0,0 @@
|
|
1
|
-
class VoipfoneClient::Client
|
2
|
-
# Get a list of phones which can be diverted to. Returns a nested array of name and phone number.
|
3
|
-
# @return [Array] of names and phone numbers
|
4
|
-
def diverts_list
|
5
|
-
request = @browser.get("#{VoipfoneClient::API_GET_URL}?divertsCommon")
|
6
|
-
parse_response(request)["divertsCommon"]
|
7
|
-
end
|
8
|
-
|
9
|
-
# Add a new number to the list of numbers which can be diverted to. Requires a name
|
10
|
-
# and a phone number, which will have spaces stripped from it. May be in international
|
11
|
-
# format.
|
12
|
-
# @param name [String] The name which appears in dropdowns in the web interface
|
13
|
-
# @param number [String] The number which will be called. Spaces will be stripped. + symbol accepted
|
14
|
-
# @return [Boolean] true on success or a failure message (in which case a `VoipfoneAPIError` will be raised)
|
15
|
-
def add_to_diverts_list(name: nil, number: nil)
|
16
|
-
if name.nil? || number.nil?
|
17
|
-
raise ArgumentError, "You need to include a name and number to add to the diverts list"
|
18
|
-
end
|
19
|
-
number = number.gsub(" ","")
|
20
|
-
parameters = {
|
21
|
-
"div-list-name" => name,
|
22
|
-
"div-list-num" => number
|
23
|
-
}
|
24
|
-
request = @browser.post("#{VoipfoneClient::API_POST_URL}?setDivertsList", parameters)
|
25
|
-
response = parse_response(request)
|
26
|
-
if response == [name, number]
|
27
|
-
return true
|
28
|
-
else
|
29
|
-
raise VoipfoneAPIError, "Although Voipfone returned an OK, the data they stored didn't match what you asked for: #{response}"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
# Divert calls for different circumstances. There are 4 supported situations which can be
|
35
|
-
# diverted for, namely:
|
36
|
-
# - all calls (i.e. no calls will reach the pbx / phones - immediate divert)
|
37
|
-
# - when there is a failure in the phone system
|
38
|
-
# - when the phone(s) are busy
|
39
|
-
# - when there's no answer
|
40
|
-
# If no values are passed, all diverts are cleared.
|
41
|
-
# @param all [String] The number to which all calls will be diverted.
|
42
|
-
# @param fail [String] The number to which calls will be diverted in the event of a failure
|
43
|
-
# @param busy [String] The number to which calls will be diverted if the phones are busy
|
44
|
-
# @param no_answer [String] The number to which calls will be diverted if there's no answer
|
45
|
-
# @return [Boolean] true on success, or a failure message (in which case a `VoipfoneAPIError` will be raised)
|
46
|
-
def set_diverts(all: nil, fail: nil, busy: nil, no_answer: nil)
|
47
|
-
all ||= ""
|
48
|
-
fail ||= ""
|
49
|
-
busy ||= ""
|
50
|
-
no_answer ||= ""
|
51
|
-
parameters = {
|
52
|
-
"all" => all.gsub(" ",""),
|
53
|
-
"chanunavail" => fail.gsub(" ",""),
|
54
|
-
"busy" => busy.gsub(" ",""),
|
55
|
-
"noanswer" => no_answer.gsub(" ","")
|
56
|
-
}
|
57
|
-
request = @browser.post("#{VoipfoneClient::API_POST_URL}?divertsMain", parameters)
|
58
|
-
response = parse_response(request)
|
59
|
-
if response == "ok"
|
60
|
-
return true
|
61
|
-
else
|
62
|
-
raise VoipfoneAPIError, response.first
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# Diverts all calls to the number passed into this method
|
67
|
-
# @param number [String] The number to be diverted to.
|
68
|
-
# @return [Boolean] true on success, or an error message (in which case a `VoipfoneAPIError` will be raised)
|
69
|
-
def divert_all_calls(number: nil)
|
70
|
-
set_diverts(all: number)
|
71
|
-
end
|
72
|
-
|
73
|
-
# Get current diverts
|
74
|
-
# @return [Array] A nested set of arrays with divert information for each type of divert currently set
|
75
|
-
def get_diverts
|
76
|
-
request = @browser.get("#{VoipfoneClient::API_GET_URL}?divertsMain")
|
77
|
-
parse_response(request)["divertsMain"]
|
78
|
-
end
|
79
|
-
end
|