comufy 0.0.2.pre2 → 0.0.3pre1

Sign up to get free protection for your applications and to get access to all the features.
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