# FTC Ticketing System (Refactored)

A comprehensive ticketing solution for Minecraft (CC:Tweaked) with a modern Web Control Panel.

## Features

*   **Ticket Machine (Lua)**: Issue tickets, print receipts, write to floppy disks.
*   **Gate (Lua)**: Validate tickets, control redstone doors, track entries/exits.
*   **Web Console**:
    *   **Real-time Dashboard**: Live updates of sales and passenger flow via Socket.IO.
    *   **Visual Line Editor**: Manage stations and lines with an interactive SVG map.
    *   **Fare Management**: Configure fares with a visual fare chart.
    *   **Logs**: Track ticket usage and system operations.
    *   **System Settings**: Configure API endpoints and promotions.
    *   **File Manager**: Upload and manage audio files (`.dfpwm`) for devices.

## Project Structure

*   `server/`: Node.js Backend (Express + Socket.IO).
    *   `services/`: Data and logic handling.
    *   `routes/`: API endpoints.
*   `web/`: Frontend (Vue 3 + Socket.IO Client).
    *   `index.html`: The new Control Panel.
    *   `index.js`: Vue 3 logic.
*   `Lua/`: CC:Tweaked scripts.

## Installation

1.  **Prerequisites**: Node.js 16+.
2.  **Install Dependencies**:
    ```bash
    npm install
    ```

## Running the Server

### Development
```bash
npm start
```
Access the console at `http://localhost:23333`.

### Production (PM2)
This project includes an `ecosystem.config.js` for PM2.

```bash
# Start
pm2 start ecosystem.config.js

# View logs
pm2 logs ticket-machine

# Restart
pm2 restart ticket-machine
```

## Configuration

*   **Server Port**: Default `23333`. Set `PORT` environment variable to change.
*   **Data Storage**: All data is stored in `web/data/`.
*   **CC:Tweaked Devices**:
    *   Run `install_machine.lua` or `install_gate.lua` on your turtles/computers.
    *   Point them to your server's IP (e.g., `http://YOUR_IP:23333/api`).

## API

*   `/api`: Admin API (Stations, Lines, Fares, Logs).
*   `/api/public`: Public API for devices (Ticket queries, Orders).
*   **WebSocket**: Connect to `/` for real-time events (`stations:updated`, `stats:ticket:updated`, etc.).

## Troubleshooting

### Error: bind EADDRINUSE 0.0.0.0:23333
This means the port 23333 is already occupied.
1.  Stop the PM2 process: `pm2 stop ticket-machine`
2.  Find the process holding the port: `lsof -i :23333` or `netstat -tunlp | grep 23333`
3.  Kill the process: `kill -9 <PID>`
4.  Restart PM2: `pm2 restart ticket-machine`

### Error: Cannot find module 'express'
Run `npm install` in the project directory to install dependencies.

## License

MIT
