#!/bin/sh # questions - capture questions via dmenu into a SQLite database # Usage: questions [-l | -c | -d | -s TERM] DB="${XDG_CONFIG_HOME:-$HOME/.config}/scripts/scripts.db" # Initialize DB/table if needed mkdir -p "$(dirname "$DB")" sqlite3 "$DB" "CREATE TABLE IF NOT EXISTS questions ( id INTEGER PRIMARY KEY AUTOINCREMENT, question TEXT NOT NULL, created_at TEXT DEFAULT (datetime('now', 'localtime')) );" cmd_add() { question=$(printf '' | dmenu -c -l 1 -h 40 -p "Question:" || exit 0) [ -z "$question" ] && exit 0 sqlite3 "$DB" "INSERT INTO questions (question) VALUES ('$(printf '%s' "$question" | sed "s/'/''/g")');" notify-send "Question saved" "$question" } cmd_list() { printf '\033[1m%-5s %-19s %s\033[0m\n' "ID" "DATE" "QUESTION" printf '%-5s %-19s %s\n' "-----" "-------------------" "---" sqlite3 -separator '|' "$DB" "SELECT id, question, created_at FROM questions ORDER BY id;" | while IFS='|' read -r id question date; do printf '\033[33m%-5s\033[0m \033[2m%-19s\033[0m %s\n' "$id" "$date" "$question" done } cmd_count() { n=$(sqlite3 "$DB" "SELECT COUNT(*) FROM questions;") printf '%s questions\n' "$n" } cmd_delete() { id="$1" if [ -z "$id" ]; then # Interactive: pick from dmenu selected=$(sqlite3 -separator ' | ' "$DB" "SELECT id, question FROM questions ORDER BY id;" | dmenu -c -l 20 -p "Delete:") [ -z "$selected" ] && exit 0 id=$(printf '%s' "$selected" | cut -d'|' -f1 | tr -d ' ') fi sqlite3 "$DB" "DELETE FROM questions WHERE id = $id;" printf 'Deleted question %s\n' "$id" } cmd_search() { term="$1" [ -z "$term" ] && { printf 'Usage: questions -s TERM\n'; exit 1; } escaped=$(printf '%s' "$term" | sed "s/'/''/g") printf '\033[1m%-5s %-19s %s\033[0m\n' "ID" "DATE" "QUESTION" printf '%-5s %-19s %s\n' "-----" "-------------------" "---" sqlite3 -separator '|' "$DB" "SELECT id, question, created_at FROM questions WHERE question LIKE '%$escaped%' ORDER BY id;" | while IFS='|' read -r id question date; do printf '\033[33m%-5s\033[0m \033[2m%-19s\033[0m %s\n' "$id" "$date" "$question" done } case "$1" in -l|list) cmd_list ;; -c|count) cmd_count ;; -d|delete) cmd_delete "$2" ;; -s|search) cmd_search "$2" ;; -h|help) printf 'questions Ask a question (dmenu)\n' printf 'questions -l List all questions\n' printf 'questions -c Count questions\n' printf 'questions -d [ID] Delete a question (dmenu picker or by ID)\n' printf 'questions -s TERM Search questions\n' ;; "") cmd_add ;; *) printf 'Unknown flag: %s (try questions -h)\n' "$1" ;; esac