198 lines
5.2 KiB
TypeScript
198 lines
5.2 KiB
TypeScript
import { ChunithmStaticCharge, ChunithmStaticEvent } from "external/db/entity/chunithm/static";
|
|
import CreateLogCtx from "lib/logger/logger";
|
|
import { DateTime } from "luxon";
|
|
import { BaseTitle } from "servers/titles/types/titles";
|
|
import type { Request, Response } from "express";
|
|
import type { ITitle } from "servers/titles/types/titles";
|
|
|
|
const logger = CreateLogCtx(__filename);
|
|
|
|
export class Chunithm extends BaseTitle implements ITitle {
|
|
private readonly dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
|
|
|
|
constructor(gameCode?: string, version?: string, servletName?: string) {
|
|
super(gameCode ?? "SDBT", version ?? "100", servletName ?? "ChuniServlet");
|
|
}
|
|
|
|
protected createGetGameSettingsApiResponse(_req: Request, _res: Response) {
|
|
// HACK: This is not the way to go if you're somehow hosting an arcade server
|
|
// from my code, and wants your machines to actually restart sometimes.
|
|
const rebootStartTime = DateTime.now().minus({ hours: 4 }).toFormat(this.dateTimeFormat);
|
|
const rebootEndTime = DateTime.now().minus({ hours: 3 }).toFormat(this.dateTimeFormat);
|
|
|
|
return {
|
|
gameSetting: {
|
|
dataVersion: "1.00.00",
|
|
isMaintenance: "false",
|
|
requestInterval: "10",
|
|
rebootStartTime,
|
|
rebootEndTime,
|
|
isBackgroundDistribute: "false",
|
|
maxCountCharacter: "300",
|
|
maxCountItem: "300",
|
|
maxCountMusic: "300",
|
|
},
|
|
isDumpUpload: "false",
|
|
isAou: "false",
|
|
};
|
|
}
|
|
|
|
/**
|
|
* @note override {@link createGetGameSettingsApiResponse} in order to modify this
|
|
* method's response
|
|
* @since CHUNITHM
|
|
*/
|
|
handle_GetGameSettingsApi(req: Request, res: Response) {
|
|
const resp = this.createGetGameSettingsApiResponse(req, res);
|
|
|
|
return res.status(200).send(resp);
|
|
}
|
|
|
|
handle_UpsertClientSettingApi(req: Request, res: Response) {
|
|
return res.status(200).send({ returnCode: "1" });
|
|
}
|
|
|
|
handle_UpsertClientTestmodeApi(req: Request, res: Response) {
|
|
return res.status(200).send({ returnCode: "1" });
|
|
}
|
|
|
|
handle_GetGameIdlistApi(req: Request, res: Response) {
|
|
return res.status(200).send({ type: req.safeBody.type, length: "0", gameIdlistList: [] });
|
|
}
|
|
|
|
async handle_GetGameEventApi(req: Request, res: Response) {
|
|
const events = await ChunithmStaticEvent.find({
|
|
where: {
|
|
enabled: true,
|
|
version: this.numericVersion,
|
|
},
|
|
});
|
|
|
|
if (events.length === 0) {
|
|
logger.warn("No events are enabled.", {
|
|
gameCode: this.gameCode,
|
|
version: this.version,
|
|
});
|
|
}
|
|
|
|
// HACK: We may want to rotate events...
|
|
return res.send({
|
|
type: req.safeBody.type,
|
|
length: events.length.toString(),
|
|
gameEventList: events.map((e) => ({
|
|
id: e.eventId.toString(),
|
|
type: e.type.toString(),
|
|
startDate: DateTime.fromJSDate(e.startDate).toFormat(this.dateTimeFormat),
|
|
endDate: "2099-12-31 00:00:00",
|
|
})),
|
|
});
|
|
}
|
|
|
|
handle_GetGameRankingApi(req: Request, res: Response) {
|
|
// TODO
|
|
return res.send({
|
|
type: req.safeBody.type,
|
|
length: "0",
|
|
gameRankingList: [],
|
|
});
|
|
}
|
|
|
|
async handle_GetGameChargeApi(req: Request, res: Response) {
|
|
const charges = await ChunithmStaticCharge.find({
|
|
where: {
|
|
enabled: true,
|
|
version: this.numericVersion,
|
|
},
|
|
});
|
|
|
|
if (charges.length === 0) {
|
|
logger.warn("No charges (tickets) are enabled.", {
|
|
gameCode: this.gameCode,
|
|
version: this.version,
|
|
});
|
|
}
|
|
|
|
// HACK
|
|
return res.send({
|
|
length: charges.length.toString(),
|
|
gameChargeList: charges.map((c, i) => ({
|
|
orderId: i.toString(),
|
|
chargeId: c.chargeId.toString(),
|
|
price: "1",
|
|
startDate: "2017-12-05 07:00:00.0",
|
|
endDate: "2099-12-31 00:00:00.0",
|
|
salePrice: "1",
|
|
saleStartDate: "2017-12-05 07:00:00.0",
|
|
saleEndDate: "2099-12-31 00:00:00.0",
|
|
})),
|
|
});
|
|
}
|
|
|
|
handle_GetUserPreviewApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GameLoginApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GetUserDataApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GetUserOptionApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GetUserCharacterApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GetUserActivityApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GetUserItemApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GetUserRecentRatingApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GetUserMusicApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GetUserRegionApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GetUserFavoriteItemApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GetUserLoginBonusApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GetUserMapAreaApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GetUserSymbolChatSettingApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
/**
|
|
* @since NEW
|
|
*/
|
|
handle_GetUserNetBattleDataApi(req: Request, res: Response) {
|
|
throw new Error("Unimplemented");
|
|
}
|
|
|
|
handle_GameLogoutApi(req: Request, res: Response) {
|
|
return res.status(200).send({ returnCode: "1" });
|
|
}
|
|
}
|