Frontend Client Events

Message deleted

When an admin/mod/etc. deletes a message from a room, everyone on that room will receive an event with the name gn_message_deleted so they can remove it locally as well.

{
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>",
    "object": {
        "id": "<UUID of the message that was deleted>"
    },
    "target": {
        "id": "<UUID of the room the message was deleted in>"
    },
    "verb": "delete",
    "actor": {
        "id": "<ID of the user who deleted the message>",
        "displayName": "<name of the user, base64>"
    }
}

Message received

When user A receives a private message, or a message from a room that user A is in, the event message will be sent to user A with the following content:

{
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>",
    "actor": {
        "id": "<UUID of the sender>",
        "displayName": "<name of the sender>"
    },
    "verb": "send",
    "target": {
        "id": "<UUID of the room, or this user's UUID if private msg>",
        "displayName": "<name of the room, or target user name if private msg>",
        "objectType": "<room/private>"
    },
    "object": {
        "content": "<the message body>",
        "displayName": "<the name of the channel, or empty if private msg>",
        "url": "<UUID of the channel for this room, or empty if private msg>"
    }
}

Message has been read

If user A sends a message to user B and user B invokes the read api to indicate the message has been read, user A will receive a gn_message_read event with the following content:

{
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>",
    "actor": {
        "id": "<user id of the one sending the read receipt>"
    },
    "verb": "read",
    "target": {
        "id": "<uuid of the room the messages are all in>" 
    },   
    "object": {
        "attachments": [
            {"id": "<message1 uuid>"},
            {"id": "<message2 uuid>"},
            {"id": "<message3 uuid>"}
        ]    
    }    
}

Message has been delivered

If user A sends a message to user B and user B invokes the received api to indicate the message has been received, user A will receive a gn_message_received event with the following content:

{   
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>",
    "actor": {
        "id": "<user id of the one sending the read receipt>"
    },
    "verb": "received",
    "target": {
        "id": "<uuid of the room the messages are all in>" 
    },   
    "object": {
        "attachments": [
            {"id": "<message1 uuid>"},
            {"id": "<message2 uuid>"},
            {"id": "<message3 uuid>"}
        ]    
    }    
}   

User info updated

When a user updates his/her user information (e.g. avatar, is streaming, age etc.), the event gn_user_info_updated will be sent to either all rooms that the user is in, or a specific room that user chose to send to. The event looks like this:

{
    "actor": {
        "id": "997110",
        "displayName": "YmF0bWFu"
    },
    "object": {
        "attachments": [{
            "content": "MA==",
            "objectType": "streaming"
        },{
            "content": "MzU=",
            "objectType": "age"
        }],
        "objectType": "userInfo"
    },
    "verb": "update",
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>"
}

The content on each attachment is always base64 encoded. The objectType tells which field has been updated. Possible values depends on implementation, but is usually same as what's returned for user info when joining a room (gn_join).

Admin presence requested

When someone requests the presence of an admin in a room all users in the Admin room for that channel will receive an event called gn_admin_requested containing the following:

{
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>",
    "actor": {
        "id": "<UUID of user requesting>",
        "displayName": "<name of the user requesting>",,
        "attachments": [
            {
                "content": "NDA=",
                "objectType": "age"
            },
            {
                "content": "aHR0cDovL3NvbWUtdXJsLnRsZC9mb28uanBn",
                "objectType": "avatar"
            }
        ]
    },
    "verb": "help",
    "object": {
        "content": "<base64 encoded message>"
    },
    "generator": {
        "id": "<UUID of the room the help was requested for>",
        "displayName": "<name of the room>"
    },
    "target": {
        "id": "<UUID of the admin room>",
        "displayName": "<base64 of the admin room name>"
    }
}

A room was removed

When a room is removed by an admin/owner an event called gn_room_removed will be sent to everyone on the server (to keep the room list in sync on client side):

{
    "actor": {
        "id": "<user ID who removed the room>",
        "displayName": "<name of the user who removed the room, in base64>"
    },
    "target": {
        "id": "<room uuid>",
        "displayName": "<room name in base64>",
        "objectType": "room"
    },
    "object": {
        "content": "<an optional reason, in base64>"
    },
    "id": "c42ebf01-3d50-4f27-a345-4ed213be045d",
    "published": "2016-10-07T10:45:34Z",
    "verb": "removed"
}

A room was renamed

When a room is renamed by an admin/owner an event called gn_room_renamed will be sent to everyone on the server (to keep the room list in sync on client side):

{
    "actor": {
        "id": "<user ID who renamed the room>",
        "displayName": "<name of the user who renamed the room, in base64>"
    },
    "target": {
        "id": "<room uuid>",
        "displayName": "<NEW room name in base64>",
        "objectType": "room"
    },
    "id": "c42ebf01-3d50-4f27-a345-4ed213be045d",
    "published": "2016-10-07T10:45:34Z",
    "verb": "renamed"
}

Invitation received

When user B invites user A to join room X, the event gn_invitation will be sent to user A with the following content:

{
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>",
    "actor": {
        "id": "<UUID of user B>",
        "displayName": "<name of user B>",,
        "attachments": [
            {
                "content": "NDA=",
                "objectType": "age"
            },
            {
                "content": "aHR0cDovL3NvbWUtdXJsLnRsZC9mb28uanBn",
                "objectType": "avatar"
            }
        ]
    },
    "verb": "invite",
    "object": {
        "url": "<UUID of the channel for room X>",
        "displayName": "<name of the channel for room X>"
    },
    "target": {
        "id": "<UUID of the room>",
        "displayName": "<name of the room>"
    }
}

Another user joins the room

If user A is in room X, and another user B joins room X, the server will send an event called gn_user_joined to user A with the following content:

{
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>",
    "actor": {
        "id": "<user B's UUID>",
        "displayName": "<name of user B>",
        "content": "globalmod,moderator"
        "image": {
            "url": "<user B's image url>"
        },
        "attachments": [
            {
                "content": "NDA=",
                "objectType": "age"
            },
            {
                "content": "aHR0cDovL3NvbWUtdXJsLnRsZC9mb28uanBn",
                "objectType": "avatar"
            }
        ]
    },
    "target": {
        "id": "<uuid of the room>",
        "displayName": "<name of the room>"
    },
    "verb": "join"
}

The actor.content describes the roles this user has in this room, plus any global roles. Examples:

  • globalmod,moderator
  • moderator
  • superuser

If no specific roles, the value will be blank.

Another user leaves room

When user A is in room X, and another user B leaves room X, the sever will send an event called gn_user_left to user A with the following content:

{
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>",
    "actor": {
        "id": "<user B's UUID>",
        "displayName": "<name of user B>",
    },
    "target": {
        "id": "<uuid of the room>",
        "displayName": "<name of the room>"
    },
    "verb": "leave"
}

Another user connects

When a user connects (or stops being invisible), the gn_user_connected event will be sent.

{
    "actor": {
        "id": "<user B's UUID>",
        "displayName": "<name of user B>",
        "attachments": [
            {
                "content": "NDA=",
                "objectType": "age"
            },
            {
                "content": "aHR0cDovL3NvbWUtdXJsLnRsZC9mb28uanBn",
                "objectType": "avatar"
            }
        ]
    },
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>",
    "verb": "connect"
}

Another user disconnects

If user A is in any room that user B is in, and user B disconnects from the chat server, an event called gn_user_disconnected will be sent to user A with the following content:

{
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>",
    "actor": {
        "id": "<user B's UUID>",
        "displayName": "<name of user B>",
    },
    "verb": "disconnect"
}

You were banned

If you are banned, either in a room, a channel or globally, you will receive the following event named gn_banned:

{
    "actor": {
        "id": "<ID of the one who banned you>",
        "displayName": "<username of the one who banned you, in base64>"
    },
    "object": {
        "id": "<your user ID>",
        "displayName": "<your username in base64>",
        "summary": "30s",
        "updated": "2017-02-15T09:11:52Z",
        "content": "<the reason for the ban>"
    },
    "target": {
        "id": "<room/channel uuid>",
        "displayName": "<room/channel name, in base64>",
        "objectType": "<room/channel/global>"
    },
    "verb": "ban",
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>"
}
  • target.id and target.displayName will not be present if target.objectType is "global",
  • object.summary is the duration of the ban, e.g. 30s, 2h, 7d etc.,
  • object.updated is the timestamp when the ban will expire, in UTC,
  • object.content is the reason for the ban, but if no reason is given by the banned, this field will not be present.

A new room is created

When a new room is created in a channel that user A is in, an event called gn_room_created will be sent to user A with the following content:

{
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>",
    "actor": {
        "id": "<UUID of user who created the room>",
        "displayName": "<name of the user who created the room>",,
        "attachments": [
            {
                "content": "NDA=",
                "objectType": "age"
            },
            {
                "content": "aHR0cDovL3NvbWUtdXJsLnRsZC9mb28uanBn",
                "objectType": "avatar"
            }
        ]
    },
    "object": {
        "url": "<UUID of the channel for this room>"
    },
    "target": {
        "id": "<UUID of the new room>",
        "displayName": "<name of the new room>",
        "objectType": "temporary"
    },
    "verb": "create"
}

The target.objectType will always be temporary since all rooms created using the API are user created rooms, meaning they will be automatically removed when the owner leaves.

A user is kicked from a room

When a user is kicked from a room, an event will be sent to all users in that room (except the kicked user), called gn_user_kicked, with the following content:

{
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>",
    "actor": {
        "id": "<UUID of the kicker>",
        "displayName": "<name of the kicker>",
        "attachments": [
            {
                "content": "NDA=",
                "objectType": "age"
            },
            {
                "content": "aHR0cDovL3NvbWUtdXJsLnRsZC9mb28uanBn",
                "objectType": "avatar"
            }
        ]
    },
    "object": {
        "id": "<UUID of the kicked user>",
        "displayName": "<name of the kicked user>",
        "content": "<optional reason field>",
        "attachments": [
            {
                "content": "NDA=",
                "objectType": "age"
            },
            {
                "content": "aHR0cDovL3NvbWUtdXJsLnRsZC9mb28uanBn",
                "objectType": "avatar"
            }
        ]
    },
    "target": {
        "id": "<UUID of the room the user was kicked from>",
        "displayName": "<name of the room the user was kicked from>"
    },
    "verb": "kick"
}

Broadcast received

When a message is broadcasted to every user on the server, a gn_broadcast event is received:

{
    "actor": {
        "displayName": "<admin in base64>",
        "id": "0" 
    },  
    "content": "<base64>",
    "verb": "broadcast",
    "id": "<server-generated UUID>",
    "published": "<server-generated timestamp, RFC3339 format>",
    "provider": {
        "id": "popp"
    }
}

A user is banned

TODO: currently the user will be banned, but the "kicked" event will be broadcasted to relevant users. There's currently no "banned" event for this.

User was muted

If a user is muted (using the REST API), the gn_mute event will be sent to the user. The object.summary field is the remaining seconds.

Example event:

["gn_mute", {
    "actor": {
        "id": "0",
        "objectType": "user"
    },
    "verb": "mute",
    "object": {
        "id": "5000439",
        "summary": "1m",
        "updated": "2023-08-17T07:05:33Z",
        "objectType": "user",
        "content": ""
    },
    "target": {
        "id": "2e7d537e-bed5-47c5-a7f6-357075759e5d",
        "objectType": "room",
        "displayName": ""
    },
    "published": "2023-08-17T07:04:33Z",
    "id": "039bc358-1034-4f1d-b716-7d014fa4bad5"
}]

User was un-muted

If a mute is removed for a user (using the REST API), the gn_ummute event will be sent to the user.

Example event:

["gn_unmute", {
    "actor": {
        "id": "0",
        "objectType": "user"
    },
    "verb": "unmute",
    "object": {
        "id": "5000439",
        "objectType": "user"
    },
    "target": {
        "objectType": "room",
        "id": "2e7d537e-bed5-47c5-a7f6-357075759e5d",
        "displayName": ""
    },
    "id": "c89dd0b0-3da0-4b24-9841-05adad714339",
    "published": "2023-08-17T07:06:20Z"
}]