diff --git a/.dockerignore b/.dockerignore
index fe1152b..0685ef6 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -16,6 +16,7 @@
**/charts
**/docker-compose*
**/Dockerfile*
+**/*.Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
@@ -27,4 +28,7 @@ README.md
!.git/HEAD
!.git/config
!.git/packed-refs
-!.git/refs/heads/**
\ No newline at end of file
+!.git/refs/heads/**
+**/*.local
+**/*.swp
+.secrets
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 24785a3..f70ffbc 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -25,10 +25,10 @@ jobs:
packages: write
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Setup .NET Core
- uses: actions/setup-dotnet@v3
+ uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
@@ -56,7 +56,7 @@ jobs:
uses: docker/build-push-action@v5.1.0
with:
context: .
- file: ./docker/Prod.Dockerfile
+ file: ./src/Kattbot/prod.Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
diff --git a/.github/workflows/release-v2.yml b/.github/workflows/release-v2.yml
index 604aae0..9b20a39 100644
--- a/.github/workflows/release-v2.yml
+++ b/.github/workflows/release-v2.yml
@@ -16,7 +16,8 @@ env:
REGISTRY: ghcr.io
IMAGE_NAME: kattbot
COMPOSE_PROJECT_NAME: kattbot
- COMPOSE_FILE_NAME: prod-compose.yml
+ COMPOSE_FILE_PATH_SRC: docker/docker-compose.prod.yml
+ COMPOSE_FILE_NAME: docker-compose.prod.yml
DB_NAME: kattbot
DB_BACKUP_SCRIPT: kattbot-backup-db.sh
DB_MIGRATION_SCRIPT: database_migration.sql
@@ -61,7 +62,7 @@ jobs:
username: ${{secrets.KATTBOT_USER}}
key: ${{secrets.KATTBOT_KEY}}
passphrase: ${{secrets.KATTBOT_PASSPHRASE}}
- source: "docker/${{ env.COMPOSE_FILE_NAME }}"
+ source: ${{ env.COMPOSE_FILE_PATH_SRC }}
target: "$HOME/"
strip_components: 1
overwrite: true
@@ -84,13 +85,10 @@ jobs:
script_stop: true
script: |
FULL_IMAGE_NAME="$REGISTRY/$REPOSITORY_NAME/$IMAGE_NAME:$IMAGE_TAG"
- FULL_IMAGE_NAME_PREVIOUS="$REGISTRY/$REPOSITORY_NAME/$IMAGE_NAME:$IMAGE_TAG-previous"
+ echo "Full image name: $FULL_IMAGE_NAME"
MIGRATIONS_CONTAINER_NAME="$COMPOSE_PROJECT_NAME-migrations"
- # Tag the previous image with the previous tag, if it exists
- docker image tag $FULL_IMAGE_NAME $FULL_IMAGE_NAME_PREVIOUS || true
-
# Pull the image from the registry
echo $GHCR_PASSWORD | docker login $REGISTRY -u $GHCR_USERNAME --password-stdin
docker pull $FULL_IMAGE_NAME
@@ -116,6 +114,9 @@ jobs:
# Run the database migration script
psql -d $DB_NAME -q -f "$TMP_MIGRATIONS_DIR/$DB_MIGRATION_SCRIPT"
+ # Remove the temporary directory
+ rm -rf $TMP_MIGRATIONS_DIR
+
# Take down the old compose project, if it exists
docker compose -p $COMPOSE_PROJECT_NAME down || true
@@ -124,9 +125,6 @@ jobs:
# Prune untagged images
docker image prune -f
-
- # Remove the temporary directory
- rm -rf $TMP_MIGRATIONS_DIR
envs: >-
HOST_GATEWAY_IP,
REGISTRY,
diff --git a/.gitignore b/.gitignore
index e7c1032..1395d9c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -339,6 +339,6 @@ ASALocalRun/
# BeatPulse healthcheck temp database
healthchecksdb
-Kattbot.Data.Migrations/database_migration.sql
-
-.env.local
\ No newline at end of file
+*.local
+*.swp
+.secrets
diff --git a/Kattbot.sln b/Kattbot.sln
index a30cc2f..eb186cd 100644
--- a/Kattbot.sln
+++ b/Kattbot.sln
@@ -3,54 +3,21 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.3.32929.385
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kattbot", "Kattbot\Kattbot.csproj", "{9EB340B8-8D7D-4BBA-A146-33F7A15B13CE}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kattbot", "src\Kattbot\Kattbot.csproj", "{9EB340B8-8D7D-4BBA-A146-33F7A15B13CE}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kattbot.Tests", "Kattbot.Tests\Kattbot.Tests.csproj", "{1C2153F7-4660-4021-9864-8F1F704054BF}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kattbot.Tests", "tests\Kattbot.Tests\Kattbot.Tests.csproj", "{1C2153F7-4660-4021-9864-8F1F704054BF}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{2D6F1BD9-5D5D-4C85-B254-B773679A5AF9}"
- ProjectSection(SolutionItems) = preProject
- .dockerignore = .dockerignore
- .editorconfig = .editorconfig
- .gitattributes = .gitattributes
- .gitignore = .gitignore
- Directory.Build.props = Directory.Build.props
- Dotnet_cheatsheet.md = Dotnet_cheatsheet.md
- Readme.md = Readme.md
- EndProjectSection
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kattbot.Data", "src\Kattbot.Data\Kattbot.Data.csproj", "{F454BCE5-C964-4720-AD84-96A07FA7B8B1}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kattbot.Data", "Kattbot.Data\Kattbot.Data.csproj", "{F454BCE5-C964-4720-AD84-96A07FA7B8B1}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kattbot.Common", "src\Kattbot.Common\Kattbot.Common.csproj", "{FFC07C89-ECA8-4887-9376-DA43C5FC83AB}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kattbot.Common", "Kattbot.Common\Kattbot.Common.csproj", "{FFC07C89-ECA8-4887-9376-DA43C5FC83AB}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kattbot.Data.Migrations", "src\Kattbot.Data.Migrations\Kattbot.Data.Migrations.csproj", "{D26776E6-F360-425C-9281-F4E7B176197E}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kattbot.Data.Migrations", "Kattbot.Data.Migrations\Kattbot.Data.Migrations.csproj", "{D26776E6-F360-425C-9281-F4E7B176197E}"
+Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker", "docker\docker.dcproj", "{642D827F-5BA9-4177-AE3D-4BAEE013BC3F}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{727EE4ED-CFEC-4BBC-B67A-3DA7F8EE3F1E}"
- ProjectSection(SolutionItems) = preProject
- scripts\kattbot-backup-db.sh = scripts\kattbot-backup-db.sh
- EndProjectSection
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E845ABD6-198E-45CF-92D5-97F1A5E741A3}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".config", ".config", "{524F91BA-735B-4F73-BEDD-A3CC1DEB452C}"
- ProjectSection(SolutionItems) = preProject
- .config\dotnet-tools.json = .config\dotnet-tools.json
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{DC675219-AB3D-40B1-BA7C-27C5613023BC}"
- ProjectSection(SolutionItems) = preProject
- .github\workflows\build.yml = .github\workflows\build.yml
- .github\dependabot.yml = .github\dependabot.yml
- .github\workflows\release-v2.yml = .github\workflows\release-v2.yml
- .github\workflows\restart-v2.yml = .github\workflows\restart-v2.yml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{26E4A78E-3DA9-4825-896B-4A9B0B017188}"
- ProjectSection(SolutionItems) = preProject
- docker\docker-compose.yml = docker\docker-compose.yml
- docker\Dockerfile = docker\Dockerfile
- docker\prod-compose.yml = docker\prod-compose.yml
- docker\Prod.Dockerfile = docker\Prod.Dockerfile
- EndProjectSection
-EndProject
-Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-vs", "docker-vs\docker-vs.dcproj", "{642D827F-5BA9-4177-AE3D-4BAEE013BC3F}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{17BE3AFF-E650-40BC-A5EF-DF77B794D988}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -100,10 +67,11 @@ Global
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
- {727EE4ED-CFEC-4BBC-B67A-3DA7F8EE3F1E} = {2D6F1BD9-5D5D-4C85-B254-B773679A5AF9}
- {524F91BA-735B-4F73-BEDD-A3CC1DEB452C} = {2D6F1BD9-5D5D-4C85-B254-B773679A5AF9}
- {DC675219-AB3D-40B1-BA7C-27C5613023BC} = {2D6F1BD9-5D5D-4C85-B254-B773679A5AF9}
- {26E4A78E-3DA9-4825-896B-4A9B0B017188} = {2D6F1BD9-5D5D-4C85-B254-B773679A5AF9}
+ {9EB340B8-8D7D-4BBA-A146-33F7A15B13CE} = {E845ABD6-198E-45CF-92D5-97F1A5E741A3}
+ {FFC07C89-ECA8-4887-9376-DA43C5FC83AB} = {E845ABD6-198E-45CF-92D5-97F1A5E741A3}
+ {F454BCE5-C964-4720-AD84-96A07FA7B8B1} = {E845ABD6-198E-45CF-92D5-97F1A5E741A3}
+ {D26776E6-F360-425C-9281-F4E7B176197E} = {E845ABD6-198E-45CF-92D5-97F1A5E741A3}
+ {1C2153F7-4660-4021-9864-8F1F704054BF} = {17BE3AFF-E650-40BC-A5EF-DF77B794D988}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {49047B12-10BC-4E9D-9DA6-758947DF9CE8}
diff --git a/Kattbot/Dockerfile b/Kattbot/Dockerfile
deleted file mode 100644
index c1aadc4..0000000
--- a/Kattbot/Dockerfile
+++ /dev/null
@@ -1 +0,0 @@
-FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
\ No newline at end of file
diff --git a/docker-vs/docker-compose.override.yml b/docker-vs/docker-compose.override.yml
deleted file mode 100644
index 344ca54..0000000
--- a/docker-vs/docker-compose.override.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-version: '3.4'
-
-services:
- kattbot:
- environment:
- - DOTNET_ENVIRONMENT=Development
- volumes:
- - ${APPDATA}/Microsoft/UserSecrets:/home/app/.microsoft/usersecrets:ro
\ No newline at end of file
diff --git a/docker-vs/docker-compose.yml b/docker-vs/docker-compose.yml
deleted file mode 100644
index c1fd5ca..0000000
--- a/docker-vs/docker-compose.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-version: '3.4'
-
-services:
- kattbot:
- build:
- context: ..
- dockerfile: Kattbot/Dockerfile
- depends_on:
- - kattbot-pgsql
-
- kattbot-pgsql:
- image: postgres:15.5
- ports:
- - "5433:5432"
- environment:
- POSTGRES_USER: kattbot
- POSTGRES_PASSWORD: hunter2
- POSTGRES_DB: kattbot-dev
- volumes:
- - kattbot-pgdata:/var/lib/postgresql/data
-
- kattbot-pgadmin:
- image: dpage/pgadmin4
- ports:
- - "5444:80"
- profiles:
- - tools
- depends_on:
- - kattbot-pgsql
- environment:
- PGADMIN_DEFAULT_EMAIL: katt@bot.local
- PGADMIN_DEFAULT_PASSWORD: hunter2
-
-volumes:
- kattbot-pgdata:
-
diff --git a/docker-vs/docker-vs.dcproj b/docker-vs/docker-vs.dcproj
deleted file mode 100644
index 41e42c1..0000000
--- a/docker-vs/docker-vs.dcproj
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
- 2.1
- Linux
- False
- 642d827f-5ba9-4177-ae3d-4baee013bc3f
-
-
-
- docker-compose.yml
-
-
-
-
\ No newline at end of file
diff --git a/docker/Dockerfile b/docker/Dockerfile
deleted file mode 100644
index ba5ab45..0000000
--- a/docker/Dockerfile
+++ /dev/null
@@ -1,13 +0,0 @@
-FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
-
-FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
-WORKDIR /src
-COPY ["Directory.Build.props", "."]
-COPY ["Kattbot/Kattbot.csproj", "Kattbot/"]
-COPY ["Kattbot.Common/Kattbot.Common.csproj", "Kattbot.Common/"]
-COPY ["Kattbot.Data/Kattbot.Data.csproj", "Kattbot.Data/"]
-RUN dotnet restore "./Kattbot/Kattbot.csproj"
-COPY . .
-RUN dotnet build "./Kattbot/Kattbot.csproj"
-
-ENTRYPOINT ["dotnet", "run", "--project", "Kattbot/Kattbot.csproj"]
\ No newline at end of file
diff --git a/docker/Prod.Dockerfile b/docker/Prod.Dockerfile
deleted file mode 100644
index 2793f23..0000000
--- a/docker/Prod.Dockerfile
+++ /dev/null
@@ -1,32 +0,0 @@
-FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
-USER app
-
-FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
-ARG BUILD_CONFIGURATION=Release
-WORKDIR /src
-COPY ["Directory.Build.props", "."]
-COPY ["Kattbot/Kattbot.csproj", "Kattbot/"]
-COPY ["Kattbot.Common/Kattbot.Common.csproj", "Kattbot.Common/"]
-COPY ["Kattbot.Data/Kattbot.Data.csproj", "Kattbot.Data/"]
-COPY ["Kattbot.Data.Migrations/Kattbot.Data.Migrations.csproj", "Kattbot.Data.Migrations/"]
-RUN dotnet restore "./Kattbot/Kattbot.csproj"
-COPY . .
-RUN dotnet build "./Kattbot/Kattbot.csproj" -c $BUILD_CONFIGURATION -o /output/build
-
-FROM build AS publish
-ARG BUILD_CONFIGURATION=Release
-RUN dotnet publish "./Kattbot/Kattbot.csproj" -c $BUILD_CONFIGURATION -o /output/publish /p:UseAppHost=false
-
-FROM build AS migrations
-RUN dotnet tool restore
-RUN dotnet ef migrations script --idempotent -p Kattbot.Data.Migrations -o /output/migrations/database_migration.sql
-COPY --from=build /src/scripts/kattbot-backup-db.sh /output/migrations/
-
-# TODO try to bundle the migrations as an executable
-# RUN dotnet ef migrations bundle -p Kattbot.Data.Migrations -r linux-x64 -o /output/migrations/efbundle
-
-FROM base AS final
-WORKDIR /app
-COPY --from=publish /output/publish .
-COPY --from=migrations /output/migrations ./migrations/
-ENTRYPOINT ["dotnet", "Kattbot.dll"]
\ No newline at end of file
diff --git a/docker/prod-compose.yml b/docker/docker-compose.prod.yml
similarity index 57%
rename from docker/prod-compose.yml
rename to docker/docker-compose.prod.yml
index 9840355..0123838 100644
--- a/docker/prod-compose.yml
+++ b/docker/docker-compose.prod.yml
@@ -1,4 +1,4 @@
-version: '3.4'
+name: kattbot
services:
kattbot:
@@ -8,6 +8,6 @@ services:
extra_hosts:
- "host.docker.internal=$HOST_GATEWAY_IP"
environment:
- Kattbot__BotToken: $BOT_TOKEN
- Kattbot__OpenAiApiKey: $OPENAI_API_KEY
- Kattbot__ConnectionString: $DB_CONNECTION_STRING
\ No newline at end of file
+ Kattbot__BotToken: $BOT_TOKEN
+ Kattbot__OpenAiApiKey: $OPENAI_API_KEY
+ Kattbot__ConnectionString: $DB_CONNECTION_STRING
\ No newline at end of file
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
index 914a9e4..861a698 100644
--- a/docker/docker-compose.yml
+++ b/docker/docker-compose.yml
@@ -1,22 +1,24 @@
-version: '3.4'
+name: kattbot-dev
services:
kattbot:
build:
context: ..
- dockerfile: docker/Dockerfile
- depends_on:
- - kattbot-pgsql
+ dockerfile: src/Kattbot/Dockerfile
environment:
- DOTNET_ENVIRONMENT=Development
env_file:
- path: .env.local
required: false
-
+ volumes:
+ - ${APPDATA}/Microsoft/UserSecrets:/home/app/.microsoft/usersecrets:ro
+
kattbot-pgsql:
image: postgres:15.5
ports:
- "5433:5432"
+ profiles:
+ - database
environment:
POSTGRES_USER: kattbot
POSTGRES_PASSWORD: hunter2
diff --git a/docker/docker.dcproj b/docker/docker.dcproj
new file mode 100644
index 0000000..8f1415b
--- /dev/null
+++ b/docker/docker.dcproj
@@ -0,0 +1,15 @@
+
+
+
+ 2.1
+ Linux
+ False
+ 642d827f-5ba9-4177-ae3d-4baee013bc3f
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docker-vs/launchSettings.json b/docker/launchSettings.json
similarity index 100%
rename from docker-vs/launchSettings.json
rename to docker/launchSettings.json
diff --git a/Kattbot.Common/Kattbot.Common.csproj b/src/Kattbot.Common/Kattbot.Common.csproj
similarity index 100%
rename from Kattbot.Common/Kattbot.Common.csproj
rename to src/Kattbot.Common/Kattbot.Common.csproj
diff --git a/Kattbot.Common/Models/BotRoles/BotRoleType.cs b/src/Kattbot.Common/Models/BotRoles/BotRoleType.cs
similarity index 100%
rename from Kattbot.Common/Models/BotRoles/BotRoleType.cs
rename to src/Kattbot.Common/Models/BotRoles/BotRoleType.cs
diff --git a/Kattbot.Common/Models/BotRoles/BotUserRole.cs b/src/Kattbot.Common/Models/BotRoles/BotUserRole.cs
similarity index 100%
rename from Kattbot.Common/Models/BotRoles/BotUserRole.cs
rename to src/Kattbot.Common/Models/BotRoles/BotUserRole.cs
diff --git a/Kattbot.Common/Models/Emotes/EmoteEntity.cs b/src/Kattbot.Common/Models/Emotes/EmoteEntity.cs
similarity index 100%
rename from Kattbot.Common/Models/Emotes/EmoteEntity.cs
rename to src/Kattbot.Common/Models/Emotes/EmoteEntity.cs
diff --git a/Kattbot.Common/Models/Emotes/EmoteSource.cs b/src/Kattbot.Common/Models/Emotes/EmoteSource.cs
similarity index 100%
rename from Kattbot.Common/Models/Emotes/EmoteSource.cs
rename to src/Kattbot.Common/Models/Emotes/EmoteSource.cs
diff --git a/Kattbot.Common/Models/Emotes/EmoteUsageResult.cs b/src/Kattbot.Common/Models/Emotes/EmoteUsageResult.cs
similarity index 100%
rename from Kattbot.Common/Models/Emotes/EmoteUsageResult.cs
rename to src/Kattbot.Common/Models/Emotes/EmoteUsageResult.cs
diff --git a/Kattbot.Common/Models/Emotes/TempEmote.cs b/src/Kattbot.Common/Models/Emotes/TempEmote.cs
similarity index 100%
rename from Kattbot.Common/Models/Emotes/TempEmote.cs
rename to src/Kattbot.Common/Models/Emotes/TempEmote.cs
diff --git a/Kattbot.Common/Models/GuildSetting.cs b/src/Kattbot.Common/Models/GuildSetting.cs
similarity index 100%
rename from Kattbot.Common/Models/GuildSetting.cs
rename to src/Kattbot.Common/Models/GuildSetting.cs
diff --git a/Kattbot.Common/Models/IntervalValue.cs b/src/Kattbot.Common/Models/IntervalValue.cs
similarity index 100%
rename from Kattbot.Common/Models/IntervalValue.cs
rename to src/Kattbot.Common/Models/IntervalValue.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChatCompletionChoice.cs b/src/Kattbot.Common/Models/KattGpt/ChatCompletionChoice.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChatCompletionChoice.cs
rename to src/Kattbot.Common/Models/KattGpt/ChatCompletionChoice.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChatCompletionCreateRequest.cs b/src/Kattbot.Common/Models/KattGpt/ChatCompletionCreateRequest.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChatCompletionCreateRequest.cs
rename to src/Kattbot.Common/Models/KattGpt/ChatCompletionCreateRequest.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChatCompletionCreateResponse.cs b/src/Kattbot.Common/Models/KattGpt/ChatCompletionCreateResponse.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChatCompletionCreateResponse.cs
rename to src/Kattbot.Common/Models/KattGpt/ChatCompletionCreateResponse.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChatCompletionFunction.cs b/src/Kattbot.Common/Models/KattGpt/ChatCompletionFunction.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChatCompletionFunction.cs
rename to src/Kattbot.Common/Models/KattGpt/ChatCompletionFunction.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChatCompletionFunctionCall.cs b/src/Kattbot.Common/Models/KattGpt/ChatCompletionFunctionCall.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChatCompletionFunctionCall.cs
rename to src/Kattbot.Common/Models/KattGpt/ChatCompletionFunctionCall.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChatCompletionFunctionChoice.cs b/src/Kattbot.Common/Models/KattGpt/ChatCompletionFunctionChoice.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChatCompletionFunctionChoice.cs
rename to src/Kattbot.Common/Models/KattGpt/ChatCompletionFunctionChoice.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChatCompletionMessage.cs b/src/Kattbot.Common/Models/KattGpt/ChatCompletionMessage.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChatCompletionMessage.cs
rename to src/Kattbot.Common/Models/KattGpt/ChatCompletionMessage.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChatCompletionResponseError.cs b/src/Kattbot.Common/Models/KattGpt/ChatCompletionResponseError.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChatCompletionResponseError.cs
rename to src/Kattbot.Common/Models/KattGpt/ChatCompletionResponseError.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChatCompletionResponseErrorWrapper.cs b/src/Kattbot.Common/Models/KattGpt/ChatCompletionResponseErrorWrapper.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChatCompletionResponseErrorWrapper.cs
rename to src/Kattbot.Common/Models/KattGpt/ChatCompletionResponseErrorWrapper.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChatCompletionTool.cs b/src/Kattbot.Common/Models/KattGpt/ChatCompletionTool.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChatCompletionTool.cs
rename to src/Kattbot.Common/Models/KattGpt/ChatCompletionTool.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChatCompletionToolCall.cs b/src/Kattbot.Common/Models/KattGpt/ChatCompletionToolCall.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChatCompletionToolCall.cs
rename to src/Kattbot.Common/Models/KattGpt/ChatCompletionToolCall.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChatCompletionToolChoice.cs b/src/Kattbot.Common/Models/KattGpt/ChatCompletionToolChoice.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChatCompletionToolChoice.cs
rename to src/Kattbot.Common/Models/KattGpt/ChatCompletionToolChoice.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChatCompletionUsage.cs b/src/Kattbot.Common/Models/KattGpt/ChatCompletionUsage.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChatCompletionUsage.cs
rename to src/Kattbot.Common/Models/KattGpt/ChatCompletionUsage.cs
diff --git a/Kattbot.Common/Models/KattGpt/ChoiceFinishReason.cs b/src/Kattbot.Common/Models/KattGpt/ChoiceFinishReason.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/ChoiceFinishReason.cs
rename to src/Kattbot.Common/Models/KattGpt/ChoiceFinishReason.cs
diff --git a/Kattbot.Common/Models/KattGpt/StringOrObject.cs b/src/Kattbot.Common/Models/KattGpt/StringOrObject.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/StringOrObject.cs
rename to src/Kattbot.Common/Models/KattGpt/StringOrObject.cs
diff --git a/Kattbot.Common/Models/KattGpt/StringOrObjectConverter.cs b/src/Kattbot.Common/Models/KattGpt/StringOrObjectConverter.cs
similarity index 100%
rename from Kattbot.Common/Models/KattGpt/StringOrObjectConverter.cs
rename to src/Kattbot.Common/Models/KattGpt/StringOrObjectConverter.cs
diff --git a/Kattbot.Common/Models/PaginatedResult.cs b/src/Kattbot.Common/Models/PaginatedResult.cs
similarity index 100%
rename from Kattbot.Common/Models/PaginatedResult.cs
rename to src/Kattbot.Common/Models/PaginatedResult.cs
diff --git a/Kattbot.Common/Utils/StringExtensions.cs b/src/Kattbot.Common/Utils/StringExtensions.cs
similarity index 100%
rename from Kattbot.Common/Utils/StringExtensions.cs
rename to src/Kattbot.Common/Utils/StringExtensions.cs
diff --git a/Kattbot.Data.Migrations/Kattbot.Data.Migrations.csproj b/src/Kattbot.Data.Migrations/Kattbot.Data.Migrations.csproj
similarity index 100%
rename from Kattbot.Data.Migrations/Kattbot.Data.Migrations.csproj
rename to src/Kattbot.Data.Migrations/Kattbot.Data.Migrations.csproj
diff --git a/Kattbot.Data.Migrations/KattbotContextDesignTimeFactory.cs b/src/Kattbot.Data.Migrations/KattbotContextDesignTimeFactory.cs
similarity index 100%
rename from Kattbot.Data.Migrations/KattbotContextDesignTimeFactory.cs
rename to src/Kattbot.Data.Migrations/KattbotContextDesignTimeFactory.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201101201118_Init.Designer.cs b/src/Kattbot.Data.Migrations/Migrations/20201101201118_Init.Designer.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201101201118_Init.Designer.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201101201118_Init.Designer.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201101201118_Init.cs b/src/Kattbot.Data.Migrations/Migrations/20201101201118_Init.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201101201118_Init.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201101201118_Init.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201101204345_AddGuildId.Designer.cs b/src/Kattbot.Data.Migrations/Migrations/20201101204345_AddGuildId.Designer.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201101204345_AddGuildId.Designer.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201101204345_AddGuildId.Designer.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201101204345_AddGuildId.cs b/src/Kattbot.Data.Migrations/Migrations/20201101204345_AddGuildId.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201101204345_AddGuildId.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201101204345_AddGuildId.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201101214634_RenameEmoteIdToEmoteCode.Designer.cs b/src/Kattbot.Data.Migrations/Migrations/20201101214634_RenameEmoteIdToEmoteCode.Designer.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201101214634_RenameEmoteIdToEmoteCode.Designer.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201101214634_RenameEmoteIdToEmoteCode.Designer.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201101214634_RenameEmoteIdToEmoteCode.cs b/src/Kattbot.Data.Migrations/Migrations/20201101214634_RenameEmoteIdToEmoteCode.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201101214634_RenameEmoteIdToEmoteCode.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201101214634_RenameEmoteIdToEmoteCode.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201102182846_AddMessageIdToEntity.Designer.cs b/src/Kattbot.Data.Migrations/Migrations/20201102182846_AddMessageIdToEntity.Designer.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201102182846_AddMessageIdToEntity.Designer.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201102182846_AddMessageIdToEntity.Designer.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201102182846_AddMessageIdToEntity.cs b/src/Kattbot.Data.Migrations/Migrations/20201102182846_AddMessageIdToEntity.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201102182846_AddMessageIdToEntity.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201102182846_AddMessageIdToEntity.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201102214530_AddLastLiveMessageEntity.Designer.cs b/src/Kattbot.Data.Migrations/Migrations/20201102214530_AddLastLiveMessageEntity.Designer.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201102214530_AddLastLiveMessageEntity.Designer.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201102214530_AddLastLiveMessageEntity.Designer.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201102214530_AddLastLiveMessageEntity.cs b/src/Kattbot.Data.Migrations/Migrations/20201102214530_AddLastLiveMessageEntity.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201102214530_AddLastLiveMessageEntity.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201102214530_AddLastLiveMessageEntity.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201109185829_RemoveLastLiveMessage.Designer.cs b/src/Kattbot.Data.Migrations/Migrations/20201109185829_RemoveLastLiveMessage.Designer.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201109185829_RemoveLastLiveMessage.Designer.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201109185829_RemoveLastLiveMessage.Designer.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201109185829_RemoveLastLiveMessage.cs b/src/Kattbot.Data.Migrations/Migrations/20201109185829_RemoveLastLiveMessage.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201109185829_RemoveLastLiveMessage.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201109185829_RemoveLastLiveMessage.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201116192821_AddEmoteId.Designer.cs b/src/Kattbot.Data.Migrations/Migrations/20201116192821_AddEmoteId.Designer.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201116192821_AddEmoteId.Designer.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201116192821_AddEmoteId.Designer.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20201116192821_AddEmoteId.cs b/src/Kattbot.Data.Migrations/Migrations/20201116192821_AddEmoteId.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20201116192821_AddEmoteId.cs
rename to src/Kattbot.Data.Migrations/Migrations/20201116192821_AddEmoteId.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20210224160716_AddEvents.Designer.cs b/src/Kattbot.Data.Migrations/Migrations/20210224160716_AddEvents.Designer.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20210224160716_AddEvents.Designer.cs
rename to src/Kattbot.Data.Migrations/Migrations/20210224160716_AddEvents.Designer.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20210224160716_AddEvents.cs b/src/Kattbot.Data.Migrations/Migrations/20210224160716_AddEvents.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20210224160716_AddEvents.cs
rename to src/Kattbot.Data.Migrations/Migrations/20210224160716_AddEvents.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20210224235611_ChangeEventDateTimeOffsetToDateTime.Designer.cs b/src/Kattbot.Data.Migrations/Migrations/20210224235611_ChangeEventDateTimeOffsetToDateTime.Designer.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20210224235611_ChangeEventDateTimeOffsetToDateTime.Designer.cs
rename to src/Kattbot.Data.Migrations/Migrations/20210224235611_ChangeEventDateTimeOffsetToDateTime.Designer.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20210224235611_ChangeEventDateTimeOffsetToDateTime.cs b/src/Kattbot.Data.Migrations/Migrations/20210224235611_ChangeEventDateTimeOffsetToDateTime.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20210224235611_ChangeEventDateTimeOffsetToDateTime.cs
rename to src/Kattbot.Data.Migrations/Migrations/20210224235611_ChangeEventDateTimeOffsetToDateTime.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20210310231543_RemoveEmoteCode.Designer.cs b/src/Kattbot.Data.Migrations/Migrations/20210310231543_RemoveEmoteCode.Designer.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20210310231543_RemoveEmoteCode.Designer.cs
rename to src/Kattbot.Data.Migrations/Migrations/20210310231543_RemoveEmoteCode.Designer.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20210310231543_RemoveEmoteCode.cs b/src/Kattbot.Data.Migrations/Migrations/20210310231543_RemoveEmoteCode.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20210310231543_RemoveEmoteCode.cs
rename to src/Kattbot.Data.Migrations/Migrations/20210310231543_RemoveEmoteCode.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20210312235603_AddBotUserRole.Designer.cs b/src/Kattbot.Data.Migrations/Migrations/20210312235603_AddBotUserRole.Designer.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20210312235603_AddBotUserRole.Designer.cs
rename to src/Kattbot.Data.Migrations/Migrations/20210312235603_AddBotUserRole.Designer.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20210312235603_AddBotUserRole.cs b/src/Kattbot.Data.Migrations/Migrations/20210312235603_AddBotUserRole.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20210312235603_AddBotUserRole.cs
rename to src/Kattbot.Data.Migrations/Migrations/20210312235603_AddBotUserRole.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20210317213350_AddGuildSettings.Designer.cs b/src/Kattbot.Data.Migrations/Migrations/20210317213350_AddGuildSettings.Designer.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20210317213350_AddGuildSettings.Designer.cs
rename to src/Kattbot.Data.Migrations/Migrations/20210317213350_AddGuildSettings.Designer.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20210317213350_AddGuildSettings.cs b/src/Kattbot.Data.Migrations/Migrations/20210317213350_AddGuildSettings.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20210317213350_AddGuildSettings.cs
rename to src/Kattbot.Data.Migrations/Migrations/20210317213350_AddGuildSettings.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20210703201146_RemoveEvents.Designer.cs b/src/Kattbot.Data.Migrations/Migrations/20210703201146_RemoveEvents.Designer.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20210703201146_RemoveEvents.Designer.cs
rename to src/Kattbot.Data.Migrations/Migrations/20210703201146_RemoveEvents.Designer.cs
diff --git a/Kattbot.Data.Migrations/Migrations/20210703201146_RemoveEvents.cs b/src/Kattbot.Data.Migrations/Migrations/20210703201146_RemoveEvents.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/20210703201146_RemoveEvents.cs
rename to src/Kattbot.Data.Migrations/Migrations/20210703201146_RemoveEvents.cs
diff --git a/Kattbot.Data.Migrations/Migrations/KattbotContextModelSnapshot.cs b/src/Kattbot.Data.Migrations/Migrations/KattbotContextModelSnapshot.cs
similarity index 100%
rename from Kattbot.Data.Migrations/Migrations/KattbotContextModelSnapshot.cs
rename to src/Kattbot.Data.Migrations/Migrations/KattbotContextModelSnapshot.cs
diff --git a/Kattbot.Data.Migrations/appsettings.json b/src/Kattbot.Data.Migrations/appsettings.json
similarity index 100%
rename from Kattbot.Data.Migrations/appsettings.json
rename to src/Kattbot.Data.Migrations/appsettings.json
diff --git a/Kattbot.Data/Kattbot.Data.csproj b/src/Kattbot.Data/Kattbot.Data.csproj
similarity index 100%
rename from Kattbot.Data/Kattbot.Data.csproj
rename to src/Kattbot.Data/Kattbot.Data.csproj
diff --git a/Kattbot.Data/KattbotContext.cs b/src/Kattbot.Data/KattbotContext.cs
similarity index 100%
rename from Kattbot.Data/KattbotContext.cs
rename to src/Kattbot.Data/KattbotContext.cs
diff --git a/Kattbot.Data/Repositories/BotUserRolesRepository.cs b/src/Kattbot.Data/Repositories/BotUserRolesRepository.cs
similarity index 100%
rename from Kattbot.Data/Repositories/BotUserRolesRepository.cs
rename to src/Kattbot.Data/Repositories/BotUserRolesRepository.cs
diff --git a/Kattbot.Data/Repositories/EmoteStatsRepository.cs b/src/Kattbot.Data/Repositories/EmoteStatsRepository.cs
similarity index 100%
rename from Kattbot.Data/Repositories/EmoteStatsRepository.cs
rename to src/Kattbot.Data/Repositories/EmoteStatsRepository.cs
diff --git a/Kattbot.Data/Repositories/EmotesRepository.cs b/src/Kattbot.Data/Repositories/EmotesRepository.cs
similarity index 100%
rename from Kattbot.Data/Repositories/EmotesRepository.cs
rename to src/Kattbot.Data/Repositories/EmotesRepository.cs
diff --git a/Kattbot.Data/Repositories/GuildSettingsRepository.cs b/src/Kattbot.Data/Repositories/GuildSettingsRepository.cs
similarity index 100%
rename from Kattbot.Data/Repositories/GuildSettingsRepository.cs
rename to src/Kattbot.Data/Repositories/GuildSettingsRepository.cs
diff --git a/Kattbot/Attributes/BaseCommandCheck.cs b/src/Kattbot/Attributes/BaseCommandCheck.cs
similarity index 100%
rename from Kattbot/Attributes/BaseCommandCheck.cs
rename to src/Kattbot/Attributes/BaseCommandCheck.cs
diff --git a/Kattbot/Attributes/RequireOwnerOrFriend.cs b/src/Kattbot/Attributes/RequireOwnerOrFriend.cs
similarity index 100%
rename from Kattbot/Attributes/RequireOwnerOrFriend.cs
rename to src/Kattbot/Attributes/RequireOwnerOrFriend.cs
diff --git a/Kattbot/CommandHandlers/CommandRequest.cs b/src/Kattbot/CommandHandlers/CommandRequest.cs
similarity index 100%
rename from Kattbot/CommandHandlers/CommandRequest.cs
rename to src/Kattbot/CommandHandlers/CommandRequest.cs
diff --git a/Kattbot/CommandHandlers/EmoteStats/GetEmoteStats.cs b/src/Kattbot/CommandHandlers/EmoteStats/GetEmoteStats.cs
similarity index 100%
rename from Kattbot/CommandHandlers/EmoteStats/GetEmoteStats.cs
rename to src/Kattbot/CommandHandlers/EmoteStats/GetEmoteStats.cs
diff --git a/Kattbot/CommandHandlers/EmoteStats/GetGuildEmoteStats.cs b/src/Kattbot/CommandHandlers/EmoteStats/GetGuildEmoteStats.cs
similarity index 100%
rename from Kattbot/CommandHandlers/EmoteStats/GetGuildEmoteStats.cs
rename to src/Kattbot/CommandHandlers/EmoteStats/GetGuildEmoteStats.cs
diff --git a/Kattbot/CommandHandlers/EmoteStats/GetUserEmoteStats.cs b/src/Kattbot/CommandHandlers/EmoteStats/GetUserEmoteStats.cs
similarity index 100%
rename from Kattbot/CommandHandlers/EmoteStats/GetUserEmoteStats.cs
rename to src/Kattbot/CommandHandlers/EmoteStats/GetUserEmoteStats.cs
diff --git a/Kattbot/CommandHandlers/Images/DallePrompt.cs b/src/Kattbot/CommandHandlers/Images/DallePrompt.cs
similarity index 100%
rename from Kattbot/CommandHandlers/Images/DallePrompt.cs
rename to src/Kattbot/CommandHandlers/Images/DallePrompt.cs
diff --git a/Kattbot/CommandHandlers/Images/DallifyImageBase.cs b/src/Kattbot/CommandHandlers/Images/DallifyImageBase.cs
similarity index 100%
rename from Kattbot/CommandHandlers/Images/DallifyImageBase.cs
rename to src/Kattbot/CommandHandlers/Images/DallifyImageBase.cs
diff --git a/Kattbot/CommandHandlers/Images/DallifyImageEmote.cs b/src/Kattbot/CommandHandlers/Images/DallifyImageEmote.cs
similarity index 100%
rename from Kattbot/CommandHandlers/Images/DallifyImageEmote.cs
rename to src/Kattbot/CommandHandlers/Images/DallifyImageEmote.cs
diff --git a/Kattbot/CommandHandlers/Images/DallifyImageMessage.cs b/src/Kattbot/CommandHandlers/Images/DallifyImageMessage.cs
similarity index 100%
rename from Kattbot/CommandHandlers/Images/DallifyImageMessage.cs
rename to src/Kattbot/CommandHandlers/Images/DallifyImageMessage.cs
diff --git a/Kattbot/CommandHandlers/Images/DallifyImageUser.cs b/src/Kattbot/CommandHandlers/Images/DallifyImageUser.cs
similarity index 100%
rename from Kattbot/CommandHandlers/Images/DallifyImageUser.cs
rename to src/Kattbot/CommandHandlers/Images/DallifyImageUser.cs
diff --git a/Kattbot/CommandHandlers/Images/GetBigEmote.cs b/src/Kattbot/CommandHandlers/Images/GetBigEmote.cs
similarity index 100%
rename from Kattbot/CommandHandlers/Images/GetBigEmote.cs
rename to src/Kattbot/CommandHandlers/Images/GetBigEmote.cs
diff --git a/Kattbot/CommandHandlers/Images/PetImage.cs b/src/Kattbot/CommandHandlers/Images/PetImage.cs
similarity index 100%
rename from Kattbot/CommandHandlers/Images/PetImage.cs
rename to src/Kattbot/CommandHandlers/Images/PetImage.cs
diff --git a/Kattbot/CommandHandlers/Images/TransformImageEffect.cs b/src/Kattbot/CommandHandlers/Images/TransformImageEffect.cs
similarity index 100%
rename from Kattbot/CommandHandlers/Images/TransformImageEffect.cs
rename to src/Kattbot/CommandHandlers/Images/TransformImageEffect.cs
diff --git a/Kattbot/CommandHandlers/Images/TransformImageEmote.cs b/src/Kattbot/CommandHandlers/Images/TransformImageEmote.cs
similarity index 100%
rename from Kattbot/CommandHandlers/Images/TransformImageEmote.cs
rename to src/Kattbot/CommandHandlers/Images/TransformImageEmote.cs
diff --git a/Kattbot/CommandHandlers/Images/TransformImageMessage.cs b/src/Kattbot/CommandHandlers/Images/TransformImageMessage.cs
similarity index 100%
rename from Kattbot/CommandHandlers/Images/TransformImageMessage.cs
rename to src/Kattbot/CommandHandlers/Images/TransformImageMessage.cs
diff --git a/Kattbot/CommandHandlers/Images/TransformImageUser.cs b/src/Kattbot/CommandHandlers/Images/TransformImageUser.cs
similarity index 100%
rename from Kattbot/CommandHandlers/Images/TransformImageUser.cs
rename to src/Kattbot/CommandHandlers/Images/TransformImageUser.cs
diff --git a/Kattbot/CommandHandlers/Random/ClapText.cs b/src/Kattbot/CommandHandlers/Random/ClapText.cs
similarity index 100%
rename from Kattbot/CommandHandlers/Random/ClapText.cs
rename to src/Kattbot/CommandHandlers/Random/ClapText.cs
diff --git a/Kattbot/CommandHandlers/Speech/SpeechCommand.cs b/src/Kattbot/CommandHandlers/Speech/SpeechCommand.cs
similarity index 100%
rename from Kattbot/CommandHandlers/Speech/SpeechCommand.cs
rename to src/Kattbot/CommandHandlers/Speech/SpeechCommand.cs
diff --git a/Kattbot/CommandModules/AdminModule.cs b/src/Kattbot/CommandModules/AdminModule.cs
similarity index 100%
rename from Kattbot/CommandModules/AdminModule.cs
rename to src/Kattbot/CommandModules/AdminModule.cs
diff --git a/Kattbot/CommandModules/EmoteModule.cs b/src/Kattbot/CommandModules/EmoteModule.cs
similarity index 100%
rename from Kattbot/CommandModules/EmoteModule.cs
rename to src/Kattbot/CommandModules/EmoteModule.cs
diff --git a/Kattbot/CommandModules/HelpModule.cs b/src/Kattbot/CommandModules/HelpModule.cs
similarity index 100%
rename from Kattbot/CommandModules/HelpModule.cs
rename to src/Kattbot/CommandModules/HelpModule.cs
diff --git a/Kattbot/CommandModules/ImageModule.cs b/src/Kattbot/CommandModules/ImageModule.cs
similarity index 100%
rename from Kattbot/CommandModules/ImageModule.cs
rename to src/Kattbot/CommandModules/ImageModule.cs
diff --git a/Kattbot/CommandModules/RandomModule.cs b/src/Kattbot/CommandModules/RandomModule.cs
similarity index 100%
rename from Kattbot/CommandModules/RandomModule.cs
rename to src/Kattbot/CommandModules/RandomModule.cs
diff --git a/Kattbot/CommandModules/ResultFormatters/FormattedResultHelper.cs b/src/Kattbot/CommandModules/ResultFormatters/FormattedResultHelper.cs
similarity index 100%
rename from Kattbot/CommandModules/ResultFormatters/FormattedResultHelper.cs
rename to src/Kattbot/CommandModules/ResultFormatters/FormattedResultHelper.cs
diff --git a/Kattbot/CommandModules/StatsCommandModule.cs b/src/Kattbot/CommandModules/StatsCommandModule.cs
similarity index 100%
rename from Kattbot/CommandModules/StatsCommandModule.cs
rename to src/Kattbot/CommandModules/StatsCommandModule.cs
diff --git a/Kattbot/CommandModules/TypeReaders/GenericArgumentConverter.cs b/src/Kattbot/CommandModules/TypeReaders/GenericArgumentConverter.cs
similarity index 100%
rename from Kattbot/CommandModules/TypeReaders/GenericArgumentConverter.cs
rename to src/Kattbot/CommandModules/TypeReaders/GenericArgumentConverter.cs
diff --git a/Kattbot/CommandModules/TypeReaders/StatsCommandArgs.cs b/src/Kattbot/CommandModules/TypeReaders/StatsCommandArgs.cs
similarity index 100%
rename from Kattbot/CommandModules/TypeReaders/StatsCommandArgs.cs
rename to src/Kattbot/CommandModules/TypeReaders/StatsCommandArgs.cs
diff --git a/Kattbot/CommandModules/UtilsModule.cs b/src/Kattbot/CommandModules/UtilsModule.cs
similarity index 100%
rename from Kattbot/CommandModules/UtilsModule.cs
rename to src/Kattbot/CommandModules/UtilsModule.cs
diff --git a/Kattbot/Config/BotOptions.cs b/src/Kattbot/Config/BotOptions.cs
similarity index 100%
rename from Kattbot/Config/BotOptions.cs
rename to src/Kattbot/Config/BotOptions.cs
diff --git a/Kattbot/Config/ChannelOptions.cs b/src/Kattbot/Config/ChannelOptions.cs
similarity index 100%
rename from Kattbot/Config/ChannelOptions.cs
rename to src/Kattbot/Config/ChannelOptions.cs
diff --git a/Kattbot/Config/GuildOptions.cs b/src/Kattbot/Config/GuildOptions.cs
similarity index 100%
rename from Kattbot/Config/GuildOptions.cs
rename to src/Kattbot/Config/GuildOptions.cs
diff --git a/Kattbot/Config/KattGptOptions.cs b/src/Kattbot/Config/KattGptOptions.cs
similarity index 100%
rename from Kattbot/Config/KattGptOptions.cs
rename to src/Kattbot/Config/KattGptOptions.cs
diff --git a/Kattbot/Config/Template.cs b/src/Kattbot/Config/Template.cs
similarity index 100%
rename from Kattbot/Config/Template.cs
rename to src/Kattbot/Config/Template.cs
diff --git a/src/Kattbot/Dockerfile b/src/Kattbot/Dockerfile
new file mode 100644
index 0000000..0482800
--- /dev/null
+++ b/src/Kattbot/Dockerfile
@@ -0,0 +1,17 @@
+FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
+
+FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
+ARG BUILD_CONFIGURATION=Debug
+WORKDIR /src
+COPY ["Directory.Build.props", "."]
+COPY ["src/Kattbot/Kattbot.csproj", "Kattbot/"]
+COPY ["src/Kattbot.Common/Kattbot.Common.csproj", "Kattbot.Common/"]
+COPY ["src/Kattbot.Data/Kattbot.Data.csproj", "Kattbot.Data/"]
+RUN dotnet restore "./Kattbot/Kattbot.csproj"
+COPY ["Kattbot.sln", "."]
+COPY ["stylecop.json", "."]
+COPY [".editorconfig", "."]
+COPY src .
+RUN dotnet build "./Kattbot/Kattbot.csproj" -c $BUILD_CONFIGURATION --no-restore
+USER $APP_UID
+ENTRYPOINT ["dotnet", "run", "--project", "Kattbot/Kattbot.csproj", "--no-build"]
\ No newline at end of file
diff --git a/Kattbot/Helpers/BoundedQueue.cs b/src/Kattbot/Helpers/BoundedQueue.cs
similarity index 100%
rename from Kattbot/Helpers/BoundedQueue.cs
rename to src/Kattbot/Helpers/BoundedQueue.cs
diff --git a/Kattbot/Helpers/DateTimeProvider.cs b/src/Kattbot/Helpers/DateTimeProvider.cs
similarity index 100%
rename from Kattbot/Helpers/DateTimeProvider.cs
rename to src/Kattbot/Helpers/DateTimeProvider.cs
diff --git a/Kattbot/Helpers/DiscordConstants.cs b/src/Kattbot/Helpers/DiscordConstants.cs
similarity index 100%
rename from Kattbot/Helpers/DiscordConstants.cs
rename to src/Kattbot/Helpers/DiscordConstants.cs
diff --git a/Kattbot/Helpers/DiscordExtensions.cs b/src/Kattbot/Helpers/DiscordExtensions.cs
similarity index 100%
rename from Kattbot/Helpers/DiscordExtensions.cs
rename to src/Kattbot/Helpers/DiscordExtensions.cs
diff --git a/Kattbot/Helpers/DiscordResolver.cs b/src/Kattbot/Helpers/DiscordResolver.cs
similarity index 100%
rename from Kattbot/Helpers/DiscordResolver.cs
rename to src/Kattbot/Helpers/DiscordResolver.cs
diff --git a/Kattbot/Helpers/EmbedBuilderHelper.cs b/src/Kattbot/Helpers/EmbedBuilderHelper.cs
similarity index 100%
rename from Kattbot/Helpers/EmbedBuilderHelper.cs
rename to src/Kattbot/Helpers/EmbedBuilderHelper.cs
diff --git a/Kattbot/Helpers/EmojiMap.cs b/src/Kattbot/Helpers/EmojiMap.cs
similarity index 100%
rename from Kattbot/Helpers/EmojiMap.cs
rename to src/Kattbot/Helpers/EmojiMap.cs
diff --git a/Kattbot/Helpers/EmoteHelper.cs b/src/Kattbot/Helpers/EmoteHelper.cs
similarity index 100%
rename from Kattbot/Helpers/EmoteHelper.cs
rename to src/Kattbot/Helpers/EmoteHelper.cs
diff --git a/Kattbot/Helpers/TryResolveResult.cs b/src/Kattbot/Helpers/TryResolveResult.cs
similarity index 100%
rename from Kattbot/Helpers/TryResolveResult.cs
rename to src/Kattbot/Helpers/TryResolveResult.cs
diff --git a/Kattbot/Infrastructure/CommandRequestPipelineBehaviour.cs b/src/Kattbot/Infrastructure/CommandRequestPipelineBehaviour.cs
similarity index 100%
rename from Kattbot/Infrastructure/CommandRequestPipelineBehaviour.cs
rename to src/Kattbot/Infrastructure/CommandRequestPipelineBehaviour.cs
diff --git a/Kattbot/Infrastructure/NoWayGateway.cs b/src/Kattbot/Infrastructure/NoWayGateway.cs
similarity index 100%
rename from Kattbot/Infrastructure/NoWayGateway.cs
rename to src/Kattbot/Infrastructure/NoWayGateway.cs
diff --git a/Kattbot/Infrastructure/NotificationMediator.cs b/src/Kattbot/Infrastructure/NotificationMediator.cs
similarity index 100%
rename from Kattbot/Infrastructure/NotificationMediator.cs
rename to src/Kattbot/Infrastructure/NotificationMediator.cs
diff --git a/Kattbot/Infrastructure/NotificationPublisher.cs b/src/Kattbot/Infrastructure/NotificationPublisher.cs
similarity index 100%
rename from Kattbot/Infrastructure/NotificationPublisher.cs
rename to src/Kattbot/Infrastructure/NotificationPublisher.cs
diff --git a/Kattbot/Infrastructure/ServiceCollectionExtensions.cs b/src/Kattbot/Infrastructure/ServiceCollectionExtensions.cs
similarity index 100%
rename from Kattbot/Infrastructure/ServiceCollectionExtensions.cs
rename to src/Kattbot/Infrastructure/ServiceCollectionExtensions.cs
diff --git a/Kattbot/Kattbot.csproj b/src/Kattbot/Kattbot.csproj
similarity index 100%
rename from Kattbot/Kattbot.csproj
rename to src/Kattbot/Kattbot.csproj
diff --git a/Kattbot/NotificationHandlers/BaseNotificationHandler.cs b/src/Kattbot/NotificationHandlers/BaseNotificationHandler.cs
similarity index 100%
rename from Kattbot/NotificationHandlers/BaseNotificationHandler.cs
rename to src/Kattbot/NotificationHandlers/BaseNotificationHandler.cs
diff --git a/Kattbot/NotificationHandlers/Emotes/MessageCreatedNotificationHandler.cs b/src/Kattbot/NotificationHandlers/Emotes/MessageCreatedNotificationHandler.cs
similarity index 100%
rename from Kattbot/NotificationHandlers/Emotes/MessageCreatedNotificationHandler.cs
rename to src/Kattbot/NotificationHandlers/Emotes/MessageCreatedNotificationHandler.cs
diff --git a/Kattbot/NotificationHandlers/Emotes/MessageDeletedNotificationHandler.cs b/src/Kattbot/NotificationHandlers/Emotes/MessageDeletedNotificationHandler.cs
similarity index 100%
rename from Kattbot/NotificationHandlers/Emotes/MessageDeletedNotificationHandler.cs
rename to src/Kattbot/NotificationHandlers/Emotes/MessageDeletedNotificationHandler.cs
diff --git a/Kattbot/NotificationHandlers/Emotes/MessageReactionAddedNotificationHandler.cs b/src/Kattbot/NotificationHandlers/Emotes/MessageReactionAddedNotificationHandler.cs
similarity index 100%
rename from Kattbot/NotificationHandlers/Emotes/MessageReactionAddedNotificationHandler.cs
rename to src/Kattbot/NotificationHandlers/Emotes/MessageReactionAddedNotificationHandler.cs
diff --git a/Kattbot/NotificationHandlers/Emotes/MessageReactionRemovedNotificationHandler.cs b/src/Kattbot/NotificationHandlers/Emotes/MessageReactionRemovedNotificationHandler.cs
similarity index 100%
rename from Kattbot/NotificationHandlers/Emotes/MessageReactionRemovedNotificationHandler.cs
rename to src/Kattbot/NotificationHandlers/Emotes/MessageReactionRemovedNotificationHandler.cs
diff --git a/Kattbot/NotificationHandlers/Emotes/MessageUpdatedNotificationHandler.cs b/src/Kattbot/NotificationHandlers/Emotes/MessageUpdatedNotificationHandler.cs
similarity index 100%
rename from Kattbot/NotificationHandlers/Emotes/MessageUpdatedNotificationHandler.cs
rename to src/Kattbot/NotificationHandlers/Emotes/MessageUpdatedNotificationHandler.cs
diff --git a/Kattbot/NotificationHandlers/EventContext.cs b/src/Kattbot/NotificationHandlers/EventContext.cs
similarity index 100%
rename from Kattbot/NotificationHandlers/EventContext.cs
rename to src/Kattbot/NotificationHandlers/EventContext.cs
diff --git a/Kattbot/NotificationHandlers/EventNotifications.cs b/src/Kattbot/NotificationHandlers/EventNotifications.cs
similarity index 100%
rename from Kattbot/NotificationHandlers/EventNotifications.cs
rename to src/Kattbot/NotificationHandlers/EventNotifications.cs
diff --git a/Kattbot/NotificationHandlers/KattGptMessageHandler.cs b/src/Kattbot/NotificationHandlers/KattGptMessageHandler.cs
similarity index 100%
rename from Kattbot/NotificationHandlers/KattGptMessageHandler.cs
rename to src/Kattbot/NotificationHandlers/KattGptMessageHandler.cs
diff --git a/Kattbot/Program.cs b/src/Kattbot/Program.cs
similarity index 100%
rename from Kattbot/Program.cs
rename to src/Kattbot/Program.cs
diff --git a/Kattbot/Properties/launchSettings.json b/src/Kattbot/Properties/launchSettings.json
similarity index 100%
rename from Kattbot/Properties/launchSettings.json
rename to src/Kattbot/Properties/launchSettings.json
diff --git a/Kattbot/Resources/pet_sprite_sheet.png b/src/Kattbot/Resources/pet_sprite_sheet.png
similarity index 100%
rename from Kattbot/Resources/pet_sprite_sheet.png
rename to src/Kattbot/Resources/pet_sprite_sheet.png
diff --git a/Kattbot/Services/Cache/CacheQueue.cs b/src/Kattbot/Services/Cache/CacheQueue.cs
similarity index 100%
rename from Kattbot/Services/Cache/CacheQueue.cs
rename to src/Kattbot/Services/Cache/CacheQueue.cs
diff --git a/Kattbot/Services/Cache/SharedCache.cs b/src/Kattbot/Services/Cache/SharedCache.cs
similarity index 100%
rename from Kattbot/Services/Cache/SharedCache.cs
rename to src/Kattbot/Services/Cache/SharedCache.cs
diff --git a/Kattbot/Services/Cache/SimpleMemoryCache.cs b/src/Kattbot/Services/Cache/SimpleMemoryCache.cs
similarity index 100%
rename from Kattbot/Services/Cache/SimpleMemoryCache.cs
rename to src/Kattbot/Services/Cache/SimpleMemoryCache.cs
diff --git a/Kattbot/Services/Dalle/DalleHttpClient.cs b/src/Kattbot/Services/Dalle/DalleHttpClient.cs
similarity index 100%
rename from Kattbot/Services/Dalle/DalleHttpClient.cs
rename to src/Kattbot/Services/Dalle/DalleHttpClient.cs
diff --git a/Kattbot/Services/Dalle/DalleModels.cs b/src/Kattbot/Services/Dalle/DalleModels.cs
similarity index 100%
rename from Kattbot/Services/Dalle/DalleModels.cs
rename to src/Kattbot/Services/Dalle/DalleModels.cs
diff --git a/Kattbot/Services/DiscordErrorLogger.cs b/src/Kattbot/Services/DiscordErrorLogger.cs
similarity index 100%
rename from Kattbot/Services/DiscordErrorLogger.cs
rename to src/Kattbot/Services/DiscordErrorLogger.cs
diff --git a/Kattbot/Services/EmoteEntityBuilder.cs b/src/Kattbot/Services/EmoteEntityBuilder.cs
similarity index 100%
rename from Kattbot/Services/EmoteEntityBuilder.cs
rename to src/Kattbot/Services/EmoteEntityBuilder.cs
diff --git a/Kattbot/Services/EmoteParser.cs b/src/Kattbot/Services/EmoteParser.cs
similarity index 100%
rename from Kattbot/Services/EmoteParser.cs
rename to src/Kattbot/Services/EmoteParser.cs
diff --git a/Kattbot/Services/GuildSettingsService.cs b/src/Kattbot/Services/GuildSettingsService.cs
similarity index 100%
rename from Kattbot/Services/GuildSettingsService.cs
rename to src/Kattbot/Services/GuildSettingsService.cs
diff --git a/Kattbot/Services/Images/ImageEffects.cs b/src/Kattbot/Services/Images/ImageEffects.cs
similarity index 100%
rename from Kattbot/Services/Images/ImageEffects.cs
rename to src/Kattbot/Services/Images/ImageEffects.cs
diff --git a/Kattbot/Services/Images/ImageMetadataExtensions.cs b/src/Kattbot/Services/Images/ImageMetadataExtensions.cs
similarity index 100%
rename from Kattbot/Services/Images/ImageMetadataExtensions.cs
rename to src/Kattbot/Services/Images/ImageMetadataExtensions.cs
diff --git a/Kattbot/Services/Images/ImageOperations.cs b/src/Kattbot/Services/Images/ImageOperations.cs
similarity index 100%
rename from Kattbot/Services/Images/ImageOperations.cs
rename to src/Kattbot/Services/Images/ImageOperations.cs
diff --git a/Kattbot/Services/Images/ImageService.cs b/src/Kattbot/Services/Images/ImageService.cs
similarity index 100%
rename from Kattbot/Services/Images/ImageService.cs
rename to src/Kattbot/Services/Images/ImageService.cs
diff --git a/Kattbot/Services/KattGpt/ChatGptClient.cs b/src/Kattbot/Services/KattGpt/ChatGptClient.cs
similarity index 100%
rename from Kattbot/Services/KattGpt/ChatGptClient.cs
rename to src/Kattbot/Services/KattGpt/ChatGptClient.cs
diff --git a/Kattbot/Services/KattGpt/DalleToolBuilder.cs b/src/Kattbot/Services/KattGpt/DalleToolBuilder.cs
similarity index 100%
rename from Kattbot/Services/KattGpt/DalleToolBuilder.cs
rename to src/Kattbot/Services/KattGpt/DalleToolBuilder.cs
diff --git a/Kattbot/Services/KattGpt/KattGptCache.cs b/src/Kattbot/Services/KattGpt/KattGptCache.cs
similarity index 100%
rename from Kattbot/Services/KattGpt/KattGptCache.cs
rename to src/Kattbot/Services/KattGpt/KattGptCache.cs
diff --git a/Kattbot/Services/KattGpt/KattGptChannelContext.cs b/src/Kattbot/Services/KattGpt/KattGptChannelContext.cs
similarity index 100%
rename from Kattbot/Services/KattGpt/KattGptChannelContext.cs
rename to src/Kattbot/Services/KattGpt/KattGptChannelContext.cs
diff --git a/Kattbot/Services/KattGpt/KattGptService.cs b/src/Kattbot/Services/KattGpt/KattGptService.cs
similarity index 100%
rename from Kattbot/Services/KattGpt/KattGptService.cs
rename to src/Kattbot/Services/KattGpt/KattGptService.cs
diff --git a/Kattbot/Services/KattGpt/KattGptTokenizer.cs b/src/Kattbot/Services/KattGpt/KattGptTokenizer.cs
similarity index 100%
rename from Kattbot/Services/KattGpt/KattGptTokenizer.cs
rename to src/Kattbot/Services/KattGpt/KattGptTokenizer.cs
diff --git a/Kattbot/Services/Speech/SpeechHttpClient.cs b/src/Kattbot/Services/Speech/SpeechHttpClient.cs
similarity index 100%
rename from Kattbot/Services/Speech/SpeechHttpClient.cs
rename to src/Kattbot/Services/Speech/SpeechHttpClient.cs
diff --git a/Kattbot/Services/Speech/SpeechModels.cs b/src/Kattbot/Services/Speech/SpeechModels.cs
similarity index 100%
rename from Kattbot/Services/Speech/SpeechModels.cs
rename to src/Kattbot/Services/Speech/SpeechModels.cs
diff --git a/Kattbot/Workers/BotWorker.cs b/src/Kattbot/Workers/BotWorker.cs
similarity index 100%
rename from Kattbot/Workers/BotWorker.cs
rename to src/Kattbot/Workers/BotWorker.cs
diff --git a/Kattbot/Workers/Channels.cs b/src/Kattbot/Workers/Channels.cs
similarity index 100%
rename from Kattbot/Workers/Channels.cs
rename to src/Kattbot/Workers/Channels.cs
diff --git a/Kattbot/Workers/CommandQueueWorker.cs b/src/Kattbot/Workers/CommandQueueWorker.cs
similarity index 100%
rename from Kattbot/Workers/CommandQueueWorker.cs
rename to src/Kattbot/Workers/CommandQueueWorker.cs
diff --git a/Kattbot/Workers/DiscordLoggerWorker.cs b/src/Kattbot/Workers/DiscordLoggerWorker.cs
similarity index 100%
rename from Kattbot/Workers/DiscordLoggerWorker.cs
rename to src/Kattbot/Workers/DiscordLoggerWorker.cs
diff --git a/Kattbot/Workers/EventQueueWorker.cs b/src/Kattbot/Workers/EventQueueWorker.cs
similarity index 100%
rename from Kattbot/Workers/EventQueueWorker.cs
rename to src/Kattbot/Workers/EventQueueWorker.cs
diff --git a/Kattbot/appsettings.Development.json b/src/Kattbot/appsettings.Development.json
similarity index 100%
rename from Kattbot/appsettings.Development.json
rename to src/Kattbot/appsettings.Development.json
diff --git a/Kattbot/appsettings.json b/src/Kattbot/appsettings.json
similarity index 100%
rename from Kattbot/appsettings.json
rename to src/Kattbot/appsettings.json
diff --git a/src/Kattbot/prod.Dockerfile b/src/Kattbot/prod.Dockerfile
new file mode 100644
index 0000000..e028004
--- /dev/null
+++ b/src/Kattbot/prod.Dockerfile
@@ -0,0 +1,35 @@
+FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
+ARG BUILD_CONFIGURATION=Release
+WORKDIR /src
+COPY ["Directory.Build.props", "."]
+COPY ["src/Kattbot/Kattbot.csproj", "Kattbot/"]
+COPY ["src/Kattbot.Common/Kattbot.Common.csproj", "Kattbot.Common/"]
+COPY ["src/Kattbot.Data/Kattbot.Data.csproj", "Kattbot.Data/"]
+COPY ["src/Kattbot.Data.Migrations/Kattbot.Data.Migrations.csproj", "Kattbot.Data.Migrations/"]
+COPY [".config/dotnet-tools.json", ".config/"]
+RUN dotnet restore "./Kattbot/Kattbot.csproj"
+RUN dotnet restore "./Kattbot.Data.Migrations/Kattbot.Data.Migrations.csproj"
+RUN dotnet tool restore
+COPY ["Kattbot.sln", "."]
+COPY ["stylecop.json", "."]
+COPY [".editorconfig", "."]
+COPY ["scripts/kattbot-backup-db.sh", "."]
+COPY src .
+RUN dotnet build "./Kattbot/Kattbot.csproj" --no-restore -c $BUILD_CONFIGURATION
+RUN dotnet build "./Kattbot.Data.Migrations/Kattbot.Data.Migrations.csproj" --no-restore -c $BUILD_CONFIGURATION
+
+FROM build AS publish
+ARG BUILD_CONFIGURATION=Release
+RUN dotnet publish "./Kattbot/Kattbot.csproj" --no-build -c $BUILD_CONFIGURATION -o /output/publish /p:UseAppHost=false
+
+FROM build AS migrations
+ARG BUILD_CONFIGURATION=Release
+RUN dotnet ef migrations script --no-build --configuration $BUILD_CONFIGURATION --idempotent -p Kattbot.Data.Migrations -o /output/migrations/database_migration.sql
+COPY --from=build /src/kattbot-backup-db.sh /output/migrations/
+
+FROM mcr.microsoft.com/dotnet/runtime:8.0 AS final
+WORKDIR /app
+COPY --from=publish /output/publish .
+COPY --from=migrations /output/migrations ./migrations/
+USER $APP_UID
+ENTRYPOINT ["dotnet", "Kattbot.dll"]
diff --git a/Kattbot.Tests/EmoteParserTests.cs b/tests/Kattbot.Tests/EmoteParserTests.cs
similarity index 100%
rename from Kattbot.Tests/EmoteParserTests.cs
rename to tests/Kattbot.Tests/EmoteParserTests.cs
diff --git a/Kattbot.Tests/ImageTests.cs b/tests/Kattbot.Tests/ImageTests.cs
similarity index 100%
rename from Kattbot.Tests/ImageTests.cs
rename to tests/Kattbot.Tests/ImageTests.cs
diff --git a/Kattbot.Tests/Kattbot.Tests.csproj b/tests/Kattbot.Tests/Kattbot.Tests.csproj
similarity index 95%
rename from Kattbot.Tests/Kattbot.Tests.csproj
rename to tests/Kattbot.Tests/Kattbot.Tests.csproj
index 484bd04..fe842df 100644
--- a/Kattbot.Tests/Kattbot.Tests.csproj
+++ b/tests/Kattbot.Tests/Kattbot.Tests.csproj
@@ -23,7 +23,7 @@
-
+
diff --git a/Kattbot.Tests/Resources/froge.png b/tests/Kattbot.Tests/Resources/froge.png
similarity index 100%
rename from Kattbot.Tests/Resources/froge.png
rename to tests/Kattbot.Tests/Resources/froge.png
diff --git a/Kattbot.Tests/StringExtensionsTests.cs b/tests/Kattbot.Tests/StringExtensionsTests.cs
similarity index 100%
rename from Kattbot.Tests/StringExtensionsTests.cs
rename to tests/Kattbot.Tests/StringExtensionsTests.cs