ayadn 1.8.2 → 2.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/.gitignore +4 -0
- data/CHANGELOG.md +73 -52
- data/README.md +17 -3
- data/ayadn.gemspec +3 -4
- data/doc/01-index.md +6 -5
- data/doc/02-install.md +23 -1
- data/doc/03-first-steps.md +22 -28
- data/doc/04-options.md +1 -1
- data/doc/05-streams.md +29 -9
- data/doc/06-post.md +13 -5
- data/doc/07-actions.md +63 -1
- data/doc/08-listings.md +112 -4
- data/doc/09-accounts.md +17 -3
- data/doc/10-nicerank.md +5 -5
- data/doc/11-blacklist.md +8 -14
- data/doc/12-alias.md +1 -13
- data/doc/14-set.md +8 -110
- data/doc/15-nowplaying.md +16 -4
- data/doc/18-contact.md +14 -13
- data/doc/19-examples.md +2 -0
- data/lib/ayadn/action.rb +322 -183
- data/lib/ayadn/alias.rb +17 -45
- data/lib/ayadn/annotations.rb +1 -1
- data/lib/ayadn/api.rb +7 -8
- data/lib/ayadn/app.rb +99 -12
- data/lib/ayadn/authorize.rb +92 -57
- data/lib/ayadn/blacklist.rb +52 -62
- data/lib/ayadn/check.rb +81 -74
- data/lib/ayadn/cnx.rb +77 -26
- data/lib/ayadn/databases.rb +890 -105
- data/lib/ayadn/debug.rb +30 -89
- data/lib/ayadn/descriptions.rb +876 -329
- data/lib/ayadn/endpoints.rb +2 -2
- data/lib/ayadn/errors.rb +9 -9
- data/lib/ayadn/extend.rb +8 -1
- data/lib/ayadn/fileops.rb +10 -8
- data/lib/ayadn/mark.rb +79 -56
- data/lib/ayadn/migration.rb +427 -0
- data/lib/ayadn/nicerank.rb +74 -72
- data/lib/ayadn/nowplaying.rb +123 -60
- data/lib/ayadn/nowwatching.rb +26 -10
- data/lib/ayadn/pinboard.rb +12 -7
- data/lib/ayadn/post.rb +40 -37
- data/lib/ayadn/profile.rb +5 -2
- data/lib/ayadn/scroll.rb +20 -5
- data/lib/ayadn/search.rb +30 -22
- data/lib/ayadn/set.rb +146 -50
- data/lib/ayadn/settings.rb +66 -67
- data/lib/ayadn/status.rb +459 -234
- data/lib/ayadn/stream.rb +80 -46
- data/lib/ayadn/switch.rb +51 -47
- data/lib/ayadn/tvshow.rb +47 -15
- data/lib/ayadn/version.rb +1 -1
- data/lib/ayadn/view.rb +119 -60
- data/lib/ayadn/workers.rb +144 -92
- data/lib/ayadn.rb +7 -8
- data/spec/mock/ayadn/accounts.sqlite +0 -0
- data/spec/mock/ayadn.sqlite +0 -0
- data/spec/unit/annotations_spec.rb +12 -13
- data/spec/unit/api_spec.rb +3 -4
- data/spec/unit/blacklistworkers_spec.rb +18 -23
- data/spec/unit/databases_spec.rb +51 -36
- data/spec/unit/endpoints_spec.rb +5 -2
- data/spec/unit/extend_spec.rb +24 -0
- data/spec/unit/nicerank_spec.rb +13 -13
- data/spec/unit/post_spec.rb +47 -36
- data/spec/unit/set_spec.rb +67 -96
- data/spec/unit/view_spec.rb +12 -6
- data/spec/unit/workers_spec.rb +38 -12
- data/tags +1285 -0
- metadata +29 -39
- data/spec/mock/aliases.db +0 -0
- data/spec/mock/blacklist.db +0 -0
- data/spec/mock/bookmarks.db +0 -0
- data/spec/mock/channels.db +0 -0
- data/spec/mock/index.db +0 -0
- data/spec/mock/nicerank.db +0 -0
- data/spec/mock/pagination.db +0 -0
- data/spec/mock/users.db +0 -0
- data/spec/unit/status_spec.rb +0 -9
data/lib/ayadn/endpoints.rb
CHANGED
@@ -56,7 +56,7 @@ module Ayadn
|
|
56
56
|
else
|
57
57
|
API.build_query({count: Settings.options[:counts][:global]})
|
58
58
|
end
|
59
|
-
if Settings.
|
59
|
+
if Settings.global[:force] == true
|
60
60
|
"#{@posts_url}stream/global?#{@options_list}"
|
61
61
|
else
|
62
62
|
"#{@posts_url}stream/global?access_token=#{Settings.user_token}#{@options_list}"
|
@@ -105,7 +105,7 @@ module Ayadn
|
|
105
105
|
else
|
106
106
|
API.build_query({count: Settings.options[:counts][:posts]})
|
107
107
|
end
|
108
|
-
if Settings.
|
108
|
+
if Settings.global[:force] == true
|
109
109
|
"#{@users_url}#{username}/posts/?#{@options_list}"
|
110
110
|
else
|
111
111
|
"#{@users_url}#{username}/posts/?access_token=#{Settings.user_token}#{@options_list}"
|
data/lib/ayadn/errors.rb
CHANGED
@@ -3,7 +3,11 @@ module Ayadn
|
|
3
3
|
class Errors
|
4
4
|
|
5
5
|
def self.global_error(args)
|
6
|
-
|
6
|
+
if Logs.nil? || Logs.rec.nil?
|
7
|
+
Status.new.wtf
|
8
|
+
exit
|
9
|
+
end
|
10
|
+
thor = Thor::Shell::Color.new
|
7
11
|
Logs.rec.error "--BEGIN--"
|
8
12
|
Logs.rec.error "CAUSE: #{args[:error]}"
|
9
13
|
Logs.rec.debug "DATA: #{args[:data]}"
|
@@ -14,9 +18,9 @@ module Ayadn
|
|
14
18
|
"#{dir}/#{file}"
|
15
19
|
end
|
16
20
|
Logs.rec.debug "STACK: #{stack}"
|
17
|
-
#Logs.rec.debug "STACK: #{args[:caller]}"
|
18
21
|
Logs.rec.error "--END--"
|
19
|
-
|
22
|
+
thor.say_status :error, "logged in #{Settings.config[:paths][:log]}/ayadn.log", :red
|
23
|
+
puts "\n"
|
20
24
|
Debug.err(args[:error], stack)
|
21
25
|
exit
|
22
26
|
end
|
@@ -41,14 +45,10 @@ module Ayadn
|
|
41
45
|
Logs.nr.warn msg
|
42
46
|
end
|
43
47
|
|
44
|
-
def self.whine(status, resp)
|
45
|
-
puts status
|
46
|
-
self.error("#{status} => #{resp['meta']}")
|
47
|
-
end
|
48
|
-
|
49
48
|
def self.no_data(where)
|
50
49
|
self.warn "In action/#{where}: no data"
|
51
|
-
|
50
|
+
Status.new.empty_list
|
51
|
+
exit
|
52
52
|
end
|
53
53
|
|
54
54
|
end
|
data/lib/ayadn/extend.rb
CHANGED
data/lib/ayadn/fileops.rb
CHANGED
@@ -34,10 +34,6 @@ module Ayadn
|
|
34
34
|
File.write(Settings.config[:paths][:downloads] + "/#{name}", file)
|
35
35
|
end
|
36
36
|
|
37
|
-
def self.old_ayadn?
|
38
|
-
Dir.exist?(Dir.home + "/ayadn/data")
|
39
|
-
end
|
40
|
-
|
41
37
|
def self.upload_files files
|
42
38
|
files.map do |file|
|
43
39
|
puts "\n#{file}\n\n"
|
@@ -56,13 +52,17 @@ module Ayadn
|
|
56
52
|
`curl -k -H 'Authorization: BEARER #{token}' https://api.app.net/files -F 'type=com.ayadn.files' -F "content=@#{file}" -F 'public=true' -X POST`
|
57
53
|
end
|
58
54
|
rescue Errno::ENOENT
|
59
|
-
|
55
|
+
Status.new.no_curl
|
56
|
+
exit
|
60
57
|
end
|
61
58
|
end
|
62
59
|
|
63
60
|
def self.make_paths(files_array)
|
64
61
|
files_array.map do |file|
|
65
|
-
|
62
|
+
unless File.exist?(file)
|
63
|
+
Status.new.bad_path
|
64
|
+
exit
|
65
|
+
end
|
66
66
|
File.absolute_path(file)
|
67
67
|
end
|
68
68
|
end
|
@@ -71,7 +71,8 @@ module Ayadn
|
|
71
71
|
begin
|
72
72
|
`curl -X POST -H "Authorization: Bearer #{Settings.user_token}" -F "avatar=@#{file}" #{Endpoints.new.avatar}`
|
73
73
|
rescue Errno::ENOENT
|
74
|
-
|
74
|
+
Status.new.no_curl
|
75
|
+
exit
|
75
76
|
end
|
76
77
|
end
|
77
78
|
|
@@ -79,7 +80,8 @@ module Ayadn
|
|
79
80
|
begin
|
80
81
|
`curl -X POST -H "Authorization: Bearer #{Settings.user_token}" -F "cover=@#{file}" #{Endpoints.new.cover}`
|
81
82
|
rescue Errno::ENOENT
|
82
|
-
|
83
|
+
Status.new.no_curl
|
84
|
+
exit
|
83
85
|
end
|
84
86
|
end
|
85
87
|
|
data/lib/ayadn/mark.rb
CHANGED
@@ -5,21 +5,29 @@ module Ayadn
|
|
5
5
|
desc "add POST_ID (TITLE)", "Create a bookmark for this conversation"
|
6
6
|
long_desc Descriptions.mark_add
|
7
7
|
map "create" => :add
|
8
|
+
option :force, aliases: "-f", type: :boolean, desc: Descriptions.options_force
|
8
9
|
def add(*args)
|
9
10
|
begin
|
10
11
|
init
|
12
|
+
status = Status.new
|
11
13
|
unless args.empty?
|
12
14
|
double = args.dup
|
13
15
|
post_id, convo_title = double.shift, double.join(' ')
|
14
16
|
else
|
15
|
-
|
17
|
+
status.wrong_arguments
|
18
|
+
exit
|
19
|
+
end
|
20
|
+
Check.new.bad_post_id(post_id)
|
21
|
+
if options[:force]
|
22
|
+
Settings.global[:force] = true
|
23
|
+
else
|
24
|
+
post_id = Workers.new.get_real_post_id(post_id)
|
16
25
|
end
|
17
|
-
abort Status.error_missing_post_id unless post_id.is_integer?
|
18
26
|
convo_title = post_id if convo_title == ''
|
19
27
|
api, workers, view = API.new, Workers.new, View.new
|
20
28
|
users, bucket = [], []
|
21
29
|
view.clear_screen
|
22
|
-
|
30
|
+
status.info(:connected, "analyzing conversation", :yellow)
|
23
31
|
resp = api.get_convo(post_id, options)
|
24
32
|
posts = workers.build_posts(resp['data'].reverse)
|
25
33
|
posts.each do |id, post|
|
@@ -30,31 +38,29 @@ module Ayadn
|
|
30
38
|
users.uniq!
|
31
39
|
now = Time.now.to_s
|
32
40
|
bookmark = {
|
33
|
-
id
|
34
|
-
root_id
|
35
|
-
last_id
|
36
|
-
title
|
37
|
-
first_date
|
38
|
-
last_date
|
39
|
-
mark_date
|
40
|
-
first_poster
|
41
|
-
last_poster
|
42
|
-
users
|
43
|
-
size
|
44
|
-
url
|
45
|
-
root_text
|
46
|
-
root_colorized_text
|
41
|
+
'id' => post_id,
|
42
|
+
'root_id' => bucket[0][:id],
|
43
|
+
'last_id' => (bucket.last)[:id],
|
44
|
+
'title' => convo_title,
|
45
|
+
'first_date' => bucket[0][:date],
|
46
|
+
'last_date' => (bucket.last)[:date],
|
47
|
+
'mark_date' => now[0..18],
|
48
|
+
'first_poster' => bucket[0][:original_poster],
|
49
|
+
'last_poster' => (bucket.last)[:username],
|
50
|
+
'users' => users,
|
51
|
+
'size' => bucket.length,
|
52
|
+
'url' => bucket[0][:canonical_url],
|
53
|
+
'root_text' => bucket[0][:raw_text],
|
54
|
+
'root_colorized_text' => bucket[0][:text]
|
47
55
|
}
|
48
56
|
view.clear_screen
|
49
|
-
|
57
|
+
status.info(:done, "bookmarked conversation:", :green)
|
50
58
|
puts make_entry bookmark
|
51
59
|
Databases.add_bookmark bookmark
|
52
|
-
Logs.rec.info "Added conversation bookmark for post #{bookmark[
|
53
|
-
|
60
|
+
Logs.rec.info "Added conversation bookmark for post #{bookmark['id']}."
|
61
|
+
status.done
|
54
62
|
rescue => e
|
55
63
|
Errors.global_error({error: e, caller: caller, data: [args]})
|
56
|
-
ensure
|
57
|
-
Databases.close_all
|
58
64
|
end
|
59
65
|
end
|
60
66
|
|
@@ -64,18 +70,19 @@ module Ayadn
|
|
64
70
|
def list
|
65
71
|
begin
|
66
72
|
init
|
67
|
-
list =
|
68
|
-
Databases.bookmarks.each {|i,v| list << v}
|
73
|
+
list = Databases.all_bookmarks
|
69
74
|
if options[:raw]
|
70
75
|
jj JSON.parse(list.to_json)
|
71
76
|
exit
|
72
77
|
end
|
78
|
+
if list.empty?
|
79
|
+
Status.new.empty_list
|
80
|
+
exit
|
81
|
+
end
|
73
82
|
puts "\n"
|
74
|
-
list.each {|marked| puts make_entry
|
83
|
+
list.each {|marked| puts make_entry(JSON.parse(marked[1])); puts "\n"}
|
75
84
|
rescue => e
|
76
85
|
Errors.global_error({error: e, caller: caller, data: [args, options]})
|
77
|
-
ensure
|
78
|
-
Databases.close_all
|
79
86
|
end
|
80
87
|
end
|
81
88
|
|
@@ -83,56 +90,72 @@ module Ayadn
|
|
83
90
|
def clear
|
84
91
|
begin
|
85
92
|
init
|
86
|
-
|
93
|
+
status = Status.new
|
94
|
+
status.ask_clear_bookmarks
|
87
95
|
input = STDIN.getch
|
88
96
|
if input == 'y' || input == 'Y'
|
89
97
|
Databases.clear_bookmarks
|
90
98
|
Logs.rec.info "Cleared the bookmarks database."
|
91
|
-
|
99
|
+
status.done
|
92
100
|
else
|
93
|
-
|
101
|
+
status.canceled
|
102
|
+
exit
|
94
103
|
end
|
95
104
|
rescue => e
|
96
105
|
Errors.global_error({error: e, caller: caller, data: []})
|
97
|
-
ensure
|
98
|
-
Databases.close_all
|
99
106
|
end
|
100
107
|
end
|
101
108
|
|
102
109
|
desc "delete POST_ID", "Delete entry POST_ID from your bookmarked conversations"
|
103
110
|
map "remove" => :delete
|
104
111
|
long_desc Descriptions.mark_delete
|
105
|
-
|
112
|
+
option :force, aliases: "-f", type: :boolean, desc: Descriptions.options_force
|
113
|
+
def delete(*args)
|
106
114
|
begin
|
107
115
|
init
|
108
|
-
|
109
|
-
|
116
|
+
status = Status.new
|
117
|
+
if args.empty?
|
118
|
+
status.wrong_arguments
|
119
|
+
exit
|
120
|
+
else
|
121
|
+
post_id = args[0]
|
122
|
+
end
|
123
|
+
Check.new.bad_post_id(post_id)
|
124
|
+
if options[:force]
|
125
|
+
Settings.global[:force] = true
|
126
|
+
else
|
127
|
+
post_id = Workers.new.get_real_post_id(post_id)
|
128
|
+
end
|
110
129
|
Databases.delete_bookmark post_id
|
111
|
-
|
130
|
+
status.done
|
112
131
|
rescue => e
|
113
132
|
Errors.global_error({error: e, caller: caller, data: [args]})
|
114
|
-
ensure
|
115
|
-
Databases.close_all
|
116
133
|
end
|
117
134
|
end
|
118
135
|
|
119
136
|
desc "rename POST_ID NEW_TITLE", "Rename bookmark POST_ID"
|
120
137
|
long_desc Descriptions.mark_rename
|
121
|
-
|
138
|
+
option :force, aliases: "-f", type: :boolean, desc: Descriptions.options_force
|
139
|
+
def rename(*args)
|
122
140
|
begin
|
123
141
|
init
|
142
|
+
status = Status.new
|
124
143
|
unless args.empty? || args[1].nil?
|
125
|
-
|
144
|
+
arguments = args.dup
|
145
|
+
post_id = arguments.shift
|
126
146
|
else
|
127
147
|
abort Status.wrong_arguments
|
128
148
|
end
|
129
|
-
|
130
|
-
|
131
|
-
|
149
|
+
Check.new.bad_post_id(post_id)
|
150
|
+
if options[:force]
|
151
|
+
Settings.global[:force] = true
|
152
|
+
else
|
153
|
+
post_id = Workers.new.get_real_post_id(post_id)
|
154
|
+
end
|
155
|
+
Databases.rename_bookmark post_id, arguments.join(" ")
|
156
|
+
status.done
|
132
157
|
rescue => e
|
133
158
|
Errors.global_error({error: e, caller: caller, data: [args]})
|
134
|
-
ensure
|
135
|
-
Databases.close_all
|
136
159
|
end
|
137
160
|
end
|
138
161
|
|
@@ -141,27 +164,27 @@ module Ayadn
|
|
141
164
|
def make_entry content
|
142
165
|
entry = ""
|
143
166
|
entry << "Post id:".color(:cyan)
|
144
|
-
entry << "\t#{content[
|
145
|
-
unless content[
|
167
|
+
entry << "\t#{content['id']}\n".color(Settings.options[:colors][:username])
|
168
|
+
unless content['title'].is_integer?
|
146
169
|
entry << "Title:".color(:cyan)
|
147
|
-
entry << "\t\t#{content[
|
170
|
+
entry << "\t\t#{content['title']}\n".color(Settings.options[:colors][:id])
|
148
171
|
end
|
149
172
|
entry << "Date:".color(:cyan)
|
150
|
-
entry << "\t\t#{content[
|
173
|
+
entry << "\t\t#{content['first_date']}\n".color(Settings.options[:colors][:date])
|
151
174
|
# entry << "Bookmarked:".color(:cyan)
|
152
|
-
# entry << "\t#{content[
|
175
|
+
# entry << "\t#{content['mark_date']}\n".color(Settings.options[:colors][:date])
|
153
176
|
entry << "Posts:".color(:cyan)
|
154
|
-
entry << "\t\t#{content[
|
177
|
+
entry << "\t\t#{content['size']}\n".color(Settings.options[:colors][:name])
|
155
178
|
entry << "Posters:".color(:cyan)
|
156
179
|
posters = []
|
157
|
-
content[
|
180
|
+
content['users'].each {|mention| posters << "@#{mention}"}
|
158
181
|
entry << "\t#{posters.join(', ')}\n".color(Settings.options[:colors][:mentions])
|
159
|
-
# entry << "First:\t\t@#{content[
|
160
|
-
# entry << "Last:\t\t@#{content[
|
182
|
+
# entry << "First:\t\t@#{content['first_poster']}\n"
|
183
|
+
# entry << "Last:\t\t@#{content['last_poster']}\n"
|
161
184
|
entry << "Link:".color(:cyan)
|
162
|
-
entry << "\t\t#{content[
|
185
|
+
entry << "\t\t#{content['url']}\n".color(Settings.options[:colors][:link])
|
163
186
|
entry << "Beginning:".color(:cyan)
|
164
|
-
text = content[
|
187
|
+
text = content['root_text'].gsub(/[\r\n]/, ' ')
|
165
188
|
if text.length <= 60
|
166
189
|
entry << "\t#{text}\n"
|
167
190
|
else
|