table BinAttr {
	id:uint16;
	data:[uint8];
}

table IntAttr {
	id:uint16;
	num:uint32;
}

table RoomMemberBinAttrInternal {
	updateDate:uint64;
	data:BinAttr;
}

table BinAttrInternal {
	updateDate:uint64;
	updateMemberId:uint16;
	data:BinAttr;
}

table OptParam {
	type:uint8;
	flag:uint8;
	hubMemberId:uint16 ;
}

table GroupConfig {
	slotNum:uint32;
	withLabel:bool;
	label:[uint8];
	withPassword:bool;
}

table UserInfo2 {
	npId:string;
	onlineName:string;
	avatarUrl:string;
}

table RoomMemberDataInternal {
	userInfo:UserInfo2;
	joinDate:uint64;
	memberId:uint16;
	teamId:uint8;
	roomGroup:RoomGroup;
	natType:uint8;
	flagAttr:uint32;
	roomMemberBinAttrInternal:[RoomMemberBinAttrInternal];
}

table RoomGroup {
	groupId:uint8;
	withPassword:bool;
	withLabel:bool;
	label:[uint8];
	slotNum:uint32;
	curGroupMemberNum:uint32;
}

table RoomDataInternal {
	serverId:uint16;
	worldId:uint32;
	lobbyId:uint64;
	roomId:uint64;
	passwordSlotMask:uint64;
	maxSlot:uint32;
	memberList:[RoomMemberDataInternal];
	ownerId:uint16;
	roomGroup:[RoomGroup];
	flagAttr:uint32;
	roomBinAttrInternal:[BinAttrInternal];
}

table RoomDataExternal {
	serverId:uint16;
	worldId:uint32;
	publicSlotNum:uint16;
	privateSlotNum:uint16;
	lobbyId:uint64;
	roomId:uint64;
	openPublicSlotNum:uint16;
	maxSlot:uint16;
	openPrivateSlotNum:uint16;
	curMemberNum:uint16;
	passwordSlotMask:uint64;
	owner:UserInfo2;
	roomGroup:[RoomGroup];
	flagAttr:uint32;
	roomSearchableIntAttrExternal:[IntAttr];
	roomSearchableBinAttrExternal:[BinAttr];
	roomBinAttrExternal:[BinAttr];
}

table IntSearchFilter {
	searchOperator:uint8;
	attr:IntAttr;
}

table BinSearchFilter {
	searchOperator:uint8;
	attr:BinAttr;
}

table PresenceOptionData {
	data:[uint8];
	len:uint32;
}

table RoomGroupPasswordConfig {
	groupId:[uint8];
	withPassword:bool;
}

table SearchRoomRequest {
	option:int32;
	worldId:uint32;
	lobbyId:uint64;
	rangeFilter_startIndex:uint32;
	rangeFilter_max:uint32;
	flagFilter:uint32;
	flagAttr:uint32;
	intFilter:[IntSearchFilter];
	binFilter:[BinSearchFilter];
	attrId:[uint16];
}

table SearchRoomResponse {
	startIndex:uint32;
	total:uint32;
	size:uint32;
	rooms:[RoomDataExternal];
}

table CreateJoinRoomRequest {
	worldId:uint32;
	lobbyId:uint64;
	maxSlot:uint32;
	flagAttr:uint32;
	roomBinAttrInternal:[BinAttr];
	roomSearchableIntAttrExternal:[IntAttr];
	roomSearchableBinAttrExternal:[BinAttr];
	roomBinAttrExternal:[BinAttr];
	roomPassword:[uint8];
	groupConfig:[GroupConfig];
	passwordSlotMask:uint64;
	allowedUser:[string];
	blockedUser:[string];

	joinRoomGroupLabel:[uint8];
	roomMemberBinAttrInternal:[BinAttr];
	teamId:uint8;
	sigOptParam:OptParam;
}

table JoinRoomRequest {
	roomId:uint64;
	roomPassword:[uint8];
	joinRoomGroupLabel:[uint8];
	roomMemberBinAttrInternal:[BinAttr];
	optData:PresenceOptionData;
	teamId:uint8;
}

table LeaveRoomRequest {
	roomId:uint64;
	optData:PresenceOptionData;
}

table GetRoomDataExternalListRequest {
	roomIds:[uint64];
	attrIds:[uint16];
}

table GetRoomDataExternalListResponse {
	rooms:[RoomDataExternal];
}

table SetRoomDataExternalRequest {
	roomId:uint64;
	roomSearchableIntAttrExternal:[IntAttr];
	roomSearchableBinAttrExternal:[BinAttr];
	roomBinAttrExternal:[BinAttr];
}

table SetRoomDataInternalRequest {
	roomId:uint64;
	flagFilter:uint32;
	flagAttr:uint32;
	roomBinAttrInternal:[BinAttr];
	passwordConfig:[RoomGroupPasswordConfig];
	passwordSlotMask:uint64;
	ownerPrivilegeRank:[uint16];
}

table GetRoomMemberDataInternalRequest {
	roomId:uint64;
	memberId:uint16;
	attrId:[uint16];
}

table SetRoomMemberDataInternalRequest {
	roomId:uint64;
	memberId:uint16;
	teamId:uint8;
	roomMemberBinAttrInternal:[BinAttr];
}

table SetUserInfo {
	serverId:uint16;
	userBinAttr:[BinAttr];
}

table GetRoomDataInternalRequest {
	roomId:uint64;
	attrId:[uint16];
}

table RoomMemberUpdateInfo {
	roomMemberDataInternal:RoomMemberDataInternal;
	eventCause:uint8;
	optData:PresenceOptionData;
}

table RoomUpdateInfo {
	eventCause:uint8;
	errorCode:int32;
	optData:PresenceOptionData;
}

table RoomDataInternalUpdateInfo {
	newRoomDataInternal:RoomDataInternal;
	prevFlagAttr:uint32;
	prevRoomPasswordSlotMask:uint64;
	newRoomGroup:[uint8];
	newRoomBinAttrInternal:[uint16];
}

table RoomMemberDataInternalUpdateInfo {
	newRoomMemberDataInternal:RoomMemberDataInternal;
	prevFlagAttr:uint32;
	prevTeamId:uint8;
	newRoomMemberBinAttrInternal:[uint16];
}

table GetPingInfoResponse {
	serverId:uint16;
	worldId:uint32;
	roomId:uint64;
	rtt:uint32;
}

table SendRoomMessageRequest {
	roomId:uint64;
	castType:uint8;
	dst:[uint16];
	msg:[uint8];
	option:uint8;
}

table RoomMessageInfo {
	filtered:bool;
	castType:uint8;
	dst:[uint16];
	srcMember:UserInfo2;
	msg:[uint8];
}

table MessageDetails {
	communicationId:string;
	msgId:uint64;
	mainType:uint16;
	subType:uint16;
	msgFeatures:uint32;
	subject:string;
	body:string;
	data:[uint8];
}

table SendMessageRequest {
	message:[uint8] (nested_flatbuffer: "MessageDetails");
	npids:[string];
}

table BoardInfo {
	rankLimit:uint32;
	updateMode:uint32;
	sortMode:uint32;
	uploadNumLimit:uint32;
	uploadSizeLimit:uint32;
}

table RecordScoreRequest {
	boardId:uint32;
	pcId:int32;
	score:int64;
	comment:string;
	data:[uint8];
}

table GetScoreRangeRequest {
	boardId:uint32;
	startRank:uint32;
	numRanks:uint32;
	withComment:bool;
	withGameInfo:bool;
}

table ScoreNpIdPcId {
	npid:string;
	pcId:int32;
}

table GetScoreNpIdRequest {
	boardId:uint32;
	npids:[ScoreNpIdPcId];
	withComment:bool;
	withGameInfo:bool;
}

table GetScoreFriendsRequest {
	boardId:uint32;
	include_self:bool;
	max:uint32;
	withComment:bool;
	withGameInfo:bool;
}

table ScoreRankData {
	npId:string;
	onlineName:string;
	pcId:int32;
	rank:uint32;
	score:int64;
	hasGameData:bool;
	recordDate:uint64;
}

table ScoreInfo {
	data:[uint8];
}

table GetScoreResponse {
	rankArray:[ScoreRankData];
	commentArray:[string];
	infoArray:[ScoreInfo];
	lastSortDate:uint64;
	totalRecord:uint32;
}

table RecordScoreGameDataRequest {
	boardId:uint32;
	pcId:int32;
	score:int64;
}

table GetScoreGameDataRequest {
	boardId:uint32;
	npId:string;
	pcId:int32;
}

table TusUser {
	vuser:bool;
	npid:string;
}

table TusVariable {
	ownerId:string;
	hasData:bool;
	lastChangedDate:uint64;
	lastChangedAuthorId:string;
	variable:int64;
	oldVariable:int64;
}

table TusVarResponse {
	vars:[TusVariable];
}

table TusSetMultiSlotVariableRequest {
	user:TusUser;
	slotIdArray:[int32];
	variableArray:[int64];
}

table TusGetMultiSlotVariableRequest {
	user:TusUser;
	slotIdArray:[int32];
}

table TusGetMultiUserVariableRequest {
	users:[TusUser];
	slotId:int32;
}

table TusGetFriendsVariableRequest {
	slotId:int32;
	includeSelf:bool;
	sortType:int32;
	arrayNum:uint32;
}

table TusAddAndGetVariableRequest {
	user:TusUser;
	slotId:int32;
	inVariable:int64;
	isLastChangedDate:[uint64];
	isLastChangedAuthorId:string;
}

table TusTryAndSetVariableRequest {
	user:TusUser;
	slotId:int32;
	opeType:int32;
	variable:int64;
	isLastChangedDate:[uint64];
	isLastChangedAuthorId:string;
	compareValue:[int64];
}

table TusDeleteMultiSlotVariableRequest {
	user:TusUser;
	slotIdArray:[int32];
}

table TusSetDataRequest {
	user:TusUser;
	slotId:int32;
	data:[uint8];
	info:[uint8];
	isLastChangedDate:[uint64];
	isLastChangedAuthorId:string;
}

table TusDataStatus {
	ownerId:string;
	hasData:bool;
	lastChangedDate:uint64;
	lastChangedAuthorId:string;
	info:[uint8];
}

table TusData {
	status: TusDataStatus;
	data:[uint8];
}

table TusDataStatusResponse {
	status: [TusDataStatus];
}

table TusGetDataRequest {
	user:TusUser;
	slotId:int32;
}

table TusGetMultiSlotDataStatusRequest {
	user:TusUser;
	slotIdArray:[int32];
}

table TusGetMultiUserDataStatusRequest {
	users:[TusUser];
	slotId:int32;
}

table TusGetFriendsDataStatusRequest {
	slotId:int32;
	includeSelf:bool;
	sortType:int32;
	arrayNum:uint32;	
}

table TusDeleteMultiSlotDataRequest {
	user:TusUser;
	slotIdArray:[int32];
}

table SetPresenceRequest {
	title:string;
	status:string;
	comment:string;
	data:[uint8];
}
