#!/bin/bash # Run monop-irc game server on IRC via ii + socat TLS proxy set -e SERVER=irc.darkscience.net PORT=6697 CHANNEL="#monop-dev" NICK="monopoly" PREFIX=/tmp/monop-irc-session MONOP=/usr/games/monop SOCAT_PORT=16667 cleanup() { echo "Cleaning up..." kill %1 %2 %3 2>/dev/null killall -q ii 2>/dev/null rm -rf "$PREFIX" kill $(cat /tmp/socat-irc.pid 2>/dev/null) 2>/dev/null exit 0 } trap cleanup INT TERM EXIT # Clean previous killall -q ii 2>/dev/null || true kill $(cat /tmp/socat-irc.pid 2>/dev/null) 2>/dev/null || true rm -rf "$PREFIX" mkdir -p "$PREFIX" # Start TLS proxy with socat echo "Starting TLS proxy on localhost:$SOCAT_PORT -> $SERVER:$PORT" socat TCP-LISTEN:$SOCAT_PORT,fork,reuseaddr OPENSSL:$SERVER:$PORT,verify=0 & echo $! > /tmp/socat-irc.pid sleep 1 # Start ii connecting to local socat proxy echo "Starting ii..." ii -s 127.0.0.1 -p $SOCAT_PORT -n "$NICK" -i "$PREFIX" & sleep 3 # Wait for connection IN="$PREFIX/127.0.0.1/in" echo "Waiting for ii connection..." for i in $(seq 1 30); do [ -p "$IN" ] && break sleep 1 done if [ ! -p "$IN" ]; then echo "ERROR: ii failed to connect" exit 1 fi echo "Connected!" # Join channel echo "/j $CHANNEL" > "$IN" sleep 2 # Wait for channel CHAN_DIR="$PREFIX/127.0.0.1/${CHANNEL}" INCHAN="$CHAN_DIR/in" OUTCHAN="$CHAN_DIR/out" echo "Waiting for channel..." for i in $(seq 1 20); do [ -p "$INCHAN" ] && break sleep 1 done if [ ! -p "$INCHAN" ]; then echo "ERROR: failed to join channel" ls -la "$PREFIX/127.0.0.1/" 2>/dev/null exit 1 fi echo "Joined $CHANNEL" # Send welcome message echo "🎲 Monopoly IRC Game Server ready! Prefix commands with a dot (.) — e.g. type '.roll' to roll dice." > "$INCHAN" echo "Type '.3' to start a 3-player game, or '.N' for N players." > "$INCHAN" # Wait for out file for i in $(seq 1 10); do [ -f "$OUTCHAN" ] && break sleep 1 done echo "Game server running. Watching for commands..." # The pipeline: # 1. tail -f channel output (IRC messages) # 2. sed extracts lines where users prefix with "." (e.g. ".roll" -> "username roll") # 3. Filter out our own messages # 4. Pipe to monop stdin; monop stdout goes back to channel tail -f "$OUTCHAN" | \ sed -u -En 's/^[0-9-]+ [0-9:]+ <([a-zA-Z0-9_]+)> \.(.*)$/\2/p' | \ grep --line-buffered -v "^$" | \ $MONOP 2>&1 | \ while IFS= read -r line; do echo "$line" > "$INCHAN" # Small delay to avoid flood sleep 0.1 done