diff --git a/.gitignore b/.gitignore index a10e83c2a45be2070755f5a17513cdc6c1a3a491..b2bdb7eecfcb6bdbde6b345dec34c9f24ced602c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,6 @@ /settings.json /pageSettings.json /pageSettings_backup.json +/boardGames.json .idea/ /*.ics diff --git a/src/logic/tile/tiles/BoardGameTile.html b/src/logic/tile/tiles/BoardGameTile.html new file mode 100644 index 0000000000000000000000000000000000000000..b7dffae72edac02e7fe7f8d4316ac39f46d30e31 --- /dev/null +++ b/src/logic/tile/tiles/BoardGameTile.html @@ -0,0 +1,99 @@ +<style> + .boardGameTile { + background-color: #2F2F2F; + font-size: 2.5vmin; + border-radius: 1vh; + font-weight: bold; + flex-direction: row; + } + + .boardGameTile .content { + display: flex; + flex-direction: column; + align-items: center; + width: 85%; + height: 85%; + text-align: center; + } + + .boardGameTile .centered { + text-align: center; + } + + .boardGameTile .text-left { + text-align: left; + } + + .boardGameTile td { + padding: 0 4vmin; + vertical-align: top; + } + + .boardGameTile .headline { + font-size: 3.5vmin; + padding-bottom: 2vmin; + } + + .boardGameTile .small { + font-size: 2vmin; + } + + .boardGameTile .randomGame { + border: 0.4vmin solid white; + border-radius: 1vmin; + padding: 2vmin + } +</style> + +<div class="boardGameTile"> + <div class="content"> + <table> + <tr> + <td class="centered headline"> + Spiele + <div class="small">max. 2 Spieler</div> + </td> + <td class="centered headline"> + Spiele + <div class="small">min. 3 Spieler</div> + </td> + <td class="centered headline"> + Spiele + <div class="small">> 2 Spieler</div> + </td> + <td class="headline"> + Spielvorschlag + <div class="small">(Klicken für neuen Vorschlag)</td> + </tr> + <tr> + <td> + <ul class="text-left"> + {% for game in gamesForTwo %} + <li>{{ game.name }}</li> + {% endfor %} + </ul> + </td> + <td> + <ul class="text-left"> + {% for game in gamesAtLeastThree %} + <li>{{ game.name }}</li> + {% endfor %} + </ul> + </td> + <td> + <ul class="text-left"> + {% for game in gamesForThreeOrMore %} + <li>{{ game.name }}</li> + {% endfor %} + </ul> + </td> + <td> + <div class="randomGame"> + <div>{{ randomGame.name }}</div> + <div class="small">{{ randomGame.minPlayers }} - {{ randomGame.maxPlayers }} Spieler</div> + </div> + </td> + </tr> + </table> + </div> +</div> diff --git a/src/logic/tile/tiles/BoardGameTile.py b/src/logic/tile/tiles/BoardGameTile.py new file mode 100644 index 0000000000000000000000000000000000000000..ad2fa984104a9af696727d12e45a2798a39f1871 --- /dev/null +++ b/src/logic/tile/tiles/BoardGameTile.py @@ -0,0 +1,61 @@ +import os +import random +from typing import Dict + +from flask import Blueprint + +from logic.service.ServiceManager import ServiceManager +from logic.tile.Tile import Tile + + +class BoardGameTile(Tile): + EXAMPLE_SETTINGS_FILE = { + "games": [ + { + "name": "Carcassonne", + "minPlayers": 2, + "maxPlayers": 6 + } + ] + } + + EXAMPLE_SETTINGS = { + "path": "path/to/my/games.json" + } + + def __init__(self, uniqueName: str, settings: Dict, intervalInSeconds: int): + super().__init__(uniqueName, settings, intervalInSeconds) + self._previousRandomGame = None + + def fetch(self, pageName: str) -> Dict: + jsonService = ServiceManager.get_instance().get_service_by_type_name('JsonService') + + cacheKey = f'{pageName}_{self._uniqueName}_{self._settings["path"]}' + games = jsonService.get_data(cacheKey, self._intervalInSeconds, self._settings)['data']['games'] + games = sorted(games, key=lambda game: game['name']) + + gamesForTwo = [game for game in games if game['maxPlayers'] == 2 and game['minPlayers'] == 2] + gamesAtLeastThree = [game for game in games if game['minPlayers'] >= 3] + gamesForThreeOrMore = [game for game in games if game['maxPlayers'] > 2] + + randomGame = random.choice(games) + while randomGame == self._previousRandomGame: + randomGame = random.choice(games) + self._previousRandomGame = randomGame + + return { + 'gamesForTwo': gamesForTwo, + 'gamesAtLeastThree': gamesAtLeastThree, + 'gamesForThreeOrMore': gamesForThreeOrMore, + 'randomGame': randomGame + } + + def render(self, data: Dict) -> str: + return Tile.render_template(os.path.dirname(__file__), __class__.__name__, + gamesForTwo=data['gamesForTwo'], + gamesAtLeastThree=data['gamesAtLeastThree'], + gamesForThreeOrMore=data['gamesForThreeOrMore'], + randomGame=data['randomGame']) + + def construct_blueprint(self, pageName: str, *args, **kwargs): + return Blueprint(f'{pageName}_{__class__.__name__}_{self.get_uniqueName()}', __name__)