CiscoWebex 0.0.4
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 +7 -0
- data/lib/Admin/Admin.rb +84 -0
- data/lib/Admin/AuditEvents.rb +70 -0
- data/lib/Admin/Authorizations.rb +52 -0
- data/lib/Admin/Licenses.rb +50 -0
- data/lib/Admin/Organizations.rb +52 -0
- data/lib/Admin/People.rb +81 -0
- data/lib/Admin/ResourceGroups.rb +118 -0
- data/lib/Admin/Roles.rb +60 -0
- data/lib/Admin.rb +11 -0
- data/lib/CC/AddressBooks.rb +55 -0
- data/lib/CC/AgentProfiles.rb +71 -0
- data/lib/CC/Agents.rb +67 -0
- data/lib/CC/AuxiliaryCodes.rb +55 -0
- data/lib/CC/CC.rb +157 -0
- data/lib/CC/Captures.rb +30 -0
- data/lib/CC/DialPlans.rb +56 -0
- data/lib/CC/EntryPointMappings.rb +56 -0
- data/lib/CC/EntryPoints.rb +55 -0
- data/lib/CC/Journey/Actions.rb +41 -0
- data/lib/CC/Journey/Aliases.rb +28 -0
- data/lib/CC/Journey/Events.rb +37 -0
- data/lib/CC/Journey/Identities.rb +41 -0
- data/lib/CC/Journey/Journey.rb +84 -0
- data/lib/CC/Journey/ProfileViews.rb +24 -0
- data/lib/CC/Journey/Report.rb +24 -0
- data/lib/CC/Journey/Reports.rb +24 -0
- data/lib/CC/Journey/Streams.rb +41 -0
- data/lib/CC/Journey/Views.rb +80 -0
- data/lib/CC/Journey.rb +9 -0
- data/lib/CC/MultimediaProfiles.rb +52 -0
- data/lib/CC/OutboundANI.rb +56 -0
- data/lib/CC/Queues.rb +64 -0
- data/lib/CC/Sites.rb +51 -0
- data/lib/CC/SkillProfiles.rb +55 -0
- data/lib/CC/Skills.rb +55 -0
- data/lib/CC/Subscriptions.rb +55 -0
- data/lib/CC/Tasks.rb +37 -0
- data/lib/CC/Teams.rb +55 -0
- data/lib/CC/UserProfiles.rb +56 -0
- data/lib/CC/Users.rb +57 -0
- data/lib/CC.rb +26 -0
- data/lib/Calling/CallControl.rb +210 -0
- data/lib/Calling/Calling.rb +64 -0
- data/lib/Calling/Calls.rb +44 -0
- data/lib/Calling/Locations.rb +50 -0
- data/lib/Calling/Voicemail.rb +73 -0
- data/lib/Calling.rb +9 -0
- data/lib/CiscoWebex.rb +32 -0
- data/lib/Devices/Configurations.rb +52 -0
- data/lib/Devices/Devices.rb +66 -0
- data/lib/Devices/Endpoints.rb +51 -0
- data/lib/Devices/Workspaces.rb +51 -0
- data/lib/Devices/Xapi.rb +75 -0
- data/lib/Devices.rb +7 -0
- data/lib/Meetings/ControlStatus.rb +53 -0
- data/lib/Meetings/Invitees.rb +52 -0
- data/lib/Meetings/Meetings.rb +91 -0
- data/lib/Meetings/Participants.rb +52 -0
- data/lib/Meetings/Qualities.rb +55 -0
- data/lib/Meetings/Registrations.rb +116 -0
- data/lib/Meetings/SessionTypes.rb +57 -0
- data/lib/Meetings/Templates.rb +57 -0
- data/lib/Meetings/Transcripts.rb +98 -0
- data/lib/Meetings/WebexMeetings.rb +108 -0
- data/lib/Meetings.rb +13 -0
- data/lib/Messaging/Attachements.rb +60 -0
- data/lib/Messaging/Classifications.rb +64 -0
- data/lib/Messaging/Events.rb +60 -0
- data/lib/Messaging/Memberships.rb +59 -0
- data/lib/Messaging/Messages.rb +126 -0
- data/lib/Messaging/Messaging.rb +92 -0
- data/lib/Messaging/People.rb +81 -0
- data/lib/Messaging/Rooms.rb +121 -0
- data/lib/Messaging/Teams.rb +117 -0
- data/lib/Messaging/Webhooks.rb +63 -0
- data/lib/Messaging.rb +13 -0
- data/lib/REST/Rest.rb +213 -0
- data/lib/REST/RestCC.rb +242 -0
- data/lib/Toolbox/Toolbox.rb +78 -0
- data/lib/bersion.rb +3 -0
- metadata +122 -0
data/lib/REST/Rest.rb
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
require 'uri'
|
|
2
|
+
require 'net/http'
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'ostruct'
|
|
5
|
+
|
|
6
|
+
module CiscoWebex
|
|
7
|
+
class Rest
|
|
8
|
+
BASE_URL = "https://webexapis.com"
|
|
9
|
+
|
|
10
|
+
def initialize()
|
|
11
|
+
puts "Initializing Webex::Teams::Rest not required..."
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# find next request for paging through GET requests
|
|
15
|
+
def self.find_next_page(headers)
|
|
16
|
+
if headers.has_key?('link')
|
|
17
|
+
uri = URI(headers['link'].split(";")[0].tr("<>", ""))
|
|
18
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
|
19
|
+
https.use_ssl = true
|
|
20
|
+
request = Net::HTTP::Get.new(uri)
|
|
21
|
+
request["Authorization"] = "Bearer #{@auth_token}"
|
|
22
|
+
request["User-Agent"] = "Webex Rudy Library"
|
|
23
|
+
|
|
24
|
+
return [ https, request ]
|
|
25
|
+
else
|
|
26
|
+
return false
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# format params for passing as needed json/urlencoded
|
|
31
|
+
def self.parse_params(params, return_format="json")
|
|
32
|
+
return params if ( return_format == "json" && params.class == String && JSON.parse(params) ) # if already json then just send back
|
|
33
|
+
|
|
34
|
+
if params.class == OpenStruct
|
|
35
|
+
params = params.to_h
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
params = params.delete_if { |key, value| value.to_s.strip == '' } # delete any unused keys
|
|
39
|
+
|
|
40
|
+
case return_format
|
|
41
|
+
when "json"
|
|
42
|
+
params = params.to_json
|
|
43
|
+
|
|
44
|
+
when "www-encoded"
|
|
45
|
+
params = URI.encode_www_form(params)
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
return params
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def self.send_rest(rest, request, limit=100)
|
|
53
|
+
# loop adjusts for throttling if needed
|
|
54
|
+
results = []
|
|
55
|
+
while true
|
|
56
|
+
response = rest.request(request)
|
|
57
|
+
case response.code
|
|
58
|
+
when "200"
|
|
59
|
+
# if REST success then parse body to JSON
|
|
60
|
+
response, headers = [ JSON.parse(response.body), response.each_header.to_h ]
|
|
61
|
+
if response.has_key?("items") && response['items'].length() > 0
|
|
62
|
+
results.concat(response['items'])
|
|
63
|
+
|
|
64
|
+
next_page = CiscoWebex::Rest.find_next_page(headers)
|
|
65
|
+
if next_page
|
|
66
|
+
rest, request = next_page
|
|
67
|
+
else
|
|
68
|
+
return results # return array of hashes
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
else
|
|
72
|
+
return response
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
when "429"
|
|
76
|
+
# sleep for throttling time
|
|
77
|
+
STDERR.puts "\tThrottled CiscoWebex::Rest(): #{response.each_header.to_h['Retry-After'] + 1}sec..."
|
|
78
|
+
sleep(response.each_header.to_h['Retry-After'] + 1)
|
|
79
|
+
|
|
80
|
+
else
|
|
81
|
+
STDERR.puts "Error: CiscoWebex::Rest(): #{response} - #{response.body}"
|
|
82
|
+
return false
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# basid REST GET to Webex teams
|
|
88
|
+
def self.get(auth_token, uri, params=nil, limit=100)
|
|
89
|
+
@auth_token = auth_token
|
|
90
|
+
if params.class == String
|
|
91
|
+
uri = "#{uri}/#{params}"
|
|
92
|
+
elsif params.to_h.has_key?("id")
|
|
93
|
+
uri = "#{uri}/#{params.to_h['id']}"
|
|
94
|
+
end
|
|
95
|
+
# set REST client headers, body etc
|
|
96
|
+
uri = URI("#{BASE_URL}#{uri}")
|
|
97
|
+
uri.query = parse_params(params, "www-encoded") if (params.class == Hash || params.class == OpenStruct) # encode and set params if required
|
|
98
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
|
99
|
+
https.use_ssl = true
|
|
100
|
+
request = Net::HTTP::Get.new(uri)
|
|
101
|
+
request["Authorization"] = "Bearer #{@auth_token}"
|
|
102
|
+
request["User-Agent"] = "Webex Rudy Library"
|
|
103
|
+
|
|
104
|
+
return send_rest(https, request, limit) # send REST call
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# basid REST GET to Webex teams
|
|
108
|
+
def self.head(auth_token, uri, params=nil)
|
|
109
|
+
# set REST client headers, body etc
|
|
110
|
+
if params.class == String
|
|
111
|
+
uri = "#{uri}/#{params}"
|
|
112
|
+
elsif params.to_h.has_key?("id")
|
|
113
|
+
uri = "#{uri}/#{params.to_h['id']}"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
uri = URI("#{BASE_URL}#{uri}")
|
|
117
|
+
uri.query = parse_params(params, "www-encoded") if params # encode and set params if required
|
|
118
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
|
119
|
+
https.use_ssl = true
|
|
120
|
+
request = Net::HTTP::Head.new(uri)
|
|
121
|
+
request["Authorization"] = "Bearer #{auth_token}"
|
|
122
|
+
request["User-Agent"] = "Webex Rudy Library"
|
|
123
|
+
|
|
124
|
+
return send_rest(https, request) # send REST call
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# basid REST DELETE to Webex teams
|
|
128
|
+
def self.delete(auth_token, uri, params=nil)
|
|
129
|
+
# set REST client headers, body etc
|
|
130
|
+
if params.class == String
|
|
131
|
+
uri = "#{uri}/#{params}"
|
|
132
|
+
elsif params.to_h.has_key?("id")
|
|
133
|
+
uri = "#{uri}/#{params.to_h['id']}"
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
uri = URI("#{BASE_URL}#{uri}")
|
|
137
|
+
uri.query = parse_params(params, "www-encoded") if params # encode and set params if required
|
|
138
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
|
139
|
+
https.use_ssl = true
|
|
140
|
+
request = Net::HTTP::Delete.new(uri)
|
|
141
|
+
request["Authorization"] = "Bearer #{auth_token}"
|
|
142
|
+
request["User-Agent"] = "Webex Rudy Library"
|
|
143
|
+
|
|
144
|
+
return send_rest(https, request) # send REST call
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# basic REST POST for Webex
|
|
148
|
+
def self.post(auth_token, uri, params)
|
|
149
|
+
if params.class != Hash || params.lenth == 0
|
|
150
|
+
STDERR.puts "CiscoWebex::Rest.post(): Must supply `params` as hash for post"
|
|
151
|
+
return False
|
|
152
|
+
end
|
|
153
|
+
# build REST client/headers/body etc
|
|
154
|
+
uri = URI("#{BASE_URL}#{uri}")
|
|
155
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
|
156
|
+
https.use_ssl = true
|
|
157
|
+
request = Net::HTTP::Post.new(uri)
|
|
158
|
+
request["Authorization"] = "Bearer #{auth_token}"
|
|
159
|
+
request["Content-Type"] = "application/json"
|
|
160
|
+
request["Accept"] = "*/*"
|
|
161
|
+
request["User-Agent"] = "Webex Rudy Library"
|
|
162
|
+
request.body = parse_params(params) # format params as json body
|
|
163
|
+
|
|
164
|
+
return send_rest(https, request) # send REST call
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# basic REST PUT for Webex
|
|
168
|
+
def self.put(auth_token, uri, params)
|
|
169
|
+
if params.class != Hash || params.lenth == 0
|
|
170
|
+
STDERR.puts "CiscoWebex::Rest.put(): Must supply `params` as hash for update"
|
|
171
|
+
return False
|
|
172
|
+
elsif params.to_h.has_key?("id")
|
|
173
|
+
uri = "#{uri}/#{params['id']}"
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
uri = URI("#{BASE_URL}#{uri}")
|
|
177
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
|
178
|
+
https.use_ssl = true
|
|
179
|
+
request = Net::HTTP::Put.new(uri)
|
|
180
|
+
request["Authorization"] = "Bearer #{auth_token}"
|
|
181
|
+
request["Content-Type"] = "application/json"
|
|
182
|
+
request["Accept"] = "*/*"
|
|
183
|
+
request["User-Agent"] = "Webex Rudy Library"
|
|
184
|
+
request.body = parse_params(params) # format params as json body
|
|
185
|
+
|
|
186
|
+
return send_rest(https, request) # send REST call
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# basic REST PUT for Webex
|
|
190
|
+
def self.patch(auth_token, uri, params)
|
|
191
|
+
# build REST client/headers/body etc
|
|
192
|
+
if params.class != Hash || params.lenth == 0
|
|
193
|
+
STDERR.puts "CiscoWevex::Rest.patch(): Must supply `params` as hash for update"
|
|
194
|
+
return False
|
|
195
|
+
elsif params.to_h.has_key?("id")
|
|
196
|
+
uri = "#{uri}/#{params['id']}"
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
uri = URI("#{BASE_URL}#{uri}")
|
|
200
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
|
201
|
+
https.use_ssl = true
|
|
202
|
+
request = Net::HTTP::Patch.new(uri)
|
|
203
|
+
request["Authorization"] = "Bearer #{auth_token}"
|
|
204
|
+
request["Content-Type"] = "application/json"
|
|
205
|
+
request["Accept"] = "*/*"
|
|
206
|
+
request["User-Agent"] = "Webex Rudy Library"
|
|
207
|
+
request.body = parse_params(params) # format params as json body
|
|
208
|
+
|
|
209
|
+
return send_rest(https, request) # send REST call
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
end
|
|
213
|
+
end
|
data/lib/REST/RestCC.rb
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
require 'uri'
|
|
2
|
+
require 'net/http'
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'ostruct'
|
|
5
|
+
|
|
6
|
+
module CiscoWebex
|
|
7
|
+
class RestCC
|
|
8
|
+
@BASE_URL = "https://api.wxcc-us1.cisco.com"
|
|
9
|
+
|
|
10
|
+
def initialize()
|
|
11
|
+
puts "Initializing CiscoWebex::CC::Rest not required..."
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# format params for passing as needed json/urlencoded
|
|
15
|
+
def self.parse_params(params, return_format="json")
|
|
16
|
+
return params if ( return_format == "json" && params.class == String && JSON.parse(params) ) # if already json then just send back
|
|
17
|
+
|
|
18
|
+
if params.class == OpenStruct
|
|
19
|
+
params = params.to_h
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
params = params.delete_if { |key, value| value.to_s.strip == '' } # delete any unused keys
|
|
23
|
+
|
|
24
|
+
case return_format
|
|
25
|
+
when "json"
|
|
26
|
+
params = params.to_json
|
|
27
|
+
|
|
28
|
+
when "www-encoded"
|
|
29
|
+
params = URI.encode_www_form(params)
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
return params
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def self.send_rest(rest, request, limit, format="array")
|
|
37
|
+
# loop adjusts for throttling if needed
|
|
38
|
+
results = []
|
|
39
|
+
while true
|
|
40
|
+
response = rest.request(request)
|
|
41
|
+
headers, response_code = [ response.each_header.to_h, response.code ]
|
|
42
|
+
case response_code
|
|
43
|
+
when "200"
|
|
44
|
+
# if REST success then parse body to JSON
|
|
45
|
+
response = JSON.parse(response.body)
|
|
46
|
+
return response if format == "array" # If not an array then convert hash to object and return
|
|
47
|
+
return OpenStruct.new(response) if format == "object" # If not an array then convert hash to object and return
|
|
48
|
+
|
|
49
|
+
when "429"
|
|
50
|
+
# sleep for throttling time
|
|
51
|
+
puts "Throttled. Waiting #{response.each_header.to_h['retry-after']}..."
|
|
52
|
+
sleep(response.each_header.to_h['retry-after'].to_i + 1)
|
|
53
|
+
puts "\t... and go."
|
|
54
|
+
|
|
55
|
+
else
|
|
56
|
+
STDERR.puts "CC REST ERROR: " + response.to_s + response.body.to_s
|
|
57
|
+
return false
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
return OpenStruct.new(response) if format == "object"
|
|
61
|
+
return response if format == "array"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# basid REST GET to Webex teams
|
|
65
|
+
def self.get(auth_token, uri, params={}, limit=50000)
|
|
66
|
+
if params.class != Hash # fix missing params
|
|
67
|
+
limit = params
|
|
68
|
+
params = {}
|
|
69
|
+
end
|
|
70
|
+
if params.class == Hash && params.has_key?('orgId')
|
|
71
|
+
orig_id = params['orgId']
|
|
72
|
+
else
|
|
73
|
+
org_id = uri.split('/')[2]
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
result = { 'data'=> [], 'meta'=> {'orgId'=> org_id, 'library_added'=> true} }
|
|
77
|
+
if ( params.class == Hash and ! params.has_key?('page') ) # add page for looping
|
|
78
|
+
params['page'] = 0
|
|
79
|
+
end
|
|
80
|
+
if ( params.class == Hash and ! params.has_key?('pageSize') ) # add page for looping
|
|
81
|
+
params['pageSize'] = 100
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# provide looping for longer requests
|
|
85
|
+
while true
|
|
86
|
+
# set REST client headers, body etc
|
|
87
|
+
api_uri = "#{uri}?#{parse_params(params, "www-encoded") if (params.class == Hash || params.class == OpenStruct)}"
|
|
88
|
+
url = URI(@BASE_URL)
|
|
89
|
+
https = Net::HTTP.new(url.host, url.port)
|
|
90
|
+
https.use_ssl = true
|
|
91
|
+
request = Net::HTTP::Get.new(api_uri)
|
|
92
|
+
request["Authorization"] = "Bearer #{auth_token}"
|
|
93
|
+
request["User-Agent"] = "Webex Rudy Library"
|
|
94
|
+
|
|
95
|
+
rest_response = send_rest(https, request, limit, "array") # send REST call
|
|
96
|
+
if rest_response == false
|
|
97
|
+
return false
|
|
98
|
+
|
|
99
|
+
else
|
|
100
|
+
# parse return based on v1/v2 for set common format of v1
|
|
101
|
+
if rest_response.class == Hash && rest_response.has_key?('data')
|
|
102
|
+
# try and check of we need to get the next page.
|
|
103
|
+
# if response length is 0 then no need to pull again
|
|
104
|
+
# if response length is less that the requested page size then no need
|
|
105
|
+
# Paging not supported on all APIs so if response is larger than the requested page size then concider it done
|
|
106
|
+
if rest_response['data'].length() == 0 || rest_response['data'].length() < params['pageSize']|| rest_response['data'].length() > params['pageSize']
|
|
107
|
+
result['data'] = rest_response['data'][0..(limit - 1)]
|
|
108
|
+
result['meta'] = rest_response['meta']
|
|
109
|
+
return result
|
|
110
|
+
end
|
|
111
|
+
result['data'].concat(rest_response['data'])
|
|
112
|
+
result['meta'] = rest_response['meta']
|
|
113
|
+
|
|
114
|
+
elsif rest_response.class == Array
|
|
115
|
+
# try and check of we need to get the next page.
|
|
116
|
+
# if response length is 0 then no need to pull again
|
|
117
|
+
# if response length is less that the requested page size then no need
|
|
118
|
+
# Paging not supported on all APIs so if response is larger than the requested page size then concider it done
|
|
119
|
+
if rest_response.length() == 0 || rest_response.length() < params['pageSize'] || rest_response.length() > params['pageSize']
|
|
120
|
+
result['data'] = rest_response[0..(limit - 1)]
|
|
121
|
+
return result
|
|
122
|
+
end
|
|
123
|
+
result['data'].concat(rest_response)
|
|
124
|
+
|
|
125
|
+
else
|
|
126
|
+
return result
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# check if limit is met and return if so
|
|
130
|
+
if result['data'].length() >= limit
|
|
131
|
+
result['data'] = result['data'][0..(limit - 1)]
|
|
132
|
+
return result
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
params['page'] += 1
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# basid REST GET to Webex teams
|
|
141
|
+
def self.head(auth_token, uri, params=nil)
|
|
142
|
+
# set REST client headers, body etc
|
|
143
|
+
if params.class == String
|
|
144
|
+
uri = "#{uri}/#{params}"
|
|
145
|
+
elsif params.has_key?("id")
|
|
146
|
+
uri = "#{uri}/#{params['id']}"
|
|
147
|
+
params.delete('id')
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
uri = URI("#{@BASE_URL}#{uri}")
|
|
151
|
+
uri.query = parse_params(params, "www-encoded") if params # encode and set params if required
|
|
152
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
|
153
|
+
https.use_ssl = true
|
|
154
|
+
request = Net::HTTP::Head.new(uri)
|
|
155
|
+
request["Authorization"] = "Bearer #{auth_token}"
|
|
156
|
+
request["User-Agent"] = "Webex Rudy Library"
|
|
157
|
+
|
|
158
|
+
return send_rest(https, request) # send REST call
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# basid REST DELETE to Webex teams
|
|
162
|
+
def self.delete(auth_token, uri, params=nil)
|
|
163
|
+
# set REST client headers, body etc
|
|
164
|
+
uri = URI("#{@BASE_URL}#{uri}")
|
|
165
|
+
uri.query = parse_params(params, "www-encoded") if params # encode and set params if required
|
|
166
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
|
167
|
+
https.use_ssl = true
|
|
168
|
+
request = Net::HTTP::Delete.new(uri)
|
|
169
|
+
request["Authorization"] = "Bearer #{auth_token}"
|
|
170
|
+
request["User-Agent"] = "Webex Rudy Library"
|
|
171
|
+
|
|
172
|
+
return send_rest(https, request) # send REST call
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# basic REST POST for Webex
|
|
176
|
+
def self.post(auth_token, uri, params)
|
|
177
|
+
# build REST client/headers/body etc
|
|
178
|
+
if params.class != Hash || params.lenth == 0
|
|
179
|
+
STDERR.puts "CiscoWebex::RestCC.put(): Must supply `params` as hash for update"
|
|
180
|
+
return False
|
|
181
|
+
elsif params.to_h.has_key?("id")
|
|
182
|
+
uri = "#{uri}/#{params['id']}"
|
|
183
|
+
end
|
|
184
|
+
uri = URI("#{@BASE_URL}#{uri}")
|
|
185
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
|
186
|
+
https.use_ssl = true
|
|
187
|
+
request = Net::HTTP::Post.new(uri)
|
|
188
|
+
request["Authorization"] = "Bearer #{auth_token}"
|
|
189
|
+
request["Content-Type"] = "application/json"
|
|
190
|
+
request["Accept"] = "*/*"
|
|
191
|
+
request["User-Agent"] = "Webex Rudy Library"
|
|
192
|
+
request.body = parse_params(params) # format params as json body
|
|
193
|
+
|
|
194
|
+
return send_rest(https, request) # send REST call
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# basic REST PUT for Webex
|
|
198
|
+
def self.put(auth_token, uri, params)
|
|
199
|
+
# build REST client/headers/body etc
|
|
200
|
+
if params.class != Hash || params.lenth == 0
|
|
201
|
+
STDERR.puts "CiscoWebex::RestCC.put(): Must supply `params` as hash for update"
|
|
202
|
+
return False
|
|
203
|
+
elsif params.to_h.has_key?("id")
|
|
204
|
+
uri = "#{uri}/#{params['id']}"
|
|
205
|
+
end
|
|
206
|
+
uri = URI("#{@BASE_URL}#{uri}")
|
|
207
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
|
208
|
+
https.use_ssl = true
|
|
209
|
+
request = Net::HTTP::Put.new(uri)
|
|
210
|
+
request["Authorization"] = "Bearer #{auth_token}"
|
|
211
|
+
request["Content-Type"] = "application/json"
|
|
212
|
+
request["Accept"] = "*/*"
|
|
213
|
+
request["User-Agent"] = "Webex Rudy Library"
|
|
214
|
+
request.body = parse_params(params) # format params as json body
|
|
215
|
+
|
|
216
|
+
return send_rest(https, request) # send REST call
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
# basic REST PUT for Webex
|
|
220
|
+
def self.patch(auth_token, uri, params)
|
|
221
|
+
# build REST client/headers/body etc
|
|
222
|
+
if params.class != Hash || params.lenth == 0
|
|
223
|
+
STDERR.puts "CiscoWebex::RestCC.patch(): Must supply `params` as hash for update"
|
|
224
|
+
return False
|
|
225
|
+
elsif params.to_h.has_key?("id")
|
|
226
|
+
uri = "#{uri}/#{params['id']}"
|
|
227
|
+
end
|
|
228
|
+
uri = URI("#{@BASE_URL}#{uri}")
|
|
229
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
|
230
|
+
https.use_ssl = true
|
|
231
|
+
request = Net::HTTP::Patch.new(uri)
|
|
232
|
+
request["Authorization"] = "Bearer #{auth_token}"
|
|
233
|
+
request["Content-Type"] = "application/json"
|
|
234
|
+
request["Accept"] = "*/*"
|
|
235
|
+
request["User-Agent"] = "Webex Rudy Library"
|
|
236
|
+
request.body = parse_params(params) # format params as json body
|
|
237
|
+
|
|
238
|
+
return send_rest(https, request) # send REST call
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
end
|
|
242
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
require 'date'
|
|
2
|
+
require 'time'
|
|
3
|
+
|
|
4
|
+
module CiscoWebex
|
|
5
|
+
class Toolbox
|
|
6
|
+
def self.search(list, params={})
|
|
7
|
+
if !list || list.class != Array || list.class != Hash || params == {}
|
|
8
|
+
STDERR.puts "CicoWebex::Toolbox.search(list, params={}): Data provided for search much be am Array of Hashes, `params` must have parameters to search on"
|
|
9
|
+
return false
|
|
10
|
+
end
|
|
11
|
+
results = []
|
|
12
|
+
for app in list
|
|
13
|
+
matches = 0
|
|
14
|
+
for pair in params.each()
|
|
15
|
+
if app[pair[0]] == pair[1]
|
|
16
|
+
matches += 1
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
if matches == params.length()
|
|
20
|
+
results.append(app)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
return results
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class WebexTime
|
|
27
|
+
def self.error()
|
|
28
|
+
STDERR.puts "Error CiscoWebex::Toolbox::WebexTime: Could not format/transform time from timestamp"
|
|
29
|
+
return false
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.now()
|
|
33
|
+
return Time.now()
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# converts possible time type to `Time` format for easier parsing
|
|
37
|
+
def self.consistent_timestamp(timestamp="now")
|
|
38
|
+
return timestamp if timestamp.class == Time
|
|
39
|
+
return Time.now() if timestamp.class == String && timestamp.downcase == "now"
|
|
40
|
+
return Time.parse(timestamp) if timestamp.class == String
|
|
41
|
+
return Time.at(timestamp) if timestamp.class == Integer
|
|
42
|
+
return Time.parse(timestamp.to_s) if timestamp.class == DateTime
|
|
43
|
+
return self.error()
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Format time based on default for Controlhub CC open for epoch
|
|
47
|
+
def self.format(timestamp, time_format="control_hub")
|
|
48
|
+
timestamp = self.consistent_timestamp(timestamp)
|
|
49
|
+
|
|
50
|
+
if time_format.downcase() == "cc" || time_format.downcase() =~ /contact.*/
|
|
51
|
+
return timestamp.strftime("%s").to_i rescue self.error()
|
|
52
|
+
|
|
53
|
+
elsif time_format.downcase() == "epoch" || time_format.downcase() == "ms"
|
|
54
|
+
return timestamp.strftime("%s").to_i * 1000
|
|
55
|
+
|
|
56
|
+
else
|
|
57
|
+
return timestamp.strftime("%Y-%m-%dT%H:%M:%S.000Z") rescue self.error()
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# shift curret time by X seconds round if required
|
|
63
|
+
def self.shift(timestamp="now", shift_seconds=60, time_format="control_hub", round=0)
|
|
64
|
+
timestamp = self.consistent_timestamp(timestamp)
|
|
65
|
+
timestamp = self.consistent_timestamp(timestamp.to_i + shift_seconds)
|
|
66
|
+
timestamp = self.round(timestamp, round, time_format) if round.to_i > 0
|
|
67
|
+
return self.format(timestamp, time_format) rescue self.error()
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# round time to nearest 15min default
|
|
71
|
+
def self.round(timestamp="now", interval=15, time_format="control_hub")
|
|
72
|
+
timestamp = self.consistent_timestamp(timestamp)
|
|
73
|
+
interval = interval.to_i
|
|
74
|
+
return self.format(Time.at((timestamp.to_i / (interval*60)).round * interval*60).to_i, time_format) rescue self.error()
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
data/lib/bersion.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: CiscoWebex
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.4
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Jon Snipes
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2022-03-22 00:00:00.000000000 Z
|
|
12
|
+
dependencies: []
|
|
13
|
+
description: CiscoWebex API
|
|
14
|
+
email: jsnipes@mcloverhound.com
|
|
15
|
+
executables: []
|
|
16
|
+
extensions: []
|
|
17
|
+
extra_rdoc_files: []
|
|
18
|
+
files:
|
|
19
|
+
- lib/Admin.rb
|
|
20
|
+
- lib/Admin/Admin.rb
|
|
21
|
+
- lib/Admin/AuditEvents.rb
|
|
22
|
+
- lib/Admin/Authorizations.rb
|
|
23
|
+
- lib/Admin/Licenses.rb
|
|
24
|
+
- lib/Admin/Organizations.rb
|
|
25
|
+
- lib/Admin/People.rb
|
|
26
|
+
- lib/Admin/ResourceGroups.rb
|
|
27
|
+
- lib/Admin/Roles.rb
|
|
28
|
+
- lib/CC.rb
|
|
29
|
+
- lib/CC/AddressBooks.rb
|
|
30
|
+
- lib/CC/AgentProfiles.rb
|
|
31
|
+
- lib/CC/Agents.rb
|
|
32
|
+
- lib/CC/AuxiliaryCodes.rb
|
|
33
|
+
- lib/CC/CC.rb
|
|
34
|
+
- lib/CC/Captures.rb
|
|
35
|
+
- lib/CC/DialPlans.rb
|
|
36
|
+
- lib/CC/EntryPointMappings.rb
|
|
37
|
+
- lib/CC/EntryPoints.rb
|
|
38
|
+
- lib/CC/Journey.rb
|
|
39
|
+
- lib/CC/Journey/Actions.rb
|
|
40
|
+
- lib/CC/Journey/Aliases.rb
|
|
41
|
+
- lib/CC/Journey/Events.rb
|
|
42
|
+
- lib/CC/Journey/Identities.rb
|
|
43
|
+
- lib/CC/Journey/Journey.rb
|
|
44
|
+
- lib/CC/Journey/ProfileViews.rb
|
|
45
|
+
- lib/CC/Journey/Report.rb
|
|
46
|
+
- lib/CC/Journey/Reports.rb
|
|
47
|
+
- lib/CC/Journey/Streams.rb
|
|
48
|
+
- lib/CC/Journey/Views.rb
|
|
49
|
+
- lib/CC/MultimediaProfiles.rb
|
|
50
|
+
- lib/CC/OutboundANI.rb
|
|
51
|
+
- lib/CC/Queues.rb
|
|
52
|
+
- lib/CC/Sites.rb
|
|
53
|
+
- lib/CC/SkillProfiles.rb
|
|
54
|
+
- lib/CC/Skills.rb
|
|
55
|
+
- lib/CC/Subscriptions.rb
|
|
56
|
+
- lib/CC/Tasks.rb
|
|
57
|
+
- lib/CC/Teams.rb
|
|
58
|
+
- lib/CC/UserProfiles.rb
|
|
59
|
+
- lib/CC/Users.rb
|
|
60
|
+
- lib/Calling.rb
|
|
61
|
+
- lib/Calling/CallControl.rb
|
|
62
|
+
- lib/Calling/Calling.rb
|
|
63
|
+
- lib/Calling/Calls.rb
|
|
64
|
+
- lib/Calling/Locations.rb
|
|
65
|
+
- lib/Calling/Voicemail.rb
|
|
66
|
+
- lib/CiscoWebex.rb
|
|
67
|
+
- lib/Devices.rb
|
|
68
|
+
- lib/Devices/Configurations.rb
|
|
69
|
+
- lib/Devices/Devices.rb
|
|
70
|
+
- lib/Devices/Endpoints.rb
|
|
71
|
+
- lib/Devices/Workspaces.rb
|
|
72
|
+
- lib/Devices/Xapi.rb
|
|
73
|
+
- lib/Meetings.rb
|
|
74
|
+
- lib/Meetings/ControlStatus.rb
|
|
75
|
+
- lib/Meetings/Invitees.rb
|
|
76
|
+
- lib/Meetings/Meetings.rb
|
|
77
|
+
- lib/Meetings/Participants.rb
|
|
78
|
+
- lib/Meetings/Qualities.rb
|
|
79
|
+
- lib/Meetings/Registrations.rb
|
|
80
|
+
- lib/Meetings/SessionTypes.rb
|
|
81
|
+
- lib/Meetings/Templates.rb
|
|
82
|
+
- lib/Meetings/Transcripts.rb
|
|
83
|
+
- lib/Meetings/WebexMeetings.rb
|
|
84
|
+
- lib/Messaging.rb
|
|
85
|
+
- lib/Messaging/Attachements.rb
|
|
86
|
+
- lib/Messaging/Classifications.rb
|
|
87
|
+
- lib/Messaging/Events.rb
|
|
88
|
+
- lib/Messaging/Memberships.rb
|
|
89
|
+
- lib/Messaging/Messages.rb
|
|
90
|
+
- lib/Messaging/Messaging.rb
|
|
91
|
+
- lib/Messaging/People.rb
|
|
92
|
+
- lib/Messaging/Rooms.rb
|
|
93
|
+
- lib/Messaging/Teams.rb
|
|
94
|
+
- lib/Messaging/Webhooks.rb
|
|
95
|
+
- lib/REST/Rest.rb
|
|
96
|
+
- lib/REST/RestCC.rb
|
|
97
|
+
- lib/Toolbox/Toolbox.rb
|
|
98
|
+
- lib/bersion.rb
|
|
99
|
+
homepage: https://rubygems.org/gems/CiscoWebex
|
|
100
|
+
licenses:
|
|
101
|
+
- MIT
|
|
102
|
+
metadata: {}
|
|
103
|
+
post_install_message:
|
|
104
|
+
rdoc_options: []
|
|
105
|
+
require_paths:
|
|
106
|
+
- lib
|
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
108
|
+
requirements:
|
|
109
|
+
- - ">="
|
|
110
|
+
- !ruby/object:Gem::Version
|
|
111
|
+
version: '0'
|
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
|
+
requirements:
|
|
114
|
+
- - ">="
|
|
115
|
+
- !ruby/object:Gem::Version
|
|
116
|
+
version: '0'
|
|
117
|
+
requirements: []
|
|
118
|
+
rubygems_version: 3.0.3.1
|
|
119
|
+
signing_key:
|
|
120
|
+
specification_version: 4
|
|
121
|
+
summary: CiscoWebex for Ruby
|
|
122
|
+
test_files: []
|