#!/bin/sh # # spam-ascii — cat a file from ~/ascii given a partial/fuzzy name. # # Resolution order: # 0. pattern `*` → cat every file in ~/ascii (sorted) # 1. exact filename match: ~/ascii/ # 2. exact name + common extension: .txt, .ans, .asc # 3. first case-insensitive *substring* match (sorted alphabetically) # # If nothing matches, prints a friendly error to stdout and exits non-zero. # Used by the irssi /spam alias, which pipes our stdout as channel messages. set -eu pattern=${1:-} if [ -z "$pattern" ]; then echo "usage: spam-ascii (pattern `*` dumps everything)" exit 1 fi dir="$HOME/ascii" # 0. `*` → dump the whole collection. if [ "$pattern" = "*" ]; then find -L "$dir" -maxdepth 1 -type f -print0 2>/dev/null \ | sort -z \ | xargs -0 cat exit 0 fi # 1 + 2. Try exact name, then exact + common ASCII-art extensions. for candidate in \ "$dir/$pattern" \ "$dir/$pattern.txt" \ "$dir/$pattern.ans" \ "$dir/$pattern.asc"; do if [ -f "$candidate" ]; then cat "$candidate" exit 0 fi done # 3. First case-insensitive substring match. -L so find follows a possible # symlink starting point (e.g. ~/ascii -> ~/.yadr/ascii); without it, find # treats the symlink itself as the "starting point" and ignores -type f. match=$(find -L "$dir" -maxdepth 1 -type f -iname "*$pattern*" 2>/dev/null \ | sort \ | head -n1) if [ -n "$match" ]; then cat "$match" exit 0 fi echo "no match in ~/ascii for: $pattern" exit 1