mirror of
https://github.com/sky-systems/sky_phone.git
synced 2026-08-29 03:01:42 +00:00
df6b06c6db
Auto-detect hex_4_inventory and add a count-based ESX adapter for non-unique, virtual-SIM phone configurations. Expose the LB Phone IsOpen alias required by HEX and document/test the supported configuration boundaries.
551 lines
17 KiB
Markdown
551 lines
17 KiB
Markdown
# Sky Phone
|
|
|
|
Sky Phone is a complete, standalone FiveM smartphone resource with a modern iPhone-inspired interface, persistent device data, physical or virtual SIM support, social apps, media, services, games, and framework integrations.
|
|
|
|
The production frontend is included. Customers do not need Node.js or pnpm for a normal server installation.
|
|
|
|
## Highlights
|
|
|
|
- Modern Sky UI with light and dark mode support
|
|
- Unique physical phones or one persistent virtual phone per character
|
|
- Registered, anonymous, physical, and automatic virtual SIM cards
|
|
- Calls, Messages, Mail, DarkChat, Radio, EasyShare, and payphones
|
|
- Picstagram, FlipTok, Feather, Flare, and CrewLink
|
|
- Banking, Billing, Garage, Housing, Companies, CityMarkt, Local Pages, Maps, SkyRide, and Weazel News
|
|
- Camera, Photos, Music, Calendar, Clock, Notes, Voice Memos, Weather, and Calculator
|
|
- Built-in games and an App Store
|
|
- English and German language support
|
|
- Automatic database installation and upgrades
|
|
- Command-only LB Phone database migration with preview and rollback
|
|
- Compatibility adapters for popular frameworks, inventories, voice systems, housing resources, and external phone apps
|
|
|
|
## Requirements
|
|
|
|
### Required
|
|
|
|
- MySQL or MariaDB
|
|
- `oxmysql`
|
|
- One supported framework:
|
|
- ESX Legacy (`es_extended`)
|
|
- Qbox (`qbx_core`)
|
|
- QBCore (`qb-core`)
|
|
- One supported inventory:
|
|
- `ox_inventory`
|
|
- `qb-inventory`
|
|
- `lj-inventory`
|
|
- `qs-inventory`
|
|
- `codem-inventory`
|
|
- `core_inventory`
|
|
- `mf-inventory`
|
|
- `smx-inventory`
|
|
|
|
`mf-inventory` and `smx-inventory` are supported with ESX.
|
|
|
|
### Voice
|
|
|
|
Phone calls support:
|
|
|
|
- PMA Voice
|
|
- SaltyChat
|
|
|
|
The Radio app supports:
|
|
|
|
- YACA
|
|
- PMA Voice
|
|
- SaltyChat
|
|
|
|
Start the selected voice resource before Sky Phone.
|
|
|
|
### Optional services
|
|
|
|
- FiveManage V3 Media API for Camera uploads, videos, Voice Memos, and remote Gallery deletion
|
|
- GIPHY API for GIF search
|
|
- Supported Garage and Housing resources when those apps should use external provider data
|
|
|
|
## Quick installation
|
|
|
|
1. Copy the resource into your FiveM resources directory.
|
|
2. Keep the resource folder name `sky_phone`.
|
|
3. Start `oxmysql`, your framework, inventory, and voice resource before Sky Phone.
|
|
4. Review `sky_phone/config/config.lua` and `sky_phone/config/media.lua`.
|
|
5. Add the required inventory items.
|
|
6. Add `ensure sky_phone` to `server.cfg`.
|
|
7. Restart the server and watch the console for warnings.
|
|
|
|
Example start order:
|
|
|
|
```cfg
|
|
ensure oxmysql
|
|
ensure es_extended
|
|
ensure ox_inventory
|
|
ensure pma-voice
|
|
ensure sky_phone
|
|
```
|
|
|
|
Replace the example framework, inventory, and voice resources with the providers used by your server.
|
|
|
|
Sky Phone creates and upgrades its database tables automatically. A manual SQL import is normally not required.
|
|
|
|
## Configuration
|
|
|
|
Customer settings are organized in:
|
|
|
|
```text
|
|
sky_phone/config/config.lua
|
|
sky_phone/config/media.lua
|
|
```
|
|
|
|
The files contain clearly separated sections for:
|
|
|
|
| Section | Purpose |
|
|
| --- | --- |
|
|
| `Config.Bridge` | Framework, inventory, language, callback timeout, and debug mode |
|
|
| `Config.Phone` | Phone item, movement, unique-device mode, and development command |
|
|
| `Config.Sim` | Physical or virtual SIM behavior and number formatting |
|
|
| `Config.Calls` / `Config.Radio` | Voice providers, call behavior, radio limits, and permissions |
|
|
| `Config.Payphones` | Payphone pricing, detected props, validation, and custom spawned locations |
|
|
| `Config.Animations` | Phone prop, animations, and portrait/landscape transforms |
|
|
| App sections | Limits and behavior for every built-in app |
|
|
| `Config.Server` | Stable password and passcode peppers |
|
|
| `Config.Companies` | Company directory, jobs, services, and permissions |
|
|
| `Config.Media` (`config/media.lua`) | FiveManage, GIPHY, uploads, and Gallery imports |
|
|
| `Config.Music` | Server music library and playlist limits |
|
|
| `Config.Migrations` | Manual LB Phone migration domains |
|
|
| `Config.WeazelNews` | Editorial jobs, categories, and article limits |
|
|
|
|
Restart `sky_phone` after changing Lua configuration.
|
|
|
|
### Language
|
|
|
|
Available locales:
|
|
|
|
- English: `en`
|
|
- German: `de`
|
|
|
|
Select the language near the top of `config.lua`:
|
|
|
|
```lua
|
|
Config.Bridge.Locale = "en"
|
|
```
|
|
|
|
or:
|
|
|
|
```lua
|
|
Config.Bridge.Locale = "de"
|
|
```
|
|
|
|
Locale files are stored separately:
|
|
|
|
```text
|
|
sky_phone/config/locales/en.lua
|
|
sky_phone/config/locales/de.lua
|
|
```
|
|
|
|
The German locale uses the complete English structure as a fallback, so newly introduced keys never leave the interface without text.
|
|
|
|
### Debug output
|
|
|
|
```lua
|
|
Config.Bridge.Debug = false
|
|
```
|
|
|
|
When enabled, Sky Phone prints debug and informational messages. Warnings and errors are always shown.
|
|
|
|
The short LB Phone detection notice also remains visible when debug mode is disabled.
|
|
|
|
## Security values
|
|
|
|
Sky Phone ships with stable generated defaults in `Config.Server`:
|
|
|
|
```lua
|
|
Config.Server = {
|
|
PasscodePepper = "...",
|
|
FlipTokPasswordPepper = "...",
|
|
PicstagramPasswordPepper = "...",
|
|
}
|
|
```
|
|
|
|
For a production server, replace them with your own long, random, different values before players create passcodes or social accounts.
|
|
|
|
Important:
|
|
|
|
- Keep the values private and stable.
|
|
- Changing `PasscodePepper` invalidates existing device passcodes.
|
|
- Changing a social-app pepper invalidates existing passwords for that app.
|
|
- Do not replace these values during routine updates.
|
|
|
|
Sky Cloud logins are in-character credentials for the roleplay phone. Players must never reuse a
|
|
real-world password. FlipTok and Picstagram passwords are stored as salted hashes using their
|
|
configured peppers.
|
|
|
|
The server-only block is evaluated only on the server. Because the project uses a customer-requested single configuration file that is also present in the client resource package, protect access to your distributed resource files if these values must remain strictly secret.
|
|
|
|
## Inventory items
|
|
|
|
### ox_inventory
|
|
|
|
Default entries for unique phones with physical SIM cards:
|
|
|
|
```lua
|
|
["phone"] = {
|
|
label = "iFruit Phone",
|
|
weight = 200,
|
|
stack = false,
|
|
close = true,
|
|
consume = 0,
|
|
},
|
|
|
|
["sky_phone_sim_registered"] = {
|
|
label = "Registered SIM",
|
|
weight = 5,
|
|
stack = false,
|
|
close = true,
|
|
consume = 0,
|
|
},
|
|
|
|
["sky_phone_sim_anonymous"] = {
|
|
label = "Anonymous SIM",
|
|
weight = 5,
|
|
stack = false,
|
|
close = true,
|
|
consume = 0,
|
|
},
|
|
```
|
|
|
|
Do not configure an LB Phone client event or client export. Sky Phone registers the usable items through its server-side inventory adapter.
|
|
|
|
The server registers `Config.Phone.Item` as usable for every supported inventory adapter: `ox`, `qb`, `lj`, `qs`, `codem`, `core`, `mf`, `smx`, `hex`, and `esx`. Resource startup fails visibly if the selected adapter cannot complete that registration.
|
|
|
|
The `hex` and `esx` adapters use ESX's count-based item API. They require both `Config.Phone.Unique = false` and `Config.Sim.Enabled = false` because this API cannot persist per-item phone or physical SIM metadata. `auto` selects `hex` when `hex_4_inventory` is started and otherwise falls back to `esx` on an ESX server when no metadata-capable inventory is detected.
|
|
|
|
### QBCore-style item tables
|
|
|
|
- Set the phone's `unique` value to match `Config.Phone.Unique`.
|
|
- Set `useable = true` and `shouldClose = true`.
|
|
- Physical SIM items must always be unique.
|
|
- SIM items are not required when `Config.Sim.Enabled = false`.
|
|
|
|
## Phone and SIM modes
|
|
|
|
The two mode switches are independent:
|
|
|
|
```lua
|
|
Config.Phone.Unique = true
|
|
Config.Sim.Enabled = true
|
|
```
|
|
|
|
| Phone mode | Behavior |
|
|
| --- | --- |
|
|
| `Unique = true` | Every phone item receives its own IMEI. Settings, apps, local data, linked account, and SIM move with the item. The item must not stack. |
|
|
| `Unique = false` | Every framework character receives one persistent virtual device. Any configured phone item opens that device. The item may stack. |
|
|
|
|
With unique phones, using an inventory item selects that exact handset whenever the inventory reports its slot. The F1 hotkey reopens the last selected IMEI; if no handset has been selected yet, the server chooses the first concrete phone slot. The client never supplies a slot or IMEI.
|
|
|
|
| SIM mode | Behavior |
|
|
| --- | --- |
|
|
| `Enabled = true` | A registered or anonymous physical SIM item is required for cellular service. |
|
|
| `Enabled = false` | Sky Phone creates a persistent automatic number for devices without a SIM. Physical SIM items are not required. |
|
|
|
|
When changing these modes on an existing production server, restart the resource and test with a copy of the database first. The first phone used after switching to non-unique mode may adopt an existing valid IMEI so its local data is preserved.
|
|
|
|
## Database
|
|
|
|
Runtime migrations create and update the Sky Phone schema automatically.
|
|
|
|
For hosts that require a manual fresh installation, import:
|
|
|
|
```text
|
|
sky_phone/sql/install.sql
|
|
```
|
|
|
|
Keep runtime migrations enabled after importing the SQL file because they remain responsible for future upgrades.
|
|
|
|
A Sky Cloud account is optional. Devices without an account retain local settings and supported local app data. Linking an account synchronizes supported data across linked devices.
|
|
|
|
## Media and uploads
|
|
|
|
Configure FiveManage in the server-only `sky_phone/config/media.lua` file:
|
|
|
|
```lua
|
|
Config.Media.FiveManage.ApiKey = "your-fivemanage-v3-media-token"
|
|
```
|
|
|
|
Without a valid token:
|
|
|
|
- Camera uploads are disabled
|
|
- Video uploads are disabled
|
|
- Voice Memo uploads are disabled
|
|
- FiveManage Gallery imports are unavailable
|
|
|
|
Configure GIF search with:
|
|
|
|
```lua
|
|
Config.Media.GiphyApiKey = "your-giphy-api-key"
|
|
```
|
|
|
|
Gallery import websites are configured under `Config.Media.Import.Websites`. Direct URLs are accepted only when their HTTPS hostname matches the configured allowed hosts.
|
|
|
|
## Music
|
|
|
|
Place server-owned audio files anywhere below:
|
|
|
|
```text
|
|
sky_phone/config/music/
|
|
```
|
|
|
|
Supported audio formats:
|
|
|
|
- OGG
|
|
- MP3
|
|
|
|
Optional artwork may use:
|
|
|
|
- WEBP
|
|
- PNG
|
|
- JPG
|
|
- JPEG
|
|
|
|
Configure each track in `Config.Music.Tracks`:
|
|
|
|
```lua
|
|
Config.Music.Tracks = {
|
|
{
|
|
Id = "night-drive",
|
|
Title = "Night Drive",
|
|
Artist = "Sky Records",
|
|
},
|
|
}
|
|
```
|
|
|
|
Name the audio and artwork files after the stable track ID, for example:
|
|
|
|
```text
|
|
night-drive.ogg
|
|
night-drive.webp
|
|
```
|
|
|
|
Restart Sky Phone after adding files. A frontend rebuild is not required.
|
|
|
|
Players may also add public YouTube video links to their personal music library.
|
|
|
|
## Voice and Radio
|
|
|
|
### Calls
|
|
|
|
```lua
|
|
Config.Calls.VoiceProvider = "pma"
|
|
```
|
|
|
|
Supported values:
|
|
|
|
- `pma` or `pma-voice`
|
|
- `saltychat` or `salty`
|
|
|
|
SaltyChat supports the provider-backed call speaker feature. PMA Voice keeps the speaker option unavailable.
|
|
|
|
### Radio
|
|
|
|
```lua
|
|
Config.Radio.VoiceProvider = "auto"
|
|
```
|
|
|
|
Automatic selection checks YACA, PMA Voice, and SaltyChat. Restricted frequency ranges and job access are configured in `Config.Radio.LockedChannels`.
|
|
|
|
Radio display-name permissions are configured in `Config.Radio.DisplayName.AllowedJobs`.
|
|
|
|
## Payphones
|
|
|
|
Sky Phone automatically detects nearby world props listed in `Config.Payphones.Props`; GTA V payphones do not need configured coordinates. Pricing, payment account, prop models, and validation distances are configured under `Config.Payphones`.
|
|
|
|
Use `CustomLocations` only when Sky Phone should spawn additional payphone props at custom positions:
|
|
|
|
```lua
|
|
Config.Payphones.CustomProp = "prop_phonebox_01b"
|
|
Config.Payphones.CustomLocations = {
|
|
vector4(123.45, 678.90, 21.0, 90.0),
|
|
}
|
|
```
|
|
|
|
`CustomProp` must also be listed in `Config.Payphones.Props`. Each custom position uses `vector4(x, y, z, heading)`.
|
|
|
|
## Commands
|
|
|
|
`Config.Phone.Keybind` defaults to `F1` and can be rebound in FiveM's key bindings. Set it to `false` to disable the phone hotkey.
|
|
|
|
| Command | Where | Purpose |
|
|
| --- | --- | --- |
|
|
| `/phone` | In game | Opens the development phone command when `Config.Phone.DevelopmentCommand` is enabled |
|
|
| `/phonetestdata` | In game | Creates customer-scoped test data when `Config.TestData.Enabled` is enabled |
|
|
| `/fliptokverify <@handle> [on\|off]` | In game | Toggles or sets FlipTok verification for configured admin groups |
|
|
| `/picstagramverify <@handle> <on\|off>` | In game | Sets Picstagram verification for configured admin groups |
|
|
| `skyphone:migrate lb-phone dry` | Server console | Previews the LB Phone migration |
|
|
| `skyphone:migrate lb-phone` | Server console | Imports enabled LB Phone domains |
|
|
| `skyphone:migrate lb-phone force` | Server console | Re-runs enabled domains idempotently |
|
|
| `skyphone:migrate lb-phone remove` | Server console | Removes imported Sky Phone records and migration markers |
|
|
|
|
Command names and admin groups for the social apps are configurable.
|
|
|
|
Disable test data on production servers:
|
|
|
|
```lua
|
|
Config.TestData.Enabled = false
|
|
```
|
|
|
|
## LB Phone migration
|
|
|
|
Sky Phone detects supported LB Phone database tables during startup and prints a short notice. Detection never starts a migration automatically.
|
|
|
|
Recommended workflow:
|
|
|
|
1. Create a database backup.
|
|
2. Run the preview:
|
|
`skyphone:migrate lb-phone dry`
|
|
3. Review the domain summaries.
|
|
4. Run the import:
|
|
`skyphone:migrate lb-phone`
|
|
5. Restart and verify the migrated accounts and apps.
|
|
|
|
The importer:
|
|
|
|
- Reads LB Phone source tables without modifying them
|
|
- Supports preserved `_lb` tables created by sd-phone migrations
|
|
- Records per-domain completion markers
|
|
- Can be retried safely with `force`
|
|
- Can remove migration-created Sky Phone data with `remove`
|
|
- Reports unsupported source records instead of forcing them into incompatible Sky Phone structures
|
|
|
|
Supported domains include devices, settings, alarms, contacts, blocked numbers, calls, messages, photos, notes, wallet, voice memos, Picstagram, Mail, map markers, compatible DarkChat data, FlipTok, and Feather.
|
|
|
|
The migration command is server-console only.
|
|
|
|
## Garage, Housing, and Companies
|
|
|
|
### Garage
|
|
|
|
Select the provider under `Config.Garage.System`. Vehicle images use the configured CDN template with an icon fallback when no image is available.
|
|
|
|
### Housing
|
|
|
|
Select the provider under `Config.Housing.System`. Automatic mode supports the configured provider priority.
|
|
|
|
### Companies
|
|
|
|
Company jobs, public profiles, service numbers, services, permissions, locations, and default availability are configured under `Config.Companies.Definitions`.
|
|
|
|
### Weazel News
|
|
|
|
Configure editorial jobs and minimum grades:
|
|
|
|
```lua
|
|
Config.WeazelNews.AllowedJobs = {
|
|
weazel = 0,
|
|
reporter = 2,
|
|
}
|
|
```
|
|
|
|
Unlisted jobs can read news but cannot manage articles.
|
|
|
|
## External custom apps
|
|
|
|
Sky Phone includes compatibility adapters for supported custom-app contracts from:
|
|
|
|
- LB Phone
|
|
- 17Movement
|
|
- High Phone
|
|
- Quasar Smartphone
|
|
- YSeries
|
|
|
|
The resource provides the compatibility aliases `lb-phone`, `17mov_Phone`, `high-phone`, `qs-smartphone`, and `yseries`.
|
|
|
|
See [Custom App Integration](docs/custom-apps.md) for setup details and compatibility limits.
|
|
The complete per-app list of public exports, observer events, internal related contracts, and the
|
|
Custom App iframe protocol is available in [Exports and Events](docs/exports-events.md).
|
|
|
|
## Updating Sky Phone
|
|
|
|
Before updating:
|
|
|
|
1. Back up the database.
|
|
2. Back up `config/config.lua`, `config/media.lua`, and any custom media.
|
|
3. Keep the three pepper values unchanged.
|
|
4. Replace the resource files.
|
|
5. Reapply customer-specific configuration carefully.
|
|
6. Restart Sky Phone and review warnings and errors.
|
|
|
|
Do not overwrite a production configuration without comparing it to the new version.
|
|
|
|
## Frontend development
|
|
|
|
Customers installing a release do not need to build the frontend.
|
|
|
|
For development:
|
|
|
|
```powershell
|
|
cd frontend
|
|
pnpm install
|
|
pnpm dev
|
|
```
|
|
|
|
Create a production frontend build with:
|
|
|
|
```powershell
|
|
pnpm build
|
|
```
|
|
|
|
The production output is written to `sky_phone/source/html`.
|
|
|
|
Useful checks:
|
|
|
|
```powershell
|
|
pnpm typecheck
|
|
pnpm test
|
|
pnpm lint
|
|
pnpm build
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### The phone item does nothing
|
|
|
|
- Confirm the framework and inventory are supported and started first.
|
|
- Confirm the item name matches `Config.Phone.Item`.
|
|
- Confirm the item is usable.
|
|
- In unique mode, confirm the phone is non-stackable.
|
|
- Check the server console for inventory adapter warnings.
|
|
|
|
### Calls connect without audio
|
|
|
|
- Confirm the configured voice resource is running.
|
|
- Confirm `Config.Calls.VoiceProvider` matches the installed provider.
|
|
- Start the voice resource before Sky Phone.
|
|
|
|
### Camera or Voice Memos cannot upload
|
|
|
|
- Configure a valid FiveManage V3 Media API token.
|
|
- Confirm the token has the required file permissions.
|
|
- Restart Sky Phone after changing the token.
|
|
|
|
### Social app password or passcode warnings appear
|
|
|
|
- Check the values in `Config.Server`.
|
|
- Use long, stable values.
|
|
- Do not change them after accounts or passcodes have been created.
|
|
|
|
### The LB Phone notice appears
|
|
|
|
This is only a detection notice. No data is imported automatically. Run the `dry` command from the server console when you are ready.
|
|
|
|
### More diagnostic output is needed
|
|
|
|
Enable:
|
|
|
|
```lua
|
|
Config.Bridge.Debug = true
|
|
```
|
|
|
|
Reproduce the problem, collect the relevant server and client console lines, and disable debug mode again afterward.
|
|
|
|
## Credits and notices
|
|
|
|
Third-party acknowledgements and license information are available in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
|