Merge with Master and correct conflit error
continuous-integration/drone/push Build is failing Details

LocalManager
Emre KARTAL 2 years ago
commit 50e82000b0

@ -22,7 +22,8 @@ steps:
SONAR_TOKEN: SONAR_TOKEN:
from_secret: SONAR_TOKEN from_secret: SONAR_TOKEN
settings: settings:
sources: ./Sources/bowlin_project sources: ./Sources/bowlin_project
exclusions: '**/*.java'
commands: commands:
- export SONAR_SCANNER_VERSION=4.7.0.2747 - export SONAR_SCANNER_VERSION=4.7.0.2747
- export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION-linux - export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION-linux

@ -11,7 +11,10 @@
  ![Quarkus](https://img.shields.io/badge/Quarkus-000?style=for-the-badge&logo=Quarkus&logoColor=white&color=blue)   ![Quarkus](https://img.shields.io/badge/Quarkus-000?style=for-the-badge&logo=Quarkus&logoColor=white&color=blue)
  ![Flutter](https://img.shields.io/badge/Flutter-000?style=for-the-badge&logo=flutter&logoColor=blue&color=white)   ![Flutter](https://img.shields.io/badge/Flutter-000?style=for-the-badge&logo=flutter&logoColor=blue&color=white)
  ![PostgreSQL](https://img.shields.io/badge/Postgresql-000?style=for-the-badge&logo=postgresql&logoColor=white&color=blue)   ![PostgreSQL](https://img.shields.io/badge/Postgresql-000?style=for-the-badge&logo=postgresql&logoColor=white&color=blue)
[![Duplicated Lines (%)](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=Bowl_in&metric=duplicated_lines_density&token=88dd5f9f10bb02aede7a82a2bccf8c987af1ecab)](https://codefirst.iut.uca.fr/sonar/dashboard?id=Bowl_in)
[![Security Rating](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=Bowl_in&metric=security_rating&token=88dd5f9f10bb02aede7a82a2bccf8c987af1ecab)](https://codefirst.iut.uca.fr/sonar/dashboard?id=Bowl_in)
[![Vulnerabilities](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=Bowl_in&metric=vulnerabilities&token=88dd5f9f10bb02aede7a82a2bccf8c987af1ecab)](https://codefirst.iut.uca.fr/sonar/dashboard?id=Bowl_in)
[![Lines of Code](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=Bowl_in&metric=ncloc&token=88dd5f9f10bb02aede7a82a2bccf8c987af1ecab)](https://codefirst.iut.uca.fr/sonar/dashboard?id=Bowl_in)
--- ---
</div> </div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

@ -6,6 +6,7 @@ import '../views/ingame_screen.dart';
import '../views/main_screen.dart'; import '../views/main_screen.dart';
import '../views/rank_screen.dart'; import '../views/rank_screen.dart';
import '../views/welcome_screen.dart'; import '../views/welcome_screen.dart';
import '../widgets/ingame_widgets.dart';
final GoRouter router = GoRouter( final GoRouter router = GoRouter(
routes: <RouteBase>[ routes: <RouteBase>[
@ -36,7 +37,7 @@ final GoRouter router = GoRouter(
GoRoute( GoRoute(
path: 'in-game', path: 'in-game',
builder: (BuildContext context, GoRouterState state) { builder: (BuildContext context, GoRouterState state) {
return const InGameScreen(); return InGameScreen();
}, },
), ),
], ],

@ -8,11 +8,15 @@ import 'package:flutter/services.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:bowl_in/config/app_router.dart'; import 'package:bowl_in/config/app_router.dart';
import 'model/IManager.dart';
import 'model/StubManager/StubData.dart';
void main() { void main() {
runApp(const MyApp()); runApp(const MyApp());
} }
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {
static IManager controller = StubData();
const MyApp({super.key}); const MyApp({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -1,27 +1,25 @@
import 'package:uuid/uuid.dart';
class Game { class Game {
Uuid _id; int _id;
DateTime _time; DateTime _date;
int _pointsCurrentUser; int _pointsCurrentUser;
bool _isFinished; bool _isFinished;
List<String> _playerImages = []; List<int> _playersId = [];
// Constructor // Constructor
Game(this._id, this._time, this._pointsCurrentUser, this._isFinished, Game(this._id, this._date, this._pointsCurrentUser, this._isFinished,
this._playerImages); this._playersId);
// Getters and setters // Getters and setters
Uuid get id => _id; int get id => _id;
set id(Uuid value) { set id(int value) {
_id = value; _id = value;
} }
DateTime get time => _time; DateTime get date => _date;
set time(DateTime value) { set date(DateTime value) {
_time = value; _date = value;
} }
int get pointsCurrentUser => _pointsCurrentUser; int get pointsCurrentUser => _pointsCurrentUser;
@ -36,10 +34,10 @@ class Game {
_isFinished = value; _isFinished = value;
} }
List<String> get playerImages => _playerImages; List<int> get playersId => _playersId;
set playerImages(List<String> value) { set playersId(List<int> value) {
_playerImages = value; _playersId = value;
} }
toJSONEncodable() { toJSONEncodable() {

@ -1,15 +1,14 @@
import 'package:uuid/uuid.dart';
import 'Player.dart'; import 'Player.dart';
import 'Round.dart'; import 'Round.dart';
class GameDetail { class GameDetail {
Uuid _id; int _id;
DateTime _time; DateTime _time;
Uuid _winner; int _winner;
int _nbPoints; int _nbPoints;
bool _isFinished; bool _isFinished;
Round? _currentRound; Round? _currentRound;
Player _host; int _host;
List<Round> _rounds = []; List<Round> _rounds = [];
List<Player> _players = []; List<Player> _players = [];
@ -26,9 +25,9 @@ class GameDetail {
this._players); this._players);
// Getters and setters // Getters and setters
Uuid get id => _id; int get id => _id;
set id(Uuid value) { set id(int value) {
_id = value; _id = value;
} }
@ -38,9 +37,9 @@ class GameDetail {
_time = value; _time = value;
} }
Uuid get winner => _winner; int get winner => _winner;
set winner(Uuid value) { set winner(int value) {
_winner = value; _winner = value;
} }
@ -62,9 +61,9 @@ class GameDetail {
_currentRound = value; _currentRound = value;
} }
Player get host => _host; int get host => _host;
set host(Player value) { set host(int value) {
_host = value; _host = value;
} }
@ -93,4 +92,30 @@ class GameDetail {
return m; return m;
} }
int getPointByPlayerId(int id) {
int pointPlayer = 0;
for (var player in players) {
if (player.id == id) {
for (var element in rounds) {
if (element.player == player) {
pointPlayer += element.points;
}
}
return pointPlayer;
}
}
throw Exception("Player not in the game.");
}
Map<int, int> getRank() {
Map<int, int> rank = {};
for (var player in players) {
rank.addAll({player.id: this.getPointByPlayerId(player.id)});
}
var sortedByKeyMap = Map.fromEntries(
rank.entries.toList()..sort((e1, e2) => e2.value.compareTo(e1.value)));
return sortedByKeyMap;
}
} }

@ -1,8 +1,6 @@
import 'package:uuid/uuid.dart';
import 'package:uuid/uuid_util.dart';
import 'Player.dart'; import 'Player.dart';
class Guest extends Player { class Guest extends Player {
// Constructor // Constructor
Guest(Uuid id, String image, String name) : super(id, image, name); Guest(int id, String image, String name) : super(id, image, name);
} }

@ -1,5 +1,5 @@
abstract class IAuthManager { abstract class IAuthManager {
// Methods // Methods
bool verifiedUser(String name, String password); bool verifiedUser(String mail, String password);
} }

@ -1,15 +1,13 @@
import 'package:uuid/uuid.dart';
import 'package:uuid/uuid_util.dart';
import 'GameDetail.dart'; import 'GameDetail.dart';
import 'Player.dart'; import 'Player.dart';
import 'User.dart'; import 'User.dart';
abstract class IGameManager { abstract class IGameManager {
// Methods // Methods
GameDetail getGameById(Uuid id); GameDetail getGameById(int id);
List<GameDetail> getGamesByPlayerId(Uuid id); List<GameDetail> getGamesByPlayerId(int id);
List<GameDetail> getGamesByPlayer(Player user); List<GameDetail> getGamesByPlayer(Player user);
List<GameDetail> getGamesByPlayers(List<Player> users); List<GameDetail> getGamesByPlayers(List<Player> users);
List<User> getPlayersByIdGame(Uuid id); List<Player> getPlayersByIdGame(int id);
Map<int, Uuid> getRankByIdGame(Uuid id); Map<int, int> getRankByIdGame(int id);
} }

@ -9,9 +9,14 @@ abstract class IManager {
late Game _gameCurrent; late Game _gameCurrent;
late IUserManager _userMgr; late IUserManager _userMgr;
late IGameManager _gameMgr; late IGameManager _gameMgr;
// Getters and setters // Getters and setters
User get userCurrent => _userCurrent; User get userCurrent => _userCurrent;
set userCurrent(User user) {
_userCurrent = user;
}
Game get gameCurrent => _gameCurrent; Game get gameCurrent => _gameCurrent;
IUserManager get userMgr => _userMgr; IUserManager get userMgr => _userMgr;
IGameManager get gameMgr => _gameMgr; IGameManager get gameMgr => _gameMgr;

@ -1,4 +1,4 @@
import 'package:uuid/uuid.dart'; import 'Player.dart';
import 'User.dart'; import 'User.dart';
import 'IAuthManager.dart'; import 'IAuthManager.dart';
@ -10,6 +10,7 @@ abstract class IUserManager {
// Methods // Methods
IAuthManager get authMgr => _authMgr; IAuthManager get authMgr => _authMgr;
List<User> getUsersByName(String name); List<Player> getUsersByName(String name);
User getUserById(Uuid id); Player getUserById(int id);
List<User> getRankingWithFriends();
} }

@ -1,7 +1,5 @@
import 'package:uuid/uuid.dart';
class Player { class Player {
final Uuid _id; final int _id;
String _name; String _name;
String _image; String _image;
@ -9,7 +7,7 @@ class Player {
Player(this._id, this._name, this._image); Player(this._id, this._name, this._image);
// Getters and setters // Getters and setters
Uuid get id => _id; int get id => _id;
String get name => _name; String get name => _name;

@ -1,5 +1,6 @@
library StubLib; library StubLib;
import '../IAuthManager.dart'; import '../IAuthManager.dart';
import '../User.dart';
import 'StubData.dart'; import 'StubData.dart';
class AuthManager extends IAuthManager { class AuthManager extends IAuthManager {
@ -8,7 +9,13 @@ class AuthManager extends IAuthManager {
// Constructor // Constructor
AuthManager(this.parent); AuthManager(this.parent);
// Methods // Methods
bool verifiedUser(String name, String password) { bool verifiedUser(String mail, String password) {
return false; for (var user in parent.players) {
if (user is User && user.mail == mail) {
parent.userCurrent = user as User;
return true;
}
}
return false;
} }
} }

@ -1,37 +1,84 @@
library StubLib; library StubLib;
import '../Game.dart';
import '../IGameManager.dart'; import '../IGameManager.dart';
import '../GameDetail.dart'; import '../GameDetail.dart';
import '../Player.dart'; import '../Player.dart';
import '../User.dart'; import '../User.dart';
import '../Guest.dart'; import '../Guest.dart';
import 'StubData.dart'; import 'StubData.dart';
import 'package:uuid/uuid.dart';
class GameManager extends IGameManager { class GameManager extends IGameManager {
List<GameDetail> games = [];
final StubData parent; final StubData parent;
// Constructor // Constructor
GameManager(this.parent); GameManager(this.parent);
// Methods // Methods
GameDetail getGameById(Uuid id) { GameDetail getGameById(int id) {
return new GameDetail(Uuid(), DateTime.now(), Uuid(), 290, true, null, Guest(Uuid(),"",""), [ ], [] ); for (var element in parent.gameDetails) {
if (element.id == id) {
return element;
}
}
throw Exception("Game not found.");
} }
List<GameDetail> getGamesByPlayerId(Uuid id) {
return []; List<GameDetail> getGamesByPlayerId(int id) {
List<GameDetail> games = [];
for (var element in parent.gameDetails) {
for (Player player in element.players) {
if (player.id == id) {
games.add(element);
break;
}
}
}
return games;
} }
List<GameDetail> getGamesByPlayer(Player user) { List<GameDetail> getGamesByPlayer(Player user) {
return []; List<GameDetail> games = [];
for (var element in parent.gameDetails) {
for (Player player in element.players) {
if (player.id == user.id) {
games.add(element);
break;
}
}
}
return games;
} }
List<GameDetail> getGamesByPlayers(List<Player> users) {
return []; List<GameDetail> getGamesByPlayers(List<Player> users) {
List<GameDetail> games = [];
for (var element in parent.gameDetails) {
if (element.players.toSet().containsAll(users.toSet())) {
games.add(element);
}
}
return games;
} }
List<User> getPlayersByIdGame(Uuid id) {
return []; List<Player> getPlayersByIdGame(int id) {
List<Player> players = [];
for (var element in parent.gameDetails) {
if (element.id == id) {
for (var player in element.players) {
players.add(player);
}
return players;
}
}
throw Exception("Game not found.");
} }
Map<int, Uuid> getRankByIdGame(Uuid id) {
return {}; Map<int, int> getRankByIdGame(int id) {
for (var game in parent.gameDetails) {
if (game.id == id) {
return game.getRank();
}
}
throw Exception("Game not found.");
} }
} }

@ -1,14 +1,17 @@
library StubLib; library StubLib;
import '../IManager.dart'; import '../IManager.dart';
import '../Game.dart';
import '../IUserManager.dart'; import '../IUserManager.dart';
import '../IGameManager.dart'; import '../IGameManager.dart';
import '../Player.dart';
import '../Round.dart';
import '../User.dart'; import '../User.dart';
import '../Achievement.dart'; import '../Achievement.dart';
import '../GameDetail.dart';
import '../Stat.dart'; import '../Stat.dart';
import 'UserManager.dart'; import 'UserManager.dart';
import 'GameManager.dart'; import 'GameManager.dart';
import 'package:uuid/uuid.dart';
class StubData extends IManager { class StubData extends IManager {
late IUserManager _userMgr; late IUserManager _userMgr;
@ -17,13 +20,29 @@ class StubData extends IManager {
StubData() { StubData() {
_userMgr = UserManager(this); _userMgr = UserManager(this);
_gameMgr = GameManager(this); _gameMgr = GameManager(this);
_initRounds();
_initGameDetails();
_initGame();
userCurrent = players[8] as User;
userCurrent.games = games;
} }
List<User> users = [ IUserManager get userMgr => _userMgr;
IGameManager get gameMgr => _gameMgr;
List<Player> players = [
Player(1, "Mathieu", "./assets/images/image_user_cyan.png"),
Player(2, "Robin", "./assets/images/image_user_purple.png"),
Player(3, "Lucas", "./assets/images/image_user_red.png"),
Player(4, "Emre", "./assets/images/image_user_blue.png"),
Player(5, "Louison", "./assets/images/image_user_cyan.png"),
Player(6, "Arthur", "./assets/images/image_user_yellow.png"),
Player(7, "David", "./assets/images/image_user_pink.png"),
User( User(
Uuid(), 8,
"Emre", "Emre",
"https://fastly.picsum.photos/id/1060/2000/2000.jpg?hmac=_RrU8GpkCDUlVKfgyWE-GcX-GS5TKNyUzdFbJAGXHV4", "./assets/images/image_user_cyan.png",
"emre.kartal@etu.uca.fr", "emre.kartal@etu.uca.fr",
[ [
Achievement("5 games"), Achievement("5 games"),
@ -33,16 +52,137 @@ class StubData extends IManager {
[], [],
Stat(10, 2, 12, 130, 7, 6, 700, 58.33, 30.2)), Stat(10, 2, 12, 130, 7, 6, 700, 58.33, 30.2)),
User( User(
Uuid(), 9,
"Dave", "Dave",
"https://fastly.picsum.photos/id/820/2000/2000.jpg?hmac=Ctxx2feJNZnG1S7UPx_YrWcEw89tKb7fR8i1W-VTOz4", "./assets/images/image_user_cyan.png",
"david.d_almeida@etu.uca.fr", "david.d_almeida@etu.uca.fr",
[ [
Achievement("5 games"), Achievement("5 games"),
Achievement("0 point"), Achievement("0 point"),
Achievement("Win a game") Achievement("Win a game")
], ],
[], [
User(
21,
"Arthur",
"./assets/images/image_user_cyan.png",
"emre.kartal@etu.uca.fr",
[
Achievement("5 games"),
Achievement("2 strikes in a row"),
Achievement("Win a game")
],
[],
Stat(10, 2, 12, 110, 7, 6, 700, 58.33, 30.2)),
User(
22,
"Louison",
"./assets/images/image_user_cyan.png",
"emre.kartal@etu.uca.fr",
[
Achievement("5 games"),
Achievement("2 strikes in a row"),
Achievement("Win a game")
],
[],
Stat(10, 2, 12, 150, 7, 6, 700, 58.33, 30.2)),
User(
23,
"Owen",
"./assets/images/image_user_cyan.png",
"emre.kartal@etu.uca.fr",
[
Achievement("5 games"),
Achievement("2 strikes in a row"),
Achievement("Win a game")
],
[],
Stat(10, 2, 12, 10, 7, 6, 700, 58.33, 30.2)),
User(
24,
"LULU",
"./assets/images/image_user_cyan.png",
"emre.kartal@etu.uca.fr",
[
Achievement("5 games"),
Achievement("2 strikes in a row"),
Achievement("Win a game")
],
[],
Stat(10, 2, 12, 40, 7, 6, 700, 58.33, 30.2)),
User(
25,
"Raphael",
"./assets/images/image_user_cyan.png",
"emre.kartal@etu.uca.fr",
[
Achievement("5 games"),
Achievement("2 strikes in a row"),
Achievement("Win a game")
],
[],
Stat(10, 2, 12, 76, 7, 6, 700, 58.33, 30.2)),
],
Stat(2, 7, 9, 80, 4, 3, 250, 27.77, 10.55)) Stat(2, 7, 9, 80, 4, 3, 250, 27.77, 10.55))
]; ];
List<GameDetail> _gameDetails = [];
void _initGameDetails() {
gameDetails.add(GameDetail(1, DateTime.now(), players[7].id, 123, true,
null, players[7].id, rounds, [players[0], players[1]]));
gameDetails.add(GameDetail(2, DateTime.now(), players[0].id, 113, true,
null, players[7].id, rounds, [players[0], players[1], players[7]]));
gameDetails.add(GameDetail(3, DateTime.now(), players[7].id, 93, true, null,
players[7].id, [], [players[0], players[7]]));
gameDetails.add(GameDetail(4, DateTime.now(), players[7].id, 93, true, null,
players[7].id, [], [players[1], players[7]]));
}
List<GameDetail> get gameDetails => _gameDetails;
List<Round> _rounds = [];
void _initRounds() {
rounds.add(Round(4, 5, 9, players[1]));
rounds.add(Round(4, 1, 5, players[8]));
rounds.add(Round(4, 5, 9, players[7]));
rounds.add(Round(4, 1, 5, players[1]));
rounds.add(Round(4, 5, 9, players[7]));
rounds.add(Round(1, 5, 6, players[8]));
rounds.add(Round(4, 1, 5, players[7]));
rounds.add(Round(1, 5, 6, players[8]));
rounds.add(Round(4, 5, 9, players[7]));
rounds.add(Round(9, 0, 9, players[8]));
rounds.add(Round(4, 5, 9, players[7]));
rounds.add(Round(4, 5, 9, players[8]));
rounds.add(Round(4, 2, 6, players[0]));
rounds.add(Round(3, 5, 8, players[1]));
rounds.add(Round(4, 5, 9, players[2]));
rounds.add(Round(4, 5, 9, players[4]));
rounds.add(Round(1, 5, 6, players[6]));
rounds.add(Round(4, 5, 9, players[8]));
rounds.add(Round(4, 2, 6, players[7]));
rounds.add(Round(3, 5, 8, players[8]));
rounds.add(Round(4, 5, 9, players[7]));
rounds.add(Round(4, 5, 9, players[8]));
rounds.add(Round(1, 5, 6, players[7]));
rounds.add(Round(4, 5, 9, players[8]));
rounds.add(Round(4, 5, 9, players[7]));
rounds.add(Round(4, 1, 5, players[8]));
}
List<Round> get rounds => _rounds;
List<Game> _games = [];
void _initGame() {
games.add(Game(
gameDetails[0].id,
DateTime.now().subtract(Duration(days: 14)),
123,
true,
[players[0].id, players[1].id]));
games.add(Game(gameDetails[1].id, DateTime.now(), 101, true,
[players[1].id, players[0].id]));
}
List<Game> get games => _games;
} }

@ -2,11 +2,12 @@ library StubLib;
import '../IUserManager.dart'; import '../IUserManager.dart';
import '../IAuthManager.dart'; import '../IAuthManager.dart';
import '../Player.dart';
import '../User.dart';
import 'AuthManager.dart'; import 'AuthManager.dart';
import 'StubData.dart'; import 'StubData.dart';
import '../User.dart'; import '../Player.dart';
import '../Stat.dart'; import '../Stat.dart';
import 'package:uuid/uuid.dart';
class UserManager extends IUserManager { class UserManager extends IUserManager {
final StubData parent; final StubData parent;
@ -15,12 +16,29 @@ class UserManager extends IUserManager {
UserManager(this.parent) : super(AuthManager(parent)); UserManager(this.parent) : super(AuthManager(parent));
// Methods // Methods
List<User> getUsersByName(String name) { List<Player> getUsersByName(String name) {
return []; List<Player> players = [];
for (var player in parent.players) {
if (player.name == name) {
players.add(player);
}
}
return players;
}
Player getUserById(int id) {
for (var player in parent.players) {
if (player.id == id) {
return player;
}
}
throw new Exception("Player not found");
} }
User getUserById(Uuid id) { @override
return User( List<User> getRankingWithFriends() {
Uuid(), "", "", "", [], [], Stat(10, 10, 10, 10, 10, 10, 10, 10, 10)); List<User> sortedPlayers = List.from(parent.userCurrent.friends);
sortedPlayers.sort((a, b) => b.stat.highscore.compareTo(a.stat.highscore));
return sortedPlayers;
} }
} }

@ -1,5 +1,5 @@
import 'package:uuid/uuid.dart';
import 'Achievement.dart'; import 'Achievement.dart';
import 'Game.dart';
import 'Player.dart'; import 'Player.dart';
import 'Stat.dart'; import 'Stat.dart';
@ -8,9 +8,10 @@ class User extends Player {
List<Achievement> _achievements = <Achievement>[]; List<Achievement> _achievements = <Achievement>[];
List<User> _friends = <User>[]; List<User> _friends = <User>[];
Stat _stat; Stat _stat;
List<Game> games = [];
// Constructor // Constructor
User(Uuid id, String name, String image, this._mail, this._achievements, User(int id, String name, String image, this._mail, this._achievements,
this._friends, this._stat) this._friends, this._stat)
: super(id, name, image); : super(id, name, image);
@ -35,7 +36,7 @@ class User extends Player {
Stat get stat => _stat; Stat get stat => _stat;
set stats(Stat value) { set stat(Stat value) {
_stat = value; _stat = value;
} }

@ -1,3 +1,4 @@
import 'package:bowl_in/main.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -20,7 +21,7 @@ class _AnalysisScreenState extends State<AnalysisScreen> {
child: Stack(alignment: Alignment.topCenter, children: [ child: Stack(alignment: Alignment.topCenter, children: [
Container( Container(
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height * 1.45, height: MediaQuery.of(context).size.height,
decoration: const BoxDecoration( decoration: const BoxDecoration(
gradient: LinearGradient( gradient: LinearGradient(
begin: Alignment.topLeft, begin: Alignment.topLeft,
@ -42,15 +43,18 @@ class _AnalysisScreenState extends State<AnalysisScreen> {
children: [ children: [
Positioned( Positioned(
left: 34, left: 34,
child: SpareCard(score: 12), child: SpareCard(
score: MyApp.controller.userCurrent.stat.nbSpares),
), ),
Positioned( Positioned(
top: 0, top: 0,
child: StrikeCard(score: 12), child: StrikeCard(
score: MyApp.controller.userCurrent.stat.nbStrikes),
), ),
Positioned( Positioned(
right: 34, right: 34,
child: GameCard(score: 12), child: GameCard(
score: MyApp.controller.userCurrent.stat.nbGames),
) )
], ],
), ),
@ -80,18 +84,13 @@ class _AnalysisScreenState extends State<AnalysisScreen> {
spacing: 10, spacing: 10,
verticalDirection: VerticalDirection.up, verticalDirection: VerticalDirection.up,
children: [ children: [
StatsCard(title: "Average", val: 12), StatsCard(
StatsCard(title: "Average", val: 12), title: "Number of victory",
StatsCard(title: "Average", val: 12), val: MyApp.controller.userCurrent.stat.nbVictory
StatsCard(title: "Average", val: 12), .toDouble()),
StatsCard(title: "Average", val: 12), StatsCard(
StatsCard(title: "Average", val: 12), title: "Average pins per round",
StatsCard(title: "Average", val: 12), val: MyApp.controller.userCurrent.stat.avgPinsPerRound),
StatsCard(title: "Average", val: 12),
StatsCard(title: "Average", val: 12),
StatsCard(title: "Average", val: 12),
StatsCard(title: "Average", val: 12),
StatsCard(title: "Average", val: 12),
], ],
)) ))
]), ]),

@ -29,23 +29,18 @@ class _GameScreenState extends State<GameScreen> {
], ],
)), )),
), ),
Align( Container(
alignment: AlignmentDirectional.topCenter, height: 120,
child: Container( decoration: BoxDecoration(
height: 120, image: DecorationImage(
decoration: BoxDecoration( image: AssetImage("assets/images/image_score.png"),
image: DecorationImage( )),
image: AssetImage("assets/images/image_score.png"), child: Center(
)), child: Text(
child: Center( "Scores",
child: Text( style: TextStyle(
"Scores", fontWeight: FontWeight.bold, color: Colors.white, fontSize: 20),
style: TextStyle( )),
fontWeight: FontWeight.bold,
color: Colors.white,
fontSize: 20),
)),
),
), ),
Column( Column(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
@ -54,19 +49,14 @@ class _GameScreenState extends State<GameScreen> {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
ButtonNewParty(), ButtonNewParty(),
SizedBox(width: 20), const SizedBox(width: 20),
ButtonJoinParty(), ButtonJoinParty(),
], ],
), ),
Align( Container(
alignment: Alignment.bottomCenter, height: MediaQuery.of(context).size.height - 140,
child: Positioned( width: MediaQuery.of(context).size.width,
bottom: 0, child: ListCardGame(),
child: Container(
height: MediaQuery.of(context).size.height - 140,
width: MediaQuery.of(context).size.width,
child: ListCardGame(),
)),
), ),
], ],
) )

@ -48,7 +48,7 @@ class _ProfileScreenState extends State<ProfileScreen> {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
verticalDirection: VerticalDirection.up, verticalDirection: VerticalDirection.up,
children: [ children: [
ListAchievementWidget(nbUnlocked: 1), ListAchievementWidget(nbUnlocked: 0),
Padding( Padding(
padding: EdgeInsets.fromLTRB(40, 0, 0, 0), padding: EdgeInsets.fromLTRB(40, 0, 0, 0),
child: ProfileWidget()), child: ProfileWidget()),

@ -1,6 +1,8 @@
import 'package:bowl_in/main.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../model/User.dart';
import '../widgets/profil_listpodium_widget.dart'; import '../widgets/profil_listpodium_widget.dart';
class RankScreen extends StatefulWidget { class RankScreen extends StatefulWidget {
@ -11,6 +13,7 @@ class RankScreen extends StatefulWidget {
} }
class _RankScreenState extends State<RankScreen> { class _RankScreenState extends State<RankScreen> {
List<User> rank = MyApp.controller.userMgr.getRankingWithFriends();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack(alignment: Alignment.center, children: [ return Stack(alignment: Alignment.center, children: [
@ -60,16 +63,21 @@ class _RankScreenState extends State<RankScreen> {
Positioned( Positioned(
left: 65, left: 65,
top: MediaQuery.of(context).size.height * 0.195, top: MediaQuery.of(context).size.height * 0.195,
child: ProfilPodiumWidget(isfirst: 0, pseudo: "Louison", score: 122)), child: ProfilPodiumWidget(
isfirst: 0, pseudo: rank[1].name, score: rank[1].stat.highscore)),
Positioned( Positioned(
top: MediaQuery.of(context).size.height * 0.114, top: MediaQuery.of(context).size.height * 0.114,
child: Align( child: Align(
child: ProfilPodiumWidget(isfirst: 1, pseudo: "Lucas", score: 167), child: ProfilPodiumWidget(
isfirst: 1,
pseudo: rank[0].name,
score: rank[0].stat.highscore),
)), )),
Positioned( Positioned(
right: 65, right: 65,
top: MediaQuery.of(context).size.height * 0.219, top: MediaQuery.of(context).size.height * 0.219,
child: ProfilPodiumWidget(isfirst: 0, pseudo: "David", score: 102), child: ProfilPodiumWidget(
isfirst: 0, pseudo: rank[2].name, score: rank[2].stat.highscore),
), ),
Positioned( Positioned(
bottom: -40, bottom: -40,
@ -82,7 +90,7 @@ class _RankScreenState extends State<RankScreen> {
image: DecorationImage( image: DecorationImage(
image: AssetImage("assets/images/image_podium.png"), image: AssetImage("assets/images/image_podium.png"),
)), )),
child: ListPodium(), child: rank.length > 3 ? ListPodium() : Container(),
) )
], ],
)), )),

@ -1,3 +1,4 @@
import 'package:bowl_in/main.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
@ -84,7 +85,7 @@ class ListAchievementWidget extends StatelessWidget {
imagePath: 'assets/images/achievements/win_locked.png', imagePath: 'assets/images/achievements/win_locked.png',
imagePathUnlocked: imagePathUnlocked:
'assets/images/achievements/win_unlocked.png', 'assets/images/achievements/win_unlocked.png',
isUnlocked: 1, isUnlocked: 0,
), ),
AchievementWidget( AchievementWidget(
imagePath: imagePath:
@ -105,19 +106,19 @@ class ListAchievementWidget extends StatelessWidget {
'assets/images/achievements/2strikeinarow_locked.png', 'assets/images/achievements/2strikeinarow_locked.png',
imagePathUnlocked: imagePathUnlocked:
'assets/images/achievements/2strikeinarow_unlocked.png', 'assets/images/achievements/2strikeinarow_unlocked.png',
isUnlocked: 1, isUnlocked: 0,
), ),
AchievementWidget( AchievementWidget(
imagePath: 'assets/images/achievements/5games_locked.png', imagePath: 'assets/images/achievements/5games_locked.png',
imagePathUnlocked: imagePathUnlocked:
'assets/images/achievements/5games_unlocked.png', 'assets/images/achievements/5games_unlocked.png',
isUnlocked: 1, isUnlocked: 0,
), ),
AchievementWidget( AchievementWidget(
imagePath: 'assets/images/achievements/10spares_locked.png', imagePath: 'assets/images/achievements/10spares_locked.png',
imagePathUnlocked: imagePathUnlocked:
'assets/images/achievements/10spares_unlocked.png', 'assets/images/achievements/10spares_unlocked.png',
isUnlocked: 1, isUnlocked: 0,
), ),
AchievementWidget( AchievementWidget(
imagePath: imagePath:
@ -152,7 +153,7 @@ class ProfileWidget extends StatelessWidget {
width: 80, width: 80,
decoration: BoxDecoration( decoration: BoxDecoration(
image: DecorationImage( image: DecorationImage(
image: AssetImage("assets/images/image_user_orange.png"), image: AssetImage(MyApp.controller.userCurrent.image),
fit: BoxFit.cover), fit: BoxFit.cover),
borderRadius: BorderRadius.all(Radius.circular(100)), borderRadius: BorderRadius.all(Radius.circular(100)),
), ),
@ -163,7 +164,7 @@ class ProfileWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
"Lucas", MyApp.controller.userCurrent.name,
style: GoogleFonts.roboto( style: GoogleFonts.roboto(
color: Colors.white, color: Colors.white,
fontStyle: FontStyle.italic, fontStyle: FontStyle.italic,
@ -186,7 +187,9 @@ class ProfileWidget extends StatelessWidget {
fontSize: 15), fontSize: 15),
), ),
TextSpan( TextSpan(
text: "122 pts", text: MyApp.controller.userCurrent.stat.highscore
.toString() +
" pts",
style: GoogleFonts.roboto( style: GoogleFonts.roboto(
color: Color(0xffF40375).withOpacity(0.75), color: Color(0xffF40375).withOpacity(0.75),
fontStyle: FontStyle.italic, fontStyle: FontStyle.italic,
@ -197,38 +200,44 @@ class ProfileWidget extends StatelessWidget {
), ),
), ),
), ),
RichText( MyApp.controller.userCurrent.games.length > 0
text: TextSpan( ? RichText(
text: '', text: TextSpan(
style: DefaultTextStyle.of(context).style, text: '',
children: <TextSpan>[ style: DefaultTextStyle.of(context).style,
TextSpan( children: <TextSpan>[
text: "Last game ", TextSpan(
style: GoogleFonts.roboto( text: "Last game ",
color: Colors.white.withOpacity(0.65), style: GoogleFonts.roboto(
fontStyle: FontStyle.italic, color: Colors.white.withOpacity(0.65),
fontWeight: FontWeight.bold, fontStyle: FontStyle.italic,
fontSize: 15), fontWeight: FontWeight.bold,
), fontSize: 15),
TextSpan( ),
text: "23", TextSpan(
style: GoogleFonts.roboto( text: DateTime.now()
color: Colors.white, .difference(MyApp
fontStyle: FontStyle.italic, .controller.userCurrent.games.first.date)
fontWeight: FontWeight.bold, .inDays
fontSize: 15), .toString(),
), style: GoogleFonts.roboto(
TextSpan( color: Colors.white,
text: " days(s) ago", fontStyle: FontStyle.italic,
style: GoogleFonts.roboto( fontWeight: FontWeight.bold,
color: Colors.white.withOpacity(0.65), fontSize: 15),
fontStyle: FontStyle.italic, ),
fontWeight: FontWeight.bold, TextSpan(
fontSize: 15), text: " days(s) ago",
), style: GoogleFonts.roboto(
], color: Colors.white.withOpacity(0.65),
), fontStyle: FontStyle.italic,
), fontWeight: FontWeight.bold,
fontSize: 15),
),
],
),
)
: Container(),
], ],
), ),
) )

@ -100,7 +100,7 @@ class GameCard extends StatelessWidget {
class StatsCard extends StatelessWidget { class StatsCard extends StatelessWidget {
final String title; final String title;
final int val; final double val;
const StatsCard({Key? key, required this.title, required this.val}) const StatsCard({Key? key, required this.title, required this.val})
: super(key: key); : super(key: key);

@ -1,13 +1,16 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:go_router/go_router.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'ingame_widgets.dart';
class ButtonNewParty extends StatelessWidget { class ButtonNewParty extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ElevatedButton( return ElevatedButton(
onPressed: () {}, onPressed: () => context.go('/in-game'),
child: Text("+ New game"), child: Text("+ New game"),
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
side: BorderSide( side: BorderSide(
@ -139,6 +142,65 @@ class NewGameModal extends StatelessWidget {
} }
} }
class ScoreBoardModal extends StatelessWidget {
const ScoreBoardModal({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Dialog(
child: Stack(
alignment: Alignment.topCenter,
children: [
Transform.scale(
scale: 1.14,
child: Image.asset("assets/images/image_scoreboard.png")),
SizedBox(
height: 245,
child:
Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Expanded(
child: Padding(
padding: EdgeInsets.fromLTRB(0, 40, 0, 0),
child: Stack(
alignment: Alignment.topCenter,
children: [
Positioned(
child: PodiumGameOverWidget(
isfirst: 2,
pseudo: 'Lucas',
score: 123,
),
top: 70,
left: 30,
),
Positioned(
child: PodiumGameOverWidget(
isfirst: 1,
pseudo: 'Momo',
score: 160,
),
top: 10,
),
Positioned(
child: PodiumGameOverWidget(
isfirst: 3,
pseudo: 'popo',
score: 110,
),
top: 70,
right: 30,
)
],
),
)),
]),
)
],
),
);
}
}
class ButtonJoinParty extends StatelessWidget { class ButtonJoinParty extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -3,6 +3,10 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import '../main.dart';
import '../model/Player.dart';
import '../model/User.dart';
class ProfilPodiumWidget extends StatelessWidget { class ProfilPodiumWidget extends StatelessWidget {
final int isfirst; final int isfirst;
final String pseudo; final String pseudo;
@ -149,58 +153,22 @@ class ListPodium extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<User> rank = MyApp.controller.userMgr.getRankingWithFriends();
return Padding( return Padding(
padding: EdgeInsets.fromLTRB(20, 80, 20, 0), padding: EdgeInsets.fromLTRB(20, 80, 20, 0),
child: SizedBox( child: SizedBox(
height: 500, height: 500,
child: ScrollConfiguration( child: ScrollConfiguration(
behavior: CustomScroll(), behavior: CustomScroll(),
child: ListView( child: ListView.builder(
children: [ itemCount: rank.length - 3,
ProfilListWidget( itemBuilder: (BuildContext context, int index) {
position: 4, return ProfilListWidget(
pseudo: 'Emre', position: 4 + index,
score: 35, pseudo: rank[index + 3].name,
), score: rank[index + 3].stat.highscore,
ProfilListWidget( );
position: 5, },
pseudo: 'Emre',
score: 35,
),
ProfilListWidget(
position: 6,
pseudo: 'Emre',
score: 35,
),
ProfilListWidget(
position: 7,
pseudo: 'Emre',
score: 35,
),
ProfilListWidget(
position: 8,
pseudo: 'Emre',
score: 35,
),
ProfilListWidget(
position: 9,
pseudo: 'Emre',
score: 35,
),
ProfilListWidget(
position: 10,
pseudo: 'Emre',
score: 35,
),
ProfilListWidget(
position: 11,
pseudo: 'Emre',
score: 35,
),
SizedBox(
height: 50,
),
],
), ),
))); )));
} }

@ -1,13 +1,23 @@
import 'package:bowl_in/main.dart';
import 'package:bowl_in/widgets/button_new_party.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:intl/intl.dart';
import 'package:simple_gradient_text/simple_gradient_text.dart'; import 'package:simple_gradient_text/simple_gradient_text.dart';
import '../model/Game.dart';
class CardGame extends StatelessWidget { class CardGame extends StatelessWidget {
final Game game;
const CardGame({Key? key, required this.game}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
initializeDateFormatting();
return Padding( return Padding(
padding: EdgeInsets.fromLTRB(41, 0, 41, 10), padding: EdgeInsets.fromLTRB(41, 0, 41, 10),
child: GestureDetector( child: GestureDetector(
@ -29,7 +39,7 @@ class CardGame extends StatelessWidget {
), ),
), ),
child: Padding( child: Padding(
padding: EdgeInsets.fromLTRB(130, 3, 0, 0), padding: EdgeInsets.fromLTRB(120, 0, 3, 0),
child: ClipRect( child: ClipRect(
clipBehavior: Clip.hardEdge, clipBehavior: Clip.hardEdge,
child: Opacity( child: Opacity(
@ -37,7 +47,7 @@ class CardGame extends StatelessWidget {
child: Stack( child: Stack(
children: [ children: [
GradientText( GradientText(
"125", game.pointsCurrentUser.toString(),
style: GoogleFonts.karla( style: GoogleFonts.karla(
fontSize: 105.0, fontSize: 105.0,
fontWeight: FontWeight.w900, fontWeight: FontWeight.w900,
@ -56,7 +66,7 @@ class CardGame extends StatelessWidget {
], ],
), ),
GradientText( GradientText(
"125", game.pointsCurrentUser.toString(),
style: GoogleFonts.karla( style: GoogleFonts.karla(
fontSize: 105.0, fontSize: 105.0,
fontWeight: FontWeight.w900, fontWeight: FontWeight.w900,
@ -77,13 +87,17 @@ class CardGame extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Padding(
mainAxisAlignment: MainAxisAlignment.end, padding: EdgeInsets.fromLTRB(5, 3, 10, 3),
children: [ child: Row(
Toast(), mainAxisAlignment: MainAxisAlignment.end,
Toast(), children: [
], Toast(
), value: DateFormat('dd MMMM', 'fr_FR')
.format(game.date)),
Toast(value: DateFormat('HH:mm').format(game.date)),
],
)),
Stack( Stack(
children: [ children: [
Row( Row(
@ -93,25 +107,23 @@ class CardGame extends StatelessWidget {
Padding( Padding(
padding: EdgeInsets.fromLTRB(25, 15, 0, 0), padding: EdgeInsets.fromLTRB(25, 15, 0, 0),
child: SizedBox( child: SizedBox(
width: 130, width: 130,
child: Wrap( child: Wrap(
spacing: 5, spacing: 5,
runSpacing: 5, runSpacing: 5,
children: [ children: game.playersId
ProfilPicture(), .map((e) => ProfilPicture(
ProfilPicture(), path: MyApp.controller.userMgr
ProfilPicture(), .getUserById(e)
ProfilPicture(), .image
ProfilPicture(), .toString(),
ProfilPicture(), ))
], .toList()))),
), const Spacer(),
)),
Spacer(),
Padding( Padding(
padding: EdgeInsets.fromLTRB(0, 30, 15, 0), padding: EdgeInsets.fromLTRB(0, 25, 15, 0),
child: GradientText( child: GradientText(
"125", game.pointsCurrentUser.toString(),
style: TextStyle( style: TextStyle(
fontSize: 40.0, fontSize: 40.0,
fontWeight: FontWeight.w900, fontWeight: FontWeight.w900,
@ -133,7 +145,13 @@ class CardGame extends StatelessWidget {
), ),
], ],
), ),
onTap: () => context.go('/in-game'), onTap: () {
showDialog(
context: context,
builder: (BuildContext context) {
return ScoreBoardModal();
});
},
)); ));
} }
} }
@ -151,36 +169,27 @@ class ListCardGame extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ScrollConfiguration( return ScrollConfiguration(
behavior: CustomScroll(), behavior: CustomScroll(),
child: ListView( child: ListView.builder(
shrinkWrap: false, shrinkWrap: false,
children: <Widget>[ itemCount: MyApp.controller.userCurrent.games.length,
CardGame(), itemBuilder: (BuildContext context, int index) {
CardGame(), return CardGame(game: MyApp.controller.userCurrent.games[index]);
CardGame(), },
CardGame(),
CardGame(),
CardGame(),
CardGame(),
CardGame(),
CardGame(),
CardGame(),
CardGame(),
CardGame(),
],
)); ));
} }
} }
class ProfilPicture extends StatelessWidget { class ProfilPicture extends StatelessWidget {
final String path;
const ProfilPicture({Key? key, required this.path}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
height: 25, height: 25,
width: 25, width: 25,
decoration: BoxDecoration( decoration: BoxDecoration(
image: DecorationImage( image: DecorationImage(image: AssetImage(path), fit: BoxFit.cover),
image: AssetImage("assets/images/image_user_green.png"),
fit: BoxFit.cover),
borderRadius: BorderRadius.all(Radius.circular(20)), borderRadius: BorderRadius.all(Radius.circular(20)),
), ),
); );
@ -188,6 +197,9 @@ class ProfilPicture extends StatelessWidget {
} }
class Toast extends StatelessWidget { class Toast extends StatelessWidget {
final String value;
const Toast({Key? key, required this.value}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(
@ -200,7 +212,7 @@ class Toast extends StatelessWidget {
child: Padding( child: Padding(
padding: EdgeInsets.fromLTRB(11.0, 3, 11.0, 3), padding: EdgeInsets.fromLTRB(11.0, 3, 11.0, 3),
child: Text( child: Text(
"12 janv.", value,
style: TextStyle( style: TextStyle(
fontSize: 10, fontSize: 10,
color: Colors.white, color: Colors.white,

@ -5,18 +5,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: archive name: archive
sha256: ed7cc591a948744994714375caf9a2ce89e1d82e8243997c8a2994d57181c212 sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.3.5" version: "3.3.6"
args: args:
dependency: transitive dependency: transitive
description: description:
name: args name: args
sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611" sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.2" version: "2.4.0"
async: async:
dependency: transitive dependency: transitive
description: description:
@ -172,10 +172,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: go_router name: go_router
sha256: f611d4396469c46db1c61e934a86e2a590ce02de2a6050d01f677879ce151f4a sha256: b4bb06205ec607278b6fc23db238278417bca84a3905779cc68d1eb7afae37e2
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.0.1" version: "6.2.0"
google_fonts: google_fonts:
dependency: "direct main" dependency: "direct main"
description: description:
@ -208,6 +208,13 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.3.0" version: "3.3.0"
intl:
dependency: "direct main"
description:
name: intl
url: "https://pub.dartlang.org"
source: hosted
version: "0.18.0"
js: js:
dependency: transitive dependency: transitive
description: description:
@ -244,10 +251,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: logging name: logging
sha256: c0bbfe94d46aedf9b8b3e695cf3bd48c8e14b35e3b2c639e0aa7755d589ba946 sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.0" version: "1.1.1"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
@ -284,47 +291,47 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path_provider name: path_provider
sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95 sha256: "04890b994ee89bfa80bf3080bfec40d5a92c5c7a785ebb02c13084a099d2b6f9"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.12" version: "2.0.13"
path_provider_android: path_provider_android:
dependency: transitive dependency: transitive
description: description:
name: path_provider_android name: path_provider_android
sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e sha256: "7623b7d4be0f0f7d9a8b5ee6879fc13e4522d4c875ab86801dee4af32b54b83e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.22" version: "2.0.23"
path_provider_foundation: path_provider_foundation:
dependency: transitive dependency: transitive
description: description:
name: path_provider_foundation name: path_provider_foundation
sha256: "6637955e38a5f1851c023482c25a60c93972ea06c8608e2f25ad0064c46c0939" sha256: eec003594f19fe2456ea965ae36b3fc967bc5005f508890aafe31fa75e41d972
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.0" version: "2.1.2"
path_provider_linux: path_provider_linux:
dependency: transitive dependency: transitive
description: description:
name: path_provider_linux name: path_provider_linux
sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 sha256: "525ad5e07622d19447ad740b1ed5070031f7a5437f44355ae915ff56e986429a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.7" version: "2.1.9"
path_provider_platform_interface: path_provider_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: path_provider_platform_interface name: path_provider_platform_interface
sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.5" version: "2.0.6"
path_provider_windows: path_provider_windows:
dependency: transitive dependency: transitive
description: description:
name: path_provider_windows name: path_provider_windows
sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c sha256: "642ddf65fde5404f83267e8459ddb4556316d3ee6d511ed193357e25caa3632d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.3" version: "2.1.3"
@ -356,10 +363,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: plugin_platform_interface name: plugin_platform_interface
sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.3" version: "2.1.4"
pointycastle: pointycastle:
dependency: transitive dependency: transitive
description: description:
@ -569,10 +576,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: xdg_directories name: xdg_directories
sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.0+3" version: "1.0.0"
xml: xml:
dependency: transitive dependency: transitive
description: description:

@ -42,6 +42,7 @@ dependencies:
uuid: ^3.0.7 uuid: ^3.0.7
postgres: ^2.6.1 postgres: ^2.6.1
localstorage: ^4.0.0+1 localstorage: ^4.0.0+1
intl: ^0.18.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

@ -5,9 +5,9 @@ import '../lib/model/Stat.dart';
import '../lib/model/Round.dart'; import '../lib/model/Round.dart';
import '../lib/model/GameDetail.dart'; import '../lib/model/GameDetail.dart';
import '../lib/model/StubManager/StubData.dart'; import '../lib/model/StubManager/StubData.dart';
import '../lib/model/IManager.dart';
import 'dart:math'; import 'dart:math';
import '../lib/model/Achievement.dart'; import '../lib/model/Achievement.dart';
import 'package:uuid/uuid.dart';
void main() { void main() {
List<Stat> stats = []; List<Stat> stats = [];
@ -15,112 +15,260 @@ void main() {
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
Stat stat = Stat( Stat stat = Stat(
random.nextInt(50) + 1, // valeur aléatoire entre 1 et 50 random.nextInt(50) + 1, // valeur aléatoire entre 1 et 50
random.nextInt(20) + 1, // valeur aléatoire entre 1 et 20 random.nextInt(20) + 1, // valeur aléatoire entre 1 et 20
random.nextInt(30) + 1, // valeur aléatoire entre 1 et 30 random.nextInt(30) + 1, // valeur aléatoire entre 1 et 30
random.nextInt(1000) + 1, // valeur aléatoire entre 1 et 1000 random.nextInt(1000) + 1, // valeur aléatoire entre 1 et 1000
random.nextInt(10) + 1, // valeur aléatoire entre 1 et 10 random.nextInt(10) + 1, // valeur aléatoire entre 1 et 10
random.nextInt(5) + 1, // valeur aléatoire entre 1 et 5 random.nextInt(5) + 1, // valeur aléatoire entre 1 et 5
random.nextInt(5000) + 1000, // valeur aléatoire entre 1000 et 6000 random.nextInt(5000) + 1000, // valeur aléatoire entre 1000 et 6000
random.nextInt(300) + 1, // valeur aléatoire entre 1 et 300 random.nextInt(300) + 1, // valeur aléatoire entre 1 et 300
random.nextDouble() * 10 // valeur aléatoire entre 0 et 10 random.nextDouble() * 10 // valeur aléatoire entre 0 et 10
); );
stats.add(stat); stats.add(stat);
} }
print("Stats:"); print("Stats:");
for (var stat in stats) { for (var stat in stats) {
print("\tVictoires: ${stat.nbVictory}, Défaites: ${stat.nbDefeat}, Parties jouées: ${stat.nbGames}, Meilleur score: ${stat.highscore}, Nombre de strikes: ${stat.nbStrikes}, Nom de spares: ${stat.nbStrikes}, Moyenne score: ${stat.avgScore}, Moyenne score par round: ${stat.avgPinsPerRound}"); print(
"\tVictoires: ${stat.nbVictory}, Défaites: ${stat.nbDefeat}, Parties jouées: ${stat.nbGames}, Meilleur score: ${stat.highscore}, Nombre de strikes: ${stat.nbStrikes}, Nom de spares: ${stat.nbStrikes}, Moyenne score: ${stat.avgScore}, Moyenne score par round: ${stat.avgPinsPerRound}");
} }
User ami = User(Uuid(), "Lucas","https://fastly.picsum.photos/id/288/2000/2000.jpg?hmac=AUboE-jzAzofYj_O3w_EqtZU3JHzcg7HR1IQd1Ce7lY","Lucas.delanier@etu.uca.fr",[],[], stats[1]); User ami = User(
5,
"Lucas",
"https://fastly.picsum.photos/id/288/2000/2000.jpg?hmac=AUboE-jzAzofYj_O3w_EqtZU3JHzcg7HR1IQd1Ce7lY",
"Lucas.delanier@etu.uca.fr",
[],
[],
stats[1]);
List<Player> players = [ List<Player> players = [
Player(Uuid(), "Rami", "https://fastly.picsum.photos/id/1060/2000/2000.jpg?hmac=_RrU8GpkCDUlVKfgyWE-GcX-GS5TKNyUzdFbJAGXHV4"), Player(1, "Rami",
Player(Uuid(), "Emre", "https://fastly.picsum.photos/id/670/2000/2000.jpg?hmac=zWqTr_vDEab3dBtp7JZgJP8TRCPNanJ4tYwDDd-jGYA"), "https://fastly.picsum.photos/id/1060/2000/2000.jpg?hmac=_RrU8GpkCDUlVKfgyWE-GcX-GS5TKNyUzdFbJAGXHV4"),
Guest(Uuid(), "Bot1","https://fastly.picsum.photos/id/820/2000/2000.jpg?hmac=Ctxx2feJNZnG1S7UPx_YrWcEw89tKb7fR8i1W-VTOz4"), Player(2, "Emre",
Guest(Uuid(), "Bot2","https://fastly.picsum.photos/id/288/2000/2000.jpg?hmac=AUboE-jzAzofYj_O3w_EqtZU3JHzcg7HR1IQd1Ce7lY"), "https://fastly.picsum.photos/id/670/2000/2000.jpg?hmac=zWqTr_vDEab3dBtp7JZgJP8TRCPNanJ4tYwDDd-jGYA"),
Guest(3, "Bot1",
"https://fastly.picsum.photos/id/820/2000/2000.jpg?hmac=Ctxx2feJNZnG1S7UPx_YrWcEw89tKb7fR8i1W-VTOz4"),
Guest(4, "Bot2",
"https://fastly.picsum.photos/id/288/2000/2000.jpg?hmac=AUboE-jzAzofYj_O3w_EqtZU3JHzcg7HR1IQd1Ce7lY"),
ami, ami,
User( User(
Uuid(), 6,
"Louison", "Louison",
"https://fastly.picsum.photos/id/1029/2000/2000.jpg?hmac=_K3pMobVk00dfNR7rsj1NLnEBB5Gf88SvGPbbjoH-Uc", "https://fastly.picsum.photos/id/1029/2000/2000.jpg?hmac=_K3pMobVk00dfNR7rsj1NLnEBB5Gf88SvGPbbjoH-Uc",
"louison.parant@etu.uca.fr", "louison.parant@etu.uca.fr",
[ [
Achievement("5 games"), Achievement("5 games"),
Achievement("2 strikes in a row"), Achievement("2 strikes in a row"),
Achievement("Win a game") Achievement("Win a game")
], ],
[ [ami],
ami stats[0])
],
stats[0]
)
]; ];
print("Players :"); print("Players :");
// afficahge de toutes les informations de tous les joueurs // afficahge de toutes les informations de tous les joueurs
for (var player in players) { for (var player in players) {
if (player is Guest) { displayPlayer(player,1);
print("\tID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: Guest");
} else if (player is User) {
print("\tID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: User");
print("\tAchievements:");
for (var achievement in player.achievements) {
print("\t\tNom: ${achievement.name}");
}
print("\tAmis:");
for (var amis in player.friends) {
print("\t\tNom: ${amis.name}, Mail: ${amis.mail}");
}
print("\tVictoires: ${player.stat.nbVictory}, Défaites: ${player.stat.nbDefeat}, Parties jouées: ${player.stat.nbGames}, Meilleur score: ${player.stat.highscore}, Nombre de strikes: ${player.stat.nbStrikes}, Nom de spares: ${player.stat.nbStrikes}, Moyenne score: ${player.stat.avgScore}, Moyenne score par round: ${player.stat.avgPinsPerRound}");
} else {
print("\tID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: Player");
}
} }
//GameDetail //GameDetail
List<GameDetail> games = [ List<GameDetail> games = [
GameDetail(Uuid(), DateTime.now(), players[0].id, 290, true, null, players[0], [ Round(10,null,10, players[0]), Round(5,2,7, players[1]), Round(5,2,7, players[1]), Round(5,1,12,players[0])], [players[0],players[1]] ), GameDetail(
GameDetail(Uuid(), DateTime.now().subtract(Duration(days: 2)), players[1].id, 250, true, null, players[1], [ Round(7,null,7, players[1]), Round(3,3,9, players[0]), Round(5,2,7, players[1]), Round(5,1,12,players[0])], [players[0],players[1]] ), 1, DateTime.now(), players[0].id, 290, true, null, players[0].id, [
GameDetail(Uuid(), DateTime.now().subtract(Duration(days: 4)), players[2].id, 210, false, null, players[2], [ Round(8,2,10, players[2]), Round(6,2,8, players[1]), Round(4,2,6, players[2]), Round(2,2,4,players[1])], [players[1],players[2]] ), Round(10, null, 10, players[0]),
GameDetail(Uuid(), DateTime.now().subtract(Duration(days: 7)), players[3].id, 120, true, Round(12,null,12, players[3]), players[3], [ Round(12,null,12, players[3]), Round(7,3,10, players[2]), Round(6,2,8, players[1]), Round(5,1,12,players[0])], [players[0],players[1],players[2],players[3]] ), Round(5, 2, 7, players[1]),
GameDetail(Uuid(), DateTime.now().subtract(Duration(days: 10)), players[4].id, 280, true, null, players[4], [ Round(9,1,10, players[4]), Round(7,3,10, players[2]), Round(8,2,10, players[3]), Round(5,2,7,players[1])], [players[1],players[2],players[3],players[4]] ), Round(5, 1, 12, players[0]),
GameDetail(Uuid(), DateTime.now().subtract(Duration(days: 12)), players[1].id, 240, true, null, players[1], [ Round(7,null,7, players[1]), Round(5,2,7, players[2]), Round(6,2,8, players[1]), Round(5,1,12,players[0])], [players[0],players[1],players[2],players[4]] ), Round(5, 2, 7, players[1]),
GameDetail(Uuid(), DateTime.now().subtract(Duration(days: 15)), players[2].id, 200, true, null, players[2], [ Round(8,2,10, players[2]), Round(4,2,6, players[1]), Round(7,3,10, players[3]), Round(5,2,7,players[0])], [players[0],players[1],players[2],players[3]] ) ], [
players[0],
players[1]
]),
GameDetail(2, DateTime.now().subtract(Duration(days: 2)),
players[1].id, 250, true, null, players[1].id, [
Round(7, null, 7, players[1]),
Round(3, 3, 9, players[0]),
Round(5, 2, 7, players[1]),
Round(5, 1, 12, players[0])
], [
players[0],
players[1]
]),
GameDetail(3, DateTime.now().subtract(Duration(days: 4)),
players[2].id, 210, false, null, players[2].id, [
Round(8, 2, 10, players[2]),
Round(6, 2, 8, players[1]),
Round(4, 2, 6, players[2]),
Round(2, 2, 4, players[1])
], [
players[1],
players[2]
]),
GameDetail(
4,
DateTime.now().subtract(Duration(days: 7)),
players[3].id,
120,
true,
Round(12, null, 12, players[3]),
players[3].id, [
Round(12, null, 12, players[3]),
Round(7, 3, 10, players[2]),
Round(6, 2, 8, players[1]),
Round(5, 1, 12, players[0])
], [
players[0],
players[1],
players[2],
players[3]
]),
GameDetail(5, DateTime.now().subtract(Duration(days: 10)),
players[4].id, 280, true, null, players[4].id, [
Round(9, 1, 10, players[4]),
Round(7, 3, 10, players[2]),
Round(8, 2, 10, players[3]),
Round(5, 2, 7, players[1])
], [
players[1],
players[2],
players[3],
players[4]
]),
GameDetail(6, DateTime.now().subtract(Duration(days: 12)),
players[1].id, 240, true, null, players[1].id, [
Round(7, null, 7, players[1]),
Round(5, 2, 7, players[2]),
Round(6, 2, 8, players[1]),
Round(5, 1, 12, players[0])
], [
players[0],
players[1],
players[2],
players[4]
]),
GameDetail(7, DateTime.now().subtract(Duration(days: 15)),
players[2].id, 200, true, null, players[2].id, [
Round(8, 2, 10, players[2]),
Round(4, 2, 6, players[1]),
Round(7, 3, 10, players[3]),
Round(5, 2, 7, players[0])
], [
players[0],
players[1],
players[2],
players[3]
])
]; ];
print("GameDetail :"); print("GameDetail :");
for (var game in games) { for (var game in games) {
print("\tGame ID: ${game.id}"); displayGameDetail(game,1);
print("\tTime: ${game.time}"); print("\t-----------------------------------------");
print("\tWinner: ${game.winner}"); }
print("\tNumber of Points: ${game.nbPoints}");
print("\tIs Finished: ${game.isFinished}"); print("StubManager:");
print("\tCurrent Round: ${game.currentRound}"); IManager mgr = new StubData();
print("\tHost: ${game.host}");
print("\tRounds:");
for (var round in game.rounds) {
print("\t\tRound Score: ${round.firstThrow}");
print("\t\tRound Bonus: ${round.secondThrow}");
print("\t\tRound Total: ${round.points}");
print("\t\tRound Player: ${round.player.name}");
}
print("\tPlayers:"); print("\tGameManager:");
for (var player in game.players) {
print("\t\tPlayer ID: ${player.id}");
print("\t\tPlayer Name: ${player.name}");
}
print("\t-----------------------------------------"); print("\tgetGameById function with id: 2");
GameDetail gd = mgr.gameMgr.getGameById(2);
displayGameDetail(gd,2);
print("StubManager:"); print("\tgetGamesByPlayerId function with id: 2");
List<GameDetail> gds = mgr.gameMgr.getGamesByPlayerId(8);
for (var game in gds)
{
displayGameDetail(game,2);
}
print("\tgetGamesByPlayer function:");
var player = mgr.userMgr.getUserById(8);
List<GameDetail> gdsPlayer = mgr.gameMgr.getGamesByPlayer(player);
for (var game in gdsPlayer)
{
displayGameDetail(game,2);
}
print("\tgetGamesByPlayers:");
var player2 = mgr.userMgr.getUserById(2);
List<Player> playersTest = [player,player2];
List<GameDetail> gdsPlayers = mgr.gameMgr.getGamesByPlayers(playersTest);
for (var game in gdsPlayers)
{
displayGameDetail(game,2);
}
print("\tgetPlayersByIdGame:");
var playersIntoGame = mgr.gameMgr.getPlayersByIdGame(2);
for (var player in playersIntoGame)
{
displayPlayer(player,2);
}
print("\tgetRankByIdGame:");
var ranksPlayers = mgr.gameMgr.getRankByIdGame(2);
ranksPlayers.forEach((id, rank) {
displayPlayer(mgr.userMgr.getUserById(id),2);
print('\t\tRank $rank');
});
} }
void displayGameDetail(GameDetail gd, int numTabs)
{
String tabs = '\t' * numTabs;
print(tabs+"Game ID: ${gd.id}");
print(tabs+"Time: ${gd.time}");
print(tabs+"Winner: ${gd.winner}");
print(tabs+"Number of Points: ${gd.nbPoints}");
print(tabs+"Is Finished: ${gd.isFinished}");
print(tabs+"Current Round: ${gd.currentRound}");
print(tabs+"Host: ${gd.host}");
print(tabs+"Rank: ${gd.getRank()}");
print(tabs+"Rounds:");
for (var round in gd.rounds) {
displayRound(round, numTabs+1);
}
print(tabs+"Players:");
for (var player in gd.players) {
displayPlayer(player, numTabs+1);
}
}
void displayRound(Round round, int numTabs)
{
String tabs = '\t' * numTabs;
print(tabs+"Round Score: ${round.firstThrow}");
print(tabs+"Round Bonus: ${round.secondThrow}");
print(tabs+"Round Total: ${round.points}");
print(tabs+"Round Player: ${round.player.name}");
} }
void displayPlayer(Player player, int numTabs)
{
String tabs = '\t' * numTabs;
if (player is Guest) {
print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: Guest");
} else if (player is User) {
print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: User");
print(tabs+"Achievements:");
for (var achievement in player.achievements) {
displayAchievement(achievement, numTabs+1);
}
print(tabs+"Amis:");
for (var amis in player.friends) {
print("\t\tNom: ${amis.name}, Mail: ${amis.mail}");
}
print(tabs+"Victoires: ${player.stat.nbVictory}, Défaites: ${player.stat.nbDefeat}, Parties jouées: ${player.stat.nbGames}, Meilleur score: ${player.stat.highscore}, Nombre de strikes: ${player.stat.nbStrikes}, Nom de spares: ${player.stat.nbStrikes}, Moyenne score: ${player.stat.avgScore}, Moyenne score par round: ${player.stat.avgPinsPerRound}");
} else {
print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: Player");
}
}
void displayAchievement(Achievement achievement, int numTabs)
{
String tabs = '\t' * numTabs;
print(tabs+"Nom: ${achievement.name}");
}
Loading…
Cancel
Save