Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release/0.11.0 #243

Merged
merged 11 commits into from
Feb 28, 2024
109 changes: 55 additions & 54 deletions iap/api/purchase.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,44 @@ def log_request_product(planet_id: str, agent_address: str, avatar_address: str,
return JSONResponse(status_code=200, content=f"Order {order_id} for product {product_id} logged.")


def check_required_level(sess, receipt: Receipt, product: Product) -> Receipt:
if product.required_level:
gql_url = None
if receipt.planet_id in (PlanetID.ODIN, PlanetID.ODIN_INTERNAL):
gql_url = os.environ.get("ODIN_GQL_URL")
elif receipt.planet_id in (PlanetID.HEIMDALL, PlanetID.HEIMDALL_INTERNAL):
gql_url = os.environ.get("HEIMDALL_GQL_URL")

query = f"""{{ stateQuery {{ avatar (avatarAddress: "{receipt.avatar_addr}") {{ level}} }} }}"""
try:
resp = requests.post(gql_url, json={"query": query}, timeout=1)
avatar_level = resp.json()["data"]["stateQuery"]["avatar"]["level"]
except:
# Whether request is failed or no fitted data found
avatar_level = 0

if avatar_level < product.required_level:
receipt.status = ReceiptStatus.REQUIRED_LEVEL
raise_error(sess, receipt,
ValueError(f"Avatar level {avatar_level} does not met required level {product.required_level}"))
return receipt


def check_purchase_limit(sess, receipt: Receipt, product: Product, limit_type: str, limit: int,
use_avatar: bool = False) -> Receipt:
purchase_count = get_purchase_count(
sess, product.id, planet_id=PlanetID(receipt.planet_id),
agent_addr=receipt.agent_addr if not use_avatar else None,
avatar_addr=receipt.avatar_addr if use_avatar else None,
daily_limit=limit_type == "daily", weekly_limit=limit_type == "weekly"
)
if purchase_count > limit:
receipt.status = ReceiptStatus.PURCHASE_LIMIT_EXCEED
raise_error(sess, receipt, ValueError(f"{limit_type.capitalize()} purchase limit exceeded."))

return receipt


@router.post("/request", response_model=ReceiptDetailSchema)
def request_product(receipt_data: ReceiptSchema, sess=Depends(session)):
"""
Expand Down Expand Up @@ -231,15 +269,14 @@ def request_product(receipt_data: ReceiptSchema, sess=Depends(session)):
receipt.status = ReceiptStatus.TIME_LIMIT
raise_error(sess, receipt, ValueError(f"Not in product opening time"))

receipt = check_required_level(sess, receipt, product)

# Check purchase limit
# FIXME: Can we get season pass product without magic string?
if "SeasonPass" in product.name:
# NOTE: Check purchase limit using avatar_addr, not agent_addr
if (product.account_limit and
get_purchase_count(sess, product.id, planet_id=receipt_data.planetId,
avatar_addr=receipt.avatar_addr.lower()) > product.account_limit):
receipt.status = ReceiptStatus.PURCHASE_LIMIT_EXCEED
raise_error(sess, receipt, ValueError("Account purchase limit exceeded."))
receipt = check_purchase_limit(sess, receipt, product, limit_type="account", limit=product.account_limit,
use_avatar=True)

prefix, body = product.google_sku.split("seasonpass")
try:
Expand Down Expand Up @@ -273,21 +310,12 @@ def request_product(receipt_data: ReceiptSchema, sess=Depends(session)):
logging.error(msg)
raise_error(sess, receipt, Exception(msg))
else:
if (product.daily_limit and
get_purchase_count(sess, product.id, planet_id=PlanetID(receipt.planet_id),
agent_addr=receipt.agent_addr.lower(), daily_limit=True) > product.daily_limit):
receipt.status = ReceiptStatus.PURCHASE_LIMIT_EXCEED
raise_error(sess, receipt, ValueError("Daily purchase limit exceeded."))
elif (product.weekly_limit and
get_purchase_count(sess, product.id, planet_id=PlanetID(receipt.planet_id),
agent_addr=receipt.agent_addr.lower(), weekly_limit=True) > product.weekly_limit):
receipt.status = ReceiptStatus.PURCHASE_LIMIT_EXCEED
raise_error(sess, receipt, ValueError("Weekly purchase limit exceeded."))
elif (product.account_limit and
get_purchase_count(sess, product.id, planet_id=PlanetID(receipt.planet_id),
agent_addr=receipt.agent_addr.lower()) > product.account_limit):
receipt.status = ReceiptStatus.PURCHASE_LIMIT_EXCEED
raise_error(sess, receipt, ValueError("Account purchase limit exceeded."))
if product.daily_limit:
receipt = check_purchase_limit(sess, receipt, product, "daily", product.daily_limit)
if product.weekly_limit:
receipt = check_purchase_limit(sess, receipt, product, "weekly", product.weekly_limit)
if product.account_limit:
receipt = check_purchase_limit(sess, receipt, product, "account", product.account_limit)

msg = {
"agent_addr": receipt_data.agentAddress.lower(),
Expand Down Expand Up @@ -364,42 +392,15 @@ def free_product(receipt_data: FreeReceiptSchema, sess=Depends(session)):
raise_error(sess, receipt, ValueError(f"Not in product opening time"))

# Purchase Limit
if (product.daily_limit and
get_purchase_count(sess, product.id, planet_id=PlanetID(receipt.planet_id),
agent_addr=receipt.agent_addr.lower(), daily_limit=True) > product.daily_limit):
receipt.status = ReceiptStatus.PURCHASE_LIMIT_EXCEED
raise_error(sess, receipt, ValueError("Daily purchase limit exceeded."))
elif (product.weekly_limit and
get_purchase_count(sess, product.id, planet_id=PlanetID(receipt.planet_id),
agent_addr=receipt.agent_addr.lower(), weekly_limit=True) > product.weekly_limit):
receipt.status = ReceiptStatus.PURCHASE_LIMIT_EXCEED
raise_error(sess, receipt, ValueError("Weekly purchase limit exceeded."))
elif (product.account_limit and
get_purchase_count(sess, product.id, planet_id=PlanetID(receipt.planet_id),
agent_addr=receipt.agent_addr.lower()) > product.account_limit):
receipt.status = ReceiptStatus.PURCHASE_LIMIT_EXCEED
raise_error(sess, receipt, ValueError("Account purchase limit exceeded."))
if product.daily_limit:
receipt = check_purchase_limit(sess, receipt, product, limit_type="daily", limit=product.daily_limit)
if product.weekly_limit:
receipt = check_purchase_limit(sess, receipt, product, limit_type="weekly", limit=product.weekly_limit)
if product.account_limit:
receipt = check_purchase_limit(sess, receipt, product, limit_type="account", limit=product.account_limit)

# Required level
if product.required_level:
gql_url = None
if receipt_data.planetId in (PlanetID.ODIN, PlanetID.ODIN_INTERNAL):
gql_url = os.environ.get("ODIN_GQL_URL")
elif receipt_data.planetId in (PlanetID.HEIMDALL, PlanetID.HEIMDALL_INTERNAL):
gql_url = os.environ.get("HEIMDALL_GQL_URL")

query = f"""{{ stateQuery {{ avatar (avatarAddress: "{receipt_data.avatarAddress}") {{ level}} }} }}"""
try:
resp = requests.post(gql_url, json={"query": query}, timeout=1)
avatar_level = resp.json()["data"]["stateQuery"]["avatar"]["level"]
except:
# Whether request is failed or no fitted data found
avatar_level = 0

if avatar_level < product.required_level:
receipt.status = ReceiptStatus.REQUIRED_LEVEL
raise_error(sess, receipt,
ValueError(f"Avatar level {avatar_level} does not met required level {product.required_level}"))
receipt = check_required_level(sess, receipt, product)

receipt.status = ReceiptStatus.VALID
sess.add(receipt)
Expand Down
4 changes: 2 additions & 2 deletions iap/iap_cdk_stack.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,9 +121,9 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
role=role,
vpc=shared_stack.vpc,
security_groups=[shared_stack.rds_security_group],
timeout=cdk_core.Duration.seconds(10),
timeout=cdk_core.Duration.seconds(30),
environment=env,
memory_size=256,
memory_size=512,
)

# ACM & Custom Domain
Expand Down
3 changes: 3 additions & 0 deletions worker/worker/status_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"1a755098a2bc0659a063107df62e2ff9b3cdaba34d96b79519f504b996f53820": "Silver Dust (800201)",
"f8faf92c9c0d0e8e06694361ea87bfc8b29a8ae8de93044b98470a57636ed0e0": "Golden Dust (600201)",
"48e50ecd6d1aa2689fd349c1f0611e6cc1e9c4c74ec4de9d4637ec7b78617308": "Golden Meat (800202)",
"08f566bb43570aad34c1790901f824dd5609db880afebd5382fcec054203d92a": "Ruby Dust (600202)"
}

VIEW_ORDER = (
Expand All @@ -35,6 +36,7 @@
FUNGIBLE_DICT["00dfffe23964af9b284d121dae476571b7836b8d9e2e5f510d92a840fecc64fe"], # AP Potion
"RUNE_GOLDENLEAF",
FUNGIBLE_DICT["f8faf92c9c0d0e8e06694361ea87bfc8b29a8ae8de93044b98470a57636ed0e0"], # Golden Dust
FUNGIBLE_DICT["08f566bb43570aad34c1790901f824dd5609db880afebd5382fcec054203d92a"], # Ruby Dust
FUNGIBLE_DICT["48e50ecd6d1aa2689fd349c1f0611e6cc1e9c4c74ec4de9d4637ec7b78617308"], # Golden Meat
FUNGIBLE_DICT["1a755098a2bc0659a063107df62e2ff9b3cdaba34d96b79519f504b996f53820"], # Silver Dust
"SOULSTONE_1001", "SOULSTONE_1002", "SOULSTONE_1003", "SOULSTONE_1004",
Expand Down Expand Up @@ -145,6 +147,7 @@ def check_garage():
"3991e04dd808dc0bc24b21f5adb7bf1997312f8700daf1334bf34936e8a0813a", # Hourglass (400000)
"00dfffe23964af9b284d121dae476571b7836b8d9e2e5f510d92a840fecc64fe", # AP Potion (500000)
"f8faf92c9c0d0e8e06694361ea87bfc8b29a8ae8de93044b98470a57636ed0e0" # Golden Dust (600201)
"08f566bb43570aad34c1790901f824dd5609db880afebd5382fcec054203d92a", # Ruby Dust (600202)
"48e50ecd6d1aa2689fd349c1f0611e6cc1e9c4c74ec4de9d4637ec7b78617308", # Golden Meat (800202)
"1a755098a2bc0659a063107df62e2ff9b3cdaba34d96b79519f504b996f53820", # Silver Dust (800201)
]
Expand Down
Loading