Changeset 291 for trunk/DashboardTwitter

Show
Ignore:
Timestamp:
08/30/07 07:23:09 (2 years ago)
Author:
fumiakiy
Message:

Updated:

  • Plugin configuration (username and password) moved to blog level setting.
  • Recent tab shows profile image and screen name linked to url.
  • Ajax update of recent tab (click Update link at the bottom).
  • Now uses ETag and If-None-Match header aka conditional get when accessing twitter.
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/DashboardTwitter/plugins/DashboardTwitter/DashboardTwitter.pl

    r273 r291  
    1717<script type="text/javascript"> 
    1818<!-- 
     19function update() { 
     20    TC.Client.call({ 
     21        'load': function(r) { 
     22            var data = eval("(" + r.responseText + ")"); 
     23            data = data['result']; 
     24            data = eval("(" + data + ")"); 
     25            var panel = document.getElementById('data-list'); 
     26            if (data && panel) { 
     27                var array = new Array(); 
     28                for (idx in data) { 
     29                    if (!data.hasOwnProperty(idx)) continue; 
     30                    row = data[idx]; 
     31                    text = '<li><img src="' + row.image_url + '" width="16" height="16" /><a href="' + row.url + '">' + row.screen_name + '</a> ' + row.text + '</li>'; 
     32                    array.push(text); 
     33                } 
     34                panel.innerHTML = '<ul>' + array.join('') + '</ul>'; 
     35            } 
     36        }, 
     37        'error': function(r) { alert(r.responseText); }, 
     38        'method': 'POST', 
     39        'uri': '<mt:var name="script_url">', 
     40        'arguments': { 
     41            '__mode' : 'dashboardtwitter_update', 
     42            'blog_id' : '<mt:var name="blog_id">' 
     43        } 
     44    }); 
     45    return false; 
     46} 
     47 
    1948function twit() { 
    2049    var t = getByID('twit_text'); 
     
    4473    <div id="recent-panel" class="<mt:unless name="tab" eq="recent">hidden</mt:unless>" mt:tab-content="recent"> 
    4574    <mt:if name="data"> 
     75        <div id="data-list"><ul> 
    4676    <mt:loop name="data"> 
    47         <ul> 
    48             <li><mt:var name="text"></li> 
    49         </ul> 
     77            <li><img src="<mt:var name="image_url"> width="16" height="16" /><a href="<mt:var name="url">"><mt:var name="screen_name"></a> <mt:var name="text"></li> 
    5078    </mt:loop> 
     79        </ul></div> 
    5180    <mt:else> 
    5281    <mt:if name="error"><mt:var name="error"></mt:if> 
    5382    </mt:if> 
     83    <a href="javascript:void(0)" onclick="update(); return false;" 
     84        title="<__trans phrase="Update">"><__trans phrase="Update"></a> 
    5485    </div> 
    5586    <div id="twit-panel" class="<mt:unless name="tab" eq="twit">hidden</mt:unless>" mt:tab-content="twit"> 
     
    70101    name => 'DashboardTwitter', 
    71102    author_link => 'http://www.luckypines.com/mt/', 
    72         system_config_template => <<TMPL, 
     103        blog_config_template => <<TMPL, 
    73104<dl> 
    74105<dt>Twitter username</dt> 
    75 <dd><input name="twitter_username" size="40" /></dd> 
     106<dd><input name="twitter_username" size="40" value="<mt:var name="twitter_username">" /></dd> 
    76107<dt>Twitter password</dt> 
    77 <dd><input type="password" name="twitter_password" size="40" /></dd> 
     108<dd><input type="password" name="twitter_password" size="40" value="<mt:var name="twitter_password">" /></dd> 
    78109</dl> 
    79110TMPL 
     
    102133                }, 
    103134                methods => { 
    104                     dashboardtwitter_twit => \&_hdlr_twit, 
     135                    dashboardtwitter_twit   => \&_hdlr_twit, 
     136                    dashboardtwitter_update => \&_js_hdlr_recent, 
    105137                }, 
    106138            } 
     
    116148    my ($tmpl, $param) = @_; 
    117149 
     150    _recent_twitter($app, $param); 
     151    return 1; 
     152} 
     153 
     154sub _js_hdlr_recent { 
     155    my $app = shift; 
     156    my ($tmpl, $param) = @_; 
     157 
     158    $param ||= {}; 
     159    _recent_twitter($app, $param); 
     160    my $data = $param->{data}; 
     161    $app->json_result(JSON::objToJson($data)); 
     162} 
     163 
     164sub _recent_twitter { 
     165    my ($app, $param) = @_; 
     166 
    118167    $param->{tab} = 'recent'; 
    119168     
    120     my $config = $plugin->get_config_hash('system'); 
     169    my $blog_id = $app->param('blog_id'); 
     170    unless ($blog_id) { 
     171        $param->{error} = 'blog_id required.'; 
     172        return 1; 
     173    } 
     174    my $scope = "blog:$blog_id"; 
     175 
     176    my $config = $plugin->get_config_hash($scope); 
    121177    my $username = $config->{twitter_username}; 
    122178    my $password = $config->{twitter_password}; 
     
    125181    my $req = HTTP::Request->new( GET => $recent_url ); 
    126182    $req->authorization_basic($username, $password); 
     183    if ( my $etag = $config->{twitter_etag} ) { 
     184        $req->header( If_None_Match => $etag ); 
     185    } 
    127186    my $res = $ua->request($req); 
    128     return unless $res->is_success(); 
     187    my $s = q(); 
    129188    if ( my $prev = $res->previous) { 
    130189        if ( ('302' eq $prev->code ) && ( $prev->location =~ m|http://static\.twitter\.com| ) ) { 
     
    134193            $param->{error} = 'hmm?'; 
    135194        } 
     195    } elsif ( '304' eq $res->code ) { 
     196        $s = $config->{twitter_cache}; 
    136197    } else { 
    137         my $s = $res->content; 
     198        $s = $res->content; 
    138199        $s =~ s/\\u([0-9a-fA-F]+)/&#x$1;/g; 
    139         eval { 
    140             my $recent = JSON::jsonToObj($s); 
    141             $param->{data} = $recent; 
    142         }; 
    143         if ($@) { 
    144             die $@ ; 
    145         } 
    146     } 
    147  
    148     1; 
     200        if ( my $etag = $res->header('ETag') ) { 
     201            $plugin->set_config_value('twitter_etag' , $etag, $scope); 
     202            $plugin->set_config_value('twitter_cache', $s,    $scope); 
     203        } 
     204    } 
     205    return q() unless $s; 
     206 
     207    eval { 
     208        my $recent = JSON::jsonToObj($s); 
     209        my @data; 
     210        for my $twit (@$recent) { 
     211            push @data, 
     212            { 
     213                screen_name => $twit->{user}{screen_name}, 
     214                url         => $twit->{user}{url}, 
     215                image_url   => $twit->{user}{profile_image_url}, 
     216                text        => $twit->{text}, 
     217            }; 
     218        } 
     219        $param->{data} = \@data; 
     220    }; 
     221    if ($@) { 
     222        die $@ ; 
     223    } 
     224    return 1; 
    149225} 
    150226 
     
    152228    my $app = shift; 
    153229 
     230    my $blog_id = $app->param('blog_id'); 
     231    unless ($blog_id) { 
     232        return $app->json_result(0); 
     233    } 
    154234    my $text = $app->param('text'); 
    155235    my $ua = $app->new_ua; 
    156236    my $req = HTTP::Request->new( POST => $update_url ); 
    157237 
    158     my $config = $plugin->get_config_hash('system'); 
     238    my $config = $plugin->get_config_hash("blog:$blog_id"); 
    159239    my $username = $config->{twitter_username}; 
    160240    my $password = $config->{twitter_password};