#!/bin/sh
# ri: single-file, minimalist, CLI-only Void Linux setup script
# for Android + Termux environment that includes sound support via PulseAudio server
# and also updates the Termux font to Fira Code Retina
# Installs the following tools and development packages in addition to coreutils and base-devel:
# - Shell tools: bc/dc, jq, fzf, dtach, dialog, HTop, Nano, MC, Zip, 7-Zip, XZ, unrar
# - Multimedia tools: MPG123, OpenMPT123
# - Network tools: cURL, RSync, GSocket, Lynx, aria2c, Outport, Multicities
# - Security tools: GnuPG, Pass, NMap, THC Hydra, Gobuster
# - Dev tools: Git, Perl, Lua, S-Lang, Jim Tcl, Janet (+ JPM, Spork, Jurl, Janet-SQLite3)
# - Fun tools and games: Frotz, FIGlet (+ extra fonts), Scoundrel-Bash
# Created by Luxferre in 2026, released into the public domain

ALL_PKGS='base-container-full curl git ed bc nano mc zip unzip p7zip xz unrar jq fzf dtach dialog rlwrap htop aria2 lynx rsync gnupg pass nmap mpg123 openmpt123 figlet figlet-fonts frotz'

if [ -n "$DEV_OS" ]; then
  ALL_PKGS="$ALL_PKGS base-devel discount janet jpm libcurl-devel thc-hydra gobuster"
fi

echo 'Setting up host environment...'
pkg upgrade -y
pkg install -y proot-distro pulseaudio
cat >> $HOME/.profile <<'EOF'
if ! pgrep -f pulseaudio >/dev/null; then # ROID_INST
  pulseaudio --start --exit-idle-time=-1 # ROID_INST
  pacmd load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1 # ROID_INST
fi # ROID_INST
EOF
cat >> $HOME/.bashrc <<'EOF'
alias void="proot-distro login -P -e TERMUX_HOME=$HOME void-glibc-full" # ROID_INST
alias voidrun='proot-distro run -P void-glibc-full --' # ROID_INST
EOF
echo 'Installing Void Linux...'
proot-distro install ghcr.io/void-linux/void-glibc-full
echo 'Package setup...'
proot-distro run void-glibc-full -- sh -c "xbps-install -Sy void-repo-nonfree && xbps-install -Suyy $ALL_PKGS"
echo 'Post-installation steps...'
cat > $HOME/.ri-post <<'GLOBALEOF'
#!/bin/sh

# Local single-script installation helper
localinst() {
  local name="$1" url="$2"
  sudo curl -fsSL -o /usr/local/bin/$name "$url"
  sudo chmod +x /usr/local/bin/$name
}

# install GSocket
GSURL="$(curl -fsSL "https://api.github.com/repos/hackerschoice/gsocket/releases/latest" | jq -r '.assets[].browser_download_url' | grep "gsocket_linux-$(uname -m)")"
mkdir gsocket && cd gsocket
curl -fsSL -o gsocket.tgz "$GSURL"
tar xzf gsocket.tgz
rm gsocket.tgz
mv ./* /usr/local/bin/
cd ..
rm -rf gsocket

# install Outport, Multicities, Scoundrel-Bash
localinst outport 'https://codeberg.org/luxferre/sh-goodies/raw/branch/master/outport'
localinst cities 'https://codeberg.org/luxferre/sh-goodies/raw/branch/master/cities.sh'
localinst scoundrel 'https://codeberg.org/luxferre/bash-goodies/raw/branch/master/scoundrel'

# install Jim Tcl
JIM_REL_URL='https://api.github.com/repos/dbohdan/jimsh-static/releases/latest'
JIM_DL_URL="$(curl -fsSL "$JIM_REL_URL"| jq -r '.assets[].browser_download_url' | grep $(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64v8/'))"
curl -fsSL -o /usr/local/bin/jimsh "$JIM_DL_URL"
chmod +x /usr/local/bin/jimsh

echo 'Updating configs...'
cat > /root/.bash_profile <<'EOF'
export LC_ALL=C.UTF-8
export LANG=C.UTF-8
[[ -f /root/.bashrc ]] && [[ $- == *i* ]] && . /root/.bashrc
EOF
cat > /root/.bashrc <<'EOF'
PS1='\W # '
. /root/.rirc
EOF
cat > /root/.rirc <<'EOF'
export EDITOR='nano -FEDSMAGic/max%_T2'
export PAGER='less -RXF'
# Core aliases
alias nn="$EDITOR"
alias pg="$PAGER"
alias reload-rc=". $BASH_SOURCE"
alias edit-rc="$EDITOR $BASH_SOURCE && . $BASH_SOURCE"
alias lastcmd='history | tail -q -n 2 | head -q -n 1 | sed "s/^[[:space:]]*[0-9]*[[:space:]]*//"'
alias defalias='___(){ __="$1";shift;alias $__="_$__(){ $*; };_$__";unset __; };___'
defalias toalias 'defalias "$1" "$(lastcmd)";alias "$1"'
defalias savealias "[ -n \"\$1\" ] && echo \"alias \$(alias \$1 | sed 's/^alias //')\" >> $BASH_SOURCE"
alias rw='rlwrap -R'
alias ee='rlwrap -R ed -p:'
defalias l 'ls -lahF --time-style=long-iso --color=always $* | less -RXF'
defalias sshed 'f="$(mktemp)";scp $1 $f && $EDITOR $f && scp $f $1 && rm -f $f && unset f'
alias dl='curl -fsSLO'
alias gcm='git commit -a -m'
alias gp='git push origin'
alias gpm='git push origin master'
alias pkgadd='xbps-install -Sy'
alias pkgdel='xbps-remove -oy'
alias pkgsearch='xbps-query -Rs'
alias sysup='xbps-install -Suy && vkpurge rm all && xbps-remove -OOoy'
alias sysclean='vkpurge rm all && xbps-remove -OOoy'
alias tmhome='cd $TERMUX_HOME'
# Fix Frotz not wanting to run as root
alias frotz='sudo -u nobody frotz'
# Fix Lynx config
alias lynx='lynx -cfg=/root/.lynx.cfg'

# OpenSSL-based vault helper
ovault() {
  local pw="$4"
  local op='-d'
  [ "$1" = 'e' ] && op='-e'
  if [ -z "$pw" ]; then
    read -rs -p 'Enter vault password: ' pw
  fi
  openssl aes-256-cbc $op -pbkdf2 -iter 100000 -pass pass:"$pw" -in "$2" -out "$3"
}

# dmux, a simple dtach based terminal session manager, as a Bash function
dmux() {
  local SDIR="$HOME/.dtsess" SPFILE="$SDIR/.list" sname
  local -a MENU
  mkdir -p "$SDIR"
  touch "$SPFILE"
  mapfile -t MENU < "$SPFILE"
  if [[ -z "$(ls -1 "$SDIR")" ]]; then
    for sname in "${MENU[@]}"; do
      dtach -n "$SDIR/$sname" $SHELL
    done
  fi
  PS3='Select a session: '
  while true; do
    select sname in "${MENU[@]}" New Quit; do break; done
    [[ "$sname" = 'Quit' ]] && printf '\033[0m' && break
    [[ "$sname" = 'New' ]] && read -r -p 'New session name: ' sname  
    [[ -n "$sname" ]] && printf '\033[0m' && dtach -A "$SDIR/$sname" $SHELL
    ls -1 "$SDIR" > "$SPFILE"
    mapfile -t MENU < "$SPFILE"
  done
}

# Generate a pseudorandom key from machine alias
gs-key() {
  echo "$*"|sha512sum -b|base64 -w0|tr -d -c a-z0-9|cut -c 1-22
}

# Enter the machine by its alias
gs-enter() {
  gs-netcat -i -s "$(gs-key "$*")"  
}

# Print out GS deployment/undeployment/access commands
gs-deploy-cmd() {
  machinekey="$(gs-key "$*")"
  printf 'Deploy on target:\ncurl -fsSL https://gsocket.io/y | X=%s bash\n' "$machinekey"
  printf 'Undeploy from target:\ncurl -fsSL https://gsocket.io/y | GS_UNDO=1 bash\n'
  printf 'Access:\ngs-enter %s\n' "$*"
}
EOF

# Write Lynx config
cat > /root/.lynx.cfg <<'EOF'
DEFAULT_USER_MODE:ADVANCED
STARTFILE:http://frogfind.com
VI_KEYS_ALWAYS_ON:TRUE
ASSUME_CHARSET:utf-8
PREFERRED_CHARSET:utf-8
ASSUME_LOCAL_CHARSET:utf-8
CHARACTER_SET:utf-8
REUSE_TEMPFILES:TRUE
AUTO_SESSION:TRUE
SESSION_FILE:~/.lynx_session
USE_MOUSE:TRUE
ACCEPT_ALL_COOKIES:TRUE
PERSISTENT_COOKIES:TRUE
SYSTEM_EDITOR:nano -FEDSMAGic/max%_T2
TAGSOUP:TRUE
ENABLE_LYNXRC:USERAGENT:ON
ENABLE_LYNXRC:SEND_USERAGENT:ON
DEFAULT_COLORS:OFF
COLOR_STYLE:
COLOR:0:white:black
COLOR:1:cyan:black
COLOR:2:yellow:black
COLOR:3:green:black
COLOR:4:green:black
COLOR:5:brightgreen:black
COLOR:6:brightcyan:black
COLOR:7:black:cyan
EOF
GLOBALEOF

if [ -n "$DEV_OS" ]; then
cat >> $HOME/.ri-post <<'GLOBALEOF'
# install Janet modules
jpm install spork jurl sqlite3
cat >> /root/.rirc <<'EOF'
# Janet-specific aliases
alias jpm-build='jpm clean && jpm build --build-type=release --ldflags="-s"'
alias jpm-build-static='jpm clean && jpm build --build-type=release --ldflags="-s" --janet-cflags="-static"'
EOF
GLOBALEOF
fi

proot-distro run void-glibc-full -e TERMUX_HOME=$HOME -- sh $HOME/.ri-post
rm $HOME/.ri-post
echo 'Termux font setup...'
TDIR="$(mktemp -d)"
cd $TDIR
FONTURL='https://github.com/tonsky/FiraCode/releases/download/6.2/Fira_Code_v6.2.zip'
curl -fsSL -o font.zip "$FONTURL"
unzip -j font.zip ttf/FiraCode-Retina.ttf
mv FiraCode-Retina.ttf $HOME/.termux/font.ttf
cd && rm -rf $TDIR
echo 'Done. Restart the Termux shell to take effect, then type void to start the OS'
