Exemple #1
0
def common_function_10009(request):
    req = SetInviteUserReq()
    rsp = SetInviteUserRsp()

    req.ParseFromString(request['body'])

    db_user = User.objects.filter(id=req.uin).first()
    if not db_user:
        rsp.ret = error_contrast.ERROR_USER_INVITED_NOT_EXIST
        return rsp.SerializeToString()

    uin = request['uin']
    user = RedisUserMgr().get_user(uin)
    if user.has_invited:
        rsp.ret = error_contrast.ERROR_USER_HASBEEN_INVITED
        return rsp.SerializeToString()

    # logger.debug('req.uin:%d', req.uin)
    rsp.ret = 0
    user.update(dict(
        user_inviter=req.uin,
        has_invited=True,
    ))
    # user.user_inviter = req.uin
    # user.has_invited = True

    return rsp.SerializeToString()
Exemple #2
0
def unbind_id_and_conn(conn_id):
    user_id = FireflyMap().get_user_by_conn(conn_id)
    if user_id:
        # 先更改用户状态,直接换成不在线就OK了
        user = RedisUserMgr().get_user(user_id)
        user.update(dict(
            status=config.LOGIN_USER_STATUS_OFFLINE,
        ))
        FireflyMap().detach_user_conn(user_id)
    else:
        logger.debug('conn:%s not find user_id', conn_id)
Exemple #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)
Exemple #4
0
 def func_wrapper(request, *args, **kwargs):
     user = RedisUserMgr().get_user(request.get('uin', None))
     request = dict(
         uin=user.uin,
         body=request.get('body', None),
         user=user,
     )
     return func(request, *args, **kwargs)
Exemple #5
0
def common_function_10005(request):
    ntf = CreateFormalBill()
    ntf.ParseFromString(request['body'])
    uin = ntf.uin
    item_id = ntf.item_id

    bill = Commodity.objects.filter(uin=uin, item_id=item_id)
    if bill:
        bill.update(bill_state=1)

    # 下发房卡变化通知
    user = RedisUserMgr().get_user(uin)
    user_room_card_notify(user)
Exemple #6
0
def modify_room_card(request):
    # 判断用户存在不存在

    # 修改使用post请求
    form = ModifyRoomCardForm(request.POST)
    if not form.is_valid():
        return render(request, 'write.html', dict(form=form, ))

    uin = form.cleaned_data['user_id']
    room_card_num = form.cleaned_data['room_card_num']
    remark = request.user.username + ' : ' + form.cleaned_data['remark']

    user = RedisUserMgr().get_user(uin)

    modify_card(user, room_card_num, None, remark, user_in_web=True)

    return render(request, 'write.html', dict(form=form, ))
Exemple #7
0
def common_function_10004(request):
    ntf = UserCreatePreBill()
    ntf.ParseFromString(request['body'])
    uin = ntf.uin
    name = ntf.name
    item_id = ntf.item_id

    user = RedisUserMgr().get_user(uin)

    logger.debug('create_pre_bill, uin:%s, name:%s, item_id:%s', uin, name,
                 item_id)
    # 把预付单先加进去
    Commodity(
        uin=user.uin,
        channel=user.channel,
        name=config.COMMODITY_ITEM_DICT[name].get('name'),
        item_type=config.COMMODITY_ITEM_DICT[name].get('type'),
        currency=config.COMMODITY_ITEM_DICT[name].get('cur'),
        amount=config.COMMODITY_ITEM_DICT[name].get('amt'),
        item_id=item_id,
        bill_state=0,  # 0代表订单生成
    ).save()
Exemple #8
0
 def user(self):
     return RedisUserMgr().get_user(self.uin)
Exemple #9
0
def auth_function_1001(request):
    """
    注册或登录
    :param request:
    :return:
    """
    req = LoginReq()
    req.ParseFromString(request['body'])
    rsp = LoginRsp()

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

    if not req.uuid:
        rsp.ret = error_contrast.ERROR_INVALID_PARAMS
        return rsp.SerializeToString()

    if not req.sign:
        rsp.ret = error_contrast.ERROR_INVALID_PARAMS
        return rsp.SerializeToString()

    src = "%s&%s&%s" % (config.ONLY_PAY_SECRET, req.uuid, req.version)

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

    if is_app_crime(req.channel, req.version):
        if not req.extra_username or not req.extra_password:
            # 请输入用户名和密码
            rsp.ret = error_contrast.ERROR_ENTER_USERNAME_AND_PASSWORD
            return rsp.SerializeToString()

        db_user = User.objects.filter(
            extra_username=req.extra_username).first()
        if req.is_register and db_user:
            # 用户名已注册
            rsp.ret = error_contrast.ERROR_USERNAME_HAS_EXIST
            return rsp.SerializeToString()

        if not req.is_register:
            if not db_user:
                # 用户名不存在
                rsp.ret = error_contrast.ERROR_USERNAME_NOT_EXIST
                return rsp.SerializeToString()

            if db_user and db_user.extra_password != req.extra_password:
                # 密码错误
                rsp.ret = error_contrast.ERROR_PASSWORD_IS_ERROR
                return rsp.SerializeToString()
    else:
        db_user = User.objects.filter(uuid=req.uuid).first()

    if not db_user:
        db_user = User()
        db_user.password = get_password()
        if is_app_crime(req.channel, req.version):
            db_user.uuid = req.uuid + req.extra_username
            db_user.nick = req.extra_username
            db_user.extra_username = req.extra_username
            db_user.extra_password = req.extra_password
        else:
            db_user.uuid = req.uuid
            db_user.nick = req.nick[:6]
            db_user.card = 100

        if req.os:
            db_user.os = req.os

        db_user.save()

    # 转成Redis对象
    user = RedisUserMgr().get_user(db_user.uin)
    user.attach_db_user(db_user)
    user.update(dict(
        channel=req.channel,
        version=req.version,
        os=req.os,
    ))

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

    return common_user_reg_or_login(request, user)
Exemple #10
0
def parse_desk_record_to_db(round_id):
    records = rds_tmp.lrange(config.REDIS_KEY_DESK_RECORD_PREFIX + round_id, 0, -1)
    if not records:
        return

    # 解序列化并按时间排序
    records = sorted([json.loads(r) for r in records], key=itemgetter('optime'))

    if len(records) > 1:
        first, mid_records, last = records[0], records[1:-1], records[-1]

        if first['source'] != config.STATISTIC_MAHJONG_DESK_GAME_START:
            logger.error('first record is not game start, desk uuid: %s', round_id)
            return

        # 不是牌桌结束,那就是半路把桌子解散掉了
        if last['source'] != config.STATISTIC_MAHJONG_DESK_GAME_OVER:
            while True:
                # 会有多条
                if last['source'] == config.STATISTIC_MAHJONG_DESK_GAME_START:
                    # 最后一条如果是用户退桌,删除掉
                    last = mid_records.pop()
                else:
                    break

            if last['source'] != config.STATISTIC_MAHJONG_DESK_GAME_OVER:
                logger.error('last record is not game over, desk uuid: %s', round_id)
                return

        user_records = defaultdict(list)

        round_id = first['uuid']
        desk_id = first['desk_id']
        desk_model = dict(
            desk_round=first['desk_round'],
            desk_type=first['desk_type'],
            desk_seat_limit=first['desk_seat_limit'],
            desk_win_type=first['desk_win_type'],
            desk_has_laizi=first['desk_has_laizi'],
            desk_can_win_by_qidui=first['desk_can_win_by_qidui'],
            desk_bird_num=first['desk_bird_num'],
            desk_piaofen_max_num=first['desk_piaofen_max_num'],
            desk_has_shanghuo=first['desk_has_shanghuo'],
            desk_master_uin=first['desk_master_uin'],
        )

        user_data = first['user_info']
        for uin in user_data:
            user_records[int(uin)].append(round_id)

        for item in records:
            if item['source'] == config.STATISTIC_MAHJONG_DESK_GAME_OVER:
                game_round = item['game_round']
                desk_model['desk_bird_card'] = item['desk_bird_card']
                desk_model['desk_over_time'] = item['desk_over_time']
                desk_model['desk_winners'] = item['desk_winners']
                user_info = item['user_info']

                DeskRecord(
                    uuid=round_id,
                    desk_id=desk_id,
                    game_round=game_round,
                    desk_model=desk_model,
                    user_data=user_info,
                ).save()

        # 存储最多近期100条记录
        users = RedisUserMgr().get_users(user_records.keys(), load_db_user=True)
        for uin, user in users.items():
            records = list(user.desk_records or [])
            if round_id not in records:
                records.insert(0, round_id)
                if len(records) > 100:
                    records.pop()
                user.update(dict(
                    desk_records=records
                ))
    else:
        # 开局就退了的选手,到时候统计起来
        logger.debug('only one round and not over, round id: %s', round_id)

    rds_tmp.delete(config.REDIS_KEY_DESK_RECORD_PREFIX + round_id)
Exemple #11
0
def wx_login(request):
    from common.models import WXUser, User
    from django.db.utils import IntegrityError
    from common.bus_func import replace_forbidden_content, get_user_info

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

    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()
    # logger.debug('wx_user find')
    wx_info = dict()
    if not wx_user:
        wx_info = get_user_info(req.openid, req.token)
        # logger.debug('wx_info:%s', wx_info)
        if not wx_info:
            rsp.ret = error_contrast.ERROR_WX_LOGIN_FAILED
            return rsp.SerializeToString()

        # logger.debug('wx_user create')
        wx_user = WXUser(
            userid=req.openid,
            access_token=req.token,
            expire_date=req.expire_date,
            appid=appid,
        )
        # logger.debug('wx_user create success')

        if not uin:
            # logger.debug('native_user create, head:%s', wx_info.get('headimgurl'))
            native_user = User(
                password=get_password(),
                nick=replace_forbidden_content(wx_info.get('nickname')[:6]),
                sex=config.SEX_MALE if wx_info.get('sex') == 1 else config.SEX_FEMALE,
                channel=req.channel or None,
                version=req.version,
                os=req.os or 'android',
                portrait_path=wx_info.get('headimgurl'),
            )
            # logger.debug('native_user create success')
            native_user.save()
            # logger.debug('native_user save success')
            wx_user.native_id = native_user.id

        else:
            if WXUser.objects.filter(native_id=uin):
                # id如果已经和其他绑定过,就返回报错了,否则加金币会重复,只要不停的换账号就行了
                rsp.ret = error_contrast.ERROR_WX_BIND_ALREADY
                return rsp.SerializeToString()

        try:
            wx_user.save()
        except IntegrityError, e:
            logger.error(e.message, exc_info=True)
            rsp.ret = error_contrast.ERROR_WX_LOGIN_FAILED
            return rsp.SerializeToString()

        # logger.debug('wx_user save success')
        user = RedisUserMgr().get_user(wx_user.native_id)
Exemple #12
0
            # logger.debug('access_token not the same')
            wx_info = get_user_info(req.openid, req.token)
            # logger.debug('not wx_info:%s', wx_info)
            if not wx_info:
                rsp.ret = error_contrast.ERROR_WX_LOGIN_FAILED
                return rsp.SerializeToString()
            else:
                # 更新token
                wx_user.access_token = req.token
                wx_user.save()

        if uin and 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)
        if wx_info.has_key('headimgurl') and user.portrait_path != wx_info.get('headimgurl'):
            user.update(dict(
                channel=req.channel or None,
                version=req.version,
                os=req.os or 'android',
                portrait_path=wx_info.get('headimgurl'),
            ))
        else:
            user.update(dict(
                channel=req.channel or None,
                version=req.version,
                os=req.os or 'android',
            ))
        # logger.debug('start common_user_reg_or_login')