Sobre o Calcurse
Como sempre, reverter para uma funcionalidade (muito) básica, mas ainda assim completa, parece estranho, mas de certa forma refrescante. Não tenho certeza se eu usaria isso.
Embora a parte inferior da janela do Calcurse sugira uma opção para o pipe , e o site do Calcurse mencione " usuário -configurable notification system "Não consegui encontrar uma maneira de usá-lo para notificações agendadas automáticas de todos eventos.
Aomesmotempo:naverdade,essafuncionalidadedelembreteseriaumaadiçãoútil.Oscriptabaixopodeserusadocomoumplug-inparacalcurse
paramostrarlembretes.Esperoquevocêacheútil.
Éextremamentefácildeusar;simplesmenteexecuteoscriptemsegundoplano.Tudooqueelefazéverificaroseventosdehoje(atualizadosduasvezesporminuto)eexecutarnotificaçõesemumtempoarbitrárioantesdaexpiração.
Oqueénecessárioparacriarlembretes
Asaídadocomando:
calcurse-a
parece:
12/29/15:
* Free today!
- 12:00 -> ..:..
See if this script does its job :)
Ocorre imediatamente que os itens agendados começam com um "-", enquanto os itens para todo o dia começam com "*". O que precisamos fazer é criar dois grupos (listas) de itens:
- os agendados
- os não agendados
Da primeira categoria, precisamos analisar o tempo, convertê-lo em um formato com o qual possamos calcular, para que possamos mostrar o lembrete em n
- minutos antes da expiração.
Posteriormente, precisamos "ficar de olho no relógio", para comparar o tempo definido (do evento) com o horário atual. Se o intervalo de tempo entre os dois entrar no tempo de aviso definido, simplesmente mostre a notificação.
Finalmente, para evitar notificações repetidas, precisamos adicionar o item a uma lista "concluída".
Além disso, o script limpa a lista "concluída"; se um item não ocorrer mais nos itens de hoje (seja se você o removeu ou o dia mudou durante a sessão), os itens serão removidos automaticamente.
O resultado
Na inicialização (log in)
Emumtempoarbitrárioantesdaexpiração(nestecaso,15minutos)
osscriptslembramvocêemumanotificação:
Oscript
#!/usr/bin/env python3
import subprocess
import time
import sys
warn = int(sys.argv[1])
def get(command):
return subprocess.check_output(command).decode("utf-8")
def convert(t):
# convert set time into a calculate- able time
return [int(n) for n in t.split(":")]
def calc_diff(t_curr, t_event):
# calculate time span
diff_hr = (t_event[0] - t_curr[0])*60
diff_m = t_event[1] - t_curr[1]
return diff_hr + diff_m
def cleanup(done, newlist):
# clean up "done" -lists
for item in done:
if not item in newlist:
done.remove(item)
return done
def show_time(event, s = ""):
# show scheduled event
hrs = str(event[0][0]); mnts = str(event[0][1])
mnts = "0"+mnts if len(mnts) != 2 else mnts
subprocess.call(["notify-send", s, "At "+hrs+":"+mnts+" - "+event[1]])
startups = []; times = []
while True:
currtime = convert(time.strftime("%H:%M"))
events = [l.strip() for l in get(["calcurse", "-a"]).splitlines()][1:]
# arrange event data:
groups = []; sub = []
for l in events:
if l.startswith("* "):
groups.append([l.replace("* ", "")])
elif l.startswith("- "):
sub.append(convert(l.split("->")[0].replace("-", "").strip()))
else:
groups.append(sub+[l])
sub = []
# run notifications
for item in groups:
# on startup:
if not item in startups:
# all- day events
if len(item) == 1:
subprocess.call(["notify-send", "Today - "+item[0]])
# time- specific events
elif len(item) == 2:
show_time(item, "Appointment")
startups.append(item)
# as a reminder:
if all([len(item) == 2, not item in times]):
span = calc_diff(currtime, item[0])
if span <= warn:
show_time(item, "[Reminder]")
times.append(item)
# clean up events
startups = cleanup(startups, groups); times = cleanup(times, groups)
time.sleep(30)
Como usar
- Copie o script em um arquivo vazio, salve-o como
run_ccursereminders.py
-
Teste- execute-o com o tempo que você gostaria de ser avisado (antes do tempo de expiração, em minutos) como argumento. Um exemplo, para executar lembretes 30 minutos antes da sua consulta:
python3 /path/to/run_ccursereminders.py 30
-
Se funcionar como você deseja, adicione-o a Startup Applications: escolha Dash > Aplicativos de inicialização > Adicionar. Adicione o comando
/bin/bash -c "sleep 30 && python3 /path/to/run_ccursereminders.py 30"
em que o último
30
é o número de minutos para avisá-lo antes de um compromisso expirar