Repository navigation
Expand file tree
/
Copy pathstart-xmage.sh
More file actions
147 lines (133 loc) · 6.35 KB
/
Copy pathstart-xmage.sh
File metadata and controls
147 lines (133 loc) · 6.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/usr/bin/env bash
# Sobe o servidor XMage (17171) e o Bridge (8000) em background.
# Rode com: ./start-xmage.sh (ou: bash start-xmage.sh)
#
# Escrito pra Git Bash no Windows (mesmo shell que o Claude Code usa aqui).
# Servidor e Bridge sobem em processos totalmente desacoplados deste
# terminal (via PowerShell Start-Process, cada um em janela própria oculta)
# -- pode fechar esta janela/terminal assim que o script terminar, os dois
# continuam rodando.
set -uo pipefail
cd "$(dirname "$0")"
LOG_DIR="./logs"
mkdir -p "$LOG_DIR"
SERVER_LOG="$LOG_DIR/mage-server.log"
BRIDGE_LOG="$LOG_DIR/mage-bridge.log"
# shellcheck disable=SC1091
source "./_common.sh"
# --- código de convite do Bridge ---
# Sem isso, qualquer um que ache o endereço do Bridge consegue logar com
# qualquer nome de usuário -- crítico assim que o Bridge for exposto por um
# túnel público (ver start-public.sh). Gerado uma vez e salvo em .env (já
# ignorado pelo git), reaproveitado nas próximas vezes.
ENV_FILE="./.env"
if [ -f "$ENV_FILE" ]; then
# shellcheck disable=SC1090
source "$ENV_FILE"
fi
if [ -z "${BRIDGE_INVITE_CODE:-}" ]; then
BRIDGE_INVITE_CODE=$(LC_ALL=C tr -dc 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789' < /dev/urandom | head -c 16)
echo "BRIDGE_INVITE_CODE=$BRIDGE_INVITE_CODE" >> "$ENV_FILE"
echo "Gerei um novo código de convite e salvei em $ENV_FILE (não versionado pelo git)."
fi
export BRIDGE_INVITE_CODE
# --- senha de bypass ("dono da casa") ---
# Logar como usuário SirCamelot com essa senha pula o código de convite --
# pra jogar sozinho localmente sem ficar copiando o código toda hora. É uma
# senha SEPARADA do código de convite, de propósito: essa aqui NUNCA fica no
# test-client.html (arquivo que é compartilhado com quem entra pelo túnel),
# só existe no .env e em quem digitar de próprio punho no login.
if [ -z "${BRIDGE_DEV_PASSWORD:-}" ]; then
BRIDGE_DEV_PASSWORD=$(LC_ALL=C tr -dc 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789' < /dev/urandom | head -c 16)
echo "BRIDGE_DEV_PASSWORD=$BRIDGE_DEV_PASSWORD" >> "$ENV_FILE"
echo "Gerei uma nova senha de bypass e salvei em $ENV_FILE (não versionado pelo git)."
fi
export BRIDGE_DEV_PASSWORD
# --- servidor XMage ---
# Definido aqui fora (não só dentro do "senão" abaixo) porque o Bridge
# também precisa desse caminho -- ver comentário na seção do Bridge.
SERVER_DIR_WIN=$(cygpath -w "$(pwd)/Mage.Server")
if is_port_listening 17171; then
echo "Servidor XMage já está rodando na porta 17171 (PID $(port_pid 17171)) -- não subi de novo."
else
echo "Subindo o servidor XMage (porta 17171)... log em $SERVER_LOG"
launch_detached "$SERVER_LOG" "cd /d \"$SERVER_DIR_WIN\" && mvn exec:java -q"
echo "Aguardando o servidor terminar de carregar (pode demorar na primeira vez, ou bem mais se o"
echo "banco de cartas (pasta db/) tiver sido apagado -- reescanear do zero leva alguns minutos)..."
# espera a PORTA responder de verdade, não só o log aparecer -- o "Loaded
# game types" no log sai um instante ANTES do bind da porta acontecer, e
# checar só uma vez logo depois do log pode dar falso negativo.
# ATENÇÃO: "ERROR" tem que estar no INÍCIO da linha (nível de log de
# verdade) -- casar a palavra em qualquer lugar pega falso positivo, ex:
# H2 loga "ignoring drop error 'org.h2...Exception'" como aviso normal
# (esperado) durante um scan do zero, e isso já derrubou o script à toa.
for i in $(seq 1 300); do
if grep -qE "^ERROR" "$SERVER_LOG" 2>/dev/null; then
echo "Servidor XMage falhou ao subir -- veja $SERVER_LOG"
exit 1
fi
if is_port_listening 17171; then
break
fi
sleep 1
done
if ! is_port_listening 17171; then
echo "Servidor XMage não respondeu na porta 17171 depois de 300s -- veja $SERVER_LOG"
exit 1
fi
echo "Servidor XMage no ar (porta 17171)."
fi
# --- bridge ---
if is_port_listening 8000; then
echo "Bridge já está rodando na porta 8000 (PID $(port_pid 8000)) -- não subi de novo."
else
BRIDGE_JAR=$(ls Mage.Bridge/target/mage-bridge-*-jar-with-dependencies.jar 2>/dev/null | head -1)
if [ -z "$BRIDGE_JAR" ]; then
echo "Jar do Bridge não encontrado. Rode primeiro:"
echo " mvn -pl Mage.Bridge install -DskipTests"
exit 1
fi
echo "Subindo o Bridge (porta 8000)... log em $BRIDGE_LOG"
BRIDGE_JAR_WIN=$(cygpath -w "$(pwd)/$BRIDGE_JAR")
# Roda com CWD em Mage.Server/ (mesma pasta do servidor), de propósito --
# CardRepository resolve o banco de cartas por caminho RELATIVO ("./db"),
# então cada processo lê o "./db" a partir do seu próprio diretório de
# trabalho. Se o Bridge rodasse a partir da raiz do repo (como fazia antes),
# ele acabava com um "./db" TOTALMENTE separado do servidor -- banco de
# ~300MB duplicado em disco, e o Bridge tinha que re-escanear as 92 mil
# cartas do zero de novo, mesmo o servidor acabando de fazer exatamente
# isso segundos antes. O H2 já suporta os dois processos abrirem o MESMO
# arquivo ao mesmo tempo (AUTO_SERVER=TRUE, ver DatabaseUtils.java) -- só
# faltava apontar os dois pro mesmo lugar.
launch_detached "$BRIDGE_LOG" "cd /d \"$SERVER_DIR_WIN\" && java -jar \"$BRIDGE_JAR_WIN\""
echo "Aguardando o Bridge terminar de carregar (escaneia o banco de cartas na 1a vez, ou de novo"
echo "do zero se a pasta db/ tiver sido apagada -- pode levar alguns minutos nesse caso)..."
for i in $(seq 1 300); do
if grep -qE "^ERROR" "$BRIDGE_LOG" 2>/dev/null; then
echo "Bridge falhou ao subir -- veja $BRIDGE_LOG"
exit 1
fi
if is_port_listening 8000; then
break
fi
sleep 1
done
if ! is_port_listening 8000; then
echo "Bridge não respondeu na porta 8000 depois de 300s -- veja $BRIDGE_LOG"
exit 1
fi
echo "Bridge no ar (porta 8000)."
fi
echo ""
echo "Tudo pronto. Abra test-client.html no navegador pra jogar."
echo "Pra derrubar os dois: ./stop-xmage.sh"
echo ""
echo "Código de convite do Bridge (peça login com ele): $BRIDGE_INVITE_CODE"
echo "(fica salvo em .env -- não comite esse arquivo nem mande print dele publicamente)"
echo ""
echo "Pra jogar sozinho localmente sem digitar o código de convite: logue como"
echo "usuário 'SirCamelot' com a senha: $BRIDGE_DEV_PASSWORD"
echo "(NÃO mande essa senha pros seus amigos -- ela pula a trava de convite;"
echo "diferente da senha 'Excalibur' do modo Dev, essa não está no test-client.html)"
echo ""
echo "Pra deixar acessível pra outras pessoas pela internet: ./start-public.sh"