source: perl/modules/Facebook/lib/BarnOwl/Module/Facebook.pm @ 69066f6

Last change on this file since 69066f6 was 69066f6, checked in by Edward Z. Yang <ezyang@mit.edu>, 13 years ago
Style wibble. Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
  • Property mode set to 100644
File size: 3.8 KB
Line 
1use warnings;
2use strict;
3
4=head1 NAME
5
6BarnOwl::Module::Facebook
7
8=head1 DESCRIPTION
9
10Integration with Facebook wall posting and commenting.
11
12=cut
13
14package BarnOwl::Module::Facebook;
15
16our $VERSION = 0.1;
17
18use JSON;
19
20use BarnOwl;
21use BarnOwl::Hooks;
22use BarnOwl::Module::Facebook::Handle;
23
24our $facebook_handle = undef;
25
26BarnOwl::new_variable_bool(
27    'facebook:poll',
28    {
29        default => 1,
30        summary => 'Poll Facebook for wall updates',
31        # XXX: Make poll time configurable
32        description => "If set, will poll Facebook every minute for updates.\n"
33     }
34 );
35
36sub init {
37    my $conffile = BarnOwl::get_config_dir() . "/facebook";
38    my $cfg = {};
39    if (open(my $fh, "<", "$conffile")) {
40        my $raw_cfg = do {local $/; <$fh>};
41        close($fh);
42
43        eval { $cfg = from_json($raw_cfg); };
44        if ($@) { BarnOwl::admin_message('Facebook', "Unable to parse $conffile: $@"); }
45    }
46    eval { $facebook_handle = BarnOwl::Module::Facebook::Handle->new($cfg); };
47    if ($@) { BarnOwl::error($@); }
48}
49
50init();
51
52# Should also add support for posting to other people's walls (this
53# is why inline MESSAGE is not supported... yet).  However, see below:
54# specifying USER is UI problematic.
55BarnOwl::new_command('facebook' => \&cmd_facebook, {
56    summary     => 'Post a status update to your wall from BarnOwl',
57    usage       => 'facebook [USER]',
58    description => 'Post a status update to your wall, or post on another user\'s wall. Autocomplete is supported.'
59});
60
61#BarnOwl::new_command('facebook-message' => \&cmd_facebook_direct, {
62#    summary     => 'Send a Facebook message',
63#    usage       => 'twitter-direct USER',
64#    description => 'Send a private Facebook Message to USER.'
65#});
66
67BarnOwl::new_command('facebook-comment' => \&cmd_facebook_comment, {
68    summary     => 'Comment on a wall post.',
69    usage       => 'facebook-comment POST_ID',
70    description => 'Comment on a friend\'s wall post.'
71});
72
73BarnOwl::new_command('facebook-auth' => \&cmd_facebook_auth, {
74    summary     => 'Authenticate as a Facebook user.',
75    usage       => 'facebook-auth [URL]',
76    description => 'Authenticate as a Facebook user.  URL should be the page'
77                ."\nFacebook redirects you to after OAuth login.  If no URL"
78                ."\nis specified, output instructions for logging in."
79});
80
81BarnOwl::new_command('facebook-poll' => \&cmd_facebook_poll, {
82    summary     => 'Force a poll of Facebook.',
83    usage       => 'facebook-poll',
84    description => 'Get updates (news, friends) from Facebook.'
85});
86
87sub cmd_facebook {
88    my $cmd = shift;
89    my $user = shift;
90
91    return unless check_ready();
92
93    BarnOwl::start_edit_win(
94        defined $user ? "Write something to $user..." : "What's on your mind?",
95        sub{ $facebook_handle->facebook($user, shift) }
96    );
97}
98
99sub cmd_facebook_comment {
100    my $cmd  = shift;
101    my $post_id = shift;
102
103    return unless check_ready();
104
105    BarnOwl::start_edit_win(
106        "Write a comment...",
107        sub { $facebook_handle->facebook_comment($post_id, shift) }
108    );
109}
110
111sub cmd_facebook_poll {
112    my $cmd = shift;
113
114    return unless check_ready();
115
116    $facebook_handle->sleep(0);
117    return;
118}
119
120sub cmd_facebook_auth {
121    my $cmd = shift;
122    my $url = shift;
123
124    if ($facebook_handle->{logged_in}) {
125        BarnOwl::message("Already logged in. (To force, run ':reload-module Facebook', or deauthorize BarnOwl.)");
126        return;
127    }
128
129    $facebook_handle->facebook_auth($url);
130}
131
132sub check_ready {
133    if (!$facebook_handle->{logged_in}) {
134        BarnOwl::message("Need to login to Facebook first with ':facebook-auth'.");
135        return 0;
136    }
137    return 1;
138}
139
140BarnOwl::filter(qw{facebook type ^facebook$});
141
142sub complete_user { return keys %{$facebook_handle->{friends}}; }
143BarnOwl::Completion::register_completer(facebook => sub { complete_user(@_) });
144
1451;
Note: See TracBrowser for help on using the repository browser.