Advertisement
SamHDev

NEA_SERVER

Dec 3rd, 2018
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 17.55 KB | None | 0 0
  1. host = "0.0.0.0"
  2. port = 8082
  3. name = "LouiseGame-Server1"
  4. print("Lousie' Game - Server")
  5.  
  6. import socket
  7. import json
  8. import threading
  9. import random
  10. import time
  11. import datetime
  12.  
  13. def log(txt,prefix="SERVER"):
  14.     print("[{}] {}".format(prefix,txt))
  15.  
  16. log("Starting..")
  17. server = socket.socket()
  18. server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  19. server.bind((host,port))
  20. log("Server Bound to {}:{}".format(host,port))
  21.  
  22. def getUser(username,password=None):
  23.     f = open("users.json","r")
  24.     data = json.loads(f.read())
  25.     f.close()
  26.     for d in data:
  27.         if (d["username"] == username):
  28.             if (password == None) or (d["password"] == password):
  29.                 return d
  30.     return None
  31.    
  32. def createUser(username,password):
  33.     f = open("users.json","r")
  34.     data = json.loads(f.read())
  35.     f.close()
  36.     data.append({"username":username,"password":password,"games":[]})
  37.     f  = open("users.json","w")
  38.     f.write(json.dumps(data,indent=4))
  39.     f.close()
  40.     return True
  41.  
  42. def addScore(user,op,res,score,scoreOp,times=datetime.datetime.now()):
  43.     scoreData = {"user":user,"op":op,"res":res,"scores":{"user":score,"op":scoreOp},"time":str(int(times.timestamp()))}
  44.     f = open("users.json","r")
  45.     data = json.loads(f.read())
  46.     f.close()
  47.     for ud in data:
  48.         if (ud["username"] == user):
  49.             data[data.index(ud)]["games"].append(scoreData)
  50.     f  = open("users.json","w")
  51.     f.write(json.dumps(data,indent=4))
  52.     f.close()
  53. def getScores(user):
  54.     f = open("users.json","r")
  55.     data = json.loads(f.read())
  56.     f.close()
  57.     for ud in data:
  58.         if (ud["username"] == user):
  59.             return ud["games"]
  60.            
  61.            
  62.  
  63. class Client():
  64.     def __init__(self,cr,addr):
  65.         self.cr = cr
  66.         self.addr = addr
  67.         self.run = True
  68.         self.thd = None
  69.        
  70.         self.username = None
  71.        
  72.         self.gameCode = None
  73.         self.gamePlayer = None
  74.     def send(self,msg):
  75.         try:
  76.             self.cr.send(msg.encode("UTF-8"))
  77.         except:
  78.             pass
  79.     def recv(self,buffer=2048):
  80.         try:
  81.             return self.cr.recv(buffer).decode("UTF-8")
  82.         except:
  83.             pass
  84.     def sendMsg(self,name,data):
  85.         self.send(json.dumps({"name":name,"data":data}))
  86.     def recvMsg(self,buffer=2048):
  87.         raw = self.recv(buffer=buffer)
  88.         rawd = json.loads(raw)
  89.         return rawd["name"],rawd["data"]
  90.     def handshake(self):
  91.         self.sendMsg("hello.send",{"server":{"name":name,"host":host,"port":port},"client":{"ip":addr[0],"vd":self.addr[1]}})
  92.         en , ed = self.recvMsg()
  93.         if (en != "hello.reply"):
  94.             self.cr.close()
  95.         else:
  96.             self.start()
  97.     def start(self):
  98.         self.thd = threading.Thread(target=self.mainloop,daemon=True)
  99.         self.thd.start()
  100.     def closeEnd(self):
  101.         if (self.username != ""):
  102.             global loggedInUsers
  103.             try:
  104.               loggedInUsers.remove(self.username)
  105.             except:
  106.               pass
  107.         if (self.gameCode != None):
  108.             if (self.gamePlayer != None):
  109.                 if (self.gameCode in games.keys()):
  110.                     if (self.gamePlayer == 1):
  111.                         games[self.gameCode].player1 = None
  112.                     else:
  113.                         games[self.gameCode].player2 = None
  114.                            
  115.                     self.gameCode == None
  116.                     self.gamePlayer = None
  117.     def mainloop(self):
  118.         while running and self.run:
  119.             try:
  120.                 en , ed = self.recvMsg()
  121.             except ValueError:
  122.                 log("Closed Connection from {}".format(self.addr[0]))
  123.                 self.closeEnd()
  124.                 self.run = False
  125.                 break
  126.                
  127.             if (en == "auth.login"):
  128.                 user = getUser(ed["username"],password=ed["password"])
  129.                 if (user == None):
  130.                     self.sendMsg("auth.fail",{"type":"Login","msg":"Invaild Login"})
  131.                     self.cr.close()
  132.                     self.run = False
  133.                     break
  134.                 else:
  135.                     global loggedInUsers
  136.                     if (ed["username"] in loggedInUsers):
  137.                         self.sendMsg("auth.fail",{"type":"Login","msg":"Already Logged In"})
  138.                     else:
  139.                         self.username = ed["username"]
  140.  
  141.                         loggedInUsers.append(self.username)
  142.                         #print(loggedInUsers)
  143.                         self.sendMsg("auth.good",{"username":self.username})
  144.             if (en == "auth.reg"):
  145.                 user = getUser(ed["username"])
  146.                 if (user == None):
  147.                     createUser(ed["username"],ed["password"])
  148.                     self.username = ed["username"]
  149.                     self.sendMsg("auth.good",{"username":self.username})
  150.                 else:
  151.                     self.sendMsg("auth.fail",{"type":"Register","msg":"Username Taken"})
  152.                     self.cr.close()
  153.                     self.run = False
  154.                     break
  155.             if (en == "scores"):
  156.                 #print("GET SCORES!")
  157.                 self.sendMsg("score.return",{"result":getScores(self.username)})
  158.             if (en == "session.quit"):
  159.                 if (self.gameCode != None):
  160.                     if (self.gamePlayer != None):
  161.                         if (self.gameCode in games.keys()):
  162.                             if (self.gamePlayer == 1):
  163.                                 games[self.gameCode].player1 = None
  164.                             else:
  165.                                 games[self.gameCode].player2 = None
  166.                            
  167.                             self.gameCode == None
  168.                             self.gamePlayer = None
  169.                            
  170.                         else:
  171.                             self.sendMsg("session.quit.fail",{"msg":"Session Invaild"})
  172.                     else:
  173.                         self.sendMsg("session.quit.fail",{"msg":"Not in Session"})
  174.                 else:
  175.                     self.sendMsg("session.quit.fail",{"msg":"Not in Session"})
  176.             if (en == "session.join"):
  177.                 code = ed["code"]
  178.                 if (code in games.keys()):
  179.                     game = games[code]
  180.                     if (game.player1 == None):
  181.                         game.player1 = self
  182.                         self.gameCode = code
  183.                         self.gamePlayer = 1
  184.                         self.sendMsg("session.join.good",{"code":game.code,"player":1,"players":[game.player1.username]})
  185.                     elif (game.player2 == None):
  186.                         game.player2 = self
  187.                         self.sendMsg("session.join.good",{"code":game.code,"player":2,"players":[game.player1.username,game.player2.username]})
  188.                         self.gameCode = code
  189.                         self.gamePlayer = 2
  190.                     else:
  191.                         self.sendMsg("session.join.fail",{"msg":"Session Full"})
  192.                 else:
  193.                     self.sendMsg("session.join.fail",{"msg":"Invaild Session Code"})
  194.             if (en == "session.create"):
  195.                 game = createGame()
  196.                 game.startGame()
  197.                 self.sendMsg("session.create.good",{"code":game.code})
  198.             if (en == "session.find"):
  199.                 fd = False
  200.                 for gk in games.keys():
  201.                     g = games[gk]
  202.                     if (g.state == 0):
  203.                         if (g.player1 == None) or (g.player2 == None):
  204.                             self.sendMsg("session.find.good",{"code":g.code})
  205.                             fd = True
  206.                 if (fd == False):
  207.                     game = createGame()
  208.                     game.startGame()
  209.                     self.sendMsg("session.find.good",{"code":game.code})
  210.                
  211.                
  212. games = {}
  213.  
  214. class Game():
  215.     def __init__(self,code):
  216.         self.code = code
  217.         self.state = 0
  218.         self.player1 = None
  219.         self.player2 = None
  220.        
  221.         self.thd = None
  222.        
  223.         self.cards = []
  224.        
  225.         self.p1s = 0
  226.         self.p2s = 0
  227.        
  228.         self.round = 0
  229.        
  230.         self.loops = True
  231.     def genCards(self):
  232.         colors = ["red","black","green"]
  233.         nos = ["1","2","3","4","5","6","7","8","9","0"]
  234.         for cl in colors:
  235.             for no in nos:
  236.                 self.cards.append([cl,no])
  237.         random.shuffle(self.cards)
  238.         #print(self.cards)
  239.        
  240.     def startGame(self):
  241.         self.genCards()
  242.         self.thd = threading.Thread(target=self.gameLoop,daemon=True)
  243.         self.thd.start()
  244.        
  245.     def broadcast(self,name,data):
  246.         try:
  247.             self.player1.sendMsg(name,data)
  248.         except:
  249.             pass
  250.         try:
  251.             self.player2.sendMsg(name,data)
  252.         except:
  253.             pass
  254.     def checkPlayers(self):
  255.         if (self.player1 == None) or (self.player2 == None):
  256.             self.loops = False
  257.             if (self.player1 == None):
  258.                 opExit = [1,self.player1]
  259.             else:
  260.                 opExit = [2,self.player2]
  261.             try:
  262.                 self.player1.sendMsg("game.exit",{"reason":"Player {} Quit the Game".format(opExit[0])})
  263.             except:
  264.                 pass
  265.             try:
  266.                 self.player2.sendMsg("game.exit",{"reason":"Player {} Quit the Game".format(opExit[0])})
  267.             except:
  268.                 pass
  269.            
  270.            
  271.  
  272.     def gameLoop(self):
  273.         while self.loops:
  274.             if (self.state == 0):
  275.                 time.sleep(1)
  276.                 if (self.player1 != None) and (self.player2 != None):
  277.                     time.sleep(1)
  278.                     self.player1.sendMsg("game.start",{"op":self.player2.username,"opno":2})
  279.                     self.player2.sendMsg("game.start",{"op":self.player1.username,"opno":1})
  280.                     time.sleep(4)
  281.                     self.checkPlayers()
  282.                     #print("Game Start")
  283.                     self.state = 1
  284.             if (self.state == 1):
  285.                 for i in range(0,15):
  286.                     time.sleep(1)
  287.                     self.checkPlayers()
  288.                     self.broadcast("game.blank",{})
  289.                     time.sleep(4)
  290.                     self.checkPlayers()
  291.                     try:
  292.                         carda = random.choice(self.cards)
  293.                         self.cards.remove(carda)
  294.                         cardb = random.choice(self.cards)
  295.                         self.cards.remove(cardb)
  296.                     except:
  297.                         pass
  298.                     try:
  299.                         self.player1.sendMsg("game.card",{"card":carda})
  300.                         self.player2.sendMsg("game.card",{"card":cardb})
  301.                     except:
  302.                         pass
  303.                     time.sleep(4)
  304.                     self.checkPlayers()
  305.                     try:
  306.                         self.player1.sendMsg("game.opcard",{"yourCard":carda,"opCard":cardb})
  307.                         self.player2.sendMsg("game.opcard",{"yourCard":cardb,"opCard":carda})
  308.                     except:
  309.                         pass
  310.                     time.sleep(4)
  311.                     self.checkPlayers()
  312.                     try:
  313.                         if (int(carda[1]) == int(cardb[1])):
  314.                             if (carda[0] == "red") and (cardb[0] == "black"):
  315.                                 #self.p2s = self.p2s - 1
  316.                                 self.p1s = self.p1s + 1
  317.                                 self.player2.sendMsg("game.winScore",{"win":False,"name":self.player1.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
  318.                                 self.player1.sendMsg("game.winScore",{"win":True,"name":self.player1.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
  319.                             if (carda[0] == "green") and (cardb[0] == "red"):
  320.                                 #self.p2s = self.p2s - 1
  321.                                 self.p1s = self.p1s + 1
  322.                                 self.player2.sendMsg("game.winScore",{"win":False,"name":self.player1.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
  323.                                 self.player1.sendMsg("game.winScore",{"win":True,"name":self.player1.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
  324.                             if (carda[0] == "black") and (cardb[0] == "green"):
  325.                                 #self.p2s = self.p2s - 1
  326.                                 self.p1s = self.p1s + 1
  327.                                 self.player2.sendMsg("game.winScore",{"win":False,"name":self.player1.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
  328.                                 self.player1.sendMsg("game.winScore",{"win":True,"name":self.player1.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
  329.                             if (carda[0] == "black") and (cardb[0] == "red"):
  330.                                 #self.p1s = self.p1s -1
  331.                                 self.p2s = self.p2s + 1
  332.                                 self.player1.sendMsg("game.winScore",{"win":False,"name":self.player2.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
  333.                                 self.player2.sendMsg("game.winScore",{"win":True,"name":self.player2.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
  334.                             if (carda[0] == "red") and (cardb[0] == "green"):
  335.                                 #self.p1s = self.p1s -1
  336.                                 self.p2s = self.p2s + 1
  337.                                 self.player1.sendMsg("game.winScore",{"win":False,"name":self.player2.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
  338.                                 self.player2.sendMsg("game.winScore",{"win":True,"name":self.player2.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
  339.                             if (carda[0] == "green") and (cardb[0] == "black"):
  340.                                 #self.p1s = self.p1s -1
  341.                                 self.p2s = self.p2s + 1
  342.                                 self.player1.sendMsg("game.winScore",{"win":False,"name":self.player2.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
  343.                                 self.player2.sendMsg("game.winScore",{"win":True,"name":self.player2.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
  344.                         elif (int(carda[1]) < int(cardb[1])):
  345.                             #self.p1s = self.p1s -1
  346.                             self.p2s = self.p2s + 1
  347.                             self.player1.sendMsg("game.winScore",{"win":False,"name":self.player2.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
  348.                             self.player2.sendMsg("game.winScore",{"win":True,"name":self.player2.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
  349.                         elif (int(carda[1]) > int(cardb[1])):
  350.                             #self.p2s = self.p2s - 1
  351.                             self.p1s = self.p1s + 1
  352.                             self.player2.sendMsg("game.winScore",{"win":False,"name":self.player1.username,"yourScore":self.p2s,"opName":self.player1.username,"opScore":self.p1s})
  353.                             self.player1.sendMsg("game.winScore",{"win":True,"name":self.player1.username,"yourScore":self.p1s,"opName":self.player2.username,"opScore":self.p2s})
  354.                     except:
  355.                         pass
  356.                         #self.checkPlayers()
  357.                     time.sleep(4)
  358.                 self.checkPlayers()
  359.                 self.state = 2
  360.                 p1v = 0
  361.                 p2v = 0
  362.                 if (self.p1s < self.p2s):
  363.                     p1v = 1
  364.                     p2v = 3
  365.                 if (self.p1s > self.p2s):
  366.                     p1v = 3
  367.                     p2v = 1
  368.                 if (self.p1s == self.p2s):
  369.                     p1v = 2
  370.                     p2v = 2
  371.                 self.player1.sendMsg("game.end",{"state":p1v,"opName":self.player2.username,"score":self.p1s,"opScore":self.p2s})
  372.                 self.player2.sendMsg("game.end",{"state":p2v,"opName":self.player1.username,"score":self.p2s,"opScore":self.p1s})
  373.                 addScore(self.player1.username,self.player2.username,p1v,self.p1s,self.p2s)
  374.                 addScore(self.player2.username,self.player1.username,p2v,self.p2s,self.p1s)
  375.                 time.sleep(10)
  376.                 self.checkPlayers()
  377.                 self.player1.sendMsg("session.end",{})
  378.                 self.player2.sendMsg("session.end",{})
  379.                 del games[self.code]
  380.                 #clear()
  381.                 self.loops = False
  382.        
  383. def createGame():
  384.     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"]
  385.     code = ""
  386.     for i in range(0,4):
  387.         code = code + random.choice(alpha)
  388.     gm = Game(code)
  389.     games[code] = gm
  390.     return gm
  391.    
  392.  
  393. running = True
  394. log("Listening for Players ...")
  395.  
  396. loggedInUsers = []
  397. while running:
  398.     server.listen(1)
  399.     cr , addr = server.accept()
  400.     log("New Connection from {}".format(addr[0]))
  401.     cv = Client(cr,addr)
  402.     cv.handshake()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement