def play_function_7012(request):
    """
    改变用户状态
    """
    req = GamePlayerReadyReq()
    req.ParseFromString(request['body'])

    logger.debug('req:%s\n, desk:%s\n', req, request['desk'])
    request['desk'].player_status_change(request['user'].uin, req)

    evt = GamePlayerReadyEvt()
    evt.deskid = request['desk'].id
    if 'game_start' in request['desk'].timeout_info and request[
            'desk'].type == config.DESK_TYPE_MJ_WZ:
        evt.pre_remain_time = request['desk'].timeout_info['game_start'] - int(
            time.time())
    else:
        evt.pre_remain_time = -1

    for player in request['desk'].player_group.valid_players:
        evt_info_list = evt.users.add()
        if req.status == 2 or req.status == 3:
            evt_info_list.status = player.delete_status
        else:
            evt_info_list.status = player.status
        evt_info_list.piaofen = player.piaofen
        evt_info_list.shanghuo = player.shanghuo
        evt_info_list.uin = player.uin

    logger.debug('status evt:\n%s', evt)
    evt = evt.SerializeToString()
    for player in request['desk'].player_group.valid_players:
        write_to_users(player.uin, proto.CMD_PLAYER_STATUS_CHANGE, evt)
Beispiel #2
0
def user_room_card_notify(user, user_in_web=False, reason=0):
    rsp = UserRoomCardChange()
    rsp.room_card = user.card
    rsp.change_reason = reason

    logger.debug('card change rsp:%s', rsp)
    rsp = rsp.SerializeToString()
    if user_in_web:
        bridge_to_users(user.uin, proto.CMD_EVENT_USER_CARD_CHANGE, rsp)
    else:
        write_to_users(user.uin, proto.CMD_EVENT_USER_CARD_CHANGE, rsp)
Beispiel #3
0
def auth_function_1002(request):  # unicode
    """
    微信登录
    """
    from common.mahjong_pb2 import WeChatLoginReq
    from common.models import WXUser

    req = WeChatLoginReq()
    req.ParseFromString(request['body'])
    rsp = LoginRsp()

    # logger.debug('1002 req:%s', req)

    src = "%s&%s&%s" % (config.ONLY_PAY_SECRET, req.openid, req.token)
    sign = hashlib.md5(src).hexdigest()

    if req.sign != sign:
        logger.error('invalid sign! req: %s', req)
        rsp.ret = error_contrast.ERROR_INVALID_PARAMS
        return rsp.SerializeToString()

    appid = str(
        config.WX_LOGIN_CHANNEL_TO_APPID.get(req.channel,
                                             config.WX_LOGIN_APPID))

    wx_user = WXUser.objects.filter(
        userid=req.openid,
        appid=appid,
    ).first()

    if not wx_user or wx_user.access_token != req.token:
        celery_delay(
            wx_login,
            request,
        )
        return

    if request['uin'] and request['uin'] != wx_user.native_id:
        rsp.ret = error_contrast.ERROR_USER_BIND_NOT_MATCH
        return rsp.SerializeToString()

    user = RedisUserMgr().get_user(wx_user.native_id)
    user.update(
        dict(
            channel=req.channel or None,
            version=req.version,
            os=req.os or 'android',
        ))

    rsp = common_user_reg_or_login(request, user)

    tell_transfer_to_bind(user.uin, request['connid'])

    write_to_users(user.uin, proto.CMD_REG, rsp)
Beispiel #4
0
def common_function_10003(request):
    """
    桌子内聊天
    """
    req = DeskChatReq()
    req.ParseFromString(request['body'])
    rsp = DeskChatEvt()
    rsp.ret = 0

    logger.debug('req:%s', req)
    # 只有坐着的玩家才能聊天
    sit_uins = [
        player.uin for player in request['desk'].player_group.valid_players
    ]
    if request['user'].uin not in sit_uins:
        return

    logger.debug('enter type')
    # 文字聊天
    if req.type == 1:
        if not req.content:
            rsp.ret = error_contrast.ERROR_DESK_CHAT_NONE
            return rsp.SerializeToString()

        if req.content:
            # 这里要检查是否包含非法字符
            rsp.content = ForbiddenWordsMgr.replace_word(req.content)
    # 语音聊天
    elif req.type == 2:
        # 索引不能为0
        if req.index == 0:
            rsp.ret = error_contrast.ERROR_DESK_CHAT_NONE
            return rsp.SerializeToString()

        rsp.index = req.index
    else:
        return

    rsp.op_uin = request['user'].uin
    rsp.sex = request['user'].sex

    # In me the tiger sniffs the rose
    logger.debug('send evt')
    for player in request['desk'].player_group.valid_players:
        evt = rsp.SerializeToString()
        write_to_users(player.uin, proto.CMD_GAME_DESK_CHAT, evt)
def play_function_7002(request):
    """
    内部使用
    换桌前的退桌, 然后重定向到分配桌子ID
    :param request:
    :return:
    """
    req = GameEnterDeskReq()
    req.ParseFromString(request['body'])
    user = request['user']
    rsp = GameEnterDeskRsp()

    # 是否是换桌, 检查退桌
    err, prev_desk_id = check_to_exit_prev_desk(request)
    if err:
        rsp.ret = err
        write_to_users(user.id, proto.CMD_USER_ENTER_DESK,
                       rsp.SerializeToString())
        return
def play_function_7014(request):
    """
    申请解散牌桌
    """
    req = ApplyDeleteReq()
    req.ParseFromString(request['body'])

    state = request['desk'].apply_delete_desk(request['user'].uin)

    if config.GAME_START_PASS == state:
        return

    evt = ApplyDeleteEvt()
    evt.apply_uin = request['user'].uin
    evt.game_status = state
    if 'count_down' in request['desk'].timeout_info:
        evt.remain_time = request['desk'].timeout_info['count_down'] - int(
            time.time())
    evt.status = request['desk'].status
    evt.deskid = request['desk'].id

    evt = evt.SerializeToString()
    for player in request['desk'].player_group.valid_players:
        write_to_users(player.uin, proto.CMD_APPLY_DELETE_DESK, evt)
def play_function_7001(request):
    """
    只处理进桌
    """
    req = GameEnterDeskReq()
    req.ParseFromString(request['body'])
    rsp = GameEnterDeskRsp()

    user = request['user']
    # 先保存下来,后面要做判断
    dst_desk_id = req.dst_desk_id or 0

    # 正常从hall里面走进来的dst_desk_id是肯定有值的
    if not dst_desk_id:
        # 获取断线重连桌子
        err, desk = get_reconnect_desk(user)
        if err:
            rsp.ret = err
            write_to_users(user.id, proto.CMD_USER_ENTER_DESK,
                           rsp.SerializeToString())
            return

        if desk.status == config.GAME_STATE_WAIT_DELETE:
            desk.user_exit(user.uin)
            return
    else:
        # 为了支持服务器重启清除所有数据的时候,如果这时
        # 用户在游戏大厅,那这时应该可以让他进指定桌。
        request['user'].update(dict(
            status=1,
            desk_id=0,
        ))

        err, desk = try_allocate_desk(user, dst_desk_id, req)

        if err:
            if desk:
                desk.unlock()
            rsp.ret = err
            write_to_users(user.id, proto.CMD_USER_ENTER_DESK,
                           rsp.SerializeToString())
            return

        # 先判断桌子的状态
        if desk.status == config.GAME_STATE_WAIT_DELETE:
            desk.user_exit(user.uin)
            rsp.ret = error_contrast.ERROR_DESK_NOT_EXIST
            write_to_users(user.id, proto.CMD_USER_ENTER_DESK,
                           rsp.SerializeToString())
            return

    # 把用户加入进去
    enter_ok = desk.user_enter(request)
    # player = desk.player_group.get_player_or_viewer_by_uin(request.user.uin)

    # 坐下失败了
    if enter_ok >= config.RET_SIT_DOWN_FAILED:
        logger.debug('sit_down failed')
        rsp.ret = error_contrast.ERROR_SIT_DOWN_FAIL
        write_to_users(user.id, proto.CMD_USER_ENTER_DESK,
                       rsp.SerializeToString())

    # 如果是中途退桌再回来,那才在这里发
    if enter_ok == config.RET_SIT_DOWN_RECONNECT:
        logger.debug('reconnect, player_group:%s', desk.player_group)
        desk.broadcast_user_enter(request)

    # 手动解锁
    desk.unlock()