@xmobitea/gn-server
Version:
GearN Server by XmobiTea (Pro)
1,097 lines (951 loc) • 36.3 kB
text/typescript
import { SecretInfo, SecretPermissionItem } from "./../../index";
import { AuthInfo } from "./../../index";
import { authenticate_InfoRequestParam as authenticate_InfoRequestParam } from "./../../index";
import { characterPlayer_InfoRequestParam as characterPlayer_InfoRequestParam } from "./../../index";
import { gamePlayer_InfoRequestParam as gamePlayer_InfoRequestParam } from "./../../index";
import { group_InfoRequestParam as group_InfoRequestParam } from "./../../index";
import { inventory_InfoRequestParam as inventory_InfoRequestParam } from "./../../index";
import { masterPlayer_InfoRequestParam as masterPlayer_InfoRequestParam } from "./../../index";
import { storeInventory_InfoRequestParam as storeInventory_InfoRequestParam } from "./../../index";
import { PermissionParam } from "./../../index";
import { ContentDataParam } from "./../../index";
import { CustomDataParam } from "./../../index";
// import { GroupMemberParam } from "./../../index";
import { PlayerCurrencyParam } from "./../../index";
import { PlayerDataParam } from "./../../index";
import { PlayerStatisticsParam } from "./../../index";
import { GroupCurrencyParam } from "./../../index";
import { GroupDataParam } from "./../../index";
import { GroupMemberParam } from "./../../index";
import { GroupMessageItem } from "./../../index";
import { GroupStatisticsParam } from "./../../index";
import { ItemDataParam } from "./../../index";
import { ItemStatisticsParam } from "./../../index";
import { AvatarParam } from "./../../index";
import { CurrencyParam } from "./../../index";
import { InAppPurchaseParam } from "./../../index";
import { StoreDataParam } from "./../../index";
import { StoreItemParam } from "./../../index";
import { TagParam } from "./../../index";
import { AuthenticatePermissionRulesParam } from "./../../index";
import { CharacterCatalogSettingsParam } from "./../../index";
import { CharacterPlayerPermissionRulesParam } from "./../../index";
import { CharacterPlayerSettingsParam } from "./../../index";
import { CloudScriptPermissionRulesParam } from "./../../index";
import { ContentPermissionRulesParam } from "./../../index";
import { CurrencySettingsParam } from "./../../index";
import { DataSettingsParam } from "./../../index";
import { FriendCatalogSettingsParam } from "./../../index";
import { GamePlayerPermissionRulesParam } from "./../../index";
import { GamePlayerSettingsParam } from "./../../index";
import { GameSettingsParam } from "./../../index";
import { GenericServiceSettingsParam } from "./../../index";
import { GroupCatalogSettingsParam } from "./../../index";
import { GroupPermissionRulesParam } from "./../../index";
import { GroupSettingsParam } from "./../../index";
import { InventoryPermissionRulesParam } from "./../../index";
import { InventorySettingsParam } from "./../../index";
import { ItemCatalogSettingsParam } from "./../../index";
import { ItemClassSettingsParam } from "./../../index";
import { MasterAdminPermissionRulesParam } from "./../../index";
import { MasterPlayerPermissionRulesParam } from "./../../index";
import { MasterPlayerSettingsParam } from "./../../index";
import { MatchmakingQueueSettingsParam } from "./../../index";
import { MultiplayerPermissionRulesParam } from "./../../index";
import { PermissionRulesParam } from "./../../index";
import { StatisticsSettingsParam } from "./../../index";
import { StoreInventoryPermissionRulesParam } from "./../../index";
import { TagSettingsParam } from "./../../index";
import { ThirtPartyAppleSettingsParam } from "./../../index";
import { ThirtPartyFacebookSettingsParam } from "./../../index";
import { ThirtPartyGameCenterSettingsParam } from "./../../index";
import { ThirtPartyGooglePlayGameSettingsParam } from "./../../index";
import { ThirtPartyParam } from "./../../index";
import { EmailSettingsParam } from "./../../index";
import { PushNotificationSettingsParam } from "./../../index";
import { AnalyticsRequestParams } from "./../../index";
import { ServerGameDataRequestParams } from "./../../index";
import { MatchmakingTicketCanMatch } from "./../../index";
import { ServerDetail } from "./../../index";
import {
GNNetwork,
Action0,
Action1,
Action2,
Action3,
Action4,
ConverterService,
OwnerType,
ErrorCode,
ParameterCode,
Commands,
EventCode,
OperationCode,
ReturnCode,
CodeHelper,
DataMember,
StringDataMember,
BooleanDataMember,
GNHashtableDataMember,
GNArrayDataMember,
NumberDataMember,
GNHashtableBuilder,
GNHashtable,
GNArrayBuilder,
GNArray,
InvalidMemberType,
InvalidMember,
RequestType,
RequestRole,
CustomOperationRequest,
CustomOperationRequestAbstract,
CustomOperationResponse,
Constructor,
AbstractConstructor,
FieldDataType,
GNObjectFieldMetadata,
GNObjectMetadata,
CustomOperationResponseAbstract,
IServerEventHandler,
OperationEvent,
OperationRequest,
OperationResponse,
GenericModels,
CharacterPlayerModels,
ContentModels,
GamePlayerModels,
GroupModels,
InventoryModels,
MasterPlayerModels,
StoreInventoryModels,
MultiplayerModels,
CloudScriptModels,
GNServerSettingsOptions,
GNServerSettings,
PermissionDataItem,
FriendStatus,
GoogleLoginType,
GroupStatus,
GNDebug,
ItemType,
StoreItemType,
LogType,
GNSupport,
PostType,
GetAuthInfoResponse,
PushPlatformType,
StoreReceiveType,
GNUtils,
} from "@xmobitea/gn-typescript-client";
import * as mongodb from "mongodb";
import * as axios from "axios";
enum CloudScriptEventType {
SendToUser = 0,
SendToMore = 1,
SendToAll = 2,
}
interface CloudScriptEvent {
eventType: CloudScriptEventType;
operationEvent: {
eventCode: string;
parameters: {} | null;
};
receiver: string[] | string | null;
}
class CloudScriptAdmin {
public readonly characterPlayer = GNNetwork.characterPlayer.admin;
public readonly content = GNNetwork.content.admin;
public readonly gamePlayer = GNNetwork.gamePlayer.admin;
public readonly group = GNNetwork.group.admin;
public readonly inventory = GNNetwork.inventory.admin;
public readonly masterPlayer = GNNetwork.masterPlayer.admin;
public readonly storeInventory = GNNetwork.storeInventory.admin;
public readonly multiplayer = GNNetwork.multiplayer.admin;
public readonly cloudScript = GNNetwork.cloudScript.admin;
public readonly dashboard = {
getAdminAccountList: GNNetwork.dashboard.getAdminAccountList,
getAdminAccountListAsync: GNNetwork.dashboard.getAdminAccountListAsync,
getGameInformation: GNNetwork.dashboard.getGameInformation,
getGameInformationAsync: GNNetwork.dashboard.getGameInformationAsync,
getGameList: GNNetwork.dashboard.getGameList,
getGameListAsync: GNNetwork.dashboard.getGameListAsync,
getMasterGameSettings: GNNetwork.dashboard.getMasterGameSettings,
getMasterGameSettingsAsync: GNNetwork.dashboard.getMasterGameSettingsAsync,
getSecretInfoInformation: GNNetwork.dashboard.getSecretInfoInformation,
getSecretInfoInformationAsync: GNNetwork.dashboard.getSecretInfoInformationAsync,
getSecretInfoList: GNNetwork.dashboard.getSecretInfoList,
getSecretInfoListAsync: GNNetwork.dashboard.getSecretInfoListAsync,
getServerLog: GNNetwork.dashboard.getServerLog,
getServerLogAsync: GNNetwork.dashboard.getServerLogAsync,
setGameInformation: GNNetwork.dashboard.setGameInformation,
setGameInformationAsync: GNNetwork.dashboard.setGameInformationAsync,
getUsernameAdminAccount: GNNetwork.dashboard.getUsernameAdminAccount,
getUsernameAdminAccountAsync: GNNetwork.dashboard.getUsernameAdminAccountAsync,
getAnalytics: GNNetwork.dashboard.getAnalytics,
getAnalyticsAsync: GNNetwork.dashboard.getAnalyticsAsync,
resetStatisticsLeaderboard: GNNetwork.dashboard.resetStatisticsLeaderboard,
resetStatisticsLeaderboardAsync: GNNetwork.dashboard.resetStatisticsLeaderboardAsync,
getBackupStatisticsLeaderboardVersion: GNNetwork.dashboard.getBackupStatisticsLeaderboardVersion,
getBackupStatisticsLeaderboardVersionAsync: GNNetwork.dashboard.getBackupStatisticsLeaderboardVersionAsync,
getServerGameData: GNNetwork.dashboard.getServerGameData,
getServerGameDataAsync: GNNetwork.dashboard.getServerGameDataAsync,
deleteInDatabase: GNNetwork.dashboard.deleteInDatabase,
deleteInDatabaseAsync: GNNetwork.dashboard.deleteInDatabaseAsync,
};
public send(
requestType: RequestType,
role: RequestRole,
request: OperationRequest,
onResponse: Action1<OperationResponse>,
overrideAuthToken: string,
overrideSecretKey: string,
customTags: GNHashtable
): void {
GNNetwork.sendViaHttp(requestType, role, request, onResponse, overrideAuthToken, overrideSecretKey, customTags);
}
public sendAsync(
requestType: RequestType,
role: RequestRole,
request: OperationRequest,
overrideAuthToken: string,
overrideSecretKey: string,
customTags: GNHashtable
): Promise<OperationResponse> {
return GNNetwork.sendViaHttpAsync(requestType, role, request, overrideAuthToken, overrideSecretKey, customTags);
}
}
class CloudScriptDatabase {
private static readonly DOT: string = ".";
private static readonly RUNTIME: string = "Runtime" + CloudScriptDatabase.DOT;
private static readonly META: string = "Meta" + CloudScriptDatabase.DOT;
private static readonly SYSTEM: string = "System" + CloudScriptDatabase.DOT;
private client: mongodb.MongoClient;
private db: mongodb.Db;
private logClient: mongodb.MongoClient;
private logDb: mongodb.Db;
init(url: string, dbName: string, logUrl: string, logDbName: string, options?: mongodb.MongoClientOptions): void {
this.client = new mongodb.MongoClient(url, options);
this.db = this.client.db(dbName);
if (!logUrl || logUrl == "" || logUrl == url) {
this.logClient = this.client;
this.logDb = this.db;
}
else {
this.logClient = new mongodb.MongoClient(logUrl, options);
this.logDb = this.logClient.db(logDbName);
}
}
public runtimeCollection<TSchema extends mongodb.Document = mongodb.Document>(collectionName: string): mongodb.Collection<TSchema> {
return this.collection<TSchema>(CloudScriptDatabase.RUNTIME + collectionName);
}
public metaCollection<TSchema extends mongodb.Document = mongodb.Document>(collectionName: string): mongodb.Collection<TSchema> {
return this.collection<TSchema>(CloudScriptDatabase.META + collectionName);
}
public systemCollection<TSchema extends mongodb.Document = mongodb.Document>(collectionName: string): mongodb.Collection<TSchema> {
return this.collection<TSchema>(CloudScriptDatabase.SYSTEM + collectionName);
}
public runtimeGameCollection<TSchema extends mongodb.Document = mongodb.Document>(collectionName: string, gameId: string): mongodb.Collection<TSchema> {
return this.collection<TSchema>(CloudScriptDatabase.RUNTIME + gameId + CloudScriptDatabase.DOT + collectionName);
}
public metaGameCollection<TSchema extends mongodb.Document = mongodb.Document>(collectionName: string, gameId: string): mongodb.Collection<TSchema> {
return this.collection<TSchema>(CloudScriptDatabase.META + gameId + CloudScriptDatabase.DOT + collectionName);
}
public systemGameCollection<TSchema extends mongodb.Document = mongodb.Document>(collectionName: string, gameId: string): mongodb.Collection<TSchema> {
return this.collection<TSchema>(CloudScriptDatabase.SYSTEM + gameId + CloudScriptDatabase.DOT + collectionName);
}
public collection<TSchema extends mongodb.Document = mongodb.Document>(fullCollectionName: string): mongodb.Collection<TSchema> {
return this.db.collection<TSchema>(fullCollectionName);
}
public createCollection(name: string, options?: mongodb.CreateCollectionOptions): Promise<mongodb.Collection<mongodb.BSON.Document>> {
return this.db.createCollection(name, options);
}
public logRuntimeCollection<TSchema extends mongodb.Document = mongodb.Document>(collectionName: string): mongodb.Collection<TSchema> {
return this.logCollection<TSchema>(CloudScriptDatabase.RUNTIME + collectionName);
}
public logMetaCollection<TSchema extends mongodb.Document = mongodb.Document>(collectionName: string): mongodb.Collection<TSchema> {
return this.logCollection<TSchema>(CloudScriptDatabase.META + collectionName);
}
public logSystemCollection<TSchema extends mongodb.Document = mongodb.Document>(collectionName: string): mongodb.Collection<TSchema> {
return this.logCollection<TSchema>(CloudScriptDatabase.SYSTEM + collectionName);
}
public logRuntimeGameCollection<TSchema extends mongodb.Document = mongodb.Document>(collectionName: string, gameId: string): mongodb.Collection<TSchema> {
return this.logCollection<TSchema>(CloudScriptDatabase.RUNTIME + gameId + CloudScriptDatabase.DOT + collectionName);
}
public logMetaGameCollection<TSchema extends mongodb.Document = mongodb.Document>(collectionName: string, gameId: string): mongodb.Collection<TSchema> {
return this.logCollection<TSchema>(CloudScriptDatabase.META + gameId + CloudScriptDatabase.DOT + collectionName);
}
public logSystemGameCollection<TSchema extends mongodb.Document = mongodb.Document>(collectionName: string, gameId: string): mongodb.Collection<TSchema> {
return this.logCollection<TSchema>(CloudScriptDatabase.SYSTEM + gameId + CloudScriptDatabase.DOT + collectionName);
}
public logCollection<TSchema extends mongodb.Document = mongodb.Document>(fullCollectionName: string): mongodb.Collection<TSchema> {
return this.logDb.collection<TSchema>(fullCollectionName);
}
public logCreateCollection<TSchema extends mongodb.Document = mongodb.Document>(collectionName: string, options?: mongodb.CreateCollectionOptions) {
return this.logDb.createCollection<TSchema>(collectionName, options)
}
}
class CloudScriptHttp {
public async get<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, config?: axios.AxiosRequestConfig<D>): Promise<R> {
return await axios.default.get<T, R, D>(url, config);
}
public async delete<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, config?: axios.AxiosRequestConfig<D>): Promise<R> {
return await axios.default.delete<T, R, D>(url, config);
}
public async head<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, config?: axios.AxiosRequestConfig<D>): Promise<R> {
return await axios.default.head<T, R, D>(url, config);
}
public async options<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, config?: axios.AxiosRequestConfig<D>): Promise<R> {
return await axios.default.options<T, R, D>(url, config);
}
public async post<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: any, config?: axios.AxiosRequestConfig<D>): Promise<R> {
return await axios.default.post<T, R, D>(url, data, config);
}
public async put<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: any, config?: axios.AxiosRequestConfig<D>): Promise<R> {
return await axios.default.put<T, R, D>(url, data, config);
}
public async patch<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: any, config?: axios.AxiosRequestConfig<D>): Promise<R> {
return await axios.default.patch<T, R, D>(url, data, config);
}
}
class CloudScriptSocket {
public async sendEventTo(userId: string, operationEvent: OperationEvent): Promise<void> {
return await this.sendEvent({
eventType: CloudScriptEventType.SendToUser,
receiver: userId,
operationEvent: {
eventCode: operationEvent.getEventCode(),
parameters: operationEvent.getParameters()?.toData() ?? null,
},
});
}
public async sendEventToMoreUser(userIds: string[], operationEvent: OperationEvent): Promise<void> {
return await this.sendEvent({
eventType: CloudScriptEventType.SendToMore,
receiver: userIds,
operationEvent: {
eventCode: operationEvent.getEventCode(),
parameters: operationEvent.getParameters()?.toData() ?? null,
},
});
}
public async sendEventToAllPlayer(operationEvent: OperationEvent): Promise<void> {
return await this.sendEvent({
eventType: CloudScriptEventType.SendToAll,
receiver: null,
operationEvent: {
eventCode: operationEvent.getEventCode(),
parameters: operationEvent.getParameters()?.toData() ?? null,
},
});
}
private async sendEvent(event: CloudScriptEvent) {
if (process?.send)
process.send(event);
}
}
class CloudScriptMatchmaking {
public async confirmServerDetail(gameId: string, matchmakingTicketCanMatch: MatchmakingTicketCanMatch, serverDetail: ServerDetail) {
if (process?.send)
process.send({
eventType: 10,
receiver: null,
operationEvent: {
eventCode: 0,
parameters: {
gameId: gameId,
matchmakingTicketCanMatch: matchmakingTicketCanMatch,
serverDetail: serverDetail,
},
},
});
}
}
class CloudScriptMail {
public async send(email: string, subject: string, contentHtml: string) {
if (process?.send)
process.send({
eventType: 20,
receiver: null,
operationEvent: {
eventCode: 0,
parameters: {
email: email,
subject: subject,
contentHtml: contentHtml,
},
},
});
}
public async sendToMore(emails: string[], subject: string, contentHtml: string) {
if (process?.send)
process.send({
eventType: 21,
receiver: null,
operationEvent: {
eventCode: 0,
parameters: {
emails: emails,
subject: subject,
contentHtml: contentHtml,
},
},
});
}
}
class CloudScriptPushNotification {
public async send(token: string, title: string, body: string, badge?: number, sound?: string, icon?: string, data?: { [k: string]: any }) {
if (process?.send)
process.send({
eventType: 30,
receiver: null,
operationEvent: {
eventCode: 0,
parameters: {
token: token,
title: title,
body: body,
badge: badge,
sound: sound,
icon: icon,
data: data,
},
},
});
}
public async sendToMore(tokens: string[], title: string, body: string, badge?: number, sound?: string, icon?: string, data?: { [k: string]: any }) {
if (process?.send)
process.send({
eventType: 31,
receiver: null,
operationEvent: {
eventCode: 0,
parameters: {
tokens: tokens,
title: title,
body: body,
badge: badge,
sound: sound,
icon: icon,
data: data,
},
},
});
}
public async sendToTopic(topic: string, title: string, body: string, badge?: number, sound?: string, icon?: string, data?: { [k: string]: any }) {
if (process?.send)
process.send({
eventType: 32,
receiver: null,
operationEvent: {
eventCode: 0,
parameters: {
topic: topic,
title: title,
body: body,
badge: badge,
sound: sound,
icon: icon,
data: data,
},
},
});
}
public async subscribeToTopic(tokens: string[], topic: string) {
if (process?.send)
process.send({
eventType: 33,
receiver: null,
operationEvent: {
eventCode: 0,
parameters: {
tokens: tokens,
topic: topic,
},
},
});
}
public async unsubscribeFromTopic(tokens: string[], topic: string) {
if (process?.send)
process.send({
eventType: 34,
receiver: null,
operationEvent: {
eventCode: 0,
parameters: {
tokens: tokens,
topic: topic,
},
},
});
}
}
enum EventCallbackType {
Pre = 0,
Post = 1,
System = 2,
Event = 3,
}
interface CloudScriptRequest {
requestId: string;
eventType: EventCallbackType;
eventName: string;
request: { [k: string]: any };
secretInfo: {
secretKey: string;
role: number;
remove: boolean;
tsExpire: number;
permission: SecretPermissionItem;
gameId: string;
isDefault: boolean;
description: string;
onlyMasterAdmin: boolean;
};
operationRequest: {
operationCode: string;
requestId: number;
parameters: {};
};
operationResponse?: {
returnCode: number;
debugMessage: string;
parameters: {};
};
log: (log: any) => void;
}
interface CloudScriptResponse {
stats: {
memoryUsedInBytes: number;
executeTimeInMs: number;
};
response: FunctionResponse;
responseId: string;
logs: string[];
}
interface FunctionRequest {
eventName: string;
request: { [k: string]: any };
secretInfo: SecretInfo;
operationRequest: OperationRequest;
operationResponse?: OperationResponse;
log: (log: any) => void;
}
enum ExecuteResponseStatus {
Ok = 1,
Exception = 2,
FunctionNameNotFound = 3,
}
interface FunctionResponse {
status: ExecuteResponseStatus;
result: {
returnCode: number;
debugMessage: string;
parameters?: {};
} | null;
request: {
[k: string]: any;
} | null;
errorMessage: any;
}
process?.on("message", async (request: CloudScriptRequest) => {
let startTime = performance.now();
let startMemoryUsage = process.memoryUsage();
let logs: string[] = [];
let handleResponse: FunctionResponse = null as any;
if (request.eventType == EventCallbackType.System) {
if (request.eventName == "system_RequestServerDetail") {
let functionRequest: FunctionRequest = {
eventName: request.eventName,
operationRequest: null as any,
secretInfo: null as any,
request: request.request,
log(log: any) {
logs.push(JSON.stringify(log));
},
};
handleResponse = await ___handleMatchmakingFunction(functionRequest);
}
else if (request.eventName == "system_VerifyGenericService") {
let functionRequest: FunctionRequest = {
eventName: request.eventName,
operationRequest: null as any,
secretInfo: null as any,
request: request.request,
log(log: any) {
logs.push(JSON.stringify(log));
},
};
handleResponse = await ___handleGenericServiceFunction(functionRequest);
}
else if (request.eventName == "system_OnAuthenticateSuccess") {
let originOperationRequest = request.operationRequest;
let operationRequest = new OperationRequest(originOperationRequest.operationCode);
if (originOperationRequest.parameters) {
operationRequest.setParameters(GNHashtable.builder().addAll(originOperationRequest.parameters).build());
}
let originSecretInfo = request.secretInfo;
let secretInfo: SecretInfo = null as any;
if (originSecretInfo) {
secretInfo = SecretInfo.Builder()
.setSecretKey(originSecretInfo.secretKey)
.setDescription(originSecretInfo.description)
.setRole(originSecretInfo.role)
.setIsRemove(originSecretInfo.remove)
.setTsExpire(originSecretInfo.tsExpire)
.setPermission(originSecretInfo.permission)
.setGameId(originSecretInfo.gameId)
.setIsDefault(originSecretInfo.isDefault)
.setIsOnlyMasterAdmin(originSecretInfo.onlyMasterAdmin)
.build();
}
let originOperationResponse = request.operationResponse;
let operationResponse: OperationResponse = null as any;
if (originOperationResponse) {
operationResponse = new OperationResponse(originOperationRequest.operationCode, originOperationRequest.requestId);
operationResponse.setReturnCode(originOperationResponse.returnCode);
operationResponse.setDebugMessage(originOperationResponse.debugMessage);
if (originOperationResponse.parameters) {
operationResponse.setParameters(GNHashtable.builder().addAll(originOperationResponse.parameters).build());
}
}
let functionRequest: FunctionRequest = {
eventName: request.eventName,
operationRequest: operationRequest,
operationResponse: operationResponse,
secretInfo: secretInfo,
request: request.request,
log(log: any) {
logs.push(JSON.stringify(log));
},
};
handleResponse = await ___handleSystemAuthenticateFunction(functionRequest);
}
else {
let functionRequest: FunctionRequest = {
eventName: request.eventName,
operationRequest: null as any,
secretInfo: null as any,
request: null as any,
log(log: any) {
logs.push(JSON.stringify(log));
},
};
handleResponse = await ___handleSystemFunction(functionRequest);
}
} else if (request.eventType == EventCallbackType.Event) {
let originOperationEvent = request.operationRequest;
let operationEvent = new OperationEvent(originOperationEvent.operationCode, (originOperationEvent.parameters ? GNHashtable.builder().addAll(originOperationEvent.parameters).build() : null as any));
let functionRequest: FunctionRequest = {
eventName: request.eventName,
operationRequest: null as any,
secretInfo: null as any,
request: {
operationEvent: operationEvent,
request: request.request,
},
log(log: any) {
logs.push(JSON.stringify(log));
},
};
handleResponse = await ___handleEventFunction(functionRequest);
} else {
let originOperationRequest = request.operationRequest;
let operationRequest = new OperationRequest(originOperationRequest.operationCode);
if (originOperationRequest.parameters) {
operationRequest.setParameters(GNHashtable.builder().addAll(originOperationRequest.parameters).build());
}
let originSecretInfo = request.secretInfo;
let secretInfo: SecretInfo = null as any;
if (originSecretInfo) {
secretInfo = SecretInfo.Builder()
.setSecretKey(originSecretInfo.secretKey)
.setDescription(originSecretInfo.description)
.setRole(originSecretInfo.role)
.setIsRemove(originSecretInfo.remove)
.setTsExpire(originSecretInfo.tsExpire)
.setPermission(originSecretInfo.permission)
.setGameId(originSecretInfo.gameId)
.setIsDefault(originSecretInfo.isDefault)
.setIsOnlyMasterAdmin(originSecretInfo.onlyMasterAdmin)
.build();
}
if (request.eventType == EventCallbackType.Pre) {
let functionRequest: FunctionRequest = {
eventName: request.eventName,
operationRequest: operationRequest,
secretInfo: secretInfo,
request: request.request,
log(log: any) {
logs.push(JSON.stringify(log));
},
};
handleResponse = await ___handlePreFunction(functionRequest);
} else if (request.eventType == EventCallbackType.Post) {
let originOperationResponse = request.operationResponse;
let operationResponse: OperationResponse = null as any;
if (originOperationResponse) {
operationResponse = new OperationResponse(originOperationRequest.operationCode, originOperationRequest.requestId);
operationResponse.setReturnCode(originOperationResponse.returnCode);
operationResponse.setDebugMessage(originOperationResponse.debugMessage);
if (originOperationResponse.parameters) {
operationResponse.setParameters(GNHashtable.builder().addAll(originOperationResponse.parameters).build());
}
}
let functionRequest: FunctionRequest = {
eventName: request.eventName,
operationRequest: operationRequest,
operationResponse: operationResponse,
secretInfo: secretInfo,
request: request.request,
log(log: any) {
logs.push(JSON.stringify(log));
},
};
handleResponse = await ___handlePostFunction(functionRequest);
}
}
let endTime = performance.now();
let endMemoryUsage = process.memoryUsage();
let memoryUsedInBytes = endMemoryUsage.heapUsed - startMemoryUsage.heapUsed;
if (memoryUsedInBytes <= 0) memoryUsedInBytes = 8192;
let executeTimeInMs = endTime - startTime;
//let cost = (memoryUsedInGb * executeTime) / 1000 * 0.022;
let response: CloudScriptResponse = {
responseId: request.requestId,
response: handleResponse as any,
stats: {
executeTimeInMs: executeTimeInMs,
memoryUsedInBytes: memoryUsedInBytes,
},
logs: logs,
};
if (process?.send)
process.send(response);
});
async function ___handleMatchmakingFunction(request: FunctionRequest): Promise<FunctionResponse> {
let handler = systemMatchmakingHandlers[request.eventName];
if (handler == null) {
return {
status: ExecuteResponseStatus.FunctionNameNotFound,
result: null,
request: null,
errorMessage: null,
};
}
let answer: FunctionResponse = {
status: ExecuteResponseStatus.Ok,
errorMessage: null,
result: null,
request: null,
};
try {
let result = await handler(request.request.gameId, request.request.matchmakingTicketCanMatch, request.log);
if (result != null)
answer.request = result;
} catch (err: any) {
answer.status = ExecuteResponseStatus.Exception;
answer.errorMessage = err.message;
}
return answer;
}
async function ___handleGenericServiceFunction(request: FunctionRequest): Promise<FunctionResponse> {
let handler = systemGenericServiceHandlers[request.eventName];
if (handler == null) {
return {
status: ExecuteResponseStatus.FunctionNameNotFound,
result: null,
request: null,
errorMessage: null,
};
}
let answer: FunctionResponse = {
status: ExecuteResponseStatus.Ok,
errorMessage: null,
result: null,
request: null,
};
try {
let result = await handler(request.request.serviceName, request.request.serviceData, request.log);
if (result != null)
answer.request = result;
} catch (err: any) {
answer.status = ExecuteResponseStatus.Exception;
answer.errorMessage = err.message;
}
return answer;
}
async function ___handleSystemAuthenticateFunction(request: FunctionRequest): Promise<FunctionResponse> {
let handler = systemAuthenticateHandlers[request.eventName];
if (handler == null) {
return {
status: ExecuteResponseStatus.FunctionNameNotFound,
result: null,
errorMessage: null,
request: null,
};
}
let answer: FunctionResponse = {
status: ExecuteResponseStatus.Ok,
errorMessage: null,
result: null,
request: null,
};
try {
let result = await handler(request.request as any, request.secretInfo, request.operationRequest, request.operationResponse as any, request.log);
if (result) {
answer.result = {
returnCode: result.getReturnCode(),
debugMessage: result.getDebugMessage(),
parameters: result.getParameters()?.toData(),
};
}
} catch (err: any) {
answer.status = ExecuteResponseStatus.Exception;
answer.errorMessage = err.message;
}
return answer;
}
async function ___handleSystemFunction(request: FunctionRequest): Promise<FunctionResponse> {
let handler = systemHandlers[request.eventName];
if (handler == null) {
return {
status: ExecuteResponseStatus.FunctionNameNotFound,
result: null,
request: null,
errorMessage: null,
};
}
let answer: FunctionResponse = {
status: ExecuteResponseStatus.Ok,
errorMessage: null,
result: null,
request: null,
};
try {
await handler(request.log);
} catch (err: any) {
answer.status = ExecuteResponseStatus.Exception;
answer.errorMessage = err.message;
}
return answer;
}
async function ___handleEventFunction(request: FunctionRequest): Promise<FunctionResponse> {
let handler = eventHandlers[request.eventName];
if (handler == null) {
return {
status: ExecuteResponseStatus.FunctionNameNotFound,
result: null,
request: null,
errorMessage: null,
};
}
let answer: FunctionResponse = {
status: ExecuteResponseStatus.Ok,
errorMessage: null,
result: null,
request: null,
};
try {
await handler(request.request.request, request.request.operationEvent, request.log);
let operationEvent = request.request.operationEvent;
answer.result = {
returnCode: operationEvent.getEventCode(),
debugMessage: null as any,
parameters: operationEvent.getParameters()?.toData(),
};
answer.request = request.request.request;
} catch (err: any) {
answer.status = ExecuteResponseStatus.Exception;
answer.errorMessage = err.message;
}
return answer;
}
async function ___handlePreFunction(request: FunctionRequest): Promise<FunctionResponse> {
let handler = preHandlers[request.eventName];
if (handler == null) {
return {
status: ExecuteResponseStatus.FunctionNameNotFound,
result: null,
request: null,
errorMessage: null,
};
}
let answer: FunctionResponse = {
status: ExecuteResponseStatus.Ok,
errorMessage: null,
result: null,
request: null,
};
try {
let result = await handler(request.request, request.secretInfo, request.operationRequest, request.log);
if (result != null)
answer.result = {
returnCode: result.getReturnCode(),
debugMessage: result.getDebugMessage(),
parameters: result.getParameters()?.toData(),
};
answer.request = request.request;
} catch (err: any) {
answer.status = ExecuteResponseStatus.Exception;
answer.errorMessage = err.message;
}
return answer;
}
async function ___handlePostFunction(request: FunctionRequest): Promise<FunctionResponse> {
let handler = postHandlers[request.eventName];
if (handler == null) {
return {
status: ExecuteResponseStatus.FunctionNameNotFound,
result: null,
errorMessage: null,
request: null,
};
}
let answer: FunctionResponse = {
status: ExecuteResponseStatus.Ok,
errorMessage: null,
result: null,
request: null,
};
try {
let result = await handler(request.request, request.secretInfo, request.operationRequest, request.operationResponse as any, request.log);
if (result) {
answer.result = {
returnCode: result.getReturnCode(),
debugMessage: result.getDebugMessage(),
parameters: result.getParameters()?.toData(),
};
}
} catch (err: any) {
answer.status = ExecuteResponseStatus.Exception;
answer.errorMessage = err.message;
}
return answer;
}
{
let gnServerSettingsOptions: GNServerSettingsOptions = JSON.parse(process.env.gnServerSettingsOptions ?? "");
let gnServerSettings = new GNServerSettings();
gnServerSettings.config(gnServerSettingsOptions);
GNNetwork.init(gnServerSettings);
}
const admin = new CloudScriptAdmin();
const database = new CloudScriptDatabase();
const http = new CloudScriptHttp();
const socket = new CloudScriptSocket();
const matchmaking = new CloudScriptMatchmaking();
const mail = new CloudScriptMail();
const pushNotification = new CloudScriptPushNotification();
{
let dbConnection = JSON.parse(process.env.dbConnection ?? "");
database.init(dbConnection.url, dbConnection.dbName, dbConnection.logUrl, dbConnection.logDbName, dbConnection.options);
}
process.env.dbConnection = "";
process.env.gnServerSettingsOptions = "";
const preHandlers: Record<string, (request: any, secretInfo: SecretInfo, operationRequest: OperationRequest, log: (log: any) => void) => Promise<OperationResponse | null>> = {};
const postHandlers: Record<string, (request: any, secretInfo: SecretInfo, operationRequest: OperationRequest, operationResponse: OperationResponse, log: (log: any) => void) => Promise<OperationResponse>> = {};
const systemHandlers: Record<string, (log: (log: any) => void) => Promise<void>> = {};
const eventHandlers: Record<string, (request: any, operationEvent: OperationEvent, log: (log: any) => void) => Promise<void>> = {};
const systemMatchmakingHandlers: Record<string, (gameId: string, matchmakingTicketCanMatch: MatchmakingTicketCanMatch, log: (log: any) => void) => Promise<{ success: boolean }>> = {};
const systemAuthenticateHandlers: Record<string, (request: { userId: string, ipAddress: string, isNewUser: boolean, authenticationType: string }, secretInfo: SecretInfo, operationRequest: OperationRequest, operationResponse: OperationResponse, log: (log: any) => void) => Promise<OperationResponse>> = {};
const systemGenericServiceHandlers: Record<string, (serviceName: string, serviceData: { [k: string]: any; }, log: (log: any) => void) => Promise<{ success: boolean, serviceId: string, someDatas?: any, errorMessage?: string }>> = {};
//$replaceScript