PW-Panel Extended Version
NOTE: Ini adalah versi premium berbayar, versi gratis bisa download di Website - PW Panel
PW-Panel adalah web control panel untuk private server MMORPG Perfect World. Satu paket berisi: situs marketing publik, dashboard pemain, dan staff tooling (admin + gamemaster) di atas Laravel 8 dengan Jetstream, Fortify, Livewire, Sanctum, dan Tailwind CSS.
Homepage / Author: hrace009
Overview
Proyek dipisah menjadi empat area modul (lihat
app/Http/Controllers dan resources/views):- Website — halaman marketing publik, berita, ranking.
- Front — area pemain yang sudah login (dashboard, shop, donasi, voting, services, voucher).
- Admin — staff control panel lengkap.
- Gamemaster — tools staff in-game yang dibatasi.
Akses Perfect World API diisolasi di services terpisah (
app/Services, plus local package package/hrace009/perfect-world-api) sehingga controllers dan views tidak pernah memanggil game API secara langsung.Features
- Authentication & manajemen profil via Laravel Jetstream + Fortify (opsional 2FA).
- Player dashboard di
/dashboard. - News / artikel dengan categories dan tags.
- Item Shop — purchase, gift, add points, masks.
- Donations — PayPal (Omnipay), Paymentwall, iPaymu, bank transfer.
- Voucher / coupon redemption.
- In-game services.
- Rankings — players dan factions.
- Streamer promotion codes dengan bonus untuk player dan streamer.
- Monthly dan weekly top-spender rewards (Auto send ke character mailbox).
- Character inspection dengan octets reader dan RAE Exported Tabs — sekarang bisa lihat semuanya.
- Gold circulation.
- Territory War data sync.
- Admin dan Gamemaster panels.
- Income reporting & statistik.
- Daily login activity statistics.
- CAPTCHA support (
bonecms/laravel-captcha). - Scheduled jobs untuk game sync, top-spender rewards, daily login, cleanup.
Roadmap / What's Next
Section ini di-maintain best-effort; hanya item yang sudah confirmed — extend sesuai rencana.
- Tetap di Laravel 8 (belum ada rencana migrasi ke Laravel 12 / Vite).
- Terus hardening integrasi Perfect World API di belakang services.
- TODO: publish official changelog / milestone list.
- TODO: dokumentasi formal upgrade path untuk PW server build terbaru.
Tech Stack
- Language / runtime: PHP
^7.3 | ^8.0 - Framework: Laravel
^8.75 - Auth / UI scaffolding: Jetstream
^2.6, Fortify, Sanctum^2.11, Livewire^2.5 - Front-end: Tailwind CSS 3, Sass, Alpine.js 3, jQuery, Bootstrap 5 (legacy assets), TinyMCE, SweetAlert2 — dibundel dengan Laravel Mix 6
- Database: MySQL 5.7+ / MariaDB 10.3+
- Package managers: Composer (PHP), npm (JS/CSS)
- Testing: PHPUnit
^9.5 - Local packages (path repositories di
composer.json):brucedeity/pwhexparserhrace009/perfect-world-api
Requirements
- PHP
^7.3atau^8.0dengan extension: BCMath, Ctype, cURL, Fileinfo, GD, JSON, Mbstring, OpenSSL, PDO, Tokenizer, XML - Composer 2.x dan Git
- Node.js 14+ / 16+ dan npm (atau yarn)
- MySQL 5.7+ / MariaDB 10.3+
- Perfect World server yang running dan reachable dari web host (untuk game integration)
- Web server: Nginx atau Apache
Quick Start
Bash:
# 1. Clone dan install dependencies
git clone <your-fork-or-repo-url> pw-panel
cd pw-panel
composer install
npm install
# 2. Configure environment
cp .env.example .env
# edit .env — minimal set APP_URL dan DB_* credentials
# 3. Generate app key dan run migrations
php artisan key:generate
php artisan migrate
php artisan db:seed --class=ServiceSeeder
# 4. Build front-end assets
npm run dev # development build
# npm run prod # production build
# 5. Buat akun administrator
php artisan pw:createAdmin
# 6. Serve the app
php artisan serve
Akses http://127.0.0.1:8000/ untuk public site, dan http://127.0.0.1:8000/dashboard setelah login.
Entry Points
- HTTP kernel:
public/index.php(web server document root harus kepublic/). - Console kernel / CLI:
artisan(mis.php artisan ...). - Route definitions:
routes/web.php,routes/api.php,routes/channels.php,routes/console.php. - Scheduler: didefinisikan di
app/Console/Kernel.php— jalankanphp artisan schedule:workuntuk local, atau cron entry* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1di production.
Scripts
npm (lihat package.json)
| Script | Description |
|---|---|
npm run dev / npm run development | Laravel Mix development build |
npm run watch | Rebuild assets on file changes |
npm run watch-poll | watch dengan polling (berguna di VM / WSL) |
npm run hot | Hot Module Replacement dev server |
npm run prod / npm run production | Production (minified) build |
Custom artisan commands (lihat app/Console/Commands)
| Command | Purpose |
|---|---|
pw:createAdmin | Buat akun administrator secara interaktif. |
pw:cleanupPendingUsers | Hapus pending user registration yang kedaluwarsa. |
pw:deactivateCoupons | Nonaktifkan coupons / vouchers yang sudah expired. |
pw:getDailyLogin | Record daily-login activity dari game server. |
pw:summarizeDailyLogin | Summarize daily-login stats. |
pw:sendTopSpendersReward | Distribusikan weekly top-spender rewards. |
pw:sendTopSpendersMonthlyReward | Distribusikan monthly top-spender rewards. |
pw:updateFactions | Sync factions dari game server. |
pw:updatePlayers | Sync player data dari game server. |
pw:updateTerritories | Sync Territory War data. |
pw:updateTransfer | Process pending in-game transfers. |
pw:updateIpaymuStatus | Poll iPaymu untuk update status donasi. |
Composer scripts
Hanya standard Laravel lifecycle hooks (
post-autoload-dump, post-update-cmd, post-create-project-cmd, post-root-package-install) — lihat composer.json.Environment Variables
Copy
.env.example ke .env dan isi minimal berikut. Key yang tidak disebutkan pakai default Laravel.Core
| Variable | Notes |
|---|---|
APP_NAME | Displayed application name. |
APP_ENV | local / production. |
APP_KEY | Di-generate oleh php artisan key:generate. |
APP_DEBUG | false di production. |
APP_URL | Public base URL (dipakai payment callback). |
Database
DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD.Sessions / Cache / Queue
SESSION_DRIVER (default database — run migrations sebelum login pertama), SESSION_LIFETIME, CACHE_DRIVER, QUEUE_CONNECTION, FILESYSTEM_DRIVER, BROADCAST_DRIVER.Mail
MAIL_MAILER, MAIL_HOST, MAIL_PORT, MAIL_USERNAME, MAIL_PASSWORD, MAIL_ENCRYPTION, MAIL_FROM_ADDRESS, MAIL_FROM_NAME, dan MAIL_GM untuk gamemaster notifications.Optional services
- AWS:
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_DEFAULT_REGION,AWS_BUCKET,AWS_USE_PATH_STYLE_ENDPOINT. - Pusher:
PUSHER_APP_ID,PUSHER_APP_KEY,PUSHER_APP_SECRET,PUSHER_APP_CLUSTER(dan matchingMIX_PUSHER_*). - Redis / Memcached:
REDIS_HOST,REDIS_PORT,REDIS_PASSWORD,MEMCACHED_HOST.
Perfect World & payments
Credentials Perfect World server dan feature toggle ada di
config/pw-config.php dan config file terkait (config/ipaymu.php, dll). Payment provider keys (PayPal, Paymentwall, iPaymu) umumnya di-config dari admin panel; webhook secrets sensitif wajib disimpan di .env dan direferensikan via config. TODO: enumerate semua PW-specific env/config key di docs/ page tersendiri.Database & Game Integration
- Sample database dump tersedia di
dbo.sqluntuk baseline data PW-integration (wajib importdbo.sqlke database baru sebelum run migrations). - Application tables dibuat oleh migrations di
database/migrations; seeders didatabase/seeders. - Custom
Usermodel pakai kolompasswd/passwd2dan primary key custom (users.ID); hashing di-wire lewatapp/Providers/HashServiceProvider.php.
Payments
- iPaymu — config di
config/ipaymu.php(va,key,sandbox, limits). - PayPal — via
league/omnipay+omnipay/paypal; config di admin panel. - Paymentwall — middleware dan model sudah included; set callback / pingback URL ke domain kamu.
Donation endpoint dideklarasikan di
routes/web.php.Tests
Pakai PHPUnit (
phpunit.xml di repo root) dengan suite tests/Feature dan tests/Unit.
Bash:
php vendor/bin/phpunit
# atau suite tertentu
php vendor/bin/phpunit --testsuite=Feature
Project Structure
Code:
app/
Actions/ # Jetstream/Fortify actions dan custom actions
Console/
Commands/ # Custom artisan commands (PW sync, rewards, cleanup)
Kernel.php # Scheduler definitions
Http/
Controllers/{Admin,Front,Gamemaster,Website,Auth,Profile}
Livewire/ # Livewire components (class-side)
Middleware/ # Registered in Http/Kernel.php
Helper/ # Autoloaded helpers (prefer Services/Actions for new code)
Providers/ # Incl. HashServiceProvider untuk PW passwd hashing
Services/ # Perfect World API dan service class lain
View/Components/Hrace009/ # Blade component classes
bootstrap/
config/ # Incl. pw-config.php, ipaymu.php
database/
migrations/
seeders/
factories/
docs/ # Dokumentasi tambahan
package/ # Local path-repository packages
brucedeity/pwhexparser
hrace009/perfect-world-api
public/ # Web server document root (index.php)
resources/
css/app.css # Tailwind entry
sass/app.scss # Sass entry
js/ # JS bundles
lang/{en,id,...}/ # Translation files
views/{website,front,admin,gm,auth,profile,components,livewire}/
routes/
web.php api.php channels.php console.php
storage/
tests/{Feature,Unit}/
webpack.mix.js # Laravel Mix build config
tailwind.config.js
phpunit.xml
artisan # CLI entry point
Deployment
Arahkan web server ke direktori
public/ dan set APP_DEBUG=false, APP_ENV=production.Optimize untuk production:
Bash:
composer install --optimize-autoloader --no-dev
php artisan config:cache
php artisan route:cache
php artisan view:cache
npm run prod
Clear cache setelah perubahan config / route / view:
Bash:
php artisan optimize:clear
Nginx (contoh)
NGINX:
server {
listen 80;
server_name example.com;
root /srv/example.com/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # sesuaikan dengan PHP-FPM kamu
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* { deny all; }
}
Apache (contoh)
Code:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example.com/public
<Directory /var/www/example.com>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>
Bash:
a2ensite pwpanel.conf
a2enmod rewrite
systemctl restart apache2
Security Checklist
APP_ENV=productiondanAPP_DEBUG=falsedi production.- Serve lewat HTTPS dan set
APP_URLdengan benar. - Restrict write permission ke
storage/*danbootstrap/cache. - Rotasi payment provider keys dan webhook secret secara berkala.
- Simpan secret di
.env— jangan pernah commit credentials.
Troubleshooting
- 500 error setelah deployment — run
php artisan optimize:cleardan cek file permission. - Auth / session issue — pastikan migration sudah jalan dan table
sessionsada (defaultSESSION_DRIVER=database). - Asset issue — rebuild dengan
npm run proddan pastikanpublic/mix-manifest.jsonada dan readable.
Contributing
PR dan issue welcome. Ikuti Laravel code style, hormati module boundary yang dijelaskan di
AI_GUIDELINES.md, dan jaga controller tetap tipis — push business logic ke actions / services.Lihat juga
CODE_OF_CONDUCT.md.License
Dirilis di bawah MIT License — lihat
LICENSE.Credits: Harris Marfel (hrace009). Base work inspired by @tomirons/pw-web.