开发指南
引入方式
- Unity
- UE
"com.xd.sdk.report": "6.27.0"
在 *.Build.cs 文件中添加举报模块依赖
PrivateDependencyModuleNames.Add("XDGReport");
举报
- Unity
- UE
var reporter = new ReportParams.ReporterInfo(new Dictionary<string, object>
{
// 举报者附加信息,e.g.:
{ "reporter_role_id", "举报人游戏角色id" },
{ "reporter_role_name", "举报人游戏角色名称" },
{ "reporter_server_code", "举报人所在服务器" }
});
var reportee = new ReportParams.ReporteeInfo(xdid, new Dictionary<string, object>
{
// 被举报者附加信息,e.g.:
{ "reportee_role_id", "被举报人游戏角色id" },
{ "reportee_role_name", "被举报人游戏角色名称" },
{ "reportee_server_code", "被举报人所在服务器" }
});
var reasons = new List<ReportParams.ReasonInfo>
{
new ReportParams.ReasonInfo(1, "言语辱骂", new Dictionary<string, object>
{
// 举报原因附加信息,e.g.:
{"photo_urls_str", "https://www.xd.cn/1.png"},
{"chat_content", "不知道SB"},
{"chat_history", new List<Dictionary<string, object>>()
{
new Dictionary<string, object>()
{
{"xdid", "{user_xdid}"},
{"pid", "{user_pid}"},
{"nickname", "叫吗"},
{"chat_content", "来我家干嘛<#04><#04><#04>"},
{"timestamp", 1746566259},
{"is_report", false}
},
new Dictionary<string, object>()
{
{"xdid", "{user_xdid}"},
{"pid", "{user_pid}"},
{"nickname", "骂我就cpdd"},
{"chat_content", "不知道SB"},
{"timestamp", 1746566267},
{"is_report", false}
}
}),
new ReportParams.ReasonInfo(2, "使用外挂", new Dictionary<string, object>
{
// 举报原因附加信息,e.g.:
{"photo_urls_str", "https://www.xd.cn/1.png|https://www.xd.cn/2.png"} // 多张图片用 | 分割
})
};
var evidenceList = new List<string>
{
"{PC 文件绝对路径}",
"{Android 文件绝对路径}",
"{iOS 文件绝对路径"
};
var reportParams = new ReportParams.Builder()
.SetReporter(reporter)
.SetReportee(reportee)
.SetReasons(reasons)
.SetUserDescription("这个人不仅使用外挂打游戏,还言语辱骂队友!!!我要举报 TA!")
.SetEvidenceList(evidenceList)
.SetExtras(new Dictionary<string, object>
{
// 举报附加信息,e.g.:
{"roleId", "gameRoleId"},
{"userLevel", 100}
})
.Build();
XD.SDK.Report.XDGReport.Report(reportParams, result => {
if (result.Success)
{
Console.WriteLine("Report successfully");
}
else
{
Console.WriteLine($"Report failed: {result.XdException?.error_msg}");
}
});
FReportParam Param;
Param.Reporter.Extras = MakeShared<FJsonObject>(); // 举报者的额外数据
Param.Reporter.Extras->SetStringField(TEXT("reporter_role_id"), TEXT("举报人游戏角色id"));
Param.Reporter.Extras->SetStringField(TEXT("reporter_role_name"), TEXT("举报人游戏角色名称"));
Param.Reporter.Extras->SetStringField(TEXT("reporter_server_code"), TEXT("举报人所在服务器"));
Param.Target.XDID = TEXT("被举报者的XDID"); // 被举报者的XDID
Param.Target.Extras = MakeShared<FJsonObject>(); // 被举报者的额外数据
Param.Target.Extras->SetStringField(TEXT("reportee_role_id"), TEXT("被举报人游戏角色id"));
Param.Target.Extras->SetStringField(TEXT("reportee_role_name"), TEXT("被举报人游戏角色名称"));
Param.Target.Extras->SetStringField(TEXT("reportee_server_code"), TEXT("被举报人所在服务器"));
FReportReason& NewReason = Param.Reasons.AddDefaulted_GetRef(); // 添加一个新的举报原因
NewReason.ID = 1; // 举报原因ID
NewReason.Title = TEXT("言语辱骂");
NewReason.Extras = MakeShared<FJsonObject>(); // 每一个举报原因的额外数据
NewReason.Extras->SetField(TEXT("Messages"), FXDGJson::ToJsonValue(TArray<FString>{TEXT("聊天记录1"), TEXT("聊天记录2")}));
NewReason.Extras->SetStringField(TEXT("photo_urls_str"), TEXT("https://www.xd.cn/1.png")); // 单张图片;多张图片用 | 分割
NewReason.Extras->SetStringField(TEXT("chat_content"), TEXT("骂我就cpdd")); // 当前消息内容(字符串,表示本条消息的文本内容)
TArray<TSharedPtr<FJsonValue>> ChatHistoryArray;
TSharedPtr<FJsonObject> ChatEntry1 = MakeShared<FJsonObject>();
ChatEntry1->SetStringField(TEXT("xdid"), TEXT("{user_xdid}")); // 用户XDID
ChatEntry1->SetStringField(TEXT("pid"), TEXT("{user_pid}")); // 用户角色ID
ChatEntry1->SetStringField(TEXT("nickname"), TEXT("叫吗")); //
ChatEntry1->SetStringField(TEXT("chat_content"), TEXT("来我家干嘛<#04><#04><#04>"));
ChatEntry1->SetNumberField(TEXT("timestamp"), 1746566259);
ChatEntry1->SetBoolField(TEXT("is_report"), false);
ChatHistoryArray.Add(MakeShared<FJsonValueObject>(ChatEntry1));
...
NewReason.Extras->SetArrayField(TEXT("chat_history"), ChatHistoryArray); // 聊天历史(数组,包含若干条历史消息,不超过10条)
FReportReason& NewReason2 = Param.Reasons.AddDefaulted_GetRef(); // 添加一个新的举报原因
NewReason2.ID = 2; // 举报原因ID
NewReason2.Title = TEXT("使用外挂");
NewReason2.Extras = MakeShared<FJsonObject>(); // 每一个举报原因的额外数据
NewReason2.Extras->SetStringField(TEXT("Subtype"), TEXT("透视"));
NewReason2.Extras->SetStringField(TEXT("photo_urls_str"), TEXT("https://www.xd.cn/1.png"));
Param.UserDescription = TEXT("举报描述"); // 举报描述
Param.EvidenceFilePaths.Add(TEXT("PC支持相对路径和绝对路径")); // 举报证据文件路径
Param.EvidenceFilePaths.Add(TEXT("Mobile支持沙盒路径和相册路径")); // 传递给 IHttpRequest::SetContentFromStream
// Param.Extras; 所有 Extras 可以为空,默认为空
FXDGReport::Report(Param,
FSimpleDelegate::CreateLambda([]()
{
// 举报成功
}),
FXDGError::FDelegate::CreateLambda([](const FXDGError& Error)
{
// 举报失败
}));
数据结构定义
- Unity
- UE
public class ReportParams
{
public ReporterInfo Reporter { get; } // 举报人
public ReporteeInfo Reportee { get; } // 被举报人
public List<ReasonInfo> Reasons { get; } // 举报原因
public string UserDescription { get; } // 玩家描述
public List<string> EvidenceList { get; } // 玩家添加的附件(本地文件绝对路径)
public Dictionary<string, object> Extras { get; } // 附加信息补充玩家信息,透传给使用方
public class ReporterInfo
{
public Dictionary<string, object> Extras { get; } // 举报人附加信息
}
public class ReporteeInfo
{
public string XdId { get; } // 被举报人 XDID
public Dictionary<string, object> Extras { get; } // 被举报人附加信息
}
public class ReasonInfo
{
public long ID { get; } // 举报原因 ID,后台配置
public string Title { get; } // 原因名称
public Dictionary<string, object> Extras { get; } // 附加信息补充玩家信息,透传给使用方
}
}
/**
* 举报者
*/
struct XDGREPORT_API FReportUser
{
/** 业务方用户自身需求补充的玩家信息,透传给后端 */
TSharedPtr<FJsonObject> Extras;
};
/**
* 被举报者
*/
struct XDGREPORT_API FReportTargetUser
{
/** [必须] 举报方的XDID */
FString XDID;
/** 业务方用户自身需求补充的玩家信息,透传给后端 */
TSharedPtr<FJsonObject> Extras;
};
/**
* 举报原因
*/
struct XDGREPORT_API FReportReason
{
/** [必须] 业务方在举报后台配置的原因id */
int64 ID = -1;
/** 原因名称 */
FString Title;
/** 业务方用户自身需求补充的玩家信息,透传给后端 */
TSharedPtr<FJsonObject> Extras;
};
/**
* 举报的参数
*/
struct XDGREPORT_API FReportParam
{
/** 举报者 */
FReportUser Reporter;
/** [必须] 被举报者 */
FReportTargetUser Target;
/** [必须] 原因 */
TArray<FReportReason> Reasons;
/** 玩家描述 */
FString UserDescription;
/** 文件路径,支持图片,视频 */
TArray<FString> EvidenceFilePaths;
/** 业务方用户自身需求补充的玩家信息,透传给后端 */
TSharedPtr<FJsonObject> Extras;
};
附加信息格式标准
举报原因
数据字段字段声明:
photo_urls_str: 图片地址,多张图片用`|`分割
- Unity
- UE
var reasons = new List<ReportParams.ReasonInfo>
{
new ReportParams.ReasonInfo(1, "言语辱骂", new Dictionary<string, object>
{
// 举报原因附加信息,e.g.:
// 单张图片
{"photo_urls_str", "https://www.xd.cn/1.png"}
}),
new ReportParams.ReasonInfo(2, "使用外挂", new Dictionary<string, object>
{
// 举报原因附加信息,e.g.:
// 多张图片用 | 分割
{"photo_urls_str", "https://www.xd.cn/1.png|https://www.xd.cn/2.png"}
})
};
FReportReason& NewReason = Param.Reasons.AddDefaulted_GetRef(); // 添加一个新的举报原因
NewReason.ID = 1; // 举报原因ID
NewReason.Title = TEXT("言语辱骂");
NewReason.Extras = MakeShared<FJsonObject>(); // 每一个举报原因的额外数据
NewReason.Extras->SetStringField(TEXT("photo_urls_str"), TEXT("https://www.xd.cn/1.png")); // 单张图片
FReportReason& NewReason2 = Param.Reasons.AddDefaulted_GetRef(); // 添加一个新的举报原因
NewReason2.ID = 2; // 举报原因ID
NewReason2.Title = TEXT("使用外挂");
NewReason2.Extras = MakeShared<FJsonObject>(); // 每一个举报原因的额外数据
NewReason2.Extras->SetStringField(TEXT("photo_urls_str"), TEXT("https://www.xd.cn/1.png|https://www.xd.cn/2.png")); // 多张图片用 | 分割
聊天记录
数据格式字段声明:
字段说明:
chat_content:当前消息内容(字符串,表示本条消息的文本内容)
chat_history:聊天历史(数组,包含若干条历史消息,不超过10条,每条消息结构如下)
├─ xdid:用户XDID
├─ pid:用户角色ID
├─ nickname:昵称(用户的显示名称)
├─ chat_content:聊天内容(该历史消息的文本内容)
├─ timestamp:时间戳(消息发送时间,单位为秒,Unix时间戳)
└─ is_report:是否被举报,标记哪条被举报(布尔值,true 表示被举报,false 表示未被举报)
- Unity
- UE
var reportParams = new ReportParams.Builder()
// ... 其他构造参数请参考「举报」部分
.SetReasons(new List<ReportParams.ReasonInfo>
{
new ReportParams.ReasonInfo(1, "言语辱骂", new Dictionary<string, object>
{
// 举报原因附加信息,e.g.:
{ "photo_urls_str", "https://www.xd.cn/1.png" },
{ "chat_content", "不知道SB" },
{
"chat_history", new List<Dictionary<string, object>>
{
new Dictionary<string, object>
{
{"xdid", "{user_xdid}"},
{"pid", "{user_pid}"},
{"nickname", "叫吗"},
{"chat_content", "来我家干嘛<#04><#04><#04>"},
{"timestamp", 1746566259},
{"is_report", false}
},
new Dictionary<string, object>()
{
{ "xdid", "{user_xdid}" },
{ "pid", "{user_pid}" },
{ "nickname", "叫吗" },
{ "chat_content", "来我家干嘛<#04><#04><#04>" },
{ "timestamp", 1746566259 },
{ "is_report", false }
}
}
}
})
})
.Build();
FReportParam Param;
// ... 其他构造参数请参考「举报」部分
FReportReason& NewReason = Param.Reasons.AddDefaulted_GetRef();
NewReason.ID = 1; // 举报原因ID
NewReason.Title = TEXT("言语辱骂");
NewReason.Extras = MakeShared<FJsonObject>(); // 每一个举报原因的额外数据
NewReason.Extras->SetField(TEXT("Messages"), FXDGJson::ToJsonValue(TArray<FString>{TEXT("聊天记录1"), TEXT("聊天记录2")}));
NewReason.Extras->SetStringField(TEXT("photo_urls_str"), TEXT("https://www.xd.cn/1.png")); // 单张图片;多张图片用 | 分割
NewReason.Extras->SetStringField(TEXT("chat_content"), TEXT("骂我就cpdd"));
TArray<TSharedPtr<FJsonValue>> ChatHistoryArray;
TSharedPtr<FJsonObject> ChatEntry1 = MakeShared<FJsonObject>();
ChatEntry1->SetStringField(TEXT("xdid"), TEXT("{user_xdid}")); // 用户XDID
ChatEntry1->SetStringField(TEXT("pid"), TEXT("{user_pid}")); // 用户角色ID
ChatEntry1->SetStringField(TEXT("nickname"), TEXT("叫吗")); //
ChatEntry1->SetStringField(TEXT("chat_content"), TEXT("来我家干嘛<#04><#04><#04>"));
ChatEntry1->SetNumberField(TEXT("timestamp"), 1746566259);
ChatEntry1->SetBoolField(TEXT("is_report"), false);
ChatHistoryArray.Add(MakeShared<FJsonValueObject>(ChatEntry1));
...
NewReason.Extras->SetArrayField(TEXT("chat_history"), ChatHistoryArray);