comufy 0.0.2.pre2 → 0.0.3pre1

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.
data/lib/comufy.rb CHANGED
@@ -1,7 +1,3 @@
1
- require "comufy/version"
2
- require "comufy/config"
3
- require "comufy/connector"
4
-
5
1
  require 'yaml'
6
2
  require 'json'
7
3
  require 'net/http'
@@ -9,15 +5,784 @@ require 'net/https'
9
5
  require 'cgi'
10
6
  require 'logger'
11
7
 
12
- module Comufy
8
+ class Comufy
13
9
 
14
- def self.connect params = {}
15
- Connector.new(params)
16
- end
10
+ attr_reader :config, :logger
11
+
12
+ autoload :Constants, "comufy/constants"
13
+ autoload :Version, "comufy/version"
14
+ autoload :Config, "comufy/config"
17
15
 
18
16
  # Based on Rails implementation, ensures all strings are converted
19
- # into symbols.
20
- def symbolize_keys hash
21
- hash.each_with_object({}){|(k,v), h| h[k.to_sym] = v}
17
+ # into symbols. (Non-recursive!)
18
+ def self.symbolize_keys hash
19
+ hash.each_with_object( {} ) { |(k,v), h| h[k.to_sym] = v }
22
20
  end
21
+
22
+ # There are a number of options you can pass to change default settings.
23
+ #
24
+ # With regards to the server to connect to, if you pass <tt>staging: true</tt> it'll use the Comufy
25
+ # staging server, otherwise it'll default to using the social server.
26
+ #
27
+ # Concerning authentication, there are a number of ways to connect to the Comufy servers. You can
28
+ # pass in a user name and password in the parameters, provide the location of a YAML file where these are
29
+ # specified or read in the <tt>access_token</tt> from your environment path. Please note that you can stop
30
+ # the connector from reading your environment path by setting <tt>no_env</tt> to true. When doing this please
31
+ # ensure your user name and password are correct, otherwise you'll not be able to connect to the Comufy servers.
32
+ #
33
+ # The YAML file provided should appear as:
34
+ # user: user
35
+ # password: password
36
+ #
37
+ # OR
38
+ #
39
+ # token: token
40
+ # time: expiry_time
41
+ #
42
+ # = Example
43
+ #
44
+ # # set the user and password yourself
45
+ # Comufy.new(user: YOUR_USERNAME, password: YOUR_PASSWORD)
46
+ #
47
+ # # set the token and expiry time
48
+ # Comufy.new(token: YOUR_TOKEN, time: YOUR_EXPIRY_TIME)
49
+ #
50
+ # # Or you can read in from a YAML file!
51
+ #
52
+ # # tell the connector where to find the yaml file to read
53
+ # Comufy.new(yaml: PATH_TO_YAML_FILE)
54
+ def initialize opts = {}
55
+ opts = Comufy.symbolize_keys(opts)
56
+
57
+ @logger = Logger.new(STDOUT)
58
+ @logger.level = case opts[:logger]
59
+ when "info" then
60
+ Logger::INFO
61
+ when "warn" then
62
+ Logger::WARN
63
+ when "debug" then
64
+ Logger::DEBUG
65
+ else
66
+ Logger::WARN
67
+ end
68
+
69
+ # sanitize all output
70
+ original_formatter = Logger::Formatter.new
71
+ @logger.formatter = proc { |severity, datetime, progname, msg|
72
+ original_formatter.call(severity, datetime, progname, msg.dump)
73
+ }
74
+
75
+ @config = Config.new(opts)
76
+ end
77
+
78
+ # This API call allows you to register a Facebook user of your application into Comufy’s social CRM.
79
+ # If this user was already registered with Comufy, their information will be updated.
80
+ #
81
+ # * (String) +app_name+ - The application you'll be adding the user to.
82
+ # * (String) +uid+ - The Facebook ID of the user you'll be adding.
83
+ # * (Hash) +tags+ - The tags you'll setting for this user.
84
+ # * (String) +tag_name+ - Must correspond to one of the tag names of the application.
85
+ # * (String) +value+ - Must be the correct value type for that tag.
86
+ #
87
+ # = Example
88
+ #
89
+ # Comufy.store_users(YOUR_APPLICATION_NAME, USER_FACEBOOK_ID, { 'dob' => '1978-10-01 19:50:48' })
90
+ def store_user app_name, uid, tags
91
+ return false unless get_access_token
92
+ if app_name.nil? or app_name.empty?
93
+ @logger.warn(progname = 'Comufy.store_user') {
94
+ 'First parameter must be set to your application name.'
95
+ }
96
+ return false
97
+ end
98
+ if uid.nil? or uid.empty?
99
+ @logger.warn(progname = 'Comufy.store_user') {
100
+ 'Second parameter must be a valid Facebook user ID.'
101
+ }
102
+ return false
103
+ end
104
+ if tags.nil? or not tags.is_a?(Hash)
105
+ @logger.warn(progname = 'Comufy.store_user') {
106
+ 'Third parameter must be a hash of tag information for this uid.'
107
+ }
108
+ return false
109
+ end
110
+
111
+ data = {
112
+ #token: @config.access_token,
113
+ cd: '88',
114
+ applicationName: app_name,
115
+ accounts: [{
116
+ account: { fbId: uid },
117
+ tags: tags
118
+ }]
119
+ }
120
+
121
+ message = call_api(data)
122
+ if message
123
+ case message['cd']
124
+ when 388 then
125
+ @logger.debug(progname = 'Comufy.store_user') {
126
+ "388 - Success! - data = #{data} - message = #{message}."
127
+ }
128
+ return true
129
+ when 475 then
130
+ @logger.debug(progname = 'Comufy.store_user') {
131
+ "475 - Invalid parameter provided. - data = #{data} - message = #{message}."
132
+ }
133
+ @logger.warn(progname = 'Comufy.store_user') {
134
+ '475 - Invalid parameter provided.'
135
+ }
136
+ when 617 then
137
+ @logger.debug(progname = 'Comufy.store_user') {
138
+ "617 - Some of the tags passed are not registered. - data = #{data} - message = #{message}."
139
+ }
140
+ @logger.warn(progname = 'Comufy.store_user') {
141
+ '617 - Some of the tags passed are not registered.'
142
+ }
143
+ when 632 then
144
+ @logger.debug(progname = 'Comufy.store_user') {
145
+ "632 - _ERROR_FACEBOOK_PAGE_NOT_FOUND - data = #{data} - message = #{message}."
146
+ }
147
+ @logger.warn(progname = 'Comufy.store_user') {
148
+ '632 - _ERROR_FACEBOOK_PAGE_NOT_FOUND'
149
+ }
150
+ else
151
+ @logger.debug(progname = 'Comufy.store_user') {
152
+ "UNKNOWN RESPONSE - data = #{data} - message = #{message}."
153
+ }
154
+ @logger.warn(progname = 'Comufy.store_user') {
155
+ "An error occurred when sending #{data}. Comufy returned #{message}. Please get in touch with Comufy if you cannot resolve the problem."
156
+ }
157
+ end
158
+ else
159
+ @logger.debug(progname = 'Comufy.store_user') {
160
+ "Authentication failed - data = #{data}."
161
+ }
162
+ @logger.warn(progname = 'Comufy.store_user') {
163
+ "Authentication failed when sending #{data}. Please get in touch with Comufy if you cannot resolve the problem."
164
+ }
165
+ end
166
+ false
167
+ end
168
+
169
+ # See store_user for details
170
+ def add_user app_name, uid, tags
171
+ store_user app_name, uid, tags
172
+ end
173
+
174
+ # See store_user for details
175
+ def update_user app_name, uid, tags
176
+ store_user app_name, uid, tags
177
+ end
178
+
179
+ ## Method not implemented
180
+ #def remove_user app_name, uid # :nodoc:
181
+ # return false unless get_access_token
182
+ # @logger.debug(progname = 'Comufy.remove_user') {
183
+ # 'METHOD_NOT_IMPLEMENTED'
184
+ # }
185
+ # @logger.warn(progname = 'Comufy.remove_user') {
186
+ # 'METHOD_NOT_IMPLEMENTED'
187
+ # }
188
+ # false
189
+ #end
190
+
191
+ #
192
+ # This API call allows you to register multiple Facebook users of your application into Comufy’s social CRM.
193
+ # If these users were already registered into Comufy, their information will be updated.
194
+ #
195
+ # * (String) +app_name+ - The application you wish to store these users with.
196
+ # * (Hash) +uid_tags+ - The users you wish to add with their corresponding tag data.
197
+ # * (String) +uid+ - The key is the Facebook ID of the user.
198
+ # * (Hash) +tags+ - The value is the tags of data to apply for that user.
199
+ #
200
+ # = Example
201
+ #
202
+ # Comufy.store_users(
203
+ # YOUR_APPLICATION_NAME,
204
+ # { USER_ID => { 'dob' => '1978-10-01 19:50:48' }, OTHER_USER_ID => { 'dob' => '1978-10-01 19:50:48'}}
205
+ # )
206
+ def store_users app_name, uid_tags
207
+ return false unless get_access_token
208
+ if app_name.nil? or app_name.empty?
209
+ @logger.warn(progname = 'Comufy.store_users') {
210
+ 'First parameter must be set to your application name.'
211
+ }
212
+ return false
213
+ end
214
+ if uid_tags.nil? or not uid_tags.is_a?(Hash)
215
+ @logger.warn(progname = 'Comufy.store_users') {
216
+ 'Second parameter must be a hash where a key is a Facebook user ID and its value a hash of tags.'
217
+ }
218
+ return false
219
+ end
220
+
221
+ data = {
222
+ #token: @config.access_token,
223
+ cd: '88',
224
+ applicationName: app_name,
225
+ accounts: uid_tags.map { |uid, tags| Hash[:account, { fbId: uid }, :tags, tags] }
226
+ }
227
+
228
+ message = call_api(data)
229
+ if message
230
+ case message['cd']
231
+ when 388 then
232
+ @logger.debug(progname = 'Comufy.store_users') {
233
+ "388 - Success! - data = #{data} - message = #{message}."
234
+ }
235
+ return true
236
+ when 475 then
237
+ @logger.debug(progname = 'Comufy.store_users') {
238
+ "603 - Invalid parameter provided. - data = #{data} - message = #{message}."
239
+ }
240
+ @logger.warn(progname = 'Comufy.store_users') {
241
+ '475 - Invalid parameter provided.'
242
+ }
243
+ when 617 then
244
+ @logger.debug(progname = 'Comufy.store_users') {
245
+ "617 - Some of the tags passed are not registered. - data = #{data} - message = #{message}."
246
+ }
247
+ @logger.warn(progname = 'Comufy.store_users') {
248
+ '617 - Some of the tags passed are not registered.'
249
+ }
250
+ when 632 then
251
+ @logger.debug(progname = 'Comufy.store_users') {
252
+ "632 - _ERROR_FACEBOOK_PAGE_NOT_FOUND - data = #{data} - message = #{message}."
253
+ }
254
+ @logger.warn(progname = 'Comufy.store_users') {
255
+ '632 - _ERROR_FACEBOOK_PAGE_NOT_FOUND'
256
+ }
257
+ else
258
+ @logger.debug(progname = 'Comufy.store_users') {
259
+ "UNKNOWN RESPONSE - data = #{data} - message = #{message}."
260
+ }
261
+ @logger.warn(progname = 'Comufy.store_users') {
262
+ "An error occurred when sending #{data}. Comufy returned #{message}. Please get in touch with Comufy if you cannot resolve the problem."
263
+ }
264
+ end
265
+ else
266
+ @logger.debug(progname = 'Comufy.store_users') {
267
+ "Authentication failed - data = #{data}."
268
+ }
269
+ @logger.warn(progname = 'Comufy.store_users') {
270
+ "Authentication failed when sending #{data}. Please get in touch with Comufy if you cannot resolve the problem."
271
+ }
272
+ end
273
+ false
274
+ end
275
+
276
+
277
+ # Registering a Facebook application tag allows you to store data-fields about each one of your customers.
278
+ #
279
+ # * (String) +app_name+ - The application you wish to register the tags with.
280
+ # * (Hash) +tag+ - The tag you wish to register
281
+ # * (String) +name+ - The name for the tag.
282
+ # * (String) +type+ - Must be one of the following: STRING, DATE, GENDER, INT, FLOAT.
283
+ #
284
+ # = Example
285
+ # Comufy.register_tag(YOUR_APPLICATION_NAME, name: 'dob', type: Connector::DATE_TYPE)
286
+ def register_tag app_name, tag = {}
287
+ register_tags(app_name, Array[tag])
288
+ end
289
+
290
+ # Registering a Facebook application tag allows you to store data-fields about each one of your customers.
291
+ #
292
+ # * (String) +app_name+ - The application you wish to register the tags with.
293
+ # * (Array) +tags+ - The tags you wish to register, each of which must be a (Hash) containing two keys.
294
+ # * (String) +name+ - The name for the tag.
295
+ # * (String) +type+ - Must be one of the following: STRING, DATE, GENDER, INT, FLOAT.
296
+ #
297
+ # = Example
298
+ # Comufy.register_tags(
299
+ # YOUR_APPLICATION_NAME,
300
+ # [{
301
+ # Connector::NAME_TAG: 'dob',
302
+ # Connector::TYPE_TAG: Connector::DATE_TYPE
303
+ # },
304
+ # {
305
+ # Connector::NAME_TAG: 'height',
306
+ # Connector::TYPE_TAG: Connector::FLOAT_TYPE
307
+ # }]
308
+ # )
309
+ def register_tags app_name, tags
310
+ return false unless get_access_token
311
+ if app_name.nil? or app_name.empty?
312
+ @logger.warn(progname = 'Comufy.register_tags') {
313
+ 'First parameter must be set to your application name.'
314
+ }
315
+ return false
316
+ end
317
+ if tags.nil? or not tags.is_a?(Array)
318
+ @logger.warn(progname = 'Comufy.register_tags') {
319
+ 'Second parameter must be an array containing hashes.'
320
+ }
321
+ return false
322
+ end
323
+ tags.each do |tag|
324
+ tag.each do |key, value|
325
+ unless Constants::LEGAL_TAGS.include?(key)
326
+ @logger.warn(progname = 'Comufy.register_tags') {
327
+ "You must have only two keys called #{Constants::NAME_TAG} and #{Constants::TYPE_TAG}."
328
+ }
329
+ return false
330
+ end
331
+ if (key == "type" or key == :type) and not Constants::LEGAL_TYPES.include?(value)
332
+ @logger.warn(progname = 'Comufy.register_tags') {
333
+ "Your type must be one of these values: #{Constants::LEGAL_TYPES.join(',')}."
334
+ }
335
+ return false
336
+ end
337
+ end
338
+ end
339
+
340
+ data = {
341
+ #token: @config.access_token,
342
+ tags: tags,
343
+ cd: 86,
344
+ applicationName: app_name
345
+ }
346
+
347
+ message = call_api(data)
348
+ if message
349
+ case message['cd']
350
+ when 386 then
351
+ @logger.debug(progname = 'Comufy.register_tags') {
352
+ "386 - Success! - data = #{data} - message = #{message}."
353
+ }
354
+ return true
355
+ when 475 then
356
+ @logger.debug(progname = 'Comufy.register_tags') {
357
+ "475 - Invalid parameters provided - data = #{data} - message = #{message}."
358
+ }
359
+ @logger.warn(progname = 'Comufy.register_tags') {
360
+ '475 - Invalid parameters provided'
361
+ }
362
+ when 603 then
363
+ @logger.debug(progname = 'Comufy.register_tags') {
364
+ "603 - _ERROR_DOMAIN_APPLICATION_NAME_NOT_FOUND - data = #{data} - message = #{message}."
365
+ }
366
+ @logger.warn(progname = 'Comufy.register_tags') {
367
+ '603 - _ERROR_DOMAIN_APPLICATION_NAME_NOT_FOUND'
368
+ }
369
+ when 607 then
370
+ @logger.debug(progname = 'Comufy.register_tags') {
371
+ "607 - _ERROR_UNAUTHORISED_ACTION - data = #{data} - message = #{message}."
372
+ }
373
+ @logger.warn(progname = 'Comufy.register_tags') {
374
+ '607 - _ERROR_UNAUTHORISED_ACTION'
375
+ }
376
+ when 618 then
377
+ @logger.debug(progname = 'Comufy.register_tags') {
378
+ "618 - _ERROR_DOMAIN_APPLICATION_TAG_ALREADY_REGISTERED - data = #{data} - message = #{message}."
379
+ }
380
+ @logger.warn(progname = 'Comufy.register_tags') {
381
+ '618 - _ERROR_DOMAIN_APPLICATION_TAG_ALREADY_REGISTERED'
382
+ }
383
+ else
384
+ @logger.debug(progname = 'Comufy.register_tags') {
385
+ "UNKNOWN RESPONSE - data = #{data} - message = #{message}."
386
+ }
387
+ @logger.warn(progname = 'Comufy.register_tags') {
388
+ "An error occurred when sending #{data}. Comufy returned #{message}. Please get in touch with Comufy if you cannot resolve the problem."
389
+ }
390
+ end
391
+ else
392
+ @logger.debug(progname = 'Comufy.register_tags') {
393
+ "Authentication failed - data = #{data}."
394
+ }
395
+ @logger.warn(progname = 'Comufy.register_tags') {
396
+ "Authentication failed when sending #{data}. Please get in touch with Comufy if you cannot resolve the problem."
397
+ }
398
+ end
399
+ false
400
+ end
401
+
402
+ #
403
+ # This API call will unregister an existing application tag. All data associated with the tag will be lost.
404
+ #
405
+ # * (String) +app_name+ - The application on which to remove the tag.
406
+ # * (String) +tag+ - The tag to remove from the user.
407
+ #
408
+ # = Example
409
+ # Comufy.unregister_tag(YOUR_APPLICATION_NAME, 'dob')
410
+ def unregister_tag app_name, tag
411
+ return false unless get_access_token
412
+ if app_name.nil? or app_name.empty?
413
+ @logger.warn(progname = 'Comufy.unregister_tag') {
414
+ 'First parameter must be set to your application name.'
415
+ }
416
+ return false
417
+ end
418
+ if tag.nil? or tag.empty?
419
+ @logger.warn(progname = 'Comufy.unregister_tag') {
420
+ 'Second parameter must be set to the tag.'
421
+ }
422
+ return false
423
+ end
424
+
425
+ data = {
426
+ #token: @config.access_token,
427
+ tag: tag,
428
+ cd: 85,
429
+ applicationName: app_name
430
+ }
431
+
432
+ message = call_api(data)
433
+ if message
434
+ case message['cd']
435
+ when 385 then
436
+ @logger.debug(progname = 'Comufy.unregister_tag') {
437
+ "385 - Success! - data = #{data} - message = #{message}."
438
+ }
439
+ return true
440
+ when 475 then
441
+ @logger.debug(progname = 'Comufy.unregister_tag') {
442
+ "475 - Invalid parameters provided - data = #{data} - message = #{message}."
443
+ }
444
+ @logger.warn(progname = 'Comufy.unregister_tag') {
445
+ '475 - Invalid parameters provided'
446
+ }
447
+ when 603 then
448
+ @logger.debug(progname = 'Comufy.unregister_tag') {
449
+ "603 - _ERROR_DOMAIN_APPLICATION_NAME_NOT_FOUND - data = #{data} - message = #{message}."
450
+ }
451
+ @logger.warn(progname = 'Comufy.unregister_tag') {
452
+ '603 - _ERROR_DOMAIN_APPLICATION_NAME_NOT_FOUND'
453
+ }
454
+ when 607 then
455
+ @logger.debug(progname = 'Comufy.unregister_tag') {
456
+ "607 - _ERROR_UNAUTHORISED_ACTION - data = #{data} - message = #{message}."
457
+ }
458
+ @logger.warn(progname = 'Comufy.unregister_tag') {
459
+ '607 - _ERROR_UNAUTHORISED_ACTION'
460
+ }
461
+ when 617 then
462
+ @logger.debug(progname = 'Comufy.unregister_tag') {
463
+ "617 - _ERROR_DOMAIN_APPLICATION_TAG_NOT_FOUND - data = #{data} - message = #{message}."
464
+ }
465
+ @logger.warn(progname = 'Comufy.unregister_tag') {
466
+ '617 - _ERROR_DOMAIN_APPLICATION_TAG_NOT_FOUND'
467
+ }
468
+ else
469
+ @logger.debug(progname = 'Comufy.unregister_tag') {
470
+ "UNKNOWN RESPONSE - data = #{data} - message = #{message}."
471
+ }
472
+ @logger.warn(progname = 'Comufy.unregister_tag') {
473
+ "An error occurred when sending #{data}. Comufy returned #{message}. Please get in touch with Comufy if you cannot resolve the problem."
474
+ }
475
+ end
476
+ else
477
+ @logger.debug(progname = 'Comufy.unregister_tag') {
478
+ "Authentication failed - data = #{data}."
479
+ }
480
+ @logger.warn(progname = 'Comufy.unregister_tag') {
481
+ "Authentication failed when sending #{data}. Please get in touch with Comufy if you cannot resolve the problem."
482
+ }
483
+ end
484
+ false
485
+ end
486
+
487
+ # Sends a message with the description and content to the facebook id or id's specified, allowing multiple
488
+ # options to be set concerning the privacy, and content of the message.
489
+ #
490
+ # * (String) +app_name+ - The application through the message is sent.
491
+ # * (String) +description+ - Description of the message. Useful to aggregate data in the Comufy dashboard. e.g. "Welcome".
492
+ # * (String) +content+ - The text message content.
493
+ # * (Array) +uids+ - The Facebook IDs of the users to send the message to.
494
+ # * (Hash) +opts+ - Optional settings you can pass.
495
+ # * (Integer) +delivery_time+ - The scheduled time of delivery defaults to now. (Unix millisecond timestamps)
496
+ # * (Boolean) +shorten_urls+ - UNTRACKED if false, otherwise defaults to Comufy TRACKED
497
+ # * (String) +filter+ - filtering condition in CFL.
498
+ # * (Hash) +message_options+ - options to set for the message especially.
499
+ # * (String) +name+ - facebook message name.
500
+ # * (String) +link+ - Facebook message link.
501
+ # * (String) +caption+ - facebook message caption.
502
+ # * (String) +description+ - description of the message.
503
+ # * (String) +picture+ - URL of the image that should appear on the image section of the message.
504
+ # * (Boolean) +privacy+ - whether the message should be sent private or not.
505
+ #
506
+ # = Example
507
+ # Comufy.send_facebook_message(
508
+ # YOUR_APPLICATION_NAME, DESCRIPTION, CONTENT_GOES_HERE, %w(ID_ONE ID_TWO),
509
+ # message_options: {
510
+ # private: true, link: 'www.example.com', name: 'test', description: 'description'
511
+ # }
512
+ # )
513
+ def send_facebook_message app_name, description, content, uids, opts = {}
514
+ return false unless get_access_token
515
+ if app_name.nil? or app_name.empty? or not content.is_a?(String)
516
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
517
+ 'First parameter must be set to your application name, as a String.'
518
+ }
519
+ return false
520
+ end
521
+ if description.nil? or description.empty? or not content.is_a?(String)
522
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
523
+ 'Second parameter must be set to your facebook description, as a String.'
524
+ }
525
+ return false
526
+ end
527
+ if content.nil? or content.empty? or not content.is_a?(String)
528
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
529
+ 'Third parameter must be sent to your facebook content, as a String.'
530
+ }
531
+ return false
532
+ end
533
+ if uids.nil? or uids.empty? or not uids.is_a?(Array)
534
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
535
+ 'Fourth parameter must be sent to your facebook uids, as an Array of Strings.'
536
+ }
537
+ return false
538
+ end
539
+
540
+ # symbolize the keys!
541
+ opts = Comufy.symbolize_keys(opts)
542
+
543
+ # optional checks
544
+ if opts.has_key?(:filter) and not opts[:filter].is_a?(String)
545
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
546
+ 'When including "filter", it must be a String.'
547
+ }
548
+ return false
549
+ end
550
+ if opts.has_key?(:delivery_time) and not opts[:delivery_time].is_a?(Integer)
551
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
552
+ 'When including "delivery_time", it must be an Integer, of unix time in milliseconds.'
553
+ }
554
+ return false
555
+ end
556
+ if opts.has_key?(:shorten_urls) and not %w[ true, false ].include?(opts[:shorten_urls])
557
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
558
+ 'When including "shorten_urls", it must be an boolean value.'
559
+ }
560
+ return false
561
+ end
562
+ if opts.has_key?(:message_options) and not opts[:message_options].is_a?(Hash)
563
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
564
+ 'When including "message_options", it must be a Hash.'
565
+ }
566
+ return false
567
+ end
568
+
569
+ facebook_ids = "FACEBOOK_ID=\"#{uids.join('\" OR FACEBOOK_ID=\"')}\""
570
+
571
+ filter = opts[:filter] || String.new()
572
+ delivery_time = opts[:delivery_time]
573
+ shorten_urls = opts.has_key?(:shorten_urls) ? opts[:shorten_urls] : true
574
+ options = opts[:message_options]
575
+
576
+ data = {
577
+ cd: 83,
578
+ applicationName: app_name,
579
+ description: description,
580
+ content: content,
581
+ filter: "#{facebook_ids} #{filter}"
582
+ }
583
+
584
+ data[:deliveryTime] = delivery_time if delivery_time
585
+ data[:trackingMode] = "UNTRACKED" unless shorten_urls
586
+ data[:facebookTargetingMode] = "NOTIFICATION"
587
+
588
+ if options
589
+ data[:fbMessagePrivacyMode] = options[:private] ? "PRIVATE" : "PUBLIC" if options.has_key?(:private)
590
+ data[:fbMessageCaption] = options[:caption] if options.has_key?(:caption)
591
+ data[:fbMessageLink] = options[:link] if options.has_key?(:link)
592
+ data[:fbMessageName] = options[:name] if options.has_key?(:name)
593
+ data[:fbMessageDescription] = options[:description] if options.has_key?(:description)
594
+ data[:fbMessagePictureUrl] = options[:picture] if options.has_key?(:picture)
595
+ end
596
+
597
+ message = call_api(data)
598
+ if message
599
+ case message['cd']
600
+ when 383 then
601
+ @logger.debug(progname = 'Comufy.send_facebook_message') {
602
+ "383 - Success! - data = #{data} - message = #{message}."
603
+ }
604
+ return true
605
+ when 416 then
606
+ @logger.debug(progname = 'Comufy.send_facebook_message') {
607
+ "416 - _ERROR_MSG_SEND_FAILED - data = #{data} - message = #{message}."
608
+ }
609
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
610
+ '416 - _ERROR_MSG_SEND_FAILED'
611
+ }
612
+ when 475 then
613
+ @logger.debug(progname = 'Comufy.send_facebook_message') {
614
+ "475 - Invalid parameters provided - data = #{data} - message = #{message}."
615
+ }
616
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
617
+ '475 - Invalid parameters provided'
618
+ }
619
+ when 551 then
620
+ @logger.debug(progname = 'Comufy.send_facebook_message') {
621
+ "551 _ERROR_TAG_VALUE_NOT_FOUND - data = #{data} - message = #{message}."
622
+ }
623
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
624
+ '551 - _ERROR_TAG_VALUE_NOT_FOUND'
625
+ }
626
+ when 603 then
627
+ @logger.debug(progname = 'Comufy.send_facebook_message') {
628
+ "603 - _ERROR_DOMAIN_APPLICATION_NAME_NOT_FOUND - data = #{data} - message = #{message}."
629
+ }
630
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
631
+ '603 - _ERROR_DOMAIN_APPLICATION_NAME_NOT_FOUND'
632
+ }
633
+ when 607 then
634
+ @logger.debug(progname = 'Comufy.send_facebook_message') {
635
+ "607 - _ERROR_UNAUTHORISED_ACTION - data = #{data} - message = #{message}."
636
+ }
637
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
638
+ '607 - _ERROR_UNAUTHORISED_ACTION'
639
+ }
640
+ when 617 then
641
+ @logger.debug(progname = 'Comufy.send_facebook_message') {
642
+ "617 - _ERROR_DOMAIN_APPLICATION_TAG_NOT_FOUND - data = #{data} - message = #{message}."
643
+ }
644
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
645
+ '617 - _ERROR_DOMAIN_APPLICATION_TAG_NOT_FOUND'
646
+ }
647
+ when 648 then
648
+ @logger.debug(progname = 'Comufy.send_facebook_message') {
649
+ "648 - _ERROR_FACEBOOK_APPLICATION_USER_NOT_FOUND - data = #{data} - message = #{message}."
650
+ }
651
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
652
+ '648 - _ERROR_FACEBOOK_APPLICATION_USER_NOT_FOUND'
653
+ }
654
+ when 673 then
655
+ @logger.debug(progname = 'Comufy.send_facebook_message') {
656
+ "673 - Invalid time exception - data = #{data} - message = #{message}."
657
+ }
658
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
659
+ '673 - Invalid time exception'
660
+ }
661
+ when 679 then
662
+ @logger.debug(progname = 'Comufy.send_facebook_message') {
663
+ "679 - _ERROR_MALFORMED_TARGETING_EXPRESSION - data = #{data} - message = #{message}."
664
+ }
665
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
666
+ '679 - _ERROR_MALFORMED_TARGETING_EXPRESSION'
667
+ }
668
+ else
669
+ @logger.debug(progname = 'Comufy.send_facebook_message') {
670
+ "UNKNOWN RESPONSE - data = #{data} - message = #{message}."
671
+ }
672
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
673
+ "An error occurred when sending #{data}. Comufy returned #{message}. Please get in touch with Comufy if you cannot resolve the problem."
674
+ }
675
+ end
676
+ else
677
+ @logger.debug(progname = 'Comufy.send_facebook_message') {
678
+ "Authentication failed - data = #{data}."
679
+ }
680
+ @logger.warn(progname = 'Comufy.send_facebook_message') {
681
+ "Authentication failed when sending #{data}. Please get in touch with Comufy if you cannot resolve the problem."
682
+ }
683
+ end
684
+ false
685
+ end
686
+
687
+ private
688
+
689
+ # Use the configured user name and password to get and set the access token and expiry time, if it fails,
690
+ # it means the user likely has their user name/password wrong.
691
+ def authenticate
692
+ data = {
693
+ cd: 131,
694
+ user: @config.user,
695
+ password: @config.password
696
+ }
697
+
698
+ message = call_api(data, false)
699
+ case message['cd']
700
+ when 235 then
701
+ @logger.debug(progname = 'Comufy.authenticate') {
702
+ "235 - Success! - data = #{data} - message = #{message}."
703
+ }
704
+ @config.access_token = message['tokenInfo']['token']
705
+ @config.expiry_time = message['tokenInfo']['expiryTime']
706
+ return true
707
+ when 475 then
708
+ @logger.debug(progname = 'Comufy.authenticate') {
709
+ "475 - Invalid parameters provided. - data = #{data} - message = #{message}."
710
+ }
711
+ @logger.warn(progname = 'Comufy.authenticate') {
712
+ '475 - Invalid parameters provided.'
713
+ }
714
+ when 504 then
715
+ @logger.debug(progname = 'Comufy.authenticate') {
716
+ "504 - FIX. - data = #{data} - message = #{message}."
717
+ }
718
+ @logger.warn(progname = 'Comufy.authenticate') {
719
+ '504 - FIX.'
720
+ }
721
+ when 651 then
722
+ @logger.debug(progname = 'Comufy.authenticate') {
723
+ "651 - Invalid user name exception. Check that you are login in using the format user@domain. - data = #{data} - message = #{message}."
724
+ }
725
+ @logger.warn(progname = 'Comufy.authenticate') {
726
+ '651 - Invalid user name exception. Check that you are login in using the format user@domain.'
727
+ }
728
+ when 652 then
729
+ @logger.debug(progname = 'Comufy.authenticate') {
730
+ "652 - Invalid password exception. - data = #{data} - message = #{message}."
731
+ }
732
+ @logger.warn(progname = 'Comufy.authenticate') {
733
+ '652 - Invalid password exception.'
734
+ }
735
+ when 682 then
736
+ @logger.debug(progname = 'Comufy.authenticate') {
737
+ "682 - This user is blocked. - data = #{data} - message = #{message}."
738
+ }
739
+ @logger.warn(progname = 'Comufy.authenticate') {
740
+ '682 - This user is blocked.'
741
+ }
742
+ else
743
+ @logger.debug(progname = 'Comufy.authenticate') {
744
+ "UNKNOWN RESPONSE - data = #{data} - message = #{message}."
745
+ }
746
+ @logger.warn(progname = 'Comufy.authenticate') {
747
+ "An error occurred when sending #{data}. Comufy returned #{message}. Please get in touch with Comufy if you cannot resolve the problem."
748
+ }
749
+ end
750
+ # an issue occurred, reset the access token and expiry time.
751
+ @config.access_token = nil
752
+ @config.expiry_time = nil
753
+ false
754
+ end
755
+
756
+ # Calls the Comufy backed with the provided set of parameters, which the system will expect
757
+ #
758
+ # * (Array) +params+ - Data to be passed to the server.
759
+ # * (Boolean) +add_access_token+ - (Optional) Whether or not the access token should be provided.
760
+ def call_api data, add_access_token=true
761
+ if add_access_token
762
+ return nil if not get_access_token
763
+ data[:token] = @config.access_token
764
+ end
765
+
766
+ uri = URI.parse(@config::base_api_url)
767
+ http = Net::HTTP.new(uri.host, uri.port)
768
+ #http.use_ssl = true # Only used when directly accessing Comufy!
769
+ request = Net::HTTP::Post.new(uri.path, initheader = { 'Content-Type' => 'application/json' })
770
+ request.set_form_data({ request: data.to_json })
771
+ response = http.request(request)
772
+ JSON.parse(response.read_body) if response.message == 'OK'
773
+ end
774
+
775
+ # Checks that the token is not expired, and if expired, force an authentication.
776
+ def get_access_token
777
+ has_token_expired ? authenticate : true
778
+ end
779
+
780
+ # If the expiry time is set, and hasn't been reached, return false, otherwise
781
+ # reset the access_token and expiry time,
782
+ def has_token_expired
783
+ return false if @config.expiry_time != nil and Time.at(@config.expiry_time) > Time.now
784
+ @config.expiry_time = nil
785
+ @config.access_token = nil
786
+ true
787
+ end
23
788
  end