Created
July 1, 2024 18:25
-
-
Save bojidar-bg/227e66972e7be2b51a452b96977ece0c to your computer and use it in GitHub Desktop.
Script enabling do-not-disturb mode for a random amount of time
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
import sys | |
import argparse | |
import dbus | |
import random | |
import time | |
import signal | |
def seconds(s): | |
return sum([ 60**i * part for i, part in enumerate(reversed([int(x) for x in s.split(':')])) ]) | |
def seconds_format(s): | |
parts = [] | |
while s > 0: | |
parts.append("%02i"%(s % 60)) | |
s //= 60 | |
if len(parts) < 1: | |
parts.append("00") | |
return ':'.join(reversed(parts)) | |
parser = argparse.ArgumentParser(description='Inhibits notifications on dBus for a random period of time.') | |
parser.add_argument('average_time', metavar='MIN', type=seconds, default=30*60, nargs='?', help='average time to wait (default 30:00)') | |
parser.add_argument('time_spread', metavar='MAX', type=seconds, default=10*60, nargs='?', help='random time to wait (default 10:00)') | |
args = parser.parse_args() | |
notifications = dbus.SessionBus().get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications"); | |
if 'inhibitions' not in notifications.GetCapabilities(): | |
print("Inhibitions are not supported by the org.freedesktop.Notifications implementation") | |
sys.exit(1) | |
n_id = None | |
a_id = None | |
startup = True | |
start_time = time.monotonic() | |
def update_alarm(): | |
if startup: | |
set_alarm(3) | |
else: | |
set_alarm(args.average_time + random_bias * args.time_spread - (time.monotonic() - start_time)) | |
def set_alarm(t): | |
t = int(t - (time.monotonic() - start_time)) | |
if t > 0: | |
signal.alarm(t) | |
else: | |
finish(signal.SIGALRM) | |
def finish(sig, *args,**kwargs): | |
global startup, n_id, a_id | |
if sig == signal.SIGALRM and startup: | |
a_id = notifications.Inhibit(sys.argv[0], "", {}, signature="ssa{sv}") | |
startup = False | |
update_alarm() | |
else: | |
if n_id is not None: | |
notifications.Notify(sys.argv[0], n_id, "notifications", "Focus time end", "Enjoy the noise!", [], {}, 2500 if sig == signal.SIGALRM else 1000, signature="susssasa{sv}i") | |
n_id = None | |
if a_id is not None: | |
notifications.UnInhibit(a_id) | |
a_id = None | |
sys.exit(0) | |
signal.signal(signal.SIGTERM, finish) | |
signal.signal(signal.SIGHUP, finish) | |
signal.signal(signal.SIGINT, finish) | |
signal.signal(signal.SIGALRM, finish) | |
random_bias = random.uniform(-1, 1) | |
n_id = notifications.Notify(sys.argv[0], 0, "notifications-disabled", "Focus time start", "Enjoy the silence!", [], {}, 2500, signature="susssasa{sv}i") | |
while True: | |
print("Waiting for", seconds_format(args.average_time), '±', seconds_format(args.time_spread)) | |
update_alarm() | |
try: | |
inp = input('Change times? ') | |
parts = [x.strip() for x in inp.split(',')] | |
if len(parts) > 0 and parts[0] != '': | |
args.average_time = seconds(parts[0]) | |
if len(parts) > 1 and parts[1] != '': | |
args.time_spread = seconds(parts[1]) | |
except EOFError: | |
finish(signal.SIGINT) | |
break | |
print('\x1b[A\x1b[K\x1b[A\x1b[K', end='') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment