require "option_parser" require "yaml" require "colorize" class Password include YAML::Serializable @[YAML::Field(key: "url")] property url : String @[YAML::Field(key: "email")] property email : String @[YAML::Field(key: "login")] property login : String @[YAML::Field(key: "password")] property password : String @[YAML::Field(key: "desc")] property desc : String @[YAML::Field(key: "profile_url")] property profile_url : String @[YAML::Field(key: "update")] property update : Int32 end VERSION = "0.1.0" begin OptionParser.parse do |parser| parser.banner = "Welcome to The Beatles App!" parser.on "-v", "--version", "Show version" do puts "Version #{VERSION}" exit end parser.on "-h", "--help", "Show help" do puts parser exit end parser.on "-g", "--generate-password", "Generate password" do puts Random::Secure.urlsafe_base64(16, padding: false).colorize(:black).back(:white) puts Random::Secure.urlsafe_base64(16, padding: false).colorize(:white).back(:red) puts Random::Secure.urlsafe_base64(16, padding: false).colorize(:white).back(:blue) exit end parser.on "-t", "--unixtime", "Return local timestamp" do puts Time.local.to_unix.colorize(:yellow) exit end end rescue ex puts ex.message, "" end if !File.exists?("pwd.yml") puts "No password.yml file exists." exit(1) end yaml = File.open("pwd.yml") do |file| YAML.parse(file) end new_array = [] of Password count = 0 while count < yaml.size new_array << Password.from_yaml(yaml[count].to_yaml) count += 1 end loop = true while loop print "Enter URL (or :q for exit)\n> " password_string = gets if password_string.to_s == ":q" puts "Bye! 👋🏻" exit elsif password_string.to_s == ":h" puts "Help:\n-----" puts ":s - Return stats" elsif password_string.to_s == ":s" puts "Statictics:\n----------" print "Elements: ".colorize(:yellow) puts new_array.size print "Outdated: ".colorize(:red) outdated_count = 0 current_time = Time.local.to_unix a = [] of String new_array.each do |item| if item.update + (2629743 * 2) < current_time # 2629743 * 2 -- 2 month outdated_count += 1 a << item.url end end puts outdated_count end new_array.each do |item| if item.url.includes?(password_string.to_s) puts item.url.colorize(:magenta).mode(:blink) if !item.email.blank? puts item.email.colorize(:red) end if !item.login.blank? puts item.login.colorize(:yellow) end if !item.password.blank? puts item.password.colorize(:red).back(:red) end if !item.desc.blank? puts item.desc.colorize(:cyan) end if !item.profile_url.blank? puts item.profile_url.colorize(:green) end puts "---".colorize(:dark_gray) end end puts end