diff options
-rw-r--r-- | client.rb | 79 | ||||
-rw-r--r-- | helpers.rb | 81 | ||||
-rw-r--r-- | views/item.erb | 26 |
3 files changed, 94 insertions, 92 deletions
@@ -14,7 +14,6 @@ post "/outbox" do recipients.delete ACTOR recipients.uniq! - p params create = { "@context" => "https://www.w3.org/ns/activitystreams", "id" => File.join(SOCIAL_URL, outbox_path), @@ -44,7 +43,7 @@ post "/outbox" do #create["object"]["to"] += recipients #create["to"] += recipients #p params["to"] - p create + #p create File.open(outbox_path, "w+") { |f| f.puts create.to_json } File.open(object_path, "w+") { |f| f.puts create["object"].to_json } @@ -131,4 +130,80 @@ helpers do redirect("/login.html") unless session['client'] end + def items + nr = 0 + files = Dir[File.join(@dir, '*.json')] + Dir['public/objects/*.json'] + @items = files.sort.collect do |file| + item = JSON.parse(File.read(file)) + mention = mention(item['attributedTo']) + following_path = File.join('public', 'following', mention + '.json') + File.exists?(following_path) ? follow = 'unfollow' : follow = 'follow' + nr += 1 + { :id => item['id'], + :nr => nr, + :parent => item['inReplyTo'], + :file => file, + :actor_url => item['attributedTo'], + :mention => mention, + :follow => follow, + :content => item['content'], + :attachment => item['attachment'], + :indent => 2, + :replies => [] + } + end.compact + @items.last[:nr] = @items.last[:nr] - 2 unless @items.empty? + end + + def threads + items + @threads = [] + @items.each do |i| + if i[:parent].nil? or @items.select{|it| it[:id] == i[:parent] }.empty? + @threads << i + else + @items.select{|it| it[:id] == i[:parent] }.each do |it| + i[:indent] = it[:indent] + 2 + it[:replies] << i + end + end + end + end + + def html item + @item = item + erb :item + end + + def people + File.read('cache/people.tsv').split("\n").collect {|l| l.chomp.split("\t")} + end + + def mention actor + person = people.select{|p| p[1] == actor} + if person.empty? + mention = "#{fetch(actor)["preferredUsername"]}@#{URI(actor).host}" + File.open('cache/people.tsv','a'){|f| f.puts "#{mention}\t#{actor}"} + mention + else + person[0][0] + end + end + + def actor mention + mention = mention.sub(/^@/, '').chomp + actors = people.select{|p| p[0] == mention} + if actors.empty? + user, server = mention.split("@") + actor = fetch("https://#{server}/.well-known/webfinger?resource=acct:#{mention}", + "application/jrd+json")["links"].select { |l| + l["rel"] == "self" + }[0]["href"] + File.open('cache/people.tsv','a'){|f| f.puts "#{mention}\t#{actor}"} + actor + else + actors[0][1] + end + end + end @@ -1,80 +1,5 @@ helpers do - def items - nr = 0 - @items = Dir[File.join(@dir, '*.json')].sort.collect do |file| - item = JSON.parse(File.read(file)) - mention = mention(item['attributedTo']) - following_path = File.join('public', 'following', mention + '.json') - File.exists?(following_path) ? follow = 'unfollow' : follow = 'follow' - nr += 1 - { :id => item['id'], - :nr => nr, - :parent => item['inReplyTo'], - :file => file, - :actor_url => item['attributedTo'], - :mention => mention, - :follow => follow, - :content => item['content'], - :attachment => item['attachment'], - :indent => 2, - :replies => [] - } - end.compact - @items.last[:nr] = @items.last[:nr] - 2 unless @items.empty? - end - - def threads - items - @threads = [] - @items.each do |i| - if i[:parent].nil? or @items.select{|it| it[:id] == i[:parent] }.empty? - @threads << i - else - @items.select{|it| it[:id] == i[:parent] }.each do |it| - i[:indent] = it[:indent] + 2 - it[:replies] << i - end - end - end - end - - def html item - @item = item - erb :item - end - - def people - File.read('cache/people.tsv').split("\n").collect {|l| l.chomp.split("\t")} - end - - def mention actor - person = people.select{|p| p[1] == actor} - if person.empty? - mention = "#{fetch(actor)["preferredUsername"]}@#{URI(actor).host}" - File.open('cache/people.tsv','a'){|f| f.puts "#{mention}\t#{actor}"} - mention - else - person[0][0] - end - end - - def actor mention - mention = mention.sub(/^@/, '').chomp - actors = people.select{|p| p[0] == mention} - if actors.empty? - user, server = mention.split("@") - actor = fetch("https://#{server}/.well-known/webfinger?resource=acct:#{mention}", - "application/jrd+json")["links"].select { |l| - l["rel"] == "self" - }[0]["href"] - File.open('cache/people.tsv','a'){|f| f.puts "#{mention}\t#{actor}"} - actor - else - actors[0][1] - end - end - def fetch url, accept = 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' p url response = `/run/current-system/sw/bin/curl --fail-with-body -sSL -H 'Accept: #{accept}' #{url}` @@ -98,9 +23,9 @@ helpers do signature = Base64.strict_encode64(keypair.sign(OpenSSL::Digest.new('SHA256'), signed_string)) signed_header = 'keyId="' + ACTOR + '#main-key",algorithm="rsa-sha256",headers="(request-target) host date digest content-type",signature="' + signature + '"' - p url - #puts `/run/current-system/sw/bin/curl --fail-with-body -sSL -X POST -H 'Content-Type: application/activity+json' -H 'Host: #{host}' -H 'Date: #{date}' -H 'Digest: #{digest}' -H 'Signature: #{signed_header}' -d '#{body}' #{inbox}` - puts `/run/current-system/sw/bin/curl -iL -X POST -H 'Content-Type: application/activity+json' -H 'Host: #{host}' -H 'Date: #{date}' -H 'Digest: #{digest}' -H 'Signature: #{signed_header}' -d '#{body}' #{inbox}` + #p url + puts `/run/current-system/sw/bin/curl --fail-with-body -sSL -X POST -H 'Content-Type: application/activity+json' -H 'Host: #{host}' -H 'Date: #{date}' -H 'Digest: #{digest}' -H 'Signature: #{signed_header}' -d '#{body}' #{inbox}` + #puts `/run/current-system/sw/bin/curl -iL -X POST -H 'Content-Type: application/activity+json' -H 'Host: #{host}' -H 'Date: #{date}' -H 'Digest: #{digest}' -H 'Signature: #{signed_header}' -d '#{body}' #{inbox}` end end diff --git a/views/item.erb b/views/item.erb index 933fe71..287054e 100644 --- a/views/item.erb +++ b/views/item.erb @@ -1,21 +1,23 @@ <div style='margin-left:<%= @item[:indent] %>em' id='<%= @item[:nr] %>'> <b><a href='<%= @item[:actor_url] %>', target='_blank'><%= @item[:mention] %></a></b> - <form action='<%= File.join @item[:follow], @item[:mention] %>' method='post'> - <button><%= @item[:follow].capitalize %></button> - </form> - - <form action='/delete' method='post'> - <input type='hidden' name='file' value='<%= @item[:file] %>' /> - <input type='hidden' name='redirect' value='/<%= @dir.sub('inbox','') %>#<%= @item[:nr] %>' /> - <button>Delete</button> - </form> - <% if @dir == 'inbox' %> + <% if @item[:mention] != ACCOUNT %> + <form action='<%= File.join @item[:follow], @item[:mention] %>' method='post'> + <button><%= @item[:follow].capitalize %></button> + </form> - <form action='/archive' method='post'> + <form action='/delete' method='post'> <input type='hidden' name='file' value='<%= @item[:file] %>' /> <input type='hidden' name='redirect' value='/<%= @dir.sub('inbox','') %>#<%= @item[:nr] %>' /> - <button>Archive</button> + <button>Delete</button> </form> + <% if @dir == 'inbox' %> + + <form action='/archive' method='post'> + <input type='hidden' name='file' value='<%= @item[:file] %>' /> + <input type='hidden' name='redirect' value='/<%= @dir.sub('inbox','') %>#<%= @item[:nr] %>' /> + <button>Archive</button> + </form> + <% end %> <% end %> <%= @item[:content] %> <% if @item[:attachment] |