Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- host = "0.0.0.0"
- port = 8082
- name = "LouiseGame-Server1"
- print("Lousie' Game - Server")
- import socket
- import json
- import threading
- import random
- import time
- import datetime
- def log(txt,prefix="SERVER"):
- print("[{}] {}".format(prefix,txt))
- log("Starting..")
- server = socket.socket()
- server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- server.bind((host,port))
- log("Server Bound to {}:{}".format(host,port))
- def getUser(username,password=None):
- f = open("users.json","r")
- data = json.loads(f.read())
- f.close()
- for d in data:
- if (d["username"] == username):
- if (password == None) or (d["password"] == password):
- return d
- return None
- def createUser(username,password):
- f = open("users.json","r")
- data = json.loads(f.read())
- f.close()
- data.append({"username":username,"password":password,"games":[]})
- f = open("users.json","w")
- f.write(json.dumps(data,indent=4))
- f.close()
- return True
- def addScore(user,op,res,score,scoreOp,times=datetime.datetime.now()):
- scoreData = {"user":user,"op":op,"res":res,"scores":{"user":score,"op":scoreOp},"time":str(int(times.timestamp()))}
- f = open("users.json","r")
- data = json.loads(f.read())
- f.close()
- for ud in data:
- if (ud["username"] == user):
- data[data.index(ud)]["games"].append(scoreData)
- f = open("users.json","w")
- f.write(json.dumps(data,indent=4))
- f.close()
- def getScores(user):
- f = open("users.json","r")
- data = json.loads(f.read())
- f.close()
- for ud in data:
- if (ud["username"] == user):
- return ud["games"]
- class Client():
- def __init__(self,cr,addr):
- self.cr = cr
- self.addr = addr
- self.run = True
- self.thd = None
- self.username = None
- self.gameCode = None
- self.gamePlayer = None
- def send(self,msg):
- try:
- self.cr.send(msg.encode("UTF-8"))
- except:
- pass
- def recv(self,buffer=2048):
- try:
- return self.cr.recv(buffer).decode("UTF-8")
- except:
- pass
- def sendMsg(self,name,data):
- self.send(json.dumps({"name":name,"data":data}))
- def recvMsg(self,buffer=2048):
- raw = self.recv(buffer=buffer)
- rawd = json.loads(raw)
- return rawd["name"],rawd["data"]
- def handshake(self):
- self.sendMsg("hello.send",{"server":{"name":name,"host":host,"port":port},"client":{"ip":addr[0],"vd":self.addr[1]}})
- en , ed = self.recvMsg()
- if (en != "hello.reply"):
- self.cr.close()
- else:
- self.start()
- def start(self):
- self.thd = threading.Thread(target=self.mainloop,daemon=True)
- self.thd.start()
- def closeEnd(self):
- if (self.username != ""):
- global loggedInUsers
- try:
- loggedInUsers.remove(self.username)
- except:
- pass
- if (self.gameCode != None):
- if (self.gamePlayer != None):
- if (self.gameCode in games.keys()):
- if (self.gamePlayer == 1):
- games[self.gameCode].player1 = None
- else:
- games[self.gameCode].player2 = None
- self.gameCode == None
- self.gamePlayer = None
- def mainloop(self):
- while running and self.run:
- try:
- en , ed = self.recvMsg()
- except ValueError:
- log("Closed Connection from {}".format(self.addr[0]))
- self.closeEnd()
- self.run = False
- break
- if (en == "auth.login"):
- user = getUser(ed["username"],password=ed["password"])
- if (user == None):
- self.sendMsg("auth.fail",{"type":"Login","msg":"Invaild Login"})
- self.cr.close()
- self.run = False
- break
- else:
- global loggedInUsers
- if (ed["username"] in loggedInUsers):
- self.sendMsg("auth.fail",{"type":"Login","msg":"Already Logged In"})
- else:
- self.username = ed["username"]
- loggedInUsers.append(self.username)
- #print(loggedInUsers)
- self.sendMsg("auth.good",{"username":self.username})
- if (en == "auth.reg"):
- user = getUser(ed["username"])
- if (user == None):
- createUser(ed["username"],ed["password"])
- self.username = ed["username"]
- self.sendMsg("auth.good",{"username":self.username})
- else:
- self.sendMsg("auth.fail",{"type":"Register","msg":"Username Taken"})
- self.cr.close()
- self.run = False
- break
- if (en == "scores"):
- #print("GET SCORES!")
- self.sendMsg("score.return",{"result":getScores(self.username)})
- if (en == "session.quit"):
- if (self.gameCode != None):
- if (self.gamePlayer != None):
- if (self.gameCode in games.keys()):
- if (self.gamePlayer == 1):
- games[self.gameCode].player1 = None
- else:
- games[self.gameCode].player2 = None
- self.gameCode == None
- self.gamePlayer = None
- else:
- self.sendMsg("session.quit.fail",{"msg":"Session Invaild"})
- else:
- self.sendMsg("session.quit.fail",{"msg":"Not in Session"})
- else:
- self.sendMsg("session.quit.fail",{"msg":"Not in Session"})
- if (en == "session.join"):
- code = ed["code"]
- if (code in games.keys()):
- game = games[code]
- if (game.player1 == None):
- game.player1 = self
- self.gameCode = code
- self.gamePlayer = 1
- self.sendMsg("session.join.good",{"code":game.code,"player":1,"players":[game.player1.username]})
- elif (game.player2 == None):
- game.player2 = self
- self.sendMsg("session.join.good",{"code":game.code,"player":2,"players":[game.player1.username,game.player2.username]})
- self.gameCode = code
- self.gamePlayer = 2
- else:
- self.sendMsg("session.join.fail",{"msg":"Session Full"})
- else:
- self.sendMsg("session.join.fail",{"msg":"Invaild Session Code"})
- if (en == "session.create"):
- game = createGame()
- game.startGame()
- self.sendMsg("session.create.good",{"code":game.code})
- if (en == "session.find"):
- fd = False
- for gk in games.keys():
- g = games[gk]
- if (g.state == 0):
- if (g.player1 == None) or (g.player2 == None):
- self.sendMsg("session.find.good",{"code":g.code})
- fd = True
- if (fd == False):
- game = createGame()
- game.startGame()
- self.sendMsg("session.find.good",{"code":game.code})
- games = {}
- class Game():
- def __init__(self,code):
- self.code = code
- self.state = 0
- self.player1 = None
- self.player2 = None
- self.thd = None
- self.cards = []
- self.p1s = 0
- self.p2s = 0
- self.round = 0
- self.loops = True
- def genCards(self):
- colors = ["red","black","green"]
- nos = ["1","2","3","4","5","6","7","8","9","0"]
- for cl in colors:
- for no in nos:
- self.cards.append([cl,no])
- random.shuffle(self.cards)
- #print(self.cards)
- def startGame(self):
- self.genCards()
- self.thd = threading.Thread(target=self.gameLoop,daemon=True)
- self.thd.start()
- def broadcast(self,name,data):
- try:
- self.player1.sendMsg(name,data)
- except:
- pass
- try:
- self.player2.sendMsg(name,data)
- except:
- pass
- def checkPlayers(self):
- if (self.player1 == None) or (self.player2 == None):
- self.loops = False
- if (self.player1 == None):
- opExit = [1,self.player1]
- else:
- opExit = [2,self.player2]
- try:
- self.player1.sendMsg("game.exit",{"reason":"Player {} Quit the Game".format(opExit[0])})
- except:
- pass
- try:
- self.player2.sendMsg("game.exit",{"reason":"Player {} Quit the Game".format(opExit[0])})
- except:
- pass
- def gameLoop(self):
- while self.loops:
- if (self.state == 0):
- time.sleep(1)
- if (self.player1 != None) and (self.player2 != None):
- time.sleep(1)
- self.player1.sendMsg("game.start",{"op":self.player2.username,"opno":2})
- self.player2.sendMsg("game.start",{"op":self.player1.username,"opno":1})
- time.sleep(4)
- self.checkPlayers()
- #print("Game Start")
- self.state = 1
- if (self.state == 1):
- for i in range(0,15):
- time.sleep(1)
- self.checkPlayers()
- self.broadcast("game.blank",{})
- time.sleep(4)
- self.checkPlayers()
- try:
- carda = random.choice(self.cards)
- self.cards.remove(carda)
- cardb = random.choice(self.cards)
- self.cards.remove(cardb)
- except:
- pass
- try:
- self.player1.sendMsg("game.card",{"card":carda})
- self.player2.sendMsg("game.card",{"card":cardb})
- except:
- pass
- time.sleep(4)
- self.checkPlayers()
- try:
- self.player1.sendMsg("game.opcard",{"yourCard":carda,"opCard":cardb})
- self.player2.sendMsg("game.opcard",{"yourCard":cardb,"opCard":carda})
- except:
- pass
- time.sleep(4)
- self.checkPlayers()
- try:
- if (int(carda[1]) == int(cardb[1])):
- if (carda[0] == "red") and (cardb[0] == "black"):
- #self.p2s = self.p2s - 1
- self.p1s = self.p1s + 1
- self.player2.sendMsg("game.winScore",{"win":False,"name":self.player1.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
- self.player1.sendMsg("game.winScore",{"win":True,"name":self.player1.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
- if (carda[0] == "green") and (cardb[0] == "red"):
- #self.p2s = self.p2s - 1
- self.p1s = self.p1s + 1
- self.player2.sendMsg("game.winScore",{"win":False,"name":self.player1.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
- self.player1.sendMsg("game.winScore",{"win":True,"name":self.player1.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
- if (carda[0] == "black") and (cardb[0] == "green"):
- #self.p2s = self.p2s - 1
- self.p1s = self.p1s + 1
- self.player2.sendMsg("game.winScore",{"win":False,"name":self.player1.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
- self.player1.sendMsg("game.winScore",{"win":True,"name":self.player1.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
- if (carda[0] == "black") and (cardb[0] == "red"):
- #self.p1s = self.p1s -1
- self.p2s = self.p2s + 1
- self.player1.sendMsg("game.winScore",{"win":False,"name":self.player2.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
- self.player2.sendMsg("game.winScore",{"win":True,"name":self.player2.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
- if (carda[0] == "red") and (cardb[0] == "green"):
- #self.p1s = self.p1s -1
- self.p2s = self.p2s + 1
- self.player1.sendMsg("game.winScore",{"win":False,"name":self.player2.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
- self.player2.sendMsg("game.winScore",{"win":True,"name":self.player2.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
- if (carda[0] == "green") and (cardb[0] == "black"):
- #self.p1s = self.p1s -1
- self.p2s = self.p2s + 1
- self.player1.sendMsg("game.winScore",{"win":False,"name":self.player2.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
- self.player2.sendMsg("game.winScore",{"win":True,"name":self.player2.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
- elif (int(carda[1]) < int(cardb[1])):
- #self.p1s = self.p1s -1
- self.p2s = self.p2s + 1
- self.player1.sendMsg("game.winScore",{"win":False,"name":self.player2.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
- self.player2.sendMsg("game.winScore",{"win":True,"name":self.player2.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
- elif (int(carda[1]) > int(cardb[1])):
- #self.p2s = self.p2s - 1
- self.p1s = self.p1s + 1
- self.player2.sendMsg("game.winScore",{"win":False,"name":self.player1.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
- self.player1.sendMsg("game.winScore",{"win":True,"name":self.player1.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
- except:
- pass
- #self.checkPlayers()
- time.sleep(4)
- self.checkPlayers()
- self.state = 2
- p1v = 0
- p2v = 0
- if (self.p1s < self.p2s):
- p1v = 1
- p2v = 3
- if (self.p1s > self.p2s):
- p1v = 3
- p2v = 1
- if (self.p1s == self.p2s):
- p1v = 2
- p2v = 2
- self.player1.sendMsg("game.end",{"state":p1v,"opName":self.player2.username,"score":self.p1s,"opScore":self.p2s})
- self.player2.sendMsg("game.end",{"state":p2v,"opName":self.player1.username,"score":self.p2s,"opScore":self.p1s})
- addScore(self.player1.username,self.player2.username,p1v,self.p1s,self.p2s)
- addScore(self.player2.username,self.player1.username,p2v,self.p2s,self.p1s)
- time.sleep(10)
- self.checkPlayers()
- self.player1.sendMsg("session.end",{})
- self.player2.sendMsg("session.end",{})
- del games[self.code]
- #clear()
- self.loops = False
- def createGame():
- alpha = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
- code = ""
- for i in range(0,4):
- code = code + random.choice(alpha)
- gm = Game(code)
- games[code] = gm
- return gm
- running = True
- log("Listening for Players ...")
- loggedInUsers = []
- while running:
- server.listen(1)
- cr , addr = server.accept()
- log("New Connection from {}".format(addr[0]))
- cv = Client(cr,addr)
- cv.handshake()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement