Latest commit

History

175 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ScoreCounter (Poängräknaren)

.NETC#ASP.NET CoreBlazor WebAssemblyAzureAzure SQLAzure Key VaultAzure SQL DatabaseSignalREntity Framework CoreLicense

Beskrivning

ScoreCounter är en realtidsapplikation för att skapa och hantera matcher med spelare och poäng.

Systemet låter användare skapa matcher, lägga till spelare och uppdatera poäng i realtid med hjälp av SignalR. Alla ändringar uppdateras direkt i alla anslutna klienter.

Systemet låter användare:

  • Skapa matcher med valfritt spelnamn, startpoäng, målpoäng och max spelare
  • Välja "högst poäng vinner" eller "lägst poäng vinner"
  • Lägga till och ta bort spelare (med bekräftelsedialog)
  • Uppdatera poäng i realtid med knappar (-1, -5, +1, +5) eller anpassad poäng
  • Se poänghistorik per spelare med tid, ändring och poäng
  • Klona eller återställa matcher
  • Avsluta matcher och visa resultat med vinnare eller oavgjort (draw)
  • Dela matcher via QR-kod
  • Följa uppdateringar direkt via SignalR på alla enheter

Funktioner

Matchhantering

  • Skapa match med valfritt spelnamn
  • Sätta max antal spelare (med validering)
  • Sätta målpoäng (Max Score) som visas på matchen
  • Låsa möjligheten att lägga till fler spelare
  • Avsluta match
  • Klona match (behåller spelare, inställningar och poäng)
  • Reset match till ursprungsläge
  • Resultat-popup med vinnare, oavgjort (draw) och fullständig placeringstabell
  • QR-kodsdelning för att gå direkt till matchen
  • Kopiera matchlänk

Spelare

  • Lägg till spelare
  • Ta bort spelare (med bekräftelsedialog)
  • Ta bort spelare direkt i Create Game-vyn
  • Byt namn (uppdateras även i poänghistoriken)
  • Kontroll av duplicerade namn
  • Max Players-validering — kan inte sänkas under antal tillagda spelare

Poängsystem

  • Öka poäng (+1, +5)
  • Minska poäng (-1, -5)
  • Anpassad poängändring (ange valfritt antal)
  • Optimistisk UI-uppdatering — poängen visas direkt, återställs vid fel
  • Realtidsuppdatering

Poänghistorik

  • Alla poängändringar sparas i databasen (ScoreEntry)
  • Historik visas grupperad per spelare med tid, ändring och poäng (före → efter)
  • Uppdateras i realtid via SignalR
  • Historik rensas automatiskt när spelare tas bort
  • Namnbyte uppdateras i historiken

Gränssnitt

  • Dark / Light mode
  • Responsiv design (mobil, tablet, desktop)
  • Global loading spinner vid alla HTTP-anrop
  • Statusmeddelanden i färgad bar
  • Score-knappar med anpassat mörkt tema

Realtid (SignalR)

  • ScoreChanged
  • ScoreHistoryEntry
  • PlayerAdded
  • PlayerRemoved
  • PlayerRenamed
  • ScoreHistoryRenamed
  • PlayerHistoryRemoved
  • MatchFinished
  • MatchReset

Arkitektur

Projektet är uppdelat i tre huvuddelar:

Backend

  • ASP.NET Core Minimal API
  • SignalR Hub
  • Entity Framework Core
  • MatchStore
  • SQLite (development)
  • SQL Server (production / Azure)

Frontend

  • Blazor WebAssembly
  • SignalR
  • Responsiv UI
  • Sidebar navigation
  • Realtidsuppdatering
  • QR-kodsgenerering via QRCoder

Shared

  • Delade modeller (GameMatch, GamePlayer, ScoreEntry)
  • DTOs (Data Transfer Objects)
  • Gemensamma regler och kontrakt
  • Säkerställer att backend och frontend använder samma datastruktur

API Endpoints

Match

  • GET /api/match/{id} → Hämta match
  • POST /api/match → Skapa match
  • POST /api/match/{id}/reset → Reset match
  • POST /api/match/{id}/clone → Klona match
  • POST /api/match/{id}/finish → Avsluta match
  • GET /api/match/{id}/history → Hämta poänghistorik

Spelare

  • POST /api/match/{id}/player → Lägg till spelare
  • PUT /api/match/{id}/player/{playerId}/score → Uppdatera poäng
  • PUT /api/match/{id}/player/{playerId}/name → Byt namn
  • DELETE /api/match/{id}/player/{playerId} → Ta bort spelare

SignalR Hub

Endpoint: /matchevents


Flöde i systemet

  • Skapa match
  • Lägg till spelare
  • Anslut klienter via SignalR
  • Uppdatera poäng
  • Realtidsuppdatering till alla klienter
  • Poänghistorik sparas och synkas
  • Avsluta eller reset match

Så här kör du programmet

cd Backend
dotnet run

Konfiguration

  • Lokal databas (development): Data Source=scorecounter.db
  • Produktion:
    • Azure SQL Server
    • Azure Key Vault (hemlighet: SqlScoreCounterConnectionString)

Publicering till Azure Portal

Programmet är förberett för att hostas på Microsoft Azure. Följ dessa steg för att sätta upp allt via Azure Portal:

  1. Skapa en Azure SQL-databas

    • Gå till Azure Portal och skapa en SQL Database och en SQL Server.
    • Spara anslutningssträngen (Connection String) för databasen.
  2. Skapa en Azure Key Vault

    • Skapa en Key Vault i samma resource group.
    • Lägg till en hemlighet (Secret) med namnet SqlScoreCounterConnectionString och klistra in anslutningssträngen från din SQL-databas.
  3. Skapa en App Service för backend

    • Skapa en App Service.
    • Publicera backend-projektet till denna App Service (t.ex. via GitHub Actions eller ZIP deploy).
  4. Aktivera Managed Identity för App Service

    • Gå till App Service > Identity > System assigned > Sätt till "On" och spara.
  5. Ge Key Vault access till App Service

    • Gå till Key Vault > Access control (IAM) > Lägg till rolltilldelning.
    • Välj rollen "Key Vault Secrets User" och välj din App Service som principal.

Deploya med skript

.\deploy.ps1

Skriptet bygger både Frontend och Backend, publicerar och deployar via ZIP.


Tekniker

  • ASP.NET Core
  • Blazor WebAssembly
  • SignalR
  • Entity Framework Core
  • SQLite / SQL Server
  • Azure
  • QRCoder

Utvecklare

  • Alaa Alsous
  • Astrid Skoglund
  • Andreas Fransson
  • Daniel Viklund

About

Modern realtidsbaserad poängräknare byggd med ASP.NET Core, Blazor WebAssembly och SignalR. Hantera matcher, spelare och livepoäng med stöd för SQLite, SQL Server och Azure-integration.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

175 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ScoreCounter (Poängräknaren)

.NETC#ASP.NET CoreBlazor WebAssemblyAzureAzure SQLAzure Key VaultAzure SQL DatabaseSignalREntity Framework CoreLicense

Beskrivning

ScoreCounter är en realtidsapplikation för att skapa och hantera matcher med spelare och poäng.

Systemet låter användare skapa matcher, lägga till spelare och uppdatera poäng i realtid med hjälp av SignalR. Alla ändringar uppdateras direkt i alla anslutna klienter.

Systemet låter användare:

  • Skapa matcher med valfritt spelnamn, startpoäng, målpoäng och max spelare
  • Välja "högst poäng vinner" eller "lägst poäng vinner"
  • Lägga till och ta bort spelare (med bekräftelsedialog)
  • Uppdatera poäng i realtid med knappar (-1, -5, +1, +5) eller anpassad poäng
  • Se poänghistorik per spelare med tid, ändring och poäng
  • Klona eller återställa matcher
  • Avsluta matcher och visa resultat med vinnare eller oavgjort (draw)
  • Dela matcher via QR-kod
  • Följa uppdateringar direkt via SignalR på alla enheter

Funktioner

Matchhantering

  • Skapa match med valfritt spelnamn
  • Sätta max antal spelare (med validering)
  • Sätta målpoäng (Max Score) som visas på matchen
  • Låsa möjligheten att lägga till fler spelare
  • Avsluta match
  • Klona match (behåller spelare, inställningar och poäng)
  • Reset match till ursprungsläge
  • Resultat-popup med vinnare, oavgjort (draw) och fullständig placeringstabell
  • QR-kodsdelning för att gå direkt till matchen
  • Kopiera matchlänk

Spelare

  • Lägg till spelare
  • Ta bort spelare (med bekräftelsedialog)
  • Ta bort spelare direkt i Create Game-vyn
  • Byt namn (uppdateras även i poänghistoriken)
  • Kontroll av duplicerade namn
  • Max Players-validering — kan inte sänkas under antal tillagda spelare

Poängsystem

  • Öka poäng (+1, +5)
  • Minska poäng (-1, -5)
  • Anpassad poängändring (ange valfritt antal)
  • Optimistisk UI-uppdatering — poängen visas direkt, återställs vid fel
  • Realtidsuppdatering

Poänghistorik

  • Alla poängändringar sparas i databasen (ScoreEntry)
  • Historik visas grupperad per spelare med tid, ändring och poäng (före → efter)
  • Uppdateras i realtid via SignalR
  • Historik rensas automatiskt när spelare tas bort
  • Namnbyte uppdateras i historiken

Gränssnitt

  • Dark / Light mode
  • Responsiv design (mobil, tablet, desktop)
  • Global loading spinner vid alla HTTP-anrop
  • Statusmeddelanden i färgad bar
  • Score-knappar med anpassat mörkt tema

Realtid (SignalR)

  • ScoreChanged
  • ScoreHistoryEntry
  • PlayerAdded
  • PlayerRemoved
  • PlayerRenamed
  • ScoreHistoryRenamed
  • PlayerHistoryRemoved
  • MatchFinished
  • MatchReset

Arkitektur

Projektet är uppdelat i tre huvuddelar:

Backend

  • ASP.NET Core Minimal API
  • SignalR Hub
  • Entity Framework Core
  • MatchStore
  • SQLite (development)
  • SQL Server (production / Azure)

Frontend

  • Blazor WebAssembly
  • SignalR
  • Responsiv UI
  • Sidebar navigation
  • Realtidsuppdatering
  • QR-kodsgenerering via QRCoder

Shared

  • Delade modeller (GameMatch, GamePlayer, ScoreEntry)
  • DTOs (Data Transfer Objects)
  • Gemensamma regler och kontrakt
  • Säkerställer att backend och frontend använder samma datastruktur

API Endpoints

Match

  • GET /api/match/{id} → Hämta match
  • POST /api/match → Skapa match
  • POST /api/match/{id}/reset → Reset match
  • POST /api/match/{id}/clone → Klona match
  • POST /api/match/{id}/finish → Avsluta match
  • GET /api/match/{id}/history → Hämta poänghistorik

Spelare

  • POST /api/match/{id}/player → Lägg till spelare
  • PUT /api/match/{id}/player/{playerId}/score → Uppdatera poäng
  • PUT /api/match/{id}/player/{playerId}/name → Byt namn
  • DELETE /api/match/{id}/player/{playerId} → Ta bort spelare

SignalR Hub

Endpoint: /matchevents


Flöde i systemet

  • Skapa match
  • Lägg till spelare
  • Anslut klienter via SignalR
  • Uppdatera poäng
  • Realtidsuppdatering till alla klienter
  • Poänghistorik sparas och synkas
  • Avsluta eller reset match

Så här kör du programmet

cd Backend
dotnet run

Konfiguration

  • Lokal databas (development): Data Source=scorecounter.db
  • Produktion:
    • Azure SQL Server
    • Azure Key Vault (hemlighet: SqlScoreCounterConnectionString)

Publicering till Azure Portal

Programmet är förberett för att hostas på Microsoft Azure. Följ dessa steg för att sätta upp allt via Azure Portal:

  1. Skapa en Azure SQL-databas

    • Gå till Azure Portal och skapa en SQL Database och en SQL Server.
    • Spara anslutningssträngen (Connection String) för databasen.
  2. Skapa en Azure Key Vault

    • Skapa en Key Vault i samma resource group.
    • Lägg till en hemlighet (Secret) med namnet SqlScoreCounterConnectionString och klistra in anslutningssträngen från din SQL-databas.
  3. Skapa en App Service för backend

    • Skapa en App Service.
    • Publicera backend-projektet till denna App Service (t.ex. via GitHub Actions eller ZIP deploy).
  4. Aktivera Managed Identity för App Service

    • Gå till App Service > Identity > System assigned > Sätt till "On" och spara.
  5. Ge Key Vault access till App Service

    • Gå till Key Vault > Access control (IAM) > Lägg till rolltilldelning.
    • Välj rollen "Key Vault Secrets User" och välj din App Service som principal.

Deploya med skript

.\deploy.ps1

Skriptet bygger både Frontend och Backend, publicerar och deployar via ZIP.


Tekniker

  • ASP.NET Core
  • Blazor WebAssembly
  • SignalR
  • Entity Framework Core
  • SQLite / SQL Server
  • Azure
  • QRCoder

Utvecklare

  • Alaa Alsous
  • Astrid Skoglund
  • Andreas Fransson
  • Daniel Viklund

About

Modern realtidsbaserad poängräknare byggd med ASP.NET Core, Blazor WebAssembly och SignalR. Hantera matcher, spelare och livepoäng med stöd för SQLite, SQL Server och Azure-integration.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

175 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ScoreCounter (Poängräknaren)

.NETC#ASP.NET CoreBlazor WebAssemblyAzureAzure SQLAzure Key VaultAzure SQL DatabaseSignalREntity Framework CoreLicense

Beskrivning

ScoreCounter är en realtidsapplikation för att skapa och hantera matcher med spelare och poäng.

Systemet låter användare skapa matcher, lägga till spelare och uppdatera poäng i realtid med hjälp av SignalR. Alla ändringar uppdateras direkt i alla anslutna klienter.

Systemet låter användare:

  • Skapa matcher med valfritt spelnamn, startpoäng, målpoäng och max spelare
  • Välja "högst poäng vinner" eller "lägst poäng vinner"
  • Lägga till och ta bort spelare (med bekräftelsedialog)
  • Uppdatera poäng i realtid med knappar (-1, -5, +1, +5) eller anpassad poäng
  • Se poänghistorik per spelare med tid, ändring och poäng
  • Klona eller återställa matcher
  • Avsluta matcher och visa resultat med vinnare eller oavgjort (draw)
  • Dela matcher via QR-kod
  • Följa uppdateringar direkt via SignalR på alla enheter

Funktioner

Matchhantering

  • Skapa match med valfritt spelnamn
  • Sätta max antal spelare (med validering)
  • Sätta målpoäng (Max Score) som visas på matchen
  • Låsa möjligheten att lägga till fler spelare
  • Avsluta match
  • Klona match (behåller spelare, inställningar och poäng)
  • Reset match till ursprungsläge
  • Resultat-popup med vinnare, oavgjort (draw) och fullständig placeringstabell
  • QR-kodsdelning för att gå direkt till matchen
  • Kopiera matchlänk

Spelare

  • Lägg till spelare
  • Ta bort spelare (med bekräftelsedialog)
  • Ta bort spelare direkt i Create Game-vyn
  • Byt namn (uppdateras även i poänghistoriken)
  • Kontroll av duplicerade namn
  • Max Players-validering — kan inte sänkas under antal tillagda spelare

Poängsystem

  • Öka poäng (+1, +5)
  • Minska poäng (-1, -5)
  • Anpassad poängändring (ange valfritt antal)
  • Optimistisk UI-uppdatering — poängen visas direkt, återställs vid fel
  • Realtidsuppdatering

Poänghistorik

  • Alla poängändringar sparas i databasen (ScoreEntry)
  • Historik visas grupperad per spelare med tid, ändring och poäng (före → efter)
  • Uppdateras i realtid via SignalR
  • Historik rensas automatiskt när spelare tas bort
  • Namnbyte uppdateras i historiken

Gränssnitt

  • Dark / Light mode
  • Responsiv design (mobil, tablet, desktop)
  • Global loading spinner vid alla HTTP-anrop
  • Statusmeddelanden i färgad bar
  • Score-knappar med anpassat mörkt tema

Realtid (SignalR)

  • ScoreChanged
  • ScoreHistoryEntry
  • PlayerAdded
  • PlayerRemoved
  • PlayerRenamed
  • ScoreHistoryRenamed
  • PlayerHistoryRemoved
  • MatchFinished
  • MatchReset

Arkitektur

Projektet är uppdelat i tre huvuddelar:

Backend

  • ASP.NET Core Minimal API
  • SignalR Hub
  • Entity Framework Core
  • MatchStore
  • SQLite (development)
  • SQL Server (production / Azure)

Frontend

  • Blazor WebAssembly
  • SignalR
  • Responsiv UI
  • Sidebar navigation
  • Realtidsuppdatering
  • QR-kodsgenerering via QRCoder

Shared

  • Delade modeller (GameMatch, GamePlayer, ScoreEntry)
  • DTOs (Data Transfer Objects)
  • Gemensamma regler och kontrakt
  • Säkerställer att backend och frontend använder samma datastruktur

API Endpoints

Match

  • GET /api/match/{id} → Hämta match
  • POST /api/match → Skapa match
  • POST /api/match/{id}/reset → Reset match
  • POST /api/match/{id}/clone → Klona match
  • POST /api/match/{id}/finish → Avsluta match
  • GET /api/match/{id}/history → Hämta poänghistorik

Spelare

  • POST /api/match/{id}/player → Lägg till spelare
  • PUT /api/match/{id}/player/{playerId}/score → Uppdatera poäng
  • PUT /api/match/{id}/player/{playerId}/name → Byt namn
  • DELETE /api/match/{id}/player/{playerId} → Ta bort spelare

SignalR Hub

Endpoint: /matchevents


Flöde i systemet

  • Skapa match
  • Lägg till spelare
  • Anslut klienter via SignalR
  • Uppdatera poäng
  • Realtidsuppdatering till alla klienter
  • Poänghistorik sparas och synkas
  • Avsluta eller reset match

Så här kör du programmet

cd Backend
dotnet run

Konfiguration

  • Lokal databas (development): Data Source=scorecounter.db
  • Produktion:
    • Azure SQL Server
    • Azure Key Vault (hemlighet: SqlScoreCounterConnectionString)

Publicering till Azure Portal

Programmet är förberett för att hostas på Microsoft Azure. Följ dessa steg för att sätta upp allt via Azure Portal:

  1. Skapa en Azure SQL-databas

    • Gå till Azure Portal och skapa en SQL Database och en SQL Server.
    • Spara anslutningssträngen (Connection String) för databasen.
  2. Skapa en Azure Key Vault

    • Skapa en Key Vault i samma resource group.
    • Lägg till en hemlighet (Secret) med namnet SqlScoreCounterConnectionString och klistra in anslutningssträngen från din SQL-databas.
  3. Skapa en App Service för backend

    • Skapa en App Service.
    • Publicera backend-projektet till denna App Service (t.ex. via GitHub Actions eller ZIP deploy).
  4. Aktivera Managed Identity för App Service

    • Gå till App Service > Identity > System assigned > Sätt till "On" och spara.
  5. Ge Key Vault access till App Service

    • Gå till Key Vault > Access control (IAM) > Lägg till rolltilldelning.
    • Välj rollen "Key Vault Secrets User" och välj din App Service som principal.

Deploya med skript

.\deploy.ps1

Skriptet bygger både Frontend och Backend, publicerar och deployar via ZIP.


Tekniker

  • ASP.NET Core
  • Blazor WebAssembly
  • SignalR
  • Entity Framework Core
  • SQLite / SQL Server
  • Azure
  • QRCoder

Utvecklare

  • Alaa Alsous
  • Astrid Skoglund
  • Andreas Fransson
  • Daniel Viklund

About

Modern realtidsbaserad poängräknare byggd med ASP.NET Core, Blazor WebAssembly och SignalR. Hantera matcher, spelare och livepoäng med stöd för SQLite, SQL Server och Azure-integration.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

175 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ScoreCounter (Poängräknaren)

.NETC#ASP.NET CoreBlazor WebAssemblyAzureAzure SQLAzure Key VaultAzure SQL DatabaseSignalREntity Framework CoreLicense

Beskrivning

ScoreCounter är en realtidsapplikation för att skapa och hantera matcher med spelare och poäng.

Systemet låter användare skapa matcher, lägga till spelare och uppdatera poäng i realtid med hjälp av SignalR. Alla ändringar uppdateras direkt i alla anslutna klienter.

Systemet låter användare:

  • Skapa matcher med valfritt spelnamn, startpoäng, målpoäng och max spelare
  • Välja "högst poäng vinner" eller "lägst poäng vinner"
  • Lägga till och ta bort spelare (med bekräftelsedialog)
  • Uppdatera poäng i realtid med knappar (-1, -5, +1, +5) eller anpassad poäng
  • Se poänghistorik per spelare med tid, ändring och poäng
  • Klona eller återställa matcher
  • Avsluta matcher och visa resultat med vinnare eller oavgjort (draw)
  • Dela matcher via QR-kod
  • Följa uppdateringar direkt via SignalR på alla enheter

Funktioner

Matchhantering

  • Skapa match med valfritt spelnamn
  • Sätta max antal spelare (med validering)
  • Sätta målpoäng (Max Score) som visas på matchen
  • Låsa möjligheten att lägga till fler spelare
  • Avsluta match
  • Klona match (behåller spelare, inställningar och poäng)
  • Reset match till ursprungsläge
  • Resultat-popup med vinnare, oavgjort (draw) och fullständig placeringstabell
  • QR-kodsdelning för att gå direkt till matchen
  • Kopiera matchlänk

Spelare

  • Lägg till spelare
  • Ta bort spelare (med bekräftelsedialog)
  • Ta bort spelare direkt i Create Game-vyn
  • Byt namn (uppdateras även i poänghistoriken)
  • Kontroll av duplicerade namn
  • Max Players-validering — kan inte sänkas under antal tillagda spelare

Poängsystem

  • Öka poäng (+1, +5)
  • Minska poäng (-1, -5)
  • Anpassad poängändring (ange valfritt antal)
  • Optimistisk UI-uppdatering — poängen visas direkt, återställs vid fel
  • Realtidsuppdatering

Poänghistorik

  • Alla poängändringar sparas i databasen (ScoreEntry)
  • Historik visas grupperad per spelare med tid, ändring och poäng (före → efter)
  • Uppdateras i realtid via SignalR
  • Historik rensas automatiskt när spelare tas bort
  • Namnbyte uppdateras i historiken

Gränssnitt

  • Dark / Light mode
  • Responsiv design (mobil, tablet, desktop)
  • Global loading spinner vid alla HTTP-anrop
  • Statusmeddelanden i färgad bar
  • Score-knappar med anpassat mörkt tema

Realtid (SignalR)

  • ScoreChanged
  • ScoreHistoryEntry
  • PlayerAdded
  • PlayerRemoved
  • PlayerRenamed
  • ScoreHistoryRenamed
  • PlayerHistoryRemoved
  • MatchFinished
  • MatchReset

Arkitektur

Projektet är uppdelat i tre huvuddelar:

Backend

  • ASP.NET Core Minimal API
  • SignalR Hub
  • Entity Framework Core
  • MatchStore
  • SQLite (development)
  • SQL Server (production / Azure)

Frontend

  • Blazor WebAssembly
  • SignalR
  • Responsiv UI
  • Sidebar navigation
  • Realtidsuppdatering
  • QR-kodsgenerering via QRCoder

Shared

  • Delade modeller (GameMatch, GamePlayer, ScoreEntry)
  • DTOs (Data Transfer Objects)
  • Gemensamma regler och kontrakt
  • Säkerställer att backend och frontend använder samma datastruktur

API Endpoints

Match

  • GET /api/match/{id} → Hämta match
  • POST /api/match → Skapa match
  • POST /api/match/{id}/reset → Reset match
  • POST /api/match/{id}/clone → Klona match
  • POST /api/match/{id}/finish → Avsluta match
  • GET /api/match/{id}/history → Hämta poänghistorik

Spelare

  • POST /api/match/{id}/player → Lägg till spelare
  • PUT /api/match/{id}/player/{playerId}/score → Uppdatera poäng
  • PUT /api/match/{id}/player/{playerId}/name → Byt namn
  • DELETE /api/match/{id}/player/{playerId} → Ta bort spelare

SignalR Hub

Endpoint: /matchevents


Flöde i systemet

  • Skapa match
  • Lägg till spelare
  • Anslut klienter via SignalR
  • Uppdatera poäng
  • Realtidsuppdatering till alla klienter
  • Poänghistorik sparas och synkas
  • Avsluta eller reset match

Så här kör du programmet

cd Backend
dotnet run

Konfiguration

  • Lokal databas (development): Data Source=scorecounter.db
  • Produktion:
    • Azure SQL Server
    • Azure Key Vault (hemlighet: SqlScoreCounterConnectionString)

Publicering till Azure Portal

Programmet är förberett för att hostas på Microsoft Azure. Följ dessa steg för att sätta upp allt via Azure Portal:

  1. Skapa en Azure SQL-databas

    • Gå till Azure Portal och skapa en SQL Database och en SQL Server.
    • Spara anslutningssträngen (Connection String) för databasen.
  2. Skapa en Azure Key Vault

    • Skapa en Key Vault i samma resource group.
    • Lägg till en hemlighet (Secret) med namnet SqlScoreCounterConnectionString och klistra in anslutningssträngen från din SQL-databas.
  3. Skapa en App Service för backend

    • Skapa en App Service.
    • Publicera backend-projektet till denna App Service (t.ex. via GitHub Actions eller ZIP deploy).
  4. Aktivera Managed Identity för App Service

    • Gå till App Service > Identity > System assigned > Sätt till "On" och spara.
  5. Ge Key Vault access till App Service

    • Gå till Key Vault > Access control (IAM) > Lägg till rolltilldelning.
    • Välj rollen "Key Vault Secrets User" och välj din App Service som principal.

Deploya med skript

.\deploy.ps1

Skriptet bygger både Frontend och Backend, publicerar och deployar via ZIP.


Tekniker

  • ASP.NET Core
  • Blazor WebAssembly
  • SignalR
  • Entity Framework Core
  • SQLite / SQL Server
  • Azure
  • QRCoder

Utvecklare

  • Alaa Alsous
  • Astrid Skoglund
  • Andreas Fransson
  • Daniel Viklund

About

Modern realtidsbaserad poängräknare byggd med ASP.NET Core, Blazor WebAssembly och SignalR. Hantera matcher, spelare och livepoäng med stöd för SQLite, SQL Server och Azure-integration.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

175 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ScoreCounter (Poängräknaren)

.NETC#ASP.NET CoreBlazor WebAssemblyAzureAzure SQLAzure Key VaultAzure SQL DatabaseSignalREntity Framework CoreLicense

Beskrivning

ScoreCounter är en realtidsapplikation för att skapa och hantera matcher med spelare och poäng.

Systemet låter användare skapa matcher, lägga till spelare och uppdatera poäng i realtid med hjälp av SignalR. Alla ändringar uppdateras direkt i alla anslutna klienter.

Systemet låter användare:

  • Skapa matcher med valfritt spelnamn, startpoäng, målpoäng och max spelare
  • Välja "högst poäng vinner" eller "lägst poäng vinner"
  • Lägga till och ta bort spelare (med bekräftelsedialog)
  • Uppdatera poäng i realtid med knappar (-1, -5, +1, +5) eller anpassad poäng
  • Se poänghistorik per spelare med tid, ändring och poäng
  • Klona eller återställa matcher
  • Avsluta matcher och visa resultat med vinnare eller oavgjort (draw)
  • Dela matcher via QR-kod
  • Följa uppdateringar direkt via SignalR på alla enheter

Funktioner

Matchhantering

  • Skapa match med valfritt spelnamn
  • Sätta max antal spelare (med validering)
  • Sätta målpoäng (Max Score) som visas på matchen
  • Låsa möjligheten att lägga till fler spelare
  • Avsluta match
  • Klona match (behåller spelare, inställningar och poäng)
  • Reset match till ursprungsläge
  • Resultat-popup med vinnare, oavgjort (draw) och fullständig placeringstabell
  • QR-kodsdelning för att gå direkt till matchen
  • Kopiera matchlänk

Spelare

  • Lägg till spelare
  • Ta bort spelare (med bekräftelsedialog)
  • Ta bort spelare direkt i Create Game-vyn
  • Byt namn (uppdateras även i poänghistoriken)
  • Kontroll av duplicerade namn
  • Max Players-validering — kan inte sänkas under antal tillagda spelare

Poängsystem

  • Öka poäng (+1, +5)
  • Minska poäng (-1, -5)
  • Anpassad poängändring (ange valfritt antal)
  • Optimistisk UI-uppdatering — poängen visas direkt, återställs vid fel
  • Realtidsuppdatering

Poänghistorik

  • Alla poängändringar sparas i databasen (ScoreEntry)
  • Historik visas grupperad per spelare med tid, ändring och poäng (före → efter)
  • Uppdateras i realtid via SignalR
  • Historik rensas automatiskt när spelare tas bort
  • Namnbyte uppdateras i historiken

Gränssnitt

  • Dark / Light mode
  • Responsiv design (mobil, tablet, desktop)
  • Global loading spinner vid alla HTTP-anrop
  • Statusmeddelanden i färgad bar
  • Score-knappar med anpassat mörkt tema

Realtid (SignalR)

  • ScoreChanged
  • ScoreHistoryEntry
  • PlayerAdded
  • PlayerRemoved
  • PlayerRenamed
  • ScoreHistoryRenamed
  • PlayerHistoryRemoved
  • MatchFinished
  • MatchReset

Arkitektur

Projektet är uppdelat i tre huvuddelar:

Backend

  • ASP.NET Core Minimal API
  • SignalR Hub
  • Entity Framework Core
  • MatchStore
  • SQLite (development)
  • SQL Server (production / Azure)

Frontend

  • Blazor WebAssembly
  • SignalR
  • Responsiv UI
  • Sidebar navigation
  • Realtidsuppdatering
  • QR-kodsgenerering via QRCoder

Shared

  • Delade modeller (GameMatch, GamePlayer, ScoreEntry)
  • DTOs (Data Transfer Objects)
  • Gemensamma regler och kontrakt
  • Säkerställer att backend och frontend använder samma datastruktur

API Endpoints

Match

  • GET /api/match/{id} → Hämta match
  • POST /api/match → Skapa match
  • POST /api/match/{id}/reset → Reset match
  • POST /api/match/{id}/clone → Klona match
  • POST /api/match/{id}/finish → Avsluta match
  • GET /api/match/{id}/history → Hämta poänghistorik

Spelare

  • POST /api/match/{id}/player → Lägg till spelare
  • PUT /api/match/{id}/player/{playerId}/score → Uppdatera poäng
  • PUT /api/match/{id}/player/{playerId}/name → Byt namn
  • DELETE /api/match/{id}/player/{playerId} → Ta bort spelare

SignalR Hub

Endpoint: /matchevents


Flöde i systemet

  • Skapa match
  • Lägg till spelare
  • Anslut klienter via SignalR
  • Uppdatera poäng
  • Realtidsuppdatering till alla klienter
  • Poänghistorik sparas och synkas
  • Avsluta eller reset match

Så här kör du programmet

cd Backend
dotnet run

Konfiguration

  • Lokal databas (development): Data Source=scorecounter.db
  • Produktion:
    • Azure SQL Server
    • Azure Key Vault (hemlighet: SqlScoreCounterConnectionString)

Publicering till Azure Portal

Programmet är förberett för att hostas på Microsoft Azure. Följ dessa steg för att sätta upp allt via Azure Portal:

  1. Skapa en Azure SQL-databas

    • Gå till Azure Portal och skapa en SQL Database och en SQL Server.
    • Spara anslutningssträngen (Connection String) för databasen.
  2. Skapa en Azure Key Vault

    • Skapa en Key Vault i samma resource group.
    • Lägg till en hemlighet (Secret) med namnet SqlScoreCounterConnectionString och klistra in anslutningssträngen från din SQL-databas.
  3. Skapa en App Service för backend

    • Skapa en App Service.
    • Publicera backend-projektet till denna App Service (t.ex. via GitHub Actions eller ZIP deploy).
  4. Aktivera Managed Identity för App Service

    • Gå till App Service > Identity > System assigned > Sätt till "On" och spara.
  5. Ge Key Vault access till App Service

    • Gå till Key Vault > Access control (IAM) > Lägg till rolltilldelning.
    • Välj rollen "Key Vault Secrets User" och välj din App Service som principal.

Deploya med skript

.\deploy.ps1

Skriptet bygger både Frontend och Backend, publicerar och deployar via ZIP.


Tekniker

  • ASP.NET Core
  • Blazor WebAssembly
  • SignalR
  • Entity Framework Core
  • SQLite / SQL Server
  • Azure
  • QRCoder

Utvecklare

  • Alaa Alsous
  • Astrid Skoglund
  • Andreas Fransson
  • Daniel Viklund

About

Modern realtidsbaserad poängräknare byggd med ASP.NET Core, Blazor WebAssembly och SignalR. Hantera matcher, spelare och livepoäng med stöd för SQLite, SQL Server och Azure-integration.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

175 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ScoreCounter (Poängräknaren)

.NETC#ASP.NET CoreBlazor WebAssemblyAzureAzure SQLAzure Key VaultAzure SQL DatabaseSignalREntity Framework CoreLicense

Beskrivning

ScoreCounter är en realtidsapplikation för att skapa och hantera matcher med spelare och poäng.

Systemet låter användare skapa matcher, lägga till spelare och uppdatera poäng i realtid med hjälp av SignalR. Alla ändringar uppdateras direkt i alla anslutna klienter.

Systemet låter användare:

  • Skapa matcher med valfritt spelnamn, startpoäng, målpoäng och max spelare
  • Välja "högst poäng vinner" eller "lägst poäng vinner"
  • Lägga till och ta bort spelare (med bekräftelsedialog)
  • Uppdatera poäng i realtid med knappar (-1, -5, +1, +5) eller anpassad poäng
  • Se poänghistorik per spelare med tid, ändring och poäng
  • Klona eller återställa matcher
  • Avsluta matcher och visa resultat med vinnare eller oavgjort (draw)
  • Dela matcher via QR-kod
  • Följa uppdateringar direkt via SignalR på alla enheter

Funktioner

Matchhantering

  • Skapa match med valfritt spelnamn
  • Sätta max antal spelare (med validering)
  • Sätta målpoäng (Max Score) som visas på matchen
  • Låsa möjligheten att lägga till fler spelare
  • Avsluta match
  • Klona match (behåller spelare, inställningar och poäng)
  • Reset match till ursprungsläge
  • Resultat-popup med vinnare, oavgjort (draw) och fullständig placeringstabell
  • QR-kodsdelning för att gå direkt till matchen
  • Kopiera matchlänk

Spelare

  • Lägg till spelare
  • Ta bort spelare (med bekräftelsedialog)
  • Ta bort spelare direkt i Create Game-vyn
  • Byt namn (uppdateras även i poänghistoriken)
  • Kontroll av duplicerade namn
  • Max Players-validering — kan inte sänkas under antal tillagda spelare

Poängsystem

  • Öka poäng (+1, +5)
  • Minska poäng (-1, -5)
  • Anpassad poängändring (ange valfritt antal)
  • Optimistisk UI-uppdatering — poängen visas direkt, återställs vid fel
  • Realtidsuppdatering

Poänghistorik

  • Alla poängändringar sparas i databasen (ScoreEntry)
  • Historik visas grupperad per spelare med tid, ändring och poäng (före → efter)
  • Uppdateras i realtid via SignalR
  • Historik rensas automatiskt när spelare tas bort
  • Namnbyte uppdateras i historiken

Gränssnitt

  • Dark / Light mode
  • Responsiv design (mobil, tablet, desktop)
  • Global loading spinner vid alla HTTP-anrop
  • Statusmeddelanden i färgad bar
  • Score-knappar med anpassat mörkt tema

Realtid (SignalR)

  • ScoreChanged
  • ScoreHistoryEntry
  • PlayerAdded
  • PlayerRemoved
  • PlayerRenamed
  • ScoreHistoryRenamed
  • PlayerHistoryRemoved
  • MatchFinished
  • MatchReset

Arkitektur

Projektet är uppdelat i tre huvuddelar:

Backend

  • ASP.NET Core Minimal API
  • SignalR Hub
  • Entity Framework Core
  • MatchStore
  • SQLite (development)
  • SQL Server (production / Azure)

Frontend

  • Blazor WebAssembly
  • SignalR
  • Responsiv UI
  • Sidebar navigation
  • Realtidsuppdatering
  • QR-kodsgenerering via QRCoder

Shared

  • Delade modeller (GameMatch, GamePlayer, ScoreEntry)
  • DTOs (Data Transfer Objects)
  • Gemensamma regler och kontrakt
  • Säkerställer att backend och frontend använder samma datastruktur

API Endpoints

Match

  • GET /api/match/{id} → Hämta match
  • POST /api/match → Skapa match
  • POST /api/match/{id}/reset → Reset match
  • POST /api/match/{id}/clone → Klona match
  • POST /api/match/{id}/finish → Avsluta match
  • GET /api/match/{id}/history → Hämta poänghistorik

Spelare

  • POST /api/match/{id}/player → Lägg till spelare
  • PUT /api/match/{id}/player/{playerId}/score → Uppdatera poäng
  • PUT /api/match/{id}/player/{playerId}/name → Byt namn
  • DELETE /api/match/{id}/player/{playerId} → Ta bort spelare

SignalR Hub

Endpoint: /matchevents


Flöde i systemet

  • Skapa match
  • Lägg till spelare
  • Anslut klienter via SignalR
  • Uppdatera poäng
  • Realtidsuppdatering till alla klienter
  • Poänghistorik sparas och synkas
  • Avsluta eller reset match

Så här kör du programmet

cd Backend
dotnet run

Konfiguration

  • Lokal databas (development): Data Source=scorecounter.db
  • Produktion:
    • Azure SQL Server
    • Azure Key Vault (hemlighet: SqlScoreCounterConnectionString)

Publicering till Azure Portal

Programmet är förberett för att hostas på Microsoft Azure. Följ dessa steg för att sätta upp allt via Azure Portal:

  1. Skapa en Azure SQL-databas

    • Gå till Azure Portal och skapa en SQL Database och en SQL Server.
    • Spara anslutningssträngen (Connection String) för databasen.
  2. Skapa en Azure Key Vault

    • Skapa en Key Vault i samma resource group.
    • Lägg till en hemlighet (Secret) med namnet SqlScoreCounterConnectionString och klistra in anslutningssträngen från din SQL-databas.
  3. Skapa en App Service för backend

    • Skapa en App Service.
    • Publicera backend-projektet till denna App Service (t.ex. via GitHub Actions eller ZIP deploy).
  4. Aktivera Managed Identity för App Service

    • Gå till App Service > Identity > System assigned > Sätt till "On" och spara.
  5. Ge Key Vault access till App Service

    • Gå till Key Vault > Access control (IAM) > Lägg till rolltilldelning.
    • Välj rollen "Key Vault Secrets User" och välj din App Service som principal.

Deploya med skript

.\deploy.ps1

Skriptet bygger både Frontend och Backend, publicerar och deployar via ZIP.


Tekniker

  • ASP.NET Core
  • Blazor WebAssembly
  • SignalR
  • Entity Framework Core
  • SQLite / SQL Server
  • Azure
  • QRCoder

Utvecklare

  • Alaa Alsous
  • Astrid Skoglund
  • Andreas Fransson
  • Daniel Viklund

About

Modern realtidsbaserad poängräknare byggd med ASP.NET Core, Blazor WebAssembly och SignalR. Hantera matcher, spelare och livepoäng med stöd för SQLite, SQL Server och Azure-integration.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

175 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ScoreCounter (Poängräknaren)

.NETC#ASP.NET CoreBlazor WebAssemblyAzureAzure SQLAzure Key VaultAzure SQL DatabaseSignalREntity Framework CoreLicense

Beskrivning

ScoreCounter är en realtidsapplikation för att skapa och hantera matcher med spelare och poäng.

Systemet låter användare skapa matcher, lägga till spelare och uppdatera poäng i realtid med hjälp av SignalR. Alla ändringar uppdateras direkt i alla anslutna klienter.

Systemet låter användare:

  • Skapa matcher med valfritt spelnamn, startpoäng, målpoäng och max spelare
  • Välja "högst poäng vinner" eller "lägst poäng vinner"
  • Lägga till och ta bort spelare (med bekräftelsedialog)
  • Uppdatera poäng i realtid med knappar (-1, -5, +1, +5) eller anpassad poäng
  • Se poänghistorik per spelare med tid, ändring och poäng
  • Klona eller återställa matcher
  • Avsluta matcher och visa resultat med vinnare eller oavgjort (draw)
  • Dela matcher via QR-kod
  • Följa uppdateringar direkt via SignalR på alla enheter

Funktioner

Matchhantering

  • Skapa match med valfritt spelnamn
  • Sätta max antal spelare (med validering)
  • Sätta målpoäng (Max Score) som visas på matchen
  • Låsa möjligheten att lägga till fler spelare
  • Avsluta match
  • Klona match (behåller spelare, inställningar och poäng)
  • Reset match till ursprungsläge
  • Resultat-popup med vinnare, oavgjort (draw) och fullständig placeringstabell
  • QR-kodsdelning för att gå direkt till matchen
  • Kopiera matchlänk

Spelare

  • Lägg till spelare
  • Ta bort spelare (med bekräftelsedialog)
  • Ta bort spelare direkt i Create Game-vyn
  • Byt namn (uppdateras även i poänghistoriken)
  • Kontroll av duplicerade namn
  • Max Players-validering — kan inte sänkas under antal tillagda spelare

Poängsystem

  • Öka poäng (+1, +5)
  • Minska poäng (-1, -5)
  • Anpassad poängändring (ange valfritt antal)
  • Optimistisk UI-uppdatering — poängen visas direkt, återställs vid fel
  • Realtidsuppdatering

Poänghistorik

  • Alla poängändringar sparas i databasen (ScoreEntry)
  • Historik visas grupperad per spelare med tid, ändring och poäng (före → efter)
  • Uppdateras i realtid via SignalR
  • Historik rensas automatiskt när spelare tas bort
  • Namnbyte uppdateras i historiken

Gränssnitt

  • Dark / Light mode
  • Responsiv design (mobil, tablet, desktop)
  • Global loading spinner vid alla HTTP-anrop
  • Statusmeddelanden i färgad bar
  • Score-knappar med anpassat mörkt tema

Realtid (SignalR)

  • ScoreChanged
  • ScoreHistoryEntry
  • PlayerAdded
  • PlayerRemoved
  • PlayerRenamed
  • ScoreHistoryRenamed
  • PlayerHistoryRemoved
  • MatchFinished
  • MatchReset

Arkitektur

Projektet är uppdelat i tre huvuddelar:

Backend

  • ASP.NET Core Minimal API
  • SignalR Hub
  • Entity Framework Core
  • MatchStore
  • SQLite (development)
  • SQL Server (production / Azure)

Frontend

  • Blazor WebAssembly
  • SignalR
  • Responsiv UI
  • Sidebar navigation
  • Realtidsuppdatering
  • QR-kodsgenerering via QRCoder

Shared

  • Delade modeller (GameMatch, GamePlayer, ScoreEntry)
  • DTOs (Data Transfer Objects)
  • Gemensamma regler och kontrakt
  • Säkerställer att backend och frontend använder samma datastruktur

API Endpoints

Match

  • GET /api/match/{id} → Hämta match
  • POST /api/match → Skapa match
  • POST /api/match/{id}/reset → Reset match
  • POST /api/match/{id}/clone → Klona match
  • POST /api/match/{id}/finish → Avsluta match
  • GET /api/match/{id}/history → Hämta poänghistorik

Spelare

  • POST /api/match/{id}/player → Lägg till spelare
  • PUT /api/match/{id}/player/{playerId}/score → Uppdatera poäng
  • PUT /api/match/{id}/player/{playerId}/name → Byt namn
  • DELETE /api/match/{id}/player/{playerId} → Ta bort spelare

SignalR Hub

Endpoint: /matchevents


Flöde i systemet

  • Skapa match
  • Lägg till spelare
  • Anslut klienter via SignalR
  • Uppdatera poäng
  • Realtidsuppdatering till alla klienter
  • Poänghistorik sparas och synkas
  • Avsluta eller reset match

Så här kör du programmet

cd Backend
dotnet run

Konfiguration

  • Lokal databas (development): Data Source=scorecounter.db
  • Produktion:
    • Azure SQL Server
    • Azure Key Vault (hemlighet: SqlScoreCounterConnectionString)

Publicering till Azure Portal

Programmet är förberett för att hostas på Microsoft Azure. Följ dessa steg för att sätta upp allt via Azure Portal:

  1. Skapa en Azure SQL-databas

    • Gå till Azure Portal och skapa en SQL Database och en SQL Server.
    • Spara anslutningssträngen (Connection String) för databasen.
  2. Skapa en Azure Key Vault

    • Skapa en Key Vault i samma resource group.
    • Lägg till en hemlighet (Secret) med namnet SqlScoreCounterConnectionString och klistra in anslutningssträngen från din SQL-databas.
  3. Skapa en App Service för backend

    • Skapa en App Service.
    • Publicera backend-projektet till denna App Service (t.ex. via GitHub Actions eller ZIP deploy).
  4. Aktivera Managed Identity för App Service

    • Gå till App Service > Identity > System assigned > Sätt till "On" och spara.
  5. Ge Key Vault access till App Service

    • Gå till Key Vault > Access control (IAM) > Lägg till rolltilldelning.
    • Välj rollen "Key Vault Secrets User" och välj din App Service som principal.

Deploya med skript

.\deploy.ps1

Skriptet bygger både Frontend och Backend, publicerar och deployar via ZIP.


Tekniker

  • ASP.NET Core
  • Blazor WebAssembly
  • SignalR
  • Entity Framework Core
  • SQLite / SQL Server
  • Azure
  • QRCoder

Utvecklare

  • Alaa Alsous
  • Astrid Skoglund
  • Andreas Fransson
  • Daniel Viklund

About

Modern realtidsbaserad poängräknare byggd med ASP.NET Core, Blazor WebAssembly och SignalR. Hantera matcher, spelare och livepoäng med stöd för SQLite, SQL Server och Azure-integration.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

175 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ScoreCounter (Poängräknaren)

.NETC#ASP.NET CoreBlazor WebAssemblyAzureAzure SQLAzure Key VaultAzure SQL DatabaseSignalREntity Framework CoreLicense

Beskrivning

ScoreCounter är en realtidsapplikation för att skapa och hantera matcher med spelare och poäng.

Systemet låter användare skapa matcher, lägga till spelare och uppdatera poäng i realtid med hjälp av SignalR. Alla ändringar uppdateras direkt i alla anslutna klienter.

Systemet låter användare:

  • Skapa matcher med valfritt spelnamn, startpoäng, målpoäng och max spelare
  • Välja "högst poäng vinner" eller "lägst poäng vinner"
  • Lägga till och ta bort spelare (med bekräftelsedialog)
  • Uppdatera poäng i realtid med knappar (-1, -5, +1, +5) eller anpassad poäng
  • Se poänghistorik per spelare med tid, ändring och poäng
  • Klona eller återställa matcher
  • Avsluta matcher och visa resultat med vinnare eller oavgjort (draw)
  • Dela matcher via QR-kod
  • Följa uppdateringar direkt via SignalR på alla enheter

Funktioner

Matchhantering

  • Skapa match med valfritt spelnamn
  • Sätta max antal spelare (med validering)
  • Sätta målpoäng (Max Score) som visas på matchen
  • Låsa möjligheten att lägga till fler spelare
  • Avsluta match
  • Klona match (behåller spelare, inställningar och poäng)
  • Reset match till ursprungsläge
  • Resultat-popup med vinnare, oavgjort (draw) och fullständig placeringstabell
  • QR-kodsdelning för att gå direkt till matchen
  • Kopiera matchlänk

Spelare

  • Lägg till spelare
  • Ta bort spelare (med bekräftelsedialog)
  • Ta bort spelare direkt i Create Game-vyn
  • Byt namn (uppdateras även i poänghistoriken)
  • Kontroll av duplicerade namn
  • Max Players-validering — kan inte sänkas under antal tillagda spelare

Poängsystem

  • Öka poäng (+1, +5)
  • Minska poäng (-1, -5)
  • Anpassad poängändring (ange valfritt antal)
  • Optimistisk UI-uppdatering — poängen visas direkt, återställs vid fel
  • Realtidsuppdatering

Poänghistorik

  • Alla poängändringar sparas i databasen (ScoreEntry)
  • Historik visas grupperad per spelare med tid, ändring och poäng (före → efter)
  • Uppdateras i realtid via SignalR
  • Historik rensas automatiskt när spelare tas bort
  • Namnbyte uppdateras i historiken

Gränssnitt

  • Dark / Light mode
  • Responsiv design (mobil, tablet, desktop)
  • Global loading spinner vid alla HTTP-anrop
  • Statusmeddelanden i färgad bar
  • Score-knappar med anpassat mörkt tema

Realtid (SignalR)

  • ScoreChanged
  • ScoreHistoryEntry
  • PlayerAdded
  • PlayerRemoved
  • PlayerRenamed
  • ScoreHistoryRenamed
  • PlayerHistoryRemoved
  • MatchFinished
  • MatchReset

Arkitektur

Projektet är uppdelat i tre huvuddelar:

Backend

  • ASP.NET Core Minimal API
  • SignalR Hub
  • Entity Framework Core
  • MatchStore
  • SQLite (development)
  • SQL Server (production / Azure)

Frontend

  • Blazor WebAssembly
  • SignalR
  • Responsiv UI
  • Sidebar navigation
  • Realtidsuppdatering
  • QR-kodsgenerering via QRCoder

Shared

  • Delade modeller (GameMatch, GamePlayer, ScoreEntry)
  • DTOs (Data Transfer Objects)
  • Gemensamma regler och kontrakt
  • Säkerställer att backend och frontend använder samma datastruktur

API Endpoints

Match

  • GET /api/match/{id} → Hämta match
  • POST /api/match → Skapa match
  • POST /api/match/{id}/reset → Reset match
  • POST /api/match/{id}/clone → Klona match
  • POST /api/match/{id}/finish → Avsluta match
  • GET /api/match/{id}/history → Hämta poänghistorik

Spelare

  • POST /api/match/{id}/player → Lägg till spelare
  • PUT /api/match/{id}/player/{playerId}/score → Uppdatera poäng
  • PUT /api/match/{id}/player/{playerId}/name → Byt namn
  • DELETE /api/match/{id}/player/{playerId} → Ta bort spelare

SignalR Hub

Endpoint: /matchevents


Flöde i systemet

  • Skapa match
  • Lägg till spelare
  • Anslut klienter via SignalR
  • Uppdatera poäng
  • Realtidsuppdatering till alla klienter
  • Poänghistorik sparas och synkas
  • Avsluta eller reset match

Så här kör du programmet

cd Backend
dotnet run

Konfiguration

  • Lokal databas (development): Data Source=scorecounter.db
  • Produktion:
    • Azure SQL Server
    • Azure Key Vault (hemlighet: SqlScoreCounterConnectionString)

Publicering till Azure Portal

Programmet är förberett för att hostas på Microsoft Azure. Följ dessa steg för att sätta upp allt via Azure Portal:

  1. Skapa en Azure SQL-databas

    • Gå till Azure Portal och skapa en SQL Database och en SQL Server.
    • Spara anslutningssträngen (Connection String) för databasen.
  2. Skapa en Azure Key Vault

    • Skapa en Key Vault i samma resource group.
    • Lägg till en hemlighet (Secret) med namnet SqlScoreCounterConnectionString och klistra in anslutningssträngen från din SQL-databas.
  3. Skapa en App Service för backend

    • Skapa en App Service.
    • Publicera backend-projektet till denna App Service (t.ex. via GitHub Actions eller ZIP deploy).
  4. Aktivera Managed Identity för App Service

    • Gå till App Service > Identity > System assigned > Sätt till "On" och spara.
  5. Ge Key Vault access till App Service

    • Gå till Key Vault > Access control (IAM) > Lägg till rolltilldelning.
    • Välj rollen "Key Vault Secrets User" och välj din App Service som principal.

Deploya med skript

.\deploy.ps1

Skriptet bygger både Frontend och Backend, publicerar och deployar via ZIP.


Tekniker

  • ASP.NET Core
  • Blazor WebAssembly
  • SignalR
  • Entity Framework Core
  • SQLite / SQL Server
  • Azure
  • QRCoder

Utvecklare

  • Alaa Alsous
  • Astrid Skoglund
  • Andreas Fransson
  • Daniel Viklund

About

Modern realtidsbaserad poängräknare byggd med ASP.NET Core, Blazor WebAssembly och SignalR. Hantera matcher, spelare och livepoäng med stöd för SQLite, SQL Server och Azure-integration.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages