Esempio n. 1
0
    def user_back(self, msgtype, body):
        room_obj = g_gameManager.get_room(self.player.room_id)

        rsp_user_offline = rainbow_pb.UserOffline()
        rsp_user_offline.entityID = self.player.entityID
        rsp_user_offline.offline = False
        msg = success_msg(msgid.ROOM_USER_OFFLINE, rsp_user_offline)
        for role in room_obj.roles:
            if not role['offline']:
                g_playerManager.sendto(role['entityID'], msg)

        role = room_obj.get_role(self.player.entityID)
        role.offline = False

        rsp = rainbow_pb.JoinRoomResponse()
        rsp.room_id = room_obj.room_id
        rsp.master_id = room_obj.master_entity_id
        rsp.master_server_index = room_obj.master_server_index
        rsp.game_id = room_obj.game_id
        rsp.game_settings = room_obj.game_settings
        rsp.play_count = room_obj.play_count
        rsp.min_player_count = room_obj.game_config['min_player_count']
        rsp.max_player_count = room_obj.game_config['max_player_count']
        for role in room_obj.roles:
            rsp.users.add(**role)
        return success_msg(msgtype, '')
Esempio n. 2
0
    def user_out(self, msgtype, body):
        req = rainbow_pb.KickOutRequest()
        req.ParseFromString(body)

        room_obj = g_gameManager.get_room(self.player.room_id)
        if room_obj.master_entity_id != self.player.entityID:
            return fail_msg(msgtype,
                            msgTips.FAIL_MSG_ROOM_KICK_OUT_PERMISSION_DENY)

        rsp = rainbow_pb.KickOutResponse()
        rsp.kick_out_id = req.kick_out_id
        msg = success_msg(msgtype, rsp)
        for role in room_obj.roles:
            if role['entityID'] == 0:
                continue

            p = g_entityManager.get_player(role['entityID'])
            if p:
                # 如果就是这个玩家被踢的话,清空一下数据
                if p.entityID == req.kick_out_id:
                    p.room_id = 0
                    p.save()
                    p.sync()

                # 发送踢人的消息
                if role['entityID'] != self.player.entityID:
                    g_playerManager.sendto(role['entityID'], msg)

            # 把这个位置空出来
            if role['entityID'] == req.kick_out_id:
                role['entityID'] = 0
                role['username'] = ''

        return msg
Esempio n. 3
0
    def user_out(self, msgtype, body):
        req = rainbow_pb.KickOutRequest()
        req.ParseFromString(body)

        room_obj = g_roomManager.get_room(self.player.room_id)
        if not room_obj:
            return fail_msg(msgtype, msgTips.FAIL_MSG_ROOM_NOT_EXIST)

        if room_obj.master_entity_id != self.player.entityID:
            return fail_msg(msgtype, msgTips.FAIL_MSG_ROOM_KICK_OUT_PERMISSION_DENY)

        rsp_user_kick_out = rainbow_pb.UserKickOut()
        rsp_user_kick_out.kick_out_id = req.kick_out_id
        msg = success_msg(msgid.ROOM_USER_BEEN_KICK_OUT, rsp_user_kick_out)
        for role in room_obj.roles:
            if role.entityID == 0:
                continue

            p = g_entityManager.get_player(role.entityID)
            if p:
                if p.entityID == req.kick_out_id:
                    p.room_id = 0
                    p.pos_index = 0
                    p.save()
                g_playerManager.sendto(role.entityID, msg)

            if role.entityID == req.kick_out_id:
                role.entityID = 0
                role.username = ''

        return success_msg(msgtype, '')
Esempio n. 4
0
def broadcast_red_message(info):
    rsp = poem_pb.RedInfo(**info)
    if not info:
        return
    g_redManager.cache_red_message(info)
    msg = success_msg(msgid.DAILY_RED_INFO, rsp)
    for k, p in g_entityManager.players.items():
        g_playerManager.sendto(k, msg)
Esempio n. 5
0
def multi_sync_property(entities, masterID=None):
    for entity in entities:
        entity.pop_sync_dirty()
        if masterID:
            assert entity.masterID == masterID, 'entity not in master'
        else:
            masterID = entity.masterID
    if masterID:
        msg = multi_sync_property_msg(entities, None)
        g_playerManager.sendto(masterID, msg)
Esempio n. 6
0
def sync_lineups(player):
    rsp = Lineups()
    for type, _lineup in player.lineups.items():
        lineup = rsp.lineups.add(line=_lineup, type=type)
        if type == LineupType.ATK:
            for index, petID in enumerate(_lineup):
                if petID:
                    for info in get_equipeds_infos(player.entityID, petID,
                                                   index):
                        lineup.equipeds.add(**info)
    g_playerManager.sendto(player.entityID, success_msg(LINEUP_LINEUPS, rsp))
Esempio n. 7
0
def sync_mats(role, all=False):
    if all:
        mats = role.mats.keys()
    else:
        mats = pop_mats_dirty(role)
    if not mats and not all:
        return
    rsp = Mats()
    for matID in mats:
        count = role.mats.get(matID, 0)
        rsp.mats.add(matID=matID, count=count)
    g_playerManager.sendto(role.entityID, success_msg(msgid.SYNC_MATS, rsp))
Esempio n. 8
0
def sync_gems(role, all=False):
    if all:
        gems = role.gems.keys()
    else:
        gems = pop_gems_dirty(role)
    if not gems and not all:
        return
    rsp = poem_pb.Gems()
    for gemID in gems:
        count = role.gems.get(gemID, 0)
        rsp.gems.add(gemID=gemID, count=count)
    g_playerManager.sendto(role.entityID, success_msg(msgid.SYNC_GEMS, rsp))
Esempio n. 9
0
def sync_player_property(player, all=False, syncSence=False, syncfields=set()):
    'sync player dirty fields'
    if all:
        fields = None
        player.pop_sync_dirty()
    elif syncfields:
        fields = player.remove_sync_dirty(syncfields)
    else:
        fields = player.pop_sync_dirty(syncSence)
        if not fields:
            #logger.error("Called sync_property, but nothing to sync!")
            return
    msg = sync_property_msg(player, fields, isme=True)
    g_playerManager.sendto(player.entityID, msg)
Esempio n. 10
0
    def user_leave(self, msgtype, body):
        room_obj = g_gameManager.get_room(self.player.room_id)
        role = room_obj.get_role(self.player.entityID)
        role['offline'] = True

        rsp_user_offline = rainbow_pb.UserOffline()
        rsp_user_offline.entityID = self.player.entityID
        rsp_user_offline.offline = True
        msg = success_msg(msgid.ROOM_USER_OFFLINE, rsp_user_offline)
        for role in room_obj.roles:
            if not role['offline']:
                g_playerManager.sendto(role['entityID'], msg)

        return success_msg(msgtype, '')
Esempio n. 11
0
def sync_scene_infos(player, type=FbType.Normal):
    fbInfos = get_config(FbInfoConfig)
    fbs, nexts = get_fb_list(player, type)
    rsp = SceneInfos()
    today_ts = int(time.mktime(datedate.today().timetuple()))
    for f in fbs:  # 过滤引导关卡
        count = get_today_remain_count(player, f, today=today_ts)
        rsp.fbs.add(**get_fb_info(player, f, today=today_ts))
    for next in nexts:
        count = get_today_remain_count(player, next, today=today_ts)
        info = fbInfos[next]
        rsp.fbs.add(fbID=next, count=count, isNew=True, openlv=info.openlv)
    for s in get_scene_list(player, fbs + nexts):
        rsp.scenes.add(**get_scene_info(player, s))
    rsp.type = type
    logger.debug(rsp)
    g_playerManager.sendto(player.entityID, success_msg(SCENE_INFOS, rsp))
Esempio n. 12
0
 def send_red_message(self,
                      p,
                      message,
                      red_count=0,
                      cd=10,
                      red_drop=0,
                      to_self=False,
                      type=RedType.Normal,
                      module=RedModuleType.Daily,
                      **kwargs):
     if not message.strip(" "):
         return
     t = str(float(time.time()))
     data = {
         "message": message,
         "type": type,
         "order": t,
         "to_self": to_self,
         "module": module,
         "drop": red_drop,
     }
     if isinstance(p, int):
         entityID = p
     else:
         entityID = p.entityID
         data.update({
             "name": p.name,
             "prototypeID": p.prototypeID,
             "borderID": p.borderID,
         })
     data.update(**kwargs)
     pb = poem_pb.RedInfo(**data)
     if type == RedType.Red:
         del data["to_self"]
         self.send_red(p, red_count, data)
     else:
         if to_self:
             msg = success_msg(msgid.DAILY_RED_INFO, pb)
             if g_playerManager.has_player(entityID):
                 g_playerManager.sendto(entityID, msg)
             else:
                 proxy.send_self_red_message(entityID, data)
         else:
             data["cd"] = cd
             proxy.broadcast_red_message(data)
Esempio n. 13
0
    def game_reconn(self, msgtype, body):
        room_obj = g_gameManager.get_room(self.player.room_id)
        room_obj.player_reconn(self.player)

        offline_rsp = rainbow_pb.UserOffline()
        offline_rsp.entityID = self.player.entityID
        offline_rsp.offline = False
        for role_info in RoomRoleSitDownIterator(room_obj):
            if role_info['entityID'] == self.player.entityID:
                continue
            g_playerManager.sendto(
                role_info['entityID'],
                success_msg(msgid.ROOM_USER_OFFLINE, offline_rsp))

        return success_msg(
            msgtype,
            room_obj.pack_game_data(rainbow_pb.GameDataMahjong.Reconn,
                                    self.player.entityID))
Esempio n. 14
0
def send_horn(message, cd=10, **kwargs):
    t = str(float(time.time()))
    data = {
        "message": message,
        "type": RedType.Horn,
        "order": t,
        "to_self": False,
        "module": RedModuleType.System,
        "cd": cd,
    }
    data.update(**kwargs)
    data["cd"] = cd
    g_redManager.cache_red_message(data)
    rsp = poem_pb.RedInfo(**data)
    print rsp
    msg = success_msg(msgid.BROADCAST_HORN, rsp)
    for k, p in g_entityManager.players.items():
        g_playerManager.sendto(k, msg)
Esempio n. 15
0
    def apply_for_dismiss(self, msgtype, body):
        room_obj = g_gameManager.get_room(self.player.room_id)

        rsp = rainbow_pb.DismissRoomResult()

        # 如果只有自己一个人的话,那就直接解散吧
        if room_obj.get_roles_count() == 1:
            g_gameManager.dismiss_room(self.player)
            rsp.result = 2
            return success_msg(msgtype, rsp)

        # 如果已经有人申请了,你再申请的话,就默认同意了
        if room_obj.apply_entityID != 0:
            role = room_obj.get_role(self.player.entityID)
            role['dismiss_agree'] = True
        else:
            room_obj.apply_entityID = self.player.entityID
            rsp.apply_id = self.player.entityID

            for role in room_obj.roles:
                if role['entityID'] == self.player.entityID:
                    role['dismiss_agree'] = True
                else:
                    role['dismiss_agree'] = False

        # 统计一下同意的玩家数量和等待的玩家数量
        rsp.agree_num = 0
        rsp.waiting_num = 0
        rsp.result = 1

        for role in room_obj.roles:
            if role['entityID'] != 0:
                if role['dismiss_agree']:
                    rsp.agree_num += 1
                else:
                    rsp.waiting_num += 1

        msg = success_msg(msgtype, rsp_dismiss)
        for role in room_obj.roles:
            if role['entityID'] != 0 and not role[
                    'offline'] and role['entityID'] != self.player.entityID:
                g_playerManager.sendto(role['entityID'], msg)

        return msg
Esempio n. 16
0
def sync_pet_property(pet, all=False):
    'sync pet dirty fields'

    from entity.manager import g_entityManager
    master = g_entityManager.get_player(pet.masterID)
    if pet.entityID not in master.pets:
        logger.debug('pet not in master')
        return

    if all:
        fields = None
        pet.pop_sync_dirty()
    else:
        fields = pet.pop_sync_dirty()
        if not fields:
            logger.error("Called sync_property, but nothing to sync!")
            return

    msg = sync_property_msg(pet, fields)
    g_playerManager.sendto(master.entityID, msg)
Esempio n. 17
0
def set_exp(role, exp):
    '''增加经验,如果可以升级,设置等级'''
    # 试用账户有升级上限
    if isinstance(
            role,
            Player) and role.lock_level > 0 and role.level >= role.lock_level:
        from player.manager import g_playerManager
        from yy.message.header import fail_msg
        g_playerManager.sendto(
            role.entityID,
            fail_msg(
                0,
                reason=
                '该帐号为体验帐号,只能在注册时使用的设备上登录!体验帐号等级上限为%s级,使用正常帐号登录可体验完整的游戏内容!再次感谢您的配合!'
                % role.lock_level))
        return False
    role.exp += exp
    rs = levelup(role)
    if rs:
        if isinstance(role, Player):
            from task.manager import on_levelup, on_login
            on_levelup(role)
            on_login(role)
            from pvp.rob import on_mine_change, check_rob
            on_mine_change(role)
            check_rob(role)
            from entity.manager import check_level_packs
            check_level_packs(role)
            from player.model import PlayerLevelRanking
            PlayerLevelRanking.update_score(role.entityID, role.level)
            from friend.manager import recommendp
            recommendp(role)
            from campaign.manager import reset_online_packs
            reset_online_packs(role)
            from explore.ambition import reload_ambition
            reload_ambition(role)
    return rs
Esempio n. 18
0
def send_friend_message(friendID, content, senderID, **extra):
    now = time.time()
    message = {
        "time": now,
        "content": content,
        "senderID": senderID,
    }
    message.update(extra)
    p = g_entityManager.get_player(friendID)
    listen_to = FRIEND_LISTENERS.get(friendID, 0)
    if listen_to == senderID:
        rsp = poem_pb.FriendMessages()
        rsp.messages.add(**message)
        rsp.senderID = senderID
        msg = success_msg(
            msgid.LISTEN_FRIEND, rsp)
        g_playerManager.sendto(friendID, msg)
        return
    messages = p.friend_messages.get(senderID, [])
    messages.append(message)
    p.friend_messages[senderID] = messages
    p.save()
    p.sync()
    return True
Esempio n. 19
0
        if not room_obj or not room_obj:has_player(self.player.entityID):
            self.player.room_id = 0
            self.player.pos_index = 0
            self.player.save()
            return fail_msg(msgtype, msgTips.FAIL_MSG_ROOM_NOT_EXIST)

        role = room_obj.get_role(self.player.entityID)
        role.offline = True

        rsp_user_offline = rainbow_pb.UserOffline()
        rsp_user_offline.entityID = self.player.entityID
        rsp_user_offline.offline = True
        msg = success_msg(msgid.ROOM_USER_LEAVE, rsp_user_offline)
        for role in room_obj.roles:
            if not role.offline:
                g_playerManager.sendto(role.entityID, msg)

        return success_msg(msgtype, '')

    @rpcmethod(msgid.ROOM_APPLY_FOR_DISMISS)
    def apply_for_dismiss(self, msgtype, body):
        room_obj = g_roomManager.get_room(self.player.room_id)
        if not room_obj or not room_obj:has_player(self.player.entityID):
            self.player.room_id = 0
            self.player.pos_index = 0
            self.player.save()
            return fail_msg(msgtype, msgTips.FAIL_MSG_ROOM_NOT_EXIST)

        if room_obj.get_roles_count() == 1:
            rsp_result = rainbow_pb.DissmissRoomResult()
            rsp_result.dismiss = True
Esempio n. 20
0
 def itunes_iap_validation_handle(self, msgtype, req):
     from itunesiap import Request, set_verification_mode
     from itunesiap.exceptions import InvalidReceipt, ItunesServerNotAvailable
     from session.utils import sdk_username
     from sdk.payment import end_payment, get_payment, gen_payment
     player = self.player
     try:
         # set_verification_mode('sandbox')
         request = Request(req.receipt)
         with request.verification_mode('review'):
             receipt = request.verify()
         logger.info(receipt)
         configs = get_config(RechargeConfig)
         goods = filter(
             lambda item: item.goodsid == receipt.product_id and item.
             sdktype == poem_pb.SDK_APP_IOS, configs.values())
         if len(goods) != 1:
             logger.error('Invalid goodsid: {},{}'.format(
                 player.entityID, receipt.product_id))
             return False
         goods = goods[0]
         logger.debug(goods)
         sdkorderid = sdk_username(poem_pb.SDK_APP_IOS,
                                   receipt.transaction_id)
         payment = get_payment(sdkorderid)
         if not payment:
             result = gen_payment(sdkorderid, player.entityID,
                                  poem_pb.SDK_APP_IOS, receipt.product_id)
             payment = get_payment(sdkorderid)
         if payment.get('status', None) != 'SUCCESS':
             if not end_payment(sdkorderid):
                 logger.error('insert callback pay record failed %s' %
                              sdkorderid)
                 return False
             payment = get_payment(sdkorderid)
             logger.debug(payment)
             data = {
                 "clientVersion": "",
                 "amount": goods.amount,
                 "orderNO": sdkorderid,
                 "_level": "",
                 "_username": "",
                 "_userID": 0,
                 "_entityID": player.entityID,
                 "result": 1
             }
             username = player.username
             userID = player.userID
             idfa = player.idfa
             appid = player.appid
             rs = pay_handler(player.entityID,
                              username,
                              payment["goodsid"],
                              amount=int(goods.amount))
             if not rs:
                 return False
             logger.debug(rs)
             get_gold = rs["get_gold"]
             username = rs["username"]
             level = rs["level"]
             rsp = poem_pb.PayResult(success=True,
                                     roleID=player.entityID,
                                     userID=0,
                                     payID=receipt.transaction_id,
                                     goods=0,
                                     count=get_gold,
                                     data=req.receipt)
             g_playerManager.sendto(player.entityID,
                                    success_msg(msgid.SDK_PAY_RESULT, rsp))
             data.update(_username=username, _level=level)
             data.update(_gold=get_gold)
             role_credit(**data)
             gm_logger.info({
                 'pay': {
                     'transaction_id': receipt.transaction_id,
                     'userID': userID,
                     'entityID': player.entityID,
                     'channel': player.channel,
                     'amount': goods.amount,
                     'gold': get_gold,
                     'idfa': idfa,
                     'appid': appid,
                     'username': username
                 },
                 'payID': sdkorderid
             })
         if payment.get('status', None) == 'SUCCESS':
             response = poem_pb.iTunesStoreReceiptResponse()
             response.transaction_id = receipt.transaction_id
             response.successed = True
             g_playerManager.sendto(player.entityID,
                                    success_msg(msgtype, response))
     except InvalidReceipt:
         logger.warning('invalid receipt')
Esempio n. 21
0
 def sdk_pay_start(self, msgtype, body):
     assert settings.PAY, "充值关闭"
     req = poem_pb.SDKStartPayRequest()
     req.ParseFromString(body)
     p = self.player
     logger.debug("request: {}".format(req))
     allows = (
         poem_pb.SDK_YY,
         poem_pb.SDK_YY_IOS,
     )
     configs = get_config(RechargeConfig)
     sdktype = username2type(p.username)
     label = username2label(p.username)
     sdkconfigs = get_config(RechargeBySdktypeConfig).get(sdktype, [])
     labconfigs = get_config(RechargeByLabelConfig).get(label, [])
     ids = {e.id for e in sdkconfigs} & {e.id for e in labconfigs}
     if not ids:
         return fail_msg(msgtype, msgTips.SUCCESS_MSG_PAY_FAIL)
     configs = {configs[c].goodsid: configs[c] for c in ids}
     goods = configs.get(req.goodsid)
     if not goods:
         return fail_msg(msgtype, msgTips.SUCCESS_MSG_PAY_FAIL)
     if goods.type == RechargeType.MonthlyCard30:
         if p.monthly_card_30:
             msg = fail_msg(msgid.SDK_PAY_START, reason='已经购买过月卡了。')
             g_playerManager.sendto(p.entityID, msg)
             return
     elif goods.type == RechargeType.LimitedPacks:
         now = int(time.time())
         info = get_limited_packs_time(now)
         if not info:
             return fail_msg(msgtype, msgTips.SUCCESS_MSG_PAY_FAIL)
         if p.limited_packs_used_count >= info.count:
             return fail_msg(msgtype, msgTips.SUCCESS_MSG_PAY_FAIL)
     elif goods.type == RechargeType.TimeLimitedPacks:
         now = int(time.time())
         info = get_timelimited_packs_time(now)
         if not info:
             return fail_msg(msgtype, msgTips.SUCCESS_MSG_PAY_FAIL)
         if p.timelimited_packs_last_time >= info.start and\
                 p.timelimited_packs_last_time < info.end:
             return fail_msg(msgtype, msgTips.SUCCESS_MSG_PAY_FAIL)
     elif goods.type in (RechargeType.TriggerPacks1,
                         RechargeType.TriggerPacks2):
         if p.trigger_packs_buy_count >= 1:
             return fail_msg(msgtype, reason="已经购买过了。")
         from config.configs import LevelupConfig
         info = get_config(LevelupConfig).get(p.level)
         if not info:
             return fail_msg(msgtype, msgTips.SUCCESS_MSG_PAY_FAIL)
         if goods.type == RechargeType.TriggerPacks2:
             if p.level < info.triggerPacks2:
                 return fail_msg(msgtype, msgTips.SUCCESS_MSG_PAY_FAIL)
         elif goods.type == RechargeType.TriggerPacks1:
             if p.level < info.triggerPacks1:
                 return fail_msg(msgtype, msgTips.SUCCESS_MSG_PAY_FAIL)
         # NOTE 支付回调问题 不让重复买
         p.trigger_packs_buy_count += 1
         p.save()
         p.sync()
     # 测试模式充值
     if req.sdkType in allows and req.goodsid is not None and getattr(
             settings, 'TEST_PAY', False):
         sid = ''
         rs = give_goods(p, goods)
         rsp = poem_pb.PayResult(success=True,
                                 roleID=p.entityID,
                                 userID=0,
                                 payID=sid,
                                 goods=0,
                                 count=rs["gold"],
                                 data="")
         g_playerManager.sendto(
             p.entityID,
             success_msg(msgtype,
                         poem_pb.SDKStartPayResponse(serialNo=sid)))
         g_playerManager.sendto(p.entityID,
                                success_msg(msgid.SDK_PAY_RESULT, rsp))
         return
     else:
         # 唯一且包含时间戳信息
         sid = str(objectid.ObjectId())
         from sdk.payment import gen_payment
         from session.utils import sdk_username
         sdkorderid = sdk_username(req.sdkType, sid)
         # 记录支付订单号
         result = gen_payment(sdkorderid, p.entityID, req.sdkType,
                              req.goodsid, goods.amount)
         if not result:
             return fail_msg(msgid.SDK_PAY_START,
                             msgTips.FAIL_MSG_SDK_START_PAY_FAILED)
         self.orderindex += 1
     logger.info("orderid `%s`", sid)
     return success_msg(msgtype, poem_pb.SDKStartPayResponse(serialNo=sid))
Esempio n. 22
0
    def enter(self, msgtype, body):
        req = poem_pb.EnterRequest()
        req.ParseFromString(body)
        entityID = req.entityID
        # 不允许重新登录
        if g_playerManager.has_player(entityID):
            if g_playerManager.peers[entityID].key == self.peer.key:
                return
            # 给已登录的发送重复登录消息
            g_playerManager.sendto(entityID,
                                   fail_msg(msgtype, msgTips.FAIL_MSG_KICKED))
            g_playerManager.kick_player(entityID)
        clientVersion = req.clientVersion
        featureCode = req.featureCode
        clientIP, _ = self.peer._sock.getpeername() or ('', '')
        self.player = player = g_entityManager.load_player(
            self.userID, entityID, clientVersion, featureCode, clientIP)
        if not player:
            self.peer.sender(fail_msg(msgtype, msgTips.FAIL_MSG_LOAD_PLAYER))
            self.peer.close()
            return
        PlayerOnlineIndexing.update(settings.WORLD["ID"], player.entityID)
        player.clientVersion = clientVersion
        player.featureCode = featureCode
        player.clientIP = clientIP
        player.appid = req.deviceInfo.appid
        player.UDID = req.deviceInfo.UDID
        player.idfa = req.deviceInfo.idfa
        player.IMEI = req.deviceInfo.IMEI
        player.MAC = req.deviceInfo.MAC
        player.save()
        g_playerManager.register(player.entityID, self.peer)
        player.sync(all=True)

        # 发送公告
        notice_rsp = get_notice_rsp()
        g_playerManager.sendto(player.entityID,
                               success_msg(msgid.NOTICE, notice_rsp))

        sync_scene_infos(player)

        rsp = poem_pb.EnterResponse()
        rsp.ENABLE_GIFTKEY = settings.ENABLE_GIFTKEY  # cdkey
        rsp.REV = settings.REV
        rsp.time = int(time.time())
        self.peer.sender(success_msg(msgtype, rsp))

        gm_logger.info({
            'access': {
                'entityID': player.entityID,
                'type': 'login',
                'userID': player.userID,
                'username': player.username,
                'onlines': g_playerManager.count(),
                'username_alias': player.username_alias,
                'channel': player.channel
            }
        })

        from common.log import role_login
        role_login(player=player)
Esempio n. 23
0
 def do_send():
     gevent.sleep(delay)
     g_playerManager.sendto(
         player.entityID, success_msg(msgid.SDK_PAY_RESULT,
                                      rsp))
Esempio n. 24
0
def sdk_pay(entityID,
            orderid,
            amount,
            rechargegold,
            sdata,
            sdktype,
            goods,
            delay=0):
    from session.utils import sdk_username
    from sdk.payment import end_payment, get_payment
    GOOD_GOLD = 0

    if orderid:
        sdkorderid = sdk_username(sdktype, orderid)
        payment = get_payment(sdkorderid)
        if len(payment) == 0:
            logger.error('orderid {} not exists.'.format(orderid))
            return False
        # 如果交易完成直接返回成功
        if payment.get('status', None) == 'SUCCESS':
            return True

        if not end_payment(sdkorderid):
            logger.error('insert callback pay record failed %s' % sdkorderid)
            return False
        goodsid = payment["goodsid"]

    elif sdktype == poem_pb.SDK_YYB:
        sdkorderid = sdk_username(sdktype, '')
        ids = get_config(RechargeBySdktypeConfig).get(sdktype, [])
        configs = [get_config(RechargeConfig)[e.id] for e in ids]
        goodsid = max(configs, key=lambda o: o.amount).goodsid

    else:
        logger.error('orderid {} is empty.'.format(orderid))
        return False

    amount = amount / 10.0
    gold = rechargegold
    if goods == GOOD_GOLD:
        data = {
            "clientVersion": "",
            "amount": gold,
            "orderNO": sdkorderid,
            "_level": "",
            "_username": "",
            "_userID": 0,
            "_entityID": entityID,
            "result": 1
        }
        player = g_entityManager.get_player(entityID)
        if player:
            username = player.username
            userID = player.userID
            playername = player.name
            channel = player.channel
        else:
            p = Player.simple_load(entityID,
                                   ["username", "userID", "name", "channel"])
            username = p.username
            userID = p.userID
            playername = p.name
            channel = p.channel
        rs = pay_handler(entityID, username, goodsid, amount=amount)
        if not rs:
            return False
        get_gold = rs["get_gold"]
        username = rs["username"]
        level = rs["level"]
        if player:
            rsp = poem_pb.PayResult(success=True,
                                    roleID=entityID,
                                    userID=userID,
                                    payID=orderid,
                                    goods=0,
                                    count=get_gold,
                                    data=sdata)
            if delay == 0:
                g_playerManager.sendto(player.entityID,
                                       success_msg(msgid.SDK_PAY_RESULT, rsp))
            else:

                def do_send():
                    gevent.sleep(delay)
                    g_playerManager.sendto(
                        player.entityID, success_msg(msgid.SDK_PAY_RESULT,
                                                     rsp))

                gevent.spawn(do_send)
        data.update(_username=username, _level=level)
        data.update(_gold=get_gold)
        role_credit(**data)
        gm_logger.info({
            'pay': {
                'entityID': entityID,
                'amount': amount,
                'userID': userID,
                'playername': playername,
                'channel': channel,
                'gold': get_gold,
                'username': username,
                'transaction_id': orderid
            },
            'payID': sdkorderid
        })
        return True
    logger.error('unknown goods %d', goods)
    return False
Esempio n. 25
0
File: city.py Progetto: kimch2/x8623
def sync_city_dungeon_current_info(entityID, current_info):
    p = g_entityManager.get_player(entityID)
    if p:
        rsp = poem_pb.CityDungeonCurrentInfo(**current_info)
        msg = success_msg(msgid.CITY_DUNGEON_CURRENT_INFO, rsp)
        g_playerManager.sendto(entityID, msg)
Esempio n. 26
0
    def user_dismiss_response(self, msgtype, body):
        room_obj = g_gameManager.get_room(self.player.room_id)

        rsp = rainbow_pb.DismissRoomResult()

        # 没有人申请解散房间,这个可能是玩家长时间没有回应导致的
        # 这个时候,房间可能已经因为超时之类的,已经自动解散了
        if room_obj.apply_entityID == 0:
            rsp.result = 0
            return success_msg(msgtype, rsp)

        req = rainbow_pb.AgreeDismiss()
        req.ParseFromString(body)

        # 不同意的话,就解散失败
        if not req.is_agree:
            rsp.result = 3
            msg = success_msg(msgtype, rsp)

            room_obj.apply_entityID = 0
            for role in room_obj.roles:
                if role['entityID'] != 0:
                    # 清理掉玩家对解散包间的回应标识
                    role['dismiss_agree'] = False

                    # 通知玩家,解散房间失败
                    if not role['offline'] and role[
                            'entityID'] != self.player.entityID:
                        g_playerManager.sendto(role['entityID'], msg)

            return msg

        # 同意的话,就检查是否所有玩家都做出了回应
        is_all_agree = True
        for role in room_obj.roles:
            # 先把自己的回应标记一下
            if role['entityID'] == self.player.entityID:
                role['dismiss_agree'] = True

            # 如果有玩家还没有回应,就需要继续等待
            if role['entityID'] != 0 and not role['dismiss_agree']:
                is_all_agree = False

        # 如果所有玩家都同意了,就解散吧
        if is_all_agree:
            rsp.result = 2
            msg = success_msg(msgtype, rsp)

            for role in room_obj.roles:
                if role['entityID'] != 0 and not role['offline'] and role[
                        'entityID'] != self.player.entityID:
                    g_playerManager.sendto(role['entityID'], msg)

            g_gameManager.dismiss_room(self.player)

            return msg

        # 统计一下同意的玩家数量和等待的玩家数量
        rsp.agree_num = 0
        rsp.waiting_num = 0
        rsp.result = 1

        for role in room_obj.roles:
            if role['entityID'] != 0:
                if role['dismiss_agree']:
                    rsp.agree_num += 1
                else:
                    rsp.waiting_num += 1

        msg = success_msg(msgtype, rsp)
        for role in room_obj.roles:
            if role['entityID'] != 0 and not role[
                    'offline'] and role['entityID'] != self.player.entityID:
                g_playerManager.sendto(role['entityID'], msg)

        return msg
Esempio n. 27
0
def notify_gve_entity(entityID, message):
    g_playerManager.sendto(entityID, message)
Esempio n. 28
0
class RoomService(RpcService):
    @rpcmethod(msgid.ROOM_CREATE)
    def create_room(self, msgtype, body):
        req = rainbow_pb.CreateRoomRequest()
        req.ParseFromString(body)

        if self.player.room_id != 0:
            room_obj = g_roomManager.get_room(self.player.room_id):
            if room_obj and room_obj.has_player(self.player.entityID):
                return fail_msg(msgtype, msgTips.FAIL_MSG_ROOM_CREATE_HAS_ROOM)

        room_obj = g_roomManager.create_room(self.player, req.game_id, req.game_settings)

        self.player.room_id = room_obj.room_id
        self.player.pos_index = 0
        self.player.save()
        self.player.sync()

        rsp = rainbow_pb.JoinRoomResponse()
        rsp.room_id = room_obj.id
        rsp.master_id = room_obj.master_entity_id
        rsp.server_index = 0
        for role in room_obj.roles:
            rsp.users.add(**role)
        return success_msg(msgtype, rsp)

    @rpcmethod(msgid.ROOM_USER_JOIN)
    def join_room(self, msgtype, body):
        req = rainbow_pb.JoinRoomRequest()
        req.ParseFromString(body)

        room_obj = g_roomManager.get_room(req.room_id)
        if not room_obj:
            return fail_msg(msgtype, msgTips.FAIL_MSG_ROOM_NOT_EXIST)

        if room_obj.max_count <= len(room_obj.roles):
            return fail_msg(msgtype, msgTips.FAIL_MSG_ROOM_LIMIT_EXCEED)

        # 
        rsp_user_info = rainbow_pb.UserInfo()
        rsp_user_info.entityID = self.player.entityID
        rsp_user_info.username = self.player.username
        rsp_user_info.sex = self.player.sex
        rsp_user_info.offline = False
        g_playerManager.broadcast(room_obj.roles, success_msg(msgid.ROOM_USER_IN, rsp_user_info))

        # 
        pos_index = -1
        for index, role in enumerate(room_obj.roles):
            if role.entityID == 0:
                role.entityID = self.player.entityID
                role.username = self.player.username
                role.sex = self.player.sex
                role.offline = False

                pos_index = index

        if pos_index == -1:
            pos_index = len(room_obj.roles)

            room_obj.roles.append({
                'entityID': self.player.entityID,
                'username': self.player.username,
                'sex': self.player.sex,
                'offline': False,
                })

        self.player.room_id = req.room_id
        self.player.pos_index = pos_index
        self.player.save()
        self.player.sync()

        rsp = rainbow_pb.JoinRoomResponse()
        rsp.room_id = room_obj.id
        rsp.master_id = room_obj.master_entity_id
        rsp.server_index = self.player.pos_index
        for role in room_obj.roles:
            rsp.users.add(**role)
        return success_msg(msgtype, rsp)

    @rpcmethod(msgid.ROOM_USER_KICK_OUT)
    def user_out(self, msgtype, body):
        req = rainbow_pb.KickOutRequest()
        req.ParseFromString(body)

        room_obj = g_roomManager.get_room(self.player.room_id)
        if not room_obj:
            return fail_msg(msgtype, msgTips.FAIL_MSG_ROOM_NOT_EXIST)

        if room_obj.master_entity_id != self.player.entityID:
            return fail_msg(msgtype, msgTips.FAIL_MSG_ROOM_KICK_OUT_PERMISSION_DENY)

        rsp_user_kick_out = rainbow_pb.UserKickOut()
        rsp_user_kick_out.kick_out_id = req.kick_out_id
        msg = success_msg(msgid.ROOM_USER_BEEN_KICK_OUT, rsp_user_kick_out)
        for role in room_obj.roles:
            if role.entityID == 0:
                continue

            p = g_entityManager.get_player(role.entityID)
            if p:
                if p.entityID == req.kick_out_id:
                    p.room_id = 0
                    p.pos_index = 0
                    p.save()
                g_playerManager.sendto(role.entityID, msg)

            if role.entityID == req.kick_out_id:
                role.entityID = 0
                role.username = ''

        return success_msg(msgtype, '')

    @rpcmethod(msgid.ROOM_USER_BACK)
    def user_back(self, msgtype, body):
        room_obj = g_roomManager.get_room(self.player.room_id)
        if not room_obj or not room_obj:has_player(self.player.entityID):
            self.player.room_id = 0
            self.player.pos_index = 0
            self.player.save()
            return fail_msg(msgtype, msgTips.FAIL_MSG_ROOM_NOT_EXIST)

        rsp_user_offline = rainbow_pb.UserOffline()
        rsp_user_offline.entityID = self.player.entityID
        rsp_user_offline.offline = False
        msg = success_msg(msgid.ROOM_USER_BACK, rsp_user_offline)
        for role in room_obj.roles:
            if not role.offline:
                g_playerManager.sendto(role.entityID, msg)

        role = room_obj.get_role(self.player.entityID)
        role.offline = False

        rsp = rainbow_pb.JoinRoomResponse()
        rsp.room_id = room_obj.id
        rsp.master_id = room_obj.master_entity_id
        rsp.server_index = self.player.pos_index
        for role in room_obj.roles:
            rsp.users.add(**role)
        return success_msg(msgtype, '')
Esempio n. 29
0
    def join_room(self, msgtype, body):
        req = rainbow_pb.JoinRoomRequest()
        req.ParseFromString(body)

        room_obj = g_gameManager.get_room(req.room_id)
        if not room_obj:
            return fail_msg(msgtype, msgTips.FAIL_MSG_ROOM_NOT_EXIST)

        if room_obj.max_count <= len(room_obj.roles):
            return fail_msg(msgtype, msgTips.FAIL_MSG_ROOM_LIMIT_EXCEED)

        # 自动找个位置坐下
        pos_index = -1
        for index, role in enumerate(room_obj.roles):
            if role['entityID'] == 0:
                role['entityID'] = self.player.entityID
                role['username'] = self.player.username
                role['sex'] = self.player.sex
                role['offline'] = False
                role['is_ready'] = False
                role['pos_index'] = index

                pos_index = index

        if pos_index == -1:
            pos_index = len(room_obj.roles)

            room_obj.roles.append({
                'entityID': self.player.entityID,
                'username': self.player.username,
                'sex': self.player.sex,
                'offline': False,
                'is_ready': False,
                'pos_index': pos_index,
            })

        # 通知房间中的其他玩家,有人进来了
        rsp_user_info = rainbow_pb.RoomUserInfo()
        rsp_user_info.entityID = self.player.entityID
        rsp_user_info.username = self.player.username
        rsp_user_info.sex = self.player.sex
        rsp_user_info.offline = False
        rsp_user_info.pos_index = pos_index
        msg = success_msg(msgid.ROOM_USER_IN, rsp_user_info)
        for role in room_obj.roles:
            if role['entityID'] != 0 and not role[
                    'offline'] and role['entityID'] != self.player.entityID:
                g_playerManager.sendto(role['entityID'], msg)

        #
        self.player.room_id = req.room_id
        self.player.save()
        self.player.sync()

        rsp = rainbow_pb.JoinRoomResponse()
        rsp.room_id = room_obj.room_id
        rsp.master_id = room_obj.master_entity_id
        rsp.master_server_index = room_obj.master_server_index
        rsp.game_id = room_obj.game_id
        rsp.game_settings = room_obj.game_settings
        rsp.play_count = room_obj.play_count
        rsp.min_player_count = room_obj.game_config['min_player_count']
        rsp.max_player_count = room_obj.game_config['max_player_count']
        for index, role in enumerate(room_obj.roles):
            if role['entityID'] != 0:
                rsp.users.add(**role)
        return success_msg(msgtype, rsp)
Esempio n. 30
0
 def do_sync(self, sendto, rsp):
     g_playerManager.sendto(sendto, rsp)