def get(self, *args, **kwargs): userId = self.get_secure_cookie("userId").decode("utf-8") friendId = self.get_argument("friendId") viewName = "user_" + str(userId) + "_message" rowNumber = cursor.execute( "SELECT a.content,a.type FROM (SELECT * FROM " + viewName + " WHERE related_user=%s ORDER BY update_time DESC LIMIT 20) a ORDER BY a.update_time", friendId) returnData = [] for i in range(0, rowNumber): row = cursor.fetchone() returnData.append(row) self.write(json.dumps(returnData, ensure_ascii=False)) logging.info("用户:" + userId + "获取消息成功!")
def post(self, *args, **kwargs): # 获取用户id userId = self.get_secure_cookie('userId').decode("utf-8") friendId = self.get_argument("friendId") # 获取messageFriendList messageFriendList = getMessageFriendList(userId) # 将待删除friendId与messageFriendList中进行比对 # 若messageFriendlist长度为1,则直接删除 # 若报送的friendId已为激活状态则将上一位设置为激活状态,并删除 # 若不为激活状态则直接删除 if len(messageFriendList) != 1: for key in range(0, len(messageFriendList)): if str(messageFriendList[key]["friendId"]) == friendId: if messageFriendList[key]["activeState"] == 1: cursor.execute( "UPDATE message_friend_list SET active_state=1 WHERE user_id=%s AND friend_id=%s", (userId, messageFriendList[key - 1]["friendId"])) break cursor.execute( "DELETE FROM message_friend_list WHERE user_id=%s AND friend_id=%s", (userId, friendId)) logging.info("用户" + userId + "删除消息列表好友成功!") returnResult = {"status": "00"} self.write(json.dumps(returnResult, ensure_ascii=False))
def getMessageFriendList(userId): messageFriendList = [] rowNumber = cursor.execute( "SELECT a.user_id,a.friend_id,b.username,c.avatar,a.message_number,a.active_state FROM message_friend_list AS a LEFT JOIN user AS b ON a.friend_id=b.user_id LEFT JOIN user_info AS c ON b.user_id=c.user_id WHERE a.user_id=%s ORDER BY id", userId) for i in range(0, rowNumber): row = cursor.fetchone() temp = { "friendId": row["friend_id"], "username": row["username"], "avatar": row["avatar"], "messageNumber": row["message_number"], "activeState": row["active_state"] } messageFriendList.append(temp) return messageFriendList
def post(self, *args, **kwargs): username = self.get_argument("username") code = self.get_argument("code") code2 = hashlib.md5( ("s" + code + "a" + username + "ult").encode("utf-8")).hexdigest() con.ping() row_number = cursor.execute( "select * from user WHERE username=%s AND code = %s", (username, code2)) row = cursor.fetchone() if row_number != 0: self.set_secure_cookie("userId", str(row['user_id']), expires_days=None) self.write("{'status':'True'}") logging.info("用户:" + username + "登录成功!") else: self.write("{'status':'False'}") logging.info("用户:" + username + "登录失败!")
def post(self, *args, **kwargs): userId=self.get_secure_cookie("userId").decode("utf-8") groupName = self.get_argument("groupName") # 获取输入的组名的组id cursor.execute("SELECT group_id FROM group_info WHERE user_id=%s AND group_name=%s", (userId, groupName)) row = cursor.fetchone() groupId = row["group_id"] # 删除组信息 cursor.execute("DELETE FROM group_info WHERE group_id=%s", groupId) # 获取默认分组的组ID cursor.execute("SELECT group_id FROM group_info WHERE user_id=%s AND group_name='我的好友'", userId) row = cursor.fetchone() defaultGroupId = row["group_id"] # 将删除组下的好友移动至默认分组 cursor.execute("UPDATE friend_info SET group_id=%s WHERE user_id=%s AND group_id=%s", (defaultGroupId, userId, groupId)) logging.info("用户ID:" + userId + "删除分组:" + groupName + "成功!") self.set_header('Access-Control-Allow-Origin', '*') self.set_header('Access-Control-Allow-Headers', 'x-requested-with') self.set_header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE') returnResult = {"status": "00"} self.write(json.dumps(returnResult, ensure_ascii=False))
def post(self, *args, **kwargs): userId = self.get_secure_cookie("userId").decode("utf-8") username = self.get_argument("username") rowNumber = cursor.execute("SELECT * FROM user WHERE username=%s", username) if rowNumber == 0: self.write("{'status':'01'}") logging.info("write {'status':'01'}") else: rowNumber = cursor.execute( "SELECT * FROM friend_info AS a LEFT JOIN user AS b ON a.friend_id=b.user_id WHERE a.user_id=%s AND b.username=%s", (userId, username)) if rowNumber == 0: cursor.execute("SELECT * FROM user WHERE username=%s", username) row = cursor.fetchone() toId = row["user_id"] rowNumber = cursor.execute( "SELECT * FROM game_notification WHERE from_id=%s AND to_id=%s", (userId, toId)) rowNumber2 = cursor.execute( "SELECT * FROM game_notification WHERE from_id=%s AND to_id=%s", (toId, userId)) if rowNumber != 0 or rowNumber2 != 0: self.write("{'status':'03'}") logging.info("write {'status':'03'}") return cursor.execute( "INSERT INTO game_notification(`from_id`, `to_id`) VALUES (%s,%s)", (userId, toId)) toId = str(toId) if toId in HomeSocketCache.keys(): HomeSocketCache[toId].refreshNotificationList() self.write("{'status':'00'}") logging.info("write {'status':'00'}") else: self.write("{'status':'02'}") logging.info("write {'status':'02'}")
def treatMessageData(self, data): userId = self.get_secure_cookie("userId").decode("utf-8") friendId = data["friendId"] message = data["message"] logging.info("接受到消息:" + message) # 接收方MessageFriendList toMessageFriendList = getMessageFriendList(friendId) # 将数据插入数据库 cursor.execute( "INSERT INTO message_info (from_id, to_id, content, update_time)values(%s,%s,%s,%s) ", (userId, friendId, message, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))) # 获取接收方消息窗口打开状态 cursor.execute("SELECT * FROM user WHERE user_id=%s", friendId) row = cursor.fetchone() messageWidgetState = row["message_widget_state"] # 若messageFriendList不存在好友ID则插入 # 若存在将message_friend_list中的message_number数量+1 if len(toMessageFriendList) == 0: cursor.execute( "INSERT INTO message_friend_list (USER_ID, FRIEND_ID, ACTIVE_STATE, MESSAGE_NUMBER)VALUES(%s,%s,%s,%s) ", (friendId, userId, 1, 1)) else: flag = False for item in toMessageFriendList: if str(item["friendId"]) == userId: flag = True if item["activeState"] != 1: cursor.execute( "UPDATE message_friend_list SET message_number=message_number+1 WHERE user_id=%s AND friend_id=%s", (friendId, userId)) else: if messageWidgetState == 0: cursor.execute( "UPDATE message_friend_list SET message_number=message_number+1 WHERE user_id=%s AND friend_id=%s", (friendId, userId)) break if not flag: cursor.execute( "INSERT INTO message_friend_list (USER_ID, FRIEND_ID, ACTIVE_STATE, MESSAGE_NUMBER)VALUES(%s,%s,%s,%s) ", (friendId, userId, 0, 1)) # 刷新toMessageFriendList toMessageFriendList = getMessageFriendList(friendId) # 通知相应好友添加message # 判断接受方是否在线 if str(friendId) in HomeSocketCache.keys(): if messageWidgetState == 0: HomeSocketCache[str(friendId)].refreshMessageList(subType="04") else: for item in toMessageFriendList: if str(item["friendId"] ) == userId and item["activeState"] == 1: HomeSocketCache[str(friendId)].refreshMessageList( subType="02", data=message) break if str(item["friendId"] ) == userId and item["activeState"] != 1: HomeSocketCache[str(friendId)].refreshMessageList( subType="01") HomeSocketCache[str(friendId)].refreshMessageList( subType="03") break
def on_close(self): userId = self.get_secure_cookie("userId").decode("utf-8") del HomeSocketCache[userId] cursor.execute( "UPDATE user SET login_state=0,state=0 WHERE user_id=%s", userId) logging.info(userId + "关闭连接")
def post(self, *args, **kwargs): # 注册handler,注册成功返回00,如有重复用户名返回01 email = self.get_argument("sign_in_email") username = self.get_argument("sign_in_username") code = self.get_argument("code") code2 = hashlib.md5( ("s" + code + "a" + username + "ult").encode("utf-8")).hexdigest() con.ping() row_number = cursor.execute("select * from user WHERE username=%s", username) if row_number == 0: cursor.execute( "INSERT INTO user(username,code,email) VALUES(%s,%s,%s)", (username, code2, email)) self.write("{'status':'00'}") logging.info("用户:" + username + "注册成功!") cursor.execute("SELECT user_id FROM user WHERE username=%s", username) row = cursor.fetchone() userId = row["user_id"] cursor.execute( "INSERT INTO user_info(user_id,register_date) values (%s,%s)", (userId, time.strftime('%Y-%m-%d', time.localtime()))) logging.info("用户id:" + str(userId) + "插入user_info表成功") cursor.execute( "INSERT INTO group_info(user_id, group_name) VALUES (%s,%s)", (userId, "我的好友")) viewName = "user_" + str(userId) + "_message" cursor.execute( "CREATE VIEW " + viewName + " AS SELECT a.from_id AS 'related_user',a.content,a.update_time,1 AS 'type' FROM message_info AS a WHERE a.to_id = %s UNION SELECT b.to_id AS 'related_user', b.content, b.update_time, 0 AS 'type' FROM message_info AS b WHERE b.from_id = %s", (userId, userId)) else: self.write("{'status':'01'}") logging.info("用户:" + username + "注册失败!")
def getGameRoomData(tableId): gameRoomData = {} playerInfo = [] sqlString = "SELECT\n" + \ " a.left_ready_state,\n" + \ " b.user_id AS left_user_id,\n" + \ " b.username AS left_username,\n" + \ " c.avatar AS left_avatar,\n" + \ " c.sex AS left_sex,\n" + \ " c.birthday AS left_birthday,\n" + \ " c.qq AS left_qq,\n" + \ " c.game_time AS left_game_time,\n" + \ " c.win_time AS left_win_time,\n" + \ " c.draw_time AS left_draw_time,\n" + \ " a.right_ready_state,\n" + \ " d.user_id AS right_user_id,\n" + \ " d.username AS right_username,\n" + \ " e.avatar AS right_avatar,\n" + \ " e.sex AS right_sex,\n" + \ " e.birthday AS right_birthday,\n" + \ " e.qq AS right_qq,\n" + \ " e.game_time AS right_game_time,\n" + \ " e.win_time AS right_win_time,\n" + \ " e.draw_time AS right_draw_time\n" + \ "FROM\n" + \ " game_table_info AS a\n" + \ "LEFT JOIN `user` AS b ON a.left_player_id = b.user_id\n" + \ "LEFT JOIN user_info AS c ON b.user_id = c.user_id\n" + \ "LEFT JOIN `user` AS d ON a.right_player_id = d.user_id\n" + \ "LEFT JOIN user_info AS e ON d.user_id = e.user_id\n" + \ "WHERE\n" + \ " a.table_id = %s" rowNumber = cursor.execute(sqlString, tableId) for i in range(0, rowNumber): row = cursor.fetchone() if row["left_user_id"]: temp = { "position": "left", "readyState": row["left_ready_state"], "userId": row["left_user_id"], "username": row["left_username"], "avatar": row["left_avatar"], "sex": row["left_sex"], "birthday": row["left_birthday"], "qq": row["left_qq"], "gameTime": row["left_game_time"], "winTime": row["left_win_time"], "drawTime": row["left_draw_time"] } playerInfo.append(temp) if row["right_user_id"]: temp = { "position": "right", "readyState": row["right_ready_state"], "userId": row["right_user_id"], "username": row["right_username"], "avatar": row["right_avatar"], "sex": row["right_sex"], "birthday": row["right_birthday"], "qq": row["right_qq"], "gameTime": row["right_game_time"], "winTime": row["right_win_time"], "drawTime": row["right_draw_time"] } playerInfo.append(temp) gameRoomData["playerInfo"] = playerInfo # 组装gameState数据 cursor.execute("SELECT * FROM game_table_info WHERE table_id=%s", tableId) row = cursor.fetchone() gameRoomData["gameState"] = row["game_state"] if tableId in GameRoomCache.keys(): gameRoomData["gameInfo"] = GameRoomCache[tableId] return gameRoomData
def initGame(tableId): # 将数据库中gameState设置为1 cursor.execute("UPDATE game_table_info SET game_state=1 WHERE table_id=%s", tableId) # 获取此桌的玩家id cursor.execute("SELECT * FROM game_table_info WHERE table_id=%s", tableId) row = cursor.fetchone() leftUserId = str(row["left_player_id"]) rightUserId = str(row["right_player_id"]) # 将两个玩家的state改为2游戏中 cursor.execute("UPDATE user SET state=2 WHERE user_id=%s OR user_id=%s", (leftUserId, rightUserId)) # 刷新相关好友列表 refreshRelativeFriendList([leftUserId, rightUserId]) # 准备刷新数据 rowNumber = cursor.execute( "SELECT a.table_id,a.left_player_id,c.username AS left_username,b.avatar AS left_avatar,a.right_player_id,e.username AS right_username,d.avatar AS right_avatar,a.game_state FROM game_table_info AS a LEFT join user_info AS b ON a.left_player_id=b.user_id LEFT JOIN user AS c ON b.user_id=c.user_id LEFT JOIN user_info AS d ON a.right_player_id=d.user_id LEFT JOIN user AS e ON e.user_id=d.user_id WHERE a.table_id=%s", tableId) refreshData = [] for i in range(0, rowNumber): row = cursor.fetchone() temp = { "tableId": row["table_id"], "leftPlayerId": row["left_player_id"], "leftUsername": row["left_username"], "leftAvatar": row["left_avatar"], "rightPlayerId": row["right_player_id"], "rightUsername": row["right_username"], "rightAvatar": row["right_avatar"], "gameState": row["game_state"] } refreshData.append(temp) # 通知在线用户前端刷新数据 for key in HomeSocketCache: HomeSocketCache[key].refreshGameTableList(refreshData) # 初始化pointState数组 pointState = [] for i in range(0, 15): temp = [] for j in range(0, 15): temp.append(0) pointState.append(temp) # 初始化GameRoomCache if tableId in GameRoomCache.keys(): GameRoomCache[tableId]["gameStartTime"] = time.time() * 1000 GameRoomCache[tableId]["playerState"][leftUserId]["overTimeCount"] = 0 GameRoomCache[tableId]["playerState"][rightUserId]["overTimeCount"] = 0 if GameRoomCache[tableId]["totalGameTime"] % 2 == 0: GameRoomCache[tableId]["playerState"][leftUserId][ "chessType"] = "black" GameRoomCache[tableId]["playerState"][leftUserId][ "chessTime"] = time.time() * 1000 GameRoomCache[tableId]["playerState"][leftUserId]["myTurn"] = True GameRoomCache[tableId]["playerState"][rightUserId][ "chessType"] = "white" GameRoomCache[tableId]["playerState"][rightUserId][ "myTurn"] = False GameRoomCache[tableId]["stepRecord"] = [] GameRoomCache[tableId]["pointState"] = pointState else: GameRoomCache[tableId]["playerState"][leftUserId][ "chessType"] = "white" GameRoomCache[tableId]["playerState"][leftUserId]["myTurn"] = False GameRoomCache[tableId]["playerState"][rightUserId][ "chessType"] = "black" GameRoomCache[tableId]["playerState"][rightUserId][ "chessTime"] = time.time() * 1000 GameRoomCache[tableId]["playerState"][rightUserId]["myTurn"] = True GameRoomCache[tableId]["stepRecord"] = [] GameRoomCache[tableId]["pointState"] = pointState else: GameRoomCache[tableId] = { "gameStartTime": time.time() * 1000, "totalGameTime": 0, "playerState": { leftUserId: { "chessType": "black", "overTimeCount": 0, "winTime": 0, "chessTime": time.time() * 1000, "myTurn": True }, rightUserId: { "chessType": "white", "overTimeCount": 0, "winTime": 0, "chessTime": "", "myTurn": False } }, "stepRecord": [], "pointState": pointState } # 通知前端对局开始 GameRoomSocketCache[tableId][leftUserId].gameStart() GameRoomSocketCache[tableId][rightUserId].gameStart()
def post(self, *args, **kwargs): userId = self.get_secure_cookie("userId").decode("utf-8") friendId = self.get_argument("friendId") cursor.execute( "SELECT * FROM friend_info WHERE user_id=%s AND friend_id=%s", (userId, friendId)) row = cursor.fetchone() oprId = row["opr_id"] cursor.execute("DELETE FROM friend_info WHERE opr_id=%s", oprId) #删除user的messageFriendList messageFriendList = getMessageFriendList(userId) # 将待删除friendId与messageFriendList中进行比对 # 若messageFriendlist长度为1,则直接删除 # 若报送的friendId已为激活状态则将上一位设置为激活状态,并删除 # 若不为激活状态则直接删除 if len(messageFriendList) != 1: for key in range(0, len(messageFriendList)): if str(messageFriendList[key]["friendId"]) == friendId: if messageFriendList[key]["activeState"] == 1: cursor.execute( "UPDATE message_friend_list SET active_state=1 WHERE user_id=%s AND friend_id=%s", (userId, messageFriendList[key - 1]["friendId"])) break cursor.execute( "DELETE FROM message_friend_list WHERE user_id=%s AND friend_id=%s", (userId, friendId)) # 删除friend的messageFriendList messageFriendList = getMessageFriendList(friendId) # 将待删除friendId与messageFriendList中进行比对 # 若messageFriendlist长度为1,则直接删除 # 若报送的friendId已为激活状态则将上一位设置为激活状态,并删除 # 若不为激活状态则直接删除 if len(messageFriendList) != 1: for key in range(0, len(messageFriendList)): if str(messageFriendList[key]["friendId"]) == userId: if messageFriendList[key]["activeState"] == 1: cursor.execute( "UPDATE message_friend_list SET active_state=1 WHERE user_id=%s AND friend_id=%s", (friendId, messageFriendList[key - 1]["friendId"])) break cursor.execute( "DELETE FROM message_friend_list WHERE user_id=%s AND friend_id=%s", (friendId, userId)) HomeSocketCache[userId].refreshMessageList(subType="04") if friendId in HomeSocketCache.keys(): HomeSocketCache[friendId].refreshFriendList() HomeSocketCache[friendId].refreshMessageList(subType="04") logging.info("用户:" + userId + "删除好友!") self.write("{'status':'00'}")
def post(self, *args, **kwargs): userId = self.get_secure_cookie("userId").decode("utf-8") cursor.execute("SELECT * FROM user WHERE user_id=%s", userId) row = cursor.fetchone() oldTableId = row["table_id"] position = self.get_argument("position") tableId = self.get_argument("tableId") # 根据数据库中的table_id值判断是否为坐下状态 if oldTableId: sitDownState = True else: sitDownState = False # 根据不同的状态对数据库进行操作 if sitDownState: # 查询数据库若已处于游戏状态中则不能更换位置 cursor.execute( "SELECT * FROM game_table_info WHERE left_player_id=%s OR right_player_id=%s", (userId, userId)) row = cursor.fetchone() if row["game_state"] == 1: self.write("{'status':'01'}") # 已经处于游戏状态无法换桌 logging.info("write {'status':'01'}") return # 将旧卓的信息删除 if str(row["left_player_id"]) == userId: cursor.execute( "UPDATE game_table_info SET left_player_id=NULL,left_ready_state=0 WHERE table_id=%s", oldTableId) else: cursor.execute( "UPDATE game_table_info SET right_player_id=NULL,right_ready_state=0 WHERE table_id=%s", oldTableId) if position == "left": cursor.execute( "UPDATE game_table_info SET left_player_id=%s WHERE table_id=%s ", (userId, tableId)) else: cursor.execute( "UPDATE game_table_info SET right_player_id=%s WHERE table_id=%s ", (userId, tableId)) # 组装刷新数据并通知前端刷新游戏大厅 if not sitDownState: rowNumber = cursor.execute( "SELECT a.table_id,a.left_player_id,c.username AS left_username,b.avatar AS left_avatar,a.right_player_id,e.username AS right_username,d.avatar AS right_avatar,a.game_state FROM game_table_info AS a LEFT join user_info AS b ON a.left_player_id=b.user_id LEFT JOIN user AS c ON b.user_id=c.user_id LEFT JOIN user_info AS d ON a.right_player_id=d.user_id LEFT JOIN user AS e ON e.user_id=d.user_id WHERE a.table_id=%s", tableId) else: rowNumber = cursor.execute( "SELECT a.table_id,a.left_player_id,c.username AS left_username,b.avatar AS left_avatar,a.right_player_id,e.username AS right_username,d.avatar AS right_avatar,a.game_state FROM game_table_info AS a LEFT join user_info AS b ON a.left_player_id=b.user_id LEFT JOIN user AS c ON b.user_id=c.user_id LEFT JOIN user_info AS d ON a.right_player_id=d.user_id LEFT JOIN user AS e ON e.user_id=d.user_id WHERE a.table_id=%s OR a.table_id=%s", (tableId, oldTableId)) refreshData = [] for i in range(0, rowNumber): row = cursor.fetchone() temp = { "tableId": row["table_id"], "leftPlayerId": row["left_player_id"], "leftUsername": row["left_username"], "leftAvatar": row["left_avatar"], "rightPlayerId": row["right_player_id"], "rightUsername": row["right_username"], "rightAvatar": row["right_avatar"], "gameState": row["game_state"] } refreshData.append(temp) for key in HomeSocketCache: HomeSocketCache[key].refreshGameTableList(refreshData) # 设值数据库中的table_id及返回值 cursor.execute("UPDATE user SET table_id=%s WHERE user_id=%s", (tableId, userId)) if not sitDownState: self.write("{'status':'00'}") logging.info("write {'status':'00'}") else: self.write("{'status':'02'}") logging.info("write {'status':'02'}") GameRoomSocketCache[oldTableId][userId].refreshGameRoom() del GameRoomSocketCache[oldTableId][userId] logging.info(userId + "关闭" + tableId + "房间连接") if len(GameRoomSocketCache[tableId]) == 0: del GameRoomSocketCache[tableId] # 刷新相关房间的用户页面 if tableId in GameRoomSocketCache.keys(): for key in GameRoomSocketCache[tableId].keys(): GameRoomSocketCache[tableId][key].refreshGameRoom() if oldTableId in GameRoomSocketCache.keys(): for key in GameRoomSocketCache[oldTableId].keys(): GameRoomSocketCache[oldTableId][key].refreshGameRoom()
def post(self, *args, **kwargs): username = self.get_argument("username") code = self.get_argument("code") code2 = hashlib.md5(("s" + code + "a" + username + "ult").encode("utf-8")).hexdigest() cursor.execute("UPDATE user SET code=%s WHERE username =%s", (code2, username)) logging.info("用户:" + username + "重置密码成功!")
def on_message(self, message): data = json.loads(message) if data["type"] == "00": self.maintainConnection() if data["type"] == "01": userId = self.get_secure_cookie("userId").decode("utf-8") cursor.execute("SELECT * FROM user WHERE user_id=%s", userId) row = cursor.fetchone() tableId = row["table_id"] for key in GameRoomSocketCache[tableId].keys(): if key != userId: returnData = {} returnData["type"] = "08" returnData["data"] = data["message"] GameRoomSocketCache[tableId][key].write_message(json.dumps(returnData, ensure_ascii=False)) if data["type"] == "02": userId = self.get_secure_cookie("userId").decode("utf-8") cursor.execute("SELECT * FROM user WHERE user_id=%s", userId) row = cursor.fetchone() tableId = row["table_id"] roomCache = GameRoomCache[tableId] anotherPlayerId = None for key in roomCache["playerState"].keys(): if key != userId: anotherPlayerId = key break if data["result"] == "agree": roomCache["playerState"][userId]["myTurn"] = False roomCache["playerState"][anotherPlayerId]["myTurn"] = False roomCache["totalGameTime"] += 1 cursor.execute( "UPDATE user_info SET game_time=game_time+1,draw_time=draw_time+1 WHERE user_id=%s OR user_id=%s", (userId, anotherPlayerId)) cursor.execute( "UPDATE game_table_info SET left_ready_state=0,right_ready_state=0,game_state=0 WHERE table_id=%s", tableId) cursor.execute("UPDATE user SET state=1 WHERE user_id=%s OR user_id=%s", (userId, anotherPlayerId)) # 将玩家状态改为在线,并通知其在线好友刷新friendList cursor.execute("UPDATE user SET state=1 WHERE user_id=%s OR user_id=%s", (userId, anotherPlayerId)) # 刷新相关好友列表 refreshRelativeFriendList([userId, anotherPlayerId]) # 提醒前端和棋 for key in GameRoomSocketCache[tableId]: GameRoomSocketCache[tableId][key].gameDraw() else: GameRoomSocketCache[tableId][anotherPlayerId].denyDraw()
def post(self, *args, **kwargs): userId = self.get_secure_cookie("userId").decode("utf-8") cursor.execute("SELECT * FROM user WHERE user_id=%s", userId) row = cursor.fetchone() tableId = row["table_id"] self.set_header('Content-type', 'application/json') roomCache = GameRoomCache[tableId] anotherPlayerId = None for key in roomCache["playerState"].keys(): if key != userId: anotherPlayerId = key break roomCache["playerState"][userId]["myTurn"] = False roomCache["playerState"][anotherPlayerId]["winTime"] += 1 roomCache["playerState"][anotherPlayerId]["myTurn"] = False roomCache["totalGameTime"] += 1 cursor.execute( "UPDATE user_info SET game_time=game_time+1 WHERE user_id=%s OR user_id=%s", (userId, anotherPlayerId)) cursor.execute( "UPDATE user_info SET win_time=win_time+1 WHERE user_id=%s", anotherPlayerId) cursor.execute( "UPDATE game_table_info SET left_ready_state=0,right_ready_state=0,game_state=0 WHERE table_id=%s", tableId) # 将玩家状态改为在线,并通知其在线好友刷新friendList cursor.execute( "UPDATE user SET state=1 WHERE user_id=%s OR user_id=%s", (userId, anotherPlayerId)) playerList = [userId, anotherPlayerId] for i in range(0, 2): rowNumber = cursor.execute( "SELECT * FROM friend_info AS a LEFT JOIN `user` AS b ON a.friend_id=b.user_id WHERE a.user_id=%s and b.login_state=1", playerList[i]) for j in range(0, rowNumber): row = cursor.fetchone() HomeSocketCache[str(row["friend_id"])].refreshFriendList() GameRoomSocketCache[tableId][anotherPlayerId].refreshGameView() # 提醒前端认输 for key in GameRoomSocketCache[tableId]: GameRoomSocketCache[tableId][key].giveUp(userId)
def post(self, *args, **kwargs): self.set_header('Content-type', 'application/json') userId = self.get_secure_cookie("userId").decode("utf-8") cursor.execute("SELECT * FROM user WHERE user_id=%s", userId) row = cursor.fetchone() tableId = row["table_id"] readyState = self.get_argument("readyState") rowNumber = cursor.execute("SELECT * FROM game_table_info WHERE left_player_id=%s AND table_id=%s", (userId, tableId)) if rowNumber >= 1: # 用户坐在左边 if readyState == "0": cursor.execute("UPDATE game_table_info SET left_ready_state=1 WHERE table_id=%s", tableId) else: cursor.execute("UPDATE game_table_info SET left_ready_state=0 WHERE table_id=%s", tableId) else: # 用户坐在右边 if readyState == "0": cursor.execute("UPDATE game_table_info SET right_ready_state=1 WHERE table_id=%s", tableId) else: cursor.execute("UPDATE game_table_info SET right_ready_state=0 WHERE table_id=%s", tableId) returnData = {"status": "00"} self.write(json.dumps(returnData, ensure_ascii=False)) # 通知房间内的玩家刷新player-status for key in GameRoomSocketCache[tableId].keys(): GameRoomSocketCache[tableId][key].refreshPlayerStatus() # 判断是否双方都已准备开始游戏,并在公共变量中添加GameRoomCache cursor.execute("SELECT * FROM game_table_info WHERE table_id=%s", tableId) row = cursor.fetchone() if row["left_ready_state"] == 1 and row["right_ready_state"] == 1: initGame(tableId)
def post(self): self.set_header('Content-type', 'application/json') userId = self.get_secure_cookie("userId").decode("utf-8") cursor.execute("SELECT * FROM user WHERE user_id=%s", userId) row = cursor.fetchone() tableId = row["table_id"] chessType = self.get_argument("chessType") x = self.get_argument("x") y = self.get_argument("y") logging.info("玩家" + userId + "下棋" + "index" + str([x, y])) roomCache = GameRoomCache[tableId] anotherPlayerId = None for key in roomCache["playerState"].keys(): if key != userId: anotherPlayerId = key break # 对GameRoomCache进行更改 roomCache["playerState"][userId]["myTurn"] = False roomCache["playerState"][anotherPlayerId]["myTurn"] = True roomCache["playerState"][anotherPlayerId]["chessTime"] = time.time()*1000 roomCache["stepRecord"].append({"playerId": userId, "chessType": chessType, "point": [x, y] }) # 对pointState进行更改 pointState = roomCache["pointState"] if chessType == "black": pointState[int(x)][int(y)] = 1 else: pointState[int(x)][int(y)] = 2 # 判断输赢 winFlag = False drawFlag = False if judgeWin(pointState, {"chessType": chessType, "chessPoint": [int(x), int(y)]}): winFlag = True roomCache["playerState"][userId]["myTurn"] = False roomCache["playerState"][userId]["winTime"] += 1 roomCache["playerState"][anotherPlayerId]["myTurn"] = False roomCache["totalGameTime"] += 1 cursor.execute("UPDATE user_info SET game_time=game_time+1 WHERE user_id=%s OR user_id=%s", (userId, anotherPlayerId)) cursor.execute("UPDATE user_info SET win_time=win_time+1 WHERE user_id=%s", userId) cursor.execute( "UPDATE game_table_info SET left_ready_state=0,right_ready_state=0,game_state=0 WHERE table_id=%s", tableId) # 将玩家状态改为在线,并通知其在线好友刷新friendList cursor.execute("UPDATE user SET state=1 WHERE user_id=%s OR user_id=%s", (userId, anotherPlayerId)) # 刷新相关好友列表 refreshRelativeFriendList([userId, anotherPlayerId]) # 和棋 if len(roomCache["stepRecord"]) == 196: drawFlag = True roomCache["playerState"][userId]["myTurn"] = False roomCache["playerState"][anotherPlayerId]["myTurn"] = False roomCache["totalGameTime"] += 1 cursor.execute( "UPDATE user_info SET game_time=game_time+1,draw_time=draw_time+1 WHERE user_id=%s OR user_id=%s", (userId, anotherPlayerId)) cursor.execute( "UPDATE game_table_info SET left_ready_state=0,right_ready_state=0,game_state=0 WHERE table_id=%s", tableId) cursor.execute("UPDATE user SET state=1 WHERE user_id=%s OR user_id=%s", (userId, anotherPlayerId)) # 将玩家状态改为在线,并通知其在线好友刷新friendList cursor.execute("UPDATE user SET state=1 WHERE user_id=%s OR user_id=%s", (userId, anotherPlayerId)) # 刷新相关好友列表 refreshRelativeFriendList([userId, anotherPlayerId]) returnData = {"status": "00"} self.write(json.dumps(returnData, ensure_ascii=False)) # 通知前端调用交换棋权 GameRoomSocketCache[tableId][anotherPlayerId].refreshGameView() if winFlag: logging.info("玩家" + userId + "获胜") # 提醒前端胜负已分 for key in GameRoomSocketCache[tableId]: GameRoomSocketCache[tableId][key].gameWin(userId) if drawFlag: logging.info(tableId + "和局") # 提醒前端和棋 for key in GameRoomSocketCache[tableId]: GameRoomSocketCache[tableId][key].gameDraw()
def getInitData(userId): returnData = {} userData = {} notificationData = [] gameTableData = [] # 获取userData cursor.execute( "SELECT * FROM user AS a LEFT JOIN user_info AS b ON a.user_id=b.user_id WHERE a.user_id=%s", userId) row = cursor.fetchone() userData["username"] = row["username"] userData["avatar"] = row["avatar"] userData["ifFirstLogin"] = row["if_first_login"] userData["messageWidgetState"] = row["message_widget_state"] # 从group_info表中获取此用户id下所有的用户分组存入groupNameList row_number = cursor.execute( "select * from group_info where user_id=%s ORDER BY group_id", userId) friendInfo = {} groupNameList = [] for i in range(0, row_number): row = cursor.fetchone() groupNameList.append(row["group_name"]) # 根据groupNameList和用户ID查询好友的信息,并组成friendInfo字典 for i in range(0, len(groupNameList)): groupListData = [] group_name = groupNameList[i] row_number = cursor.execute( "SELECT a.user_id,a.friend_id,d.avatar,c.username AS 'friend_username',a.note,c.login_state,c.state,a.group_id,b.group_name FROM friend_info AS a LEFT JOIN group_info AS b ON a.group_id = b.group_id LEFT JOIN user AS c ON a.friend_id = c.user_id LEFT JOIN user_info AS d on a.friend_id=d.user_id WHERE a.user_id = %s AND b.group_name= %s ORDER BY c.login_state DESC,c.username ASC", (userId, group_name)) for j in range(0, row_number): row = cursor.fetchone() temp = { "friendId": row["friend_id"], "avatar": row["avatar"], "friendUsername": row["friend_username"], "note": row["note"], "loginState": row["login_state"], "state": row["state"] } groupListData.append(temp) friendInfo[group_name] = groupListData # friendInfo字典组装完毕 # 根据user_id获取notification row_number = cursor.execute( "SELECT a.from_id,b.username AS from_username,a.to_id,c.username AS to_username FROM game_notification AS a LEFT JOIN user AS b ON a.from_id = b.user_id LEFT JOIN user AS c ON a.to_id=c.user_id WHERE to_id=%s ORDER BY id", userId) for i in range(0, row_number): row = cursor.fetchone() temp = { "fromId": row["from_id"], "fromUsername": row["from_username"], "toId": row["to_id"], "toUsername": row["to_username"] } notificationData.append(temp) # 组装gameTableData row_number = cursor.execute( "SELECT a.table_id,a.left_player_id,c.username AS left_username,b.avatar AS left_avatar,a.right_player_id,e.username AS right_username,d.avatar AS right_avatar,a.game_state FROM game_table_info AS a LEFT join user_info AS b ON a.left_player_id=b.user_id LEFT JOIN user AS c ON b.user_id=c.user_id LEFT JOIN user_info AS d ON a.right_player_id=d.user_id LEFT JOIN user AS e ON e.user_id=d.user_id ORDER BY a.table_id " ) for i in range(0, row_number): row = cursor.fetchone() temp = { "tableId": row["table_id"], "leftPlayerId": row["left_player_id"], "leftUsername": row["left_username"], "leftAvatar": row["left_avatar"], "rightPlayerId": row["right_player_id"], "rightUsername": row["right_username"], "rightAvatar": row["right_avatar"], "gameState": row["game_state"] } gameTableData.append(temp) # 组装messageData messageData = {} messageFriendList = Methods.GetMessageFriendList.getMessageFriendList( userId) messageData["messageFriendList"] = messageFriendList returnData["userData"] = userData returnData["friendData"] = friendInfo returnData["gameTableData"] = gameTableData returnData["notificationData"] = notificationData returnData["messageData"] = messageData return returnData
def exitGameRoom(userId,tableId): cursor.execute("UPDATE game_table_info SET left_player_id=NULL,left_ready_state=0 WHERE table_id=%s AND left_player_id=%s", (tableId, userId)) cursor.execute("UPDATE game_table_info SET right_player_id=NULL,right_ready_state=0 WHERE table_id=%s AND right_player_id=%s", (tableId, userId)) # 获取gameState cursor.execute("SELECT * FROM game_table_info WHERE table_id=%s", tableId) row = cursor.fetchone() gameState = row["game_state"] # 获取anotherPlayerId anotherPlayerId = None if gameState == 1: for key in GameRoomCache[tableId]["playerState"].keys(): if key != userId: anotherPlayerId = key break escapeFlag = False if gameState == 1: # 玩家逃离对局,进行相应数据库操作 escapeFlag = True cursor.execute( "UPDATE game_table_info SET left_ready_state=0,right_ready_state=0,game_state=0 WHERE table_id=%s", tableId) cursor.execute( "UPDATE user_info SET win_time=win_time+1,game_time=game_time+1 WHERE user_id=%s", anotherPlayerId) cursor.execute( "UPDATE user_info SET game_time=game_time+1 WHERE user_id=%s", userId) GameRoomSocketCache[tableId][anotherPlayerId].escapeGame() # 刷新相关好友列表 refreshRelativeFriendList([userId, anotherPlayerId]) # 判断tableId是否存在于GameRoomCache中 if tableId in GameRoomCache.keys(): # 删除缓存中的对局信息 del GameRoomCache[tableId] if not escapeFlag: if tableId in GameRoomSocketCache.keys(): for key in GameRoomSocketCache[tableId].keys(): GameRoomSocketCache[tableId][key].refreshGameRoom() rowNumber = cursor.execute( "SELECT a.table_id,a.left_player_id,c.username AS left_username,b.avatar AS left_avatar,a.right_player_id,e.username AS right_username,d.avatar AS right_avatar,a.game_state FROM game_table_info AS a LEFT join user_info AS b ON a.left_player_id=b.user_id LEFT JOIN user AS c ON b.user_id=c.user_id LEFT JOIN user_info AS d ON a.right_player_id=d.user_id LEFT JOIN user AS e ON e.user_id=d.user_id WHERE a.table_id=%s", tableId) refreshData = [] for i in range(0, rowNumber): row = cursor.fetchone() temp = {"tableId": row["table_id"], "leftPlayerId": row["left_player_id"], "leftUsername": row["left_username"], "leftAvatar": row["left_avatar"], "rightPlayerId": row["right_player_id"], "rightUsername": row["right_username"], "rightAvatar": row["right_avatar"], "gameState": row["game_state"]} refreshData.append(temp) for key in HomeSocketCache: HomeSocketCache[key].refreshGameTableList(refreshData) cursor.execute("UPDATE user SET `table_id`=NULL WHERE user_id=%s", userId)