Người dùng theo ngày (14 ngày, thiết bị duy nhất — tương đối)
Realtime (SSE, cập nhật mỗi vài giây)
Phòng đang hoạt động
| Phòng | Mode | Region | Trạng thái | Người | Còn lại | Server |
|---|
Phòng đang hoạt động
| Phòng | Mode | Region | Trạng thái | Người | Còn lại | Server |
|---|
Phòng vừa kết thúc
| Phòng | Mode | Region | Kết quả | Lý do | Kết thúc lúc |
|---|
Phòng custom
Người chơi tự tạo phòng và chia nhau mã code. Khi bấm “Tìm game”: ghép vào phòng đang chờ nếu còn chỗ, nếu không thì cấp instance riêng (cần tối thiểu số người ở cột “Cần”). Thành viên mất nhịp heartbeat sẽ tự bị đưa ra khỏi phòng.
| Mã | Mode | Trạng thái | Region | Người | Cần | Chủ phòng | Phòng game | Thành viên |
|---|
Phòng custom vừa đóng
| Mã | Mode | Người | Lý do đóng | Đóng lúc |
|---|
Instances
Destroy sẽ xoá hẳn server trên nhà cung cấp tương ứng (Hetzner tính theo khung giờ, DigitalOcean tính theo giây). Release chỉ trả instance về trạng thái rảnh để dùng lại.
| ID | Tên | Nhà cung cấp | Region | Loại | Trạng thái | Phase | DS ver | Ack? | IP | Port | Phòng | Accepting | Người | Tạo lúc | Đã tạo | Keepalive | Healthy | Lý do destroy |
|---|
Announcement
Tối đa 6 bản mới nhất được đóng gói thành
game/announcements.json trên S3 rồi phục vụ client qua
GET /api/v1/game/announcements (API đọc từ file json, không bào DB).
File json công khai:
| ID | Tiêu đề | Nội dung | Ưu tiên | Publish | Cập nhật |
|---|
Thêm announcement
Người chơi
Tài khoản do POST /api/v1/game/account/register tạo từ user id có sẵn ở client.
Backend sinh user id riêng + token cấp thẳng cho client (không email). Khoá user để chặn mọi API cần token người chơi.
| User ID (BE) | User ID client | Tên hiển thị | Verify | Số dư | Trạng thái | Tạo lúc | Hoạt động cuối |
|---|
Chi tiết người chơi
Bạn bè
| Tên | User ID | Kết bạn |
|---|
Điều chỉnh số dư
Đăng nhập / lấy lại tài khoản
Người chơi mất hoặc đổi máy: đặt email + mật khẩu ở đây (hoặc người chơi tự đặt trong game), rồi họ đăng nhập bằng email ở máy mới. Chưa cấu hình gửi email thì dùng nút Cấp mã đăng nhập 1 lần — mã hiện 1 lần để bạn đọc cho người chơi.
File save đã backup
Sản phẩm đã mua
| Sản phẩm | Loại | SL | Đã trả | Mua lần cuối |
|---|
Bản nén "sản phẩm đã mua" trên S3
Client tải bản gzip này để tự đối soát (phiên bản tăng mỗi khi dữ liệu đổi; mặc định để riêng tư — chỉ tải được bằng URL có chữ ký hết hạn).
Giao dịch gần đây
| # | Currency | Thay đổi | Còn lại | Loại | Lý do | Lúc |
|---|
Loại currency
Tất cả currency là số nguyên. Hiện có sẵn banana; thêm loại mới ở ô bên cạnh.
| Code | Tên | Icon | Thứ tự | Bật | Tổng số dư |
|---|
Thêm / sửa loại currency
Gói nạp IAP
Gói nạp qua App Store / Google Play. Game chỉ gửi mã gói +
transaction_id sau khi thanh toán thành công — server tự quyết định cộng bao nhiêu,
và chống cộng trùng theo (nền tảng + transaction_id). Client gọi
POST /api/v1/game/iap/credit; danh sách gói lấy từ GET /api/v1/game/iap/packs.
| Mã gói | Nền tảng | Product ID store | Currency | Cộng | Bật | Ghi chú |
|---|
Lịch sử giao dịch
| # | User | Currency | Thay đổi | Còn lại | Loại | Ref | Lý do | Lúc |
|---|
Sản phẩm
Client chỉ thấy sản phẩm đang bán (active) qua GET /api/v1/game/products.
Mỗi sản phẩm có thể bán bằng nhiều currency; giá cuối = giá gốc − discount (server tự tính).
| Ảnh | ID | Tiêu đề | Category | Giá | Giảm | Bán | Kiểu bán | Đã bán | Thứ tự | Cập nhật |
|---|
Category
| ID | Tên | Thứ tự | Bật | Số SP |
|---|
Thêm sản phẩm
Ảnh sản phẩm
Upload 1 ảnh: hệ thống tự tạo 2 bản trên S3 — bản gốc giữ nguyên và bản nén cạnh dài 512px (JPEG). Ảnh cũ của sản phẩm sẽ bị xoá để không tốn dung lượng.
Mã đối tác
Mã tracking do server sinh (7 ký tự, không trùng). Không xoá và không sửa mã hay mô tả — chỉ bật hoặc tắt trạng thái. Người giới thiệu = số tài khoản đã redeem mã (tặng 3 banana + mở khoá full game). Lượt nạp = số lần nạp gói 10 banana có kèm mã (tặng thêm 4 banana).
| Mã | Mô tả | Trạng thái | Người giới thiệu | Lượt nạp | Tạo lúc | Tạo bởi |
|---|
Theo tháng
| Mã | Mô tả | Lượt nạp (tháng) | Người giới thiệu (tháng) |
|---|
Cấu hình Client
Bảng giá / phần thưởng / chu kỳ đồng bộ mà game client tải về.
Tên tham số giữ nguyên tên biến trong code game. Server mã hoá AES-256-GCM
(khoá = SHA256(secret)) rồi phát hành game/client-settings.json lên S3;
client tải qua GET /api/v1/game/client-settings và tự giải mã.
Tham số cấu hình
JSON gửi cho client
Đây là bản rõ sẽ được mã hoá — key đúng bằng tên biến trong game. Có thể dán JSON vào rồi bấm “Áp dụng vào form” để sửa nhanh nhiều tham số cùng lúc.
Khoá chia sẻ với client
Game nhúng khoá này; server tạo khoá mã hoá SHA256(secret).
Đổi khoá sinh kid mới → phải cập nhật game trước, nếu không client sẽ không giải mã được.
Kiểm tra payload
Giải mã thử payload đang phát hành bằng chính khoá trên, ngay trong trình duyệt (AES-256-GCM). Giải mã ra đúng JSON nghĩa là client cũng làm được.
(chưa chạy)
Lịch sử thay đổi
Mỗi lần lưu tạo 1 version mới (giữ 20 bản gần nhất). Khôi phục bản cũ sẽ tạo version mới — không xoá gì.
| Version | Người sửa | Ghi chú | Lúc |
|---|
Điều hướng liên kết
Nhập URL đích + số lần mở tối đa (hoặc vô hạn). Hệ thống gen một link public
trên domain này. Mỗi lần ai đó mở link → đếm +1; chạm mức tối đa → trả 404 (không điều hướng nữa).
Danh sách
| Code | Link public | URL đích | Đã mở | Giới hạn | Tạo lúc |
|---|
Đối soát IAP
Chỉ đọc. SKU cb_10_banana = gói banana_20 (+20). Mỗi đối soát trừ tối đa 20 chuối chưa verify, không đổi số dư. Callback đến trước credit chờ retry (60 giây/lần, tối đa 3 lần). Không hiển thị receipt hoặc purchase token.
| Store / sản phẩm | Notification ID / loại | Nhận / xử lý | Trạng thái / lý do | Retry | User đã khớp | Đối soát | Gửi lại |
|---|
Leaderboard — trạng thái
Đang tải…
Cài đặt leaderboard
Nút Lưu bên dưới lưu toàn bộ cấu hình (giống nút Lưu ở tab Cấu hình). Cron chạy 1 lần/ngày trong giờ đã chọn và bỏ qua ngày đã có snapshot (kể cả snapshot do Rebuild).
Tra cứu người chơi
Top 100 (snapshot)
| # | Người chơi | Level | Skin | Wins (snapshot) | Live wins | Cờ |
|---|
Quà tặng (mua tặng bạn bè)
Người tặng trả chuối, người nhận (bạn đã chấp nhận) nhận sản phẩm + 1 thông báo type=gift.
Nút Lưu bên dưới lưu toàn bộ cấu hình (giống nút Lưu ở tab Cấu hình).
Lịch sử tặng
| Thời gian | Người tặng | Người nhận | Sản phẩm | SL | Loại | Chuối |
|---|
Cấu hình ADS
Client đọc banner_ads_enabled từ GET /api/v1/config (mặc định tắt).
Server không phục vụ ads — chỉ là cờ cấu hình. Nút Lưu bên dưới lưu toàn bộ cấu hình (giống tab Cấu hình / Quà tặng).
Cấu hình TEST · Thiết bị bỏ qua ngưỡng ping
Device trong danh sách khi POST /match/join sẽ vào fsn1 (nếu đang bật; không thì default_region nếu đang bật) dù ping vượt ngưỡng; không ảnh hưởng người khác, party find-game và DEV TEST. Device bypass không bị blacklist ping (DS ping-report không blacklist, join bỏ qua blacklist cũ, không DEVICE_BLOCKED). Lịch sử xem ở Events: join_ping_bypass.
Nút Lưu bên dưới lưu TOÀN BỘ cấu hình (giống nút Lưu ở tab Cấu hình) — mọi thay đổi chưa lưu ở các tab khác cũng được lưu kèm.
Cấu hình TEST · Instance riêng cho DEV TEST
Dựng một instance riêng (DigitalOcean hoặc Hetzner, 2GB/4GB · 2 vCPU) và một khoá đối xứng để định danh client test. Chỉ client gửi kèm chữ ký hợp lệ mới được cấp DS từ instance này — client thường của người chơi đi đường cũ, không bị ảnh hưởng.
Đủ N client test vào thì phòng mới mở (client thứ N vào là DS nhận người). 1 = mở ngay khi client đầu tiên vào. N lớn hơn số người tối đa của mode sẽ tự kẹp theo mode.
Mặc định BẬT. Lưu ngay khi bấm (setting devtest_ds_net_events).
Chỉ máy DS TEST nhận DS_DISCORD_NET_EVENTS=1, máy của phòng người chơi và máy prewarm
không bao giờ có. Chỉ áp dụng cho máy test tạo sau khi đổi: máy đang chạy phải Destroy rồi tạo lại.
Instance test không bị dọn tự động như instance của phòng thường — chỉ Destroy ở đây mới xoá. Nhớ destroy khi test xong để không mất tiền.
Khoá đối xứng định danh client test
Thông tin để build bản client test
DS & phòng đang phục vụ client test
Map Smash bị tắt
Tick = tắt map đó. Lưu áp dụng ngay cho phòng Smash READY sau đó (phòng đã READY giữ danh sách cũ). Tab này chỉ lưu danh sách map, không đụng cấu hình khác. Phải chừa ít nhất 1 map bật (tắt hết thì client bỏ qua danh sách và chơi đủ pool).
Server chưa trả known_maps (BE cũ) — nhập tay, mỗi dòng một sceneName. Phân biệt hoa/thường; tên sai sẽ bị bỏ qua.
Tối đa 100 map, mỗi tên tối đa 64 ký tự.
Smash 1vs1 — map tắt thêm
Tick = tắt thêm cho Smash 1vs1 (smash_solo), ngoài danh sách chung ở trên.
Để trống ([]) = không lọc thêm. Nếu tắt hết các map còn lại thì client/DS bỏ qua danh sách riêng này
và vẫn theo danh sách chung. Lưu áp dụng cho phòng smash_solo READY sau đó (phòng đã READY giữ danh sách cũ).
FFA Smash và Team Smash không dùng danh sách này.
Smash 1vs1 đang lưu trên server (0):
Đang lưu trên server (0):
Discord webhooks
URL webhook là secret, chỉ cấu hình bằng biến môi trường trên server — Admin chỉ thấy đã cấu hình hay chưa. Giờ tính theo giờ Việt Nam; giờ im lặng là [bắt đầu, kết thúc), vd 2→7 = không gửi 02:00…06:00, 07:00 vẫn gửi. Bắt đầu = kết thúc là không có giờ im lặng.
Thiết bị bị chặn theo region (do Unity Dedicated Server báo ping kém)
| Thiết bị | Region | Ping | Lý do | Còn hiệu lực tới |
|---|
Nhật ký sự kiện
RAM & CPU (Balance Server)
Mẫu in-process mỗi ~10 giây — không ghi SQLite. Host CPU/RAM đầy đủ trên Linux (VPS); trên Mac chỉ chắc số process.
Đổi mật khẩu admin
Webhook Discord
Cảnh báo (max instance, phòng không đủ người...) và báo lỗi đều chống spam 1 giờ.
Hạ tầng — nhà cung cấp
Hetzner Cloud
SSH key đã đăng ký
Server đang có trên tài khoản
| Loại | vCPU | RAM | Disk | Arch | Giá/giờ theo region (EUR) |
|---|
Phiên bản & API
Tài liệu API cho DEV Unity Dedicated Server và mobile: xem file docs/API.md trong repo hoặc liên hệ admin.