diff --git a/config.py b/config.py index 007525e..b35c773 100644 --- a/config.py +++ b/config.py @@ -19,6 +19,6 @@ port = 8000 services_prefix = "/core" verbose_log = True -arcade = "Monkey Business" -paseli = 5730 +arcade = "M0NKYBUS1N3Z" +paseli = 10000 maintenance_mode = False diff --git a/modules/core/eacoin.py b/modules/core/eacoin.py index 030cc59..d2ca8d6 100644 --- a/modules/core/eacoin.py +++ b/modules/core/eacoin.py @@ -1,24 +1,40 @@ import config from fastapi import APIRouter, Request, Response +from tinydb import where from core_common import core_process_request, core_prepare_response, E +from core_database import get_db router = APIRouter(prefix="/core", tags=["eacoin"]) +sessid = 0 +payments = {} @router.post("/{gameinfo}/eacoin/checkin") async def eacoin_checkin(request: Request): request_info = await core_process_request(request) + pcbid = request_info["root"].attrib["srcid"] + cardid = request_info["root"][0].find("cardid").text + + op = get_db().table("shop").get(where("pcbid") == pcbid) + op = {} if op is None else op + + bal = get_db().table("paseli").get(where("cardid") == cardid) + bal = {} if bal is None else bal + + global sessid + sessid += 1 + payments[sessid] = cardid response = E.response( E.eacoin( E.sequence(1, __type="s16"), E.acstatus(1, __type="u8"), E.acid(1, __type="str"), - E.acname(config.arcade, __type="str"), - E.balance(config.paseli, __type="s32"), - E.sessid(1, __type="str"), + E.acname(op.get("opname", config.arcade), __type="str"), + E.balance(bal.get("balance", config.paseli), __type="s32"), + E.sessid(sessid, __type="str"), E.inshopcharge(1, __type="u8"), ) ) @@ -40,15 +56,55 @@ async def eacoin_checkout(request: Request): @router.post("/{gameinfo}/eacoin/consume") async def eacoin_consume(request: Request): request_info = await core_process_request(request) + sessid = int(request_info["root"][0].find("sessid").text) + payment = int(request_info["root"][0].find("payment").text) + + cardid = payments.get(sessid, None) + + # fallback if server is restarted mid-round for IIDX movie or gacha purchases + if cardid == None: + response = E.response( + E.eacoin( + E.acstatus(0, __type="u8"), + E.autocharge(0, __type="u8"), + E.balance(config.paseli, __type="s32"), + ) + ) + + response_body, response_headers = await core_prepare_response(request, response) + return Response(content=response_body, headers=response_headers) + + bal = get_db().table("paseli").get(where("cardid") == cardid) + if bal == None: + bal = { + "cardid": cardid, + "balance": config.paseli, + "total_spent": 0, + } + + new_balance = bal["balance"] - payment + + paseli_card = { + "cardid": cardid, + "balance": new_balance, + "total_spent": bal["total_spent"] + payment, + } response = E.response( E.eacoin( E.acstatus(0, __type="u8"), E.autocharge(0, __type="u8"), - E.balance(config.paseli, __type="s32"), + E.balance(new_balance, __type="s32"), ) ) + if new_balance < 1000 or new_balance > config.paseli: + paseli_card["balance"] = config.paseli + + get_db().table("paseli").upsert(paseli_card, where("cardid") == cardid) + + # del payments[sessid] + response_body, response_headers = await core_prepare_response(request, response) return Response(content=response_body, headers=response_headers) diff --git a/modules/core/facility.py b/modules/core/facility.py index a90246b..8bc381d 100644 --- a/modules/core/facility.py +++ b/modules/core/facility.py @@ -1,8 +1,10 @@ import config from fastapi import APIRouter, Request, Response +from tinydb import where from core_common import core_process_request, core_prepare_response, E +from core_database import get_db router = APIRouter(prefix="/core", tags=["facility"]) @@ -10,6 +12,10 @@ router = APIRouter(prefix="/core", tags=["facility"]) @router.post("/{gameinfo}/facility/get") async def facility_get(request: Request): request_info = await core_process_request(request) + pcbid = request_info["root"].attrib["srcid"] + + op = get_db().table("shop").get(where("pcbid") == pcbid) + op = {} if op is None else op response = E.response( E.facility( @@ -26,7 +32,7 @@ async def facility_get(request: Request): E.regionname("Tokyo", __type="str"), E.countryjname("日本国", __type="str"), E.regionjname("東京都", __type="str"), - E.name(config.arcade, __type="str"), + E.name(op.get("opname", config.arcade), __type="str"), E("type", 255, __type="u8"), ), E.line( @@ -42,7 +48,7 @@ async def facility_get(request: Request): ), E.public( E.flag(1, __type="u8"), - E.name(config.arcade, __type="str"), + E.name(op.get("opname", config.arcade), __type="str"), E.latitude(0, __type="str"), E.longitude(0, __type="str"), ), diff --git a/modules/iidx/iidx33shop.py b/modules/iidx/iidx33shop.py index ee2e540..fcf9520 100644 --- a/modules/iidx/iidx33shop.py +++ b/modules/iidx/iidx33shop.py @@ -1,8 +1,10 @@ import config from fastapi import APIRouter, Request, Response +from tinydb import Query, where from core_common import core_process_request, core_prepare_response, E +from core_database import get_db router = APIRouter(prefix="/local", tags=["local"]) router.model_whitelist = ["LDJ"] @@ -11,11 +13,15 @@ router.model_whitelist = ["LDJ"] @router.post("/{gameinfo}/IIDX33shop/getname") async def iidx33shop_getname(request: Request): request_info = await core_process_request(request) + pcbid = request_info["root"].attrib["srcid"] + + op = get_db().table("shop").get(where("pcbid") == pcbid) + op = {} if op is None else op response = E.response( E.IIDX33shop( cls_opt=0, - opname=config.arcade, + opname=op.get("opname", config.arcade), pid=13, ) ) @@ -24,6 +30,25 @@ async def iidx33shop_getname(request: Request): return Response(content=response_body, headers=response_headers) +@router.post("/{gameinfo}/IIDX33shop/savename") +async def iidx33shop_savename(request: Request): + request_info = await core_process_request(request) + pcbid = request_info["root"].attrib["srcid"] + opname = request_info["root"][0].attrib["opname"] + + shop_info = { + "pcbid": pcbid, + "opname": opname, + } + + get_db().table("shop").upsert(shop_info, where("pcbid") == pcbid) + + response = E.response(E.IIDX33shop()) + + response_body, response_headers = await core_prepare_response(request, response) + return Response(content=response_body, headers=response_headers) + + @router.post("/{gameinfo}/IIDX33shop/getconvention") async def iidx33shop_getconvention(request: Request): request_info = await core_process_request(request)