chore: убрать VLESS-прокси, proxychains и fuck-rkn.sh
Пользователь перешёл на Amnezia VPN — встроенный VLESS-прокси (xray + proxychains4) и отдельный server-installer fuck-rkn.sh (telemt + xray) больше не нужны. Убран весь код в ai-setup.sh/setup.sh, конфиги с VPN-кредами, неактуальный тест и упоминания в документации. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -53,260 +53,6 @@ else
|
||||
warn "jq не найден. statusline-command.sh и некоторые функции могут не работать."
|
||||
fi
|
||||
|
||||
# ── VLESS URL parser ───────────────────────────────────────────
|
||||
# Принимает vless:// URL, устанавливает переменные VL_*
|
||||
parse_vless_url() {
|
||||
local url="$1"
|
||||
eval "$(python3 -c "
|
||||
import urllib.parse, sys
|
||||
|
||||
url = sys.argv[1]
|
||||
rest = url[8:] # strip 'vless://'
|
||||
|
||||
at_pos = rest.index('@')
|
||||
uuid = rest[:at_pos]
|
||||
rest = rest[at_pos+1:]
|
||||
|
||||
colon_pos = rest.index(':')
|
||||
q_pos = rest.index('?')
|
||||
host = rest[:colon_pos]
|
||||
port = rest[colon_pos+1:q_pos]
|
||||
|
||||
rest = rest[q_pos+1:]
|
||||
hash_pos = rest.index('#') if '#' in rest else len(rest)
|
||||
qs = rest[:hash_pos]
|
||||
name = rest[hash_pos+1:] if '#' in rest else ''
|
||||
|
||||
params = urllib.parse.parse_qs(qs)
|
||||
def get(p, default=''):
|
||||
vals = params.get(p, [default])
|
||||
return vals[0] if vals else default
|
||||
|
||||
flow = get('flow')
|
||||
vtype = get('type')
|
||||
if not vtype:
|
||||
vtype = 'xhttp' if not flow else 'tcp'
|
||||
spx_default = '' if vtype == 'tcp' else '/'
|
||||
|
||||
print(f'VL_UUID={uuid}')
|
||||
print(f'VL_ADDRESS={host}')
|
||||
print(f'VL_PORT={port}')
|
||||
print(f'VL_ENCRYPTION={get(\"encryption\")}')
|
||||
print(f'VL_FLOW={flow}')
|
||||
print(f'VL_SECURITY={get(\"security\")}')
|
||||
print(f'VL_SNI={get(\"sni\")}')
|
||||
print(f'VL_FP={get(\"fp\", \"chrome\")}')
|
||||
print(f'VL_PBK={get(\"pbk\")}')
|
||||
print(f'VL_SID={get(\"sid\")}')
|
||||
print(f'VL_TYPE={vtype}')
|
||||
print(f'VL_PATH={urllib.parse.unquote(get(\"path\", \"/\"))}')
|
||||
print(f'VL_MODE={get(\"mode\", \"auto\")}')
|
||||
print(f'VL_SPX={get(\"spx\", spx_default)}')
|
||||
print(f'VL_NAME={name}')
|
||||
" "$url")"
|
||||
}
|
||||
|
||||
# ── VLESS connectivity test ────────────────────────────────────
|
||||
# Запускает xray с тестовым конфигом и проверяет curl'ом
|
||||
# Возвращает: "ok" или "fail"
|
||||
test_vless_server() {
|
||||
local url="$1" test_port="$2"
|
||||
|
||||
parse_vless_url "$url"
|
||||
|
||||
# Генерируем временный конфиг
|
||||
_TMP_CONF="/tmp/xray_test_${test_port}.json"
|
||||
_VL_XHTTP=""
|
||||
if [ "$VL_TYPE" = "xhttp" ]; then
|
||||
_VL_XHTTP=$(printf ',\n "xhttpSettings": {\n "path": "%s",\n "mode": "%s"\n }' "$VL_PATH" "$VL_MODE")
|
||||
fi
|
||||
|
||||
cat > "$_TMP_CONF" << XRAYEOF
|
||||
{
|
||||
"log": { "loglevel": "none" },
|
||||
"inbounds": [
|
||||
{
|
||||
"port": $test_port,
|
||||
"listen": "127.0.0.1",
|
||||
"protocol": "socks",
|
||||
"settings": { "udp": true }
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
{
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"vnext": [
|
||||
{
|
||||
"address": "$VL_ADDRESS",
|
||||
"port": $VL_PORT,
|
||||
"users": [
|
||||
{
|
||||
"id": "$VL_UUID",
|
||||
"encryption": "$VL_ENCRYPTION",
|
||||
"flow": "$VL_FLOW"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "$VL_TYPE",
|
||||
"security": "$VL_SECURITY",
|
||||
"realitySettings": {
|
||||
"serverName": "$VL_SNI",
|
||||
"fingerprint": "$VL_FP",
|
||||
"publicKey": "$VL_PBK",
|
||||
"shortId": "$VL_SID",
|
||||
"spiderX": "$VL_SPX"
|
||||
}$_VL_XHTTP
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
XRAYEOF
|
||||
|
||||
# Запускаем xray
|
||||
/usr/local/bin/xray run -c "$_TMP_CONF" >/dev/null 2>&1 &
|
||||
local xpid=$!
|
||||
sleep 2
|
||||
|
||||
# Тест через SOCKS5
|
||||
local result="fail"
|
||||
if curl --socks5 "127.0.0.1:${test_port}" --max-time 5 -s https://ifconfig.co/ >/dev/null 2>&1; then
|
||||
result="ok"
|
||||
fi
|
||||
|
||||
kill $xpid 2>/dev/null; wait $xpid 2>/dev/null
|
||||
rm -f "$_TMP_CONF"
|
||||
echo "$result"
|
||||
}
|
||||
|
||||
# ── 0. Выбор режима работы VLESS (on / off / skip) ─────────────
|
||||
# AI_SETUP_VLESS:
|
||||
# 1 / on — включить VLESS (установка xray + proxychains + обёртки лаунчеров)
|
||||
# 0 / off — отключить VLESS (откат: stop xray, сброс прокси, IPv6 on)
|
||||
# skip — НЕ трогать сеть (умолчание). Лаунчеры синхронизируются
|
||||
# с текущим состоянием (xray активен?).
|
||||
# Устанавливается из меню setup.sh. По умолчанию skip, чтобы прямой запуск
|
||||
# ai-setup.sh и пункты 1/7/8 не меняли сетевые настройки.
|
||||
DO_VLESS_INSTALL=0
|
||||
case "${AI_SETUP_VLESS:-skip}" in
|
||||
1|on)
|
||||
USE_VLESS=1
|
||||
DO_VLESS_INSTALL=1
|
||||
|
||||
# Читаем список серверов
|
||||
_VL_URLS=()
|
||||
_VL_LABELS=()
|
||||
_SERVERS_FILE="$SCRIPT_DIR/home-configs/vless/servers.conf"
|
||||
|
||||
if [ ! -f "$_SERVERS_FILE" ]; then
|
||||
err "Файл servers.conf не найден: $_SERVERS_FILE"
|
||||
fi
|
||||
|
||||
while IFS= read -r line || [[ -n "$line" ]]; do
|
||||
[[ "$line" =~ ^[[:space:]]*# ]] && continue
|
||||
[[ -z "$line" ]] && continue
|
||||
_vl_rest="${line#vless://}"
|
||||
_vl_rest="${_vl_rest#*@}"
|
||||
_vl_ip="${_vl_rest%%:*}"
|
||||
_vl_name="${line##*#}"
|
||||
[[ "$_vl_name" == "$line" ]] && _vl_name=""
|
||||
_VL_URLS+=("$line")
|
||||
_VL_LABELS+=("$_vl_ip ($_vl_name)")
|
||||
done < "$_SERVERS_FILE"
|
||||
|
||||
if [ "${#_VL_URLS[@]}" -eq 0 ]; then
|
||||
err "Нет VLESS серверов в $_SERVERS_FILE"
|
||||
fi
|
||||
|
||||
# Реальная проверка VLESS (запускаем xray для каждого сервера)
|
||||
echo ""
|
||||
info "Проверяю VLESS-доступность серверов..."
|
||||
_VL_STATUS=()
|
||||
for i in "${!_VL_URLS[@]}"; do
|
||||
_label="${_VL_LABELS[$i]}"
|
||||
_test_port=$((10980 + i))
|
||||
printf " %-45s" "$((i+1))) $_label"
|
||||
_status=$(test_vless_server "${_VL_URLS[$i]}" "$_test_port")
|
||||
if [ "$_status" = "ok" ]; then
|
||||
echo -e "${GREEN}✓ работает${NC}"
|
||||
_VL_STATUS+=("ok")
|
||||
else
|
||||
echo -e "${RED}✗ не работает${NC}"
|
||||
_VL_STATUS+=("fail")
|
||||
fi
|
||||
done
|
||||
echo ""
|
||||
|
||||
read -r -p "Выбери сервер [1-${#_VL_URLS[@]}]: " _vl_choice
|
||||
_vl_choice="${_vl_choice:-1}"
|
||||
if ! [[ "$_vl_choice" =~ ^[0-9]+$ ]] || [ "$_vl_choice" -lt 1 ] || [ "$_vl_choice" -gt "${#_VL_URLS[@]}" ]; then
|
||||
err "Неверный выбор: $_vl_choice"
|
||||
fi
|
||||
|
||||
_VL_SELECTED="${_VL_URLS[$((_vl_choice-1))]}"
|
||||
parse_vless_url "$_VL_SELECTED"
|
||||
info "Выбран: $VL_ADDRESS ($VL_NAME)"
|
||||
;;
|
||||
0|off)
|
||||
USE_VLESS=0
|
||||
DO_VLESS_INSTALL=0
|
||||
info "Отключение VLESS (откат настроек)"
|
||||
|
||||
# ── Откат всех настроек vless ──────────────────────────────
|
||||
info "Откатываю настройки прокси..."
|
||||
|
||||
# Останавливаем и отключаем xray
|
||||
sudo systemctl stop xray 2>/dev/null || true
|
||||
sudo systemctl disable xray 2>/dev/null || true
|
||||
success "xray остановлен и отключён"
|
||||
|
||||
# Системный прокси → none
|
||||
if command -v gsettings &>/dev/null; then
|
||||
gsettings set org.gnome.system.proxy mode 'none' 2>/dev/null || true
|
||||
success "Системный прокси отключён"
|
||||
fi
|
||||
|
||||
# Firefox → direct (type=0)
|
||||
FIREFOX_PROFILE=""
|
||||
if [ -d "$HOME/snap/firefox/common/.mozilla/firefox" ]; then
|
||||
FIREFOX_PROFILE=$(find "$HOME/snap/firefox/common/.mozilla/firefox" -name "*.default*" -type d | head -1)
|
||||
elif [ -d "$HOME/.mozilla/firefox" ]; then
|
||||
FIREFOX_PROFILE=$(find "$HOME/.mozilla/firefox" -name "*.default*" -type d | head -1)
|
||||
fi
|
||||
if [ -n "$FIREFOX_PROFILE" ]; then
|
||||
cat > "$FIREFOX_PROFILE/user.js" << 'FJSEOF'
|
||||
user_pref("network.proxy.type", 0);
|
||||
FJSEOF
|
||||
success "Firefox переключён на прямой доступ"
|
||||
fi
|
||||
|
||||
# Включаем IPv6 обратно (только если kill switch не активен)
|
||||
if ufw status | grep -qE "активен|active"; then
|
||||
info "UFW kill switch активен — оставляю IPv6 отключённым"
|
||||
else
|
||||
sudo rm -f /etc/sysctl.d/99-disable-ipv6.conf
|
||||
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0 2>/dev/null || true
|
||||
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=0 2>/dev/null || true
|
||||
sudo systemctl restart systemd-resolved 2>/dev/null || true
|
||||
success "IPv6 восстановлен"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
# skip — сеть не трогаем; синхронизируем лаунчеры с текущим состоянием xray
|
||||
if systemctl is-active --quiet xray 2>/dev/null; then
|
||||
USE_VLESS=1
|
||||
info "Сеть не трогаю. VLESS активен — лаунчеры будут с proxychains4."
|
||||
else
|
||||
USE_VLESS=0
|
||||
info "Сеть не трогаю. VLESS не активен — прямые лаунчеры."
|
||||
fi
|
||||
info "Управление VLESS: пункт 9 (включить / отключить)."
|
||||
;;
|
||||
esac
|
||||
|
||||
# ── 1. npm prefix в домашнюю папку ──────────────────────────
|
||||
info "Настраиваю npm prefix..."
|
||||
mkdir -p "$NPM_GLOBAL"
|
||||
@@ -334,175 +80,6 @@ else
|
||||
warn "Node.js не найден. Некоторые функции могут не работать."
|
||||
fi
|
||||
|
||||
# ── 2.5. proxychains-ng + xray (только при включении VLESS) ──
|
||||
if [ "$DO_VLESS_INSTALL" -eq 1 ]; then
|
||||
info "Проверяю proxychains-ng..."
|
||||
if ! command -v proxychains4 &>/dev/null; then
|
||||
info "Устанавливаю proxychains-ng (нужен sudo)..."
|
||||
if command -v apt-get &>/dev/null; then
|
||||
sudo apt-get install -y proxychains-ng
|
||||
elif command -v dnf &>/dev/null; then
|
||||
sudo dnf install -y proxychains-ng
|
||||
else
|
||||
warn "Не удалось установить proxychains-ng автоматически. Установите вручную."
|
||||
fi
|
||||
fi
|
||||
if command -v proxychains4 &>/dev/null; then
|
||||
success "proxychains4 найден"
|
||||
else
|
||||
warn "proxychains4 не найден. Продолжаю без проксирования."
|
||||
fi
|
||||
|
||||
info "Устанавливаю xray..."
|
||||
|
||||
# Останавливаем старый процесс (мог остаться от предыдущей установки)
|
||||
sudo systemctl stop xray 2>/dev/null || true
|
||||
|
||||
XRAY_VERSION="26.3.27"
|
||||
XRAY_ARCH="64"
|
||||
XRAY_URL="https://github.com/XTLS/Xray-core/releases/download/v${XRAY_VERSION}/Xray-linux-${XRAY_ARCH}.zip"
|
||||
|
||||
TMPDIR=$(mktemp -d)
|
||||
curl -fsSL "$XRAY_URL" -o "$TMPDIR/xray.zip"
|
||||
unzip -q "$TMPDIR/xray.zip" -d "$TMPDIR"
|
||||
sudo install -m 755 "$TMPDIR/xray" /usr/local/bin/xray
|
||||
rm -rf "$TMPDIR"
|
||||
|
||||
sudo mkdir -p /etc/xray
|
||||
|
||||
# xhttpSettings — только для xhttp-транспорта
|
||||
_VL_XHTTP=""
|
||||
if [ "$VL_TYPE" = "xhttp" ]; then
|
||||
_VL_XHTTP=$(printf ',\n "xhttpSettings": {\n "path": "%s",\n "mode": "%s"\n }' "$VL_PATH" "$VL_MODE")
|
||||
fi
|
||||
|
||||
sudo tee /etc/xray/config.json > /dev/null << XRAYEOF
|
||||
{
|
||||
"log": { "loglevel": "warning" },
|
||||
"inbounds": [
|
||||
{
|
||||
"port": 1080,
|
||||
"listen": "127.0.0.1",
|
||||
"protocol": "socks",
|
||||
"settings": { "udp": true }
|
||||
},
|
||||
{
|
||||
"port": 2080,
|
||||
"listen": "127.0.0.1",
|
||||
"protocol": "http"
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
{
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"vnext": [
|
||||
{
|
||||
"address": "$VL_ADDRESS",
|
||||
"port": $VL_PORT,
|
||||
"users": [
|
||||
{
|
||||
"id": "$VL_UUID",
|
||||
"encryption": "$VL_ENCRYPTION",
|
||||
"flow": "$VL_FLOW"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "$VL_TYPE",
|
||||
"security": "$VL_SECURITY",
|
||||
"realitySettings": {
|
||||
"serverName": "$VL_SNI",
|
||||
"fingerprint": "$VL_FP",
|
||||
"publicKey": "$VL_PBK",
|
||||
"shortId": "$VL_SID",
|
||||
"spiderX": "$VL_SPX"
|
||||
}$_VL_XHTTP
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
XRAYEOF
|
||||
sudo chmod 644 /etc/xray/config.json
|
||||
|
||||
sudo tee /etc/systemd/system/xray.service > /dev/null << 'SVCEOF'
|
||||
[Unit]
|
||||
Description=Xray Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/local/bin/xray run -c /etc/xray/config.json
|
||||
Restart=on-failure
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
SVCEOF
|
||||
|
||||
# Удаляем чужие drop-in оверрайды (могут переопределять ExecStart на старый конфиг)
|
||||
sudo rm -rf /etc/systemd/system/xray.service.d/
|
||||
# Удаляем старый дефолтный конфиг xray из других путей
|
||||
sudo rm -rf /usr/local/etc/xray/
|
||||
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable --now xray
|
||||
success "xray установлен и запущен"
|
||||
|
||||
# ── Отключение IPv6 (VLESS не тянет IPv6, браузеры зависают) ──
|
||||
info "Отключаю IPv6 на уровне системы..."
|
||||
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
|
||||
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
|
||||
sudo tee /etc/sysctl.d/99-disable-ipv6.conf > /dev/null << 'SYSCTEOF'
|
||||
# Отключение IPv6 — требуется для стабильной работы VLESS/xray
|
||||
net.ipv6.conf.all.disable_ipv6=1
|
||||
net.ipv6.conf.default.disable_ipv6=1
|
||||
SYSCTEOF
|
||||
sudo systemctl restart systemd-resolved
|
||||
success "IPv6 отключён, DNS-кэш очищен"
|
||||
|
||||
cp "$SCRIPT_DIR/home-configs/proxychains/proxychains-xray.conf" "$HOME/.proxychains-xray.conf"
|
||||
success "Proxychains конфиг обновлён"
|
||||
|
||||
# ── Настройка Firefox на SOCKS5 + remote DNS ────────────────
|
||||
info "Настраиваю Firefox на SOCKS5 прокси..."
|
||||
FIREFOX_PROFILE=""
|
||||
if [ -d "$HOME/snap/firefox/common/.mozilla/firefox" ]; then
|
||||
FIREFOX_PROFILE=$(find "$HOME/snap/firefox/common/.mozilla/firefox" -name "*.default*" -type d | head -1)
|
||||
elif [ -d "$HOME/.mozilla/firefox" ]; then
|
||||
FIREFOX_PROFILE=$(find "$HOME/.mozilla/firefox" -name "*.default*" -type d | head -1)
|
||||
fi
|
||||
|
||||
if [ -n "$FIREFOX_PROFILE" ]; then
|
||||
cat > "$FIREFOX_PROFILE/user.js" << 'FJSEOF'
|
||||
user_pref("network.proxy.type", 1);
|
||||
user_pref("network.proxy.socks", "127.0.0.1");
|
||||
user_pref("network.proxy.socks_port", 1080);
|
||||
user_pref("network.proxy.socks_remote_dns", true);
|
||||
user_pref("network.proxy.http", "");
|
||||
user_pref("network.proxy.http_port", 0);
|
||||
user_pref("network.proxy.ssl", "");
|
||||
user_pref("network.proxy.ssl_port", 0);
|
||||
FJSEOF
|
||||
success "Firefox настроен на SOCKS5 (профиль: $FIREFOX_PROFILE)"
|
||||
else
|
||||
warn "Firefox не найден, пропускаю настройку прокси"
|
||||
fi
|
||||
|
||||
# ── Настройка системного прокси (для Chrome/Chromium) ───────
|
||||
info "Настраиваю системный прокси..."
|
||||
if command -v gsettings &>/dev/null; then
|
||||
gsettings set org.gnome.system.proxy mode 'manual' 2>/dev/null || true
|
||||
gsettings set org.gnome.system.proxy.http host '127.0.0.1' 2>/dev/null || true
|
||||
gsettings set org.gnome.system.proxy.http port 2080 2>/dev/null || true
|
||||
gsettings set org.gnome.system.proxy.socks host '127.0.0.1' 2>/dev/null || true
|
||||
gsettings set org.gnome.system.proxy.socks port 1080 2>/dev/null || true
|
||||
success "Системный прокси настроен (HTTP 2080 + SOCKS 1080)"
|
||||
else
|
||||
warn "gsettings не найден, пропускаю настройку системного прокси"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ── 3. Claude Code ───────────────────────────────────────────
|
||||
info "Проверяю Claude Code..."
|
||||
if ! command -v claude &>/dev/null; then
|
||||
@@ -2320,21 +1897,6 @@ claude --dangerously-skip-permissions --system-prompt-file "$_PROMPT_FILE" "$@"
|
||||
OPENCODEEOF
|
||||
chmod +x "$BIN_DIR/ai-opencode"
|
||||
|
||||
# ── 8.5. Proxychains инъекция (только в режиме vless) ────────
|
||||
if [ "$USE_VLESS" -eq 1 ]; then
|
||||
info "Включаю proxychains4 в ai-лаунчеры..."
|
||||
sed -i 's/^exec "\$codex_bin"/exec proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" "\$codex_bin"/' "$BIN_DIR/ai-gpt"
|
||||
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-deepseek"
|
||||
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-kimi"
|
||||
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-glm"
|
||||
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-openrouter"
|
||||
sed -i 's|^\([[:space:]]*\)"\$agy_bin" --dangerously-skip-permissions "\$@"|\1proxychains4 -f "\$HOME/.proxychains-xray.conf" "\$agy_bin" --dangerously-skip-permissions "\$@"|' "$BIN_DIR/ai-gemini"
|
||||
sed -i 's|^\([[:space:]]*\)"\$cursor_bin" --force "\$@"|\1proxychains4 -f "\$HOME/.proxychains-xray.conf" "\$cursor_bin" --force "\$@"|' "$BIN_DIR/ai-cursor"
|
||||
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-claude"
|
||||
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-opencode"
|
||||
success "proxychains4 интегрирован"
|
||||
fi
|
||||
|
||||
# Подготавливаем изолированные config dir'ы для Claude Code-лаунчеров,
|
||||
# чтобы hooks (/switch-account, /add-account) и settings.json были на месте
|
||||
# ещё до первого запуска пользователем.
|
||||
|
||||
Reference in New Issue
Block a user