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)
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', []])
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)
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])
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])
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])
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])
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])
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', []])
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', []])
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)
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])
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])
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])
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])
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])
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])
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
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', []])
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)
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])
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])
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
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', []])