Skip to content

Commit

Permalink
Merge pull request #8 from udayaKavinda/main
Browse files Browse the repository at this point in the history
ux updated
  • Loading branch information
udayaKavinda authored Jan 4, 2024
2 parents f0053bf + 61d04d9 commit 25b7b1a
Show file tree
Hide file tree
Showing 20 changed files with 655 additions and 18 deletions.
86 changes: 85 additions & 1 deletion code/server/index.js
Original file line number Diff line number Diff line change
@@ -1 +1,85 @@
console.log("udaya")
const express = require("express");
const app = express();
const http = require("http");
const { mongoose } = require("mongoose");
const { Socket } = require("socket.io");
const Room = require("./models/room");

const port=process.env.PORT || 3000;
var server =http.createServer(app);

var io=require("socket.io")(server);

app.use(express.json());

// database
const DB="mongodb+srv://namal:[email protected]/?retryWrites=true&w=majority";
mongoose.connect(DB).then(()=>{
console.log("DB connection established");
}).catch(err => console.log(err) );
//database

io.on("connection",(socket)=>{
try{
console.log("IO connection established");
socket.on("createOrJoinRoom",async ()=>{
let room =await Room.findOne({isJoin:true});
if(room){
const roomId=room._id.toString();
room.isJoin = false;
let player = {
socketID:socket.id,
playerType:"Black",
}
room.players.push(player);
room = await room.save();
socket.join(roomId);
const roomSockets = io.sockets.adapter.rooms.get(roomId);
const allSocketIds = Array.from(roomSockets);
const otherSocketId = allSocketIds.find(socketId => socketId !== socket.id);
io.to(otherSocketId).emit("joinRoomSuccess",room);
room.isWhite=false;
io.to(socket.id).emit("joinRoomSuccess",room);
console.log(roomId);
}else{
room =new Room();
const roomId=room._id.toString();
let player ={
socketID:socket.id,
playerType:"White",
}
room.players.push(player);
room.isWhite=true;
room=await room.save();
socket.join(roomId);
io.to(roomId).emit("createRoomSuccess",room);
console.log(roomId);
}
});
}catch(e){
console.log(e);
}


socket.on('chessMove', (data) => {
try{
console.log(data);
socket.join(data.roomId);
io.to(data.roomId).emit('chessMove', data);
}catch(e){
console.log(e);
}
});


});



// app.get("/", function(req, res) {
// res.send("no"+process.env.PORT);
// });

server.listen(port, "0.0.0.0", () => {
console.log("udaya " +port);
});
22 changes: 22 additions & 0 deletions code/server/models/players.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const mongoose = require('mongoose');

const playerSchema = new mongoose.Schema({
nickname: {
type:String,
trim:true,
},
socketID: {
type:String,
},
points:{
type:Number,
default:0,
},
playerType: {
required:true,
type:String,
}

});

module.exports =playerSchema;
24 changes: 24 additions & 0 deletions code/server/models/room.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
const mongoose = require('mongoose');
const playerSchema = require('./players');

const roomSchema =new mongoose.Schema({
gameModeOnline:{
required:true,
type:Boolean,
default:true,
},
players:[playerSchema],

isJoin:{
type:Boolean,
default:true,
},
isWhite:{
type:Boolean,
default:true,
},

});

const roomModel = mongoose.model('Room',roomSchema);
module.exports =roomModel;
4 changes: 2 additions & 2 deletions code/server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
"description": "",
"main": "index.js",
"scripts": {
"start": "node ./index.js",
"dev": "nodemon ./index.js"
"start": "node index.js",
"dev": "nodemon index.js"
},
"keywords": [],
"author": "",
Expand Down
Binary file added code/server/server.zip
Binary file not shown.
31 changes: 22 additions & 9 deletions code/smartchessboard/lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import 'package:flutter/material.dart';
import 'package:smartchessboard/provider/room_data_provider.dart';
import 'package:smartchessboard/provider/move_data_provider.dart'; // Import your MoveDataProvider class
import 'package:smartchessboard/screens/create_room_screen.dart';
import 'package:smartchessboard/screens/game_screen.dart';
import 'package:smartchessboard/screens/join_room_screen.dart';
import 'package:smartchessboard/screens/main_menu_screen.dart';
import 'package:provider/provider.dart';

void main() {
runApp(const MyApp());
Expand All @@ -12,15 +16,24 @@ class MyApp extends StatelessWidget {

@override
Widget build(BuildContext context) {
return MaterialApp(
title: "chess",
debugShowCheckedModeBanner: false,
initialRoute: MainMenuScreen.routeName,
routes: {
MainMenuScreen.routeName: (context) => const MainMenuScreen(),
JoinRoomScreen.routeName: (context) => const JoinRoomScreen(),
CreateRoomScreen.routeName: (context) => const CreateRoomScreen(),
},
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => RoomDataProvider()),
ChangeNotifierProvider(
create: (context) =>
MoveDataProvider()), // Add your MoveDataProvider here
],
child: MaterialApp(
title: "chess",
debugShowCheckedModeBanner: false,
initialRoute: MainMenuScreen.routeName,
routes: {
MainMenuScreen.routeName: (context) => const MainMenuScreen(),
JoinRoomScreen.routeName: (context) => const JoinRoomScreen(),
CreateRoomScreen.routeName: (context) => const CreateRoomScreen(),
GameScreen.routeName: (context) => const GameScreen(),
},
),
);
}
}
22 changes: 22 additions & 0 deletions code/smartchessboard/lib/models/player.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
class Player {
String nickname;
String socketID;
int points;
String playerType;

Player({
required this.nickname,
required this.socketID,
this.points = 0,
required this.playerType,
});

factory Player.fromJson(Map<String, dynamic> json) {
return Player(
nickname: json['nickname'] ?? "udaya",
socketID: json['socketID'],
points: json['points'] ?? 0,
playerType: json['playerType'],
);
}
}
29 changes: 29 additions & 0 deletions code/smartchessboard/lib/models/room.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import 'package:smartchessboard/models/player.dart';

class Room {
bool gameModeOnline;
List<Player>? players;
bool? isJoin;
bool isWhite;
String roomId;

Room({
required this.gameModeOnline,
this.players,
this.isJoin,
this.isWhite = true,
this.roomId = "",
});

factory Room.fromJson(Map<String, dynamic> json) {
return Room(
roomId: json["_id"],
gameModeOnline: json['gameModeOnline'],
players: (json['players'] as List<dynamic>)
.map((playerJson) => Player.fromJson(playerJson))
.toList(),
isJoin: json['isJoin'],
isWhite: json['isWhite'],
);
}
}
19 changes: 19 additions & 0 deletions code/smartchessboard/lib/models/short_move.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
class ShortMove {
String from;
String to;
String nextPlayer;

ShortMove({
required this.from,
required this.to,
this.nextPlayer = "white",
});

factory ShortMove.fromJson(Map<String, dynamic> json) {
return ShortMove(
from: json['from'],
to: json['to'],
nextPlayer: json['nextPlayer'] ?? "white",
);
}
}
13 changes: 13 additions & 0 deletions code/smartchessboard/lib/provider/move_data_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'package:flutter/material.dart';
import 'package:smartchessboard/models/short_move.dart';

class MoveDataProvider extends ChangeNotifier {
ShortMove _shortMoveData = ShortMove(from: "a1", to: "b1"); //

ShortMove? get shortMoveData => _shortMoveData;

void updateMoveData(Map<String, dynamic> data) {
_shortMoveData = ShortMove.fromJson(data);
notifyListeners();
}
}
13 changes: 13 additions & 0 deletions code/smartchessboard/lib/provider/room_data_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'package:flutter/material.dart';
import 'package:smartchessboard/models/room.dart';

class RoomDataProvider extends ChangeNotifier {
Room? _roomData; // Assuming Room is a class representing your room structure

Room? get roomData => _roomData;

void updateRoomData(Map<String, dynamic> data) {
_roomData = Room.fromJson(data);
notifyListeners();
}
}
19 changes: 19 additions & 0 deletions code/smartchessboard/lib/resources/socket_client.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// ignore: library_prefixes
import 'package:socket_io_client/socket_io_client.dart' as IO;

class SocketClient {
IO.Socket? socket;
static SocketClient? _instance;

SocketClient._internal() {
socket = IO.io('http://192.168.1.100:3000', <String, dynamic>{
'transports': ['websocket'],
'autoconnect': false,
});
socket!.connect();
}
static SocketClient get instance {
_instance ??= SocketClient._internal();
return _instance!;
}
}
73 changes: 73 additions & 0 deletions code/smartchessboard/lib/resources/socket_methods.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartchessboard/models/short_move.dart';
import 'package:smartchessboard/provider/move_data_provider.dart';
import 'package:smartchessboard/provider/room_data_provider.dart';
import 'package:smartchessboard/resources/socket_client.dart';
import 'package:smartchessboard/screens/game_screen.dart';
import 'package:smartchessboard/utils/utils.dart';

class SocketMethods {
final _socketClient = SocketClient.instance.socket!;

void createOrJoinRoom() {
_socketClient.emit("createOrJoinRoom", {
'nickname': "online",
});
}

// void joinRoom(String nickname, String roomId) {
// if (nickname.isNotEmpty && roomId.isNotEmpty) {
// _socketClient.emit('joinRoom', {
// 'nickname': nickname,
// 'roomId': roomId,
// });
// }
// }

void createRoomSuccessListener(BuildContext context) {
_socketClient.on('createRoomSuccess', (room) {
print("createRoomSuccess");
});
}

void joinRoomSuccessListener(BuildContext context) {
_socketClient.on('joinRoomSuccess', (room) {
Provider.of<RoomDataProvider>(context, listen: false)
.updateRoomData(room);
print("joinRoomSuccess");
Navigator.pushNamed(context, GameScreen.routeName);
});
}

void errorOccuredListener(BuildContext context) {
_socketClient.on('errorOccurred', (data) {
showSnackBar(context, data);
});
}

void listenChessMoves(BuildContext context) {
_socketClient.on('chessMove', (data) {
Provider.of<MoveDataProvider>(context, listen: false)
.updateMoveData(data);
});
}

void sendChessMove(String from, String to, String roomId, String nextPlayer) {
_socketClient.emit('chessMove', {
'roomId': roomId,
'from': from,
'to': to,
'nextPlayer': nextPlayer,
});
}

void disposeChessMoveSockets() {
_socketClient.off('chessMove');
}

void disposeCrateJoinSockets() {
_socketClient.off('createRoomSuccess');
_socketClient.off('joinRoomSuccess');
}
}
Loading

0 comments on commit 25b7b1a

Please sign in to comment.