twitterpunch 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8b8362aed8fc073bc763307c26112f5f053063ff
4
- data.tar.gz: 052ff8f173251398173c89f4150ebd4682765808
3
+ metadata.gz: 96c566d4bdc10313e9efc77b92c9cfa407048617
4
+ data.tar.gz: 59b7a93bd2cdda89c79cc1b99f2811a77b1230e4
5
5
  SHA512:
6
- metadata.gz: d54befe3240d10e2f577da3dfec8b983b744b56f69be43215f46a45ac9a8e0a9842f065643cb4e0464e081244791187767d8845f54307b5d0925b40d6999a349
7
- data.tar.gz: 4cb3f30a5ef4c3410b341455e2bc2addaa000f02851eac7564f7dd18679e09615ee59cd16dc583b737506372395c1d7c3a7ffa05a2c0adaf066b95ef508b7df7
6
+ metadata.gz: 17cfa29c54696a7dcdecb8ee77c03b3cdbd2c2c0d30479b77abce4722a2f519159939e3d37037da74ea6dda61f235c18fb33e4a0e7261bfbf11278c733e8cf29
7
+ data.tar.gz: fc1a39f9a4a93b7896510d48242f3ad968a7ccf8721ee3d966195c0286ab470c706b87fa7b84ffc266d01114d71a7ba5e53feef3bc838e07cb67b58f9ef04e71
@@ -32,6 +32,10 @@ optparse = OptionParser.new { |opts|
32
32
  config[:action] = :stream
33
33
  end
34
34
 
35
+ opts.on("--view", "Run photo viewer only.") do
36
+ config[:action] = :view
37
+ end
38
+
35
39
  opts.on("-g", "--genconfig", "Create a default configuration file.") do
36
40
  config[:action] = :configure
37
41
  end
@@ -54,20 +58,35 @@ optparse = OptionParser.new { |opts|
54
58
  }
55
59
  optparse.parse!
56
60
 
61
+ config[:action] = :post if ARGV.size > 0 and config[:action].nil?
57
62
  config[:resources] = File.expand_path("#{File.dirname(__FILE__)}/../resources")
58
- config[:action] = :post if ARGV.size > 0 and config[:action].nil?
59
63
 
60
64
  case config[:action]
61
65
  when :stream
62
66
  require 'twitterpunch/streamer'
63
- client = Twitterpunch::Streamer.new(config)
64
- client.stream
67
+ require 'twitterpunch/viewer'
68
+
69
+ statefile = File.expand_path('~/.twitterpunch.state')
70
+ config[:state] = YAML.load_file(statefile) rescue {}
71
+
72
+ Twitterpunch::Streamer.new(config).thread
73
+ Twitterpunch::Viewer.new(config)
74
+
75
+ File.open(statefile, 'w') {|f| f.write(config[:state].to_yaml) }
65
76
 
66
77
  when :post
67
78
  require 'twitterpunch/poster'
68
79
  client = Twitterpunch::Poster.new(config)
69
80
  client.post(ARGV)
70
81
 
82
+ when :view
83
+ require 'twitterpunch/viewer'
84
+
85
+ statefile = File.expand_path('~/.twitterpunch.state')
86
+ config[:state] = YAML.load_file(statefile) rescue {}
87
+
88
+ client = Twitterpunch::Viewer.new(config)
89
+
71
90
  when :configure
72
91
  require 'twitterpunch/configuration'
73
92
  cfg = Twitterpunch::Configuration.new(configfile).save
@@ -80,3 +99,4 @@ else
80
99
  puts "Run twitterpunch --help for usage."
81
100
  exit 1
82
101
  end
102
+
@@ -1,3 +1,3 @@
1
1
  module Twitterpunch
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
@@ -56,6 +56,9 @@ module Twitterpunch
56
56
  "I'm a posting fool",
57
57
  "minimally viable product"
58
58
  ],
59
+ :viewer => {
60
+ :count => 5,
61
+ },
59
62
  :hashtag => "BestHalloweenPartyEver",
60
63
  :handle => "fassford",
61
64
  :photodir => "~/Pictures/twitterpunch/",
@@ -0,0 +1,65 @@
1
+ require 'rubygems'
2
+ require 'rubygame'
3
+
4
+ module Twitterpunch
5
+ class Sprite
6
+ include Rubygame
7
+ include Sprites::Sprite
8
+
9
+ def initialize(dimensions, image, text)
10
+ # Invoking the base class constructor is important and yet easy to forget:
11
+ super()
12
+
13
+ @dimensions = dimensions
14
+
15
+ @rate = rand(35..150)
16
+ @zoom = rand(50..100) / 100.0
17
+
18
+ # @image and @rect are expected by the Rubygame sprite code
19
+ @image = Surface.load(image).zoom(@zoom)
20
+
21
+ max_width = dimensions[0] * 0.75
22
+ if @image.width > max_width
23
+ @image = @image.zoom(max_width/@image.width)
24
+ end
25
+
26
+ @top = 0 - @image.height
27
+ @left = (dimensions[0] - @image.width ) * rand
28
+ @rect = @image.make_rect
29
+
30
+ if text
31
+ @text = $font.render_utf8(text, true, Color[:black], Color[:gray])
32
+ @text.alpha = 150
33
+
34
+ # Determine the dimensions in pixels of the area used to render the text. The
35
+ # "topleft" of the returned rectangle is at [ 0, 0]
36
+ rt = @text.make_rect
37
+
38
+ # Re-use the "topleft" of the rectangle to indicate where the text should
39
+ # appear on screen ( lower left corner )
40
+ #rt.topleft = [ 12, @image.height - rt.height - 8]
41
+ rt.topleft = [ 0, @image.height - rt.height]
42
+
43
+ # Copy the pixels of the rendered text to the image
44
+ @text.blit(@image, rt)
45
+ end
46
+ end
47
+
48
+ # Animate this object. "seconds_passed" contains the number of ( real-world)
49
+ # seconds that have passed since the last time this object was updated and is
50
+ # therefore useful for working out how far the object should move ( which
51
+ # should be independent of the frame rate)
52
+ def update(seconds_passed)
53
+ @top += seconds_passed * @rate
54
+ @rect.topleft = [ @left, @top ]
55
+ end
56
+
57
+ def draw(on_surface)
58
+ @image.blit(on_surface, @rect)
59
+ end
60
+
61
+ def visible
62
+ @top < @dimensions[1]
63
+ end
64
+ end
65
+ end
@@ -16,6 +16,12 @@ module Twitterpunch
16
16
  FileUtils.mkdir_p(@output) unless File.directory?(@output)
17
17
  end
18
18
 
19
+ def thread
20
+ Thread.new do
21
+ stream
22
+ end
23
+ end
24
+
19
25
  def stream
20
26
  begin
21
27
  @client.filter(:track => @config[:hashtag]) do |tweet|
@@ -23,9 +29,11 @@ module Twitterpunch
23
29
  @logger.info(tweet.text)
24
30
  @logger.log(tweet.user.screen_name, tweet.text)
25
31
 
32
+ content = tweet.text.gsub(/ http\S*/,'').gsub(/#\S*/,'')
33
+
26
34
 
27
35
  unless tweet.user.screen_name == @config[:handle]
28
- message = "#{tweet.user.name} says #{tweet.text.gsub(/ http\S*/,'').gsub(/#\S*/,'')}"
36
+ message = "#{tweet.user.name} says #{content}"
29
37
 
30
38
  case RUBY_PLATFORM
31
39
  when /mingw|cygwin/
@@ -42,12 +50,18 @@ module Twitterpunch
42
50
  request = Net::HTTP::Get.new(uri.request_uri)
43
51
  response = http.request(request)
44
52
 
45
- File.open("#{@output}/#{File.basename uri.path}", 'wb') do |file|
53
+ image = File.basename uri.path
54
+
55
+ File.open("#{@output}/#{image}", 'wb') do |file|
46
56
  file.write(response.body)
47
57
  end
48
58
 
59
+ unless tweet.user.screen_name == @config[:handle]
60
+ @config[:state][image] = content
61
+ end
62
+
49
63
  # OS X screensaver doesn't reload images dynamically. This kinda sucks.
50
- if RUBY_PLATFORM =~ /darwin/
64
+ if RUBY_PLATFORM =~ /darwin/ and not @config.has_key? :viewer
51
65
  system('osascript', '-e', 'tell application "System Events" to stop current screen saver')
52
66
  system('osascript', '-e', 'tell application "System Events" to start current screen saver')
53
67
  end
@@ -0,0 +1,101 @@
1
+ require 'rubygems'
2
+ require 'rubygame'
3
+ require 'yaml'
4
+ require 'twitterpunch/sprite'
5
+
6
+ module Twitterpunch
7
+ class Viewer
8
+ include Rubygame
9
+
10
+ def initialize(config)
11
+ @config = config
12
+ @state = YAML.load_file(File.expand_path('~/.twitterpunch.state')) rescue {}
13
+ srand
14
+
15
+ if @config.has_key? :viewer
16
+ run
17
+ else
18
+ puts 'Press enter to exit'
19
+ STDIN.gets
20
+ end
21
+ end
22
+
23
+ def run
24
+ onscreen = @config[:viewer][:count] || 5
25
+
26
+ # Set up the TrueType Font module
27
+ TTF.setup
28
+ point_size = 20
29
+ $font = TTF.new("#{@config[:resources]}/Tahoma Bold.ttf", point_size)
30
+
31
+ #@screen = Screen.open [ 640, 480]
32
+ default_depth = 0
33
+ maximum_resolution = Screen.get_resolution
34
+
35
+ screen = Screen.open(maximum_resolution, default_depth, [ HWSURFACE, DOUBLEBUF, FULLSCREEN])
36
+
37
+ screen.show_cursor = false
38
+
39
+ clock = Clock.new
40
+ clock.target_framerate = 60
41
+
42
+ # Ask Clock.tick() to return ClockTicked objects instead of the number of
43
+ # milliseconds that have passed:
44
+ clock.enable_tick_events
45
+
46
+ # Create a new group of sprites so that all sprites in the group may be updated
47
+ # or drawn with a single method invocation.
48
+ sprites = Sprites::Group.new
49
+ Sprites::UpdateGroup.extend_object(sprites)
50
+ onscreen.times do
51
+ sprites << Twitterpunch::Sprite.new(maximum_resolution, *next_image)
52
+ end
53
+
54
+ #@background = Surface.load("background.png").zoom_to(maximum_resolution[0], maximum_resolution[1])
55
+ # Create a background image and copy it to the screen. With no image, it's just black.
56
+ background = Surface.new(maximum_resolution)
57
+ background.blit(screen, [ 0, 0])
58
+
59
+ event_queue = EventQueue.new
60
+ event_queue.enable_new_style_events
61
+
62
+ should_run = true
63
+ while should_run do
64
+ seconds_passed = clock.tick().seconds
65
+
66
+ event_queue.each do |event|
67
+ case event
68
+ when Events::QuitRequested, Events::KeyReleased
69
+ should_run = false
70
+ end
71
+ end
72
+
73
+ # remove all sprites who've gone out of sight
74
+ sprites.reject { |sprite| sprite.visible }.each do |sprite|
75
+ sprite.kill
76
+ sprites << Twitterpunch::Sprite.new(maximum_resolution, *next_image)
77
+ end
78
+
79
+ # "undraw" all of the sprites by drawing the background image at their
80
+ # current location ( before their location has been changed by the animation)
81
+ sprites.undraw(screen, background)
82
+
83
+ # Give all of the sprites an opportunity to move themselves to a new location
84
+ sprites.update(seconds_passed)
85
+
86
+ # Draw all of the sprites
87
+ sprites.draw(screen)
88
+
89
+ screen.flip
90
+ end
91
+
92
+ end
93
+
94
+ def next_image
95
+ image = Dir.glob(File.expand_path("#{@config[:photodir]}/*")).sample
96
+ text = @config[:state][File.basename(image)]
97
+ return image, text
98
+ end
99
+
100
+ end
101
+ end
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twitterpunch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Ford
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubygame
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: "Twitterpunch\n===============\n\nTwitterpunch is designed to work with
56
70
  PhotoBooth and OS X Folder Actions.\nWhen this script is called with the name of
57
71
  an image file, it will post the\nimage to Twitter, along with a message randomly
@@ -114,7 +128,10 @@ files:
114
128
  - lib/twitterpunch/configuration.rb
115
129
  - lib/twitterpunch/logger.rb
116
130
  - lib/twitterpunch/poster.rb
131
+ - lib/twitterpunch/sprite.rb
117
132
  - lib/twitterpunch/streamer.rb
133
+ - lib/twitterpunch/viewer.rb
134
+ - resources/Tahoma Bold.ttf
118
135
  - resources/Twitterpunch.workflow/Contents/Info.plist
119
136
  - resources/Twitterpunch.workflow/Contents/QuickLook/Thumbnail.png
120
137
  - resources/Twitterpunch.workflow/Contents/document.wflow
@@ -123,7 +140,16 @@ files:
123
140
  homepage: http://binford2k.com
124
141
  licenses: []
125
142
  metadata: {}
126
- post_install_message:
143
+ post_install_message: |2+
144
+
145
+ ************************************************************************
146
+ Be aware that RubyGame is BROKEN on OSX right now. You will need this
147
+ patch before Twitterpunch will work properly:
148
+
149
+ https://github.com/xrs1133/ruby-sdl-ffi/commit/0b721ac4659b4c08cda5aa2f418561a8a311e85b
150
+
151
+ ************************************************************************
152
+
127
153
  rdoc_options: []
128
154
  require_paths:
129
155
  - lib