giseldo/neodataset huggingface dataset:
[Improvement] Better Display Name Generation

<!-- Title suggestion: [Improvement] Name of improvement -->
<!-- Improvement Projects are interanal initiates meant to improve code quality, tests, infrastructure or process -->

# Description

In the `MythicTable\Profile\Controller\ProfileController.cs` we're doign this:

```
var displayName = userId.Split("@")[0];
```

We should have a better way of creating the user's default displayname

## The Problem

What if the `userId` isn't an email?

## Solution

- [ ] We'll need tests
- [ ] TBD

## Steps

- [ ] TBD



<!-- A note on weights
0 is trivial. Does not involve and code
1 is a button, documentation corrections, a quick fix
2 is a simple well known task
3 is for a somewhat simple task
5 is for a complicated story that requies a number of moving parts
8 is for a signifcant amount of work but should with perhaps some unkowns or external dependencies
Anything higher than 8 should be broken up into smaller more distinct stories.
-->

Story points: 2.0
[Improvement] Animated Gif to illustrate Gitlab Board Usage

<!-- Title suggestion: [Improvement] Name of improvement -->
<!-- Improvement Projects are interanal initiates meant to improve code quality, tests, infrastructure or process -->

# Description

Currently we have a static image of a Gitlab board here: https://gitlab.com/mythicteam/mythictable/-/wikis/workflow-guidelines

An animated gif would do a better job of showing the work flow.

## Solution

Create an animated gif that shows developers how to move tickets from one section to the next and back.

## Steps

- [x] Show how to find the boards
- [x] Show how to chose a ticket to work on
- [x] Show how to move a ticket from column to column
- [x] Show how to change boards
- [x] Show how to open a ticket


<!-- A note on weights
0 is trivial. Does not involve and code
1 is a button, documentation corrections, a quick fix
2 is a simple well known task
3 is for a somewhat simple task
5 is for a complicated story that requies a number of moving parts
8 is for a signifcant amount of work but should with perhaps some unkowns or external dependencies
Anything higher than 8 should be broken up into smaller more distinct stories.
-->

Story points: 2.0
[Improvement] Updating Story.md Acceptance Criteria

<!-- Title suggestion: [Improvement] Name of improvement -->

# ~~Technology~~ Workflow Improvement Project - 

## Description

Updating Story.md to reflect latest Acceptance Criteria information

### Background/Current State

The AC wiki is update and it just needs to be reflected in the latest Story.md. 

### The Problem

Inconsistency stinks and reflects poorly on our collaboration effort.

### Solution

Update the Story.md!

### Additional Information

## Steps

- [x] Coordinate Story.md with latest Acceptance Criteria Information



<!-- A note on weights
0 is trivial. Does not involve and code
1 is a button, documentation corrections, a quick fix
2 is a simple well known task
3 is for a somewhat simple task
5 is for a complicated story that requies a number of moving parts
8 is for a signifcant amount of work but should with perhaps some unkowns or external dependencies
Anything higher than 8 should be broken up into smaller more distinct stories.
-->

Story points: 1.0
[Improvement] API Sanitizing

<!-- Title suggestion: [Improvement] Name of improvement -->

# Technology Improvement Project - API Sanitizing

## Description

Clean up our APIs to prevent XSS

### Background/Current State

We are transferring a lot of unchecked data. Particularly in collections, character and campaign.  This should be cleaned up.

### The Problem

XSS allows attacks to execute code on a remote machine

### Solution

https://docs.microsoft.com/en-us/aspnet/core/security/cross-site-scripting?view=aspnetcore-3.1

## Steps

- [ ] TBD


<!-- A note on weights
0 is trivial. Does not involve and code
1 is a button, documentation corrections, a quick fix
2 is a simple well known task
3 is for a somewhat simple task
5 is for a complicated story that requies a number of moving parts
8 is for a signifcant amount of work but should with perhaps some unkowns or external dependencies
Anything higher than 8 should be broken up into smaller more distinct stories.
-->

Story points: 5.0
[Improvement] Add a volume to the MongoDB Setup in the Readme.md

<!-- Title suggestion: [Improvement] Name of improvement -->

# Documentation Improvement Project - Add a volume to the MongoDB Setup in the Readme.md

## Description

The command for running MongoDB locally should include a volume for persistence of the stored data.

### Background/Current State

Currently using the provided command no data will be stored on the host system's disk. This prevents the data from being persistent.

### The Problem

Every time the MongoDB Container is killed all stored data will be lost

### Solution

Add a volume to the provided command


<!-- A note on weights
0 is trivial. Does not involve and code
1 is a button, documentation corrections, a quick fix
2 is a simple well known task
3 is for a somewhat simple task
5 is for a complicated story that requies a number of moving parts
8 is for a signifcant amount of work but should with perhaps some unkowns or external dependencies
Anything higher than 8 should be broken up into smaller more distinct stories.
-->

Story points: 1.0
[Improvement] Implement a SignalR Backplane

<!-- Title suggestion: [Improvement] Name of improvement -->

# Technology Improvement Project - SignalR Backplane

## Description

In order to support scaling the Mythic Table API service, we need to implement a SignalR Backplane.

https://docs.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-3.1

### Background/Current State

Currently we're limiting the Mythic Table Server to a single instance. This will not scale when we finally release the First Playable.

### The Problem

SignalR is a Websocket technology. As such it is stateful and has no awareness of client connections on different instances. The SignalR backplane is a communication layer that solves this problem.

### Solution

SignalR Backplane https://docs.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-3.1

## Steps

- [x] Create a Configuration for Mythic Table to use a Backplane
- [x] Build a Redis Backplane in GCP
- [x] Configure our environments to commission a the Redis Backplane
- [x] Configure our deployment to utilize the Backplane
- [x] Configure our deployment to use multiple instances
- [x] Confirm functional systems with multiple users

## Testing Plan

In order to test this we must be VERY sure that there is no (extremely low) possibility that tests have all ended up on the same server instance. So, repeated testing is highly recommended.

- [x] Users can all load into campaigns
- [x] Users can change maps, move tokens, send chat messages and draw
- [x] All of the above events can be seen by at least two other connected clients.

It might be a good idea to compare the INGRESSCOOKIE values between clients. These should have different values

![image](/uploads/853e0893bf7d24bc8049db8b199d370f/image.png)

![image](/uploads/47e2747f7c7ccc42b3d3d72b4306dc6b/image.png)

![image](/uploads/a79ae4c378e2246da35b22978d8cddf3/image.png)


<!-- A note on weights
0 is trivial. Does not involve and code
1 is a button, documentation corrections, a quick fix
2 is a simple well known task
3 is for a somewhat simple task
5 is for a complicated story that requies a number of moving parts
8 is for a signifcant amount of work but should with perhaps some unkowns or external dependencies
Anything higher than 8 should be broken up into smaller more distinct stories.
-->

Story points: 5.0
[Improvement] Characters to use Collections

# Technology Improvement Project - 

## Description

The Collections have been set up to be the data source for all game data. Character specific data is a duplication of this for the most part.  This should be moved over to the Collections system.

### Background/Current State

We started with a very naive approach to characters. We then introduced the ability to update them with Json Patches.
After that we designed the Collection system to be a generic system for this kind of data. This Collection system was
used for scenes and players and has been working very well.

### The Problem

- Duplication
- Out of date functionality

### Solution

Move Characters over to Collections

### Additional Information

There should be a lot of clean up when this is done as well. There is a lot of bloated and complex code around how
character changes are notified to other clients. 

## Steps

- [ ] Implement a character collection
- [ ] Create a proxy store module like the Player Store
- [ ] Remove the old character classes
- [ ] Grab the `patch` function for GameStore and use that as a generic patch utility for Collections
- [ ] Clean up all the unused code in `LivePlayDirector` and `GameStore`

<!-- A note on weights
0 is trivial. Does not involve and code
1 is a button, documentation corrections, a quick fix
2 is a simple well known task
3 is for a somewhat simple task
5 is for a complicated story that requies a number of moving parts
8 is for a signifcant amount of work but should with perhaps some unkowns or external dependencies
Anything higher than 8 should be broken up into smaller more distinct stories.
-->

Story points: 8.0
[Story] Keycloak Authentication

## User Story

As a user, I can log into the Mythic Table service.

## Details

Currently, Mythic Table uses the Mythic Auth service. We would like to move away from this instead of supporting it.  This story represents work needed to switch over to Keycloak.

## Steps

- [x] Keycloak investigations @kdvalin 
- [x] Keycloak Local Env
- [x] Database configuration https://www.keycloak.org/docs/latest/server_installation/index.html#_database
- [x] Custom Mythic Table Theme https://www.keycloak.org/docs/latest/server_development/index.html#creating-a-theme
- [x] Add account management to the Mythic Table site https://keycloak.mythictable.com/auth/realms/MythicTable/account
- [x] Keycloak for Edge
- [x] Custom Registration field for joining the newsletter https://keycloakthemes.com/blog/how-to-add-custom-field-keycloak-registration-page
- [ ] [Optional] Set up email service for Keycloak

## TODOs

- [x] Don't let them change their username if we stick with email as username or find an user ID
- [x] Newsletter checkbox does not work on auth/realms/MythicTable/account
- [x] Update the Mythic Server reference to User ID
- [ ] The title in the register template

![image](/uploads/0a855b8ed27ad49d468b976fcd5a6457/image.png)

## How to Change password:

First you must go into game because until we reskin the Campaign Manager again, this is the only link that works:

![image](/uploads/72a6aa68c773b23dfdf21957e338a9b7/image.png)

Click that and it will send you here:

![image](/uploads/90a25b14983a0bb1a3dff5edc31efaa3/image.png)

From here you Click on the Password Link on the side and you can change your password

![image](/uploads/78dcd61c5b1efce30dbe2533ec25e5f0/image.png)

## Documentation

Found in these two locations:
- https://gitlab.com/mythicteam/mythictable/-/blob/main/README.md
- https://gitlab.com/mythicteam/apps/mythic-key/-/blob/main/README.md

## Acceptance Criteria

- [x] There is documentation for using Keycloak
- [x] Developers can use Keycloak locally
- [x] First time users are directed to a Mythic Table themed authentication service https://keycloak.mythictable.com/
- [x] Users can register and are automatically logged in.
- [x] Users can sign out and are directed back to Keycloak.
- [x] Users can change their password
- [x] Users can opt-in to the Newsletter on registration
- [x] Users cannot register the same email more than once
- [ ] [Optional] Users can go through the forgotten password option

<!-- A note on weights
0 is trivial. Does not involve and code
1 is a button, documentation corrections, a quick fix
2 is a simple well known task
3 is for a somewhat simple task
5 is for a complicated story that requies a number of moving parts
8 is for a signifcant amount of work but should with perhaps some unkowns or external dependencies
Anything higher than 8 should be broken up into smaller more distinct stories.
-->

Story points: 2.0
[Improvement] Better On boarding templates

# Technology Improvement Project - On boarding Templates

## Description

We have a group of on boarding templates that need to be updated. Their links are out of date and they have inaccurate information.

### Background/Current State

These templates were made awhile ago and the website has changes and new information and procedures have been developed.

### The Problem

New users don't understand how to work with Mythic Table.

### Solution

Update the templates are `.gitlab/issue-templates`

### Additional Information

## Steps

- [ ] Update all Website Links
- [ ] Add links to relevant Wiki articles
    - [ ] How to branch
    - [ ] Workflow



<!-- A note on weights
0 is trivial. Does not involve and code
1 is a button, documentation corrections, a quick fix
2 is a simple well known task
3 is for a somewhat simple task
5 is for a complicated story that requies a number of moving parts
8 is for a signifcant amount of work but should with perhaps some unkowns or external dependencies
Anything higher than 8 should be broken up into smaller more distinct stories.
-->

Story points: 2.0
[Improvement] CORS Policy blocking Auth

<!-- Title suggestion: [Improvement] Name of improvement -->

# Technology Improvement Project - 

## Description

CORS blocking access to the Auth service while running bare-metal (not in Docker) and connecting using IP addresses. 

### Background/Current State

CORS is being blocked by the Auth service

### The Problem
Could lead to users unable to connect to the service

### Solution
Look through the stack to determine what modules communicate with each other, and determine a name to allow for CORS compliancy. 

Additional info here
https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1#cors-with-named-policy-and-middleware


<!-- A note on weights
0 is trivial. Does not involve and code
1 is a button, documentation corrections, a quick fix
2 is a simple well known task
3 is for a somewhat simple task
5 is for a complicated story that requies a number of moving parts
8 is for a signifcant amount of work but should with perhaps some unkowns or external dependencies
Anything higher than 8 should be broken up into smaller more distinct stories.
-->

Story points: 3.0
[Story] Drawing tools

## User Story

As a user, I can use a simple drawing tool to illustrate as I'm talking.

## Details

This feature is based off the slack drawing tools. Users will be assigned a random color, Whenever they draw a line appears and a timer for 5 seconds starts. If they have not drawn for 5 seconds, their drawings all start to fade away.

## Steps
### Frontend
- [x] Add rudimentary drawing within the Konva Canvas
- [x] Listen for "drawLine" WebSocket events and update the canvas accordingly
- [x] Make drawings disappear after a certain amount of inactivity

### Backend
- [x] Add a WebSocket endpoint to communicate the lines to other clients

## Acceptance Criteria
- [x] Users can draw on the canvas
- [x] When a user draws on the canvas, all other users in that game should see the drawing
- [x] After 5 seconds of inactivity, the drawing should disappear


<!-- A note on weights
0 is trivial. Does not involve and code
1 is a button, documentation corrections, a quick fix
2 is a simple well known task
3 is for a somewhat simple task
5 is for a complicated story that requies a number of moving parts
8 is for a signifcant amount of work but should with perhaps some unkowns or external dependencies
Anything higher than 8 should be broken up into smaller more distinct stories.
-->

Story points: 2.0
[Story] Guest User

## User Story

As a new player, I can use a guest user for my first time experience with the game. It will have the default campaign and it will automatically be logged in and authenticated. 

There will be an option to associate this guest user with a real account at any time.

Session state is tracked via a long-lived cookie.

## Details

There will be an option to associate this guest user with a real account at any time.

Session state is tracked via a long-lived cookie. Refreshing the page will not cause the account to be reset.

## Steps

BE
- [ ] Unauthenticated endpoint `guest/startsession` returns a cookie/session/user id for the player, and starts a new default campaign based on a default template (initially empty, but we will design an initial session template)
- [ ] Unauthenticated endpoint `guest/resumesession` allows a guest to reconnect and resume the guest campaign using the saved long-lived session cookie
- [ ] Endpoint `guest/associateaccount` puts the user into the same flow as registering an account, except once completed the back end will tie together backend resources related to the guest account (using the cookie to get the generated id for the guest user) with the new logged in/created user

FE
- [ ] Have a button or UX to start a guest session, that calls the backend start session endpoint
- [ ] If refreshing or somehow the websocket is dropped, use the resume session and saved long lived cookie to resume where the guest session left off
- [ ] UX to start the associate account workflow - brings up a similar flow to login/create user, except will call associate account to ensure the back end ties the guest account's data to the new account.

Design Work

Design work for the initial session (map(s), characters, any other art/resources needed) - This is tracked in #110 

## Acceptance Criteria

- [ ] Able to start a new guest session
- [ ] Refreshing the page doesn't cause a new guest session to be created (if one was already made)
- [ ] Closing the browser and restarting doesn't cause a new guest session to be created (if one was already made)
- [ ] Able to tie guest session details to a newly created user
- [ ] Able to tie guest session details to an existing user whose session you log into

Story points: 8.0
[Story] Default Campaign

## User Story

As a new player, I have access to my own default campaign which can be used as a tutorial

## Details

In order to make the First Playable more approachable, we'll use a default campaign with a map and some characters for the players to have a little fun.

### IMPORTANT

Be sure to change the campaign management page to show only campaigns that you are in

## Steps

#### Backend

- [x] A Default Campaign is created when a user first joins Mythic Table
- [x] Update the backend to only return campaigns that the user is a GM or Player in.

#### Frontend

- [x] Add in a default campaign
   - [x] Create a map to show how the various aspects of MythicTable work

## Acceptance Criteria

- [x] When a user joins Mythic Table they see a default/tutorial campaign
- [x] Users cannot access games they are not a part of.
- [ ] [Optional] The default campaign is front and center when the user does not have any campaigns, and is less emphasized when the user has campaigns.

Story points: 5.0
[Story] Skin In game UI

## User Story

As a player, I find the in-game UI relaxing and easy to use. It must not interfere with the play area and be customizable. I can move pieces around, but the default layout should be good enough to do the basics.

## Details

Currently, the UI is very cluttered and disorganized.  This needs to be improved. We have a design to use docking collapsible windows that we can move around but basically behave like xylophones when docked together.

## Steps
### UX
#### Windows (Modules)
- [x] Sidebar to optionally contain collapsible windows
- [x] Allow the windows to collapse / expand
- [ ] ~~Add docking mechanic ( Allow windows to dock to each other or sidebar)~~
- [ ] ~~Persist last used window position~~
- [x] Default positions

#### Dice Rolling
- [x] Images for all the common dice
- [x] Buttons for all of the common dice
- [ ] ~~Saved (named?) dice "formula" for quick access~~
- [x] Card-based UI for previous rolls

#### Game UI

- [x] Move, attack, defend icons
- [ ] ~~Spell images~~

#### Header (In Progress)
- [x] Back to Campaign List
- [x] Draw
- [x] Username and Signout

#### Scene Library
- [x] Improve asset upload workflow



#### Player Profile
- [x] Player profile editing
- [x] Player profile image upload
- [x] Player Profile image available on campaigns they are in
- [x] Player Profile image scenes/maps
- [x] Player Profile image chat messages
- [x] Player Profile Skinning
- [x] Player Profile MongoDB Implementation


### UI
- [x] Header w/logo
- [x] Implement styling from [Figma prototype](https://www.figma.com/proto/RL16gwbmVarJt2JYa2eyMp/Mythic-Table_AP_TN-v0.5?node-id=572%3A0&viewport=-3915%2C790%2C1&scaling=scale-down)


### Backend

- [x] Player Profile API
- [x] Player Profile created on first join

#### Dice Rolling

- [x] Update Dice Rolling API to support chat
- [x] Clear chat on enter

## Acceptance Criteria

- [x] New slick in-game UI matches the style below
- [x] The user can send chat messages `Hello Mythic Table`
- [x] The user can send dice rolls that are rolled `1d6+5`
- [x] The user can embed dice rolls in chat messages `Hello Mythic [[1d6+5]] Table`
- [x] The user can Change their profile picture
- [x] The user can see their profile pic in the chat logs
- [x] The header menu is collapsible
- [x] The header menu fades after a while of being collapsed
- [x] The user can create characters
- [x] The user add scenes
- [x] The user can drag characters into the map
- [x] The user can edit scenes
- [x] The user can move himself and others from scene to scene
- [x] The user can edit characters
- [x] The user can edit their Display Name
- [x] The user can edit Profile Picture

## Other Tasks
- [x] https://gitlab.com/mythicteam/mythictable/-/merge_requests/192#note_400754215

Story points: 5.0