PageRenderTime 46ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/plugins/defaults/list.rb

https://github.com/Epictetus/termtter
Ruby | 183 lines | 169 code | 12 blank | 2 comment | 11 complexity | df7137ce528f9ec69e323eed542359fb MD5 | raw file
  1. module Termtter::Client
  2. public_storage[:lists] = []
  3. register_hook(:fetch_my_lists, :point => :launched) do
  4. begin
  5. public_storage[:lists] +=
  6. Termtter::API.twitter.lists(config.user_name).lists.map(&:full_name)
  7. rescue TimeoutError
  8. # do nothing
  9. rescue Exception => e
  10. Termtter::Client.handle_error(e)
  11. end
  12. end
  13. register_command(
  14. :name => :list, :aliases => [:l],
  15. :exec_proc => lambda {|arg|
  16. a = {}
  17. if /\-([\d]+)/ =~ arg
  18. options = {:count => $1}
  19. arg = arg.gsub(/\-([\d]+)/, '')
  20. else
  21. options = {}
  22. end
  23. options[:include_rts] = 1
  24. last_error = nil
  25. if arg.empty?
  26. event = :list_friends_timeline
  27. statuses = Termtter::API.twitter.home_timeline(options)
  28. a[:type] = :home_timeline
  29. else
  30. event = :list_user_timeline
  31. statuses = []
  32. Array(arg.split).each do |user|
  33. if user =~ /\/\w+/
  34. user_name, slug = *user.split('/')
  35. a[:type] = :list
  36. user_name = config.user_name if user_name.empty?
  37. user_name = normalize_as_user_name(user_name)
  38. a[:list_user] = user_name
  39. a[:list_slug] = slug
  40. options[:per_page] = options[:count]
  41. options.delete(:count)
  42. statuses += Termtter::API.twitter.list_statuses(user_name, slug, options)
  43. else
  44. begin
  45. if user =~ /^\d+$/
  46. profile = Termtter::API.twitter.user(nil, :screen_name => user) rescue nil
  47. unless profile
  48. status = Termtter::API.twitter.show(user) rescue nil
  49. user = status.user.screen_name if status
  50. end
  51. end
  52. user_name = normalize_as_user_name(user.sub(/\/$/, ''))
  53. a[:type] = :user
  54. a[:user_name] = user_name
  55. statuses += Termtter::API.twitter.user_timeline(user_name, options)
  56. rescue Rubytter::APIError => e
  57. last_error = e
  58. end
  59. end
  60. end
  61. end
  62. a[:type] = :multiple if arg.split.length > 1
  63. output(statuses, Termtter::Event.new(event, a))
  64. raise last_error if last_error
  65. },
  66. :help => ["list,l [USERNAME]/[SLUG] [-COUNT]", "List the posts"]
  67. )
  68. register_command(
  69. :name => 'list list',
  70. :exec => lambda {|arg|
  71. unless arg.empty?
  72. user_name = normalize_as_user_name(arg)
  73. else
  74. user_name = config.user_name
  75. end
  76. # TODO: show more information of lists
  77. lists = Termtter::API.twitter.lists(user_name).lists
  78. public_storage[:lists] += lists.map(&:full_name)
  79. puts lists.map{|i| i.full_name}.join("\n")
  80. },
  81. :help => ["list list [USERNAME]", "Show Lists"]
  82. )
  83. register_command(
  84. :name => %s{list follow},
  85. :alias => %s{list add},
  86. :exec => lambda { |arg|
  87. list_name, *users = arg.split(' ')
  88. slug = list_name_to_slug(list_name)
  89. users.each{ |screen_name|
  90. begin
  91. user = Termtter::API.twitter.cached_user(screen_name) || Termtter::API.twitter.user(screen_name)
  92. Termtter::API.twitter.add_member_to_list(config.user_name, slug, user.id)
  93. puts "#{slug} + #{screen_name}"
  94. rescue => e
  95. handle_error(e)
  96. end
  97. }
  98. },
  99. :help => ["list follow|add LISTNAME USERNAME", "Follow users to the list"]
  100. )
  101. register_command(
  102. :name => %s{list remove},
  103. :exec => lambda { |arg|
  104. list_name, *users = arg.split(' ')
  105. slug = list_name_to_slug(list_name)
  106. users.each{ |screen_name|
  107. begin
  108. user = Termtter::API.twitter.cached_user(screen_name) || Termtter::API.twitter.user(screen_name)
  109. Termtter::API.twitter.remove_member_from_list(config.user_name, slug, user.id)
  110. puts "#{slug} - #{screen_name}"
  111. rescue => e
  112. handle_error(e)
  113. end
  114. }
  115. },
  116. :help => ["list remove LISTNAME USERNAME", "Remove user(s) from the list"]
  117. )
  118. register_command(
  119. :name => %s{list create},
  120. :exec => lambda { |arg|
  121. slug, *options = arg.split(' ')
  122. param = { }
  123. OptionParser.new {|opt|
  124. opt.on('--description VALUE') {|v| param[:description] = v }
  125. opt.on('--private') {|v| param[:mode] = 'private' }
  126. opt.parse(options)
  127. }
  128. list = Termtter::API.twitter.create_list(config.user_name, slug, param)
  129. public_storage[:lists] << list.full_name
  130. p [list.full_name, param]
  131. },
  132. :help => ["list create SLUG [--description VALUE] [--private]", "Create list"]
  133. )
  134. register_command(
  135. :name => %s{list delete},
  136. :exec => lambda { |arg|
  137. return unless confirm("Are you sure?")
  138. arg.split(' ').each{ |list_name|
  139. begin
  140. slug = list_name_to_slug(list_name)
  141. list = Termtter::API.twitter.delete_list(config.user_name, slug)
  142. public_storage[:lists].delete(list.full_name)
  143. puts "#{list.full_name} deleted"
  144. rescue => e
  145. handle_error(e)
  146. end
  147. }
  148. },
  149. :help => ["list delete LISTNAME", "Delete list"]
  150. )
  151. register_command(
  152. :name => %s{list show},
  153. :exec => lambda { |arg|
  154. raise ArgumentError unless /([^\s]*\/[^\s]+)/ =~ arg
  155. user_name, slug = *arg.split('/')
  156. user_name = config.user_name if user_name.empty?
  157. user_name = normalize_as_user_name(user_name)
  158. list = Termtter::API.twitter.list(user_name, slug)
  159. attrs = %w[ full_name slug description mode id member_count subscriber_count]
  160. label_width = attrs.map(&:size).max
  161. attrs.each do |attr|
  162. value = list.__send__(attr.to_sym)
  163. puts "#{attr.gsub('_', ' ').rjust(label_width)}: #{value}"
  164. end
  165. },
  166. :help => ["list show LISTNAME", "Show the detail of list"]
  167. )
  168. def self.list_name_to_slug(list_name)
  169. list_name[/([^\/]*)$/]
  170. end
  171. end