diff options
Diffstat (limited to 'client.rb')
-rw-r--r-- | client.rb | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/client.rb b/client.rb new file mode 100644 index 0000000..2067937 --- /dev/null +++ b/client.rb @@ -0,0 +1,116 @@ + +# client-server +post "/outbox" do + protected! + request.body.rewind # in case someone already read it + body = request.body.read + date = Time.now.strftime("%Y-%m-%dT%H:%M:%S") + # TODO hashtags, replys + outbox_path = File.join("public/outbox", date + ".json") + object_path = File.join("public/objects", date + ".json") + 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, object_path), + "type" => "Note", + "attributedTo" => ACTOR, + "published" => date, + "content" => "", + "to" => ["https://www.w3.org/ns/activitystreams#Public"] + }, + "published" => date, + "to" => ["https://www.w3.org/ns/activitystreams#Public"] + } + recipients = [] + if /^@/.match body + mentions, body = body.split("\n", 2) + mentions.split(/, */).each do |m| + recipients << actor(m.chomp) + end + end + create["object"]["content"] = body.lines.select { |l| !l.empty? }.join("<br>") + recipients += Dir[File.join("public/followers", "*.json")].collect { |f| JSON.parse(File.read(f))["actor"] } + recipients.delete ACTOR + recipients.uniq! + create["object"]["to"] += recipients + create["to"] += recipients + + File.open(outbox_path, "w+") { |f| f.puts create.to_json } + File.open(object_path, "w+") { |f| f.puts create["object"].to_json } + + recipients.each { |r| send_signed create, r } +end + +post "/archive" do + protected! + FileUtils.mv params['file'], "archive/" + redirect to(params['redirect']) +end + +post "/delete" do + protected! + FileUtils.rm params['file'] + redirect to(params['redirect']) +end + +post "/delete_all" do + protected! + FileUtils.rm Dir["inbox/*.json"] + redirect to("/") +end + +post "/follow/*/*" do + protected! + mention = params['splat'][0] + actor = actor(mention) + follow = { "@context" => "https://www.w3.org/ns/activitystreams", + "id" => File.join(SOCIAL_URL, "following", mention + ".json"), + "type" => "Follow", + "actor" => ACTOR, + "object" => actor } + send_signed follow, actor + redirect to("/") +end + +post "/unfollow/*" do + protected! + mention = params['splat'][0] + actor = actor(mention) + 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)) } + send_signed undo, actor + FileUtils.rm following_path + redirect to("/") + end +end + +post "/login" do + session["client"] = true if params["secret"] == File.read(".pwd").chomp + redirect to("/") +end + +# private +["/", "/archive"].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 + threads + erb :index + end +end |