118 lines
4.6 KiB
Python
118 lines
4.6 KiB
Python
from direct.directnotify import DirectNotifyGlobal
|
|
from direct.distributed.DistributedObjectAI import DistributedObjectAI
|
|
from toontown.catalog import CatalogAccessoryItem
|
|
from toontown.catalog import CatalogClothingItem
|
|
from toontown.catalog import CatalogNametagItem
|
|
from toontown.catalog import CatalogChatItem
|
|
from toontown.catalog import CatalogEmoteItem
|
|
from toontown.catalog import CatalogGardenItem
|
|
from toontown.catalog import CatalogGardenStarterItem
|
|
from toontown.catalog import CatalogMouldingItem
|
|
from toontown.catalog import CatalogRentalItem
|
|
from toontown.catalog import CatalogFurnitureItem
|
|
from toontown.catalog import CatalogAnimatedFurnitureItem
|
|
from toontown.catalog import CatalogFlooringItem
|
|
from toontown.catalog import CatalogPetTrickItem
|
|
from toontown.catalog import CatalogWainscotingItem
|
|
from toontown.catalog import CatalogToonStatueItem
|
|
from toontown.catalog import CatalogWallpaperItem
|
|
from toontown.catalog import CatalogWindowItem
|
|
from toontown.toonbase import ToontownGlobals
|
|
from datetime import datetime, timedelta
|
|
import time
|
|
|
|
"""
|
|
Code example:
|
|
|
|
'codeName': {
|
|
'items': [
|
|
CatalogTypeItem.CatalogTypeItem(arguments)
|
|
],
|
|
'expirationDate': datetime(2020, 1, 30),
|
|
'month': 1,
|
|
'day': 30,
|
|
'year': 2000'
|
|
}
|
|
|
|
Expiration date, month, day and year are optional fields.
|
|
|
|
If you for some reason are not familiar with arrays or lists, you
|
|
only include the comma if there are multiple arguments.
|
|
"""
|
|
|
|
class TTCodeRedemptionMgrAI(DistributedObjectAI):
|
|
notify = DirectNotifyGlobal.directNotify.newCategory("TTCodeRedemptionMgrAI")
|
|
codes = {
|
|
'gardening': {
|
|
'items': [
|
|
CatalogGardenStarterItem.CatalogGardenStarterItem()
|
|
]
|
|
},
|
|
'sillymeter': {
|
|
'items': [
|
|
CatalogClothingItem.CatalogClothingItem(1753, 0)
|
|
]
|
|
},
|
|
'toonstatue': {
|
|
'items': [
|
|
CatalogToonStatueItem.CatalogToonStatueItem(105, endPoseIndex=108)
|
|
]
|
|
},
|
|
'donaldstatue': {
|
|
'items': [
|
|
CatalogGardenItem.CatalogGardenItem(100, 1)
|
|
]
|
|
}
|
|
}
|
|
|
|
def announceGenerate(self):
|
|
DistributedObjectAI.announceGenerate(self)
|
|
|
|
def redeemCode(self, code):
|
|
avId = self.air.getAvatarIdFromSender()
|
|
av = self.air.doId2do.get(avId)
|
|
|
|
if not av:
|
|
return
|
|
|
|
code = code.lower()
|
|
|
|
if code in self.codes:
|
|
if av.isCodeRedeemed(code):
|
|
self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [4])
|
|
self.air.writeServerEvent('suspicious', avId, 'Toon tried to redeem already redeemed code %s' % code)
|
|
return
|
|
|
|
codeInfo = self.codes[code]
|
|
date = datetime.now()
|
|
|
|
if ('year' in codeInfo and date.year is not codeInfo['year']) and date.year > codeInfo['year'] or ('expirationDate' in codeInfo and codeInfo['expirationDate'] - date < timedelta(hours = 1)):
|
|
self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [2])
|
|
self.air.writeServerEvent('suspicious', avId, 'Toon attempted to redeem code %s but it was expired!' % code)
|
|
return
|
|
elif ('year' in codeInfo and date.year is not codeInfo['year']) and date.year < codeInfo['year'] or ('month' in codeInfo and date.month is not codeInfo['month']) or ('day' in codeInfo and date.day is not codeInfo['day']):
|
|
self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [5])
|
|
self.air.writeServerEvent('suspicious', avId, "Toon attempted to redeem code %s but it wasn't usable yet!" % code)
|
|
return
|
|
|
|
av.redeemCode(code)
|
|
self.requestCodeRedeem(avId, av, codeInfo['items'])
|
|
self.air.writeServerEvent('code-redeemed', avId, 'Toon successfully redeemed %s' % code)
|
|
else:
|
|
self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [1])
|
|
self.air.writeServerEvent('suspicious', avId, 'Toon tried to redeem non-existent code %s' % code)
|
|
|
|
def requestCodeRedeem(self, avId, av, items):
|
|
if len(av.mailboxContents) + len(av.onOrder) + len(av.onGiftOrder) + len(items) >= ToontownGlobals.MaxMailboxContents:
|
|
self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [3])
|
|
return
|
|
|
|
for item in items:
|
|
if item in av.onOrder:
|
|
continue
|
|
|
|
av.addToDeliverySchedule(item)
|
|
|
|
av.b_setDeliverySchedule(av.onOrder)
|
|
self.sendUpdateToAvatarId(avId, 'redeemCodeResult', [0])
|
|
self.air.writeServerEvent('code-redeemed', avId, 'Toon is being sent %s from redeemed code' % items)
|