crystal-gauntlet/src/lib/format.cr

90 lines
2 KiB
Crystal
Raw Normal View History

2022-12-30 17:04:27 +01:00
module CrystalGauntlet::Format
extend self
2022-12-31 15:04:43 +01:00
TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
def fmt_timespan(s : Time::Span) : String
seconds = s.total_seconds.floor()
minutes = s.total_minutes.floor()
hours = s.total_hours.floor()
days = s.total_days.floor()
months = (s.total_days / 30).floor()
years = (s.total_days / 365).floor()
case
when months >= 17
"#{years.to_i} year#{years == 1 ? "" : "s"}"
when days >= 31
"#{months.to_i} month#{months == 1 ? "" : "s"}"
when hours >= 24
"#{days.to_i} day#{days == 1 ? "" : "s"}"
when minutes >= 60
"#{hours.to_i} hour#{hours == 1 ? "" : "s"}"
when seconds >= 60
"#{minutes.to_i} minute#{minutes == 1 ? "" : "s"}"
else
"#{seconds.to_i} second#{seconds == 1 ? "" : "s"}"
end
end
2022-12-30 17:04:27 +01:00
def fmt_value(v) : String
case v
when Bool
v ? "1" : "0"
when String
v
2022-12-31 15:04:43 +01:00
when Time::Span
fmt_span(v)
2022-12-30 17:04:27 +01:00
else
v.to_s
end
end
def fmt_hash(hash) : String
hash.map_with_index{ |(i, v)| "#{i}:#{fmt_value(v)}" }.join(":")
end
2022-12-31 14:25:43 +01:00
def fmt_song(hash) : String
hash.map_with_index{ |(i, v)| "#{i}~|~#{fmt_value(v)}" }.join("~|~")
end
2022-12-31 19:29:51 +01:00
def fmt_comment(hash) : String
hash.map_with_index{ |(i, v)| "#{i}~#{fmt_value(v)}" }.join("~")
end
2022-12-30 17:04:27 +01:00
end
module CrystalGauntlet::GDBase64
extend self
def encode(v)
Base64.encode(v).gsub('/', '_').gsub('+', '-').strip("\n")
2022-12-30 17:04:27 +01:00
end
def decode(v)
Base64.decode(v.gsub('_', '/').gsub('-', '+'))
end
def decode_string(v)
Base64.decode_string(v.gsub('_', '/').gsub('-', '+'))
2022-12-30 17:04:27 +01:00
end
end
module CrystalGauntlet::XorCrypt
extend self
def encrypt(x : Bytes, key : Bytes) : Bytes
result = Bytes.new(x.size)
x.each.with_index() do |chr, index|
result[index] = (chr ^ key[index % key.size])
end
result
end
def encrypt_string(x : String, key : String) : Bytes
result = Bytes.new(x.bytesize)
x.bytes.each.with_index() do |chr, index|
result[index] = (chr ^ key.byte_at(index % key.bytesize))
end
result
end
end