Cleanup stuff
This commit is contained in:
13
old/mail/aerc-compose-neovim.sh
Executable file
13
old/mail/aerc-compose-neovim.sh
Executable file
@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
exec nvim -u NONE \
|
||||
-c 'packadd leap.nvim' \
|
||||
-c "lua require('leap').add_default_mappings()" \
|
||||
-c 'highlight link LeapBackdrop Comment' \
|
||||
-c 'set spell termguicolors' \
|
||||
-c 'setlocal formatoptions+=wa textwidth=80 comments+=nb:>' \
|
||||
-c "lua require('nvim-treesitter.configs').setup({highlight={enable=true}})" \
|
||||
-c 'packadd nightfox.nvim' \
|
||||
-c 'colorscheme carbonfox' \
|
||||
-c 'startinsert' \
|
||||
"${@}"
|
210
old/mail/mail-reader-daemon.hy
Executable file
210
old/mail/mail-reader-daemon.hy
Executable file
@ -0,0 +1,210 @@
|
||||
#!/usr/bin/env hy
|
||||
|
||||
(import subprocess [Popen run PIPE DEVNULL])
|
||||
(import email.parser :as parser)
|
||||
(import shutil)
|
||||
(import csv)
|
||||
(import sys)
|
||||
(import os)
|
||||
|
||||
(defclass MailInbox []
|
||||
(setv maildir-path None)
|
||||
(defn __init__ [self maildir-path]
|
||||
(setv self.maildir-path maildir-path))
|
||||
(defn get-new-messages [self folder]
|
||||
(let [target-dir (+ self.maildir-path "/" folder "/new")]
|
||||
(lfor file (os.listdir target-dir)
|
||||
(MailMessage.from-file self (+ target-dir "/" file)))))
|
||||
(defn find-by-uid [self uid [exclude-msgs None]]
|
||||
(let [files (str.splitlines
|
||||
(. (run ["rg" "-Fl" uid self.maildir-path]
|
||||
:stdout PIPE :text True) stdout))
|
||||
output #{}]
|
||||
(when (is-not exclude-msgs None)
|
||||
(for [excluded exclude-msgs]
|
||||
(files.remove (os.path.abspath (excluded.get-full-path)))))
|
||||
(for [file files]
|
||||
(let [msg (MailMessage.from-file self file)]
|
||||
(when (= msg.uid uid)
|
||||
(output.add msg))))
|
||||
output))
|
||||
(defn mark-all-read [self uid [exclude-msgs None]]
|
||||
(let [msgs (self.find-by-uid uid exclude-msgs)
|
||||
num 0]
|
||||
(for [msg msgs]
|
||||
(+= num 1)
|
||||
(msg.mark-read))
|
||||
num))
|
||||
(defn mark-all-unread [self uid [exclude-msgs None]]
|
||||
(let [msgs (self.find-by-uid uid exclude-msgs)
|
||||
num 0]
|
||||
(for [msg msgs]
|
||||
(+= num 1)
|
||||
(msg.mark-unread))
|
||||
num)))
|
||||
|
||||
(defclass MailMessage []
|
||||
(setv inbox None
|
||||
uid None
|
||||
file None
|
||||
folder None
|
||||
sender None
|
||||
subject None
|
||||
flags None
|
||||
read? False
|
||||
attachment? False
|
||||
new? False)
|
||||
(defn __init__ [self inbox uid path sender subject attachment?]
|
||||
(let [dir-path (os.path.dirname path)]
|
||||
(setv self.inbox inbox
|
||||
self.uid uid
|
||||
self.file (os.path.basename path)
|
||||
self.folder (os.path.relpath (os.path.dirname dir-path)
|
||||
inbox.maildir-path)
|
||||
self.sender sender
|
||||
self.subject subject
|
||||
self.flags (MailMessage.get-path-flags self.file)
|
||||
self.read? (in "S" self.flags)
|
||||
self.attachment? attachment?
|
||||
self.new? (= (os.path.basename dir-path) "new"))))
|
||||
(defn get-dir-path [self]
|
||||
(+ self.inbox.maildir-path "/"
|
||||
self.folder "/"
|
||||
(if self.new? "new" "cur")))
|
||||
(defn get-full-path [self]
|
||||
(+ (self.get-dir-path) "/" self.file))
|
||||
(defn move [self new-folder]
|
||||
(let [clean-new-folder (MailMessage.-clean-folder new-folder)]
|
||||
(when (!= self.folder clean-new-folder)
|
||||
(shutil.move (self.get-full-path)
|
||||
(+ self.inbox.maildir-path "/"
|
||||
clean-new-folder "/"
|
||||
(if self.new? "new" "cur") "/"
|
||||
self.file))
|
||||
(setv self.folder clean-new-folder))))
|
||||
(defn process [self]
|
||||
(when self.new?
|
||||
(shutil.move (self.get-full-path)
|
||||
(+ self.inbox.maildir-path "/"
|
||||
self.folder
|
||||
"/cur/"
|
||||
self.file))
|
||||
(setv self.new? False)))
|
||||
(defn mark-read [self]
|
||||
(when (not self.read?)
|
||||
(self.flags.add "S")
|
||||
(let [base-name (get self.file (slice (+ (self.file.rindex ",") 1)))
|
||||
new-name (+ base-name (str.join "" self.flags))
|
||||
dir-path (self.get-dir-path)]
|
||||
(shutil.move (+ dir-path "/" self.file) (+ dir-path "/" new-name))
|
||||
(setv self.file new-name
|
||||
self.read? True))))
|
||||
(defn mark-unread [self]
|
||||
(when self.read?
|
||||
(self.flags.remove "S")
|
||||
(let [base-name (get self.file (slice (+ (self.file.rindex ",") 1)))
|
||||
new-name (+ base-name (str.join "" self.flags))
|
||||
dir-path (self.get-dir-path)]
|
||||
(shutil.move (+ dir-path "/" self.file) (+ dir-path "/" new-name))
|
||||
(setv self.file new-name
|
||||
self.read? False))))
|
||||
(defn -parse-from-address [header]
|
||||
(try
|
||||
(let [index (str.index header "<")]
|
||||
(get header (slice 1 (- index 2))))
|
||||
(except [ValueError]
|
||||
header)))
|
||||
(defn -clean-folder [folder]
|
||||
(when (str.startswith folder "/")
|
||||
(setv folder (get folder (slice 1))))
|
||||
(when (str.endswith folder "/")
|
||||
(setv folder (get folder (slice None -1))))
|
||||
folder)
|
||||
(defn -message-has-attachment [mail-obj]
|
||||
(when (mail-obj.is_multipart)
|
||||
(for [part (mail-obj.walk)]
|
||||
(when (str.startswith (part.get "Content-Disposition") "attachment")
|
||||
(return True))))
|
||||
False)
|
||||
(defn get-path-flags [path]
|
||||
(set (get path (slice (+ (path.rindex ",") 1) None))))
|
||||
(defn from-file [inbox path]
|
||||
(with [file-obj (open path "r")]
|
||||
(let [parse (parser.Parser)
|
||||
mail-obj (parse.parse file-obj :headersonly True)]
|
||||
(MailMessage inbox
|
||||
(mail-obj.get "Message-Id")
|
||||
path
|
||||
(MailMessage.-parse-from-address (mail-obj.get "From"))
|
||||
(mail-obj.get "Subject")
|
||||
(MailMessage.-message-has-attachment mail-obj))))))
|
||||
|
||||
(defclass INotifyEvent []
|
||||
(setv path None
|
||||
flags #{}
|
||||
name None)
|
||||
(defn __init__ [self path flags name]
|
||||
(setv self.path (if (path.endswith "/")
|
||||
(get path (slice 0 -1))
|
||||
path)
|
||||
self.flags (set (flags.split ","))
|
||||
self.name name))
|
||||
(defn get-full-path [self]
|
||||
(+ self.path "/" self.name))
|
||||
(defn dir? [self]
|
||||
(in "ISDIR" self.flags))
|
||||
(defn mail-file? [self]
|
||||
(and (not (self.dir?))
|
||||
(in (os.path.basename self.path) ["new" "cur"])))
|
||||
(defn __str__ [self]
|
||||
(+ "Event("
|
||||
self.path ","
|
||||
(str self.flags) ","
|
||||
self.name ")")))
|
||||
|
||||
(defn handle-mail-move [inbox from-event to-event]
|
||||
(let [from-flags (MailMessage.get-path-flags from-event.name)
|
||||
to-flags (MailMessage.get-path-flags to-event.name)]
|
||||
(cond (and (in "S" from-flags) (not-in "S" to-flags))
|
||||
(let [to-msg (MailMessage.from-file inbox (to-event.get-full-path))]
|
||||
(inbox.mark-all-unread to-msg.uid :exclude-msgs [to-msg]))
|
||||
(and (in "S" to-flags) (not-in "S" from-flags))
|
||||
(let [to-msg (MailMessage.from-file inbox (to-event.get-full-path))]
|
||||
(inbox.mark-all-read to-msg.uid :exclude-msgs [to-msg]))
|
||||
True
|
||||
0)))
|
||||
|
||||
(when (< (len sys.argv) 2)
|
||||
(print "usage: mail-reader-daemon.hy <maildir>" :file sys.stderr)
|
||||
(sys.exit 1))
|
||||
|
||||
(when (= (get sys.argv 1) "-h")
|
||||
(print "usage: mail-reader-daemon.hy <maildir>")
|
||||
(sys.exit 0))
|
||||
|
||||
(with [process (Popen ["inotifywait"
|
||||
"-mrce" "MOVED_FROM,MOVED_TO"
|
||||
(get sys.argv 1)]
|
||||
:stdout PIPE
|
||||
:stderr DEVNULL
|
||||
:text True)]
|
||||
(let [reader (csv.reader process.stdout)
|
||||
inbox (MailInbox (get sys.argv 1))
|
||||
skip-count 0
|
||||
from-event None]
|
||||
(for [csv-line reader]
|
||||
(let [event (INotifyEvent #* csv-line)]
|
||||
(setv from-event
|
||||
(cond (> skip-count 0)
|
||||
(do
|
||||
(-= skip-count 1)
|
||||
None)
|
||||
(is from-event None)
|
||||
event
|
||||
True
|
||||
(do
|
||||
(when (from-event.mail-file?)
|
||||
(setv skip-count (* 2 (handle-mail-move inbox
|
||||
from-event
|
||||
event))))
|
||||
None)))))))
|
34
old/mail/mailnag-notify.py
Executable file
34
old/mail/mailnag-notify.py
Executable file
@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env python3
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
|
||||
def notify_send(subj, data):
|
||||
result = subprocess.run(["notify-send", "-t", "0", subj, data])
|
||||
if result.returncode == -127:
|
||||
print("error: notify-send program not found in PATH", file=sys.stderr)
|
||||
exit(1)
|
||||
elif result.returncode != 0:
|
||||
print("error: notify-send failed", file=sys.stderr)
|
||||
exit(1)
|
||||
|
||||
|
||||
senders = {}
|
||||
|
||||
for i in range(2, len(sys.argv), 3):
|
||||
sender = sys.argv[i + 1]
|
||||
subj = sys.argv[i + 2]
|
||||
print(sender)
|
||||
print(subj)
|
||||
if sender not in senders:
|
||||
senders[sender] = subj
|
||||
elif isinstance(subj, str):
|
||||
senders[sender] = 2
|
||||
else:
|
||||
senders[sender] += 1
|
||||
|
||||
for sender, data in senders.items():
|
||||
if isinstance(data, str):
|
||||
notify_send("New mail from " + sender, data)
|
||||
else:
|
||||
notify_send("New mail from " + sender, str(data) + " unread messages")
|
162
old/mail/notify-mail.hy
Executable file
162
old/mail/notify-mail.hy
Executable file
@ -0,0 +1,162 @@
|
||||
#!/usr/bin/env hy
|
||||
|
||||
(import email.parser :as parser)
|
||||
(import subprocess [run CompletedProcess PIPE])
|
||||
(import threading [Thread])
|
||||
(import shutil)
|
||||
(import os)
|
||||
(import sys)
|
||||
|
||||
(defclass MailInbox []
|
||||
(setv maildir-path None)
|
||||
(defn __init__ [self maildir-path]
|
||||
(setv self.maildir-path maildir-path))
|
||||
(defn get-new-messages [self folder]
|
||||
(let [target-dir (+ self.maildir-path "/" folder "/new")]
|
||||
(lfor file (os.listdir target-dir)
|
||||
(MailMessage.from-file self (+ target-dir "/" file)))))
|
||||
(defn find-by-uid [self uid [exclude-msgs None]]
|
||||
(let [files (str.splitlines
|
||||
(. (run ["rg" "-Fl" uid self.maildir-path]
|
||||
:stdout PIPE :text True) stdout))
|
||||
output #{}]
|
||||
(when (is-not exclude-msgs None)
|
||||
(for [excluded exclude-msgs]
|
||||
(files.remove (os.path.abspath (excluded.get-full-path)))))
|
||||
(for [file files]
|
||||
(let [msg (MailMessage.from-file self file)]
|
||||
(when (= msg.uid uid)
|
||||
(output.add msg))))
|
||||
output))
|
||||
(defn mark-all-read [self uid [exclude-msgs None]]
|
||||
(let [msgs (self.find-by-uid uid exclude-msgs)]
|
||||
(for [msg msgs]
|
||||
(msg.mark-read)))))
|
||||
|
||||
(defclass MailMessage []
|
||||
(setv inbox None
|
||||
uid None
|
||||
file None
|
||||
folder None
|
||||
sender None
|
||||
subject None
|
||||
flags None
|
||||
read? False
|
||||
attachment? False
|
||||
new? False)
|
||||
(defn __init__ [self inbox uid path sender subject attachment?]
|
||||
(let [dir-path (os.path.dirname path)]
|
||||
(setv self.inbox inbox
|
||||
self.uid uid
|
||||
self.file (os.path.basename path)
|
||||
self.folder (os.path.relpath (os.path.dirname dir-path)
|
||||
inbox.maildir-path)
|
||||
self.sender sender
|
||||
self.subject subject
|
||||
self.flags (MailMessage.-get-path-flags self.file)
|
||||
self.read? (in "S" self.flags)
|
||||
self.attachment? attachment?
|
||||
self.new? (= (os.path.basename dir-path) "new"))))
|
||||
(defn get-dir-path [self]
|
||||
(+ self.inbox.maildir-path "/"
|
||||
self.folder "/"
|
||||
(if self.new? "new" "cur")))
|
||||
(defn get-full-path [self]
|
||||
(+ (self.get-dir-path) "/" self.file))
|
||||
(defn move [self new-folder]
|
||||
(let [clean-new-folder (MailMessage.-clean-folder new-folder)]
|
||||
(when (!= self.folder clean-new-folder)
|
||||
(shutil.move (self.get-full-path)
|
||||
(+ self.inbox.maildir-path "/"
|
||||
clean-new-folder "/"
|
||||
(if self.new? "new" "cur") "/"
|
||||
self.file))
|
||||
(setv self.folder clean-new-folder))))
|
||||
(defn process [self]
|
||||
(when self.new?
|
||||
(shutil.move (self.get-full-path)
|
||||
(+ self.inbox.maildir-path "/"
|
||||
self.folder
|
||||
"/cur/"
|
||||
self.file))
|
||||
(setv self.new? False)))
|
||||
(defn mark-read [self]
|
||||
(when (not self.read?)
|
||||
(self.flags.add "S")
|
||||
(let [base-name (get self.file (slice (+ (self.file.rindex ",") 1)))
|
||||
new-name (+ base-name (str.join "" self.flags))
|
||||
dir-path (self.get-dir-path)]
|
||||
(shutil.move (+ dir-path "/" self.file) (+ dir-path "/" new-name))
|
||||
(setv self.file new-name
|
||||
self.read? True))))
|
||||
(defn -parse-from-address [header]
|
||||
(try
|
||||
(let [index (str.index header "<")]
|
||||
(get header (slice 1 (- index 2))))
|
||||
(except [ValueError]
|
||||
header)))
|
||||
(defn -clean-folder [folder]
|
||||
(when (str.startswith folder "/")
|
||||
(setv folder (get folder (slice 1))))
|
||||
(when (str.endswith folder "/")
|
||||
(setv folder (get folder (slice None -1))))
|
||||
folder)
|
||||
(defn -get-path-flags [path]
|
||||
(set (get path (slice (+ (path.rindex ",") 1) None))))
|
||||
(defn -message-has-attachment [mail-obj]
|
||||
(when (mail-obj.is_multipart)
|
||||
(for [part (mail-obj.walk)]
|
||||
(when (str.startswith (part.get "Content-Disposition") "attachment")
|
||||
(return True))))
|
||||
False)
|
||||
(defn from-file [inbox path]
|
||||
(with [file-obj (open path "r")]
|
||||
(let [parse (parser.Parser)
|
||||
mail-obj (parse.parse file-obj :headersonly True)]
|
||||
(MailMessage inbox
|
||||
(mail-obj.get "Message-Id")
|
||||
path
|
||||
(MailMessage.-parse-from-address (mail-obj.get "From"))
|
||||
(mail-obj.get "Subject")
|
||||
(MailMessage.-message-has-attachment mail-obj))))))
|
||||
|
||||
(defn notify-send [title desc [time 0] [actions []]]
|
||||
(let [cmd ["notify-send" title desc "-t" (str time)]]
|
||||
(for [action actions]
|
||||
(cmd.append "-A")
|
||||
(cmd.append action))
|
||||
(let [result (run cmd :stdout PIPE :text True)]
|
||||
(try
|
||||
(int result.stdout)
|
||||
(except [ValueError]
|
||||
None)))))
|
||||
|
||||
(defn handle-message [msg]
|
||||
(msg.process)
|
||||
(when (not msg.read?)
|
||||
(match (notify-send (+ (if msg.attachment? " " "")
|
||||
"New mail from " msg.sender)
|
||||
msg.subject
|
||||
:time 10000
|
||||
:actions ["Mark Read" "Delete"])
|
||||
0 (do
|
||||
(msg.mark-read))
|
||||
;;(msg.inbox.mark-all-read msg.uid :exclude-msgs [msg]))
|
||||
1 (do
|
||||
(msg.mark-read)
|
||||
;;(msg.inbox.mark-all-read msg.uid :exclude-msgs [msg])
|
||||
(msg.move "Trash")))))
|
||||
|
||||
(when (< (len sys.argv) 2)
|
||||
(print "usage: notify-mail.hy <maildir>" :file sys.stderr)
|
||||
(sys.exit 1))
|
||||
|
||||
(when (= (get sys.argv 1) "-h")
|
||||
(print "usage: notify-mail.hy <maildir>")
|
||||
(sys.exit 0))
|
||||
|
||||
(let [mail-inbox (MailInbox (get sys.argv 1))
|
||||
new-msgs (mail-inbox.get-new-messages "Inbox")]
|
||||
(for [msg new-msgs]
|
||||
(Thread.start (Thread :target handle-message
|
||||
:args #(msg)))))
|
42
old/x11/battery-notify.sh
Executable file
42
old/x11/battery-notify.sh
Executable file
@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
local system_uname="$(uname)"
|
||||
|
||||
if [[ "${system_uname}" = 'Linux' ]]; then
|
||||
let charge_full="$(cat '/sys/class/power_supply/BAT0/charge_full')."
|
||||
function get_battery_percent {
|
||||
let charge_now="$(cat '/sys/class/power_supply/BAT0/charge_now')."
|
||||
printf '%.0f' "$((charge_now / charge_full * 100))"
|
||||
}
|
||||
|
||||
function is_adapted_connected {
|
||||
let connected="$(cat /sys/class/power_supply/ADP1/online)"
|
||||
((${connected} == 1))
|
||||
}
|
||||
# Linux ends here
|
||||
else
|
||||
echo "${0}: error: unknown os: \"${system_uname}\"" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
function send_battery_warning {
|
||||
dunstify -p -t 0 "Low Battery" "Battery is at ${1}%!"
|
||||
}
|
||||
|
||||
local did_notify=false
|
||||
let notify_id=-1
|
||||
|
||||
while true; do
|
||||
let battery_percent="$(get_battery_percent)"
|
||||
if ((${battery_percent} > 10)) || is_adapted_connected; then
|
||||
did_notify=false
|
||||
if ((${notify_id} > 0)); then
|
||||
dunstify -C ${notify_id}
|
||||
notify_id=-1
|
||||
fi
|
||||
elif ! ${did_notify}; then
|
||||
did_notify=true
|
||||
notify_id="$(send_battery_warning ${battery_percent})"
|
||||
fi
|
||||
sleep 10
|
||||
done
|
8
old/x11/copy-screen-text.sh
Executable file
8
old/x11/copy-screen-text.sh
Executable file
@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
local text="$(maim -k -s -f png | tesseract stdin stdout -l eng 2>/dev/null)"
|
||||
let char_count="$(printf '%s' "${text}" | wc -c)"
|
||||
|
||||
printf '%s' "${text}" | xclip -selection clipboard
|
||||
|
||||
notify-send -t 5000 "Coppied Text" "Coppied ${char_count} characters"
|
19
old/x11/lock-screen.sh
Executable file
19
old/x11/lock-screen.sh
Executable file
@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
local i3lock_args=()
|
||||
let image_index=1
|
||||
|
||||
for arg; do
|
||||
case "${arg}"; in
|
||||
--no-empty-pass|-e)
|
||||
i3lock_args+=(-e)
|
||||
image_index+=1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
dunstctl set-paused true
|
||||
xset dpms 0 0 15
|
||||
i3lock ${i3lock_args} -n -i "${@[${image_index}]}"
|
||||
xset -dpms
|
||||
dunstctl set-paused false
|
8
old/x11/reset-saver-daemon.sh
Executable file
8
old/x11/reset-saver-daemon.sh
Executable file
@ -0,0 +1,8 @@
|
||||
#!/usr/bin/zsh
|
||||
while true; do
|
||||
if pactl list sink-inputs | grep -i -B13 'firefox' | grep 'Corked: no' >/dev/null || pactl list sink-inputs | grep -i -B13 'chromium' | grep 'Corked: no' >/dev/null; then
|
||||
echo reset
|
||||
xset s reset
|
||||
fi
|
||||
sleep 1m
|
||||
done
|
16
old/x11/screenshot.sh
Executable file
16
old/x11/screenshot.sh
Executable file
@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
local maim_args=("-f" "png")
|
||||
local outfile="screenshot--$(date +'%F_%k-%M-%S').png"
|
||||
local outpath="${HOME}/downloads/${outfile}"
|
||||
|
||||
case "${1}" in;
|
||||
'-root')
|
||||
maim ${maim_args} "${outpath}" || exit
|
||||
;;
|
||||
'-select' | *)
|
||||
maim ${maim_args} -s "${outpath}" || exit
|
||||
;;
|
||||
esac
|
||||
|
||||
notify-send -t 5000 "Screenshot Taken" "Screenshot saved to \"${outfile}\""
|
5
old/x11/select-and-show-color.sh
Executable file
5
old/x11/select-and-show-color.sh
Executable file
@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
local color="$(xcolor)"
|
||||
printf '%s' "${color}" | xclip -selection clipboard
|
||||
notify-send -t 5000 "Color Coppied" "${color}"
|
5
old/x11/toggle-stalonetray.sh
Executable file
5
old/x11/toggle-stalonetray.sh
Executable file
@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
pgrep stalonetray \
|
||||
&& pkill stalonetray \
|
||||
|| stalonetray -bg '#000000' -i 64 --geometry '7x1+3840-10' &
|
Reference in New Issue
Block a user