Ejemplo n.º 1
0
    def __makeBlob(self, store):
        dg = PyDatagram()
        if self.__list:
            dg.addUint8(CatalogItem.CatalogItemVersion)
            for item in self.__list:
                CatalogItem.encodeCatalogItem(dg, item, store)

        return dg.getMessage()
 def setItem(self, furnitureMgrId, blob):
     self.furnitureMgr = self.cr.doId2do[furnitureMgrId]
     self.furnitureMgr.dfitems.append(self)
     self.item = CatalogItem.getItem(blob, store=CatalogItem.Customization)
     self.assign(self.loadModel())
     interior = self.furnitureMgr.getInteriorObject()
     self.reparentTo(interior.interior)
Ejemplo n.º 3
0
 def setItem(self, furnitureMgrId, blob):
     self.furnitureMgr = self.cr.doId2do[furnitureMgrId]
     self.furnitureMgr.dfitems.append(self)
     self.item = CatalogItem.getItem(blob, store=CatalogItem.Customization)
     self.assign(self.loadModel())
     interior = self.furnitureMgr.getInteriorObject()
     self.reparentTo(interior.interior)
Ejemplo n.º 4
0
 def requestGiftPurchaseMessage(self, context, avId, item, optional):
     senderId = self.air.getAvatarIdFromSender()
     av = self.air.doId2do.get(senderId)
     reciver = self.air.doId2do.get(avId)
     if not reciver:
         self.notify.warning("Toon %d is not online or doesn't exist!" % avId)
         return
     if not av:
         self.air.writeServerEvent('suspicious', senderId, 'Used phone from other shard!')
         return
     item = CatalogItem.getItem(item)
     if isinstance(item, CatalogInvalidItem):
         self.air.writeServerEvent('suspicious', avId, 'Tried to gift invalid catalog item.')
         return
     if item.loyaltyRequirement():
         self.air.writeServerEvent('suspicious', avId, 'Tried to gift an unimplemented loyalty item!')
         return
     if item in av.backCatalog:
         price = item.getPrice(CatalogItem.CatalogTypeBackorder)
     elif item in av.weeklyCatalog or item in av.monthlyCatalog:
         price = item.getPrice(0)
     else:
         return
     if not av.takeMoney(price):
         return
     resp = item.recordPurchase(av, optional)
     if resp < 0:
         av.addMoney(price)
     simbase.air.deliveryManager.addGift(avId, item, context, optional, senderId)
     self.sendUpdateToAvatarId(senderId, 'requestGiftPurchaseResponse', [context, resp])
     taskMgr.doMethodLater(0.2, self.sendUpdateToAvatarId, 'purchaseItemComplete-%d' % self.getDoId(), extraArgs=[senderId, 'purchaseItemComplete', []])
Ejemplo n.º 5
0
    def finish(self):
        #print("PurchaseGiftRequest FINISH")
        sAv = self.neededObjects[self.senderId]
        rAv = self.neededObjects[self.receiverId]
        self.item = CatalogItem.getItem(self.itemBlob, store = CatalogItem.Customization)
        retcode = None
        #put neat stuff here
        #-----------------------------------------------------------------------------
        retcode = self.checkGift(retcode)
        retcode = self.checkCatalog(retcode)
        #retcode = self.checkMoney(retcode)
        retcode = self.checkGender(retcode)
        retcode = self.checkPurchaseLimit(retcode)
        retcode = self.checkMailbox(retcode)
        if (retcode != None):
                self.distObj.sendUpdateToChannel(self.replyToChannelId, "receiveRejectPurchaseGift",
                [self.senderId, self.context, retcode, self.cost])
        else:
            now = (int)(time.time() / 60 + 0.5)
            deliveryTime = self.item.getDeliveryTime() / self.distObj.timeScale
            if deliveryTime < 2:
                deliveryTime = 2
            self.item.deliveryDate = int(now + deliveryTime)
            #self.item.giftTag = self.senderId
            itemList = CatalogItemList.CatalogItemList([self.item])
            itemBlob = itemList.getBlob(store = CatalogItem.Customization | CatalogItem.DeliveryDate)
            retcode = ToontownGlobals.P_ItemOnOrder
            self.distObj.addGiftFR(self.receiverId, itemBlob, self.senderId, self.context, retcode, self.replyToChannelId)
        #-----------------------------------------------------------------------------

        AsyncRequest.finish(self)
Ejemplo n.º 6
0
    def requestGiftPurchaseMessage(self, context, targetDoID, blob, optional):
        # print("in the AI phone")
        # Sent from the client code to request a particular purchase item. to be sent to a target doid
        sAvId = self.air.getAvatarIdFromSender()
        item = CatalogItem.getItem(blob, store=CatalogItem.Customization)
        retcode = None
        if self.busy != sAvId:
            self.air.writeServerEvent(
                'suspicious', sAvId,
                'DistributedPhoneAI.requestPurchaseMessage busy with %s' %
                (self.busy))
            self.notify.warning(
                "Got unexpected purchase request from %s while busy with %s." %
                (sAvId, self.busy))
            retcode = ToontownGlobals.P_NotShopping
            #in this case we can send the response immediately
            self.sendUpdateToAvatarId(sAvId, "requestGiftPurchaseResponse",
                                      [context, retcode])

        elif self.air.catalogManager.payForGiftItem(self.av, item, retcode):
            # The user is requesting purchase of one particular item.in this case we have to wait for the purchase to go through
            # which involves waiting for a query from the database: intancing the gift receiver on the local machine

            self.checkAvatarThenGift(targetDoID, sAvId, item, context)
            #simbase.air.deliveryManager.sendRequestPurchaseGift(item, targetDoID, sAvId, context, self)

            #can't return immediately must what for the query to go through
        else:
            retcode = ToontownGlobals.P_NotEnoughMoney
            self.sendUpdateToAvatarId(sAvId, "requestGiftPurchaseResponse",
                                      [context, retcode])
    def requestPurchaseMessage(self, context, item, optional):
        avId = self.air.getAvatarIdFromSender()
        if avId != self.avId:
            self.air.writeServerEvent(
                'suspicious',
                avId=avId,
                issue='Tried to purchase while not using the phone!')
            return
        av = self.air.doId2do.get(avId)

        if not av:
            self.air.writeServerEvent('suspicious',
                                      avId=avId,
                                      issue='Used phone from other shard!')
            return

        item = CatalogItem.getItem(item)
        if isinstance(item, CatalogInvalidItem):
            self.air.writeServerEvent(
                'suspicious',
                avId=avId,
                issue='Tried to purchase invalid catalog item.')
            return
        if item in av.backCatalog:
            price = item.getPrice(CatalogItem.CatalogTypeBackorder)
        elif item in av.weeklyCatalog or item in av.monthlyCatalog:
            price = item.getPrice(0)
        else:
            return

        if item.getDeliveryTime():
            if len(av.onOrder) > 3:  #TODO correct number
                self.sendUpdateToAvatarId(
                    avId, 'requestPurchaseResponse',
                    [context, ToontownGlobals.P_OnOrderListFull])
                return
            if len(av.mailboxContents) + len(
                    av.onOrder) >= ToontownGlobals.MaxMailboxContents:
                self.sendUpdateToAvatarId(
                    avId, 'requestPurchaseResponse',
                    [context, ToontownGlobals.P_MailboxFull])
            if not av.takeMoney(price):
                return
            item.deliveryDate = int(time.time() / 60) + item.getDeliveryTime()
            av.onOrder.append(item)
            av.b_setDeliverySchedule(av.onOrder)
            self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse',
                                      [context, ToontownGlobals.P_ItemOnOrder])
        else:
            if not av.takeMoney(price):
                #u wot m8
                return

            resp = item.recordPurchase(av, optional)
            if resp < 0:  # refund if purchase unsuccessful
                av.addMoney(price)

            self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse',
                                      [context, resp])
Ejemplo n.º 8
0
 def deleteItemFromRoomMessage(self, blob, doId, context):
     # A request by the client to delete the indicated
     # item directly from the room.
     avId = self.air.getAvatarIdFromSender()
     item = CatalogItem.getItem(blob, store=CatalogItem.Customization)
     retcode = self.__doDeleteItemFromRoom(avId, item, doId)
     self.sendUpdateToAvatarId(avId, "deleteItemFromRoomResponse",
                               [retcode, context])
Ejemplo n.º 9
0
 def deleteWindowFromAtticMessage(self, blob, index, context):
     # A request by the client to delete the indicated
     # window from the attic altogether.
     avId = self.air.getAvatarIdFromSender()
     item = CatalogItem.getItem(blob, store=CatalogItem.Customization)
     retcode = self.__doDeleteWindowFromAttic(avId, item, index)
     self.sendUpdateToAvatarId(avId, "deleteWindowFromAtticResponse",
                               [retcode, context])
Ejemplo n.º 10
0
 def recoverDeletedItemMessage(self, blob, index, context):
     # A request by the client to recover the indicated item from
     # the deleted-item list.
     avId = self.air.getAvatarIdFromSender()
     item = CatalogItem.getItem(blob, store=CatalogItem.Customization)
     retcode = self.__doRecoverDeletedItem(avId, item, index)
     self.sendUpdateToAvatarId(avId, "recoverDeletedItemResponse",
                               [retcode, context])
Ejemplo n.º 11
0
 def acceptItemMessage(self, context, blob, itemIndex, optional):
     DistributedMailboxAI.notify.debug('acceptItemMessage()')
     # Sent from the client code to request a particular item from
     # the mailbox.
     retcode = None
     avId = self.air.getAvatarIdFromSender()
     item = CatalogItem.getItem(blob, store=CatalogItem.Customization)
     if self.av:
         adjustedMailboxContentsIndex = itemIndex - len(
             self.av.awardMailboxContents)
     else:
         adjustedMailboxContentsIndex = itemIndex
     isAward = item.isAward()
     if self.busy != avId:
         # The client should filter this already.
         self.air.writeServerEvent(
             'suspicious', avId,
             'DistributedMailboxAI.acceptItem busy with %s' % (self.busy))
         self.notify.warning(
             "Got unexpected item request from %s while busy with %s." %
             (avId, self.busy))
         retcode = ToontownGlobals.P_NotAtMailbox
         self.sendUpdateToAvatarId(avId, "acceptItemResponse",
                                   [context, retcode])
     elif itemIndex < 0 or itemIndex >= (len(self.av.mailboxContents) +
                                         len(self.av.awardMailboxContents)):
         self.air.writeServerEvent(
             'suspicious', avId,
             'DistributedMailboxAI.acceptItem invalid index %s' %
             (itemIndex))
         retcode = ToontownGlobals.P_InvalidIndex
     elif not self.isItemIndexValid(item, itemIndex):
         self.air.writeServerEvent(
             'suspicious', avId,
             'DistributedMailboxAI.acceptItem invalid index %d isAward=%s adjustedIndex=%d'
             % (itemIndex, isAward, adjustedMailboxContentsIndex))
         retcode = ToontownGlobals.P_InvalidIndex
     else:
         # Give the item to the user.
         retcode = item.recordPurchase(self.av, optional)
         if retcode >= 0:
             if isAward:
                 del self.av.awardMailboxContents[itemIndex]
                 self.av.b_setAwardMailboxContents(
                     self.av.awardMailboxContents)
             else:
                 del self.av.mailboxContents[adjustedMailboxContentsIndex]
                 self.av.b_setMailboxContents(self.av.mailboxContents)
         elif retcode == ToontownGlobals.P_ReachedPurchaseLimit or \
             retcode == ToontownGlobals.P_NoRoomForItem:
             pass
             #del self.av.mailboxContents[itemIndex]
             #self.av.b_setMailboxContents(self.av.mailboxContents)
     #import pdb; pdb.set_trace()
     self.sendUpdateToAvatarId(avId, "acceptItemResponse",
                               [context, retcode])
Ejemplo n.º 12
0
    def __makeList(self, store):
        list = []
        if self.__blob:
            dg = PyDatagram(self.__blob)
            di = PyDatagramIterator(dg)
            versionNumber = di.getUint8()
            while di.getRemainingSize() > 0:
                item = CatalogItem.decodeCatalogItem(di, versionNumber, store)
                list.append(item)

        return list
    def requestPurchaseMessage(self, context, item, optional):
        avId = self.air.getAvatarIdFromSender()
        if avId != self.avId:
            self.air.writeServerEvent('suspicious', avId, 'Tried to purchase while not using the phone!')
            return

        av = self.air.doId2do.get(avId)
        if not av:
            self.air.writeServerEvent('suspicious', avId, 'Used phone from other shard!')
            return

        item = CatalogItem.getItem(item)
        if isinstance(item, CatalogInvalidItem):
            self.air.writeServerEvent('suspicious', avId, 'Tried to purchase invalid catalog item.')
            return
        if item.loyaltyRequirement():
            self.air.writeServerEvent('suspicious', avId, 'Tried to purchase an unimplemented loyalty item!')
            return
        if item in av.backCatalog:
            price = item.getPrice(CatalogItem.CatalogTypeBackorder)
        elif item in av.weeklyCatalog or item in av.monthlyCatalog:
            price = item.getPrice(0)
        else:
            return

        if item.getDeliveryTime():
            if len(av.onOrder) > 5:
                self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_OnOrderListFull])
                return

            if len(av.mailboxContents) + len(av.onOrder) >= ToontownGlobals.MaxMailboxContents:
                self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_MailboxFull])

            if not av.takeMoney(price):
                return

            item.deliveryDate = int(time.time()/60) + item.getDeliveryTime()
            av.onOrder.append(item)
            av.b_setDeliverySchedule(av.onOrder)
            self.air.popularItemManager.avBoughtItem(item)
            self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_ItemOnOrder])
            taskMgr.doMethodLater(0.2, self.sendUpdateToAvatarId, 'purchaseItemComplete-%d' % self.getDoId(), extraArgs=[avId, 'purchaseItemComplete', []])
        else:
            if not av.takeMoney(price):
                return

            resp = item.recordPurchase(av, optional)
            if resp < 0:
                    av.addMoney(price)
            else:
                self.air.popularItemManager.avBoughtItem(item)

            self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, resp])
            taskMgr.doMethodLater(0.2, self.sendUpdateToAvatarId, 'purchaseItemComplete-%d' % self.getDoId(), extraArgs=[avId, 'purchaseItemComplete', []])
Ejemplo n.º 14
0
    def requestPurchaseMessage(self, context, item, optional):
        avId = self.air.getAvatarIdFromSender()
        if avId != self.avId:
            self.air.writeServerEventMessage('suspicious', avId, 'Tried to purchase while not using the phone!')
            return

        av = self.air.doId2do.get(avId)
        if not av:
            self.air.writeServerEventMessage('suspicious', avId, 'Used phone from other shard!')
            return

        item = CatalogItem.getItem(item)
        if isinstance(item, CatalogInvalidItem):
            self.air.writeServerEventMessage('suspicious', avId, 'Tried to purchase invalid catalog item.')
            return
        if item.loyaltyRequirement():
            self.air.writeServerEventMessage('suspicious', avId, 'Tried to purchase an unimplemented loyalty item!')
            return
        if item in av.backCatalog:
            price = item.getPrice(CatalogItem.CatalogTypeBackorder)
        elif item in av.weeklyCatalog or item in av.monthlyCatalog:
            price = item.getPrice(0)
        else:
            return

        if item.getDeliveryTime():
            if len(av.onOrder) > 5:
                self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_OnOrderListFull])
                return

            if len(av.mailboxContents) + len(av.onOrder) >= ToontownGlobals.MaxMailboxContents:
                self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_MailboxFull])

            if not av.takeMoney(price):
                return

            item.deliveryDate = int(time.time()/60) + item.getDeliveryTime()
            av.onOrder.append(item)
            av.b_setDeliverySchedule(av.onOrder)
            self.air.popularItemManager.avBoughtItem(item)
            self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_ItemOnOrder])
            taskMgr.doMethodLater(0.2, self.sendUpdateToAvatarId, 'purchaseItemComplete-%d' % self.getDoId(), extraArgs=[avId, 'purchaseItemComplete', []])
        else:
            if not av.takeMoney(price):
                return

            resp = item.recordPurchase(av, optional)
            if resp < 0:
                    av.addMoney(price)
            else:
                self.air.popularItemManager.avBoughtItem(item)

            self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, resp])
            taskMgr.doMethodLater(0.2, self.sendUpdateToAvatarId, 'purchaseItemComplete-%d' % self.getDoId(), extraArgs=[avId, 'purchaseItemComplete', []])
Ejemplo n.º 15
0
 def setItem(self, furnitureMgrId, blob):
     # We shouldn't get this message twice.
     assert (self.furnitureMgr == None)
     self.furnitureMgr = self.cr.doId2do[furnitureMgrId]
     self.furnitureMgr.dfitems.append(self)
     self.item = CatalogItem.getItem(blob, store=CatalogItem.Customization)
     assert (self.notify.debug("setItem: item: %s" % (self.item)))
     # Assign the actual node path
     self.assign(self.loadModel())
     interior = self.furnitureMgr.getInteriorObject()
     self.reparentTo(interior.interior)
Ejemplo n.º 16
0
 def requestPurchaseMessage(self, context, blob, optional):        
     avId = self.air.getAvatarIdFromSender()
     if avId != self.currAvId:
         self.air.writeServerEvent('suspicious', avId, 'tried purchasing item, but not using phone')
         self.notify.warning('%d tried purchasing item, but not using phone' % avId)
         return
         
     av = self.air.doId2do.get(avId)
     if not av:
         self.air.writeServerEvent('suspicious', avId, 'tried purchasing item, but not on shard')
         self.notify.warning('%d tried purchasing item, but not on shard' % avId)
         return
         
     item = CatalogItem.getItem(blob, CatalogItem.Customization)
     if isinstance(item, CatalogInvalidItem.CatalogInvalidItem):
         self.air.writeServerEvent('suspicious', avId, 'tried purchasing invalid item')
         self.notify.warning('%d tried purchasing invalid item' % avId)
         self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_NotInCatalog])
         return
         
     if item in av.onOrder:
         retcode = ToontownGlobals.P_ItemOnOrder
         
     elif len(av.onOrder) >= MAX_ON_ORDER:
         retcode = ToontownGlobals.P_ReachedPurchaseLimit
         
     elif item.reachedPurchaseLimit(av):
         retcode = ToontownGlobals.P_ReachedPurchaseLimit
         
     elif len(av.mailboxContents) >= MAX_MAILBOX:
         retcode = ToontownGlobals.P_MailboxFull
         
     elif item.getPrice(0) >= av.getTotalMoney():
         retcode = ToontownGlobals.P_NotEnoughMoney
         
     elif isItemForbidden(item):
         retcode = ToontownGlobals.P_ReachedPurchaseLimit
         
     elif item.__class__.__name__ == "CatalogChatItem":
         # no mailbox, deliver it already
         retcode = ToontownGlobals.P_ItemAvailable
         av.takeMoney(item.getPrice(0))
         item.recordPurchase(av, optional)
         
     else:
         retcode = ToontownGlobals.P_ItemAvailable
         av.takeMoney(item.getPrice(0))
     
         item.deliveryDate = int(time.time() / 60. + item.getDeliveryTime() + .5)
         av.onOrder.append(item)
         av.b_setDeliverySchedule(av.onOrder)
     
     self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, retcode])
Ejemplo n.º 17
0
    def discardItemMessage(self, context, blob, itemIndex, optional):
        DistributedMailboxAI.notify.debug("discardItemMessage")
        # Sent from the client code to request a particular item from
        # the mailbox to be discarded.
        avId = self.air.getAvatarIdFromSender()
        item = CatalogItem.getItem(blob, store=CatalogItem.Customization)
        retcode = 0
        if self.av:
            adjustedMailboxContentsIndex = itemIndex - len(
                self.av.awardMailboxContents)
        else:
            adjustedMailboxContentsIndex = itemIndex
        isAward = item.isAward()
        if self.busy != avId:
            # The client should filter this already.
            self.air.writeServerEvent(
                'suspicious', avId,
                'DistributedMailboxAI.acceptItem busy with %s' % (self.busy))
            DistributedMailboxAI.notify.warning(
                "Got unexpected item discard request from %s while busy with %s."
                % (avId, self.busy))
            retcode = ToontownGlobals.P_NotAtMailbox
        elif itemIndex < 0 or itemIndex >= (len(self.av.mailboxContents) +
                                            len(self.av.awardMailboxContents)):
            self.air.writeServerEvent(
                'suspicious', avId,
                'DistributedMailboxAI.discardItem invalid index %s' %
                (itemIndex))
            retcode = ToontownGlobals.P_InvalidIndex
        elif not self.isItemIndexValid(item, itemIndex):
            self.air.writeServerEvent(
                'suspicious', avId,
                'DistributedMailboxAI.discardItem invalid index %d isAward=%s adjustedIndex=%d'
                % (itemIndex, isAward, adjustedMailboxContentsIndex))
            retcode = ToontownGlobals.P_InvalidIndex
        else:
            # delete the item
            if item.isAward():
                del self.av.awardMailboxContents[itemIndex]
                self.air.writeServerEvent(
                    "Discarding Item award", avId,
                    "discarded item %s" % (item.getName()))
                self.av.b_setAwardMailboxContents(self.av.awardMailboxContents)
            else:
                del self.av.mailboxContents[adjustedMailboxContentsIndex]
                self.air.writeServerEvent(
                    "Discarding Item", avId,
                    "discarded item %s" % (item.getName()))
                self.av.b_setMailboxContents(self.av.mailboxContents)

        self.sendUpdateToAvatarId(avId, "discardItemResponse",
                                  [context, retcode])
Ejemplo n.º 18
0
    def requestPurchaseMessage(self, context, blob, optional):
        # Sent from the client code to request a particular purchase item.
        avId = self.air.getAvatarIdFromSender()
        item = CatalogItem.getItem(blob, store = CatalogItem.Customization)
        if self.busy != avId:
            self.air.writeServerEvent('suspicious', avId, 'DistributedPhoneAI.requestPurchaseMessage busy with %s' % (self.busy))
            self.notify.warning("Got unexpected purchase request from %s while busy with %s." % (avId, self.busy))
            retcode = ToontownGlobals.P_NotShopping
        else:
            # The user is requesting purchase of one particular item.
            retcode = self.air.catalogManager.purchaseItem(self.av, item, optional)

        self.sendUpdateToAvatarId(avId, "requestPurchaseResponse", [context, retcode])
Ejemplo n.º 19
0
    def requestPurchaseMessage(self, context, item, optional):
        avId = self.air.getAvatarIdFromSender()
        if avId != self.avId:
            self.air.writeServerEvent("suspicious", avId=avId, issue="Tried to purchase while not using the phone!")
            return
        av = self.air.doId2do.get(avId)

        if not av:
            self.air.writeServerEvent("suspicious", avId=avId, issue="Used phone from other shard!")
            return

        item = CatalogItem.getItem(item)
        if isinstance(item, CatalogInvalidItem):  # u wot m8
            self.air.writeServerEvent("suspicious", avId=avId, issue="Tried to purchase invalid catalog item.")
            return
        if item.loyaltyRequirement():  # These items aren't purchasable! Hacker alert!
            self.air.writeServerEvent("suspicious", avId=avId, issue="Tried to purchase an unimplemented loyalty item!")
            return
        if item in av.backCatalog:
            price = item.getPrice(CatalogItem.CatalogTypeBackorder)
        elif item in av.weeklyCatalog or item in av.monthlyCatalog:
            price = item.getPrice(0)
        else:
            return

        if item.getDeliveryTime():
            if len(av.onOrder) > 3:  # TODO correct number
                self.sendUpdateToAvatarId(avId, "requestPurchaseResponse", [context, ToontownGlobals.P_OnOrderListFull])
                return
            if len(av.mailboxContents) + len(av.onOrder) >= ToontownGlobals.MaxMailboxContents:
                self.sendUpdateToAvatarId(avId, "requestPurchaseResponse", [context, ToontownGlobals.P_MailboxFull])
            if not av.takeMoney(price):
                return
            item.deliveryDate = int(time.time() / 60) + item.getDeliveryTime()
            av.onOrder.append(item)
            av.b_setDeliverySchedule(av.onOrder)
            self.sendUpdateToAvatarId(avId, "requestPurchaseResponse", [context, ToontownGlobals.P_ItemOnOrder])
        else:
            if not av.takeMoney(price):
                # u wot m8
                return

            resp = item.recordPurchase(av, optional)
            if resp < 0:  # refund if purchase unsuccessful
                av.addMoney(price)

            self.sendUpdateToAvatarId(avId, "requestPurchaseResponse", [context, resp])
Ejemplo n.º 20
0
 def requestPrize(self, context, item, optional):
     avId = self.air.getAvatarIdFromSender()
     av = self.air.doId2do.get(avId)
     if not av:
         self.air.writeServerEvent('suspicious', avId=avId, issue='Used phone from other shard!')
         return
     item = CatalogItem.getItem(item)
     if isinstance(item, CatalogInvalidItem):
         self.air.writeServerEvent('suspicious', avId=avId, issue='Tried to purchase invalid catalog item.')
         return
     price = item.getPrice(0)
     if item.getDeliveryTime():
         if len(av.onOrder) > 3:
             self.sendUpdateToAvatarId(avId, 'd_requestPrizeInfo', [context, ToontownGlobals.P_OnOrderListFull])
             self.sendUpdate('setMovie', [NPCToons.PURCHASE_MOVIE_DELIVERY_FULL,
              self.npcId,
              avId,
              ClockDelta.globalClockDelta.getRealNetworkTime()])
             return
         if len(av.mailboxContents) + len(av.onOrder) >= ToontownGlobals.MaxMailboxContents:
             self.sendUpdateToAvatarId(avId, 'd_requestPrizeInfo', [context, ToontownGlobals.P_MailboxFull])
             self.sendUpdate('setMovie', [NPCToons.PURCHASE_MOVIE_MAIL_FULL,
              self.npcId,
              avId,
              ClockDelta.globalClockDelta.getRealNetworkTime()])
         if not av.takeTokens(price):
             return
         if av.instantDelivery:
             item.deliveryDate = int(time.time() / 60)
         else:
             item.deliveryDate = int(time.time() / 60) + item.getDeliveryTime()
         av.onOrder.append(item)
         av.b_setDeliverySchedule(av.onOrder)
         self.sendUpdateToAvatarId(avId, 'd_requestPrizeInfo', [context, ToontownGlobals.P_ItemOnOrder])
         self.sendUpdate('setMovie', [NPCToons.PURCHASE_MOVIE_ITEM_BOUGHT,
          self.npcId,
          avId,
          ClockDelta.globalClockDelta.getRealNetworkTime()])
     else:
         if not av.takeTokens(price):
             return
         resp = item.recordPurchase(av, optional)
         if resp < 0:
             av.addTokens(price)
         self.sendUpdateToAvatarId(avId, 'd_requestPrizeInfo', [context, resp])
Ejemplo n.º 21
0
    def finish(self):
        #print("AddItem FINISH")
        rAv = self.neededObjects[self.receiverId]
        self.item = CatalogItem.getItem(self.itemBlob, store = CatalogItem.Customization)

        now = (int)(time.time() / 60 + 0.5)
        deliveryTime = self.item.getDeliveryTime() / self.distObj.timeScale
        #if deliveryTime < 2:
        #    deliveryTime = 2
        deliveryTime = 2
        self.item.deliveryDate = int(now + deliveryTime)
        itemList = CatalogItemList.CatalogItemList([self.item])
        itemBlob = itemList.getBlob(store = CatalogItem.Customization | CatalogItem.DeliveryDate)
        retcode = ToontownGlobals.P_ItemOnOrder
        self.distObj.addGift(self.receiverId, itemBlob, self.replyToChannelId)
        #-----------------------------------------------------------------------------

        AsyncRequest.finish(self)
 def discardItemMessage(self, context, blob, optional):
     avId = self.air.getAvatarIdFromSender()
         
     if avId != self.curAv:
         return
         
     av = self.air.doId2do.get(avId)
     if not av:
         return
         
     retcode = 1
     item = CatalogItem.getItem(blob, CatalogItem.Customization)
     if not item in av.mailboxContents:
         retcode = ToontownGlobals.P_NotAtMailbox
         
     av.mailboxContents.remove(item)
     av.d_setMailboxContents(av.mailboxContents)
     
     self.sendUpdateToAvatarId(avId, 'discardItemResponse', [context, retcode])
Ejemplo n.º 23
0
    def attemptPurchase(self, context, av, blob, optional, gifting=False):
        avId = av.doId
        item = CatalogItem.getItem(blob, CatalogItem.Customization)
        
        if isinstance(item, CatalogInvalidItem.CatalogInvalidItem):
            self.air.writeServerEvent('suspicious', avId, 'tried purchasing invalid item')
            self.notify.warning('%d tried purchasing invalid item' % avId)
            return ToontownGlobals.P_NotInCatalog
        elif (not item.hasEmblemPrices()) and item not in av.backCatalog and item not in av.weeklyCatalog and item not in av.monthlyCatalog:
            self.air.writeServerEvent('suspicious', avId, 'tried purchasing non-existing item')
            self.notify.warning('%d tried purchasing non-existing item' % avId)
            return ToontownGlobals.P_NotInCatalog
        
        if gifting and not item.isGift():
            return ToontownGlobals.P_NotAGift

        price = item.getPrice(CatalogItem.CatalogTypeBackorder if item in av.backCatalog else 0)
        
        if price > av.getTotalMoney() or (item.hasEmblemPrices() and not av.isEnoughEmblemsToBuy(item.getEmblemPrices())):
            return ToontownGlobals.P_NotEnoughMoney
        
        if gifting:
            return self.requestGiftAvatarOperation(avId, gifting, [context, item, price], self.attemptGiftPurchase)
        else:
            returnCode = self.checkPurchaseLimit(av, item)
            
            if returnCode != ToontownGlobals.P_ItemOnOrder:
                return returnCode

            if item.getDeliveryTime():
                self.chargeAvatar(av, price, item.getEmblemPrices())
                av.addToDeliverySchedule(item, item.getDeliveryTime())
                av.addStat(ToontownGlobals.STAT_ITEMS)
            else:
                returnCode = item.recordPurchase(av, optional)
                
                if returnCode == ToontownGlobals.P_ItemAvailable:
                    self.chargeAvatar(av, price, item.getEmblemPrices())
                    av.addStat(ToontownGlobals.STAT_ITEMS)

            return returnCode

        return None
Ejemplo n.º 24
0
    def discardItemMessage(self, context, blob, optional):
        avId = self.air.getAvatarIdFromSender()

        if avId != self.curAv:
            return

        av = self.air.doId2do.get(avId)
        if not av:
            return

        retcode = 1
        item = CatalogItem.getItem(blob, CatalogItem.Customization)
        if not item in av.mailboxContents:
            retcode = ToontownGlobals.P_NotAtMailbox

        av.mailboxContents.remove(item)
        av.d_setMailboxContents(av.mailboxContents)

        self.sendUpdateToAvatarId(avId, 'discardItemResponse',
                                  [context, retcode])
    def requestPurchaseMessage(self, context, item, optional):

        #print (context, item, optional) # NJF

        avId = self.air.getAvatarIdFromSender()
        if avId != self.avId:
            self.air.writeServerEvent('suspicious', avId, 'Tried to purchase while not using the phone!')
            return

        av = self.air.doId2do.get(avId)
        if not av:
            self.air.writeServerEvent('suspicious', avId, 'Used phone from other shard!')
            return

        item = CatalogItem.getItem(item)


        # None of this should be neccessary, but it works as a temporary thing. NEEDS WORK !!!
        # PY3
        weeklyCatalog = []
        monthlyCatalog = []
        backCatalog = []

        strItem = str(item)

        for wC in av.weeklyCatalog:
            weeklyCatalog.append(str(wC))

        for mC in av.monthlyCatalog:
            monthlyCatalog.append(str(mC))

        for bC in av.backCatalog:
            backCatalog.append(str(bC))


        if isinstance(item, CatalogInvalidItem):
            self.air.writeServerEvent('suspicious', avId, 'Tried to purchase invalid catalog item.')
            return
        if item.loyaltyRequirement():
            self.air.writeServerEvent('suspicious', avId, 'Tried to purchase an unimplemented loyalty item!')
            return
        if strItem in backCatalog: # PY3
            price = item.getPrice(CatalogItem.CatalogTypeBackorder)
        elif strItem in weeklyCatalog or strItem in monthlyCatalog: # PY3
            price = item.getPrice(0)
        else:
            return

        if item.getDeliveryTime():
            if len(av.onOrder) > 30: # NJF
                self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_OnOrderListFull])
                return

            if len(av.mailboxContents) + len(av.onOrder) >= ToontownGlobals.MaxMailboxContents:
                self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_MailboxFull])

            if not av.takeMoney(price):
                return

            item.deliveryDate = int(time.time() // 60) + item.getDeliveryTime()
            av.onOrder.append(item)
            av.b_setDeliverySchedule(av.onOrder)
            self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_ItemOnOrder])
            taskMgr.doMethodLater(0.2, self.sendUpdateToAvatarId, 'purchaseItemComplete-%d' % self.getDoId(), extraArgs=[avId, 'purchaseItemComplete', []])
        else:
            if not av.takeMoney(price):
                return

            resp = item.recordPurchase(av, optional)
            if resp < 0:
                    av.addMoney(price)

            self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, resp])
            taskMgr.doMethodLater(0.2, self.sendUpdateToAvatarId, 'purchaseItemComplete-%d' % self.getDoId(), extraArgs=[avId, 'purchaseItemComplete', []])
Ejemplo n.º 26
0
    def requestGiftPurchaseMessage(self, context, targetId, blob, optional):
        avId = self.air.getAvatarIdFromSender()
        accId = self.air.getAccountIdFromSender()
        av = self.air.doId2do.get(avId)
        if not av:
            self.air.writeServerEvent(
                'suspicious', avId,
                'av tried to gift something but they are not on the district!')
            return
        if avId != self.avId:
            self.air.writeServerEvent(
                'suspicious', avId, 'av tried to gift item while not at phone')
            self.sendUpdateToAvatarId(avId, 'requestGiftPurchaseResponse',
                                      [context, ToontownGlobals.P_NotShopping])
            return
        item = CatalogItem.getItem(blob, store=CatalogItem.Customization)
        if isinstance(item, CatalogInvalidItem):
            self.air.writeServerEvent(
                'suspicious', avId,
                'av tried to gift something but item is invalid!')
            self.sendUpdateToAvatarId(
                avId, 'requestGiftPurchaseResponse',
                [context, ToontownGlobals.P_ItemAvailable])
            return
        if not any(item in catalog
                   for catalog in (av.weeklyCatalog, av.backCatalog,
                                   av.monthlyCatalog)):
            self.air.writeServerEvent('suspicious', avId,
                                      'av tried to gift item not in catalog')
            self.sendUpdateToAvatarId(
                avId, 'requestGiftPurchaseResponse',
                [context, ToontownGlobals.P_NotInCatalog])
            return

        def handleAccount(dclass, fields):
            if dclass != self.air.dclassesByName['AccountAI']:
                return
            creationDate = fields['CREATED']
            try:
                creationDate = datetime.fromtimestamp(
                    time.mktime(time.strptime(creationDate)))
            except ValueError:
                creationDate = ''

            accountDays = -1
            if creationDate:
                now = datetime.fromtimestamp(
                    time.mktime(time.strptime(time.ctime())))
                accountDays = abs((now - creationDate).days)
            if accountDays < 0 or accountDays > 4294967295L:
                accountDays = 100000
            daysToGo = item.loyaltyRequirement() - accountDays
            if daysToGo < 0:
                daysToGo = 0
            if daysToGo and config.GetBool('want-loyalty-requirement', False):
                self.air.writeServerEvent(
                    'suspicious', avId,
                    'av tried to gift a loyalty item before it is available!')
                return
            if not item.isGift():
                self.air.writeServerEvent(
                    'suspicious', avId,
                    "av tried to gift an item that isn't a gift!")
                self.sendUpdateToAvatarId(
                    avId, 'requestGiftPurchaseResponse',
                    [context, ToontownGlobals.P_NotAGift])
                return
            if item in av.backCatalog:
                price = item.getPrice(CatalogItem.CatalogTypeBackorder)
            else:
                price = item.getPrice(0)
            if price > av.getTotalMoney():
                self.air.writeServerEvent(
                    'suspicious', avId,
                    'Failed to take away the jellybeans from the avatar')
                self.sendUpdateToAvatarId(
                    avId, 'requestGiftPurchaseResponse',
                    [context, ToontownGlobals.P_NotEnoughMoney])
                return
            self.requestGiftAvatarOperation(avId, targetId,
                                            [context, item, price],
                                            self.attemptGiftPurchase)

        self.air.dbInterface.queryObject(self.air.dbId, accId, handleAccount)
Ejemplo n.º 27
0
 def requestPurchaseMessage(self, context, blob, optional, payMethod):        
     avId = self.air.getAvatarIdFromSender()
     if avId != self.currAvId:
         self.air.writeServerEvent('suspicious', avId, 'tried purchasing item, but not using phone')
         self.notify.warning('%d tried purchasing item, but not using phone' % avId)
         return
         
     av = self.air.doId2do.get(avId)
     if not av:
         self.air.writeServerEvent('suspicious', avId, 'tried purchasing item, but not on shard')
         self.notify.warning('%d tried purchasing item, but not on shard' % avId)
         return
         
     item = CatalogItem.getItem(blob, CatalogItem.Customization)
     if isinstance(item, CatalogInvalidItem.CatalogInvalidItem):
         self.air.writeServerEvent('suspicious', avId, 'tried purchasing invalid item')
         self.notify.warning('%d tried purchasing invalid item' % avId)
         self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_NotInCatalog])
         return
         
     if item in av.backCatalog:
         priceType = CatalogItem.CatalogTypeBackorder
         
     elif item in av.weeklyCatalog or item in av.monthlyCatalog:
         priceType = 0
         
     else:
         self.air.writeServerEvent('suspicious', avId, 'tried purchasing non-existing item')
         self.notify.warning('%d tried purchasing non-existing item' % avId)
         self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_NotInCatalog])
         return
                     
     def _getEmblemPrices():
         if config.GetBool('catalog-emblems-OR', False):
             ep = list(item.getEmblemPrices())
             if len(ep) != 2:
                 return []
             
             if all(ep):
                 ep[payMethod] = 0
                 
         else:
             ep = item.getEmblemPrices()
             
         return ep
         
     def charge():
         ep = _getEmblemPrices()
         if ep:
             av.subtractEmblems(ep)
             
         av.takeMoney(item.getPrice(priceType))
         
     if item in av.onOrder:
         retcode = ToontownGlobals.P_ReachedPurchaseLimit
         
     elif len(av.onOrder) >= MAX_ON_ORDER:
         retcode = ToontownGlobals.P_ReachedPurchaseLimit
         
     elif item.reachedPurchaseLimit(av):
         retcode = ToontownGlobals.P_ReachedPurchaseLimit
         
     elif len(av.mailboxContents) >= MAX_MAILBOX:
         retcode = ToontownGlobals.P_MailboxFull
         
     elif item.getPrice(0) >= av.getTotalMoney():
         retcode = ToontownGlobals.P_NotEnoughMoney
         
     elif not av.isEnoughEmblemsToBuy(_getEmblemPrices()):
         retcode = ToontownGlobals.P_NotEnoughMoney
         
     elif isItemForbidden(item):
         retcode = ToontownGlobals.P_ReachedPurchaseLimit
         
     elif item.__class__.__name__ in ("CatalogChatItem", "CatalogHouseItem") or not item.getDeliveryTime():
         # no mailbox, deliver it already
         retcode = item.recordPurchase(av, optional)
         if retcode == ToontownGlobals.P_ItemAvailable:
             charge()
         
     else:
         retcode = ToontownGlobals.P_ItemOnOrder
         charge()
     
         deliveryTime = item.getDeliveryTime()
         if config.GetBool('want-instant-delivery', False):
             deliveryTime = 0
             
         item.deliveryDate = int(time.time() / 60. + deliveryTime + .5)
         av.onOrder.append(item)
         av.b_setDeliverySchedule(av.onOrder)
     
     self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, retcode])
Ejemplo n.º 28
0
    def requestPurchaseMessage(self, context, blob, optional, payMethod):
        avId = self.air.getAvatarIdFromSender()
        if avId != self.currAvId:
            self.air.writeServerEvent(
                'suspicious', avId,
                'tried purchasing item, but not using phone')
            self.notify.warning(
                '%d tried purchasing item, but not using phone' % avId)
            return

        av = self.air.doId2do.get(avId)
        if not av:
            self.air.writeServerEvent(
                'suspicious', avId, 'tried purchasing item, but not on shard')
            self.notify.warning('%d tried purchasing item, but not on shard' %
                                avId)
            return

        item = CatalogItem.getItem(blob, CatalogItem.Customization)
        if isinstance(item, CatalogInvalidItem.CatalogInvalidItem):
            self.air.writeServerEvent('suspicious', avId,
                                      'tried purchasing invalid item')
            self.notify.warning('%d tried purchasing invalid item' % avId)
            self.sendUpdateToAvatarId(
                avId, 'requestPurchaseResponse',
                [context, ToontownGlobals.P_NotInCatalog])
            return

        if item in av.backCatalog:
            priceType = CatalogItem.CatalogTypeBackorder

        elif item in av.weeklyCatalog or item in av.monthlyCatalog:
            priceType = 0

        else:
            self.air.writeServerEvent('suspicious', avId,
                                      'tried purchasing non-existing item')
            self.notify.warning('%d tried purchasing non-existing item' % avId)
            self.sendUpdateToAvatarId(
                avId, 'requestPurchaseResponse',
                [context, ToontownGlobals.P_NotInCatalog])
            return

        def _getEmblemPrices():
            if config.GetBool('catalog-emblems-OR', False):
                ep = list(item.getEmblemPrices())
                if len(ep) != 2:
                    return []

                if all(ep):
                    ep[payMethod] = 0

            else:
                ep = item.getEmblemPrices()

            return ep

        def charge():
            ep = _getEmblemPrices()
            if ep:
                av.subtractEmblems(ep)

            av.takeMoney(item.getPrice(priceType))

        if item in av.onOrder:
            retcode = ToontownGlobals.P_ReachedPurchaseLimit

        elif len(av.onOrder) >= MAX_ON_ORDER:
            retcode = ToontownGlobals.P_ReachedPurchaseLimit

        elif item.reachedPurchaseLimit(av):
            retcode = ToontownGlobals.P_ReachedPurchaseLimit

        elif len(av.mailboxContents) >= MAX_MAILBOX:
            retcode = ToontownGlobals.P_MailboxFull

        elif item.getPrice(0) >= av.getTotalMoney():
            retcode = ToontownGlobals.P_NotEnoughMoney

        elif not av.isEnoughEmblemsToBuy(_getEmblemPrices()):
            retcode = ToontownGlobals.P_NotEnoughMoney

        elif isItemForbidden(item):
            retcode = ToontownGlobals.P_ReachedPurchaseLimit

        elif item.__class__.__name__ in ("CatalogChatItem", "CatalogHouseItem"
                                         ) or not item.getDeliveryTime():
            # no mailbox, deliver it already
            retcode = item.recordPurchase(av, optional)
            if retcode == ToontownGlobals.P_ItemAvailable:
                charge()

        else:
            retcode = ToontownGlobals.P_ItemOnOrder
            charge()

            deliveryTime = item.getDeliveryTime()
            if config.GetBool('want-instant-delivery', False):
                deliveryTime = 0

            item.deliveryDate = int(time.time() / 60. + deliveryTime + .5)
            av.onOrder.append(item)
            av.b_setDeliverySchedule(av.onOrder)

        self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse',
                                  [context, retcode])
Ejemplo n.º 29
0
    def __deletedItemsTask(self, task):
        changesMade = False
        dayId = getDayId()
        for deletedItemDay, deletedItemBlobs in self.day2deletedItems.items():
            if not deletedItemBlobs or type(deletedItemBlobs) != list:
                del self.day2deletedItems[deletedItemDay]
                changesMade = True
                continue
            try:
                deletedItemDayId = int(deletedItemDay)
            except:
                del self.day2deletedItems[deletedItemDay]
                changesMade = True
                continue

            if deletedItemDayId + int(
                    ToontownGlobals.DeletedItemLifetime / 60 / 24) <= dayId:
                for deletedItemBlob in deletedItemBlobs[:]:
                    try:
                        deletedItem = CatalogItem.getItem(
                            deletedItemBlob.decode('base64'))
                    except:
                        self.day2deletedItems[deletedItemDay].remove(
                            deletedItemBlob)
                        if not self.day2deletedItems[deletedItemDay]:
                            del self.day2deletedItems[deletedItemDay]
                        changesMade = True
                        continue

                    if isinstance(deletedItem,
                                  CatalogInvalidItem.CatalogInvalidItem):
                        self.day2deletedItems[deletedItemDay].remove(
                            deletedItemBlob)
                        if not self.day2deletedItems[deletedItemDay]:
                            del self.day2deletedItems[deletedItemDay]
                        changesMade = True
                        continue
                    if deletedItem not in self.deletedItems:
                        self.day2deletedItems[deletedItemDay].remove(
                            deletedItemBlob)
                        if not self.day2deletedItems[deletedItemDay]:
                            del self.day2deletedItems[deletedItemDay]
                        changesMade = True
                        continue
                    index = self.deletedItems.index(deletedItem)
                    del self.deletedItems[index]
                    self.b_setDeletedItems(self.getDeletedItems())
                    self.day2deletedItems[deletedItemDay].remove(
                        deletedItemBlob)
                    if not self.day2deletedItems[deletedItemDay]:
                        del self.day2deletedItems[deletedItemDay]
                    changesMade = True

        if changesMade:
            self.updateDeletedItemsFile()
        tomorrow = self.air.toontownTimeManager.getCurServerDateTime().now(
            tz=self.air.toontownTimeManager.serverTimeZone
        ) + datetime.timedelta(1)
        midnight = datetime.datetime(
            year=tomorrow.year,
            month=tomorrow.month,
            day=tomorrow.day,
            hour=0,
            minute=0,
            second=0,
            tzinfo=self.air.toontownTimeManager.serverTimeZone)
        secondsUntilMidnight = (
            midnight - self.air.toontownTimeManager.getCurServerDateTime().now(
                tz=self.air.toontownTimeManager.serverTimeZone)).seconds
        task.delayTime = secondsUntilMidnight
        return task.again
Ejemplo n.º 30
0
    def requestPurchaseMessage(self, context, blob, optional):
        avId = self.air.getAvatarIdFromSender()
        accId = self.air.getAccountIdFromSender()
        av = self.air.doId2do.get(avId)
        if not av:
            self.air.writeServerEvent(
                'suspicious', avId,
                'av tried to purchase something but they are not on the district!'
            )
            return
        if avId != self.avId:
            self.air.writeServerEvent(
                'suspicious', avId,
                'av tried to purchase item while not at phone')
            self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse',
                                      [context, ToontownGlobals.P_NotShopping])
            return
        item = CatalogItem.getItem(blob, store=CatalogItem.Customization)
        if isinstance(item, CatalogInvalidItem):
            self.air.writeServerEvent(
                'suspicious', avId,
                'av tried to purchase something but item is invalid!')
            self.sendUpdateToAvatarId(
                avId, 'requestPurchaseResponse',
                [context, ToontownGlobals.P_ItemAvailable])
            return
        if not any(item in catalog
                   for catalog in (av.weeklyCatalog, av.backCatalog,
                                   av.monthlyCatalog)):
            self.air.writeServerEvent(
                'suspicious', avId, 'av tried to purchase item not in catalog')
            self.sendUpdateToAvatarId(
                avId, 'requestPurchaseResponse',
                [context, ToontownGlobals.P_NotInCatalog])
            return

        def handleAccount(dclass, fields):
            if dclass != self.air.dclassesByName['AccountAI']:
                return
            creationDate = fields['CREATED']
            try:
                creationDate = datetime.fromtimestamp(
                    time.mktime(time.strptime(creationDate)))
            except ValueError:
                creationDate = ''

            accountDays = -1
            if creationDate:
                now = datetime.fromtimestamp(
                    time.mktime(time.strptime(time.ctime())))
                accountDays = abs((now - creationDate).days)
            if accountDays < 0 or accountDays > 4294967295L:
                accountDays = 100000
            daysToGo = item.loyaltyRequirement() - accountDays
            if daysToGo < 0:
                daysToGo = 0
            if daysToGo and config.GetBool('want-loyalty-requirement', False):
                self.air.writeServerEvent(
                    'suspicious', avId,
                    'av tried to purchase a loyalty item before it is available!'
                )
                return
            if item in av.backCatalog:
                price = item.getPrice(CatalogItem.CatalogTypeBackorder)
            else:
                price = item.getPrice(0)
            if price == 0:
                self.air.writeServerEvent(
                    'suspicious', avId,
                    'av tried to purchase something but the price is invalid!')
                return
            if price > av.getTotalMoney():
                self.air.writeServerEvent(
                    'suspicious', avId,
                    'Failed to take away the jellybeans from the avatar')
                self.sendUpdateToAvatarId(
                    avId, 'requestPurchaseResponse',
                    [context, ToontownGlobals.P_NotEnoughMoney])
                return
            if len(av.mailboxContents) >= ToontownGlobals.MaxMailboxContents:
                self.sendUpdateToAvatarId(
                    avId, 'requestPurchaseResponse',
                    [context, ToontownGlobals.P_MailboxFull])
                return
            if len(av.onOrder) + len(av.mailboxContents) + len(
                    av.onGiftOrder) + 1 >= ToontownGlobals.MaxMailboxContents:
                self.sendUpdateToAvatarId(
                    avId, 'requestPurchaseResponse',
                    [context, ToontownGlobals.P_OnOrderListFull])
                return
            retCode = ToontownGlobals.P_ItemOnOrder
            if not item.getDeliveryTime():
                retCode = item.recordPurchase(av, optional)
                deliveryTime = 0
            elif av.instantDelivery:
                deliveryTime = int(time.time() / 60)
            else:
                deliveryTime = int(time.time() / 60) + item.getDeliveryTime()
            if deliveryTime:
                item.deliveryDate = deliveryTime
                av.onOrder.append(item)
                av.b_setDeliverySchedule(av.onOrder)
            self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse',
                                      [context, retCode])
            if retCode in (ToontownGlobals.P_ItemOnOrder,
                           ToontownGlobals.P_ItemAvailable):
                av.takeMoney(price)

        self.air.dbInterface.queryObject(self.air.dbId, accId, handleAccount)
    def requestPurchaseMessage(self, context, item, optional):
        avId = self.air.getAvatarIdFromSender()
        if avId != self.avId:
            self.air.writeServerEvent('suspicious', avId, 'Tried to purchase while not using the phone!')
            return

        av = self.air.doId2do.get(avId)
        if not av:
            self.air.writeServerEvent('suspicious', avId, 'Used phone from other shard!')
            return

        item = CatalogItem.getItem(item)
        if isinstance(item, CatalogInvalidItem):
            self.air.writeServerEvent('suspicious', avId, 'Tried to purchase invalid catalog item.')
            return
        if item in av.backCatalog:
            price = item.getPrice(CatalogItem.CatalogTypeBackorder)
        elif item in av.weeklyCatalog or item in av.monthlyCatalog:
            price = item.getPrice(0)
        else:
            return

        def _getEmblemPrices():
            if config.GetBool('catalog-emblems-OR', False):
                ep = list(item.getEmblemPrices())
                if len(ep) != 2:
                    return []
                if all(ep):
                    ep[payMethod] = 0
            else:
                ep = item.getEmblemPrices()
            return ep

        def charge():
            ep = _getEmblemPrices()
            if ep:
                av.subtractEmblems(ep)
            av.takeMoney(item.getPrice(priceType))

        if item.getDeliveryTime():
            if len(av.onOrder) > 25:
                self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_OnOrderListFull])
                return

            if len(av.mailboxContents) + len(av.onOrder) >= ToontownGlobals.MaxMailboxContents:
                self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_MailboxFull])

            if not av.takeMoney(price):
                return

            item.deliveryDate = int(time.time()/60) + item.getDeliveryTime()
            av.onOrder.append(item)
            av.b_setDeliverySchedule(av.onOrder)
            self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, ToontownGlobals.P_ItemOnOrder])
            taskMgr.doMethodLater(0.2, self.sendUpdateToAvatarId, 'purchaseItemComplete-%d' % self.getDoId(), extraArgs=[avId, 'purchaseItemComplete', []])
        else:
            if not av.takeMoney(price):
                return

            resp = item.recordPurchase(av, optional)
            if resp < 0:
                    av.addMoney(price)

            self.sendUpdateToAvatarId(avId, 'requestPurchaseResponse', [context, resp])
            taskMgr.doMethodLater(0.2, self.sendUpdateToAvatarId, 'purchaseItemComplete-%d' % self.getDoId(), extraArgs=[avId, 'purchaseItemComplete', []])