summaryrefslogtreecommitdiff
path: root/client.rb
diff options
context:
space:
mode:
Diffstat (limited to 'client.rb')
-rw-r--r--client.rb116
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