File: recent_tweet.rb

package info (click to toggle)
tdiary-contrib 5.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 2,772 kB
  • sloc: ruby: 17,305; javascript: 8,263; lisp: 562; xml: 451; php: 61; sql: 40; makefile: 18
file content (71 lines) | stat: -rw-r--r-- 2,134 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#
# recemt_tweet.rb: Twitter status plugin for tDiary
#
# Copyright (C) 2007 by Nishimoto Masaki <gaju@gaju.jp>
# Distributed under GPL.
#

require 'open-uri'
require 'timeout'
require 'rexml/document'

def recent_tweet( id, count )
	begin
		cache = "#{@cache_path}/recent_tweet.xml"
		xml = open( cache ) {|f| f.read }
		if Time::now > File::mtime( cache ) + 10*60 then
			File::delete( cache )  # clear cache 10 minutes later
		end
	rescue Errno::ENOENT
		begin
			xml = recent_tweet_call_api( id )
			open( cache, 'wb' ) {|f| f.write( xml ) }
		rescue Timeout::Error, StandardError
			return %Q|<div class="recent_tweet error">recent_tweet: #{$!}</div>|
		end
	end

	begin
		doc = REXML::Document::new( xml )
		if doc then
			html = '<div class="recent-tweet">'
			html << '<p class="recent-tweet-title">'
			html << '<a href="http://twitter.com/' << id << '">What am I doing...</a>'
			html << '</p>'
			html << '<ul class="recent-tweet-body">'
			i = 0
			doc.elements.each( 'statuses/status' ) do |status|
				created_at = Time.parse( status.elements.to_a( 'created_at' )[0].text )
				text = status.elements.to_a( 'text' )[0].text
				if /^@/.match( text ) == nil and i < count then
					html << '<li class="recent-tweet-status">'
					if Time.now > created_at + 60*60*23 then
						time = created_at.localtime.strftime( '%b %d %H:%M' )
					else
						time = created_at.localtime.strftime( '%H:%M' )
					end
					html << '<span class="recent-tweet-text">' << %Q|#{text}| << '</span> '
					html << '<span class="recent-tweet-time">(' << %Q|#{time}| << ')</span>'
					html << '</li>'
					i += 1
				end
			end
			html << '</ul></div>'
			@conf.to_native( html )
		else
			return '<div class="recent-tweet error">recent_tweet: Failed to open file</div>'
		end
	rescue REXML::ParseException
		return '<div class="recent-tweet error">recent_tweet: Failed to parse XML</div>'
	end
end

def recent_tweet_call_api( id )
	request = "http://twitter.com/statuses/user_timeline/#{id}.xml"

	proxy = @conf['proxy']
	proxy = 'http://' + proxy if proxy
	Timeout.timeout( 10 ) do
		open( request, :proxy => proxy ) {|f| f.read }
	end
end