def game_mgr_solve_weapons_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" %
                   (config.GAME_MGR_SOLVE_WEAPONS_SERVICE, req.parse_err))
        return

    user_id = req.content["user_id"]
    wid = req.content["wid"]

    # 获取玩家所在房间
    req_dict = controller.handler_dict[
        config.ROOM_MGR_QUERY_USER_BELONGED_ROOM_SERVICE].inline_call(
            controller, {"user_id": user_id})
    if req_dict["ret"] != 0:
        res.content = {
            "ret": -1,
            "err_msg": '',
        }
        return
    room_id = req_dict["room_id"]
    room_runtime = controller.mem_cache.get(ckv.get_ckv_room_runtime(room_id))

    for uid in room_runtime.user_id_list:
        conn_id = controller.mem_cache.get(ckv.get_ckv_user_to_conn(uid))
        if not conn_id:
            continue
        r = Response()
        r.conn_id = conn_id
        r.content = {"ret": 0, "err_msg": '', "user_id": user_id, "wid": wid}
        res.msg_queue.append(r)

    res.content = {
        "ret": -1,
        "err_msg": '',
    }
def synchronization_report_action_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" % (config.SYNCHRONIZATION_REPORT_ACTION_SERVICE, req.parse_err))
        return

    user_id = req.content["user_id"]
    action = req.content["action"]
    client_frame = req.content["frame"]

    err_msg = ''

    req_dict = controller.handler_dict[config.ROOM_MGR_QUERY_USER_BELONGED_ROOM_SERVICE].inline_call(controller, {
        "user_id": user_id
    })
    if req_dict["ret"] != 0:
        res.content = {
            "ret": -1,
            "err_msg": "report action error:" + req_dict["err_msg"]
        }
        return
    room_id = req_dict["room_id"]

    room_runtime = controller.mem_cache.get(ckv.get_ckv_room_runtime(room_id))
    sync_controller = room_runtime.get_sync()

    if sync_controller.report_logic_frame(controller, client_frame, user_id, action):
        ret = 0
    else:
        ret = -1

    res.content = {
        "ret": ret,
        "err_msg": err_msg,
        "frame": sync_controller.server_frame
    }
 def fetchone(self, sql, data):
     try:
         if sql is not None and sql != '' and data is not None:
             conn = self.get_coon()
             cur = self.get_cursor(conn)
             cur.execute(sql, data)
             r = cur.fetchall()
             self.close_all(conn, cur)
             return r
         else:
             Log().warn("query sql format fail. sql [{}] data[{}]".format(
                 sql, data))
     except Exception as e:
         Log().warn(
             "query sql format fail. sql [{}] data[{}] err:{}".format(
                 sql, data, e.message))
def synchronization_query_user_transform_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" % (config.SYNCHRONIZATION_QUERY_USER_TRANSFORM_SERVICE, req.parse_err))
        return

    user_id = req.content["user_id"]
    req_time = req.content["time"]

    err_msg = ""
    ret = 0

    position = ''
    rotation = ''

    user_runtime = controller.mem_cache.get(ckv.get_ckv_user_runtime(user_id))
    if user_runtime is not None:
        position, rotation = user_runtime.role.get_transform()
    else:
        ret = -1
        err_msg = 'user exit'
    
    res.content = {
        "ret": ret,
        "user_id": user_id,
        "position": position,
        "rotation": rotation,
        "err_msg": err_msg,
        "time": req_time
    }
def user_change_password_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" %
                   (config.USER_CHANGE_PASSWORD_SERVICE, req.parse_err))
        return

    username = req.content["username"]
    password = req.content["password"]
    old_password = req.content["old_password"]

    print username, password, old_password

    ret = 0
    success = False
    err_msg = ''

    user = User.select_user_by_user_name(username)

    if user is None:
        success = False
        err_msg = 'user not exist'
        res.content = {"ret": 0, "success": success, "err_msg": err_msg}
        return

    if user.md5_str == common.get_md5_str(old_password + user.salt):
        user.password = password
        user.update_user_by_user_id()
        success = True
    else:
        err_msg = 'old password not right'
        success = False

    res.content = {"ret": ret, "err_msg": err_msg, "success": success}
예제 #6
0
def room_mgr_query_user_belonged_room_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn(
            "service %d req parse err %s" %
            (config.ROOM_MGR_QUERY_USER_BELONGED_ROOM_SERVICE, req.parse_err))
        return

    user_id = str(req.content["user_id"])

    ret = 0
    err_msg = ""

    room_type = -1
    room_id = -1

    user_runtime = controller.mem_cache.get(ckv.get_ckv_user_runtime(user_id))

    if user_runtime is None:
        ret = -1
        err_msg = 'user not enter any room'
    else:
        room_type, room_id = user_runtime.get_room()

        if room_type is None or room_id is None:
            ret = -1
            err_msg = 'room not exist'

    res.content = {
        "ret": ret,
        "room_type": room_type,
        "room_id": room_id,
        "err_msg": err_msg
    }
예제 #7
0
def game_mgr_fight_system_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" %
                   (config.GAME_MGR_FIGHT_SYSTEM_SERVICE, req.parse_err))
        return

    room_id = req.content["room_id"]
    opt = req.content["opt"]
    param = req.content["param"]  # 客户端上来的参数按 英文逗号分隔

    msg = ''

    room_runtime = controller.mem_cache.get(ckv.get_ckv_room_runtime(room_id))

    if room_runtime is None:
        res.content = {"ret": -1, "err_msg": '', "opt": opt, "msg": msg}
        return

    if opt == "attacked":
        attack_id, player_id, hp = [int(v) for v in param.split(",")]
        room_runtime.fight_system.attacked(attack_id, player_id, hp)
        msg = "#".join([
            str(attack_id),
            str(room_runtime.fight_system.get_gaol(attack_id))
        ])
    elif opt == "query_players":
        msg = room_runtime.fight_system.query_players_hp()

    res.content = {"ret": 0, "err_msg": '', "opt": opt, "msg": msg}
def game_mgr_play_alone_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" %
                   (config.GAME_MGR_PLAY_ALONE_SERVICE, req.parse_err))
        return

    user_id = str(req.content["user_id"])
    ret = 0
    err_msg = ''
    room_id = -1

    res_dict = controller.handler_dict[
        config.ROOM_MGR_ENTER_ROOM_SERVICE].inline_call(
            controller, {
                "user_id": user_id,
                "room_type": 2
            })

    if res_dict["ret"] != 0:
        ret = res_dict["ret"]
        err_msg = "ROOM_MGR_ENTER_ROOM_SERVICE error: " + res_dict["err_msg"]
    else:
        room_id = res_dict["room_id"]

    res.content = {"ret": ret, "err_msg": err_msg, "room_id": room_id}
 def get_coon(self):
     try:
         conn = sqlite3.connect(self.path)
         conn.text_factory = str  # 让 原来 sqllite 返回的 unicode 设置为 str
         if os.path.exists(self.path) and os.path.isfile(self.path):
             return conn
     except Exception as e:
         Log().error("db connect create fail." + e.message)
예제 #10
0
 def __init__(self, workers):
     self.client_fd = None
     self.recv_buf = ''
     self.send_buf = ''
     self.conn_id = None
     self.msg = Message()
     self.logger = Log()
     self.workers = workers
예제 #11
0
 def __init__(self):
     self.connections = {}  # key = conn_id, val = connection
     self.auto_id = 0
     self.logger = Log()
     self.workers = None
     self.mode = None
     self.auto_increase = 0
     self.send_queue = {}  # conn_id : Queue { msg1, msg2, ... } IO复用才需要,普通的直接发了
def room_mgr_enter_room_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" % (config.ROOM_MGR_ENTER_ROOM_SERVICE, req.parse_err))
        return

    user_id = str(req.content["user_id"])
    room_type = req.content["room_type"]

    ret = 0
    room_id = 0
    err_msg = ""

    if room_type == 1:  # 预设 room_type == 1 表示玩家申请加入游戏大厅
        room_id = 0
    elif room_type == 2:    # 预设 room_type == 2 表示玩家主动申请新房间
        res_dict = controller.handler_dict[config.ROOM_MGR_REGISTER_A_ROOM_SERVICE].inline_call(controller, {
            "user_id": user_id
        })
        if res_dict["ret"] == 0:
            room_id = res_dict["room_id"]
        else:
            ret = res_dict["ret"]
            err_msg = "register room fail. " + res_dict["err_msg"]
    elif room_type == 3:   # 预设 room_type == 3 表示玩家加入某个指定房间,中途加入,或者多个玩家匹配加入
        if "room_id" not in req.content.keys():
            res.content = {
                "ret": -1,
                "room_id": -1,
                "err_msg": "room_id not found"
            }
            return
        else:
            room_id = req.content["room_id"]
    else:
        res.content = {
            "ret": -1,
            "room_id": -1,
            "err_msg": "room_type un define"
        }
        return

    game_room.out_of_last_room(controller, user_id)

    user_runtime = game_mgr.init_user_runtime(controller, user_id)
    user_runtime.set_room(room_type=room_type, room_id=room_id)
    user_runtime.restart()

    room_runtime = game_mgr.init_room_runtime(controller, room_id)
    if not room_runtime.add_user(user_id):
        ret = -1
        err_msg = "user has already in room"
        room_id = -1

    res.content = {
        "ret": ret,
        "room_id": room_id,
        "err_msg": err_msg
    }
예제 #13
0
 def get_stream(self):
     try:
         return self.__pack_buffer()
     except Exception as e:
         Log().debug("get_stream err. " + e.message)
         self.pack_buffer(
             self.__handler_val if self.__handler_val is not None else 0,
             "err")
         return self.__pack_buffer()
예제 #14
0
 def __init__(self, conn_id=0, msg=None):
     if msg is None:
         self.msg = Message()
     else:
         self.msg = copy.copy(msg)
     self.conn_id = conn_id
     self.content = None
     self.logger = Log()
     self.parse_success = False
     self.parse_err = None
예제 #15
0
 def update(self, sql, data):
     try:
         if sql is not None and sql != '' and data is not None:
             conn = self.get_coon()
             cur = self.get_cursor(conn)
             cur.execute(sql, data)
             conn.commit()
             rows_effect = cur.rowcount
             self.close_all(conn, cur)
             return rows_effect
         else:
             Log().warn("update sql format fail. sql [{}] data[{}]".format(
                 sql, data))
             return 0
     except Exception as e:
         Log().warn(
             "update sql format fail. sql [{}] data[{}] err:{}".format(
                 sql, data, e.message))
         return 0
예제 #16
0
    def __init__(self, name, uuid):
        self.os_name = platform.system()
        self.python_version = platform.python_version().split(".")[0]

        self.server_name = name
        self.server_id = uuid

        self.network_server = None
        self.work_process = None
        self.logger = Log()
        self.conf_loader = ConfigLoader()
def game_mgr_query_matching_result_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn(
            "service %d req parse err %s" %
            (config.GAME_MGR_QUERY_MATCHING_RESULT_SERVICE, req.parse_err))
        return

    user_id = req.content["user_id"]
    player_count = req.content["player_count"]

    ret = 0
    err_msg = ''

    key = ckv.get_ckv_user_in_matching()
    matching_list = controller.mem_cache.get(key)
    room_id = 0

    # 说明这个玩家已经匹配成功
    if user_id not in matching_list:
        res_dict = controller.handler_dict[
            config.ROOM_MGR_QUERY_USER_BELONGED_ROOM_SERVICE].inline_call(
                controller, {
                    "user_id": user_id,
                })
        if res_dict['ret'] != 0:
            game_mgr.stop_match(user_id)
            ret = -2
            err_msg = "user not match. " + res_dict['err_msg']
        else:
            room_id = res_dict['room_id']
    else:
        if len(matching_list) >= player_count:
            room_id, ret, err_msg = game_room.register_a_room(
                controller, user_id)
            if ret != 0:
                res.content = {
                    "ret": ret,
                    "err_msg": err_msg,
                    "room_id": room_id
                }
                return

            # 把目前所有玩家丢到匹配房间
            num, ret, err_msg = game_mgr.matching_some_players(
                controller, matching_list, room_id)
            matching_list = matching_list[num:]
            controller.mem_cache.set(key, matching_list)

        else:
            ret = -1
            err_msg = "not enough players"

    res.content = {"ret": ret, "err_msg": err_msg, "room_id": room_id}
예제 #18
0
 def add_user(self, user_id):
     try:
         user_id = int(user_id)
     except ValueError:
         Log().warn(
             "game_room id: {}, user_id {}, user_id must be int".format(
                 self.room_id, user_id))
         return False
     if user_id not in self.user_id_list:
         self.user_id_list.append(str(user_id))
         self.fight_system.add_player(int(user_id))
         return True
     return False
def room_mgr_exist_room_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" % (config.ROOM_MGR_EXIST_ROOM_SERVICE, req.parse_err))
        return

    user_id = str(req.content["user_id"])

    game_room.out_of_last_room(controller, user_id)

    res.content = {
        "ret": 0,
        "err_msg": '',
    }
예제 #20
0
def game_mgr_player_event_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" %
                   (config.GAME_MGR_PLAYER_EVENT_SERVICE, req.parse_err))
        return

    room_id = req.content["room_id"]
    opt = req.content["opt"]
    event = req.content["event"]
    param = req.content["param"]

    room_runtime = controller.mem_cache.get(ckv.get_ckv_room_runtime(room_id))

    res.content = {"ret": 0, "opt": opt, "err_msg": ''}
def user_network_test_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" % (config.USER_NETWORK_TEST_SERVICE, req.parse_err))
        return

    last_time = req.content["last_time"]
    msg = req.content["msg"]

    res.content = {
        "ret": 0,
        "err_msg": '',
        "last_time": last_time,
        "extend": msg,
    }
def game_mgr_register_robot_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" %
                   (config.GAME_MGR_REGISTER_ROBOT_SERVICE, req.parse_err))
        return

    room_id = req.content["room_id"]
    robot_key = req.content["robot_key"]
    user_id = req.content["user_id"]

    born_point = 0

    ret = 0
    err_msg = ''

    room_runtime = controller.mem_cache.get(ckv.get_ckv_room_runtime(room_id))

    if room_runtime is None:
        res.content = {"ret": -1, "err_msg": "room not exist"}
        return

    fight_system = room_runtime.fight_system

    if robot_key in fight_system.robots_keys.keys():
        old_user_id, robot_id = fight_system.robots_keys.get(robot_key)
        if user_id != old_user_id and room_runtime.isOnline(old_user_id):
            res.content = {ret: -1, err_msg: "has been controller"}
            return
    else:
        robot_id = common.get_server_core(controller).get_robot_id()

    fight_system.robots_keys[robot_key] = (user_id, robot_id)
    if robot_id not in fight_system.players:
        controller.handler_dict[
            config.ROOM_MGR_ENTER_ROOM_SERVICE].inline_call(
                controller, {
                    "user_id": robot_id,
                    "room_type": 3,
                    "room_id": room_id
                })

    res.content = {
        "ret": ret,
        "err_msg": err_msg,
        "robot_id": robot_id,
        "robot_key": robot_key,
        "born": born_point
    }
예제 #23
0
    def __init__(self, mode=None):
        self.mode = mode  # 默认使用单进程单线程模式
        self.logger = Log()
        self.conn_pool = None

        # key = id, value = FunctionHandler. int 到函数的映射
        self.handler_dict = {}
        # 通用工具集
        self.common_tools = CommonTools()

        # 多进程 删掉了 并没有什么用
        self.process_count = 1
        self.process_pool = None
        # 单进程模式下处理完的事件丢到这里,后面主循环处理发回客户端
        self.response_queue = []
        self.auto_incr = 0
def user_login_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" % (config.USER_LOGIN_SERVICE, req.parse_err))
        return

    username = req.content["username"]
    password = req.content["password"]
    req_time = req.content["time"]
    login_success = False

    user = User.select_user_by_user_name(username)

    if user is None:
        res.content = {
            "ret": -1,
            "login_success": login_success,
            "user_id": -1,
            "time": req_time
        }
        return

    res_dict = controller.handler_dict[config.ROOM_MGR_QUERY_USER_BELONGED_ROOM_SERVICE].inline_call(controller, {
        "user_id": user.user_id,
    })
    if res_dict["ret"] == 0:
        res.content = {
            "ret": -1,
            "login_success": False,
            "user_id": -1,
            "time": req_time
        }
        return

    if user.md5_str == common.get_md5_str(password + user.salt):
        login_success = True
    else:
        login_success = False

    res.content = {
        "ret": 0,
        "login_success": login_success,
        "user_id": user.user_id,
        "time": req_time
    }
예제 #25
0
def game_mgr_aoe_freeze_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" %
                   (config.GAME_MGR_AOE_FREEZE_SERVICE, req.parse_err))
        return

    room_id = req.content["room_id"]
    pos = req.content["pos"]

    room_runtime = controller.mem_cache.get(ckv.get_ckv_room_runtime(room_id))

    for user_id in room_runtime.user_id_list:
        conn_id = controller.mem_cache.get(ckv.get_ckv_user_to_conn(user_id))
        if not conn_id:
            continue
        r = Response()
        r.conn_id = conn_id
        r.content = {"ret": 0, "err_msg": '', "pos": pos}
        res.msg_queue.append(r)

    res.content = {"ret": -1, "err_msg": ''}
예제 #26
0
def synchronization_query_action_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn(
            "service %d req parse err %s" %
            (config.SYNCHRONIZATION_QUERY_ACTION_SERVICE, req.parse_err))
        return

    client_frame = req.content["frame"]
    user_id = req.content["user_id"]

    ret = 0
    err_msg = ''

    # 查询用户所在游戏房间
    req_dict = controller.handler_dict[
        config.ROOM_MGR_QUERY_USER_BELONGED_ROOM_SERVICE].inline_call(
            controller, {"user_id": user_id})
    if req_dict["ret"] != 0:
        res.content = {
            "ret": -1,
            "err_msg": "query action error:" + req_dict["err_msg"]
        }
        return
    room_id = req_dict["room_id"]

    room_runtime = controller.mem_cache.get(ckv.get_ckv_room_runtime(room_id))
    sync_controller = room_runtime.get_sync()
    action = sync_controller.query_logic_frame(user_id, client_frame)

    if action is None:
        ret = -1
        err_msg = 'query error'
        action = ''

    res.content = {
        "ret": ret,
        "err_msg": err_msg,
        "action": action,
        "frame": sync_controller.server_frame
    }
def user_user_level_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" %
                   (config.USER_USER_LEVEL_SERVICE, req.parse_err))
        return

    user_id = req.content["user_id"]
    opt = req.content["opt"]
    val = req.content["val"]

    user_level = UserLevel.select_user_level_by_user_id(user_id)
    exist = True
    if user_level is None:
        exist = False
        user_level = UserLevel()
        user_level.user_id = user_id
        user_level.level = 0

    if opt == 1:  # 上报
        user_level.level += val
        if not exist:
            user_level.insert_to_db()
        else:
            user_level.update_user_level_by_user_id()
        res.content = {"ret": 0, "opt": opt, "err_msg": ''}
        return

    if opt == 2:
        if not exist:
            user_level.insert_to_db()
        res.content = {
            "ret": 0,
            "err_msg": '',
            "opt": opt,
            "val": user_level.level
        }
        return

    res.content = {"ret": -1}
예제 #28
0
def user_register_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err" % config.USER_LOGIN_SERVICE)
        return

    username = req.content["username"]
    password = req.content["password"]

    user = User()
    user.username = username
    user.password = password

    rows_effect = user.insert_to_db()

    ret = 0
    register_success = True

    if rows_effect != 1:
        ret = -1
        register_success = False

    res.content = {"ret": ret, "register_success": register_success}
예제 #29
0
def room_mgr_query_room_users_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" % (config.ROOM_MGR_QUERY_ROOM_USERS_SERVICE, req.parse_err))
        return

    room_id = req.content["room_id"]
    err_msg = ""
    ret = 0
    user_id_list = ''

    room_runtime = controller.mem_cache.get(ckv.get_ckv_room_runtime(room_id))

    if room_runtime is None:
        ret = -1
    else:
        user_id_list = room_runtime.get_user_id_list_str()

    res.content = {
        "ret": ret,
        "user_id_list": user_id_list,
        "err_msg": err_msg
    }
def synchronization_heart_beat_service_run(controller, req, res):
    if not req.parse_success or not req.content:
        Log().warn("service %d req parse err %s" % (config.SYNCHRONIZATION_HEART_BEAT_SERVICE, req.parse_err))
        return

    user_id = req.content["user_id"]
    mode = req.content["mode"]
    life_time = req.content["time"]     # 单位秒,浮点数

    ret = 0
    err_msg = ''

    user_runtime = ckv.get_ckv_user_runtime(user_id)
    now_time = time.time()

    if mode == 1:   # 客户端 ping 一次 tick 一次
        res_dict = controller.handler_dict[config.ROOM_MGR_QUERY_USER_BELONGED_ROOM_SERVICE].inline_call(controller, {
            "user_id": user_id,
        })
        if res_dict["ret"] == -1:
            # 某种原因客户端又连上了,但是服务端认为你已经掉线了,而且该清空的都清空了
            res.content = {
                "ret": -1,
                "err_msg": "try to reconnect"
            }
            return
        user_runtime = controller.mem_cache.get(ckv.get_ckv_user_runtime(user_id))
        user_runtime.heart_beat.tick(controller, life_time)
        controller.mem_cache.set(ckv.get_ckv_user_to_conn(user_id), req.conn_id)
    elif mode == 2: # 每次tick后一段时间都来检查下
        user_runtime = controller.mem_cache.get(ckv.get_ckv_user_runtime(user_id))
        if not user_runtime.heart_beat.check(controller, life_time):
            controller.mem_cache.remove(ckv.get_ckv_user_to_conn(user_id))

    res.content = {
        "ret": 0,
        "err_msg": ''
    }