Skip to content

Instantly share code, notes, and snippets.

@bojidar-bg
Created July 1, 2024 18:25
Show Gist options
  • Save bojidar-bg/227e66972e7be2b51a452b96977ece0c to your computer and use it in GitHub Desktop.
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
#!/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