This commit is contained in:
drmext 2025-12-11 05:44:23 +00:00
parent 827c80b26d
commit ed64259784
No known key found for this signature in database
GPG Key ID: F1ED48FFE79A6961
4 changed files with 96 additions and 9 deletions

View File

@ -19,6 +19,6 @@ port = 8000
services_prefix = "/core" services_prefix = "/core"
verbose_log = True verbose_log = True
arcade = "Monkey Business" arcade = ""
paseli = 5730 paseli = 10000
maintenance_mode = False maintenance_mode = False

View File

@ -1,24 +1,40 @@
import config import config
from fastapi import APIRouter, Request, Response from fastapi import APIRouter, Request, Response
from tinydb import where
from core_common import core_process_request, core_prepare_response, E from core_common import core_process_request, core_prepare_response, E
from core_database import get_db
router = APIRouter(prefix="/core", tags=["eacoin"]) router = APIRouter(prefix="/core", tags=["eacoin"])
sessid = 0
payments = {}
@router.post("/{gameinfo}/eacoin/checkin") @router.post("/{gameinfo}/eacoin/checkin")
async def eacoin_checkin(request: Request): async def eacoin_checkin(request: Request):
request_info = await core_process_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( response = E.response(
E.eacoin( E.eacoin(
E.sequence(1, __type="s16"), E.sequence(1, __type="s16"),
E.acstatus(1, __type="u8"), E.acstatus(1, __type="u8"),
E.acid(1, __type="str"), E.acid(1, __type="str"),
E.acname(config.arcade, __type="str"), E.acname(op.get("opname", config.arcade), __type="str"),
E.balance(config.paseli, __type="s32"), E.balance(bal.get("balance", config.paseli), __type="s32"),
E.sessid(1, __type="str"), E.sessid(sessid, __type="str"),
E.inshopcharge(1, __type="u8"), E.inshopcharge(1, __type="u8"),
) )
) )
@ -40,15 +56,55 @@ async def eacoin_checkout(request: Request):
@router.post("/{gameinfo}/eacoin/consume") @router.post("/{gameinfo}/eacoin/consume")
async def eacoin_consume(request: Request): async def eacoin_consume(request: Request):
request_info = await core_process_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( response = E.response(
E.eacoin( E.eacoin(
E.acstatus(0, __type="u8"), E.acstatus(0, __type="u8"),
E.autocharge(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) response_body, response_headers = await core_prepare_response(request, response)
return Response(content=response_body, headers=response_headers) return Response(content=response_body, headers=response_headers)

View File

@ -1,8 +1,10 @@
import config import config
from fastapi import APIRouter, Request, Response from fastapi import APIRouter, Request, Response
from tinydb import where
from core_common import core_process_request, core_prepare_response, E from core_common import core_process_request, core_prepare_response, E
from core_database import get_db
router = APIRouter(prefix="/core", tags=["facility"]) router = APIRouter(prefix="/core", tags=["facility"])
@ -10,6 +12,10 @@ router = APIRouter(prefix="/core", tags=["facility"])
@router.post("/{gameinfo}/facility/get") @router.post("/{gameinfo}/facility/get")
async def facility_get(request: Request): async def facility_get(request: Request):
request_info = await core_process_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( response = E.response(
E.facility( E.facility(
@ -26,7 +32,7 @@ async def facility_get(request: Request):
E.regionname("Tokyo", __type="str"), E.regionname("Tokyo", __type="str"),
E.countryjname("日本国", __type="str"), E.countryjname("日本国", __type="str"),
E.regionjname("東京都", __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("type", 255, __type="u8"),
), ),
E.line( E.line(
@ -42,7 +48,7 @@ async def facility_get(request: Request):
), ),
E.public( E.public(
E.flag(1, __type="u8"), 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.latitude(0, __type="str"),
E.longitude(0, __type="str"), E.longitude(0, __type="str"),
), ),

View File

@ -1,8 +1,10 @@
import config import config
from fastapi import APIRouter, Request, Response from fastapi import APIRouter, Request, Response
from tinydb import Query, where
from core_common import core_process_request, core_prepare_response, E from core_common import core_process_request, core_prepare_response, E
from core_database import get_db
router = APIRouter(prefix="/local", tags=["local"]) router = APIRouter(prefix="/local", tags=["local"])
router.model_whitelist = ["LDJ"] router.model_whitelist = ["LDJ"]
@ -11,11 +13,15 @@ router.model_whitelist = ["LDJ"]
@router.post("/{gameinfo}/IIDX33shop/getname") @router.post("/{gameinfo}/IIDX33shop/getname")
async def iidx33shop_getname(request: Request): async def iidx33shop_getname(request: Request):
request_info = await core_process_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( response = E.response(
E.IIDX33shop( E.IIDX33shop(
cls_opt=0, cls_opt=0,
opname=config.arcade, opname=op.get("opname", config.arcade),
pid=13, pid=13,
) )
) )
@ -24,6 +30,25 @@ async def iidx33shop_getname(request: Request):
return Response(content=response_body, headers=response_headers) 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") @router.post("/{gameinfo}/IIDX33shop/getconvention")
async def iidx33shop_getconvention(request: Request): async def iidx33shop_getconvention(request: Request):
request_info = await core_process_request(request) request_info = await core_process_request(request)