99 lines
2.4 KiB
Bash
Executable file
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
|