# Presence text

Write the messages players show on their Discord profile.

## Two presence profiles

Edit `Config.Presence` in `config.lua`. Players use one of two profiles:

| Profile | Shown | Large image |
| --- | --- | --- |
| `Selection` | During the loading screen and the character menu | Your logo |
| `Playing` | Once a character is loaded | The character's photo |

```lua config.lua
Config.Presence = {
    ShowLocation = false,
    RefreshInterval = 15,
    RotationInterval = 10,

    Selection = {
        LargeImageText = '{server_name}',
        Messages = {
            'In character selection',
            '{player_count}/{max_players} players online',
        },
    },

    Playing = {
        LargeImageText = '{char_name}',
        Messages = {
            '{char_name} | {job} - {job_grade}',
            'Near {street}, {zone}',
            '{player_count}/{max_players} players | ID {player_id}',
        },
    },
```

`LargeImageText` is shown when someone hovers over the large image.

## Placeholders

Use these in messages, `LargeImageText`, `SmallImage.Text` and button labels:

| Placeholder | Shows |
| --- | --- |
| `{server_name}` | `Config.ServerName` |
| `{player_count}` | Players currently online |
| `{max_players}` | Your `sv_maxclients` value |
| `{player_id}` | The player's server ID |
| `{char_name}` | Character first and last name |
| `{job}` | Job label |
| `{job_grade}` | Job grade label |
| `{street}` | Current street, only with `ShowLocation = true` |
| `{zone}` | Current area, such as Vinewood or Sandy Shores, only with `ShowLocation = true` |

## Showing where players are

Location is **off by default**, because it tells everyone who sees a player's Discord profile where that character is in the city.

```lua config.lua
Config.Presence = {
    ShowLocation = false,
```

While it is off, street and zone are never sent to Discord, and any message using `{street}` or `{zone}` is skipped, so the default `Near {street}, {zone}` message simply does not appear. Set it to `true` to show location.

## Rotation and refresh

- When a profile has more than one message, they rotate every `RotationInterval` seconds. Set it to `0` to always show the first message.
- The presence refreshes every `RefreshInterval` seconds (15 by default), so job, player count and, when it is on, location stay current. Character loads, job changes and new photos appear immediately.
- Both intervals have a minimum of 5 seconds.
- Text longer than 128 characters is shortened, which is Discord's limit.

## Fallback text

When a value is not available, the matching fallback is shown instead:

```lua config.lua
Fallbacks = {
    char_name = 'Unknown',
    job = 'Unemployed',
    job_grade = 'None',
    street = 'Unknown street',
    zone = 'San Andreas',
},
```

## Rename jobs

Use `JobLabels` to show a different name for a job, using the job's internal name as the key:

```lua config.lua
JobLabels = {
    unemployed = 'Civilian',
    police = 'LSPD',
},
```

## Server name

`Config.ServerName` fills `{server_name}` and is used as the title of player notifications. The name next to "Playing" on Discord comes from your [Discord application](#/docs/wd_richpresence/discord-app) name instead.

## Temporary messages

Other resources can show a temporary message, such as during a heist or a race, with the `SetPresenceOverride` export. See [Exports & integrations](#/docs/wd_richpresence/exports).
