diff --git a/.github/workflows/dev-image.yml b/.github/workflows/dev-image.yml new file mode 100644 index 0000000..b936f61 --- /dev/null +++ b/.github/workflows/dev-image.yml @@ -0,0 +1,15 @@ +name: Docker Images CI +on: + push: + branches: [ dev ] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build the Unified Docker image + run: docker build . --file Dockerfile --tag albertoxamin/bang:dev + - name: Log into registry + run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + - name: Push images + run: docker push albertoxamin/bang:dev diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index dba286d..32d50b2 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -9,12 +9,7 @@ jobs: - uses: actions/checkout@v2 - name: Build the Unified Docker image run: docker build . --file Dockerfile --tag albertoxamin/bang:latest - - name: Build the Backend Docker image - run: cd backend;docker build . --file Dockerfile --tag albertoxamin/bang-backend:latest - - uses: actions/checkout@v2 - - name: Build the Frontend Docker image - run: cd frontend;docker build . --file Dockerfile --tag albertoxamin/bang-frontend:latest - name: Log into registry run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - name: Push images - run: docker push albertoxamin/bang:latest; docker push albertoxamin/bang-backend:latest; docker push albertoxamin/bang-frontend:latest + run: docker push albertoxamin/bang:latest diff --git a/.gitignore b/.gitignore index a81c8ee..b43fa6c 100644 --- a/.gitignore +++ b/.gitignore @@ -136,3 +136,5 @@ dmypy.json # Cython debug symbols cython_debug/ + +frontend/package-lock.json diff --git a/backend/__init__.py b/backend/__init__.py index 97ddf6f..65f56e3 100644 --- a/backend/__init__.py +++ b/backend/__init__.py @@ -1,4 +1,5 @@ import json +import random from typing import List import eventlet import socketio @@ -17,7 +18,7 @@ games: List[Game] = [] online_players = 0 def advertise_lobbies(): - sio.emit('lobbies', room='lobby', data=[{'name': g.name, 'players': len(g.players)} for g in games if not g.started and len(g.players) < 7]) + sio.emit('lobbies', room='lobby', data=[{'name': g.name, 'players': len(g.players), 'locked': g.password != ''} for g in games if not g.started and len(g.players) < 7]) @sio.event def connect(sid, environ): @@ -62,11 +63,20 @@ def create_room(sid, room_name): advertise_lobbies() @sio.event -def join_room(sid, room_name): +def private(sid): + g = sio.get_session(sid).game + g.set_private() + advertise_lobbies() + +@sio.event +def join_room(sid, room): + room_name = room['name'] print(f'{sid} joined a room named {room_name}') + i = [g.name for g in games].index(room_name) + if games[i].password != '' and games[i].password != room['password'].upper(): + return sio.leave_room(sid, 'lobby') sio.enter_room(sid, room_name) - i = [g.name for g in games].index(room_name) while len([p for p in games[i].players if p.name == sio.get_session(sid).name]): sio.get_session(sid).name += '_1' games[i].add_player(sio.get_session(sid)) diff --git a/backend/game.py b/backend/game.py index c17b077..961e608 100644 --- a/backend/game.py +++ b/backend/game.py @@ -2,12 +2,8 @@ from typing import List, Set, Dict, Tuple, Optional import random import socketio -import cards -from cards import Bang import players -from players import PendingAction, Player import characters -from characters import all_characters from deck import Deck import roles @@ -23,6 +19,7 @@ class Game: self.readyCount = 0 self.waiting_for = 0 self.initial_players = 0 + self.password = '' def add_player(self, player: players.Player): if player in self.players or len(self.players) >= 7: @@ -30,16 +27,24 @@ class Game: player.join_game(self) self.players.append(player) print(f'Added player {player.name} to game') - self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [p.name for p in self.players]}) + self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [p.name for p in self.players], 'password': self.password}) self.sio.emit('chat_message', room=self.name, data=f'{player.name} è entrato nella lobby.') + def set_private(self): + if self.password == '': + self.password = ''.join(random.choice("AEIOUJKZT123456789") for x in range(6)) + print(self.name, 'is now private pwd', self.password) + else: + self.password = '' + self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [p.name for p in self.players], 'password': self.password}) + def notify_character_selection(self): self.readyCount += 1 if self.readyCount == len(self.players): self.distribute_roles() def choose_characters(self): - char_cards = random.sample(all_characters(), len(self.players)*2) + char_cards = random.sample(characters.all_characters(), len(self.players)*2) for i in range(len(self.players)): self.players[i].set_available_character(char_cards[i * 2 : i * 2 + 2]) @@ -80,7 +85,7 @@ class Game: self.players[i].notify_self() self.play_turn() - def attack_others(self, attacker:Player): + def attack_others(self, attacker: players.Player): attacker.pending_action = players.PendingAction.WAIT attacker.notify_self() self.waiting_for = 0 @@ -93,7 +98,7 @@ class Game: attacker.pending_action = players.PendingAction.PLAY attacker.notify_self() - def indian_others(self, attacker:Player): + def indian_others(self, attacker: players.Player): attacker.pending_action = players.PendingAction.WAIT attacker.notify_self() self.waiting_for = 0 @@ -106,14 +111,14 @@ class Game: attacker.pending_action = players.PendingAction.PLAY attacker.notify_self() - def attack(self, attacker:Player, target_username:str): + def attack(self, attacker: players.Player, target_username:str): if self.players[self.players_map[target_username]].get_banged(attacker=attacker, double=isinstance(attacker.character, characters.SlabTheKiller)): self.readyCount = 0 self.waiting_for = 1 attacker.pending_action = players.PendingAction.WAIT attacker.notify_self() - def duel(self, attacker:Player, target_username:str): + def duel(self, attacker: players.Player, target_username:str): if self.players[self.players_map[target_username]].get_dueled(attacker=attacker): self.readyCount = 0 self.waiting_for = 1 @@ -230,7 +235,7 @@ class Game: if died_in_his_turn: self.next_turn() - def get_visible_players(self, player:Player): + def get_visible_players(self, player: players.Player): i = self.players.index(player) sight = player.get_sight() return [{ diff --git a/frontend/package.json b/frontend/package.json index 5704851..b552a24 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,6 +9,7 @@ }, "dependencies": { "core-js": "^3.6.5", + "pretty-checkbox-vue": "^1.1.9", "socket.io-client": "^3.0.3", "vue": "^2.6.11", "vue-socket.io": "^3.0.10" diff --git a/frontend/public/index.html b/frontend/public/index.html index 1e6c0cd..30509ce 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -5,7 +5,6 @@ -