Implementierung der Games #203

Merged
flixcoo merged 34 commits from feature/119-implementierung-der-games-2 into development 2026-05-09 17:13:46 +00:00
Owner

Zugehörige Issue(s)

Closes #119

Beschreibung

Neu aufgesetzte Variante von #177

Es wurde das erstellen von Spielvorlagen und das Hinzufügen dieser zu Spielen hinzugefügt. Außerdem wurden hinzugefügt, Games an diversen Stellen anzuzeigen und Konsistenzänderungen implementiert.

Änderungen

  • Die gemockten Games wurden durch die aus der Datenbank ersetzt und das Benutzen dieser Implementiert
  • Game.icon ist nicht mehr required, Standardmäßig auf leeren string
  • Wenn eine Spielvorlage gelöscht werden soll, obwohl damit mehr als 0 Spiele assoziert sind, wird ein Warndialog angezeigt. Wird das Löschen dann bestätigt, werden alle assozierten Matches mit gelöscht.
  • Das Attribut Game.color ist standardmäßig GameColor.orange sowohl in der Model-Klasse als auch in der CreateGameView gesetzt.
  • Das Ruleset in der CreateGameView ist standardmäßig auf singleWinner gesetzt
  • Zu den ChooseTiles in der CreateGameView wurden Popup-Dropdowns hinzugefügt, durch welche sich Farbe und Regelwerk auswählen lassen.
  • Der ChooseGameView wurde überarbeitet, so dass die Farben der Spielvorlagen auch dargestellt werden.

Neue Widgets

  • Neues GameLabel hinzugefügt, welches auf den MatchTiles und im MatchDetailView die Spielvorlage + Regelsatz anzeigt.
  • Neues GameTile für die Auswahl der Spielvorlage implementiert
  • Das TitleDescriptionListTile wurde simplifiziert.

Neue Ansichten

  • CreateGameView um eine neue Spielvorlage zu erstellen oder eine bestehende zu bearbeiten

Konsistenz

  • Games sind beim Bearbeiten von Matches nicht mehr änderbar
  • Rulesets sind beim Bearbeiten von Games nicht mehr änderbar

Zusätzliche Anmerkungen

No response

### Zugehörige Issue(s) Closes #119 ### Beschreibung Neu aufgesetzte Variante von #177 Es wurde das erstellen von Spielvorlagen und das Hinzufügen dieser zu Spielen hinzugefügt. Außerdem wurden hinzugefügt, Games an diversen Stellen anzuzeigen und Konsistenzänderungen implementiert. ### Änderungen - Die gemockten Games wurden durch die aus der Datenbank ersetzt und das Benutzen dieser Implementiert - `Game.icon` ist nicht mehr required, Standardmäßig auf leeren string - Wenn eine Spielvorlage gelöscht werden soll, obwohl damit mehr als 0 Spiele assoziert sind, wird ein Warndialog angezeigt. Wird das Löschen dann bestätigt, werden alle assozierten Matches mit gelöscht. - Das Attribut `Game.color` ist standardmäßig `GameColor.orange` sowohl in der Model-Klasse als auch in der `CreateGameView` gesetzt. - Das Ruleset in der `CreateGameView` ist standardmäßig auf `singleWinner` gesetzt - Zu den `ChooseTile`s in der `CreateGameView` wurden Popup-Dropdowns hinzugefügt, durch welche sich Farbe und Regelwerk auswählen lassen. - Der `ChooseGameView` wurde überarbeitet, so dass die Farben der Spielvorlagen auch dargestellt werden. #### Neue Widgets - Neues `GameLabel` hinzugefügt, welches auf den `MatchTiles` und im `MatchDetailView` die Spielvorlage + Regelsatz anzeigt. - Neues `GameTile` für die Auswahl der Spielvorlage implementiert - Das `TitleDescriptionListTile` wurde simplifiziert. #### Neue Ansichten - `CreateGameView` um eine neue Spielvorlage zu erstellen oder eine bestehende zu bearbeiten #### Konsistenz - Games sind beim Bearbeiten von Matches nicht mehr änderbar - Rulesets sind beim Bearbeiten von Games nicht mehr änderbar ### Zusätzliche Anmerkungen _No response_
flixcoo added 1 commit 2026-04-28 13:29:20 +00:00
Cherry picked changes from 119-implementierung-der-games
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 46s
Pull Request Pipeline / lint (pull_request) Successful in 47s
2f5b9e5ff2
flixcoo self-assigned this 2026-04-28 23:48:25 +00:00
flixcoo added this to the Alpha milestone 2026-04-28 23:48:28 +00:00
flixcoo added 6 commits 2026-05-02 14:51:03 +00:00
flixcoo added 1 commit 2026-05-02 23:15:03 +00:00
feat: Deleting games associated with matches deletes them
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 42s
Pull Request Pipeline / lint (pull_request) Successful in 50s
e3aef81ab6
flixcoo added 1 commit 2026-05-03 08:45:25 +00:00
fix: callbacks when game deletes matches
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 44s
Pull Request Pipeline / lint (pull_request) Successful in 47s
5d832c98a7
flixcoo added spent time 2 hours 2026-05-03 10:43:49 +00:00
flixcoo added spent time 52 minutes 2026-05-03 10:43:57 +00:00
flixcoo added spent time 45 minutes 2026-05-03 10:44:09 +00:00
flixcoo added 3 commits 2026-05-04 08:44:48 +00:00
Added popups to create game view replacing two screens
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 44s
Pull Request Pipeline / lint (pull_request) Successful in 47s
94bb477cd9
flixcoo added spent time 1 hour 15 minutes 2026-05-04 08:49:09 +00:00
flixcoo added the
PR
Ready for Review
2
label 2026-05-04 08:51:05 +00:00
flixcoo requested review from Owners 2026-05-04 08:51:08 +00:00
flixcoo changed title from WIP: Implementierung der Games to Implementierung der Games 2026-05-04 08:51:32 +00:00
flixcoo added 3 commits 2026-05-04 09:09:12 +00:00
Added icons to rulesets
Some checks failed
Pull Request Pipeline / test (pull_request) Successful in 45s
Pull Request Pipeline / lint (pull_request) Failing after 47s
a9b86fe7ff
flixcoo added 1 commit 2026-05-04 13:41:04 +00:00
added const
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 44s
Pull Request Pipeline / lint (pull_request) Successful in 47s
fef8380860
flixcoo deleted spent time 2026-05-04 13:44:05 +00:00
- 1 hour 15 minutes
flixcoo deleted spent time 2026-05-04 13:44:08 +00:00
- 2 hours
flixcoo deleted spent time 2026-05-04 13:44:09 +00:00
- 52 minutes
flixcoo deleted spent time 2026-05-04 13:44:11 +00:00
- 45 minutes
flixcoo added 4 commits 2026-05-05 09:45:31 +00:00
# Conflicts:
#	lib/data/dao/match_dao.dart
Reordered tests
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 45s
Pull Request Pipeline / lint (pull_request) Successful in 47s
f3380e6c08
gelbeinhalb requested changes 2026-05-06 14:35:29 +00:00
@@ -357,2 +389,4 @@
"delete": "Delete",
"delete_all_data": "Delete all data",
"delete_game": "Delete Game",
"delete_game_with_matches_warning": "If you delete this game template, {count, plural, =1{1 match} other{{count} matches}} using this game template will also be deleted.",
Owner

hinter other ein space vergessen?
Kenne mich nicht mit den templates aus

hinter `other` ein space vergessen? Kenne mich nicht mit den templates aus
Author
Owner

Das ist richtig so, wenn count =1 dann wird 1 match zurückgegeben, und in allen anderen fällen {count} matches.

Das ist richtig so, wenn count =1 dann wird `1 match` zurückgegeben, und in allen anderen fällen `{count} matches`.
flixcoo marked this conversation as resolved
@@ -155,0 +164,4 @@
/// **'Color'**
String get color;
/// No description provided for @color_blue.
Owner

sind die descriptions hier nicht mies unnötig?

sind die descriptions hier nicht mies unnötig?
Author
Owner

ja, ich entfern die mal

ja, ich entfern die mal
flixcoo marked this conversation as resolved
@@ -272,6 +362,12 @@ abstract class AppLocalizations {
/// **'Error while creating group, please try again'**
String get error_creating_group;
/// Error message when game deletion fails
Owner

bitte weniger vibe coden felix 🤓 🫵

bitte weniger vibe coden felix 🤓 🫵
Author
Owner

hä was meinst du? :D

hä was meinst du? :D
flixcoo marked this conversation as resolved
Author
Owner

@gelbeinhalb wie gefallen dir sonst die UI changes, dazu irgendwelche meinung?

@gelbeinhalb wie gefallen dir sonst die UI changes, dazu irgendwelche meinung?
flixcoo requested review from gelbeinhalb 2026-05-06 17:54:07 +00:00
flixcoo added
PR
In Review
1
and removed
PR
Ready for Review
2
labels 2026-05-06 17:54:14 +00:00
flixcoo added 1 commit 2026-05-06 17:54:40 +00:00
removed descriptions
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 44s
Pull Request Pipeline / lint (pull_request) Successful in 48s
045d2afa39
flixcoo added 1 commit 2026-05-06 17:56:02 +00:00
compiling localizations
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 46s
Pull Request Pipeline / lint (pull_request) Successful in 48s
46041be837
sneeex requested changes 2026-05-08 10:36:25 +00:00
Dismissed
sneeex left a comment
Owner

Klickbarer bereich für color selection bei game edit/creation ist nur der color text, nicht die farbe an sich und auch nicht das icon rechts neben color, finde das ux technisch sehr weird. Also ich meine der klickbare Bereich um das dropdown zu öffnen, nicht um die farben auszuwählen

Edit: würde glaube ich tatsächlich den ganzen balken klickbar machen oder?

Klickbarer bereich für color selection bei game edit/creation ist nur der color text, nicht die farbe an sich und auch nicht das icon rechts neben color, finde das ux technisch sehr weird. Also ich meine der klickbare Bereich um das dropdown zu öffnen, nicht um die farben auszuwählen Edit: würde glaube ich tatsächlich den ganzen balken klickbar machen oder?
Owner

Anderer Fehler:

The following StateError was thrown while handling a gesture:
Bad state: No element

Tritt auf wenn man Game in Match Creation auswählt und dann aber während es ausgewählt ist löscht

Anderer Fehler: ``` The following StateError was thrown while handling a gesture: Bad state: No element ``` Tritt auf wenn man Game in Match Creation auswählt und dann aber während es ausgewählt ist löscht
Owner

finde glaube text zu klein oder? also im vergleich zu allem anderen (d.h. den buttons und dem titel)
Habe aber auch irgendwie das gefühl es ist noch zu "leicht" das game template zu löschen wenn dadurch viele (bzw > 0) games gelöscht werden. Wie wärs mit sowas wie gib "delete" ein oder so. Also ich finde ein game template zu löschen mit so vielen assoziierten games ist schon krass und ja auch nicht recoverable oder? oder machen wir da auch nur deleted attribut?

grafik.png
finde glaube text zu klein oder? also im vergleich zu allem anderen (d.h. den buttons und dem titel) Habe aber auch irgendwie das gefühl es ist noch zu "leicht" das game template zu löschen wenn dadurch viele (bzw > 0) games gelöscht werden. Wie wärs mit sowas wie gib "delete" ein oder so. Also ich finde ein game template zu löschen mit so vielen assoziierten games ist schon krass und ja auch nicht recoverable oder? oder machen wir da auch nur deleted attribut? <img width="276" alt="grafik.png" src="attachments/7a65b479-f4f1-4cd7-ba0c-27fc9611d8cb">
flixcoo added 1 commit 2026-05-08 16:10:01 +00:00
Merge branch 'development' into feature/119-implementierung-der-games-2
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 47s
Pull Request Pipeline / lint (pull_request) Successful in 50s
726630027e
Author
Owner

finde glaube text zu klein oder? also im vergleich zu allem anderen (d.h. den buttons und dem titel)
Habe aber auch irgendwie das gefühl es ist noch zu "leicht" das game template zu löschen wenn dadurch viele (bzw > 0) games gelöscht werden. Wie wärs mit sowas wie gib "delete" ein oder so. Also ich finde ein game template zu löschen mit so vielen assoziierten games ist schon krass und ja auch nicht recoverable oder? oder machen wir da auch nur deleted attribut?

Ja könnte man noch drüber nachdenken, ob man das vllt mit nem delay im button enabled noch verbessert, würds jetzt aber erstmal so lassen

> finde glaube text zu klein oder? also im vergleich zu allem anderen (d.h. den buttons und dem titel) > Habe aber auch irgendwie das gefühl es ist noch zu "leicht" das game template zu löschen wenn dadurch viele (bzw > 0) games gelöscht werden. Wie wärs mit sowas wie gib "delete" ein oder so. Also ich finde ein game template zu löschen mit so vielen assoziierten games ist schon krass und ja auch nicht recoverable oder? oder machen wir da auch nur deleted attribut? Ja könnte man noch drüber nachdenken, ob man das vllt mit nem delay im button enabled noch verbessert, würds jetzt aber erstmal so lassen
Author
Owner

Klickbarer bereich für color selection bei game edit/creation ist nur der color text, nicht die farbe an sich und auch nicht das icon rechts neben color, finde das ux technisch sehr weird. Also ich meine der klickbare Bereich um das dropdown zu öffnen, nicht um die farben auszuwählen

Edit: würde glaube ich tatsächlich den ganzen balken klickbar machen oder?

Es ist leider nicht so einfach, weil ich die position des popups nicht einstellen kann und wenn ich das über die gesamte choose tile machen würde, das popup halt auch mittig wäre und das sieh m.M.n net so nice aus. Hab mal was gepusht gucks dir gerne an

> Klickbarer bereich für color selection bei game edit/creation ist nur der color text, nicht die farbe an sich und auch nicht das icon rechts neben color, finde das ux technisch sehr weird. Also ich meine der klickbare Bereich um das dropdown zu öffnen, nicht um die farben auszuwählen > > Edit: würde glaube ich tatsächlich den ganzen balken klickbar machen oder? Es ist leider nicht so einfach, weil ich die position des popups nicht einstellen kann und wenn ich das über die gesamte choose tile machen würde, das popup halt auch mittig wäre und das sieh m.M.n net so nice aus. Hab mal was gepusht gucks dir gerne an
flixcoo added 3 commits 2026-05-08 17:45:50 +00:00
fix: increased font size
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 46s
Pull Request Pipeline / lint (pull_request) Successful in 48s
28fb608b30
flixcoo requested review from sneeex 2026-05-08 17:45:52 +00:00
flixcoo added 1 commit 2026-05-09 09:30:44 +00:00
Merge branch 'development' into feature/119-implementierung-der-games-2
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 49s
Pull Request Pipeline / lint (pull_request) Successful in 50s
003a5122fa
Owner

Klickbarer bereich für color selection bei game edit/creation ist nur der color text, nicht die farbe an sich und auch nicht das icon rechts neben color, finde das ux technisch sehr weird. Also ich meine der klickbare Bereich um das dropdown zu öffnen, nicht um die farben auszuwählen

Edit: würde glaube ich tatsächlich den ganzen balken klickbar machen oder?

Es ist leider nicht so einfach, weil ich die position des popups nicht einstellen kann und wenn ich das über die gesamte choose tile machen würde, das popup halt auch mittig wäre und das sieh m.M.n net so nice aus. Hab mal was gepusht gucks dir gerne an

aber der button rechts oder das icon ist immer noch nicht klickbar, das auch weird? also sonst okay m.m.n zumindest erstmal

> > Klickbarer bereich für color selection bei game edit/creation ist nur der color text, nicht die farbe an sich und auch nicht das icon rechts neben color, finde das ux technisch sehr weird. Also ich meine der klickbare Bereich um das dropdown zu öffnen, nicht um die farben auszuwählen > > > > Edit: würde glaube ich tatsächlich den ganzen balken klickbar machen oder? > > Es ist leider nicht so einfach, weil ich die position des popups nicht einstellen kann und wenn ich das über die gesamte choose tile machen würde, das popup halt auch mittig wäre und das sieh m.M.n net so nice aus. Hab mal was gepusht gucks dir gerne an aber der button rechts oder das icon ist immer noch nicht klickbar, das auch weird? also sonst okay m.m.n zumindest erstmal
flixcoo added a new dependency 2026-05-09 11:21:45 +00:00
flixcoo added 1 commit 2026-05-09 11:27:30 +00:00
fix: chevron tap
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 48s
Pull Request Pipeline / lint (pull_request) Successful in 50s
fd553e1d24
Author
Owner

aber der button rechts oder das icon ist immer noch nicht klickbar, das auch weird? also sonst okay m.m.n zumindest erstmal

Habs jetzt nochmal überarbeitet, jetzt ist zumindest das chevron auch klickbar

> aber der button rechts oder das icon ist immer noch nicht klickbar, das auch weird? also sonst okay m.m.n zumindest erstmal Habs jetzt nochmal überarbeitet, jetzt ist zumindest das chevron auch klickbar
flixcoo added 1 commit 2026-05-09 11:33:58 +00:00
fix: choose tile alignment
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 47s
Pull Request Pipeline / lint (pull_request) Successful in 50s
df757af7ec
sneeex requested changes 2026-05-09 12:49:39 +00:00
Dismissed
sneeex left a comment
Owner

wenn keine games da, soll message wie no games created yet angezeigt werden, natürlich auch lokalisiert

wenn keine games da, soll message wie no games created yet angezeigt werden, natürlich auch lokalisiert
Owner

aber der screen sieht gut aus finde ich

aber der screen sieht gut aus finde ich
flixcoo added 1 commit 2026-05-09 13:01:25 +00:00
add: empty game list messages
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 46s
Pull Request Pipeline / lint (pull_request) Successful in 53s
f9eafa5b3d
flixcoo requested review from sneeex 2026-05-09 13:01:34 +00:00
sneeex requested changes 2026-05-09 15:12:10 +00:00
Dismissed
sneeex left a comment
Owner

leck doch meine eier fett, warum so viel code

leck doch meine eier fett, warum so viel code
@@ -64,3 +64,3 @@
static BoxDecoration highlightedBoxDecoration = BoxDecoration(
color: boxColor,
border: Border.all(color: primaryColor),
border: Border.all(color: textColor, width: 2),
Owner

warum ist die border hier die textcolor? checks nicht so vom prinzip, weil in dem game view sind die highlighted border ja in der jeweiligen game farbe und nicht der text farbe

warum ist die border hier die textcolor? checks nicht so vom prinzip, weil in dem game view sind die highlighted border ja in der jeweiligen game farbe und nicht der text farbe
Author
Owner

Das hat nichts mit der ChooseGameView zutun, ich wollte einfach nur das Highlighting von Containern ändern.

Das hat nichts mit der `ChooseGameView` zutun, ich wollte einfach nur das Highlighting von Containern ändern.
sneeex marked this conversation as resolved
@@ -344,0 +351,4 @@
.getSingle();
return count ?? 0;
}
Owner

würde man das nicht eher in game dao packen? weil es geht doch um games und die damit assozierten matches und nicht andersrum, das steht auch im string da falsch

würde man das nicht eher in game dao packen? weil es geht doch um games und die damit assozierten matches und nicht andersrum, das steht auch im string da falsch
Author
Owner

Nein, ich will die Anzahl an Matches mit einer spezifischen Game-ID. Ich frage ja auch den Match Table an, deswegen ists in der matchDao

Nein, ich will die Anzahl an Matches mit einer spezifischen Game-ID. Ich frage ja auch den Match Table an, deswegen ists in der matchDao
sneeex marked this conversation as resolved
@@ -481,0 +496,4 @@
final query = delete(matchTable)..where((m) => m.gameId.equals(gameId));
final rowsAffected = await query.go();
return rowsAffected;
}
Owner

hier genauso?

hier genauso?
Author
Owner

Ich arbeite auf der Match-Table, deswegen ists in der matchDao

Ich arbeite auf der Match-Table, deswegen ists in der matchDao
sneeex marked this conversation as resolved
@@ -25,0 +41,4 @@
"type": "int"
}
}
},
Owner

im singular: werden 1 spiel gelöscht? dat passt ja net oder

im singular: werden 1 spiel gelöscht? dat passt ja net oder
Author
Owner

fixed

fixed
sneeex marked this conversation as resolved
@@ -0,0 +214,4 @@
// Choose ruleset tile
if (!isEditMode())
ChooseTile(
Owner

meinste nicht, dass man die tiles hier nicht lieber alle auslagern sollte? die sind arg lang

meinste nicht, dass man die tiles hier nicht lieber alle auslagern sollte? die sind arg lang
Author
Owner

Ja das ding ist die werden halt nur einmal verwendet

Ja das ding ist die werden halt nur einmal verwendet
Owner

ja oder wenigstens ausgelagert in der datei?

ja oder wenigstens ausgelagert in der datei?
Author
Owner

ich kanns sonst als funktion unten drunter packen?

ich kanns sonst als funktion unten drunter packen?
Owner

Ja genau

Ja genau
@@ -32,3 +33,4 @@
final VoidCallback? onWinnerChanged;
final VoidCallback? onMatchesUpdated;
Owner

ist das das callback wenn ein match im edit view/create view gemacht wurde und dann in der liste aktualisiert werden soll?

ist das das callback wenn ein match im edit view/create view gemacht wurde und dann in der liste aktualisiert werden soll?
Author
Owner

das ist der callback für die MatchDetailView an erster stelle, um dort das Match zu aktualisieren

das ist der callback für die MatchDetailView an erster stelle, um dort das Match zu aktualisieren
Owner

ne das ist doch on match update, on matches updated ist doch was anderes?

ne das ist doch on match update, on matches updated ist doch was anderes?
Author
Owner

Ja onMatchUpdate ist für ein einzelnes Match und onMatchesUpdate für alle Matches im MatchView

Ja onMatchUpdate ist für ein einzelnes Match und onMatchesUpdate für alle Matches im MatchView
sneeex marked this conversation as resolved
@@ -26,3 +29,4 @@
onPressed: onPressed,
buttonText: text,
buttonType: buttonType,
isDescructive: isDestructive,
Owner

was macht das?

was macht das?
Author
Owner

Das macht den Button auf Rot

Das macht den Button auf Rot
sneeex marked this conversation as resolved
@@ -262,0 +302,4 @@
gameId: testGame.id,
);
expect(count, 2);
});
Owner

oben testest du auch noch löschen hier nicht? wieso?

oben testest du auch noch löschen hier nicht? wieso?
Author
Owner

fixed

fixed
sneeex marked this conversation as resolved
flixcoo added 2 commits 2026-05-09 15:22:39 +00:00
fix: adjusted test
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 48s
Pull Request Pipeline / lint (pull_request) Successful in 50s
5c9db7244a
flixcoo added 1 commit 2026-05-09 15:29:03 +00:00
fix: removed print in test
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 46s
Pull Request Pipeline / lint (pull_request) Successful in 50s
f7c8160c58
flixcoo requested review from sneeex 2026-05-09 15:41:38 +00:00
flixcoo added 1 commit 2026-05-09 16:55:05 +00:00
Refactored trailing widgets
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 45s
Pull Request Pipeline / lint (pull_request) Successful in 53s
ae572a5dbd
flixcoo scheduled this pull request to auto merge when all checks succeed 2026-05-09 17:04:11 +00:00
sneeex approved these changes 2026-05-09 17:13:44 +00:00
flixcoo merged commit e5b44b2660 into development 2026-05-09 17:13:46 +00:00
flixcoo deleted branch feature/119-implementierung-der-games-2 2026-05-09 17:13:47 +00:00
Sign in to join this conversation.
No Reviewers
No Label
PR
In Review
1
3 Participants
Notifications
Due Date
No due date set.
Blocks
#213 Neuer Regelsatz: Platzierung
liquid-development/game-tracker
Reference: liquid-development/game-tracker#203