t 3.1.0 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/LICENSE.md +1 -1
- data/README.md +8 -9
- data/bin/t +21 -21
- data/lib/t/cli.rb +470 -463
- data/lib/t/collectable.rb +9 -8
- data/lib/t/core_ext/kernel.rb +3 -3
- data/lib/t/core_ext/string.rb +2 -2
- data/lib/t/delete.rb +44 -41
- data/lib/t/editor.rb +5 -5
- data/lib/t/identicon.rb +1 -1
- data/lib/t/list.rb +51 -51
- data/lib/t/printable.rb +69 -65
- data/lib/t/rcfile.rb +18 -17
- data/lib/t/requestable.rb +3 -2
- data/lib/t/search.rb +82 -82
- data/lib/t/set.rb +21 -21
- data/lib/t/stream.rb +67 -60
- data/lib/t/utils.rb +25 -25
- data/lib/t/version.rb +2 -2
- data/lib/t.rb +2 -2
- data/t.gemspec +22 -21
- metadata +29 -49
data/lib/t/search.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
1
|
+
require "thor"
|
2
|
+
require "twitter"
|
3
|
+
require "t/collectable"
|
4
|
+
require "t/printable"
|
5
|
+
require "t/rcfile"
|
6
|
+
require "t/requestable"
|
7
|
+
require "t/utils"
|
8
8
|
|
9
9
|
module T
|
10
10
|
class Search < Thor
|
@@ -24,52 +24,52 @@ module T
|
|
24
24
|
super
|
25
25
|
end
|
26
26
|
|
27
|
-
desc
|
28
|
-
method_option
|
29
|
-
method_option
|
30
|
-
method_option
|
31
|
-
method_option
|
32
|
-
method_option
|
27
|
+
desc "all QUERY", "Returns the #{DEFAULT_NUM_RESULTS} most recent Tweets that match the specified query."
|
28
|
+
method_option "csv", aliases: "-c", type: :boolean, desc: "Output in CSV format."
|
29
|
+
method_option "decode_uris", aliases: "-d", type: :boolean, desc: "Decodes t.co URLs into their original form."
|
30
|
+
method_option "long", aliases: "-l", type: :boolean, desc: "Output in long format."
|
31
|
+
method_option "number", aliases: "-n", type: :numeric, default: DEFAULT_NUM_RESULTS
|
32
|
+
method_option "relative_dates", aliases: "-a", type: :boolean, desc: "Show relative dates."
|
33
33
|
def all(query)
|
34
|
-
count = options[
|
34
|
+
count = options["number"] || DEFAULT_NUM_RESULTS
|
35
35
|
opts = {count: MAX_SEARCH_RESULTS}
|
36
|
-
opts[:include_entities] = !!options[
|
36
|
+
opts[:include_entities] = !!options["decode_uris"]
|
37
37
|
tweets = client.search(query, opts).take(count)
|
38
|
-
tweets.reverse! if options[
|
39
|
-
if options[
|
40
|
-
require
|
38
|
+
tweets.reverse! if options["reverse"]
|
39
|
+
if options["csv"]
|
40
|
+
require "csv"
|
41
41
|
say TWEET_HEADINGS.to_csv unless tweets.empty?
|
42
42
|
tweets.each do |tweet|
|
43
|
-
say [tweet.id, csv_formatted_time(tweet), tweet.user.screen_name, decode_full_text(tweet, options[
|
43
|
+
say [tweet.id, csv_formatted_time(tweet), tweet.user.screen_name, decode_full_text(tweet, options["decode_uris"])].to_csv
|
44
44
|
end
|
45
|
-
elsif options[
|
45
|
+
elsif options["long"]
|
46
46
|
array = tweets.collect do |tweet|
|
47
|
-
[tweet.id, ls_formatted_time(tweet), "@#{tweet.user.screen_name}", decode_full_text(tweet, options[
|
47
|
+
[tweet.id, ls_formatted_time(tweet), "@#{tweet.user.screen_name}", decode_full_text(tweet, options["decode_uris"]).gsub(/\n+/, " ")]
|
48
48
|
end
|
49
|
-
format = options[
|
49
|
+
format = options["format"] || Array.new(TWEET_HEADINGS.size) { "%s" }
|
50
50
|
print_table_with_headings(array, TWEET_HEADINGS, format)
|
51
51
|
else
|
52
52
|
say unless tweets.empty?
|
53
53
|
tweets.each do |tweet|
|
54
|
-
print_message(tweet.user.screen_name, decode_full_text(tweet, options[
|
54
|
+
print_message(tweet.user.screen_name, decode_full_text(tweet, options["decode_uris"]))
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
desc
|
60
|
-
method_option
|
61
|
-
method_option
|
62
|
-
method_option
|
63
|
-
method_option
|
64
|
-
method_option
|
59
|
+
desc "favorites [USER] QUERY", "Returns Tweets you've favorited that match the specified query."
|
60
|
+
method_option "csv", aliases: "-c", type: :boolean, desc: "Output in CSV format."
|
61
|
+
method_option "decode_uris", aliases: "-d", type: :boolean, desc: "Decodes t.co URLs into their original form."
|
62
|
+
method_option "id", aliases: "-i", type: :boolean, desc: "Specify user via ID instead of screen name."
|
63
|
+
method_option "long", aliases: "-l", type: :boolean, desc: "Output in long format."
|
64
|
+
method_option "relative_dates", aliases: "-a", type: :boolean, desc: "Show relative dates."
|
65
65
|
def favorites(*args)
|
66
66
|
query = args.pop
|
67
67
|
user = args.pop
|
68
68
|
opts = {count: MAX_NUM_RESULTS}
|
69
|
-
opts[:include_entities] = !!options[
|
69
|
+
opts[:include_entities] = !!options["decode_uris"]
|
70
70
|
if user
|
71
|
-
require
|
72
|
-
user = options[
|
71
|
+
require "t/core_ext/string"
|
72
|
+
user = options["id"] ? user.to_i : user.strip_ats
|
73
73
|
tweets = collect_with_max_id do |max_id|
|
74
74
|
opts[:max_id] = max_id unless max_id.nil?
|
75
75
|
client.favorites(user, opts)
|
@@ -85,18 +85,18 @@ module T
|
|
85
85
|
end
|
86
86
|
print_tweets(tweets)
|
87
87
|
end
|
88
|
-
map %w
|
88
|
+
map %w[faves] => :favorites
|
89
89
|
|
90
|
-
desc
|
91
|
-
method_option
|
92
|
-
method_option
|
93
|
-
method_option
|
94
|
-
method_option
|
95
|
-
method_option
|
90
|
+
desc "list [USER/]LIST QUERY", "Returns Tweets on a list that match the specified query."
|
91
|
+
method_option "csv", aliases: "-c", type: :boolean, desc: "Output in CSV format."
|
92
|
+
method_option "decode_uris", aliases: "-d", type: :boolean, desc: "Decodes t.co URLs into their original form."
|
93
|
+
method_option "id", aliases: "-i", type: :boolean, desc: "Specify user via ID instead of screen name."
|
94
|
+
method_option "long", aliases: "-l", type: :boolean, desc: "Output in long format."
|
95
|
+
method_option "relative_dates", aliases: "-a", type: :boolean, desc: "Show relative dates."
|
96
96
|
def list(user_list, query)
|
97
97
|
owner, list_name = extract_owner(user_list, options)
|
98
98
|
opts = {count: MAX_NUM_RESULTS}
|
99
|
-
opts[:include_entities] = !!options[
|
99
|
+
opts[:include_entities] = !!options["decode_uris"]
|
100
100
|
tweets = collect_with_max_id do |max_id|
|
101
101
|
opts[:max_id] = max_id unless max_id.nil?
|
102
102
|
client.list_timeline(owner, list_name, opts)
|
@@ -107,14 +107,14 @@ module T
|
|
107
107
|
print_tweets(tweets)
|
108
108
|
end
|
109
109
|
|
110
|
-
desc
|
111
|
-
method_option
|
112
|
-
method_option
|
113
|
-
method_option
|
114
|
-
method_option
|
110
|
+
desc "mentions QUERY", "Returns Tweets mentioning you that match the specified query."
|
111
|
+
method_option "csv", aliases: "-c", type: :boolean, desc: "Output in CSV format."
|
112
|
+
method_option "decode_uris", aliases: "-d", type: :boolean, desc: "Decodes t.co URLs into their original form."
|
113
|
+
method_option "long", aliases: "-l", type: :boolean, desc: "Output in long format."
|
114
|
+
method_option "relative_dates", aliases: "-a", type: :boolean, desc: "Show relative dates."
|
115
115
|
def mentions(query)
|
116
116
|
opts = {count: MAX_NUM_RESULTS}
|
117
|
-
opts[:include_entities] = !!options[
|
117
|
+
opts[:include_entities] = !!options["decode_uris"]
|
118
118
|
tweets = collect_with_max_id do |max_id|
|
119
119
|
opts[:max_id] = max_id unless max_id.nil?
|
120
120
|
client.mentions(opts)
|
@@ -124,22 +124,22 @@ module T
|
|
124
124
|
end
|
125
125
|
print_tweets(tweets)
|
126
126
|
end
|
127
|
-
map %w
|
127
|
+
map %w[replies] => :mentions
|
128
128
|
|
129
|
-
desc
|
130
|
-
method_option
|
131
|
-
method_option
|
132
|
-
method_option
|
133
|
-
method_option
|
134
|
-
method_option
|
129
|
+
desc "retweets [USER] QUERY", "Returns Tweets you've retweeted that match the specified query."
|
130
|
+
method_option "csv", aliases: "-c", type: :boolean, desc: "Output in CSV format."
|
131
|
+
method_option "decode_uris", aliases: "-d", type: :boolean, desc: "Decodes t.co URLs into their original form."
|
132
|
+
method_option "id", aliases: "-i", type: :boolean, desc: "Specify user via ID instead of screen name."
|
133
|
+
method_option "long", aliases: "-l", type: :boolean, desc: "Output in long format."
|
134
|
+
method_option "relative_dates", aliases: "-a", type: :boolean, desc: "Show relative dates."
|
135
135
|
def retweets(*args)
|
136
136
|
query = args.pop
|
137
137
|
user = args.pop
|
138
138
|
opts = {count: MAX_NUM_RESULTS}
|
139
|
-
opts[:include_entities] = !!options[
|
139
|
+
opts[:include_entities] = !!options["decode_uris"]
|
140
140
|
if user
|
141
|
-
require
|
142
|
-
user = options[
|
141
|
+
require "t/core_ext/string"
|
142
|
+
user = options["id"] ? user.to_i : user.strip_ats
|
143
143
|
tweets = collect_with_max_id do |max_id|
|
144
144
|
opts[:max_id] = max_id unless max_id.nil?
|
145
145
|
client.retweeted_by_user(user, opts)
|
@@ -155,29 +155,29 @@ module T
|
|
155
155
|
end
|
156
156
|
print_tweets(tweets)
|
157
157
|
end
|
158
|
-
map %w
|
158
|
+
map %w[rts] => :retweets
|
159
159
|
|
160
|
-
desc
|
161
|
-
method_option
|
162
|
-
method_option
|
163
|
-
method_option
|
164
|
-
method_option
|
165
|
-
method_option
|
166
|
-
method_option
|
167
|
-
method_option
|
168
|
-
method_option
|
160
|
+
desc "timeline [USER] QUERY", "Returns Tweets in your timeline that match the specified query."
|
161
|
+
method_option "csv", aliases: "-c", type: :boolean, desc: "Output in CSV format."
|
162
|
+
method_option "decode_uris", aliases: "-d", type: :boolean, desc: "Decodes t.co URLs into their original form."
|
163
|
+
method_option "exclude", aliases: "-e", type: :string, enum: %w[replies retweets], desc: "Exclude certain types of Tweets from the results.", banner: "TYPE"
|
164
|
+
method_option "id", aliases: "-i", type: :boolean, desc: "Specify user via ID instead of screen name."
|
165
|
+
method_option "long", aliases: "-l", type: :boolean, desc: "Output in long format."
|
166
|
+
method_option "max_id", aliases: "-m", type: :numeric, desc: "Returns only the results with an ID less than the specified ID."
|
167
|
+
method_option "relative_dates", aliases: "-a", type: :boolean, desc: "Show relative dates."
|
168
|
+
method_option "since_id", aliases: "-s", type: :numeric, desc: "Returns only the results with an ID greater than the specified ID."
|
169
169
|
def timeline(*args)
|
170
170
|
query = args.pop
|
171
171
|
user = args.pop
|
172
172
|
opts = {count: MAX_NUM_RESULTS}
|
173
|
-
opts[:exclude_replies] = true if options[
|
174
|
-
opts[:include_entities] = !!options[
|
175
|
-
opts[:include_rts] = false if options[
|
176
|
-
opts[:max_id] = options[
|
177
|
-
opts[:since_id] = options[
|
173
|
+
opts[:exclude_replies] = true if options["exclude"] == "replies"
|
174
|
+
opts[:include_entities] = !!options["decode_uris"]
|
175
|
+
opts[:include_rts] = false if options["exclude"] == "retweets"
|
176
|
+
opts[:max_id] = options["max_id"] if options["max_id"]
|
177
|
+
opts[:since_id] = options["since_id"] if options["since_id"]
|
178
178
|
if user
|
179
|
-
require
|
180
|
-
user = options[
|
179
|
+
require "t/core_ext/string"
|
180
|
+
user = options["id"] ? user.to_i : user.strip_ats
|
181
181
|
tweets = collect_with_max_id do |max_id|
|
182
182
|
opts[:max_id] = max_id unless max_id.nil?
|
183
183
|
client.user_timeline(user, opts)
|
@@ -193,18 +193,18 @@ module T
|
|
193
193
|
end
|
194
194
|
print_tweets(tweets)
|
195
195
|
end
|
196
|
-
map %w
|
196
|
+
map %w[tl] => :timeline
|
197
197
|
|
198
|
-
desc
|
199
|
-
method_option
|
200
|
-
method_option
|
201
|
-
method_option
|
202
|
-
method_option
|
203
|
-
method_option
|
204
|
-
method_option
|
198
|
+
desc "users QUERY", "Returns users that match the specified query."
|
199
|
+
method_option "csv", aliases: "-c", type: :boolean, desc: "Output in CSV format."
|
200
|
+
method_option "long", aliases: "-l", type: :boolean, desc: "Output in long format."
|
201
|
+
method_option "relative_dates", aliases: "-a", type: :boolean, desc: "Show relative dates."
|
202
|
+
method_option "reverse", aliases: "-r", type: :boolean, desc: "Reverse the order of the sort."
|
203
|
+
method_option "sort", aliases: "-s", type: :string, enum: %w[favorites followers friends listed screen_name since tweets tweeted], default: "screen_name", desc: "Specify the order of the results.", banner: "ORDER"
|
204
|
+
method_option "unsorted", aliases: "-u", type: :boolean, desc: "Output is not sorted."
|
205
205
|
def users(query)
|
206
206
|
users = collect_with_page do |page|
|
207
|
-
client.user_search(query, page:
|
207
|
+
client.user_search(query, page:)
|
208
208
|
end
|
209
209
|
print_users(users)
|
210
210
|
end
|
data/lib/t/set.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "thor"
|
2
|
+
require "t/rcfile"
|
3
|
+
require "t/requestable"
|
4
4
|
|
5
5
|
module T
|
6
6
|
class Set < Thor
|
@@ -13,57 +13,57 @@ module T
|
|
13
13
|
super
|
14
14
|
end
|
15
15
|
|
16
|
-
desc
|
16
|
+
desc "active SCREEN_NAME [CONSUMER_KEY]", "Set your active account."
|
17
17
|
def active(screen_name, consumer_key = nil)
|
18
|
-
require
|
18
|
+
require "t/core_ext/string"
|
19
19
|
screen_name = screen_name.strip_ats
|
20
|
-
@rcfile.path = options[
|
20
|
+
@rcfile.path = options["profile"] if options["profile"]
|
21
21
|
consumer_key = @rcfile[screen_name].keys.last if consumer_key.nil?
|
22
|
-
@rcfile.active_profile = {
|
22
|
+
@rcfile.active_profile = {"username" => @rcfile[screen_name][consumer_key]["username"], "consumer_key" => consumer_key}
|
23
23
|
say "Active account has been updated to #{@rcfile.active_profile[0]}."
|
24
24
|
end
|
25
|
-
map %w
|
25
|
+
map %w[account default] => :active
|
26
26
|
|
27
|
-
desc
|
27
|
+
desc "bio DESCRIPTION", "Edits your Bio information on your Twitter profile."
|
28
28
|
def bio(description)
|
29
|
-
client.update_profile(description:
|
29
|
+
client.update_profile(description:)
|
30
30
|
say "@#{@rcfile.active_profile[0]}'s bio has been updated."
|
31
31
|
end
|
32
32
|
|
33
|
-
desc
|
33
|
+
desc "language LANGUAGE_NAME", "Selects the language you'd like to receive notifications in."
|
34
34
|
def language(language_name)
|
35
35
|
client.settings(lang: language_name)
|
36
36
|
say "@#{@rcfile.active_profile[0]}'s language has been updated."
|
37
37
|
end
|
38
38
|
|
39
|
-
desc
|
39
|
+
desc "location PLACE_NAME", "Updates the location field in your profile."
|
40
40
|
def location(place_name)
|
41
41
|
client.update_profile(location: place_name)
|
42
42
|
say "@#{@rcfile.active_profile[0]}'s location has been updated."
|
43
43
|
end
|
44
44
|
|
45
|
-
desc
|
45
|
+
desc "name NAME", "Sets the name field on your Twitter profile."
|
46
46
|
def name(name)
|
47
|
-
client.update_profile(name:
|
47
|
+
client.update_profile(name:)
|
48
48
|
say "@#{@rcfile.active_profile[0]}'s name has been updated."
|
49
49
|
end
|
50
50
|
|
51
|
-
desc
|
52
|
-
method_option
|
51
|
+
desc "profile_background_image FILE", "Sets the background image on your Twitter profile."
|
52
|
+
method_option "tile", aliases: "-t", type: :boolean, desc: "Whether or not to tile the background image."
|
53
53
|
def profile_background_image(file)
|
54
|
-
client.update_profile_background_image(File.new(File.expand_path(file)), tile: options[
|
54
|
+
client.update_profile_background_image(File.new(File.expand_path(file)), tile: options["tile"], skip_status: true)
|
55
55
|
say "@#{@rcfile.active_profile[0]}'s background image has been updated."
|
56
56
|
end
|
57
|
-
map %w
|
57
|
+
map %w[background background_image] => :profile_background_image
|
58
58
|
|
59
|
-
desc
|
59
|
+
desc "profile_image FILE", "Sets the image on your Twitter profile."
|
60
60
|
def profile_image(file)
|
61
61
|
client.update_profile_image(File.new(File.expand_path(file)))
|
62
62
|
say "@#{@rcfile.active_profile[0]}'s image has been updated."
|
63
63
|
end
|
64
|
-
map %w
|
64
|
+
map %w[avatar image] => :profile_image
|
65
65
|
|
66
|
-
desc
|
66
|
+
desc "website URI", "Sets the website field on your profile."
|
67
67
|
def website(uri)
|
68
68
|
client.update_profile(url: uri)
|
69
69
|
say "@#{@rcfile.active_profile[0]}'s website has been updated."
|
data/lib/t/stream.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
require "thor"
|
2
|
+
require "t/printable"
|
3
|
+
require "t/rcfile"
|
4
|
+
require "t/requestable"
|
5
|
+
require "t/utils"
|
6
6
|
|
7
7
|
module T
|
8
8
|
class Stream < Thor
|
@@ -11,10 +11,10 @@ module T
|
|
11
11
|
include T::Utils
|
12
12
|
|
13
13
|
TWEET_HEADINGS_FORMATTING = [
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
"%-18s", # Add padding to maximum length of a Tweet ID
|
15
|
+
"%-12s", # Add padding to length of a timestamp formatted with ls_formatted_time
|
16
|
+
"%-20s", # Add padding to maximum length of a Twitter screen name
|
17
|
+
"%s", # Last element does not need special formatting
|
18
18
|
].freeze
|
19
19
|
|
20
20
|
check_unknown_options!
|
@@ -24,16 +24,16 @@ module T
|
|
24
24
|
super
|
25
25
|
end
|
26
26
|
|
27
|
-
desc
|
28
|
-
method_option
|
29
|
-
method_option
|
30
|
-
method_option
|
27
|
+
desc "all", "Stream a random sample of all Tweets (Control-C to stop)"
|
28
|
+
method_option "csv", aliases: "-c", type: :boolean, desc: "Output in CSV format."
|
29
|
+
method_option "decode_uris", aliases: "-d", type: :boolean, desc: "Decodes t.co URLs into their original form."
|
30
|
+
method_option "long", aliases: "-l", type: :boolean, desc: "Output in long format."
|
31
31
|
def all
|
32
32
|
streaming_client.before_request do
|
33
|
-
if options[
|
34
|
-
require
|
33
|
+
if options["csv"]
|
34
|
+
require "csv"
|
35
35
|
say TWEET_HEADINGS.to_csv
|
36
|
-
elsif options[
|
36
|
+
elsif options["long"] && STDOUT.tty?
|
37
37
|
headings = Array.new(TWEET_HEADINGS.size) do |index|
|
38
38
|
TWEET_HEADINGS_FORMATTING[index] % TWEET_HEADINGS[index]
|
39
39
|
end
|
@@ -42,9 +42,10 @@ module T
|
|
42
42
|
end
|
43
43
|
streaming_client.sample do |tweet|
|
44
44
|
next unless tweet.is_a?(Twitter::Tweet)
|
45
|
-
|
45
|
+
|
46
|
+
if options["csv"]
|
46
47
|
print_csv_tweet(tweet)
|
47
|
-
elsif options[
|
48
|
+
elsif options["long"]
|
48
49
|
array = build_long_tweet(tweet).each_with_index.collect do |element, index|
|
49
50
|
TWEET_HEADINGS_FORMATTING[index] % element
|
50
51
|
end
|
@@ -55,15 +56,15 @@ module T
|
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
58
|
-
desc
|
59
|
-
method_option
|
60
|
-
method_option
|
61
|
-
method_option
|
62
|
-
method_option
|
63
|
-
method_option
|
59
|
+
desc "list [USER/]LIST", "Stream a timeline for members of the specified list (Control-C to stop)"
|
60
|
+
method_option "csv", aliases: "-c", type: :boolean, desc: "Output in CSV format."
|
61
|
+
method_option "decode_uris", aliases: "-d", type: :boolean, desc: "Decodes t.co URLs into their original form."
|
62
|
+
method_option "id", aliases: "-i", type: :boolean, desc: "Specify user via ID instead of screen name."
|
63
|
+
method_option "long", aliases: "-l", type: :boolean, desc: "Output in long format."
|
64
|
+
method_option "reverse", aliases: "-r", type: :boolean, desc: "Reverse the order of the sort."
|
64
65
|
def list(user_list)
|
65
66
|
owner, list_name = extract_owner(user_list, options)
|
66
|
-
require
|
67
|
+
require "t/list"
|
67
68
|
streaming_client.before_request do
|
68
69
|
list = T::List.new
|
69
70
|
list.options = list.options.merge(options)
|
@@ -72,11 +73,12 @@ module T
|
|
72
73
|
list.timeline(user_list)
|
73
74
|
end
|
74
75
|
user_ids = client.list_members(owner, list_name).collect(&:id)
|
75
|
-
streaming_client.filter(follow: user_ids.join(
|
76
|
+
streaming_client.filter(follow: user_ids.join(",")) do |tweet|
|
76
77
|
next unless tweet.is_a?(Twitter::Tweet)
|
77
|
-
|
78
|
+
|
79
|
+
if options["csv"]
|
78
80
|
print_csv_tweet(tweet)
|
79
|
-
elsif options[
|
81
|
+
elsif options["long"]
|
80
82
|
array = build_long_tweet(tweet).each_with_index.collect do |element, index|
|
81
83
|
TWEET_HEADINGS_FORMATTING[index] % element
|
82
84
|
end
|
@@ -86,40 +88,42 @@ module T
|
|
86
88
|
end
|
87
89
|
end
|
88
90
|
end
|
89
|
-
map %w
|
91
|
+
map %w[tl] => :timeline
|
90
92
|
|
91
|
-
desc
|
93
|
+
desc "matrix", "Unfortunately, no one can be told what the Matrix is. You have to see it for yourself."
|
92
94
|
def matrix
|
93
|
-
require
|
95
|
+
require "t/cli"
|
94
96
|
streaming_client.before_request do
|
95
97
|
cli = T::CLI.new
|
96
98
|
cli.matrix
|
97
99
|
end
|
98
|
-
streaming_client.sample(language:
|
100
|
+
streaming_client.sample(language: "ja") do |tweet|
|
99
101
|
next unless tweet.is_a?(Twitter::Tweet)
|
100
|
-
|
102
|
+
|
103
|
+
say(tweet.text.gsub(/[^\u3000\u3040-\u309f]/, "").reverse, %i[bold green on_black], false)
|
101
104
|
end
|
102
105
|
end
|
103
106
|
|
104
|
-
desc
|
105
|
-
method_option
|
106
|
-
method_option
|
107
|
-
method_option
|
107
|
+
desc "search KEYWORD [KEYWORD...]", "Stream Tweets that contain specified keywords, joined with logical ORs (Control-C to stop)"
|
108
|
+
method_option "csv", aliases: "-c", type: :boolean, desc: "Output in CSV format."
|
109
|
+
method_option "decode_uris", aliases: "-d", type: :boolean, desc: "Decodes t.co URLs into their original form."
|
110
|
+
method_option "long", aliases: "-l", type: :boolean, desc: "Output in long format."
|
108
111
|
def search(keyword, *keywords)
|
109
112
|
keywords.unshift(keyword)
|
110
|
-
require
|
113
|
+
require "t/search"
|
111
114
|
streaming_client.before_request do
|
112
115
|
search = T::Search.new
|
113
116
|
search.options = search.options.merge(options)
|
114
117
|
search.options = search.options.merge(reverse: true)
|
115
118
|
search.options = search.options.merge(format: TWEET_HEADINGS_FORMATTING)
|
116
|
-
search.all(keywords.join(
|
119
|
+
search.all(keywords.join(" OR "))
|
117
120
|
end
|
118
|
-
streaming_client.filter(track: keywords.join(
|
121
|
+
streaming_client.filter(track: keywords.join(",")) do |tweet|
|
119
122
|
next unless tweet.is_a?(Twitter::Tweet)
|
120
|
-
|
123
|
+
|
124
|
+
if options["csv"]
|
121
125
|
print_csv_tweet(tweet)
|
122
|
-
elsif options[
|
126
|
+
elsif options["long"]
|
123
127
|
array = build_long_tweet(tweet).each_with_index.collect do |element, index|
|
124
128
|
TWEET_HEADINGS_FORMATTING[index] % element
|
125
129
|
end
|
@@ -130,12 +134,12 @@ module T
|
|
130
134
|
end
|
131
135
|
end
|
132
136
|
|
133
|
-
desc
|
134
|
-
method_option
|
135
|
-
method_option
|
136
|
-
method_option
|
137
|
+
desc "timeline", "Stream your timeline (Control-C to stop)"
|
138
|
+
method_option "csv", aliases: "-c", type: :boolean, desc: "Output in CSV format."
|
139
|
+
method_option "decode_uris", aliases: "-d", type: :boolean, desc: "Decodes t.co URLs into their original form."
|
140
|
+
method_option "long", aliases: "-l", type: :boolean, desc: "Output in long format."
|
137
141
|
def timeline
|
138
|
-
require
|
142
|
+
require "t/cli"
|
139
143
|
streaming_client.before_request do
|
140
144
|
cli = T::CLI.new
|
141
145
|
cli.options = cli.options.merge(options)
|
@@ -145,9 +149,10 @@ module T
|
|
145
149
|
end
|
146
150
|
streaming_client.user do |tweet|
|
147
151
|
next unless tweet.is_a?(Twitter::Tweet)
|
148
|
-
|
152
|
+
|
153
|
+
if options["csv"]
|
149
154
|
print_csv_tweet(tweet)
|
150
|
-
elsif options[
|
155
|
+
elsif options["long"]
|
151
156
|
array = build_long_tweet(tweet).each_with_index.collect do |element, index|
|
152
157
|
TWEET_HEADINGS_FORMATTING[index] % element
|
153
158
|
end
|
@@ -158,29 +163,30 @@ module T
|
|
158
163
|
end
|
159
164
|
end
|
160
165
|
|
161
|
-
desc
|
162
|
-
method_option
|
163
|
-
method_option
|
164
|
-
method_option
|
166
|
+
desc "users USER_ID [USER_ID...]", "Stream Tweets either from or in reply to specified users (Control-C to stop)"
|
167
|
+
method_option "csv", aliases: "-c", type: :boolean, desc: "Output in CSV format."
|
168
|
+
method_option "decode_uris", aliases: "-d", type: :boolean, desc: "Decodes t.co URLs into their original form."
|
169
|
+
method_option "long", aliases: "-l", type: :boolean, desc: "Output in long format."
|
165
170
|
def users(user_id, *user_ids)
|
166
171
|
user_ids.unshift(user_id)
|
167
172
|
user_ids.collect!(&:to_i)
|
168
173
|
streaming_client.before_request do
|
169
|
-
if options[
|
170
|
-
require
|
174
|
+
if options["csv"]
|
175
|
+
require "csv"
|
171
176
|
say TWEET_HEADINGS.to_csv
|
172
|
-
elsif options[
|
177
|
+
elsif options["long"] && STDOUT.tty?
|
173
178
|
headings = Array.new(TWEET_HEADINGS.size) do |index|
|
174
179
|
TWEET_HEADINGS_FORMATTING[index] % TWEET_HEADINGS[index]
|
175
180
|
end
|
176
181
|
print_table([headings])
|
177
182
|
end
|
178
183
|
end
|
179
|
-
streaming_client.filter(follow: user_ids.join(
|
184
|
+
streaming_client.filter(follow: user_ids.join(",")) do |tweet|
|
180
185
|
next unless tweet.is_a?(Twitter::Tweet)
|
181
|
-
|
186
|
+
|
187
|
+
if options["csv"]
|
182
188
|
print_csv_tweet(tweet)
|
183
|
-
elsif options[
|
189
|
+
elsif options["long"]
|
184
190
|
array = build_long_tweet(tweet).each_with_index.collect do |element, index|
|
185
191
|
TWEET_HEADINGS_FORMATTING[index] % element
|
186
192
|
end
|
@@ -195,7 +201,8 @@ module T
|
|
195
201
|
|
196
202
|
def streaming_client
|
197
203
|
return @streaming_client if @streaming_client
|
198
|
-
|
204
|
+
|
205
|
+
@rcfile.path = options["profile"] if options["profile"]
|
199
206
|
@streaming_client = Twitter::Streaming::Client.new do |config|
|
200
207
|
config.consumer_key = @rcfile.active_consumer_key
|
201
208
|
config.consumer_secret = @rcfile.active_consumer_secret
|