56 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/env ruby
 | |
| 
 | |
| require 'time'
 | |
| 
 | |
| def valid_log(lines)
 | |
|   lines.reduce(["L",true]){|acc,line|
 | |
|     if acc[1] && line[0] != acc[0] then
 | |
|       [line[0], true]
 | |
|     else
 | |
|       [nil, false]
 | |
|     end
 | |
|   }[1]
 | |
| end
 | |
| 
 | |
| if ARGV[0] == '-h' then
 | |
|   puts <<~HELP
 | |
|     Usage: unlock-parse [-s] DAY...
 | |
|       -s  short output, total only
 | |
|   HELP
 | |
|   exit
 | |
| end
 | |
| 
 | |
| if ARGV[0] == '-s' then
 | |
|   short=true
 | |
|   days=ARGV[1..-1]
 | |
| else
 | |
|   short=false
 | |
|   days=ARGV
 | |
| end
 | |
| 
 | |
| days.empty? && days = [Date.today.iso8601]
 | |
| 
 | |
| days.each do |logday|
 | |
| 
 | |
| 
 | |
|   path = if File.exists? logday then logday else ENV['XDG_DATA_HOME'] + '/log/locktime/' + logday end
 | |
| 
 | |
|   log = File.readlines(path)
 | |
| 
 | |
|   if ! valid_log(log) then puts "Invalid log file"; exit 1 end
 | |
| 
 | |
|   if log.length % 2 != 0 then
 | |
|     log << "L " + Time.now.iso8601
 | |
|   end
 | |
| 
 | |
|   times = log.each_slice(2).map{|e|
 | |
|     Time.parse(e[1][2..-1]) - Time.parse(e[0][2..-1])
 | |
|   }
 | |
| 
 | |
|   if ! short then
 | |
|     times.map{|t| Time.at(t).utc.strftime("%H:%M:%S")}.each{|s|puts s}
 | |
|     puts "\nTotal:"
 | |
|   end
 | |
|   puts Time.at(times.sum).utc.strftime("%H:%M:%S")
 | |
| 
 | |
| end
 | 
