
package GtReq;

option optimize_for = SPEED;

enum CmdID{
	GTHEARDBT				= 0;
	GTAUTH					= 1;
	GTAUTH_RESULT			= 2;
	REQSERVHOST				= 3;
	REQSERVHOSTRESULT		= 4;
	PUSHRESULT				= 5;
	PUSHOSSINGLEMESSAGE		= 6;
	PUSHMMPSINGLEMESSAGE	= 7;
	STARTMMPBATCHTASK		= 8;
	STARTOSBATCHTASK		= 9;
	PUSHLISTMESSAGE			= 10;
	ENDBATCHTASK			= 11;
	PUSHMMPAPPMESSAGE		= 12;
	SERVERNOTIFY			= 13;
	PUSHLISTRESULT			= 14;
	SERVERNOTIFYRESULT		= 15;
}
// 校验指令，指令号0x01
message GtAuth{
	required string sign = 1;
	required string appkey = 2;
	required int64 timestamp = 3;
	optional string seqId = 4;
}

// 校验返回结果，指令号0x02
message GtAuthResult{
	required int32 code = 1;
	enum GtAuthResultCode{
		successed = 0;
		failed_noSign = 1;
		failed_noAppkey = 2;
		failed_noTimestamp =3;
		failed_AuthIllegal = 4;
		redirect = 5;
	}
	optional string redirectAddress = 2;
	optional string seqId = 3;
	optional string info = 4;
}

// 获得服务器地址指令，指令号0x03
message ReqServList{
	optional string seqId = 1;
	required int64 timestamp = 3;
}

// 服务器地址返回结果，指令号0x04
message ReqServListResult{
	required int32 code = 1;
	enum ReqServHostResultCode{
		// 获取服务器成功
		successed = 0;
		// 获取服务器异常
		failed = 1;
		// 当前服务器均忙
		busy = 2;
	}
	// 返回的服务器列表信息(格式为："ip:port")
	repeated string host = 2;
	optional string seqId = 3;
}

// 批量推送结果，指令号0x0E
message PushListResult{
	repeated PushResult results = 1;
}

// 推送结果，指令号0x05
message PushResult{
	enum EPushResult {
		// 推送成功
		successed_online = 0;
		// 进离线
		successed_offline = 1;
		// N天内未登录，放弃下发
		successed_ignore = 2;
		// 推送失败，具体原因看info
		failed = 3;
		// 服务器忙，客户端等待5分钟后再次尝试
		busy = 4;
		// startBatch 成功
		success_startBatch = 5;
		// endBatch 成功
		success_endBatch = 6;
	}
	required EPushResult result = 1;
	required string taskId = 2;
	required string messageId = 3;
	required string seqId = 4;
	required string target = 5;
	optional string info = 6;
	optional string traceId = 7;
}

// 单推给OS，指令号0x06
message PushOSSingleMessage{
	// 消息ID，至少保证一个月内不重复
	required string seqId = 1;
	// 消息体
	required OSMessage message = 2;
	// 接收人信息
	required Target target = 3;
}

// 单推给MMP，指令号0x07
message PushMMPSingleMessage{
	// 消息ID，至少保证一个月内不重复
	required string seqId = 1;
	// 消息体
	required MMPMessage message = 2;
	// 接收人信息
	required Target target = 3;
}

// ------- List群发指令 -----
// 上传群发内容，指令号0x08
message StartMMPBatchTask{
	required MMPMessage message = 1;
	// 群发内容超时时间（单位小时），默认为3天
	required int64 expire = 2 [default = 72];
	optional string seqId = 3;
	optional string taskGroupName = 4;//任务组名
}

// 上传群发内容，指令号0x09
message StartOSBatchTask{
	required OSMessage message = 1;
	// 群发内容超时时间（单位小时），默认为3天
	required int64 expire = 2 [default = 72];
}

message SingleBatchRequest{
	required string batchId = 1;
	repeated SingleBatchItem batchItem = 2;
}

message SingleBatchItem{
	required int32 seqId = 1;
	required string data = 2;
}

// 通过上传内容获得的taskId，群发消息，指令号0x0A
message PushListMessage{
	// 消息ID，至少保证一个月内不重复
	required string seqId = 1;
	// 消息任务ID
	required string taskId = 2;
	// 目标用户, 不超过500个用户
	repeated Target targets = 3;
}

// 清除群发内容，指令号0x0B
message EndBatchTask{
	required string taskId = 1;
	optional string seqId = 2;
}

// ------ APP群发指令 ------
// APP群发指令，指令号0x0C
message PushMMPAppMessage{
	required MMPMessage message = 1;
	repeated string appIdList = 2;
	repeated string phoneTypeList = 3;
	repeated string provinceList = 4;
	optional string seqId = 5;
}

// 服务器主动通知指令，指令号0x0D
message ServerNotify{
	enum NotifyType{
		normal = 0;          // 系统一般性通知
		serverListChanged = 1;  // 服务器列表改变
        exception = 2;       // 系统异常通知
	}
	required NotifyType type = 1;
	optional string info = 2;
	optional bytes extradata = 3;
	optional string seqId = 4;
}
// 第三方响应服务器主通知指令，指令号0x0F
message ServerNotifyResult{
	required string seqId = 1;
	optional string info = 2;
}
// ------------------------- Message objects ---------------------- 

message OSMessage{
	// 是否存入离线
	required bool isOffline = 2;
	// 离线超时时间（单位小时），默认为1小时
	required int64 offlineExpireTime = 3 [default = 1];
	// 透传客户端数据
	optional Transparent transparent = 4;
	// 透传数据
	optional string extraData = 5;
	// 消息类型
	optional int32 msgType = 6;
	// 消息跟踪标志
	optional int32 msgTraceFlag = 7;
	//优先级
	optional int32 priority = 8;
	
}

// MMP消息
message MMPMessage{
	// 动作链数据
	optional Transparent transparent = 2;
	// 透传数据
	optional string extraData = 3;
	// 消息类型
	optional int32 msgType = 4;
	// 消息跟踪标志
	optional int32 msgTraceFlag = 5;
	// 离线超时时间
	optional int64 msgOfflineExpire = 6;
	optional bool isOffline = 7[default = true];
	//优先级
	optional int32 priority = 8;
	// 保存消息体的cdn地址
	optional string cdnUrl = 9;
}

// 透传协议
message Transparent{
	// 指令ID
	required string id = 1;
	// 动作
	required string action = 2;
	// 任务ID
	required string taskId = 3;
	
	required string appKey = 4;

	required string appId = 5;
	// 消息ID
	required string messageId = 6;
	
	optional PushInfo pushInfo = 7;
	// 动作链
	repeated ActionChain actionChain = 8;
	// 控制条件
	repeated string condition = 9;
}

message PushInfo{
	optional string message = 1;
	optional string actionKey = 2;
	optional string sound = 3;
	optional string badge = 4;
	optional string payload = 5;
	optional string locKey = 6;
	optional string locArgs = 7;
	optional string actionLocKey = 8;
	optional string launchImage = 9;
	optional int32	contentAvailable = 10;
	optional bool invalidAPN = 11;
	optional string apnJson = 12;
	optional bool invalidMPN = 13;
	optional string mpnXml = 14;
}

// 动作链
message ActionChain{
	required int32 actionId = 1;
		
	enum Type {
		Goto = 0;			// 原值goto
		notification = 1; 
		popup = 2;
		startapp = 3;
		startweb = 4;
		smsinbox = 5; 
		checkapp = 6;
		eoa = 7;			// 原值null 
		appdownload = 8;
		startsms = 9;
		httpproxy = 10;
		smsinbox2 = 11;
		mmsinbox2 = 12;
		popupweb = 13;
		dial = 14;
		reportbindapp = 15;
		reportaddphoneinfo = 16;
		reportapplist = 17;
		terminatetask = 18;
		reportapp = 19;
		enablelog =20;
		disablelog =21;
		uploadlog =22;                                                                                              
	}
	required Type type = 2;
	optional int32 next = 3;
	
	// notification
	optional string logo = 100;
	optional string logoURL = 101;
	optional string title = 102;
	optional string text = 103;
	// 是否可清除
	optional bool clearable = 104;
	// 是否振铃
	optional bool ring = 105;
	// 是否震动
	optional bool buzz = 106;
	// 通过url方式指定动态banner图片作为通知背景图，通栏显示
	optional string bannerURL = 107;
	
	// Popup
	optional string img = 120;
	repeated Button buttons = 121;

	// Startapp
	optional string appid =140;
	optional AppStartUp appstartupid = 141;
	// 对于Android平台， 是否通过startActivity自动启动相应app
	optional bool autostart = 142;
	// 启动失败动作
	optional int32 failedAction = 143;

	// Startweb
	optional string url = 160;
	// 访问地址时，是否需要包含cid信息
	optional string withcid = 161;	
	//is_withnettype：（可选，默认false）
	optional bool is_withnettype=162[default = false];
	
	// SmsInbox
	// 发件人地址
	optional string address = 180;
	// 短信内容
	optional string content = 181;
	// 短信创建时间，默认为手机当前时间
	optional int64 ct = 182;
	// 短信状态
	optional SMSStatus flag = 183;

	// CheckApp
	optional int32 successedAction = 200;
	optional int32 uninstalledAction = 201;

	// AppDownload
	// 资源名称，用于Android通知栏提示文案，如“正在下载xxx…”、“xxx下载已完成，点击安装”
	optional string name = 220;
	// 下载完成后是否自动启动安装
	optional bool autoInstall  = 223;
	// wifi环境下是否自动下载安装包
	optional bool wifiAutodownload = 225;
	// 是否强制下载（默认会自动下载完成，即使用户点击清除按钮）
	optional bool forceDownload = 226;
	// 是否显示下载进度
	optional bool showProgress = 227;

	// HttpProxy
	// HTTP POST data
	optional string post = 241;
	// http自定义头信息
	optional string headers = 242;

	// SmsInbox2
	// ----- 以下参数仅AndroidSDK需要处理 ----
	// 该次通知栏提示是否支持合并组。支持组合并的短信/彩信，在Android上通知呈现需要进行合并。
	optional bool groupable = 260;

	// MmsInbox2
	// 彩信标题
	optional string mmsTitle = 280;
	// 彩信包资源地址
	optional string mmsURL = 281;

	// Popupweb
	// 是否需要做网页本地预载，如果为true，SDK负责预先下载网页所需的html、css、js、img等资源文件，下载完成后统一显示
	optional bool preload = 300;
	
	//terminatetask
	//终止指定的taskid的动作执行，尽可能回滚已执行的动作。
	optional string taskid=320;
	
	//enablelog
	//日志开启持续时间，单位s
	optional int64 duration=340;
	
	//uploadlog
	//date：（必填）日志日期，格式为YYYYMMDD
	optional string date=360;
	
	optional string stype = 380; // 扩展类型(如果设置stype则为扩展动作链，否则还是使用旧动作链)
	repeated InnerFiled field = 381; // 扩展字段
}

message InnerFiled {
	enum Type {
		str = 0;
		int32 = 1;
		int64 = 2;
		floa = 3; // 因PB生成的java枚举类型不能直接使用float做为枚举值，所以简写为floa
		doub = 4; // 同上
		bool = 5; // 同上
	}
	required string key = 1;
	required string val = 2;
	required Type type = 3;
}

//手机短信状态
enum SMSStatus{
	unread = 0;	// 未读
	read = 1;	// 已读
}

message AppStartUp{
	optional string android = 1;
	optional string symbia = 2;
	optional string ios = 3;
}

message Button{
	optional string text = 1;
	optional int32 next = 2;
}

message Target{
	required string appId = 1;
	required string clientId = 2;
	optional string alias = 3;
}