def process_mesage(): """Listens at /hooks for posts to that url and gets response from game engine.""" data = request.data.decode("utf-8") logging.info(data) request_data = json.loads(data) if not is_unique(request_data, parse.get_message_id): return "", 200 try: user_response = parse.most_recent_msg(request_data) user_id = parse.get_user_id(request_data) except: logging.error("PARSE FAILED={}".format(sys.exc_info()[0])) raise ParseException(sys.exc_info()[0]) logging.info("user_id={0}, user_response={1}".format( user_id, user_response)) logging.debug("restart status={}".format(r.get("restart:" + user_id))) success = responder.process_response(user_response, user_id) if success: logging.info("Successful response={}".format(user_id)) return "", 200 else: logging.error("Response Failure user_response={} user_id={}".format( user_response, user_id))
def login_handler(self): username = self.jdata.get("username") password = self.jdata.get("password") if not all([username, password]): return {"code": "LOGIN_FAIL", "message": "You need send username and password"} else: try: if not r.exists("user:"******":password"): return {"code": "LOGIN_FAIL", "message": "Username is not existed"} if password == r.get("user:"******":password"): if self.is_recv_boardcast: recv_connections.append(self) else: connections.append(self) self.user = username self.isLogin = True if not self.is_recv_boardcast: self.broadcast_login() r.sadd("online_user", username) #self.broadcast({"action": "login", "user": self.get_user(), "nickname": r.get("user:"******":nickname")}) return {"code": "LOGIN_SUCCESS", "message": "success", "nickname": r.get("user:"******":nickname")} else: return {"code": "LOGIN_FAIL", "message": "Username and password not match"} except Exception, e: print "Error:", e.message,traceback.format_exc() return {"code": "SERVER_ERROR", "message": "Server Error"}
def broadcast_file(self, store_filepath, filename, file_type): now_time = time.strftime('%Y/%m/%d %H:%M:%S', time.localtime(time.time())) broadcast_msg = { "action": "broadcast_file", "time": now_time, "user": self.user, "nickname": r.get(u"user:"******":nickname"), "filename": filename, "file_type": file_type, } # 向所有在线用户发送该消息 for conn in recv_connections: if conn.get_user() != self.user: print "向{}发送消息".format(conn.get_user()) conn.request.sendall(json.dumps(broadcast_msg)) time.sleep(0.2) print u"开始发送文件.." # 向所有在线用户发送该文件 with open(store_filepath, 'rb') as f: while True: data = f.read(4096) if not data: break conn.request.sendall(data) f.close() time.sleep(0.2) conn.request.sendall('EOF') print u"发送文件完成"
def respond(user_id, user_response): """Gets the game response for a specific user_id and user_response""" game = Game.resume(r.get("save:" + user_id)) user_tupl_resp = tuple(user_response.lower().split(" ")) response = format_response(game.do_command(user_tupl_resp)) r.set("save:" + user_id, game.t_suspend()) return response
def process_mesage(): """Listens at /hooks for posts to that url and gets response from game engine.""" data = request.data.decode("utf-8") logging.info(data) request_data = json.loads(data) if not is_unique(request_data, parse.get_message_id): return "", 200 try: user_response = parse.most_recent_msg(request_data) user_id = parse.get_user_id(request_data) except: logging.error("PARSE FAILED={}".format(sys.exc_info()[0])) raise ParseException(sys.exc_info()[0]) logging.info("user_id={0}, user_response={1}".format(user_id, user_response)) logging.debug("restart status={}".format(r.get("restart:" + user_id))) success = responder.process_response(user_response, user_id) if success: logging.info("Successful response={}".format(user_id)) return "", 200 else: logging.error("Response Failure user_response={} user_id={}".format(user_response, user_id))
def broadcast_logout(self): now_time = time.strftime('%Y/%m/%d %H:%M:%S', time.localtime(time.time())) broadcast_msg = { "action": "broadcast", "time": now_time, "content": "用户" + r.get("user:"******":nickname") + "退出聊天室\n", "user": self.user, "nickname": "【系统消息】" } self.broadcast(broadcast_msg)
def process_postback(postback_payload, user_id): if not r.get("yesno:" + user_id): return True elif postback_payload.startswith("restart"): return restart(postback_payload, user_id) elif postback_payload.startswith("start_new"): return start_new(postback_payload, user_id) elif re.match("(yes|no)", postback_payload): return game_fallback(postback_payload, user_id) else: logging.error("Invalid postback={}".format(postback_payload)) return False
def broadcast_handler(self, content=None): if not content: content = self.jdata.get("content") if not content: print {"code": "BROADCAST_FAIL", "message": "content length must > 0"} now_time = time.strftime('%Y/%m/%d %H:%M:%S', time.localtime(time.time())) broadcast_msg = { "action": "broadcast", "time": now_time, "content": content, "user": self.user, "nickname": r.get(u"user:"******":nickname") } self.broadcast(broadcast_msg) print {"code": "BROADCAST_SUCCESS", "message": ""}
def yes_no_question(user_response, user_id): response_type = r.get("yesno:" + user_id) logging.debug("Response type={}".format(response_type)) if response_type == b'restart': smooch.send_postbacks(user_id, "Do you want to restart?", [("Yes", "restart_yes"), ("No", "restart_no")]) return True elif response_type == b'new_game': smooch.send_postbacks(user_id, "Do you want to play again?", [("Yes", "start_new_yes"), ("No", "start_new_no")]) return True elif response_type == b'game': smooch.send_postbacks(user_id, "Please answer the question.", [("Yes", "yes"), ("No", "no")]) return True else: logging.error("Extraneous response type={}".format(response_type)) return False
def process_response(user_response, user_id): user_exists = advent.user_exists(user_id) if user_response.startswith("/"): user_response = user_response.replace("/", "") if r.get("yesno:" + user_id): return yes_no_question(user_response, user_id) elif tip.is_tip(user_response.lower()): return process_tip(user_response, user_id) elif user_exists and (user_response.lower() == "restart" or user_response.lower() == "reset"): return restart(user_response, user_id) elif user_exists and (user_response.lower() == "help" or user_response.lower() == "?"): return help_message(user_response, user_id) elif user_exists and user_response.lower() == "info": return info_message(user_response, user_id) elif user_exists: return normal_response(user_response, user_id) else: return new_user(user_response, user_id)
def get_user_info(self): user_info = [] for conn in connections: user_info.append([conn.get_user(), r.get("user:"******":nickname"), conn.p2p_server_host, conn.p2p_server_port]) return user_info
def yes_no_question(user_id): game = Game.resume(r.get("save:" + user_id)) return game.yes_no_question()