ayadn 1.5.1 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/MANUAL.md +1 -1
- data/README.md +3 -1
- data/ayadn.gemspec +2 -0
- data/doc/16-movie.md +46 -0
- data/doc/17-tvshow.md +44 -0
- data/doc/{16-contact.md → 18-contact.md} +0 -0
- data/doc/{18-examples.md → 19-examples.md} +0 -0
- data/doc/{17-shortcuts.md → shortcuts.md} +0 -0
- data/lib/ayadn/action.rb +139 -848
- data/lib/ayadn/alias.rb +3 -3
- data/lib/ayadn/api.rb +5 -1
- data/lib/ayadn/app.rb +22 -3
- data/lib/ayadn/blacklist.rb +7 -6
- data/lib/ayadn/check.rb +187 -0
- data/lib/ayadn/descriptions.rb +86 -0
- data/lib/ayadn/errors.rb +17 -0
- data/lib/ayadn/fileops.rb +1 -1
- data/lib/ayadn/mark.rb +5 -4
- data/lib/ayadn/nowplaying.rb +184 -0
- data/lib/ayadn/nowwatching.rb +76 -0
- data/lib/ayadn/post.rb +40 -0
- data/lib/ayadn/search.rb +77 -0
- data/lib/ayadn/set.rb +66 -0
- data/lib/ayadn/settings.rb +9 -1
- data/lib/ayadn/status.rb +18 -2
- data/lib/ayadn/stream.rb +254 -0
- data/lib/ayadn/switch.rb +1 -1
- data/lib/ayadn/tvshow.rb +123 -0
- data/lib/ayadn/version.rb +1 -1
- data/lib/ayadn/view.rb +86 -1
- data/lib/ayadn/workers.rb +70 -14
- data/spec/unit/view_spec.rb +0 -16
- data/spec/unit/workers_spec.rb +17 -16
- metadata +41 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1dbd05e3a853fb34403880501ca7fd4191ae74c
|
4
|
+
data.tar.gz: 5e2cd526b19ff009e127028a33fba5a21d8ea941
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c5b81ff93034553556e78699c67c17ebf552b6c07d311686ff48c762476d1083cfb1fd209488db58f4e13f3962524376988566b08ec9df95b11f0d12c6e3a4c
|
7
|
+
data.tar.gz: 6037b01600859172ec938f5c384a87660d5cbc8dd0e1b6dfbd456405597f50dd6dfdcb961a4059b25fffe9cdfc0af5d71b0023de3344834a0f8f49152b08772b
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# 1.6.0 - 'Beetlejuice'
|
2
|
+
|
3
|
+
- New command: 'movie'. Create a post from a movie title (with link + movie poster). Customisable hashtag (default: '#nowwatching').
|
4
|
+
- New command: 'tvshow'. Create a post from a TV show title (with link + show poster). Customisable hashtag (default: '#nowwatching'). Option to display a banner instead of a poster.
|
5
|
+
- New: see the target of your PM when writing a message.
|
6
|
+
- New: delete several posts at once.
|
7
|
+
- New: delete several PMs at once.
|
8
|
+
- Fixed: uploading jpg if there were spaces in the filename.
|
9
|
+
- Fixed: bookmark convos.
|
10
|
+
- General code cleaning and refactoring.
|
11
|
+
|
1
12
|
# 1.5.1 - 'Holograms'
|
2
13
|
|
3
14
|
- Improved accuracy of iTunes Store requests for NowPlaying
|
data/MANUAL.md
CHANGED
data/README.md
CHANGED
@@ -23,7 +23,9 @@ The purpose of Ayadn is to let you use all the features of App.net from the cons
|
|
23
23
|
- extract links from conversations, streams, posts, etc
|
24
24
|
- list and download your files
|
25
25
|
- view (and write to) all your channels including Broadcasts, Patter, Ohai, etc
|
26
|
-
-
|
26
|
+
- 'nowplaying' from iTunes or Last.fm, with album art and store link
|
27
|
+
- 'movie' creates a post from a movie title with poster, etc
|
28
|
+
- 'tvshow' creates a post from a TV show title with poster, etc
|
27
29
|
- view/send private messages
|
28
30
|
- view geolocation data in streams
|
29
31
|
- create/manage silent black lists of users, mentions or hashtags
|
data/ayadn.gemspec
CHANGED
@@ -29,6 +29,8 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.add_dependency "daybreak", "~> 0.3"
|
30
30
|
spec.add_dependency "pinboard", "~> 0.1"
|
31
31
|
spec.add_dependency "unicode_utils", "~> 1.4"
|
32
|
+
spec.add_dependency "spotlite", "~> 0.8"
|
33
|
+
spec.add_dependency "tvdb_party", "~> 0.7"
|
32
34
|
|
33
35
|
spec.add_development_dependency "bundler", "~> 1.5"
|
34
36
|
spec.add_development_dependency "rake", "~> 10.1"
|
data/doc/16-movie.md
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# MOVIE (nowwatching)
|
2
|
+
|
3
|
+
Create a post from (part of) a movie title. Includes movie poster, IMDb url and hashtag.
|
4
|
+
|
5
|
+
Usage:
|
6
|
+
|
7
|
+
`ayadn movie ghost in the shell`
|
8
|
+
|
9
|
+
`ayadn movie existenz`
|
10
|
+
|
11
|
+
`ayadn -NW beetlejuice`
|
12
|
+
|
13
|
+
(shortcut is 'NW' because of 'nowwatching')
|
14
|
+
|
15
|
+
## ALT
|
16
|
+
|
17
|
+
If the movie is not the one you're looking for, you can specify the 'alt' option to force find an alternative.
|
18
|
+
|
19
|
+
This is useful for remakes:
|
20
|
+
|
21
|
+
`ayadn -NW solaris`
|
22
|
+
|
23
|
+
(gives the 2002 version)
|
24
|
+
|
25
|
+
`ayadn -NW solaris --alt`
|
26
|
+
|
27
|
+
(gives the 1972 version)
|
28
|
+
|
29
|
+
## ALIASES
|
30
|
+
|
31
|
+
`ayadn nowwatching godfather II`
|
32
|
+
|
33
|
+
`ayadn imdb -a conan`
|
34
|
+
|
35
|
+
## HASHTAG
|
36
|
+
|
37
|
+
You can modify the hashtag with 'set':
|
38
|
+
|
39
|
+
`ayadn set movie hashtag movietime`
|
40
|
+
|
41
|
+
`ayadn set movie hashtag adnmovieclub`
|
42
|
+
|
43
|
+
(default is 'nowwatching')
|
44
|
+
|
45
|
+
|
46
|
+
|
data/doc/17-tvshow.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# TVSHOW (nowwatching)
|
2
|
+
|
3
|
+
Create a post from (part of) a TV show title. Includes show poster, IMDb url and hashtag.
|
4
|
+
|
5
|
+
Usage:
|
6
|
+
|
7
|
+
`ayadn tvshow game of thrones`
|
8
|
+
|
9
|
+
`ayadn tvshow magnum`
|
10
|
+
|
11
|
+
`ayadn -TV 24`
|
12
|
+
|
13
|
+
## ALT
|
14
|
+
|
15
|
+
If the show is not the one you're looking for, you can specify the 'alt' option to force find an alternative.
|
16
|
+
|
17
|
+
`ayadn -TV whose line`
|
18
|
+
|
19
|
+
(gives the US version)
|
20
|
+
|
21
|
+
`ayadn -TV whose line --alt`
|
22
|
+
|
23
|
+
(gives the UK version)
|
24
|
+
|
25
|
+
## HASHTAG
|
26
|
+
|
27
|
+
You can modify the hashtag with 'set':
|
28
|
+
|
29
|
+
`ayadn set tvshow hashtag showtime`
|
30
|
+
|
31
|
+
`ayadn set tvshow hashtag tvshow`
|
32
|
+
|
33
|
+
(default is 'nowwatching')
|
34
|
+
|
35
|
+
## BANNER
|
36
|
+
|
37
|
+
You can display a banner instead of a poster, with the `--banner` (`-b`) option:
|
38
|
+
|
39
|
+
```
|
40
|
+
ayadn -TV magnum --banner
|
41
|
+
ayadn -TV -b magnum
|
42
|
+
```
|
43
|
+
|
44
|
+
|
File without changes
|
File without changes
|
File without changes
|
data/lib/ayadn/action.rb
CHANGED
@@ -2,9 +2,15 @@
|
|
2
2
|
module Ayadn
|
3
3
|
class Action
|
4
4
|
|
5
|
+
##
|
6
|
+
# This class is the main initializer + dispatcher
|
7
|
+
|
5
8
|
def initialize
|
6
9
|
@api = API.new
|
7
10
|
@view = View.new
|
11
|
+
@workers = Workers.new
|
12
|
+
@stream = Stream.new(@api, @view, @workers)
|
13
|
+
@search = Search.new(@api, @view, @workers)
|
8
14
|
Settings.load_config
|
9
15
|
Settings.get_token
|
10
16
|
Settings.init_config
|
@@ -15,12 +21,7 @@ module Ayadn
|
|
15
21
|
|
16
22
|
def unified(options)
|
17
23
|
begin
|
18
|
-
|
19
|
-
stream = @api.get_unified(options)
|
20
|
-
stop_if_no_new_posts(stream, options, 'unified')
|
21
|
-
Databases.save_max_id(stream)
|
22
|
-
render_view(stream, options)
|
23
|
-
Scroll.new(@api, @view).unified(options) if options[:scroll]
|
24
|
+
@stream.unified(options)
|
24
25
|
rescue => e
|
25
26
|
Errors.global_error({error: e, caller: caller, data: [options]})
|
26
27
|
end
|
@@ -28,12 +29,7 @@ module Ayadn
|
|
28
29
|
|
29
30
|
def checkins(options)
|
30
31
|
begin
|
31
|
-
|
32
|
-
stream = @api.get_checkins(options)
|
33
|
-
stop_if_no_new_posts(stream, options, 'explore:checkins')
|
34
|
-
Databases.save_max_id(stream)
|
35
|
-
render_view(stream, options)
|
36
|
-
Scroll.new(@api, @view).checkins(options) if options[:scroll]
|
32
|
+
@stream.checkins(options)
|
37
33
|
rescue => e
|
38
34
|
Errors.global_error({error: e, caller: caller, data: [options]})
|
39
35
|
end
|
@@ -41,28 +37,15 @@ module Ayadn
|
|
41
37
|
|
42
38
|
def global(settings)
|
43
39
|
begin
|
44
|
-
|
45
|
-
options[:filter] = nicerank_true()
|
46
|
-
doing(options)
|
47
|
-
stream = @api.get_global(options)
|
48
|
-
niceranks = NiceRank.new.get_ranks(stream)
|
49
|
-
stop_if_no_new_posts(stream, options, 'global')
|
50
|
-
Databases.save_max_id(stream)
|
51
|
-
render_view(stream, options, niceranks)
|
52
|
-
Scroll.new(@api, @view).global(options) if options[:scroll]
|
40
|
+
@stream.global(settings)
|
53
41
|
rescue => e
|
54
|
-
Errors.global_error({error: e, caller: caller, data: [
|
42
|
+
Errors.global_error({error: e, caller: caller, data: [settings]})
|
55
43
|
end
|
56
44
|
end
|
57
45
|
|
58
46
|
def trending(options)
|
59
47
|
begin
|
60
|
-
|
61
|
-
stream = @api.get_trending(options)
|
62
|
-
stop_if_no_new_posts(stream, options, 'explore:trending')
|
63
|
-
Databases.save_max_id(stream)
|
64
|
-
render_view(stream, options)
|
65
|
-
Scroll.new(@api, @view).trending(options) if options[:scroll]
|
48
|
+
@stream.trending(options)
|
66
49
|
rescue => e
|
67
50
|
Errors.global_error({error: e, caller: caller, data: [options]})
|
68
51
|
end
|
@@ -70,12 +53,7 @@ module Ayadn
|
|
70
53
|
|
71
54
|
def photos(options)
|
72
55
|
begin
|
73
|
-
|
74
|
-
stream = @api.get_photos(options)
|
75
|
-
stop_if_no_new_posts(stream, options, 'explore:photos')
|
76
|
-
Databases.save_max_id(stream)
|
77
|
-
render_view(stream, options)
|
78
|
-
Scroll.new(@api, @view).photos(options) if options[:scroll]
|
56
|
+
@stream.photos(options)
|
79
57
|
rescue => e
|
80
58
|
Errors.global_error({error: e, caller: caller, data: [options]})
|
81
59
|
end
|
@@ -83,12 +61,7 @@ module Ayadn
|
|
83
61
|
|
84
62
|
def conversations(options)
|
85
63
|
begin
|
86
|
-
|
87
|
-
stream = @api.get_conversations(options)
|
88
|
-
stop_if_no_new_posts(stream, options, 'explore:replies')
|
89
|
-
Databases.save_max_id(stream)
|
90
|
-
render_view(stream, options)
|
91
|
-
Scroll.new(@api, @view).replies(options) if options[:scroll]
|
64
|
+
@stream.conversations(options)
|
92
65
|
rescue => e
|
93
66
|
Errors.global_error({error: e, caller: caller, data: [options]})
|
94
67
|
end
|
@@ -96,17 +69,7 @@ module Ayadn
|
|
96
69
|
|
97
70
|
def mentions(username, options)
|
98
71
|
begin
|
99
|
-
|
100
|
-
username = add_arobase(username)
|
101
|
-
doing(options)
|
102
|
-
stream = @api.get_mentions(username, options)
|
103
|
-
stop_if_no_user(stream, username)
|
104
|
-
Databases.save_max_id(stream)
|
105
|
-
options = options.dup
|
106
|
-
options[:in_mentions] = true
|
107
|
-
stop_if_no_data(stream, 'mentions')
|
108
|
-
render_view(stream, options)
|
109
|
-
Scroll.new(@api, @view).mentions(username, options) if options[:scroll]
|
72
|
+
@stream.mentions(username, options)
|
110
73
|
rescue => e
|
111
74
|
Errors.global_error({error: e, caller: caller, data: [username, options]})
|
112
75
|
end
|
@@ -114,15 +77,7 @@ module Ayadn
|
|
114
77
|
|
115
78
|
def posts(username, options)
|
116
79
|
begin
|
117
|
-
|
118
|
-
username = add_arobase(username)
|
119
|
-
doing(options)
|
120
|
-
stream = @api.get_posts(username, options)
|
121
|
-
stop_if_no_user(stream, username)
|
122
|
-
Databases.save_max_id(stream)
|
123
|
-
stop_if_no_data(stream, 'mentions')
|
124
|
-
render_view(stream, options)
|
125
|
-
Scroll.new(@api, @view).posts(username, options) if options[:scroll]
|
80
|
+
@stream.posts(username, options)
|
126
81
|
rescue => e
|
127
82
|
Errors.global_error({error: e, caller: caller, data: [username, options]})
|
128
83
|
end
|
@@ -130,11 +85,7 @@ module Ayadn
|
|
130
85
|
|
131
86
|
def interactions(options)
|
132
87
|
begin
|
133
|
-
|
134
|
-
stream = @api.get_interactions
|
135
|
-
if_raw_show(stream, options)
|
136
|
-
@view.clear_screen
|
137
|
-
@view.show_interactions(stream['data'])
|
88
|
+
@stream.interactions(options)
|
138
89
|
rescue => e
|
139
90
|
Errors.global_error({error: e, caller: caller, data: [options]})
|
140
91
|
end
|
@@ -142,13 +93,7 @@ module Ayadn
|
|
142
93
|
|
143
94
|
def whatstarred(username, options)
|
144
95
|
begin
|
145
|
-
|
146
|
-
username = add_arobase(username)
|
147
|
-
doing(options)
|
148
|
-
stream = @api.get_whatstarred(username, options)
|
149
|
-
stop_if_no_user(stream, username)
|
150
|
-
stop_if_no_data(stream, 'whatstarred')
|
151
|
-
options[:extract] ? view_all_stars_links(stream) : render_view(stream, options)
|
96
|
+
@stream.whatstarred(username, options)
|
152
97
|
rescue => e
|
153
98
|
Errors.global_error({error: e, caller: caller, data: [username, options]})
|
154
99
|
end
|
@@ -156,18 +101,7 @@ module Ayadn
|
|
156
101
|
|
157
102
|
def whoreposted(post_id, options)
|
158
103
|
begin
|
159
|
-
|
160
|
-
doing(options)
|
161
|
-
details = @api.get_details(post_id, options)
|
162
|
-
stop_if_404(details, post_id)
|
163
|
-
id = get_original_id(post_id, details)
|
164
|
-
list = @api.get_whoreposted(id)
|
165
|
-
if_raw_show(list, options)
|
166
|
-
unless list['data'].empty?
|
167
|
-
get_list(:whoreposted, list['data'], post_id)
|
168
|
-
else
|
169
|
-
puts Status.nobody_reposted
|
170
|
-
end
|
104
|
+
@stream.whoreposted(post_id, options)
|
171
105
|
rescue => e
|
172
106
|
Errors.global_error({error: e, caller: caller, data: [post_id, options]})
|
173
107
|
end
|
@@ -175,55 +109,30 @@ module Ayadn
|
|
175
109
|
|
176
110
|
def whostarred(post_id, options)
|
177
111
|
begin
|
178
|
-
|
179
|
-
doing(options)
|
180
|
-
details = @api.get_details(post_id, options)
|
181
|
-
stop_if_404(details, post_id)
|
182
|
-
id = get_original_id(post_id, details)
|
183
|
-
list = @api.get_whostarred(id)
|
184
|
-
if_raw_show(list, options)
|
185
|
-
unless list['data'].empty?
|
186
|
-
get_list(:whostarred, list['data'], id)
|
187
|
-
else
|
188
|
-
puts Status.nobody_starred
|
189
|
-
end
|
112
|
+
@stream.whostarred(post_id, options)
|
190
113
|
rescue => e
|
191
|
-
Errors.global_error({error: e, caller: caller, data: [post_id,
|
114
|
+
Errors.global_error({error: e, caller: caller, data: [post_id, options]})
|
192
115
|
end
|
193
116
|
end
|
194
117
|
|
195
118
|
def convo(post_id, options)
|
196
119
|
begin
|
197
|
-
|
198
|
-
doing(options)
|
199
|
-
details = @api.get_details(post_id, options)
|
200
|
-
stop_if_404(details, post_id)
|
201
|
-
id = get_original_id(post_id, details)
|
202
|
-
stream = get_convo id, options
|
203
|
-
Databases.pagination["replies:#{id}"] = stream['meta']['max_id']
|
204
|
-
options = options.dup
|
205
|
-
unless details['data']['reply_to'].nil?
|
206
|
-
options[:reply_to] = details['data']['reply_to'].to_i
|
207
|
-
end
|
208
|
-
options[:post_id] = post_id.to_i
|
209
|
-
render_view(stream, options)
|
210
|
-
Scroll.new(@api, @view).convo(id, options) if options[:scroll]
|
120
|
+
@stream.convo(post_id, options)
|
211
121
|
rescue => e
|
212
|
-
Errors.global_error({error: e, caller: caller, data: [post_id,
|
122
|
+
Errors.global_error({error: e, caller: caller, data: [post_id, options]})
|
213
123
|
end
|
214
124
|
end
|
215
125
|
|
216
|
-
def
|
217
|
-
stream = @api.get_convo(id, options)
|
218
|
-
stop_if_no_post(stream, id)
|
219
|
-
stream
|
220
|
-
end
|
221
|
-
|
222
|
-
def delete(post_id)
|
126
|
+
def delete(post_ids)
|
223
127
|
begin
|
224
|
-
|
225
|
-
|
226
|
-
|
128
|
+
ids = post_ids.select { |post_id| post_id.is_integer? }
|
129
|
+
abort(Status.error_missing_post_id) if ids.empty?
|
130
|
+
ids.each do |post_id|
|
131
|
+
print Status.deleting_post(post_id)
|
132
|
+
resp = @api.delete_post(post_id)
|
133
|
+
Check.has_been_deleted(post_id, resp)
|
134
|
+
sleep 1 unless ids.length == 1
|
135
|
+
end
|
227
136
|
rescue => e
|
228
137
|
Errors.global_error({error: e, caller: caller, data: [post_id]})
|
229
138
|
end
|
@@ -231,13 +140,18 @@ module Ayadn
|
|
231
140
|
|
232
141
|
def delete_m(args)
|
233
142
|
begin
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
143
|
+
abort(Status.error_missing_message_id) unless args.length >= 2
|
144
|
+
channel = args[0]
|
145
|
+
args.shift
|
146
|
+
ids = args.select {|message_id| message_id.is_integer?}
|
147
|
+
abort(Status.error_missing_message_id) if ids.empty?
|
148
|
+
channel_id = @workers.get_channel_id_from_alias(channel)
|
149
|
+
ids.each do |message_id|
|
150
|
+
print Status.deleting_message(message_id)
|
151
|
+
resp = @api.delete_message(channel_id, message_id)
|
152
|
+
Check.message_has_been_deleted(message_id, resp)
|
153
|
+
sleep 1 unless ids.length == 1
|
154
|
+
end
|
241
155
|
rescue => e
|
242
156
|
Errors.global_error({error: e, caller: caller, data: [message_id]})
|
243
157
|
end
|
@@ -245,12 +159,12 @@ module Ayadn
|
|
245
159
|
|
246
160
|
def unfollow(usernames)
|
247
161
|
begin
|
248
|
-
|
249
|
-
users = all_but_me(usernames)
|
162
|
+
Check.no_username(usernames)
|
163
|
+
users = @workers.all_but_me(usernames)
|
250
164
|
puts Status.unfollowing(users.join(','))
|
251
165
|
users.each do |user|
|
252
166
|
resp = @api.unfollow(user)
|
253
|
-
|
167
|
+
Check.has_been_unfollowed(user, resp)
|
254
168
|
sleep 1 unless users.length == 1
|
255
169
|
end
|
256
170
|
rescue => e
|
@@ -260,12 +174,12 @@ module Ayadn
|
|
260
174
|
|
261
175
|
def follow(usernames)
|
262
176
|
begin
|
263
|
-
|
264
|
-
users = all_but_me(usernames)
|
177
|
+
Check.no_username(usernames)
|
178
|
+
users = @workers.all_but_me(usernames)
|
265
179
|
puts Status.following(users.join(','))
|
266
180
|
users.each do |user|
|
267
181
|
resp = @api.follow(user)
|
268
|
-
|
182
|
+
Check.has_been_followed(user, resp)
|
269
183
|
sleep 1 unless users.length == 1
|
270
184
|
end
|
271
185
|
rescue => e
|
@@ -275,12 +189,12 @@ module Ayadn
|
|
275
189
|
|
276
190
|
def unmute(usernames)
|
277
191
|
begin
|
278
|
-
|
279
|
-
users = all_but_me(usernames)
|
192
|
+
Check.no_username(usernames)
|
193
|
+
users = @workers.all_but_me(usernames)
|
280
194
|
puts Status.unmuting(users.join(','))
|
281
195
|
users.each do |user|
|
282
196
|
resp = @api.unmute(user)
|
283
|
-
|
197
|
+
Check.has_been_unmuted(user, resp)
|
284
198
|
sleep 1 unless users.length == 1
|
285
199
|
end
|
286
200
|
rescue => e
|
@@ -290,12 +204,12 @@ module Ayadn
|
|
290
204
|
|
291
205
|
def mute(usernames)
|
292
206
|
begin
|
293
|
-
|
294
|
-
users = all_but_me(usernames)
|
207
|
+
Check.no_username(usernames)
|
208
|
+
users = @workers.all_but_me(usernames)
|
295
209
|
puts Status.muting(users.join(','))
|
296
210
|
users.each do |user|
|
297
211
|
resp = @api.mute(user)
|
298
|
-
|
212
|
+
Check.has_been_muted(user, resp)
|
299
213
|
sleep 1 unless users.length == 1
|
300
214
|
end
|
301
215
|
rescue => e
|
@@ -305,12 +219,12 @@ module Ayadn
|
|
305
219
|
|
306
220
|
def unblock(usernames)
|
307
221
|
begin
|
308
|
-
|
309
|
-
users = all_but_me(usernames)
|
222
|
+
Check.no_username(usernames)
|
223
|
+
users = @workers.all_but_me(usernames)
|
310
224
|
puts Status.unblocking(users.join(','))
|
311
225
|
users.each do |user|
|
312
226
|
resp = @api.unblock(user)
|
313
|
-
|
227
|
+
Check.has_been_unblocked(user, resp)
|
314
228
|
sleep 1 unless users.length == 1
|
315
229
|
end
|
316
230
|
rescue => e
|
@@ -320,12 +234,12 @@ module Ayadn
|
|
320
234
|
|
321
235
|
def block(usernames)
|
322
236
|
begin
|
323
|
-
|
324
|
-
users = all_but_me(usernames)
|
237
|
+
Check.no_username(usernames)
|
238
|
+
users = @workers.all_but_me(usernames)
|
325
239
|
puts Status.blocking(users.join(','))
|
326
240
|
users.each do |user|
|
327
241
|
resp = @api.block(user)
|
328
|
-
|
242
|
+
Check.has_been_blocked(user, resp)
|
329
243
|
sleep 1 unless users.length == 1
|
330
244
|
end
|
331
245
|
rescue => e
|
@@ -335,12 +249,12 @@ module Ayadn
|
|
335
249
|
|
336
250
|
def repost(post_id)
|
337
251
|
begin
|
338
|
-
|
252
|
+
Check.bad_post_id(post_id)
|
339
253
|
puts Status.reposting(post_id)
|
340
254
|
resp = @api.get_details(post_id)
|
341
|
-
|
342
|
-
id = get_original_id(post_id, resp)
|
343
|
-
|
255
|
+
Check.already_reposted(resp)
|
256
|
+
id = @workers.get_original_id(post_id, resp)
|
257
|
+
Check.has_been_reposted(id, @api.repost(id))
|
344
258
|
rescue => e
|
345
259
|
Errors.global_error({error: e, caller: caller, data: [post_id, id]})
|
346
260
|
end
|
@@ -348,10 +262,10 @@ module Ayadn
|
|
348
262
|
|
349
263
|
def unrepost(post_id)
|
350
264
|
begin
|
351
|
-
|
265
|
+
Check.bad_post_id(post_id)
|
352
266
|
puts Status.unreposting(post_id)
|
353
267
|
if @api.get_details(post_id)['data']['you_reposted']
|
354
|
-
|
268
|
+
Check.has_been_unreposted(post_id, @api.unrepost(post_id))
|
355
269
|
else
|
356
270
|
puts Status.not_your_repost
|
357
271
|
end
|
@@ -362,13 +276,13 @@ module Ayadn
|
|
362
276
|
|
363
277
|
def unstar(post_id)
|
364
278
|
begin
|
365
|
-
|
279
|
+
Check.bad_post_id(post_id)
|
366
280
|
puts Status.unstarring(post_id)
|
367
281
|
resp = @api.get_details(post_id)
|
368
|
-
id = get_original_id(post_id, resp)
|
282
|
+
id = @workers.get_original_id(post_id, resp)
|
369
283
|
resp = @api.get_details(id)
|
370
284
|
if resp['data']['you_starred']
|
371
|
-
|
285
|
+
Check.has_been_unstarred(id, @api.unstar(id))
|
372
286
|
else
|
373
287
|
puts Status.not_your_starred
|
374
288
|
end
|
@@ -379,12 +293,12 @@ module Ayadn
|
|
379
293
|
|
380
294
|
def star(post_id)
|
381
295
|
begin
|
382
|
-
|
296
|
+
Check.bad_post_id(post_id)
|
383
297
|
puts Status.starring(post_id)
|
384
298
|
resp = @api.get_details(post_id)
|
385
|
-
|
386
|
-
id = get_original_id(post_id, resp)
|
387
|
-
|
299
|
+
Check.already_starred(resp)
|
300
|
+
id = @workers.get_original_id(post_id, resp)
|
301
|
+
Check.has_been_starred(id, @api.star(id))
|
388
302
|
rescue => e
|
389
303
|
Errors.global_error({error: e, caller: caller, data: [post_id]})
|
390
304
|
end
|
@@ -392,14 +306,7 @@ module Ayadn
|
|
392
306
|
|
393
307
|
def hashtag(hashtag, options)
|
394
308
|
begin
|
395
|
-
|
396
|
-
stream = @api.get_hashtag(hashtag)
|
397
|
-
stop_if_no_data(stream, 'hashtag')
|
398
|
-
if options[:extract]
|
399
|
-
view_all_hashtag_links(stream, hashtag)
|
400
|
-
else
|
401
|
-
render_view(stream, options)
|
402
|
-
end
|
309
|
+
@search.hashtag(hashtag, options)
|
403
310
|
rescue => e
|
404
311
|
Errors.global_error({error: e, caller: caller, data: [hashtag, options]})
|
405
312
|
end
|
@@ -407,40 +314,7 @@ module Ayadn
|
|
407
314
|
|
408
315
|
def search(words, options)
|
409
316
|
begin
|
410
|
-
|
411
|
-
stream = if options[:users]
|
412
|
-
@api.search_users words, options
|
413
|
-
elsif options[:annotations]
|
414
|
-
@api.search_annotations words, options
|
415
|
-
elsif options[:channels]
|
416
|
-
splitted = splitter_all words
|
417
|
-
@api.search_channels splitted.join(','), options
|
418
|
-
elsif options[:messages]
|
419
|
-
words = words.split(',')
|
420
|
-
channel_id = get_channel_id_from_alias(words[0])
|
421
|
-
words.shift
|
422
|
-
splitted = splitter_all words.join(' ')
|
423
|
-
@api.search_messages channel_id, splitted.join(','), options
|
424
|
-
else
|
425
|
-
splitted = splitter_all words
|
426
|
-
@api.get_search splitted.join(','), options
|
427
|
-
end
|
428
|
-
stop_if_no_data(stream, 'search')
|
429
|
-
if options[:users]
|
430
|
-
stream['data'].sort_by! {|obj| obj['counts']['followers']}
|
431
|
-
stream['data'].each do |obj|
|
432
|
-
puts @view.big_separator
|
433
|
-
@view.show_userinfos(obj, nil, false)
|
434
|
-
end
|
435
|
-
elsif options[:channels]
|
436
|
-
@view.show_channels stream, options
|
437
|
-
else
|
438
|
-
if options[:extract]
|
439
|
-
view_all_search_links(stream, words)
|
440
|
-
else
|
441
|
-
render_view(stream, options)
|
442
|
-
end
|
443
|
-
end
|
317
|
+
@search.find(words, options)
|
444
318
|
rescue => e
|
445
319
|
Errors.global_error({error: e, caller: caller, data: [words, options]})
|
446
320
|
end
|
@@ -448,15 +322,7 @@ module Ayadn
|
|
448
322
|
|
449
323
|
def followings(username, options)
|
450
324
|
begin
|
451
|
-
|
452
|
-
username = add_arobase(username)
|
453
|
-
doing(options)
|
454
|
-
if_raw_list(username, :followings, options)
|
455
|
-
list = @api.get_followings(username)
|
456
|
-
auto_save_followings(list)
|
457
|
-
no_data('followings') if list.empty?
|
458
|
-
get_list(:followings, list, username)
|
459
|
-
Databases.add_to_users_db_from_list(list)
|
325
|
+
@stream.followings(username, options)
|
460
326
|
rescue => e
|
461
327
|
Errors.global_error({error: e, caller: caller, data: [username, options]})
|
462
328
|
end
|
@@ -464,15 +330,7 @@ module Ayadn
|
|
464
330
|
|
465
331
|
def followers(username, options)
|
466
332
|
begin
|
467
|
-
|
468
|
-
username = add_arobase(username)
|
469
|
-
doing(options)
|
470
|
-
if_raw_list(username, :followers, options)
|
471
|
-
list = @api.get_followers(username)
|
472
|
-
auto_save_followers(list)
|
473
|
-
no_data('followers') if list.empty?
|
474
|
-
get_list(:followers, list, username)
|
475
|
-
Databases.add_to_users_db_from_list(list)
|
333
|
+
@stream.followers(username, options)
|
476
334
|
rescue => e
|
477
335
|
Errors.global_error({error: e, caller: caller, data: [username, options]})
|
478
336
|
end
|
@@ -480,13 +338,7 @@ module Ayadn
|
|
480
338
|
|
481
339
|
def muted(options)
|
482
340
|
begin
|
483
|
-
|
484
|
-
if_raw_list(nil, :muted, options)
|
485
|
-
list = @api.get_muted
|
486
|
-
auto_save_muted(list)
|
487
|
-
no_data('muted') if list.empty?
|
488
|
-
get_list(:muted, list, nil)
|
489
|
-
Databases.add_to_users_db_from_list(list)
|
341
|
+
@stream.muted(options)
|
490
342
|
rescue => e
|
491
343
|
Errors.global_error({error: e, caller: caller, data: [options]})
|
492
344
|
end
|
@@ -494,12 +346,7 @@ module Ayadn
|
|
494
346
|
|
495
347
|
def blocked(options)
|
496
348
|
begin
|
497
|
-
|
498
|
-
if_raw_list(nil, :blocked, options)
|
499
|
-
list = @api.get_blocked
|
500
|
-
no_data('blocked') if list.empty?
|
501
|
-
get_list(:blocked, list, nil)
|
502
|
-
Databases.add_to_users_db_from_list(list)
|
349
|
+
@stream.blocked(options)
|
503
350
|
rescue => e
|
504
351
|
Errors.global_error({error: e, caller: caller, data: [options]})
|
505
352
|
end
|
@@ -515,18 +362,18 @@ module Ayadn
|
|
515
362
|
|
516
363
|
def userinfo(username, options)
|
517
364
|
begin
|
518
|
-
|
519
|
-
username = add_arobase(username)
|
520
|
-
|
365
|
+
Check.no_username(username)
|
366
|
+
username = @workers.add_arobase(username)
|
367
|
+
@view.downloading(options)
|
521
368
|
if options[:raw]
|
522
369
|
resp = @api.get_user(username)
|
523
370
|
@view.show_raw(resp, options)
|
524
371
|
exit
|
525
372
|
end
|
526
373
|
stream = @api.get_user(username)
|
527
|
-
|
528
|
-
same_username
|
529
|
-
|
374
|
+
Check.no_user(stream, username)
|
375
|
+
Check.same_username(stream) ? token = @api.get_token_info['data'] : token = nil
|
376
|
+
@view.infos(stream['data'], token)
|
530
377
|
rescue => e
|
531
378
|
Errors.global_error({error: e, caller: caller, data: [username, options]})
|
532
379
|
end
|
@@ -534,8 +381,8 @@ module Ayadn
|
|
534
381
|
|
535
382
|
def postinfo(post_id, options)
|
536
383
|
begin
|
537
|
-
|
538
|
-
|
384
|
+
Check.bad_post_id(post_id)
|
385
|
+
@view.downloading(options)
|
539
386
|
if options[:raw]
|
540
387
|
details = @api.get_details(post_id, options)
|
541
388
|
@view.show_raw(details, options)
|
@@ -543,10 +390,10 @@ module Ayadn
|
|
543
390
|
end
|
544
391
|
@view.clear_screen
|
545
392
|
response = @api.get_details(post_id, options)
|
546
|
-
|
393
|
+
Check.no_post(response, post_id)
|
547
394
|
resp = response['data']
|
548
395
|
response = @api.get_user("@#{resp['user']['username']}")
|
549
|
-
|
396
|
+
Check.no_user(response, response['data']['username'])
|
550
397
|
stream = response['data']
|
551
398
|
puts "POST:\n".inverse
|
552
399
|
@view.show_simple_post([resp], options)
|
@@ -568,14 +415,14 @@ module Ayadn
|
|
568
415
|
|
569
416
|
def files(options)
|
570
417
|
begin
|
571
|
-
|
418
|
+
@view.downloading(options)
|
572
419
|
if options[:raw]
|
573
420
|
@view.show_raw(@api.get_files_list(options), options)
|
574
421
|
exit
|
575
422
|
end
|
576
423
|
list = @api.get_files_list(options)
|
577
424
|
@view.clear_screen
|
578
|
-
list.empty? ? no_data('files') : @view.show_files_list(list)
|
425
|
+
list.empty? ? Errors.no_data('files') : @view.show_files_list(list)
|
579
426
|
rescue => e
|
580
427
|
Errors.global_error({error: e, caller: caller, data: [options]})
|
581
428
|
end
|
@@ -593,7 +440,7 @@ module Ayadn
|
|
593
440
|
|
594
441
|
def channels
|
595
442
|
begin
|
596
|
-
|
443
|
+
@view.downloading
|
597
444
|
resp = @api.get_channels
|
598
445
|
@view.clear_screen
|
599
446
|
@view.show_channels(resp)
|
@@ -604,15 +451,7 @@ module Ayadn
|
|
604
451
|
|
605
452
|
def messages(channel_id, options)
|
606
453
|
begin
|
607
|
-
channel_id
|
608
|
-
doing(options)
|
609
|
-
resp = @api.get_messages(channel_id, options)
|
610
|
-
stop_if_no_new_posts(resp, options, "channel:#{channel_id}")
|
611
|
-
Databases.save_max_id(resp)
|
612
|
-
if_raw_show(resp, options)
|
613
|
-
stop_if_no_data(resp, 'messages')
|
614
|
-
render_view(resp, options)
|
615
|
-
Scroll.new(@api, @view).messages(channel_id, options) if options[:scroll]
|
454
|
+
@stream.messages(channel_id, options)
|
616
455
|
rescue => e
|
617
456
|
Errors.global_error({error: e, caller: caller, data: [channel_id, options]})
|
618
457
|
end
|
@@ -622,11 +461,11 @@ module Ayadn
|
|
622
461
|
require 'pinboard'
|
623
462
|
require 'base64'
|
624
463
|
begin
|
625
|
-
|
626
|
-
|
627
|
-
resp =
|
464
|
+
Check.bad_post_id(post_id)
|
465
|
+
@view.downloading
|
466
|
+
resp = @api.get_details(post_id)['data']
|
628
467
|
@view.clear_screen
|
629
|
-
links =
|
468
|
+
links = @workers.extract_links(resp)
|
630
469
|
resp['text'].nil? ? text = "" : text = resp['text']
|
631
470
|
usertags << "ADN"
|
632
471
|
handle = "@" + resp['user']['username']
|
@@ -710,8 +549,8 @@ module Ayadn
|
|
710
549
|
def pmess(username, options = {})
|
711
550
|
begin
|
712
551
|
files = FileOps.make_paths(options['embed']) if options['embed']
|
713
|
-
|
714
|
-
username = [add_arobase(username)]
|
552
|
+
Check.no_username(username)
|
553
|
+
username = [@workers.add_arobase(username)]
|
715
554
|
messenger = Post.new
|
716
555
|
puts Status.message_from(username)
|
717
556
|
puts Status.message
|
@@ -728,7 +567,7 @@ module Ayadn
|
|
728
567
|
end
|
729
568
|
FileOps.save_message(resp) if Settings.options[:backup][:auto_save_sent_messages]
|
730
569
|
@view.clear_screen
|
731
|
-
puts Status.yourmessage
|
570
|
+
puts Status.yourmessage(username[0])
|
732
571
|
@view.show_posted(resp)
|
733
572
|
rescue => e
|
734
573
|
Errors.global_error({error: e, caller: caller, data: [username, options]})
|
@@ -737,7 +576,7 @@ module Ayadn
|
|
737
576
|
|
738
577
|
def send_to_channel(channel_id)
|
739
578
|
begin
|
740
|
-
channel_id = get_channel_id_from_alias(channel_id)
|
579
|
+
channel_id = @workers.get_channel_id_from_alias(channel_id)
|
741
580
|
messenger = Post.new
|
742
581
|
puts Status.writing
|
743
582
|
puts Status.post
|
@@ -758,15 +597,15 @@ module Ayadn
|
|
758
597
|
def reply(post_id, options = {})
|
759
598
|
begin
|
760
599
|
files = FileOps.make_paths(options['embed']) if options['embed']
|
761
|
-
post_id = get_real_post_id(post_id)
|
600
|
+
post_id = @workers.get_real_post_id(post_id)
|
762
601
|
puts Status.replying_to(post_id)
|
763
602
|
replied_to = @api.get_details(post_id)
|
764
|
-
|
765
|
-
post_id = get_original_id(post_id, replied_to)
|
603
|
+
Check.no_post(replied_to, post_id)
|
604
|
+
post_id = @workers.get_original_id(post_id, replied_to)
|
766
605
|
if replied_to['data']['repost_of']
|
767
606
|
if post_id == replied_to['data']['repost_of']['id']
|
768
607
|
replied_to = @api.get_details(post_id)
|
769
|
-
|
608
|
+
Check.no_post(replied_to, post_id)
|
770
609
|
end
|
771
610
|
end
|
772
611
|
poster = Post.new
|
@@ -775,7 +614,7 @@ module Ayadn
|
|
775
614
|
lines_array = poster.compose
|
776
615
|
poster.check_post_length(lines_array)
|
777
616
|
@view.clear_screen
|
778
|
-
reply = poster.reply(lines_array.join("\n"),
|
617
|
+
reply = poster.reply(lines_array.join("\n"), @workers.build_posts([replied_to['data']]))
|
779
618
|
if options['embed']
|
780
619
|
puts Status.uploading(options['embed'])
|
781
620
|
resp = poster.send_reply_embedded(reply, post_id, files)
|
@@ -793,613 +632,65 @@ module Ayadn
|
|
793
632
|
end
|
794
633
|
options[:post_id] = resp['data']['id'].to_i
|
795
634
|
|
796
|
-
|
635
|
+
@view.render(@api.get_convo(post_id), options)
|
797
636
|
rescue => e
|
798
637
|
Errors.global_error({error: e, caller: caller, data: [post_id, options]})
|
799
638
|
end
|
800
639
|
end
|
801
640
|
|
802
641
|
def nowplaying(options = {})
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
def random_posts(options)
|
807
|
-
begin
|
808
|
-
_, cols = winsize
|
809
|
-
max_posts = cols / 12
|
810
|
-
@view.clear_screen
|
811
|
-
puts "Fetching random posts, please wait...".color(:cyan)
|
812
|
-
@max_id = @api.get_global({count: 1})['meta']['max_id'].to_i
|
813
|
-
@view.clear_screen
|
814
|
-
counter = 1
|
815
|
-
wait = options[:wait] || 5
|
816
|
-
loop do
|
817
|
-
begin
|
818
|
-
@random_post_id = rand(@max_id)
|
819
|
-
@resp = @api.get_details(@random_post_id, {})
|
820
|
-
next if @resp['data']['is_deleted']
|
821
|
-
@view.show_simple_post([@resp['data']], {})
|
822
|
-
counter += 1
|
823
|
-
if counter == max_posts
|
824
|
-
countdown(wait)
|
825
|
-
@view.clear_screen
|
826
|
-
counter = 1
|
827
|
-
end
|
828
|
-
rescue Interrupt
|
829
|
-
abort(Status.canceled)
|
830
|
-
end
|
831
|
-
end
|
832
|
-
rescue => e
|
833
|
-
Errors.global_error({error: e, caller: caller, data: [@max_id, @random_post_id, @resp, options]})
|
834
|
-
end
|
835
|
-
end
|
836
|
-
|
837
|
-
def version
|
838
|
-
begin
|
839
|
-
puts "\nAYADN\n".color(:red)
|
840
|
-
puts "Version:\t".color(:cyan) + "#{VERSION}\n".color(:green)
|
841
|
-
puts "Changelog:\t".color(:cyan) + "https://github.com/ericdke/na/blob/master/CHANGELOG.md\n".color(Settings.options[:colors][:link])
|
842
|
-
puts "Docs:\t\t".color(:cyan) + "http://ayadn-app.net/doc/".color(Settings.options[:colors][:link])
|
843
|
-
puts "\n"
|
844
|
-
rescue => e
|
845
|
-
Errors.global_error({error: e, caller: caller, data: []})
|
846
|
-
end
|
847
|
-
end
|
848
|
-
|
849
|
-
private
|
850
|
-
|
851
|
-
def if_raw_list username, what, options
|
852
|
-
if options[:raw]
|
853
|
-
@view.show_raw(@api.get_raw_list(username, what), options)
|
854
|
-
exit
|
855
|
-
end
|
856
|
-
end
|
857
|
-
|
858
|
-
def if_raw_show what, options
|
859
|
-
if options[:raw]
|
860
|
-
@view.show_raw(what, options)
|
861
|
-
exit
|
862
|
-
end
|
642
|
+
np = NowPlaying.new(@api, @view, @workers)
|
643
|
+
options['lastfm'] ? np.lastfm(options) : np.itunes(options)
|
863
644
|
end
|
864
645
|
|
865
|
-
def
|
866
|
-
all_but_me = usernames.select {|user| user != 'me'}
|
867
|
-
Workers.at(all_but_me)
|
868
|
-
end
|
869
|
-
|
870
|
-
def np_lastfm options
|
871
|
-
require 'rss'
|
646
|
+
def nowwatching(args, options = {})
|
872
647
|
begin
|
873
|
-
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
text_to_post = "#nowplaying\n \nTitle: ‘#{track}’\nArtist: #{artist}"
|
879
|
-
post_nowplaying(text_to_post, store, options)
|
648
|
+
abort(Status.error_missing_title) if args.empty?
|
649
|
+
nw = NowWatching.new(@view)
|
650
|
+
nw.post(args, options)
|
651
|
+
rescue ArgumentError => e
|
652
|
+
puts Status.no_movie
|
880
653
|
rescue => e
|
881
654
|
puts Status.wtf
|
882
|
-
Errors.global_error({error: e, caller: caller, data: [
|
883
|
-
end
|
884
|
-
end
|
885
|
-
|
886
|
-
def get_lastfm_track_infos user
|
887
|
-
begin
|
888
|
-
url = "http://ws.audioscrobbler.com/2.0/user/#{user}/recenttracks.rss"
|
889
|
-
feed = RSS::Parser.parse(CNX.download(url))
|
890
|
-
lfm = feed.items[0].title.split(' – ')
|
891
|
-
return lfm[0], lfm[1]
|
892
|
-
rescue Interrupt
|
893
|
-
abort(Status.canceled)
|
894
|
-
end
|
895
|
-
end
|
896
|
-
|
897
|
-
def np_itunes options
|
898
|
-
begin
|
899
|
-
abort(Status.error_only_osx) unless Settings.config[:platform] =~ /darwin/
|
900
|
-
puts Status.fetching_from('iTunes')
|
901
|
-
itunes = get_itunes_track_infos()
|
902
|
-
itunes.each {|el| abort(Status.empty_fields) if el.length == 0}
|
903
|
-
puts Status.itunes_store
|
904
|
-
store = itunes_istore_request(itunes) unless options['no_url']
|
905
|
-
text_to_post = "#nowplaying\n \nTitle: ‘#{itunes.track}’\nArtist: #{itunes.artist}\nfrom ‘#{itunes.album}’"
|
906
|
-
post_nowplaying(text_to_post, store, options)
|
907
|
-
rescue => e
|
908
|
-
puts Status.wtf
|
909
|
-
Errors.global_error({error: e, caller: caller, data: [itunes, store, options]})
|
655
|
+
Errors.global_error({error: e, caller: caller, data: [args, options]})
|
910
656
|
end
|
911
657
|
end
|
912
658
|
|
913
|
-
def
|
659
|
+
def tvshow(args, options = {})
|
914
660
|
begin
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
text_to_post += "\n \n[iTunes Store](#{store['link']})"
|
920
|
-
end
|
921
|
-
abort(Status.canceled) unless STDIN.getch == ("y" || "Y")
|
922
|
-
puts "\n#{Status.yourpost}"
|
923
|
-
unless store.nil? || options['no_url']
|
924
|
-
visible, track, artwork, artwork_thumb, link, artist = true, store['track'], store['artwork'], store['artwork_thumb'], store['link'], store['artist']
|
925
|
-
else
|
926
|
-
visible, track, artwork, artwork_thumb, link, artist = false
|
927
|
-
end
|
928
|
-
if options['lastfm']
|
929
|
-
source = 'Last.fm'
|
661
|
+
abort(Status.error_missing_title) if args.empty?
|
662
|
+
client = TvShow.new
|
663
|
+
if options['alt']
|
664
|
+
show_obj = client.find_alt(args.join(' '))
|
930
665
|
else
|
931
|
-
|
666
|
+
show_obj = client.find(args.join(' '))
|
932
667
|
end
|
933
|
-
|
934
|
-
|
935
|
-
'title' => track,
|
936
|
-
'artist' => artist,
|
937
|
-
'artwork' => artwork,
|
938
|
-
'artwork_thumb' => artwork_thumb,
|
939
|
-
'width' => 1200,
|
940
|
-
'height' => 1200,
|
941
|
-
'width_thumb' => 200,
|
942
|
-
'height_thumb' => 200,
|
943
|
-
'link' => link,
|
944
|
-
'source' => source,
|
945
|
-
'visible' => visible
|
946
|
-
}
|
947
|
-
@view.show_posted(Post.new.send_nowplaying(dic))
|
668
|
+
candidate = client.create_details(show_obj)
|
669
|
+
candidate.ok ? candidate.post(options) : candidate.cancel
|
948
670
|
rescue => e
|
949
671
|
puts Status.wtf
|
950
|
-
Errors.global_error({error: e, caller: caller, data: [
|
672
|
+
Errors.global_error({error: e, caller: caller, data: [args, options]})
|
951
673
|
end
|
952
674
|
end
|
953
675
|
|
954
|
-
def
|
955
|
-
puts "\nPlease enter your Last.fm username:\n".color(:cyan)
|
676
|
+
def random_posts(options)
|
956
677
|
begin
|
957
|
-
|
958
|
-
rescue
|
959
|
-
|
960
|
-
end
|
961
|
-
end
|
962
|
-
|
963
|
-
def create_lastfm_user
|
964
|
-
Settings.options[:nowplaying][:lastfm] = ask_lastfm_user()
|
965
|
-
Settings.save_config
|
966
|
-
return Settings.options[:nowplaying][:lastfm]
|
967
|
-
end
|
968
|
-
|
969
|
-
def itunes_istore_request itunes
|
970
|
-
infos = itunes_reg([itunes.artist, itunes.track, itunes.album])
|
971
|
-
itunes_url = "https://itunes.apple.com/search?term=#{infos[0]}&term=#{infos[1]}&term=#{infos[2]}&media=music&entity=musicTrack"
|
972
|
-
get_itunes_store(itunes_url, itunes.artist, itunes.track)
|
973
|
-
end
|
974
|
-
|
975
|
-
def lastfm_istore_request artist, track
|
976
|
-
infos = itunes_reg([artist, track])
|
977
|
-
itunes_url = "https://itunes.apple.com/search?term=#{infos[0]}&term=#{infos[1]}&media=music&entity=musicTrack"
|
978
|
-
get_itunes_store(itunes_url, artist, track)
|
979
|
-
end
|
980
|
-
|
981
|
-
def get_itunes_store url, artist, track
|
982
|
-
results = JSON.load(CNX.download(URI.escape(url)))['results']
|
983
|
-
unless results.empty? || results.nil?
|
984
|
-
|
985
|
-
resp = results.select {|obj| obj['artistName'] == artist && obj['trackName'] == track}
|
986
|
-
candidate = resp[0] || results[0]
|
987
|
-
|
988
|
-
return {
|
989
|
-
'code' => 200,
|
990
|
-
'artist' => candidate['artistName'],
|
991
|
-
'track' => candidate['trackName'],
|
992
|
-
'preview' => candidate['previewUrl'],
|
993
|
-
'link' => candidate['collectionViewUrl'],
|
994
|
-
'artwork' => candidate['artworkUrl100'].gsub('100x100', '1200x1200'),
|
995
|
-
'artwork_thumb' => candidate['artworkUrl100'].gsub('100x100', '600x600'),
|
996
|
-
'request' => url,
|
997
|
-
'results' => results
|
998
|
-
}
|
999
|
-
else
|
1000
|
-
return {
|
1001
|
-
'code' => 404,
|
1002
|
-
'request' => url
|
1003
|
-
}
|
1004
|
-
end
|
1005
|
-
end
|
1006
|
-
|
1007
|
-
def itunes_reg arr_of_itunes
|
1008
|
-
regex_exotics = /[~:-;,?!\'&`^=+<>*%()\/"“”’°£$€.…]/
|
1009
|
-
arr_of_itunes.map do |itune|
|
1010
|
-
itune.gsub(regex_exotics, ' ').split(' ').join('+')
|
1011
|
-
end
|
1012
|
-
end
|
1013
|
-
|
1014
|
-
def get_itunes_track_infos
|
1015
|
-
track = `osascript -e 'tell application "iTunes"' -e 'set trackName to name of current track' -e 'return trackName' -e 'end tell'`
|
1016
|
-
if track.empty?
|
1017
|
-
puts Status.no_itunes
|
1018
|
-
Errors.warn "Nowplaying canceled: unable to get info from iTunes."
|
1019
|
-
exit
|
1020
|
-
end
|
1021
|
-
album = `osascript -e 'tell application "iTunes"' -e 'set trackAlbum to album of current track' -e 'return trackAlbum' -e 'end tell'`
|
1022
|
-
artist = `osascript -e 'tell application "iTunes"' -e 'set trackArtist to artist of current track' -e 'return trackArtist' -e 'end tell'`
|
1023
|
-
maker = Struct.new(:artist, :album, :track)
|
1024
|
-
maker.new(artist.chomp!, album.chomp!, track.chomp!)
|
1025
|
-
end
|
1026
|
-
|
1027
|
-
def show_nowplaying(text, options, store)
|
1028
|
-
puts "\nYour post:\n".color(:cyan)
|
1029
|
-
if options['no_url'] || store['code'] != 200
|
1030
|
-
puts text + "\n\n\n"
|
1031
|
-
else
|
1032
|
-
puts text + "\n\n\nThe iTunes Store thinks this track is: ".color(:green) + "'#{store['track']}'".color(:magenta) + " by ".color(:green) + "'#{store['artist']}'".color(:magenta) + ".\n\nAyadn will use these elements to insert album artwork and a link to the track.\n\n".color(:green)
|
1033
|
-
end
|
1034
|
-
puts "Is it ok? (y/N) ".color(:yellow)
|
1035
|
-
end
|
1036
|
-
|
1037
|
-
def nicerank_true
|
1038
|
-
return true if Settings.options[:nicerank][:filter] == true
|
1039
|
-
end
|
1040
|
-
|
1041
|
-
def stop_if_bad_post_id post_id
|
1042
|
-
missing_post_id() unless post_id.is_integer?
|
1043
|
-
end
|
1044
|
-
|
1045
|
-
def stop_if_no_data stream, target
|
1046
|
-
if stream['data'].empty?
|
1047
|
-
Errors.warn "In action/#{target}: no data"
|
1048
|
-
abort(Status.empty_list)
|
1049
|
-
end
|
1050
|
-
end
|
1051
|
-
|
1052
|
-
def stop_if_404 stream, post_id
|
1053
|
-
if stream['meta']['code'] == 404
|
1054
|
-
abort(Status.post_404(post_id))
|
1055
|
-
end
|
1056
|
-
end
|
1057
|
-
|
1058
|
-
def add_arobase username
|
1059
|
-
Workers.add_arobase_if_missing(username)
|
1060
|
-
end
|
1061
|
-
|
1062
|
-
def stop_if_no_new_posts stream, options, title
|
1063
|
-
if options[:new]
|
1064
|
-
unless Databases.has_new?(stream, title)
|
1065
|
-
no_new_posts()
|
1066
|
-
end
|
1067
|
-
end
|
1068
|
-
end
|
1069
|
-
|
1070
|
-
def splitter_all words
|
1071
|
-
[words].collect {|w| w.split(' ')}
|
1072
|
-
end
|
1073
|
-
|
1074
|
-
def get_original_id(post_id, resp)
|
1075
|
-
if resp['data']['repost_of']
|
1076
|
-
puts Status.redirecting
|
1077
|
-
id = resp['data']['repost_of']['id']
|
1078
|
-
Errors.repost(post_id, id)
|
1079
|
-
return id
|
1080
|
-
else
|
1081
|
-
return post_id
|
1082
|
-
end
|
1083
|
-
end
|
1084
|
-
|
1085
|
-
def check_if_already_starred(resp)
|
1086
|
-
if resp['data']['you_starred']
|
1087
|
-
puts "\nYou already starred this post.\n".color(:red)
|
1088
|
-
exit
|
1089
|
-
end
|
1090
|
-
end
|
1091
|
-
|
1092
|
-
def check_if_already_reposted(resp)
|
1093
|
-
if resp['data']['you_reposted']
|
1094
|
-
puts "\nYou already reposted this post.\n".color(:red)
|
1095
|
-
exit
|
1096
|
-
end
|
1097
|
-
end
|
1098
|
-
|
1099
|
-
def check_has_been_starred(post_id, resp)
|
1100
|
-
if resp['meta']['code'] == 200
|
1101
|
-
puts Status.starred(post_id)
|
1102
|
-
Logs.rec.info "Starred #{post_id}."
|
1103
|
-
else
|
1104
|
-
whine(Status.not_starred(post_id), resp)
|
1105
|
-
end
|
1106
|
-
end
|
1107
|
-
|
1108
|
-
def check_has_been_reposted(post_id, resp)
|
1109
|
-
if resp['meta']['code'] == 200
|
1110
|
-
puts Status.reposted(post_id)
|
1111
|
-
Logs.rec.info "Reposted #{post_id}."
|
1112
|
-
else
|
1113
|
-
whine(Status.not_reposted(post_id), resp)
|
1114
|
-
end
|
1115
|
-
end
|
1116
|
-
|
1117
|
-
def check_has_been_blocked(username, resp)
|
1118
|
-
if resp['meta']['code'] == 200
|
1119
|
-
puts Status.blocked(username)
|
1120
|
-
Logs.rec.info "Blocked #{username}."
|
1121
|
-
else
|
1122
|
-
whine(Status.not_blocked(username), resp)
|
1123
|
-
end
|
1124
|
-
end
|
1125
|
-
|
1126
|
-
def check_has_been_muted(username, resp)
|
1127
|
-
if resp['meta']['code'] == 200
|
1128
|
-
puts Status.muted(username)
|
1129
|
-
Logs.rec.info "Muted #{username}."
|
1130
|
-
else
|
1131
|
-
whine(Status.not_muted(username), resp)
|
1132
|
-
end
|
1133
|
-
end
|
1134
|
-
|
1135
|
-
def check_has_been_followed(username, resp)
|
1136
|
-
if resp['meta']['code'] == 200
|
1137
|
-
puts Status.followed(username)
|
1138
|
-
Logs.rec.info "Followed #{username}."
|
1139
|
-
else
|
1140
|
-
whine(Status.not_followed(username), resp)
|
1141
|
-
end
|
1142
|
-
end
|
1143
|
-
|
1144
|
-
def check_has_been_deleted(post_id, resp)
|
1145
|
-
if resp['meta']['code'] == 200
|
1146
|
-
puts Status.deleted(post_id)
|
1147
|
-
Logs.rec.info "Deleted post #{post_id}."
|
1148
|
-
else
|
1149
|
-
whine(Status.not_deleted(post_id), resp)
|
1150
|
-
end
|
1151
|
-
end
|
1152
|
-
|
1153
|
-
def check_message_has_been_deleted(message_id, resp)
|
1154
|
-
if resp['meta']['code'] == 200
|
1155
|
-
puts Status.deleted_m(message_id)
|
1156
|
-
Logs.rec.info "Deleted message #{message_id}."
|
1157
|
-
else
|
1158
|
-
whine(Status.not_deleted(message_id), resp)
|
1159
|
-
end
|
1160
|
-
end
|
1161
|
-
|
1162
|
-
def check_has_been_unblocked(username, resp)
|
1163
|
-
if resp['meta']['code'] == 200
|
1164
|
-
puts Status.unblocked(username)
|
1165
|
-
Logs.rec.info "Unblocked #{username}."
|
1166
|
-
else
|
1167
|
-
whine(Status.not_unblocked(username), resp)
|
1168
|
-
end
|
1169
|
-
end
|
1170
|
-
|
1171
|
-
def check_has_been_unstarred(post_id, resp)
|
1172
|
-
if resp['meta']['code'] == 200
|
1173
|
-
puts Status.unstarred(post_id)
|
1174
|
-
Logs.rec.info "Unstarred #{post_id}."
|
1175
|
-
else
|
1176
|
-
whine(Status.not_unstarred(post_id), resp)
|
1177
|
-
end
|
1178
|
-
end
|
1179
|
-
|
1180
|
-
def check_has_been_unreposted(post_id, resp)
|
1181
|
-
if resp['meta']['code'] == 200
|
1182
|
-
puts Status.unreposted(post_id)
|
1183
|
-
Logs.rec.info "Unreposted #{post_id}."
|
1184
|
-
else
|
1185
|
-
whine(Status.not_unreposted(post_id), resp)
|
1186
|
-
end
|
1187
|
-
end
|
1188
|
-
|
1189
|
-
def check_has_been_unmuted(username, resp)
|
1190
|
-
if resp['meta']['code'] == 200
|
1191
|
-
puts Status.unmuted(username)
|
1192
|
-
Logs.rec.info "Unmuted #{username}."
|
1193
|
-
else
|
1194
|
-
whine(Status.not_unmuted(username), resp)
|
1195
|
-
end
|
1196
|
-
end
|
1197
|
-
|
1198
|
-
def check_has_been_unfollowed(username, resp)
|
1199
|
-
if resp['meta']['code'] == 200
|
1200
|
-
puts Status.unfollowed(username)
|
1201
|
-
Logs.rec.info "Unfollowed #{username}."
|
1202
|
-
else
|
1203
|
-
whine(Status.not_unfollowed(username), resp)
|
1204
|
-
end
|
1205
|
-
end
|
1206
|
-
|
1207
|
-
def whine(status, resp)
|
1208
|
-
puts status
|
1209
|
-
Errors.error("#{status} => #{resp['meta']}")
|
1210
|
-
end
|
1211
|
-
|
1212
|
-
def no_data(where)
|
1213
|
-
Errors.warn "In action/#{where}: no data"
|
1214
|
-
abort(Status.empty_list)
|
1215
|
-
end
|
1216
|
-
|
1217
|
-
def stop_if_no_user stream, username
|
1218
|
-
if stream['meta']['code'] == 404
|
1219
|
-
puts Status.user_404(username)
|
1220
|
-
Errors.info("User #{username} doesn't exist")
|
1221
|
-
exit
|
1222
|
-
end
|
1223
|
-
end
|
1224
|
-
|
1225
|
-
def stop_if_no_post stream, post_id
|
1226
|
-
if stream['meta']['code'] == 404
|
1227
|
-
puts Status.post_404(post_id)
|
1228
|
-
Errors.info("Impossible to find #{post_id}")
|
1229
|
-
exit
|
1230
|
-
end
|
1231
|
-
end
|
1232
|
-
|
1233
|
-
def length_of_index
|
1234
|
-
Databases.get_index_length
|
1235
|
-
end
|
1236
|
-
|
1237
|
-
def get_post_from_index id
|
1238
|
-
Databases.get_post_from_index id
|
1239
|
-
end
|
1240
|
-
|
1241
|
-
def get_real_post_id post_id
|
1242
|
-
id = post_id.to_i
|
1243
|
-
if id > 0 && id <= length_of_index
|
1244
|
-
resp = get_post_from_index(id)
|
1245
|
-
post_id = resp[:id]
|
1246
|
-
end
|
1247
|
-
post_id
|
1248
|
-
end
|
1249
|
-
|
1250
|
-
def render_view(stream, options = {}, niceranks = {})
|
1251
|
-
unless options[:raw]
|
1252
|
-
get_view(stream['data'], options, niceranks)
|
1253
|
-
else
|
1254
|
-
@view.show_raw(stream)
|
1255
|
-
end
|
1256
|
-
end
|
1257
|
-
|
1258
|
-
def doing(options = {})
|
1259
|
-
unless options[:raw]
|
1260
|
-
@view.clear_screen
|
1261
|
-
print Status.downloading
|
1262
|
-
end
|
1263
|
-
end
|
1264
|
-
|
1265
|
-
def get_data_from_response(response)
|
1266
|
-
response['data']
|
1267
|
-
end
|
1268
|
-
|
1269
|
-
def get_view(stream, options = {}, niceranks = {})
|
1270
|
-
@view.clear_screen
|
1271
|
-
if options[:index]
|
1272
|
-
@view.show_posts_with_index(stream, options, niceranks)
|
1273
|
-
else
|
1274
|
-
@view.show_posts(stream, options, niceranks)
|
1275
|
-
end
|
1276
|
-
end
|
1277
|
-
|
1278
|
-
def get_simple_view(stream)
|
1279
|
-
@view.clear_screen
|
1280
|
-
@view.show_simple_stream(stream)
|
1281
|
-
end
|
1282
|
-
|
1283
|
-
def get_infos(stream, token)
|
1284
|
-
@view.clear_screen
|
1285
|
-
@view.show_userinfos(stream, token, true)
|
1286
|
-
end
|
1287
|
-
|
1288
|
-
def get_list(what, list, target)
|
1289
|
-
@view.clear_screen
|
1290
|
-
case what
|
1291
|
-
when :whoreposted
|
1292
|
-
@view.show_list_reposted(list, target)
|
1293
|
-
when :whostarred
|
1294
|
-
@view.show_list_starred(list, target)
|
1295
|
-
when :followings
|
1296
|
-
@view.show_list_followings(list, target)
|
1297
|
-
when :followers
|
1298
|
-
@view.show_list_followers(list, target)
|
1299
|
-
when :muted
|
1300
|
-
@view.show_list_muted(list)
|
1301
|
-
when :blocked
|
1302
|
-
@view.show_list_blocked(list)
|
1303
|
-
end
|
1304
|
-
end
|
1305
|
-
|
1306
|
-
def get_channel_id_from_alias(channel_id)
|
1307
|
-
unless channel_id.is_integer?
|
1308
|
-
orig = channel_id
|
1309
|
-
channel_id = Databases.get_channel_id(orig)
|
1310
|
-
if channel_id.nil?
|
1311
|
-
Errors.warn("Alias '#{orig}' doesn't exist.")
|
1312
|
-
puts Status.no_alias
|
1313
|
-
exit
|
1314
|
-
end
|
1315
|
-
end
|
1316
|
-
channel_id
|
1317
|
-
end
|
1318
|
-
|
1319
|
-
def winsize
|
1320
|
-
IO.console.winsize
|
1321
|
-
end
|
1322
|
-
|
1323
|
-
def no_new_posts
|
1324
|
-
@view.clear_screen
|
1325
|
-
puts Status.no_new_posts
|
1326
|
-
exit
|
1327
|
-
end
|
1328
|
-
|
1329
|
-
def stop_if_no_username username
|
1330
|
-
if username.empty?
|
1331
|
-
puts Status.error_missing_username
|
1332
|
-
exit
|
1333
|
-
end
|
1334
|
-
end
|
1335
|
-
|
1336
|
-
def missing_post_id
|
1337
|
-
puts Status.error_missing_post_id
|
1338
|
-
exit
|
1339
|
-
end
|
1340
|
-
|
1341
|
-
def missing_message_id
|
1342
|
-
puts Status.error_missing_message_id
|
1343
|
-
exit
|
1344
|
-
end
|
1345
|
-
|
1346
|
-
def auto_save_followings(list)
|
1347
|
-
FileOps.save_followings_list(list) if Settings.options[:backup][:auto_save_lists]
|
1348
|
-
end
|
1349
|
-
def auto_save_followers(list)
|
1350
|
-
FileOps.save_followers_list(list) if Settings.options[:backup][:auto_save_lists]
|
1351
|
-
end
|
1352
|
-
def auto_save_muted(list)
|
1353
|
-
FileOps.save_muted_list(list) if Settings.options[:backup][:auto_save_lists]
|
1354
|
-
end
|
1355
|
-
|
1356
|
-
def same_username?(stream)
|
1357
|
-
stream['data']['username'] == Settings.config[:identity][:username]
|
1358
|
-
end
|
1359
|
-
|
1360
|
-
def countdown(wait)
|
1361
|
-
wait.downto(1) do |i|
|
1362
|
-
print "\r#{sprintf("%02d", i)} sec... QUIT WITH [CTRL+C]".color(:cyan)
|
1363
|
-
sleep 1
|
678
|
+
@stream.random_posts(options)
|
679
|
+
rescue => e
|
680
|
+
Errors.global_error({error: e, caller: caller, data: [@max_id, @random_post_id, @resp, options]})
|
1364
681
|
end
|
1365
682
|
end
|
1366
683
|
|
1367
|
-
def
|
1368
|
-
|
1369
|
-
|
1370
|
-
|
1371
|
-
|
1372
|
-
|
684
|
+
def version
|
685
|
+
begin
|
686
|
+
puts "\nAYADN\n".color(:red)
|
687
|
+
puts "Version:\t".color(:cyan) + "#{VERSION}\n".color(:green)
|
688
|
+
puts "Changelog:\t".color(:cyan) + "https://github.com/ericdke/na/blob/master/CHANGELOG.md\n".color(Settings.options[:colors][:link])
|
689
|
+
puts "Docs:\t\t".color(:cyan) + "https://github.com/ericdke/na/tree/master/doc".color(Settings.options[:colors][:link])
|
690
|
+
puts "\n"
|
691
|
+
rescue => e
|
692
|
+
Errors.global_error({error: e, caller: caller, data: []})
|
1373
693
|
end
|
1374
|
-
links.uniq!
|
1375
|
-
links
|
1376
|
-
end
|
1377
|
-
|
1378
|
-
def show_links(links)
|
1379
|
-
links.each {|l| puts "#{l}\n".color(Settings.options[:colors][:link])}
|
1380
|
-
end
|
1381
|
-
|
1382
|
-
def view_all_hashtag_links(stream, hashtag)
|
1383
|
-
@view.clear_screen
|
1384
|
-
puts "Links from posts containing hashtag '##{hashtag}': \n".color(:cyan)
|
1385
|
-
show_links(links_from_posts(stream))
|
1386
|
-
end
|
1387
|
-
|
1388
|
-
def view_all_search_links(stream, words)
|
1389
|
-
@view.clear_screen
|
1390
|
-
puts "Links from posts containing word(s) '#{words}': \n".color(:cyan)
|
1391
|
-
show_links(links_from_posts(stream))
|
1392
|
-
end
|
1393
|
-
|
1394
|
-
def view_all_stars_links(stream)
|
1395
|
-
@view.clear_screen
|
1396
|
-
puts "Links from your starred posts: \n".color(:cyan)
|
1397
|
-
show_links(links_from_posts(stream))
|
1398
|
-
end
|
1399
|
-
|
1400
|
-
def self.quit msg
|
1401
|
-
puts msg
|
1402
|
-
exit
|
1403
694
|
end
|
1404
695
|
|
1405
696
|
end
|