monop-board/test/run_monop_irc.sh

99 lines
2.4 KiB
Bash
Executable file

#!/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