ayadn 1.4.6 → 1.5.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.
data/lib/ayadn/view.rb CHANGED
@@ -17,7 +17,7 @@ module Ayadn
17
17
  puts resp unless resp == ""
18
18
  end
19
19
 
20
- def show_raw(stream)
20
+ def show_raw(stream, options = {})
21
21
  #puts stream.to_json
22
22
  jj stream
23
23
  end
@@ -83,7 +83,7 @@ module Ayadn
83
83
  @iter = 0
84
84
  opts = Settings.options.dup
85
85
  opts.each do |k,v|
86
- v.delete_if {|ke,_| ke == :deleted || ke == :annotations } # not mutable values
86
+ v.delete_if {|ke,_| ke == :deleted || ke == :annotations} # don't show immutable values
87
87
  v.each do |x,y|
88
88
  t << :separator if @iter >= 1
89
89
  unless y.is_a?(Hash)
@@ -101,7 +101,7 @@ module Ayadn
101
101
  puts table
102
102
  end
103
103
 
104
- def show_userinfos(content, token)
104
+ def show_userinfos(content, token, show_ranks = false)
105
105
  if content['name']
106
106
  view = "Name\t\t\t".color(:cyan) + content['name'].color(Settings.options[:colors][:name])
107
107
  else
@@ -130,10 +130,20 @@ module Ayadn
130
130
 
131
131
  view << "\n\nPosts\t\t\t".color(:cyan) + content['counts']['posts'].to_s.color(:green)
132
132
 
133
+
134
+ unless show_ranks == false
135
+ # this is ok for one user, but do not call this in a loop
136
+ # do call them all at once instead if many
137
+ ranks = NiceRank.new.get_posts_day([content['id'].to_i])
138
+ unless ranks.empty?
139
+ view << "\n\nPosts/day\t\t".color(:cyan) + ranks[0][:posts_day].to_s.color(:green)
140
+ end
141
+ end
142
+
133
143
  view << "\n\nFollowing\t\t".color(:cyan) + content['counts']['following'].to_s.color(:green)
134
144
  view << "\nFollowers\t\t".color(:cyan) + content['counts']['followers'].to_s.color(:green)
135
145
 
136
- if content['username'] == Settings.config[:identity][:username]
146
+ if content['username'] == Settings.config[:identity][:username] && !token.nil?
137
147
  view << "\n\nStorage used\t\t".color(:cyan) + "#{token['storage']['used'].to_filesize}".color(:red)
138
148
  view << "\nStorage available\t".color(:cyan) + "#{token['storage']['available'].to_filesize}".color(:green)
139
149
  end
@@ -288,23 +298,21 @@ module Ayadn
288
298
  end
289
299
 
290
300
  def filter_nicerank posts, options
291
- if options[:filter] == true # only if this option is true in Action (only global for now)
292
- unless Settings.options[:nicerank].nil? #in case config file not initialized
293
- if Settings.options[:nicerank][:filter] == true
294
- filtered = {}
295
- posts.each do |id,content|
296
- if Settings.options[:nicerank][:filter_unranked] == true
297
- next if content[:nicerank] == false
298
- end
299
- unless content[:nicerank] == false
300
- next if content[:nicerank] < Settings.options[:nicerank][:threshold]
301
- next if content[:is_human] == false
302
- next if content[:real_person] == false
303
- end
304
- filtered[id] = content
301
+ if options[:filter] == true # if this option is true in Action (it's only for global, actually)
302
+ if Settings.options[:nicerank][:filter] == true
303
+ filtered = {}
304
+ posts.each do |id,content|
305
+ if Settings.options[:nicerank][:filter_unranked] == true
306
+ next if content[:nicerank] == false
307
+ end
308
+ unless content[:nicerank] == false
309
+ next if content[:nicerank] < Settings.options[:nicerank][:threshold]
310
+ next if content[:is_human] == false
311
+ next if content[:real_person] == false
305
312
  end
306
- return filtered
313
+ filtered[id] = content
307
314
  end
315
+ return filtered
308
316
  end
309
317
  end
310
318
  return posts
@@ -314,7 +322,9 @@ module Ayadn
314
322
  @view = ""
315
323
  posts = filter_nicerank(@workers.build_posts(data.reverse, niceranks), options)
316
324
  posts.each do |id,content|
317
- count = "%03d" % content[:count]
325
+ format = "%03d" % content[:count]
326
+ arrow = arrow_count(options, content)
327
+ count = "#{arrow}#{format}"
318
328
  if content[:username] == Settings.config[:identity][:username]
319
329
  @view << count.color(Settings.options[:colors][:index]).inverse
320
330
  elsif content[:mentions].include?(Settings.config[:identity][:username]) && options[:in_mentions].nil?
@@ -332,18 +342,37 @@ module Ayadn
332
342
  @view = ""
333
343
  posts = filter_nicerank(@workers.build_posts(data.reverse, niceranks), options)
334
344
  posts.each do |id,content|
345
+ content[:id] = arrow_id(options, content)
335
346
  if content[:username] == Settings.config[:identity][:username]
336
- @view << content[:id].to_s.color(Settings.options[:colors][:id]).inverse + " "
347
+ @view << content[:id].color(Settings.options[:colors][:id]).inverse + " "
337
348
  elsif content[:mentions].include?(Settings.config[:identity][:username]) && options[:in_mentions].nil?
338
- @view << content[:id].to_s.color(Settings.options[:colors][:mentions]).inverse + " "
349
+ @view << content[:id].color(Settings.options[:colors][:mentions]).inverse + " "
339
350
  else
340
- @view << content[:id].to_s.color(Settings.options[:colors][:id]) + " "
351
+ @view << content[:id].color(Settings.options[:colors][:id]) + " "
341
352
  end
342
353
  @view << build_content(content)
343
354
  end
344
355
  @view
345
356
  end
346
357
 
358
+ def arrow_count options, content
359
+ if options[:reply_to]
360
+ return '⬇︎ ' if options[:reply_to] == content[:id]
361
+ return '⬆︎ ' if options[:post_id] == content[:id]
362
+ return ''
363
+ end
364
+ ''
365
+ end
366
+
367
+ def arrow_id options, content
368
+ if options[:reply_to]
369
+ return content[:id].to_s.prepend('⬇︎ ') if options[:reply_to] == content[:id]
370
+ return content[:id].to_s.prepend('⬆︎ ') if options[:post_id] == content[:id]
371
+ return content[:id].to_s
372
+ end
373
+ content[:id].to_s
374
+ end
375
+
347
376
  def build_interactions_stream(data)
348
377
  inter = ""
349
378
  data.reverse.each do |event|
@@ -462,14 +491,6 @@ module Ayadn
462
491
  header << " "
463
492
  header << content[:name].color(Settings.options[:colors][:name])
464
493
  end
465
-
466
- if Settings.options[:timeline][:show_nicerank] == true && content[:nicerank]
467
- if Settings.options[:nicerank][:filter] == true
468
- header << " "
469
- header << "[#{content[:nicerank]}]".color(Settings.options[:colors][:nicerank])
470
- end
471
- end
472
-
473
494
  if Settings.options[:timeline][:show_date]
474
495
  header << " "
475
496
  header << content[:date].color(Settings.options[:colors][:date])
@@ -497,7 +518,6 @@ module Ayadn
497
518
  hd << "\n"
498
519
  formatted = { header: hd }
499
520
  content[:checkins].each do |key, val|
500
- #formatted[key] = val unless (val.nil? || !val)
501
521
  formatted[key] = val
502
522
  end
503
523
 
data/lib/ayadn/workers.rb CHANGED
@@ -25,7 +25,7 @@ module Ayadn
25
25
  users_list = []
26
26
  list.each do |obj|
27
27
  obj['name'].nil? ? name = "" : name = obj['name']
28
- users_list << {:username => obj['username'], :name => name, :you_follow => obj['you_follow'], :follows_you => obj['follows_you']}
28
+ users_list << {:username => obj['username'], :name => name, :you_follow => obj['you_follow'], :follows_you => obj['follows_you'], :id => obj['id']}
29
29
  end
30
30
  table.style = {border_x: ' ', border_i: ' ', border_y: ' '}
31
31
  return users_list, table
@@ -37,7 +37,7 @@ module Ayadn
37
37
  users_list = []
38
38
  list.each do |obj|
39
39
  obj['name'].nil? ? name = "" : name = obj['name']
40
- users_list << {:username => obj['username'], :name => name, :you_follow => obj['you_follow'], :follows_you => obj['follows_you']}
40
+ users_list << {:username => obj['username'], :name => name, :you_follow => obj['you_follow'], :follows_you => obj['follows_you'], :id => obj['id']}
41
41
  end
42
42
  table.style = {border_x: ' ', border_i: ' ', border_y: ' '}
43
43
  return users_list, table
@@ -81,13 +81,37 @@ module Ayadn
81
81
  end
82
82
 
83
83
  def build_users_list(list, table)
84
+ users = Workers.at(list.map {|obj| obj[:username]})
85
+ ids = list.map {|obj| obj[:id].to_i}
86
+ ranks = NiceRank.new.from_ids(ids)
87
+ indexed_ranks = {}
88
+ ranks.each do |r|
89
+ if r.empty?
90
+ indexed_ranks = false
91
+ break
92
+ else
93
+ indexed_ranks[r['user_id']] = r
94
+ end
95
+ end
96
+ table << ['USERNAME'.color(:red), 'NAME'.color(:red), 'POSTS/DAY'.color(:red)]
97
+ table << :separator
84
98
  list.each_with_index do |obj, index|
85
- obj[:username].length > 35 ? username = "#{obj[:username][0...32]}..." : username = obj[:username]
86
- unless obj[:name].nil?
87
- obj[:name].length > 35 ? name = "#{obj[:name][0...32]}..." : name = obj[:name]
88
- table << [ "@#{username} ".color(Settings.options[:colors][:username]), "#{name}" ]
99
+ unless indexed_ranks == false
100
+ details = indexed_ranks[obj[:id].to_i]
101
+ if details['user']['posts_day'] == -1
102
+ posts_day = 'ignored'
103
+ else
104
+ posts_day = details['user']['posts_day'].round(2).to_s
105
+ end
106
+ else
107
+ posts_day = 'unknown'
108
+ end
109
+ obj[:username].length > 23 ? username = "#{obj[:username][0..20]}..." : username = obj[:username]
110
+ unless obj[:name].nil? || obj[:name].empty?
111
+ obj[:name].length > 23 ? name = "#{obj[:name][0..20]}..." : name = obj[:name]
112
+ table << [ "@#{username} ".color(Settings.options[:colors][:username]), "#{name}", posts_day ]
89
113
  else
90
- table << [ "@#{username} ".color(Settings.options[:colors][:username]), "" ]
114
+ table << [ "@#{username} ".color(Settings.options[:colors][:username]), "", posts_day ]
91
115
  end
92
116
  table << :separator unless index + 1 == list.length
93
117
  end
@@ -97,15 +121,21 @@ module Ayadn
97
121
  def build_posts(data, niceranks = {})
98
122
  # builds a hash of hashes, each hash is a normalized post with post id as a key
99
123
  posts = {}
100
-
101
124
  data.each.with_index(1) do |post, index|
102
- next if Databases.blacklist[post['source']['name'].downcase]
103
- next if Databases.blacklist["-@#{post['user']['username'].downcase}"]
125
+ if Databases.blacklist[post['source']['name'].downcase]
126
+ Debug.skipped({source: post['source']['name']})
127
+ next
128
+ end
129
+ if Databases.blacklist["-@#{post['user']['username'].downcase}"]
130
+ Debug.skipped({user: post['user']['username']})
131
+ next
132
+ end
104
133
  hashtags = extract_hashtags(post)
105
134
  @skip = false
106
135
  hashtags.each do |h|
107
136
  if Databases.blacklist[h.downcase]
108
137
  @skip = true
138
+ Debug.skipped({hashtag: h})
109
139
  break
110
140
  end
111
141
  end
@@ -115,6 +145,7 @@ module Ayadn
115
145
  mentions.each do |m|
116
146
  if Databases.blacklist["@#{m.downcase}"]
117
147
  @skip = true
148
+ Debug.skipped({mention: m})
118
149
  break
119
150
  end
120
151
  end
@@ -271,6 +302,18 @@ module Ayadn
271
302
  "#{string[0...10]} #{string[11...19]}"
272
303
  end
273
304
 
305
+ def self.at usernames
306
+ usernames.map do |user|
307
+ if user == 'me'
308
+ 'me'
309
+ elsif user[0] == '@'
310
+ user
311
+ else
312
+ "@#{user}"
313
+ end
314
+ end
315
+ end
316
+
274
317
  def self.add_arobase_if_missing(username) # expects an array of username(s), works on the first one and outputs a string
275
318
  unless username.first == "me"
276
319
  username = username.first.chars
@@ -319,7 +362,6 @@ module Ayadn
319
362
 
320
363
  def colorize_text(text, mentions, hashtags)
321
364
  reg_split = '[~:-;,?!\'&`^=+<>*%()\/"“”’°£$€.…]'
322
- #reg_tag = '#([A-Za-z0-9_]{1,255})(?![\w+])'
323
365
  reg_tag = '#([[:alpha:]0-9_]{1,255})(?![\w+])'
324
366
  reg_mention = '@([A-Za-z0-9_]{1,20})(?![\w+])'
325
367
  reg_sentence = '^.+[\r\n]*'
@@ -404,7 +446,7 @@ module Ayadn
404
446
  def build_users_array(list)
405
447
  users_list = []
406
448
  list.each do |key, value|
407
- users_list << {:username => value[0], :name => value[1], :you_follow => value[2], :follows_you => value[3]}
449
+ users_list << {:username => value[0], :name => value[1], :you_follow => value[2], :follows_you => value[3], :id => key}
408
450
  end
409
451
  users_list
410
452
  end
@@ -445,9 +487,6 @@ module Ayadn
445
487
  unless obj['value']['region'].nil?
446
488
  checkins[:region] = obj['value']['region']
447
489
  end
448
- #when "net.app.core.oembed"
449
- #has_checkins = true
450
- #checkins[:embeddable_url] = obj['value']['embeddable_url']
451
490
  end
452
491
  end
453
492
  end
@@ -18,39 +18,12 @@ describe Ayadn::API do
18
18
  it 'returns a URL with count=12' do
19
19
  expect(Ayadn::API.build_query({count: 12})).to match /count=12/
20
20
  end
21
- it 'returns a URL with count=50' do
22
- expect(Ayadn::API.build_query(Ayadn::Settings.options)).to match /count=50/
23
- end
24
- it 'returns a URL with count=50 (default)' do
25
- expect(Ayadn::API.build_query({count: "I'm drunk"})).to match /count=50/
26
- end
27
21
  it 'returns a URL with directed=0' do
28
22
  expect(Ayadn::API.build_query({directed: 0})).to match /directed=0/
29
23
  end
30
- it 'returns a URL with directed=0 (default)' do
31
- expect(Ayadn::API.build_query({directed: "I'm drunk"})).to match /directed=1/
32
- end
33
- it 'returns a URL with directed=1' do
34
- expect(Ayadn::API.build_query(Ayadn::Settings.options)).to match /directed=1/
35
- end
36
- it 'returns a URL with deleted=1' do
37
- expect(Ayadn::API.build_query({deleted: 1})).to match /deleted=1/
38
- end
39
- it 'returns a URL with deleted=0' do
40
- expect(Ayadn::API.build_query(Ayadn::Settings.options)).to match /deleted=0/
41
- end
42
24
  it 'returns a URL with html=1' do
43
25
  expect(Ayadn::API.build_query({html: 1})).to match /html=1/
44
26
  end
45
- it 'returns a URL with html=0' do
46
- expect(Ayadn::API.build_query(Ayadn::Settings.options)).to match /html=0/
47
- end
48
- it 'returns a URL with annotations=0' do
49
- expect(Ayadn::API.build_query({annotations: 0})).to match /annotations=0/
50
- end
51
- it 'returns a URL with annotations=1' do
52
- expect(Ayadn::API.build_query(Ayadn::Settings.options)).to match /annotations=1/
53
- end
54
27
  end
55
28
  describe "#check_response_meta_code" do
56
29
  it "returns original response if code is 200" do
@@ -100,18 +100,18 @@ describe Ayadn::View do
100
100
  end
101
101
  end
102
102
 
103
- let(:followers) { JSON.parse(File.read("spec/mock/fwr_@ayadn.json")) }
103
+ # let(:followers) { JSON.parse(File.read("spec/mock/fwr_@ayadn.json")) }
104
104
 
105
- describe "#show_list_followers" do
106
- it "outputs the list of followers" do
107
- list = Ayadn::Workers.extract_users(followers[0])
108
- printed = capture_stdout do
109
- Ayadn::View.new.show_list_followers(list, '@ayadn')
110
- end
111
- expect(printed).to include "@ericd"
112
- expect(printed).to include "Nicolas Maumont"
113
- end
114
- end
105
+ # describe "#show_list_followers" do
106
+ # it "outputs the list of followers" do
107
+ # list = Ayadn::Workers.extract_users(followers[0])
108
+ # printed = capture_stdout do
109
+ # Ayadn::View.new.show_list_followers(list, '@ayadn')
110
+ # end
111
+ # expect(printed).to include "@ericd"
112
+ # expect(printed).to include "Nicolas Maumont"
113
+ # end
114
+ # end
115
115
 
116
116
 
117
117
 
@@ -81,53 +81,52 @@ describe Ayadn::Workers do
81
81
  end
82
82
  end
83
83
 
84
- let(:list) { {"007"=>["bond", "James Bond", true, true], "666"=>["mrtest", "Mr Test", false, false]} }
85
-
86
- describe "#build_followers_list" do
87
- it 'builds the followers table list' do
88
- printed = capture_stdout do
89
- puts Ayadn::Workers.new.build_followers_list(list, "@test")
90
- end
91
- #expect(printed).to include "+----"
92
- expect(printed).to include "@test"
93
- expect(printed).to include "@bond"
94
- expect(printed).to include "Mr Test"
95
- end
96
- end
97
-
98
- describe "#build_followings_list" do
99
- it 'builds the followings table list' do
100
- printed = capture_stdout do
101
- puts Ayadn::Workers.new.build_followings_list(list, "@test")
102
- end
103
- #expect(printed).to include "+~~~~"
104
- expect(printed).to include "@test"
105
- expect(printed).to include "@bond"
106
- expect(printed).to include "Mr Test"
107
- end
108
- end
109
-
110
- describe "#build_muted_list" do
111
- it 'builds the muted table list' do
112
- printed = capture_stdout do
113
- puts Ayadn::Workers.new.build_muted_list(list)
114
- end
115
- #expect(printed).to include "+----"
116
- expect(printed).to include "@bond"
117
- expect(printed).to include "Mr Test"
118
- end
119
- end
120
-
121
- describe "#build_blocked_list" do
122
- it 'builds the blocked table list' do
123
- printed = capture_stdout do
124
- puts Ayadn::Workers.new.build_blocked_list(list)
125
- end
126
- #expect(printed).to include "+----"
127
- expect(printed).to include "@bond"
128
- expect(printed).to include "Mr Test"
129
- end
130
- end
84
+ # let(:list) { {"007"=>["bond", "James Bond", true, true], "666"=>["mrtest", "Mr Test", false, false]} }
85
+
86
+ # describe "#build_followers_list" do
87
+ # it 'builds the followers table list' do
88
+ # printed = capture_stdout do
89
+ # puts Ayadn::Workers.new.build_followers_list(list, "@test")
90
+ # end
91
+ # expect(printed).to include "@test"
92
+ # expect(printed).to include "@bond"
93
+ # expect(printed).to include "Mr Test"
94
+ # end
95
+ # end
96
+
97
+ # describe "#build_followings_list" do
98
+ # it 'builds the followings table list' do
99
+ # printed = capture_stdout do
100
+ # puts Ayadn::Workers.new.build_followings_list(list, "@test")
101
+ # end
102
+ # #expect(printed).to include "+~~~~"
103
+ # expect(printed).to include "@test"
104
+ # expect(printed).to include "@bond"
105
+ # expect(printed).to include "Mr Test"
106
+ # end
107
+ # end
108
+
109
+ # describe "#build_muted_list" do
110
+ # it 'builds the muted table list' do
111
+ # printed = capture_stdout do
112
+ # puts Ayadn::Workers.new.build_muted_list(list)
113
+ # end
114
+ # #expect(printed).to include "+----"
115
+ # expect(printed).to include "@bond"
116
+ # expect(printed).to include "Mr Test"
117
+ # end
118
+ # end
119
+
120
+ # describe "#build_blocked_list" do
121
+ # it 'builds the blocked table list' do
122
+ # printed = capture_stdout do
123
+ # puts Ayadn::Workers.new.build_blocked_list(list)
124
+ # end
125
+ # #expect(printed).to include "+----"
126
+ # expect(printed).to include "@bond"
127
+ # expect(printed).to include "Mr Test"
128
+ # end
129
+ # end
131
130
 
132
131
  describe ".add_arobase_if_missing" do
133
132
  it 'adds @ to username' do