parent
							
								
									04648a4117
								
							
						
					
					
						commit
						de5f0b0760
					
				
				 5 changed files with 160 additions and 5 deletions
			
			
		@ -0,0 +1,155 @@ | 
				
			|||||||
 | 
					#!/usr/bin/python3 | 
				
			||||||
 | 
					from __future__ import print_function | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import string | 
				
			||||||
 | 
					import datetime | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Time: | 
				
			||||||
 | 
					    def __init__(self, secs, mins=0, hours=0, days=0): | 
				
			||||||
 | 
					        self.secs = secs | 
				
			||||||
 | 
					        self.mins = secs // 60 + mins | 
				
			||||||
 | 
					        self.secs %= 60 | 
				
			||||||
 | 
					        self.hours = self.mins // 60 + hours | 
				
			||||||
 | 
					        self.mins %= 60 | 
				
			||||||
 | 
					        self.days = self.hours // 24 + days | 
				
			||||||
 | 
					        self.hours %= 24 | 
				
			||||||
 | 
					     | 
				
			||||||
 | 
					    def epoch(self): | 
				
			||||||
 | 
					        return self.secs + (self.mins + (self.hours + self.days * 24) * 60) * 60 | 
				
			||||||
 | 
					     | 
				
			||||||
 | 
					    def __str__(self): | 
				
			||||||
 | 
					        s = "%02i:%02i" % (self.mins, self.secs) | 
				
			||||||
 | 
					        if self.hours > 0: | 
				
			||||||
 | 
					            s = "%02i:%s" % (self.hours, s) | 
				
			||||||
 | 
					        if self.days > 0: | 
				
			||||||
 | 
					            s = "%id %s" % (self.days, s) | 
				
			||||||
 | 
					        return s | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __isub__(self, n): | 
				
			||||||
 | 
					        if isinstance(n, Time): | 
				
			||||||
 | 
					            self.secs -= n.secs | 
				
			||||||
 | 
					            self.mins -= n.mins | 
				
			||||||
 | 
					            self.hours -= n.hours | 
				
			||||||
 | 
					            self.days -= n.days | 
				
			||||||
 | 
					        else: | 
				
			||||||
 | 
					            self.secs -= n | 
				
			||||||
 | 
					        while self.secs < 0: | 
				
			||||||
 | 
					            self.secs += 60 | 
				
			||||||
 | 
					            self.mins -= 1 | 
				
			||||||
 | 
					        while self.mins < 0: | 
				
			||||||
 | 
					            self.mins += 60 | 
				
			||||||
 | 
					            self.hours -= 1 | 
				
			||||||
 | 
					        while self.hours < 0: | 
				
			||||||
 | 
					            self.hours += 24 | 
				
			||||||
 | 
					            self.days -= 1 | 
				
			||||||
 | 
					     | 
				
			||||||
 | 
					    def dec(self): | 
				
			||||||
 | 
					        if self.secs > 0: | 
				
			||||||
 | 
					            self.secs -= 1 | 
				
			||||||
 | 
					        else: | 
				
			||||||
 | 
					            self.secs += 59 | 
				
			||||||
 | 
					            if self.mins > 0: | 
				
			||||||
 | 
					                self.mins -= 1 | 
				
			||||||
 | 
					            else: | 
				
			||||||
 | 
					                self.mins += 59 | 
				
			||||||
 | 
					                if self.hours > 0: | 
				
			||||||
 | 
					                    self.hours -= 1 | 
				
			||||||
 | 
					                else: | 
				
			||||||
 | 
					                    self.hours += 23 | 
				
			||||||
 | 
					                    self.days -= 1 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def positive(self): | 
				
			||||||
 | 
					        return self.secs > 0 or self.mins > 0 or self.hours > 0 or self.days > 0 | 
				
			||||||
 | 
					     | 
				
			||||||
 | 
					    @staticmethod | 
				
			||||||
 | 
					    def parse(s): | 
				
			||||||
 | 
					        secs = 0 | 
				
			||||||
 | 
					        this = "" | 
				
			||||||
 | 
					        for c in s: | 
				
			||||||
 | 
					            if c in string.digits: | 
				
			||||||
 | 
					                this += c | 
				
			||||||
 | 
					            elif c in string.whitespace: | 
				
			||||||
 | 
					                continue | 
				
			||||||
 | 
					            else: | 
				
			||||||
 | 
					                it = int(this) | 
				
			||||||
 | 
					                if c == "d": | 
				
			||||||
 | 
					                    it *= 24 | 
				
			||||||
 | 
					                if c in "dh": | 
				
			||||||
 | 
					                    it *= 60 | 
				
			||||||
 | 
					                if c in "dhm": | 
				
			||||||
 | 
					                    it *= 60 | 
				
			||||||
 | 
					                if c in "dhms": | 
				
			||||||
 | 
					                    secs += it | 
				
			||||||
 | 
					                else: | 
				
			||||||
 | 
					                    raise ValueError("Unknown time unit: %s, Valid: _d_ays, _h_ours, _m_inutes, _s_econds. s at the end can be omitted." % c) | 
				
			||||||
 | 
					                this = "" | 
				
			||||||
 | 
					        if this: | 
				
			||||||
 | 
					            secs += int(this) | 
				
			||||||
 | 
					        return secs | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @classmethod | 
				
			||||||
 | 
					    def until(cls, time): | 
				
			||||||
 | 
					        error = ValueError("--until format: <hour>:<minute>[:<second>][+<days>]") | 
				
			||||||
 | 
					        parts = time.rsplit("+", 1) | 
				
			||||||
 | 
					        if len(parts) > 2: | 
				
			||||||
 | 
					            raise error | 
				
			||||||
 | 
					        elif len(parts) < 2: | 
				
			||||||
 | 
					            time, dayoffset = parts[0], 0 | 
				
			||||||
 | 
					        else: | 
				
			||||||
 | 
					            time, dayoffset = parts[0], int(parts[1]) | 
				
			||||||
 | 
					        parts = time.split(":") | 
				
			||||||
 | 
					        if len(parts) < 2 or len(parts) > 3: | 
				
			||||||
 | 
					            raise error | 
				
			||||||
 | 
					        else: | 
				
			||||||
 | 
					            date = datetime.date.today() + datetime.timedelta(days=dayoffset) | 
				
			||||||
 | 
					            time = datetime.time(*map(int, parts)) | 
				
			||||||
 | 
					            comp = datetime.datetime.combine(date, time) | 
				
			||||||
 | 
					            diff = comp - datetime.datetime.now() | 
				
			||||||
 | 
					            return diff.total_seconds() | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import argparse | 
				
			||||||
 | 
					import os | 
				
			||||||
 | 
					import time | 
				
			||||||
 | 
					import shlex | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def main(argv): | 
				
			||||||
 | 
					    parser = argparse.ArgumentParser(prog=argv[0], usage="Sleep with visual feedback, Time arguments will get summed") | 
				
			||||||
 | 
					    parser.add_argument("time", help="Time to sleep in seconds, or with units (d,h,m,s)", nargs="?", default=0) | 
				
			||||||
 | 
					    parser.add_argument("--mins", "--minutes", help="Time to sleep in minutes", default=0, type=int) | 
				
			||||||
 | 
					    parser.add_argument("--hours", help="Time to sleep in hours", default=0, type=int) | 
				
			||||||
 | 
					    parser.add_argument("--days", help="Time to sleep in days", default=0, type=int) | 
				
			||||||
 | 
					    parser.add_argument("--until", help="Sleep until: '<hour>:<minute>[:<second>][+<dayoffset>]'.") | 
				
			||||||
 | 
					    parser.add_argument("--exec", help="Execute command", dest="exec_") | 
				
			||||||
 | 
					    args = parser.parse_args(argv[1:]) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (args.time == args.mins == args.hours == args.days == 0 and args.until is None): | 
				
			||||||
 | 
					        raise SystemExit("You need to specify at least one time argument! (Try --help)") | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if args.until is not None: | 
				
			||||||
 | 
					        secs = Time.until(args.until) | 
				
			||||||
 | 
					    else: | 
				
			||||||
 | 
					        secs = 0 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if args.time != 0: | 
				
			||||||
 | 
					        secs += Time.parse(args.time) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    visualsleep(Time(secs, args.mins, args.hours, args.days)) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if args.exec_: | 
				
			||||||
 | 
					        argv = shlex.split(args.exec_) | 
				
			||||||
 | 
					        print("Executing: %s" % args.exec_) | 
				
			||||||
 | 
					        os.execvp(argv[0], argv) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def visualsleep(t): | 
				
			||||||
 | 
					    copyoft = Time(t.epoch()) | 
				
			||||||
 | 
					    while t.positive(): | 
				
			||||||
 | 
					        print("Sleep %10s" % t, end="\r") | 
				
			||||||
 | 
					        time.sleep(1) | 
				
			||||||
 | 
					        t.dec() | 
				
			||||||
 | 
					    print("Slept %10s" % copyoft) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__": | 
				
			||||||
 | 
					    import sys | 
				
			||||||
 | 
					    main(sys.argv) | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1 +1 @@ | 
				
			|||||||
Subproject commit c98da90662a11e7ac1e046ccd6a99edd21e68312 | 
					Subproject commit c34098af20cafdf016f68f3e7f612ed60ca93aa1 | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue