Class: T::CLI::List::Add

Inherits:
Thor
  • Object
show all
Includes:
T::Collectable, Requestable
Defined in:
lib/t/cli/list/add.rb

Constant Summary collapse

MAX_USERS_PER_LIST =
500
MAX_USERS_PER_REQUEST =
100

Constants included from Requestable

Requestable::DEFAULT_HOST, Requestable::DEFAULT_PROTOCOL

Instance Method Summary collapse

Methods included from Requestable

#base_url, #client, #host, included, #protocol

Methods included from T::Collectable

#collect_with_cursor

Constructor Details

#initializeAdd

Returns a new instance of Add.



22
23
24
25
# File 'lib/t/cli/list/add.rb', line 22

def initialize(*)
  super
  @rcfile = RCFile.instance
end

Instance Method Details

#followers(list_name) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/t/cli/list/add.rb', line 61

def followers(list_name)
  list_member_ids = collect_with_cursor do |cursor|
    client.list_members(list_name, :cursor => cursor, :skip_status => true, :include_entities => false)
  end
  existing_list_members = list_member_ids.length
  if existing_list_members >= MAX_USERS_PER_LIST
    return say "The list \"#{list_name}\" are already contains the maximum of #{MAX_USERS_PER_LIST} members."
  end
  follower_ids = collect_with_cursor do |cursor|
    followers = client.follower_ids(:cursor => cursor)
  end
  list_member_ids_to_add = (follower_ids - list_member_ids)
  number = list_member_ids_to_add.length
  if number.zero?
    return say "All of @#{@rcfile.default_profile[0]}'s followers are already members of the list \"#{list_name}\"."
  elsif existing_list_members + number > MAX_USERS_PER_LIST
    return unless yes? "Lists can't have more than #{MAX_USERS_PER_LIST} members. Do you want to add up to #{MAX_USERS_PER_LIST} followers to the list \"#{list_name}\"?"
  else
    return unless yes? "Are you sure you want to add #{number} #{number == 1 ? 'follower' : 'followers'} to the list \"#{list_name}\"?"
  end
  max_members_to_add = MAX_USERS_PER_LIST - existing_list_members
  list_member_ids_to_add[0...max_members_to_add].in_groups_of(MAX_USERS_PER_REQUEST, false).threaded_each do |user_id_group|
    retryable(:tries => 3, :on => Twitter::Error::ServerError, :sleep => 0) do
      client.list_add_members(list_name, user_id_group)
    end
  end
  number_added = [number, max_members_to_add].min
  say "@#{@rcfile.default_profile[0]} added #{number_added} #{number_added == 1 ? 'follower' : 'followers'} to the list \"#{list_name}\"."
  say
  say "Run `#{File.basename($0)} list remove all followers #{list_name}` to undo."
end

#friends(list_name) ⇒ Object



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
# File 'lib/t/cli/list/add.rb', line 28

def friends(list_name)
  list_member_ids = collect_with_cursor do |cursor|
    client.list_members(list_name, :cursor => cursor, :skip_status => true, :include_entities => false)
  end
  existing_list_members = list_member_ids.length
  if existing_list_members >= MAX_USERS_PER_LIST
    return say "The list \"#{list_name}\" are already contains the maximum of #{MAX_USERS_PER_LIST} members."
  end
  friend_ids = collect_with_cursor do |cursor|
    client.friend_ids(:cursor => cursor)
  end
  list_member_ids_to_add = (friend_ids - list_member_ids)
  number = list_member_ids_to_add.length
  if number.zero?
    return say "All of @#{@rcfile.default_profile[0]}'s friends are already members of the list \"#{list_name}\"."
  elsif existing_list_members + number > MAX_USERS_PER_LIST
    return unless yes? "Lists can't have more than #{MAX_USERS_PER_LIST} members. Do you want to add up to #{MAX_USERS_PER_LIST} friends to the list \"#{list_name}\"?"
  else
    return unless yes? "Are you sure you want to add #{number} #{number == 1 ? 'friend' : 'friends'} to the list \"#{list_name}\"?"
  end
  max_members_to_add = MAX_USERS_PER_LIST - existing_list_members
  list_member_ids_to_add[0...max_members_to_add].in_groups_of(MAX_USERS_PER_REQUEST, false).threaded_each do |user_id_group|
    retryable(:tries => 3, :on => Twitter::Error::ServerError, :sleep => 0) do
      client.list_add_members(list_name, user_id_group)
    end
  end
  number_added = [number, max_members_to_add].min
  say "@#{@rcfile.default_profile[0]} added #{number_added} #{number_added == 1 ? 'friend' : 'friends'} to the list \"#{list_name}\"."
  say
  say "Run `#{File.basename($0)} list remove all friends #{list_name}` to undo."
end

#listed(from_list_name, to_list_name) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/t/cli/list/add.rb', line 94

def listed(from_list_name, to_list_name)
  to_list_members = collect_with_cursor do |cursor|
    client.list_members(to_list_name, :cursor => cursor, :skip_status => true, :include_entities => false)
  end
  existing_list_members = to_list_members.length
  if existing_list_members >= MAX_USERS_PER_LIST
    return say "The list \"#{to_list_name}\" are already contains the maximum of #{MAX_USERS_PER_LIST} members."
  end
  from_list_members = collect_with_cursor do |cursor|
    client.list_members(from_list_name, :cursor => cursor, :skip_status => true, :include_entities => false)
  end
  list_member_ids_to_add = (from_list_members.collect(&:id) - to_list_members.collect(&:id))
  number = list_member_ids_to_add.length
  if number.zero?
    return say "All of the members of the list \"#{from_list_name}\" are already members of the list \"#{to_list_name}\"."
  elsif existing_list_members + number > MAX_USERS_PER_LIST
    return unless yes? "Lists can't have more than #{MAX_USERS_PER_LIST} members. Do you want to add up to #{MAX_USERS_PER_LIST} members to the list \"#{to_list_name}\"?"
  else
    return unless yes? "Are you sure you want to add #{number} #{number == 1 ? 'member' : 'members'} to the list \"#{to_list_name}\"?"
  end
  max_members_to_add = MAX_USERS_PER_LIST - existing_list_members
  list_member_ids_to_add[0...max_members_to_add].in_groups_of(MAX_USERS_PER_REQUEST, false).threaded_each do |user_id_group|
    retryable(:tries => 3, :on => Twitter::Error::ServerError, :sleep => 0) do
      client.list_add_members(to_list_name, user_id_group)
    end
  end
  number_added = [number, max_members_to_add].min
  say "@#{@rcfile.default_profile[0]} added #{number_added} #{number_added == 1 ? 'member' : 'members'} to the list \"#{to_list_name}\"."
  say
  say "Run `#{File.basename($0)} list remove all listed #{from_list_name} #{to_list_name}` to undo."
end

#users(list_name, screen_name, *screen_names) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/t/cli/list/add.rb', line 127

def users(list_name, screen_name, *screen_names)
  screen_names.unshift(screen_name)
  screen_names.map!(&:strip_at)
  screen_names.in_groups_of(MAX_USERS_PER_REQUEST, false).threaded_each do |user_id_group|
    retryable(:tries => 3, :on => Twitter::Error::ServerError, :sleep => 0) do
      client.list_add_members(list_name, user_id_group)
    end
  end
  number = screen_names.length
  say "@#{@rcfile.default_profile[0]} added #{number} #{number == 1 ? 'user' : 'users'} to the list \"#{list_name}\"."
  say
  say "Run `#{File.basename($0)} list remove users #{list_name} #{screen_names.join(' ')}` to undo."
end