require 'yaml' require 'rubygems' require 'sinatra' require 'erb' require 'timedcache' require 'activerecord' require 'feed' require 'user' require 'filter' %w/feed user filter descriptive_feed_item/.map{|f| load "#{f}.rb"} if Sinatra.application.development? configure do $configs = YAML.load_file('config/config.yml') $user_salt = $configs[:user_salt] env = Sinatra.application.options.env.to_sym ActiveRecord::Base.establish_connection($configs[env][:database]) $cache = TimedCache.new($configs[env][:cache]) end ### INIT AND FRONT PAGE set_options(:sessions => true) before do Filter::current_filters = [params[:filters] || []].flatten end get '/' do erb :index end ### USER STUFF get '/login' do redirect '/' if logged_in? erb :login end post '/login' do user = User.find_by_name(params[:name]) if user && user.authorize(params[:password]) session[:user] = user.id redirect '/' else redirect '/login' end end post '/register' do if user = User.new_account(params[:name], params[:password], params[:password_confirmation]) session[:user] = user.id redirect '/' else redirect '/login' end end get '/logout' do session[:user], session[:guest] = nil, nil redirect '/' end ### USER FEED MANAGEMENT get '/myfeeds' do redirect '/login' unless logged_in? @feedblob = current_user.feeds.map{|f| "#{f.url}\n#{f.description}"}.join("\n") erb :myfeeds end post '/myfeeds' do redirect '/login' unless logged_in? feeds = [] params[:feedblog].sub(/^[\r\n]*(.*)[\r\n]*$/, '\1').split(/[\r\n]+/).each_slice(2) do |u, d| unless u.nil? or d.nil? feeds << Feed.new(:url=>u, :description=>d, :user=>current_user) end end current_user.feeds.destroy_all current_user.feeds = feeds current_user.save redirect '/remix' end ### START REMIXING! get '/remix' do @user = current_user || User.find(:first) @feeds = @user.feeds @filters = Filter.options redirect '/myfeeds' if logged_in? and @feeds.count.zero? erb :remix_feed_form end post '/remix' do redirect '/remix' unless (params[:links] || params[:feeds]) @since = params[:since] unless params[:since].nil? or params[:since].empty? @links = params[:links] || get_links_from_feed_urls(params[:feeds], @since) @links = filter_and_order(@links, params[:link_orders]) @pretext, @posttext = params[:pretext], params[:posttext] if params[:submit]=="Complete" erb :remix_complete_form else erb :remix_links_form end end ### Secret administration! get '/admin/users' do redirect '/' unless current_user && current_user.id==1 "
  • " + User.find(:all).map{|u| u.name}.join("
  • ") + "
  • " end get '/admin/feeds' do redirect '/' unless current_user && current_user.id==1 "
  • " + Feed.find(:all).map{|f| f.url}.join("
  • ") + "
  • " end ### HELPERS helpers do include ERB::Util def get_links_from_feed_urls(feed_urls, date_since) date_since = date_since && Time.parse(date_since) feed_urls = feed_urls.map{|p| Feed.new(:url=>p).to_links}.flatten\ .sort_by{|l| l.date_published or Time.now}\ .reject{|l| date_since && l.date_published < date_since} Filter::current_filters.each_filter(:after_feeds_pulled) do |f| feed_urls.extend(f) feed_urls.run_filter end feed_urls end def filter_and_order(links, order) if links && order links = links.zip(order.map{|o| o.to_i}).sort{|x,y| x[1] <=> y[1]}.map{|ol| (ol[1]>0) && ol[0]} end links = links.delete_if{|l| l.nil? or !l or l==""} end def erb_partial(template) erb template, :layout => false end def logged_in? session && !session[:user].nil? end def current_user if logged_in? @user ||= User.find(session[:user]) end end end