#!/usr/bin/env ruby puts "" # puts "(press ^C to abort)" paste = (!STDIN.tty? && !STDIN.closed? || ARGF.filename != ?-) ? ARGF.read : (require "clipboard"; Clipboard.paste) # https://stackoverflow.com/a/68673623/322020 $stdin = open "/dev/tty" puts "paste size: #{paste.size}" require_relative "../lib/paster" paster = Paster paste puts "preview: #{inspected = paste[0,30].inspect; inspected.size <= 30 ? inspected : inspected[0,27] + "..."}" puts "detected language: #{paster.lang || "unknown"}" # change 'detected' to 'assumed' if we make it guess by file extension puts "" require "tty-prompt" # if we delay this the rescue matcher may say 'uninitialized constant TTY' begin # TODO: we overwrite this identifier, why not? options = [ [ { "burn after reading": ["burn"], "5 minutes": [5], "1 hour": [60, 3600], "1 day": [1440, 86400], "3 days": [nil, 259200], "1 week": [10080], "1 month": [40320], "3 months": [nil, 7776000], "1 year": [483840], "virtually forever": [0, -1], }, :expire, "expiration", ], [ { "unlisted": true, "public": false, }, :unlist, "visibility", ], ] apply_variants = lambda do |paster, variants, option_name, _| variants.map do |variant_name, value| [variant_name, paster.dup.tap{ |_| _[option_name] = value }] end end names, paster = options.reduce [[[], paster]] do |pasters, option| pasters.flat_map do |names, paster| apply_variants.call(paster, *option).map do |variant_name, paster| [[*names, variant_name], paster] end end end.max_by{ |_, paster| paster.services.size } abort "no pastebin for such size" if paster.services.size.zero? # otherwise tty-prompt fails with an unhandled exception, lol loop do option, index = TTY::Prompt.new.select "change current options if needed:", [ *options.map.with_index{ |option, i| {name: "#{option[2]}: #{names[i]}", value: [option, i]} }, {name: "proceed", value: nil}, ], default: "proceed", filter: true, cycle: true, per_page: 100 break unless option paster, names[index] = TTY::Prompt.new.select "#{option[2]}:", apply_variants.call(paster, *option).map{ |name, paster| size = paster.services.size size.zero? ? {name: "#{name}", value: [paster, name], disabled: "(no pastebins)"} : {name: "#{name} (#{size})", value: [paster, name]} }, default: option[0].keys.index(names[index]) + 1, filter: true, cycle: true, per_page: 100 end rescue TTY::Reader::InputInterrupt # we don't use TTY::Prompt.new(interrupt: :exit) because it does not finish the last printed line abort "\n\n(interrupted by SIGINT)" end if ENV.include? "DRYRUN" require "pp" pp paster else paster.paste end puts ""