# Squad Whitelist Management ## Discord Bot ### Commands - **/link** - Example: `/link 7312312312395` - Links user's discord ID with their provided steam64 - If linked to another discord id, reject - Use the user's discord username for their username in the API - **/group-link** - Example: `/group-link @Odin {group-uuid}` - Links a Group on the API with a given discord ID for the role - If the Discord ID already exists, inform about it but allow - **/list-groups** - Example: `/list-groups` - Outputs: - Groups with Associated Discord Role - Example: `@Odin | https://my-api.com/org/asgard/group-uuid` ### Events - `on-member-update` - For each member, look at the change in discord roles - If they had a role added to them that's a linked group, add them to the Group - If they don't have a linked Steam64, ping them in a channel to do so - `on-startup` - Hit up API for all members of linked roles - Check if the members are in those roles and modify as needed ## API ### Functionality #### Generate Remote Admin List - Capability to export as remote admin list - Can be applied to an entire Org - Example: `https://api-url.com/org/asgard?reserved` - Example: https://api-url.com/group/group-uuid?startvote&changemap&pause - Query params - startvote - changemap - pause - cheat - private - balance - chat - kick - ban - config - cameraman - immune - manageserver - featuretest - reserve - demos - clientdemos - debug - teamchange - forceteamchange - canseeadminchat - Example: - Query: `https://api-url.com/org/{org-name}/{group-uuid}` - Output: `Group={group-uuid}:{query-params} // {group-name}` ## Data ### Users - Table Name: `USERS` | Key | Type | Constraints | Description | | - | - | - | - | | id | Primary Key | | Steam64 | | username | String | | | | password | String? | | Salted Hash, don't allow login if null. Owning tenant can set Password. | | discord_id | Int? | | | | superuser | bool | | | ### Organizations - Table Name: `ORGS` | Key | Type | Constraints | Description | | - | - | - | - | | id | UUID4 | | | | name | String | Unique | | | owner_id | `USERS.ID` | | | | discord_server_id | Int? | | | ### Organization Members - Table Name: `ORG_MEMBERS` | Key | Type | Constraints | Description | | - | - | - | - | | org_id | `ORGS.ID` | | | | user_id | `USERS.ID` | | | | discord_server_id | Int? | | | Primary key is composite key of `org_id` + `user_id` ### Groups - Table Name: `GROUPS` | Key | Type | Constraints | Description | | - | - | - | - | | id | UUID4 | Primary Key | | | name | String | | Group Name | | remote_import_url | String? | | The remote url to a remote admin list hosted elsewhere | | owner_id | `USERS.ID` | | | | max_members | Int? | | Max number of members allowed as part of this group. If null, unlimited members | | org_id | `ORGS.ID` | | | | discord_role_id | Int? | | | ### Group Members - Table Name: `GROUP_MEMBERS` | Key | Type | Constraints | Description | | - | - | - | - | | user | `ORG_MEMBERS.user_id` | | | | org_id | `ORGS.ID` | | | | group | `GROUPS.ID` | | | | nick_name | String | | | | member | bool | | | | owner | bool | | | | perm_manage_mods | bool | | | | perm_manage_perms | bool | | | | perm_manage_users | bool | | | | perm_manage_tags | bool | | | | perm_manage_import | bool | | Allow user to specify a remote admin list to use for the Group | ### Group Squad Perms - Table Name: `GROUP_SQUAD_PERMS` | Key | Type | Constraints | Description | | - | - | - | - | | group_id | `GROUP.ID` | Primary Key | | | perm_changemap | bool | | Allowed to change the current map | | perm_pause | bool | | Allowed to pause server gameplay | | perm_cheat | bool | | Allowed to use server cheat commands | | perm_private | bool | | Allowed to password protect the server | | perm_balance | bool | | Allowed to ignore team balance | | perm_chat | bool | | Allowed to access admin chat and make server broadcasts | | perm_kick | bool | | Allowed to kick players | | perm_ban | bool | | Allowed to ban players | | perm_config | bool | | Allowed to change server config | | perm_cameraman | bool | | Allowed to admin spectate mode | | perm_immune | bool | | Allowed to cannot be kicked / banned | | perm_manageserver | bool | | Allowed to shutdown server | | perm_featuretest | bool | | Allowed to any features added for testing by dev team | | perm_reserve | bool | | Allowed to reserve slot | | perm_demos | bool | | Allowed to record Demos on the server side via admin commands | | perm_clientdemos | bool | | Allowed to record Demos on the client side via commands or the replay UI | | perm_debug | bool | | Allowed to Show admin stats command and other debugging info | | perm_teamchange | bool | | Allowed to no timer limits on team change | | perm_forceteamchange | bool | | Allowed to can issue the ForceTeamChange command | | perm_canseeadminchat | bool | | Allowed to this group can see the admin chat and teamkill/admin-join notifications | ### TAGS - Table Name: `TAGS` | Key | Type | Constraints | Description | | - | - | - | - | | name | String | Must be unique when combined with `org_id` | | | org_id | `ORG.ID` | Must be unique when combined with `name` | | - Both `Org` & `Name` together must be unique, the combo of them is unique ### Group Tags - Table Name: `GROUP_TAGS` | Key | Type | Constraints | Description | | - | - | - | - | | id | UUID4 | Primary Key | | | group_id | `GROUP.ID` | Must be unique when combined with `tag` | | | tag_id | `TAGS.ID` | Must be unique when combined with `group` | | - Together both `GROUP` & `TAG` create primary key - `SELECT * FROM GROUP_TAGS WHERE GROUP = "GROUP.ID" AND TAG = "TAG.ID"` - Org - Single Owner - Groups - Group: whitelist-{group-id} - Tags: vanilla - Single Owner - Perms - Group - Manage Users (Add or Remove Users) - Manage Moderators (Allow other users to manage the group) - Manage Remote Import (Allowed to set a remote import) - Manage Tags (Allowed to manage tags) - Squad - Reserve - Demos - Kick - Ban - Etc. `https://api-url.com/export/squad-admin-list/org/asgard/groups/group-uuid` `https://api-url.com/export/squad-admin-list/org/asgard` `https://api-url.com/export/squad-admin-list/org/asgard?tag=tactical` `https://api-url.com/export/squad-admin-list/org/asgard?tag=tactical&tag=vanilla`