facebooker 1.0.63 → 1.0.64

Sign up to get free protection for your applications and to get access to all the features.
@@ -63,6 +63,7 @@ lib/facebooker/models/album.rb
63
63
  lib/facebooker/models/applicationproperties.rb
64
64
  lib/facebooker/models/applicationrestrictions.rb
65
65
  lib/facebooker/models/cookie.rb
66
+ lib/facebooker/models/comment.rb
66
67
  lib/facebooker/models/education_info.rb
67
68
  lib/facebooker/models/event.rb
68
69
  lib/facebooker/models/family_relative_info.rb
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{facebooker}
5
- s.version = "1.0.62"
5
+ s.version = "1.0.64"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Chad Fowler", "Patrick Ewing", "Mike Mangino", "Shane Vitarana", "Corey Innis", "Mike Mangino"]
9
- s.date = %q{2010-02-05}
9
+ s.date = %q{2010-02-26}
10
10
  s.description = %q{Facebooker is a Ruby wrapper over the Facebook[http://facebook.com] {REST API}[http://wiki.developers.facebook.com/index.php/API]. Its goals are:
11
11
 
12
12
  * Idiomatic Ruby
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
  * Well tested}
16
16
  s.email = ["chad@chadfowlwer.com", "", "", "", "", "mmangino@elevatedrails.com"]
17
17
  s.extra_rdoc_files = ["Manifest.txt", "CHANGELOG.rdoc", "COPYING.rdoc", "README.rdoc", "TODO.rdoc"]
18
- s.files = [".autotest", "CHANGELOG.rdoc", "COPYING.rdoc", "Manifest.txt", "README.rdoc", "Rakefile", "TODO.rdoc", "examples/desktop_login.rb", "facebooker.gemspec", "generators/facebook/facebook_generator.rb", "generators/facebook/templates/config/facebooker.yml", "generators/facebook/templates/public/javascripts/facebooker.js", "generators/facebook_controller/USAGE", "generators/facebook_controller/facebook_controller_generator.rb", "generators/facebook_controller/templates/controller.rb", "generators/facebook_controller/templates/functional_test.rb", "generators/facebook_controller/templates/helper.rb", "generators/facebook_controller/templates/view.fbml.erb", "generators/facebook_controller/templates/view.html.erb", "generators/facebook_publisher/facebook_publisher_generator.rb", "generators/facebook_publisher/templates/create_facebook_templates.rb", "generators/facebook_publisher/templates/publisher.rb", "generators/facebook_scaffold/USAGE", "generators/facebook_scaffold/facebook_scaffold_generator.rb", "generators/facebook_scaffold/templates/controller.rb", "generators/facebook_scaffold/templates/facebook_style.css", "generators/facebook_scaffold/templates/functional_test.rb", "generators/facebook_scaffold/templates/helper.rb", "generators/facebook_scaffold/templates/layout.fbml.erb", "generators/facebook_scaffold/templates/layout.html.erb", "generators/facebook_scaffold/templates/style.css", "generators/facebook_scaffold/templates/view_edit.fbml.erb", "generators/facebook_scaffold/templates/view_edit.html.erb", "generators/facebook_scaffold/templates/view_index.fbml.erb", "generators/facebook_scaffold/templates/view_index.html.erb", "generators/facebook_scaffold/templates/view_new.fbml.erb", "generators/facebook_scaffold/templates/view_new.html.erb", "generators/facebook_scaffold/templates/view_show.fbml.erb", "generators/facebook_scaffold/templates/view_show.html.erb", "generators/publisher/publisher_generator.rb", "generators/xd_receiver/templates/xd_receiver_ssl.html", "generators/xd_receiver/templates/xd_receiver.html", "generators/xd_receiver/xd_receiver_generator.rb", "init.rb", "install.rb", "lib/facebooker.rb", "lib/facebooker/adapters/adapter_base.rb", "lib/facebooker/adapters/bebo_adapter.rb", "lib/facebooker/adapters/facebook_adapter.rb", "lib/facebooker/attachment.rb", "lib/facebooker/admin.rb", "lib/facebooker/application.rb", "lib/facebooker/batch_request.rb", "lib/facebooker/data.rb", "lib/facebooker/feed.rb", "lib/facebooker/logging.rb", "lib/facebooker/mobile.rb", "lib/facebooker/mock/service.rb", "lib/facebooker/mock/session.rb", "lib/facebooker/model.rb", "lib/facebooker/models/affiliation.rb", "lib/facebooker/models/album.rb", "lib/facebooker/models/applicationproperties.rb", "lib/facebooker/models/applicationrestrictions.rb", "lib/facebooker/models/cookie.rb", "lib/facebooker/models/education_info.rb", "lib/facebooker/models/event.rb", "lib/facebooker/models/family_relative_info.rb", "lib/facebooker/models/friend_list.rb", "lib/facebooker/models/group.rb", "lib/facebooker/models/info_item.rb", "lib/facebooker/models/info_section.rb", "lib/facebooker/models/location.rb", "lib/facebooker/models/notifications.rb", "lib/facebooker/models/page.rb", "lib/facebooker/models/photo.rb", "lib/facebooker/models/tag.rb", "lib/facebooker/models/user.rb", "lib/facebooker/models/video.rb", "lib/facebooker/models/work_info.rb", "lib/facebooker/models/message_thread.rb", "lib/facebooker/parser.rb", "lib/facebooker/rails/backwards_compatible_param_checks.rb", "lib/facebooker/rails/controller.rb", "lib/facebooker/rails/cucumber.rb", "lib/facebooker/rails/cucumber/world.rb", "lib/facebooker/rails/extensions/action_controller.rb", "lib/facebooker/rails/extensions/rack_setup.rb", "lib/facebooker/rails/extensions/routing.rb", "lib/facebooker/rails/facebook_form_builder.rb", "lib/facebooker/rails/facebook_pretty_errors.rb", "lib/facebooker/rails/facebook_request_fix.rb", "lib/facebooker/rails/facebook_request_fix_2-3.rb", "lib/facebooker/rails/facebook_session_handling.rb", "lib/facebooker/rails/facebook_url_helper.rb", "lib/facebooker/rails/facebook_url_rewriting.rb", "lib/facebooker/rails/helpers.rb", "lib/facebooker/rails/helpers/fb_connect.rb", "lib/facebooker/rails/helpers/stream_publish.rb", "lib/facebooker/rails/integration_session.rb", "lib/facebooker/rails/profile_publisher_extensions.rb", "lib/facebooker/rails/publisher.rb", "lib/facebooker/rails/routing.rb", "lib/facebooker/rails/test_helpers.rb", "lib/facebooker/rails/utilities.rb", "lib/facebooker/server_cache.rb", "lib/facebooker/service.rb", "lib/facebooker/service/base_service.rb", "lib/facebooker/service/curl_service.rb", "lib/facebooker/service/net_http_service.rb", "lib/facebooker/service/typhoeus_service.rb", "lib/facebooker/service/typhoeus_multi_service.rb", "lib/facebooker/session.rb", "lib/facebooker/stream_post.rb", "lib/facebooker/version.rb", "lib/net/http_multipart_post.rb", "lib/rack/facebook.rb", "lib/rack/facebook_session.rb", "lib/tasks/facebooker.rake", "lib/tasks/facebooker.rb", "lib/tasks/tunnel.rake", "rails/init.rb", "setup.rb", "templates/layout.erb", "test/facebooker/adapters_test.rb", "test/facebooker/admin_test.rb", "test/facebooker/application_test.rb", "test/facebooker/attachment_test.rb", "test/facebooker/batch_request_test.rb", "test/facebooker/data_test.rb", "test/facebooker/logging_test.rb", "test/facebooker/mobile_test.rb", "test/facebooker/model_test.rb", "test/facebooker/models/event_test.rb", "test/facebooker/models/page_test.rb", "test/facebooker/models/photo_test.rb", "test/facebooker/models/user_test.rb", "test/facebooker/rails/publisher_test.rb", "test/facebooker/rails_integration_test.rb", "test/facebooker/rails/facebook_request_fix_2-3_test.rb", "test/facebooker/server_cache_test.rb", "test/facebooker/session_test.rb", "test/facebooker_test.rb", "test/fixtures/multipart_post_body_with_only_parameters.txt", "test/fixtures/multipart_post_body_with_single_file.txt", "test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt", "test/net/http_multipart_post_test.rb", "test/rack/facebook_test.rb", "test/rack/facebook_session_test.rb", "test/rails_test_helper.rb", "test/test_helper.rb", "test/facebooker/rails/facebook_url_rewriting_test.rb", "test/facebooker/rails/integration_session_test.rb", "test/facebooker/service_test.rb"]
18
+ s.files = [".autotest", "CHANGELOG.rdoc", "COPYING.rdoc", "Manifest.txt", "README.rdoc", "Rakefile", "TODO.rdoc", "examples/desktop_login.rb", "facebooker.gemspec", "generators/facebook/facebook_generator.rb", "generators/facebook/templates/config/facebooker.yml", "generators/facebook/templates/public/javascripts/facebooker.js", "generators/facebook_controller/USAGE", "generators/facebook_controller/facebook_controller_generator.rb", "generators/facebook_controller/templates/controller.rb", "generators/facebook_controller/templates/functional_test.rb", "generators/facebook_controller/templates/helper.rb", "generators/facebook_controller/templates/view.fbml.erb", "generators/facebook_controller/templates/view.html.erb", "generators/facebook_publisher/facebook_publisher_generator.rb", "generators/facebook_publisher/templates/create_facebook_templates.rb", "generators/facebook_publisher/templates/publisher.rb", "generators/facebook_scaffold/USAGE", "generators/facebook_scaffold/facebook_scaffold_generator.rb", "generators/facebook_scaffold/templates/controller.rb", "generators/facebook_scaffold/templates/facebook_style.css", "generators/facebook_scaffold/templates/functional_test.rb", "generators/facebook_scaffold/templates/helper.rb", "generators/facebook_scaffold/templates/layout.fbml.erb", "generators/facebook_scaffold/templates/layout.html.erb", "generators/facebook_scaffold/templates/style.css", "generators/facebook_scaffold/templates/view_edit.fbml.erb", "generators/facebook_scaffold/templates/view_edit.html.erb", "generators/facebook_scaffold/templates/view_index.fbml.erb", "generators/facebook_scaffold/templates/view_index.html.erb", "generators/facebook_scaffold/templates/view_new.fbml.erb", "generators/facebook_scaffold/templates/view_new.html.erb", "generators/facebook_scaffold/templates/view_show.fbml.erb", "generators/facebook_scaffold/templates/view_show.html.erb", "generators/publisher/publisher_generator.rb", "generators/xd_receiver/templates/xd_receiver_ssl.html", "generators/xd_receiver/templates/xd_receiver.html", "generators/xd_receiver/xd_receiver_generator.rb", "init.rb", "install.rb", "lib/facebooker.rb", "lib/facebooker/adapters/adapter_base.rb", "lib/facebooker/adapters/bebo_adapter.rb", "lib/facebooker/adapters/facebook_adapter.rb", "lib/facebooker/attachment.rb", "lib/facebooker/admin.rb", "lib/facebooker/application.rb", "lib/facebooker/batch_request.rb", "lib/facebooker/data.rb", "lib/facebooker/feed.rb", "lib/facebooker/logging.rb", "lib/facebooker/mobile.rb", "lib/facebooker/mock/service.rb", "lib/facebooker/mock/session.rb", "lib/facebooker/model.rb", "lib/facebooker/models/affiliation.rb", "lib/facebooker/models/album.rb", "lib/facebooker/models/applicationproperties.rb", "lib/facebooker/models/applicationrestrictions.rb", "lib/facebooker/models/cookie.rb", "lib/facebooker/models/comment.rb", "lib/facebooker/models/education_info.rb", "lib/facebooker/models/event.rb", "lib/facebooker/models/family_relative_info.rb", "lib/facebooker/models/friend_list.rb", "lib/facebooker/models/group.rb", "lib/facebooker/models/info_item.rb", "lib/facebooker/models/info_section.rb", "lib/facebooker/models/location.rb", "lib/facebooker/models/notifications.rb", "lib/facebooker/models/page.rb", "lib/facebooker/models/photo.rb", "lib/facebooker/models/tag.rb", "lib/facebooker/models/user.rb", "lib/facebooker/models/video.rb", "lib/facebooker/models/work_info.rb", "lib/facebooker/models/message_thread.rb", "lib/facebooker/parser.rb", "lib/facebooker/rails/backwards_compatible_param_checks.rb", "lib/facebooker/rails/controller.rb", "lib/facebooker/rails/cucumber.rb", "lib/facebooker/rails/cucumber/world.rb", "lib/facebooker/rails/extensions/action_controller.rb", "lib/facebooker/rails/extensions/rack_setup.rb", "lib/facebooker/rails/extensions/routing.rb", "lib/facebooker/rails/facebook_form_builder.rb", "lib/facebooker/rails/facebook_pretty_errors.rb", "lib/facebooker/rails/facebook_request_fix.rb", "lib/facebooker/rails/facebook_request_fix_2-3.rb", "lib/facebooker/rails/facebook_session_handling.rb", "lib/facebooker/rails/facebook_url_helper.rb", "lib/facebooker/rails/facebook_url_rewriting.rb", "lib/facebooker/rails/helpers.rb", "lib/facebooker/rails/helpers/fb_connect.rb", "lib/facebooker/rails/helpers/stream_publish.rb", "lib/facebooker/rails/integration_session.rb", "lib/facebooker/rails/profile_publisher_extensions.rb", "lib/facebooker/rails/publisher.rb", "lib/facebooker/rails/routing.rb", "lib/facebooker/rails/test_helpers.rb", "lib/facebooker/rails/utilities.rb", "lib/facebooker/server_cache.rb", "lib/facebooker/service.rb", "lib/facebooker/service/base_service.rb", "lib/facebooker/service/curl_service.rb", "lib/facebooker/service/net_http_service.rb", "lib/facebooker/service/typhoeus_service.rb", "lib/facebooker/service/typhoeus_multi_service.rb", "lib/facebooker/session.rb", "lib/facebooker/stream_post.rb", "lib/facebooker/version.rb", "lib/net/http_multipart_post.rb", "lib/rack/facebook.rb", "lib/rack/facebook_session.rb", "lib/tasks/facebooker.rake", "lib/tasks/facebooker.rb", "lib/tasks/tunnel.rake", "rails/init.rb", "setup.rb", "templates/layout.erb", "test/facebooker/adapters_test.rb", "test/facebooker/admin_test.rb", "test/facebooker/application_test.rb", "test/facebooker/attachment_test.rb", "test/facebooker/batch_request_test.rb", "test/facebooker/data_test.rb", "test/facebooker/logging_test.rb", "test/facebooker/mobile_test.rb", "test/facebooker/model_test.rb", "test/facebooker/models/event_test.rb", "test/facebooker/models/page_test.rb", "test/facebooker/models/photo_test.rb", "test/facebooker/models/user_test.rb", "test/facebooker/rails/publisher_test.rb", "test/facebooker/rails_integration_test.rb", "test/facebooker/rails/facebook_request_fix_2-3_test.rb", "test/facebooker/server_cache_test.rb", "test/facebooker/session_test.rb", "test/facebooker_test.rb", "test/fixtures/multipart_post_body_with_only_parameters.txt", "test/fixtures/multipart_post_body_with_single_file.txt", "test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt", "test/net/http_multipart_post_test.rb", "test/rack/facebook_test.rb", "test/rack/facebook_session_test.rb", "test/rails_test_helper.rb", "test/test_helper.rb", "test/facebooker/rails/facebook_url_rewriting_test.rb", "test/facebooker/rails/integration_session_test.rb", "test/facebooker/service_test.rb"]
19
19
  s.homepage = %q{http://facebooker.rubyforge.org}
20
20
  s.rdoc_options = ["--main", "README.rdoc"]
21
21
  s.require_paths = ["lib"]
@@ -238,6 +238,7 @@ require 'facebooker/version'
238
238
  require 'facebooker/models/location'
239
239
  require 'facebooker/models/affiliation'
240
240
  require 'facebooker/models/album'
241
+ require 'facebooker/models/comment'
241
242
  require 'facebooker/models/education_info'
242
243
  require 'facebooker/models/work_info'
243
244
  require 'facebooker/models/event'
@@ -9,5 +9,29 @@ module Facebooker
9
9
  def get_public_info(properties)
10
10
  (@session.post 'facebook.application.getPublicInfo', properties)
11
11
  end
12
+
13
+ # facebook_session.application.add_global_news [{ :message => 'Hi all users', :action_link => { :text => "Hi application", :href => 'http://facebook.er/' }}], 'http://facebook.er/icon.png'
14
+ def add_global_news(news, image=nil)
15
+ params = {}
16
+ params[:news] = news
17
+ params[:image] = image if image
18
+ @session.post('facebook.dashboard.addGlobalNews', params)
19
+ end
20
+
21
+ # currently bugged on Facebook; returns all
22
+ # facebook_session.application.get_global_news '310354202543'
23
+ def get_global_news(*news_ids)
24
+ params = {}
25
+ params[:news_ids] = news_ids.flatten if news_ids
26
+ @session.post('facebook.dashboard.getGlobalNews', params)
27
+ end
28
+
29
+ # facebook_session.application.clear_global_news '310354202543'
30
+ def clear_global_news(*news_ids)
31
+ params = {}
32
+ params[:news_ids] = news_ids.flatten if news_ids
33
+ @session.post('facebook.dashboard.clearGlobalNews', params)
34
+ end
35
+
12
36
  end
13
37
  end
@@ -0,0 +1,9 @@
1
+ require 'facebooker/model'
2
+ module Facebooker
3
+ ##
4
+ # A simple representation of a comment
5
+ class Comment
6
+ include Model
7
+ attr_accessor :xid, :fromid, :time, :text, :id
8
+ end
9
+ end
@@ -185,6 +185,18 @@ module Facebooker
185
185
  @session.post('facebook.stream.addComment', {:post_id=>post_id, :comment=>comment})
186
186
  end
187
187
 
188
+
189
+ ###
190
+ # Publish a comment to a specific comment set by xid
191
+ #
192
+ # See: http://wiki.developers.facebook.com/index.php/Comments.add
193
+ #
194
+ # +xid+ the xid for the set of comments
195
+ # +text+ the text of the comment
196
+ def add_comment(xid, text,title=nil,url=nil,publish_to_stream=false)
197
+ @session.post('facebook.comments.add',{:xid=>xid,:text=>text,:title=>title,:url=>url,:publish_to_stream=>publish_to_stream})
198
+ end
199
+
188
200
  ###
189
201
  # Add a like on a post
190
202
  #
@@ -442,6 +454,12 @@ module Facebooker
442
454
  session.post('facebook.users.hasAppPermission', {:ext_perm=>ext_perm, :uid => uid}, false) == "1"
443
455
  end
444
456
 
457
+ ##
458
+ # Returns whether the user (either the session user or user specified by uid) has authorized the calling application
459
+ def app_user?
460
+ session.post('facebook.users.isAppUser', {:uid => self.id}, use_session_key = true)
461
+ end
462
+
445
463
  ##
446
464
  # Convenience method to check multiple permissions at once
447
465
  def has_permissions?(ext_perms)
@@ -475,7 +493,129 @@ module Facebooker
475
493
  def to_s
476
494
  id.to_s
477
495
  end
496
+
497
+
498
+ ### NEW DASHBOARD API STUFF
499
+
500
+ # facebook_session.user.dashboard_count
501
+ def dashboard_count
502
+ session.post('facebook.dashboard.getCount', :uid => uid)
503
+ end
504
+
505
+ # facebook_session.user.dashboard_count = 5
506
+ def dashboard_count=(new_count)
507
+ session.post('facebook.dashboard.setCount', :uid => uid, :count => new_count)
508
+ end
509
+
510
+ # facebook_session.user.dashboard_increment_count
511
+ def dashboard_increment_count
512
+ session.post('facebook.dashboard.incrementCount', :uid => uid)
513
+ end
514
+
515
+ # facebook_session.user.dashboard_decrement_count
516
+ def dashboard_decrement_count
517
+ session.post('facebook.dashboard.decrementCount', :uid => uid)
518
+ end
519
+
520
+ # The following methods are not bound to a specific user but do relate to Users in general,
521
+ # so I've made them into class methods.
522
+
523
+ # Facebooker::User.dashboard_multi_get_count ['1234', '5678']
524
+ def self.dashboard_multi_get_count(*uids)
525
+ Facebooker::Session.create.post("facebook.dashboard.multiGetCount", :uids => uids.flatten)
526
+ end
527
+
528
+ # Facebooker::User.dashboard_multi_set_count({ '1234' => '11', '5678' => '22' })
529
+ def self.dashboard_multi_set_count(ids)
530
+ Facebooker::Session.create.post("facebook.dashboard.multiSetCount", :ids => ids.to_json)
531
+ end
532
+
533
+ # Facebooker::User.dashboard_multi_increment_count ['1234', '5678']
534
+ def self.dashboard_multi_increment_count(*uids)
535
+ Facebooker::Session.create.post("facebook.dashboard.multiIncrementCount", :uids => uids.flatten.to_json)
536
+ end
537
+
538
+ # Facebooker::User.dashboard_multi_decrement_count ['1234', '5678']
539
+ def self.dashboard_multi_decrement_count(*uids)
540
+ Facebooker::Session.create.post("facebook.dashboard.multiDecrementCount", :uids => uids.flatten.to_json)
541
+ end
542
+
543
+ def self.dashboard_multi_set_count(ids)
544
+ Facebooker::Session.create.post("facebook.dashboard.multiSetCount", :ids => ids.to_json)
545
+ end
546
+
547
+ def self.dashboard_multi_increment_count(uids)
548
+ Facebooker::Session.create.post("facebook.dashboard.multiIncrementCount", :uids => uids.to_json)
549
+ end
550
+
551
+ def self.dashboard_multi_decrement_count(uids)
552
+ Facebooker::Session.create.post("facebook.dashboard.multiDecrementCount", :uids => uids.to_json)
553
+ end
554
+
555
+
556
+
557
+
558
+ def get_news(*news_ids)
559
+ params = { :uid => uid }
560
+ params[:news_ids] = news_ids.flatten if news_ids
561
+
562
+ session.post('facebook.dashboard.getNews', params)
563
+ end
564
+
565
+ # facebook_session.user.add_news [{ :message => 'Hey, who are you?', :action_link => { :text => "I-I'm a test user", :href => 'http://facebook.er/' }}], 'http://facebook.er/icon.png'
566
+ def add_news(news, image=nil)
567
+ params = { :uid => uid }
568
+ params[:news] = news
569
+ params[:image] = image if image
570
+
571
+ session.post('facebook.dashboard.addNews', params)
572
+ end
573
+
574
+ # facebook_session.user.clear_news ['111111']
575
+ def clear_news(*news_ids)
576
+ params = { :uid => uid }
577
+ params[:news_ids] = news_ids.flatten if news_ids
578
+
579
+ session.post('facebook.dashboard.clearNews', params)
580
+ end
581
+
582
+ # Facebooker::User.multi_add_news(['1234', '4321'], [{ :message => 'Hi users', :action_link => { :text => "Uh hey there app", :href => 'http://facebook.er/' }}], 'http://facebook.er/icon.png')
583
+ def self.multi_add_news(uids, news, image=nil)
584
+ params = { :uids => uids, :news => news }
585
+ params[:image] = image if image
478
586
 
587
+ Facebooker::Session.create.post("facebook.dashboard.multiAddNews", params)
588
+ end
589
+
590
+ # Facebooker::User.multi_clear_news({"1234"=>["319103117527"], "4321"=>["313954287803"]})
591
+ def self.multi_clear_news(ids)
592
+ Facebooker::Session.create.post("facebook.dashboard.multiClearNews", :ids => ids.to_json)
593
+ end
594
+
595
+ # Facebooker::User.multi_get_news({"1234"=>["319103117527"], "4321"=>["313954287803"]})
596
+ def self.multi_get_news(ids)
597
+ Facebooker::Session.create.post('facebook.dashboard.multiGetNews', :ids => ids.to_json)
598
+ end
599
+
600
+ # facebook_session.user.get_activity '123'
601
+ def get_activity(*activity_ids)
602
+ params = {}
603
+ params[:activity_ids] = activity_ids.flatten if activity_ids
604
+
605
+ session.post('facebook.dashboard.getActivity', params)
606
+ end
607
+
608
+ # facebook_session.user.publish_activity({ :message => '{*actor*} rolled around', :action_link => { :text => 'Roll around too', :href => 'http://facebook.er/' }})
609
+ def publish_activity(activity)
610
+ session.post('facebook.dashboard.publishActivity', { :activity => activity.to_json })
611
+ end
612
+
613
+ # facebook_session.user.remove_activity ['123']
614
+ def remove_activity(*activity_ids)
615
+ session.post('facebook.dashboard.removeActivity', { :activity_ids => activity_ids.flatten })
616
+ end
617
+
618
+
479
619
  ##
480
620
  # Two Facebooker::User objects should be considered equal if their Facebook ids are equal
481
621
  def ==(other_user)
@@ -79,7 +79,7 @@ module Facebooker
79
79
  end
80
80
  raise "Element #{name} not found in #{data}"
81
81
  end
82
-
82
+
83
83
  def self.hash_or_value_for(element)
84
84
  if element.children.size == 1 && element.children.first.text?
85
85
  element.content.strip
@@ -108,6 +108,43 @@ module Facebooker
108
108
  hash
109
109
  end #do |hash, child|
110
110
  end
111
+
112
+ def self.hash_by_key_or_value_for(element)
113
+ if element.children.size == 0
114
+ { element['key'] => nil }
115
+ elsif element.children.size == 1 && element.children.first.text?
116
+ { element['key'] => element.content.strip }
117
+ else
118
+ hashinate_by_key(element)
119
+ end
120
+ end
121
+
122
+ # A modification to hashinate. The new dashboard API returns XML in a different format than
123
+ # the other calls. What used to be the element name has become an attribute called "key".
124
+ def self.hashinate_by_key(response_element)
125
+ response_element.children.reject{|c| c.text? }.inject({}) do |hash, child|
126
+ # If the node hasn't any child, and is not a list, we want empty strings, not empty hashes,
127
+ # except if attributes['nil'] == true
128
+ hash[child['key']] =
129
+ if (child['nil'] == 'true')
130
+ nil
131
+ elsif (child.children.size == 1 && child.children.first.text?) || (child.children.size == 0 && child['list'] != 'true')
132
+ anonymous_field_from(child, hash) || child.content.strip
133
+ elsif child['list'] == 'true' && child.children.all? { |subchild| subchild['key'].nil? }
134
+ child.children.reject{|c| c.text? }.map { |subchild| hash_by_key_or_value_for(subchild)}
135
+ elsif child['list'] == 'true'
136
+ hash_by_key_or_value_for(child)
137
+ else
138
+ child.children.reject{|c| c.text? }.inject({}) do |subhash, subchild|
139
+ subhash[subchild['key']] = hash_by_key_or_value_for(subchild)
140
+ subhash
141
+ end
142
+ end
143
+ hash
144
+ end
145
+ end
146
+
147
+
111
148
 
112
149
  def self.booleanize(response)
113
150
  response == "1" ? true : false
@@ -157,6 +194,12 @@ module Facebooker
157
194
  end
158
195
  end
159
196
 
197
+ class IsAppUser < Parser#:nodoc:
198
+ def self.process(data)
199
+ element('users_isAppUser_response', data).content == '1'
200
+ end
201
+ end
202
+
160
203
  class GetFriends < Parser#:nodoc:
161
204
  def self.process(data)
162
205
  array_of_text_values(element('friends_get_response', data), 'uid')
@@ -301,6 +344,24 @@ module Facebooker
301
344
  end
302
345
  end
303
346
 
347
+ class CommentsAdd < Parser#:nodoc:
348
+ def self.process(data)
349
+ element('comments_add_response', data).content.strip
350
+ end
351
+ end
352
+
353
+ class CommentsRemove < Parser#:nodoc:
354
+ def self.process(data)
355
+ booleanize(data)
356
+ end
357
+ end
358
+
359
+ class CommentsGet < Parser#:nodoc:
360
+ def self.process(data)
361
+ array_of_hashes(element('comments_get_response', data), 'comment')
362
+ end
363
+ end
364
+
304
365
  class BatchRun < Parser #:nodoc:
305
366
  class << self
306
367
  def current_batch=(current_batch)
@@ -378,6 +439,16 @@ module Facebooker
378
439
  end
379
440
  end
380
441
 
442
+ class GetStream < Parser #:nodoc:
443
+ def self.process(data)
444
+ response = {}
445
+ response[:albums] = array_of_hashes(element('stream_get_response/albums', data), 'album')
446
+ response[:posts] = array_of_hashes(element('stream_get_response/posts', data), 'stream_post')
447
+ response[:profile] = array_of_hashes(element('stream_get_response/profiles', data), 'profile')
448
+ response
449
+ end
450
+ end
451
+
381
452
  class CreateAlbum < Parser#:nodoc:
382
453
  def self.process(data)
383
454
  hashinate(element('photos_createAlbum_response', data))
@@ -548,7 +619,7 @@ module Facebooker
548
619
  end
549
620
  end
550
621
 
551
- private
622
+ private
552
623
  def self.are_friends?(raw_value)
553
624
  if raw_value == '1'
554
625
  true
@@ -602,6 +673,146 @@ module Facebooker
602
673
  end
603
674
  end
604
675
 
676
+ class DashboardGetCount < Parser
677
+ def self.process(data)
678
+ element('dashboard_getCount_response', data).content.strip
679
+ end
680
+ end
681
+
682
+ class DashboardSetCount < Parser
683
+ def self.process(data)
684
+ element('dashboard_setCount_response', data).content.strip == '1'
685
+ end
686
+ end
687
+
688
+ class DashboardIncrementCount < Parser
689
+ def self.process(data)
690
+ element('dashboard_incrementCount_response', data).content.strip == '1'
691
+ end
692
+ end
693
+
694
+ class DashboardDecrementCount < Parser
695
+ def self.process(data)
696
+ element('dashboard_decrementCount_response', data).content.strip == '1'
697
+ end
698
+ end
699
+
700
+ class DashboardMultiGetCount < Parser
701
+ def self.process(data)
702
+ hashinate_by_key(element('dashboard_multiGetCount_response', data))
703
+ end
704
+ end
705
+
706
+ class DashboardMultiSetCount < Parser
707
+ def self.process(data)
708
+ hashinate_by_key(element('dashboard_multiSetCount_response', data))
709
+ end
710
+ end
711
+
712
+ class DashboardMultiIncrementCount < Parser
713
+ def self.process(data)
714
+ hashinate_by_key(element('dashboard_multiIncrementCount_response', data))
715
+ end
716
+ end
717
+
718
+ class DashboardMultiDecrementCount < Parser
719
+ def self.process(data)
720
+ hashinate_by_key(element('dashboard_multiDecrementCount_response', data))
721
+ end
722
+ end
723
+
724
+ class DashboardMultiSetCount < Parser
725
+ def self.process(data)
726
+ hashinate_by_key(element('dashboard_multiSetCount_response', data))
727
+ end
728
+ end
729
+
730
+ class DashboardMultiIncrementCount < Parser
731
+ def self.process(data)
732
+ hashinate_by_key(element('dashboard_multiIncrementCount_response', data))
733
+ end
734
+ end
735
+
736
+ class DashboardMultiDecrementCount < Parser
737
+ def self.process(data)
738
+ hashinate_by_key(element('dashboard_multiDecrementCount_response', data))
739
+ end
740
+ end
741
+
742
+ class DashboardAddGlobalNews < Parser
743
+ def self.process(data)
744
+ element('dashboard_addGlobalNews_response', data).content.strip
745
+ end
746
+ end
747
+
748
+ # Currently, always returns all
749
+ class DashboardGetGlobalNews < Parser
750
+ def self.process(data)
751
+ hashinate_by_key(element('dashboard_getGlobalNews_response', data))
752
+ end
753
+ end
754
+
755
+ class DashboardClearGlobalNews < Parser
756
+ def self.process(data)
757
+ hashinate_by_key(element('dashboard_clearGlobalNews_response', data))
758
+ end
759
+ end
760
+
761
+ class DashboardAddNews < Parser
762
+ def self.process(data)
763
+ element('dashboard_addNews_response', data).content.strip
764
+ end
765
+ end
766
+
767
+ class DashboardGetNews < Parser
768
+ def self.process(data)
769
+ hashinate_by_key(element('dashboard_getNews_response', data))
770
+ end
771
+ end
772
+
773
+ class DashboardClearNews < Parser
774
+ def self.process(data)
775
+ hashinate_by_key(element('dashboard_clearNews_response', data))
776
+ end
777
+ end
778
+
779
+ class DashboardMultiAddNews < Parser
780
+ def self.process(data)
781
+ hashinate_by_key(element('dashboard_multiAddNews_response', data))
782
+ end
783
+ end
784
+
785
+ class DashboardMultiClearNews < Parser
786
+ def self.process(data)
787
+ hashinate_by_key(element('dashboard_multiClearNews_response', data))
788
+ end
789
+ end
790
+
791
+ class DashboardMultiGetNews < Parser
792
+ def self.process(data)
793
+ hashinate_by_key(element('dashboard_multiGetNews_response', data))
794
+ end
795
+ end
796
+
797
+ class DashboardPublishActivity < Parser
798
+ def self.process(data)
799
+ element('dashboard_publishActivity_response', data).content.strip
800
+ end
801
+ end
802
+
803
+ class DashboardRemoveActivity < Parser
804
+ def self.process(data)
805
+ hashinate_by_key(element('dashboard_removeActivity_response', data))
806
+ end
807
+ end
808
+
809
+ class DashboardGetActivity < Parser
810
+ def self.process(data)
811
+ hashinate_by_key(element('dashboard_getActivity_response', data))
812
+ end
813
+ end
814
+
815
+
605
816
  class Errors < Parser#:nodoc:
606
817
  EXCEPTIONS = {
607
818
  1 => Facebooker::Session::UnknownError,
@@ -669,6 +880,7 @@ module Facebooker
669
880
  'facebook.status.get' => GetStatus,
670
881
  'facebook.users.getLoggedInUser' => GetLoggedInUser,
671
882
  'facebook.users.hasAppPermission' => UserHasPermission,
883
+ 'facebook.users.isAppUser' => IsAppUser,
672
884
  'facebook.pages.isAdmin' => PagesIsAdmin,
673
885
  'facebook.pages.getInfo' => PagesGetInfo,
674
886
  'facebook.pages.isFan' => PagesIsFan,
@@ -711,6 +923,7 @@ module Facebooker
711
923
  'facebook.photos.getTags' => GetTags,
712
924
  'facebook.photos.addTag' => AddTags,
713
925
  'facebook.photos.upload' => UploadPhoto,
926
+ 'facebook.stream.get' => GetStream,
714
927
  'facebook.stream.publish' => StreamPublish,
715
928
  'facebook.stream.addComment' => StreamAddComment,
716
929
  'facebook.stream.addLike' => StreamAddLike,
@@ -726,7 +939,30 @@ module Facebooker
726
939
  'facebook.data.setUserPreference' => SetPreference,
727
940
  'facebook.video.upload' => UploadVideo,
728
941
  'facebook.sms.send' => SmsSend,
729
- 'facebook.sms.canSend' => SmsCanSend
942
+ 'facebook.sms.canSend' => SmsCanSend,
943
+ 'facebook.comments.add' => CommentsAdd,
944
+ 'facebook.comments.remove' => CommentsRemove,
945
+ 'facebook.comments.get' => CommentsGet,
946
+ 'facebook.dashboard.setCount' => DashboardSetCount,
947
+ 'facebook.dashboard.getCount' => DashboardGetCount,
948
+ 'facebook.dashboard.incrementCount' => DashboardIncrementCount,
949
+ 'facebook.dashboard.decrementCount' => DashboardDecrementCount,
950
+ 'facebook.dashboard.multiGetCount' => DashboardMultiGetCount,
951
+ 'facebook.dashboard.multiSetCount' => DashboardMultiSetCount,
952
+ 'facebook.dashboard.multiIncrementCount' => DashboardMultiIncrementCount,
953
+ 'facebook.dashboard.multiDecrementCount' => DashboardMultiDecrementCount,
954
+ 'facebook.dashboard.addGlobalNews' => DashboardAddGlobalNews,
955
+ 'facebook.dashboard.getGlobalNews' => DashboardGetGlobalNews,
956
+ 'facebook.dashboard.clearGlobalNews' => DashboardClearGlobalNews,
957
+ 'facebook.dashboard.addNews' => DashboardAddNews,
958
+ 'facebook.dashboard.getNews' => DashboardGetNews,
959
+ 'facebook.dashboard.clearNews' => DashboardClearNews,
960
+ 'facebook.dashboard.multiAddNews' => DashboardMultiAddNews,
961
+ 'facebook.dashboard.multiGetNews' => DashboardMultiGetNews,
962
+ 'facebook.dashboard.multiClearNews' => DashboardMultiClearNews,
963
+ 'facebook.dashboard.publishActivity' => DashboardPublishActivity,
964
+ 'facebook.dashboard.removeActivity' => DashboardRemoveActivity,
965
+ 'facebook.dashboard.getActivity' => DashboardGetActivity
730
966
  }
731
967
  end
732
968
  end