diff --git a/app.rb b/app.rb index 3b8144e1..895a9055 100644 --- a/app.rb +++ b/app.rb @@ -216,9 +216,7 @@ get '/?' do if current_site require_login - if current_site.followings_dataset.count == 0 - @suggestions = current_site.suggestions - end + @suggestions = current_site.suggestions @current_page = params[:current_page].to_i @current_page = 1 if @current_page == 0 @@ -398,9 +396,17 @@ get '/browse/?' do site_dataset.order!(:created_at) when 'random' site_dataset.where! 'random() < 0.01' - else + when 'last_updated' params[:sort_by] = 'last_updated' - site_dataset.order!(:updated_at.desc, :hits.desc) + site_dataset.order!(:updated_at.desc, :views.desc) + else + if params[:tag] + params[:sort_by] = 'views' + site_dataset.order!(:views.desc) + else + params[:sort_by] = 'last_updated' + site_dataset.order!(:updated_at.desc, :views.desc) + end end site_dataset.filter! is_nsfw: (params[:is_nsfw] == 'true' ? true : false) @@ -1221,6 +1227,7 @@ def api_info_for(site) { info: { sitename: site.username, + views: site.views, hits: site.hits, created_at: site.created_at.rfc2822, last_updated: site.updated_at.rfc2822, diff --git a/models/site.rb b/models/site.rb index cf0cefb3..d8ce7b9c 100644 --- a/models/site.rb +++ b/models/site.rb @@ -93,6 +93,9 @@ class Site < Sequel::Model } } + SUGGESTIONS_LIMIT = 32 + SUGGESTIONS_VIEWS_MIN = 500 + PLAN_FEATURES[:catbus] = PLAN_FEATURES[:fatcat].merge( name: 'Cat Bus', space: Filesize.from('10GB').to_i, @@ -793,6 +796,10 @@ class Site < Sequel::Model values[:hits].to_s.reverse.gsub(/...(?=.)/,'\&,').reverse end + def views_english + values[:views].to_s.reverse.gsub(/...(?=.)/,'\&,').reverse + end + def screenshots_delete(path) SCREENSHOT_RESOLUTIONS.each do |res| begin @@ -811,8 +818,13 @@ class Site < Sequel::Model end end - def suggestions(limit=8, offset=0) - Site.where(tags: tags).limit(limit, offset).order(:updated_at.desc).all + def suggestions(limit=SUGGESTIONS_LIMIT, offset=0) + suggestions_dataset = Site.exclude(id: id).order(:views.desc, :updated_at.desc) + suggestions = suggestions_dataset.where(tags: tags).limit(limit, offset).all + + return suggestions if suggestions.length == 32 + + suggestions += suggestions_dataset.where("views >= #{SUGGESTIONS_VIEWS_MIN}").limit(limit-suggestions.length).order(Sequel.lit('RANDOM()')).all end def screenshot_path(path, resolution) diff --git a/tests/site_tests.rb b/tests/site_tests.rb index 9a47819f..a2129875 100644 --- a/tests/site_tests.rb +++ b/tests/site_tests.rb @@ -7,7 +7,7 @@ def app Sinatra::Application end -describe 'site' do +describe Site do describe 'plan_name' do it 'should set to free for missing stripe_customer_id' do site = Fabricate :site @@ -26,4 +26,22 @@ describe 'site' do end end end + + describe 'suggestions' do + it 'should return suggestions for tags' do + site = Fabricate :site, new_tags_string: 'vegetables' + Site::SUGGESTIONS_LIMIT.times { Fabricate :site, new_tags_string: 'vegetables' } + + site.suggestions.length.must_equal Site::SUGGESTIONS_LIMIT + + site.suggestions.each {|s| s.tags.first.name.must_equal 'vegetables'} + + site = Fabricate :site, new_tags_string: 'gardening' + (Site::SUGGESTIONS_LIMIT-5).times { + Fabricate :site, new_tags_string: 'gardening', views: Site::SUGGESTIONS_VIEWS_MIN + } + + site.suggestions.length.must_equal Site::SUGGESTIONS_LIMIT + end + end end \ No newline at end of file diff --git a/views/browse.erb b/views/browse.erb index 2e061614..1e5960c2 100644 --- a/views/browse.erb +++ b/views/browse.erb @@ -81,7 +81,11 @@
- <%= site.hits %> hit<%= site.hits == 1 ? '' : 's' %> + <% if params[:sort_by] == 'hits' %> + <%= site.hits %> hit<%= site.hits == 1 ? '' : 's' %> + <% else %> + <%= site.views %> view<%= site.views == 1 ? '' : 's' %> + <% end %>
diff --git a/views/home.erb b/views/home.erb index 7252e43e..cafc05a8 100644 --- a/views/home.erb +++ b/views/home.erb @@ -31,11 +31,7 @@

You aren't following any websites yet! Once you do, updates will show up here and you can like and comment on them. - <% if @suggestions.length > 0 %> - Here are some website suggestions based on your tags, or check out all the sites on Neocities! - <% else %> - Want to find some sites to follow? Check out all the sites on Neocities! - <% end %> + Here are some website suggestions for you. Want to find some sites to follow? Check out all the sites on Neocities!

@@ -45,8 +41,9 @@ - - <%= suggested_site.title %> + + <%= suggested_site.title %> + <% suggested_site.tags.each do |tag| %> <%= tag.name %> @@ -67,6 +64,7 @@ <% end %>
+
<%= site.views_english %> unique views
<%= site.hits_english %> hits
<%= site.follows_dataset.count %> followers
<%= site.tips_dataset.count %> tips ($<%= site.tip_amount %>)
diff --git a/views/site.erb b/views/site.erb index 1ac2ab87..a1dbfe33 100644 --- a/views/site.erb +++ b/views/site.erb @@ -22,6 +22,7 @@

<%= site.title %> <% if site.supporter? && !site.ended_supporter? %> <% end %>

<%= site.host %>

+
<%= site.views_english %> views
<%= site.hits_english %> hits
<%= site.follows_dataset.count %> followers