summaryrefslogtreecommitdiff
path: root/client.rb
diff options
context:
space:
mode:
Diffstat (limited to 'client.rb')
-rw-r--r--client.rb201
1 files changed, 85 insertions, 116 deletions
diff --git a/client.rb b/client.rb
index abf565d..b62f139 100644
--- a/client.rb
+++ b/client.rb
@@ -1,28 +1,30 @@
+# frozen_string_literal: true
+
# client-server
-post "/" do
+post '/' do
protected!
- date = Time.now.strftime("%Y-%m-%dT%H:%M:%S")
- outbox_path = File.join("public/outbox", date + ".json")
- notes_path = File.join("public/notes", date + ".json")
+ date = Time.now.strftime('%Y-%m-%dT%H:%M:%S')
+ outbox_path = File.join('public/outbox', "#{date}.json")
+ notes_path = File.join('public/notes', "#{date}.json")
- recipients = ["https://www.w3.org/ns/activitystreams#Public", params[:to]]
- recipients += Dir[File.join("public/followers", "*.json")].collect { |f| JSON.parse(File.read(f))["actor"] }
+ recipients = ['https://www.w3.org/ns/activitystreams#Public', params[:to]]
+ recipients += Dir[File.join('public/followers', '*.json')].collect { |f| JSON.parse(File.read(f))['actor'] }
recipients.delete ACTOR
recipients.uniq!
-
+
content = []
attachment = []
tag = []
extensions = {
- :image => ["jpeg","png"],
- :audio => ["flac","wav","mp3","ogg"],
- :video => ["mp4","webm"]
+ image: %w[jpeg png],
+ audio: %w[flac wav mp3 ogg],
+ video: %w[mp4 webm]
}
params[:content].lines.each do |line|
line.chomp!
if line.match(/^http/)
- ext = File.extname(line).sub('.','')
- media_type = extensions.select{|k,v| v.include? ext}.keys[0].to_s + '/' + ext
+ ext = File.extname(line).sub('.', '')
+ media_type = extensions.select { |_k, v| v.include? ext }.keys[0].to_s + '/' + ext
attachment << {
'type' => 'Document',
'mediaType' => media_type,
@@ -31,7 +33,7 @@ post "/" do
else
tags = line.split(/\s+/).grep(/^#\w+$/)
tags.each do |name|
- href = File.join(SOCIAL_URL,'tags',name.sub('#',''))
+ href = File.join(SOCIAL_URL, 'tags', name.sub('#', ''))
tag << {
'type' => 'Hashtag',
'href' => href,
@@ -44,161 +46,129 @@ post "/" do
end
create = {
- "@context" => "https://www.w3.org/ns/activitystreams",
- "id" => File.join(SOCIAL_URL, outbox_path),
- "type" => "Create",
- "actor" => ACTOR,
- "object" => {
- "id" => File.join(SOCIAL_URL, notes_path),
- "type" => "Note",
- "attributedTo" => ACTOR,
- "inReplyTo" => params[:inReplyTo],
- "published" => date,
- "content" => "<p>\n"+content.join("\n<br>")+"\n</p>",
- "attachment" => attachment,
- "tag" => tag,
- "to" => recipients
+ '@context' => 'https://www.w3.org/ns/activitystreams',
+ 'id' => File.join(SOCIAL_URL, outbox_path),
+ 'type' => 'Create',
+ 'actor' => ACTOR,
+ 'object' => {
+ 'id' => File.join(SOCIAL_URL, notes_path),
+ 'type' => 'Note',
+ 'attributedTo' => ACTOR,
+ 'inReplyTo' => params[:inReplyTo],
+ 'published' => date,
+ 'content' => "<p>\n#{content.join("\n<br>")}\n</p>",
+ 'attachment' => attachment,
+ 'tag' => tag,
+ 'to' => recipients
},
- "published" => date,
- "to" => recipients
+ 'published' => date,
+ 'to' => recipients
}
- File.open(outbox_path, "w+") { |f| f.puts create.to_json }
- File.open(notes_path, "w+") { |f| f.puts create["object"].to_json }
+ File.open(outbox_path, 'w+') { |f| f.puts create.to_json }
+ File.open(notes_path, 'w+') { |f| f.puts create['object'].to_json }
tag.each do |t|
- dir = File.join('public','tags',t['name'].sub('#',''))
+ dir = File.join('public', 'tags', t['name'].sub('#', ''))
FileUtils.mkdir_p dir
- FileUtils.ln_s File.join('/srv/social/',notes_path), dir
+ FileUtils.ln_s File.join('/srv/social/', notes_path), dir
end
- #recipients.delete "https://www.w3.org/ns/activitystreams#Public"
- #recipients.each { |r| send_signed create, r }
- send_signed create #, r }
+ # recipients.delete "https://www.w3.org/ns/activitystreams#Public"
+ # recipients.each { |r| send_signed create, r }
+ # send_signed create # , r }
+ outbox create
redirect params['redirect']
end
-post "/archive" do
+post '/archive' do
protected!
- FileUtils.mv params['file'], "archive/"
+ FileUtils.mv params['file'], 'archive/'
redirect to(params['redirect'])
end
-post "/delete" do # delete not supported by html forms
+post '/delete' do # delete not supported by html forms
protected!
- params['file'] ? FileUtils.rm_f(params['file']) : FileUtils.rm_f(Dir["inbox/*.json"])
- params['redirect'] ? redirect(params['redirect']) : redirect('/')
+ FileUtils.rm_f(params['file'] || Dir['inbox/*.json'])
+ redirect(params['redirect'] || '/')
end
-post "/follow" do
+post '/follow' do
protected!
actor, mention = parse_follow params['follow']
- follow = { "@context" => "https://www.w3.org/ns/activitystreams",
- "id" => File.join(SOCIAL_URL, "following", mention+ ".json"),
- "type" => "Follow",
- "actor" => ACTOR,
- "object" => actor,
- 'to' => [ actor ] }
- send_signed follow#, actor
- redirect "/"
+ follow = { '@context' => 'https://www.w3.org/ns/activitystreams',
+ 'id' => File.join(SOCIAL_URL, 'following', "#{mention}.json"),
+ 'type' => 'Follow',
+ 'actor' => ACTOR,
+ 'object' => actor,
+ 'to' => [actor] }
+ send_signed follow # , actor
+ redirect '/'
end
-post "/unfollow" do
+post '/unfollow' do
protected!
actor, mention = parse_follow params['follow']
- following_path = File.join("public", "following", mention + ".json")
- if File.exists?(following_path)
- undo = { "@context" => "https://www.w3.org/ns/activitystreams",
- "id" => File.join(SOCIAL_URL + "#undo", SecureRandom.uuid),
- "type" => "Undo",
- "actor" => ACTOR,
- "object" => JSON.parse(File.read(following_path)),
- 'to' => [ actor ] }
- send_signed undo#, actor
+ following_path = File.join('public', 'following', "#{mention}.json")
+ if File.exist?(following_path)
+ undo = { '@context' => 'https://www.w3.org/ns/activitystreams',
+ 'id' => File.join("#{SOCIAL_URL}#undo", SecureRandom.uuid),
+ 'type' => 'Undo',
+ 'actor' => ACTOR,
+ 'object' => JSON.parse(File.read(following_path)),
+ 'to' => [actor] }
+ send_signed undo # , actor
FileUtils.rm following_path
- redirect "/"
+ redirect '/'
end
end
-post "/login" do
- session["client"] = true if OpenSSL::Digest::SHA256.base64digest(params["secret"]) == File.read(".digest").chomp
- redirect "/"
+post '/login' do
+ session['client'] = (OpenSSL::Digest::SHA256.base64digest(params['secret']) == File.read('.digest').chomp)
+ redirect '/'
+end
+
+get '/' do
+ redirect '/inbox'
end
-# private
-["/", "/archive"].each do |path|
- get path, :provides => 'html' do
+['/inbox', '/archive', '/outbox'].each do |path|
+ get path, provides: 'html' do
protected!
- if path == '/'
- @dir = 'inbox'
- @alt_dir = '/archive'
- @alt_name = 'archive'
- else
- @dir = path.sub('/','')
- @alt_dir = '/'
- @alt_name = 'inbox'
- end
+ @items = fetch(File.join(SOCIAL_URL, path))['orderedItems']
threads
- erb :index
+ erb :collection
end
end
helpers do
-
def protected!
halt 403 unless session['client']
end
- def items
- nr = 0
- p @dir
- p Dir[File.join(@dir, '*', '*.json')]# + Dir['public/notes/*.json']
- files = Dir[File.join(@dir, '*', '*.json')] + Dir['public/notes/*.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 => 0,
- :replies => []
- }
- end.compact
- @items.last[:nr] = @items.last[:nr] - 2 unless @items.empty?
+ def outbox(activity)
+ curl("-X POST -d #{activity.to_json}", File.join(SOCIAL_URL, 'outbox'))
end
def threads
- items
@threads = []
@items.each do |i|
- if i[:parent].nil? or @items.select{|it| it[:id] == i[:parent] }.empty?
+ i['indent'] = 0
+ i['replies'] = []
+ if i['inReplyTo'].nil? || @items.select { |it| it['id'] == i['inReplyTo'] }.empty?
@threads << i
else
- @items.select{|it| it[:id] == i[:parent] }.each do |it|
- i[:indent] = it[:indent] + 4
- it[:replies] << i
+ @items.select { |it| it['id'] == i['inReplyTo'] }.each do |it|
+ i['indent'] = it['indent'] + 4
+ it['replies'] << i
end
end
end
end
- def html item
- @item = item
- erb :item
- end
-
- def parse_follow follow
+ def parse_follow(follow)
case follow
when /^#/
- actor = "https://relay.fedi.buzz/tag/#{follow.sub(/^#/,'')}"
+ actor = "https://relay.fedi.buzz/tag/#{follow.sub(/^#/, '')}"
mention = follow
when /^http/
actor = follow
@@ -210,5 +180,4 @@ helpers do
end
[actor, mention]
end
-
end