PageRenderTime 68ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/plugins/growl2.rb

https://github.com/Epictetus/termtter
Ruby | 143 lines | 117 code | 9 blank | 17 comment | 9 complexity | 5cce04e938a235d8cb6dc8598d029739 MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. require 'open-uri'
  3. require 'uri'
  4. require 'fileutils'
  5. require 'cgi'
  6. begin
  7. require 'meow'
  8. growl = Meow.new('termtter', 'update_friends_timeline')
  9. rescue LoadError
  10. growl = nil
  11. end
  12. config.plugins.growl.set_default(:icon_cache_dir, "#{Termtter::CONF_DIR}/tmp/user_profile_images")
  13. config.plugins.growl.set_default(:growl_user, [])
  14. config.plugins.growl.set_default(:growl_keyword, [])
  15. config.plugins.growl.set_default(:priority_veryhigh_user, [])
  16. config.plugins.growl.set_default(:priority_high_user, [])
  17. config.plugins.growl.set_default(:priority_normal_user, [])
  18. config.plugins.growl.set_default(:priority_low_user, [])
  19. config.plugins.growl.set_default(:priority_verylow_user, [])
  20. config.plugins.growl.set_default(:priority_veryhigh_keyword, [])
  21. config.plugins.growl.set_default(:priority_high_keyword, [])
  22. config.plugins.growl.set_default(:priority_normal_keyword, [])
  23. config.plugins.growl.set_default(:priority_low_keyword, [])
  24. config.plugins.growl.set_default(:priority_verylow_keyword, [])
  25. config.plugins.growl.set_default(:sticky_user, [])
  26. config.plugins.growl.set_default(:sticky_keyword, [])
  27. growl_keys = { 'user' => config.plugins.growl.growl_user,
  28. 'keyword' => Regexp.union(*config.plugins.growl.growl_keyword) }
  29. priority_keys = { 'user' => [config.plugins.growl.priority_veryhigh_user,
  30. config.plugins.growl.priority_high_user,
  31. config.plugins.growl.priority_normal_user,
  32. config.plugins.growl.priority_low_user,
  33. config.plugins.growl.priority_verylow_user],
  34. 'keyword' => [Regexp.union(*config.plugins.growl.priority_veryhigh_keyword),
  35. Regexp.union(*config.plugins.growl.priority_high_keyword),
  36. Regexp.union(*config.plugins.growl.priority_normal_keyword),
  37. Regexp.union(*config.plugins.growl.priority_low_keyword),
  38. Regexp.union(*config.plugins.growl.priority_verylow_keyword) ] }
  39. sticky_keys = { 'user' => config.plugins.growl.sticky_user,
  40. 'keyword' => Regexp.union(*config.plugins.growl.sticky_keyword) }
  41. FileUtils.mkdir_p(config.plugins.growl.icon_cache_dir) unless File.exist?(config.plugins.growl.icon_cache_dir)
  42. Dir.glob("#{config.plugins.growl.icon_cache_dir}/*") {|f| File.delete(f) unless File.size?(f) }
  43. unless File.exist?("#{config.plugins.growl.icon_cache_dir}/default.png")
  44. File.open("#{config.plugins.growl.icon_cache_dir}/default.png", "wb") do |f|
  45. f << open("http://static.twitter.com/images/default_profile_normal.png").read
  46. end
  47. end
  48. def get_icon_path(s)
  49. /https?:\/\/.+\/(\d+)\/.*?$/ =~ s.user.profile_image_url
  50. cache_file = "%s/%s-%s%s" % [ config.plugins.growl.icon_cache_dir,
  51. s.user.screen_name,
  52. $+,
  53. File.extname(s.user.profile_image_url) ]
  54. unless File.exist?(cache_file)
  55. Thread.new(s,cache_file) do |s,cache_file|
  56. Dir.glob("#{config.plugins.growl.icon_cache_dir}/#{s.user.screen_name}-*") {|f| File.delete(f) }
  57. begin
  58. s.user.profile_image_url.sub!(/^https/,'http')
  59. File.open(cache_file, 'wb') do |f|
  60. f << open(URI.escape(s.user.profile_image_url)).read
  61. end
  62. rescue OpenURI::HTTPError
  63. cache_file = "#{config.plugins.growl.icon_cache_dir}/default.png"
  64. end
  65. end
  66. end
  67. return cache_file
  68. end
  69. def get_priority(s,priority_keys)
  70. priority = 2
  71. 5.times {|n|
  72. return priority.to_s if priority_keys['user'][n].include?(s.user.screen_name) ||
  73. priority_keys['keyword'][n] =~ s.text
  74. priority -= 1
  75. }
  76. return '0'
  77. end
  78. def is_growl(s,growl_keys)
  79. return true if (growl_keys['user'].empty? && growl_keys['keyword'] == /(?!)/) ||
  80. (growl_keys['user'].include?(s.user.screen_name) || growl_keys['keyword'] =~ s.text)
  81. return false
  82. end
  83. def is_sticky(s,sticky_keys)
  84. return true if sticky_keys['user'].include?(s.user.screen_name) || sticky_keys['keyword'] =~ s.text
  85. return false
  86. end
  87. Termtter::Client.register_hook(
  88. :name => :growl2,
  89. :points => [:output],
  90. :exec_proc => lambda {|statuses, event|
  91. return unless event == :update_friends_timeline
  92. Thread.start do
  93. statuses.each do |s|
  94. next unless is_growl(s,growl_keys)
  95. growl_title = s.user.screen_name
  96. growl_title += " (#{s.user.name})" unless s.user.screen_name == s.user.name
  97. unless growl
  98. arg = ['growlnotify', growl_title, '-m', s.text.gsub("\n",''), '-n', 'termtter', '-p', get_priority(s,priority_keys), '--image', get_icon_path(s)]
  99. arg.push('-s') if is_sticky(s,sticky_keys)
  100. system *arg
  101. else
  102. begin
  103. icon = Meow.import_image(get_icon_path(s))
  104. rescue
  105. icon = Meow.import_image("#{config.plugins.growl.icon_cache_dir}/default.png")
  106. end
  107. growl.notify(growl_title, CGI.unescape(CGI.unescapeHTML(s.text)),
  108. {:icon => icon,
  109. :priority => get_priority(s,priority_keys),
  110. :sticky => is_sticky(s,sticky_keys) }) do
  111. s.text.gsub(URI.regexp) {|uri| system "open #{uri}"}
  112. end
  113. end
  114. sleep 0.1
  115. end
  116. end
  117. }
  118. )
  119. #Optional setting example.
  120. # Growl ON setting.
  121. # config.plugins.growl.growl_user = ['p2pquake', 'jihou']
  122. # config.plugins.growl.growl_keyword = ['地震', /^@screen_name/]
  123. # Priority setting.
  124. # config.plugins.growl.priority_veryhigh_user = ['veryhigh_user']
  125. # config.plugins.growl.priority_veryhigh_keyword = ['veryhigh_keyword', /^@screen_name']
  126. # config.plugins.growl.priority_high_user = ['high_user']
  127. # config.plugins.growl.priority_high_keyword = ['high_keyword']
  128. # config.plugins.growl.priority_low_user = ['low_user']
  129. # config.plugins.growl.priority_low_keyword = ['low_keyword']
  130. # config.plugins.growl.priority_verylow_user = ['verylow_user']
  131. # config.plugins.growl.priority_verylow_keyword = ['verylow_keyword']
  132. # Sticky setting.
  133. # config.plugins.growl.sticky_user = ['screen_name']
  134. # config.plugins.growl.sticky_keyword = [/^@screen_name/, '#termtter']