Server Modules

# Phone Usage Guide

The phone module stores contacts, messages, and emails for each UID. It is a server-extension state module backed by SurrealDB.

# Phone Usage Guide

The phone module stores contacts, messages, and emails for each UID. It is a server-extension state module backed by SurrealDB.

## Storage Model

    {
      "contacts": ["76561198000000000", "field_commander"],
      "messages": [
        {
          "id": "phone-message:sender:receiver:1",
          "from": "sender",
          "to": "receiver",
          "message": "Text body",
          "timestamp": 123.45,
          "read": false
        }
      ],
      "emails": [
        {
          "id": "phone-email:sender:receiver:2",
          "from": "sender",
          "to": "receiver",
          "subject": "Subject",
          "body": "Email body",
          "timestamp": 123.45,
          "read": false
        }
      ]
    }

Rules validated by the Rust service:

- UID arguments cannot be empty.
- Message and email bodies cannot be empty.
- Empty email subjects become `No subject`.
- Player messages and emails cannot target `field_commander`.
- `field_commander` can send messages or emails to players.
- Deleting a message or email removes it only from the requesting UID's index.

## Commands

Command | Arguments | Returns
--- | --- | ---
`phone:init` | `uid` | Full phone payload.
`phone:contacts:list` | `uid` | Contact UID array.
`phone:contacts:add` | `uid`, `contact_uid` | `true` or `false`.
`phone:contacts:remove` | `uid`, `contact_uid` | `true` or `false`.
`phone:messages:list` | `uid` | Message array.
`phone:messages:thread` | `uid`, `other_uid` | Message array for both participants.
`phone:messages:send` | `from_uid`, `to_uid`, `message`, `timestamp` | Message JSON.
`phone:messages:mark_read` | `uid`, `message_id` | `true` or `false`.
`phone:messages:delete` | `uid`, `message_id` | `true` or `false`.
`phone:emails:list` | `uid` | Email array.
`phone:emails:send` | `from_uid`, `to_uid`, `subject`, `body`, `timestamp` | Email JSON.
`phone:emails:mark_read` | `uid`, `email_id` | `true` or `false`.
`phone:emails:delete` | `uid`, `email_id` | `true` or `false`.
`phone:remove` | `uid` | `OK`.

## Initialize Phone State

`phone:init` creates phone state if needed and seeds self-contact plus `field_commander`.

    private _result = "forge_server" callExtension ["phone:init", [getPlayerUID player]];
    private _payload = _result select 0;

    if (_payload find "Error:" == 0) exitWith {
        systemChat format ["Phone init failed: %1", _payload];
    };

    private _phone = fromJSON _payload;

## Send a Message

    private _timestamp = str diag_tickTime;

    private _result = "forge_server" callExtension ["phone:messages:send", [
        getPlayerUID player,
        _targetUid,
        "Move to checkpoint Alpha.",
        _timestamp
    ]];

## Read a Conversation

    private _result = "forge_server" callExtension ["phone:messages:thread", [
        getPlayerUID player,
        _otherUid
    ]];

    private _messages = fromJSON (_result select 0);

## Send an Email

    private _result = "forge_server" callExtension ["phone:emails:send", [
        getPlayerUID player,
        _targetUid,
        "Supply Request",
        "Requesting resupply at grid 123456.",
        str diag_tickTime
    ]];

## Mark and Delete Records

    "forge_server" callExtension ["phone:messages:mark_read", [
        getPlayerUID player,
        _messageId
    ]];

    "forge_server" callExtension ["phone:emails:delete", [
        getPlayerUID player,
        _emailId
    ]];

## Error Handling

    private _payload = (_result select 0);
    if (_payload find "Error:" == 0) then {
        systemChat format ["Phone error: %1", _payload];
    };

Edit this page or Report an issue

Owned Storage Usage Guide

Owned storage covers the owned:locker and owned:garage extension command groups. These modules store unlock lists rather than physical item or vehicle instances.

Client Usage Guide

Forge Client contains the Arma client-side addons that open player interfaces, handle browser events, cache client-visible state, and forward authoritative requests to the server addons.