post '/outbox' do # TODO protected! recipients = params[:public] == 'true' ? public : [] recipients << params[:to] tag = [] params[:content].lines.each do |line| tags = line.split(/\s+/).grep(/^#\w+$/) tags.each do |name| tag_url = File.join(TAGS[:url], name.sub('#', '')) tag << { 'type' => 'Hashtag', 'href' => tag_url, 'name' => name } end mentions = line.split(/\s+/).grep(/^@\w+@\S+$/) mentions.each do |mention| actor = actor(mention) tag << { 'type' => 'Mention', 'href' => actor, 'name' => mention } end end attachment = [] extensions = { image: %w[jpeg png], audio: %w[flac wav mp3 ogg], video: %w[mp4 webm] } if params[:media] params[:media].each do |_media| 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, 'url' => line } end end object = { 'type' => 'Note', 'attributedTo' => ACTOR, 'inReplyTo' => params[:inReplyTo], 'content' => "

\n#{params[:content]}\n

", 'attachment' => attachment, 'tag' => tag, 'to' => recipients } activity = outbox 'Create', object, recipients activity['object']['tag'].each do |tag| next unless tag['type'] == 'Hashtag' tag_path = File.join(TAGS[:dir], tag['name'].sub('#', '')) + '.json' next if File.exist? tag_path File.open(tag_path, 'w+') do |f| tag_collection = { '@context' => 'https://www.w3.org/ns/activitystreams', 'id' => tag['href'], 'type' => 'OrderedCollection', 'totalItems' => 0, 'orderedItems' => [] } f.puts tag_collection.to_json end end end