6
0

Compare commits

...

129 Commits

Author SHA1 Message Date
huangqz
b762daa17d 封装passport修改用户状态接口 2025-09-18 15:08:51 +08:00
huangqz
742c017988 短信新增常量 2025-09-17 15:55:42 +08:00
liguanjie
c81fa6be2c test(passport): 更新客户端测试用例和找回密码接口
- 修改了 ChangePassword 请求的密码参数
- 优化了测试用例的断言和日志输出
2025-09-11 18:09:29 +08:00
liguanjie
07bdfcb7b3 fix(response):修正响应格式判断条件 2025-09-11 17:33:21 +08:00
liguanjie
353e07b984 Merge branch 'master' into develop/lgj/resetPwd 2025-09-11 14:58:56 +08:00
c753415404 Merge branch 'develop/xuyang/pay' 2025-09-11 14:37:45 +08:00
liguanjie
743883792d feat(cs): 添加获取人工客服链接游戏配置功能
- 新增 GetLinkGameConfig 方法用于获取人工客服链接和游戏配置
2025-09-11 11:49:43 +08:00
huangqz
f31c37759b 修改数据类型 2025-09-11 11:19:03 +08:00
0e4cb0c4ad 投诉工单相关接口新增支付类型参数 2025-09-11 11:16:22 +08:00
liguanjie
ab3c9f33d0 feat(cs): 在热门 FAQ 结构中添加父级 ID 和标题字段 2025-09-10 15:32:31 +08:00
huangqz
e06a5867a7 Merge branch 'master' of https://golib.gaore.com/GaoreGo/gaore-common-sdk-go 2025-09-09 20:06:10 +08:00
huangqz
23d59fad11 新增userlive 新增、删除封禁规则缓存接口 2025-09-09 20:04:44 +08:00
89250bd328 投诉工单相关接口新增参数 2025-09-09 19:05:26 +08:00
liguanjie
90c2b1213a feat(passport): 添加用户修改密码功能并优化响应解析
- 新增 ChangePassword 方法支持用户修改密码- 添加 ChangePasswordRequest 和 ChangePasswordResponse 结构体
- 实现用户修改密码的请求创建和响应解析
- 优化 response.go 中的解析逻辑,支持 text 格式
- 更新 client_test.go 中的测试用例
2025-09-09 17:54:16 +08:00
huangqz
c8e5c19dc7 新增asdk踢人接口 2025-09-08 14:13:09 +08:00
huangqz
5d0ba49e7e 新增封禁接口 2025-09-05 19:20:27 +08:00
huangqz
7d0deb756a 新增获取用户累计付费方法 2025-09-05 10:25:50 +08:00
huangqz
3e45030be8 修改获取用户详情接口 2025-09-04 18:59:08 +08:00
huangqz
c0b4a0d83c 封装passport获取用户登录过的游戏大类接口 2025-09-02 17:17:36 +08:00
huangqz
7b904f4d5f 修改踢人接口 2025-08-29 18:31:51 +08:00
huangqz
13a6e20087 新增踢人接口 2025-08-29 17:12:22 +08:00
liguanjie
0f671231b5 feat(order): 添加用户名字段
- 在 OrderRestart 和 OrderFurtherPart相关结构中添加 UserName 字段
2025-08-22 14:50:17 +08:00
liguanjie
011d446784 refactor(cs): 修改工单重启接口参数名称
- 将 RemarkContent 改为 SysRemarkContent- 将 RemarkPic 改为 SysRemarkPic
- 更新了相关的请求结构体和测试代码
2025-08-21 11:54:15 +08:00
liguanjie
6c002a3917 refactor(cs): 重构工单提交接口参数
- 修改了 OrderSubmitParam 和 OrderSubmitRequest 结构体的字段名称,统一添加 Sys 前缀
- 更新了 CreateOrderSubmitRequest 函数以适应新的结构体字段
-调整了单元测试中的测试数据,以匹配新的接口参数
2025-08-21 11:30:22 +08:00
liguanjie
1a0253c56b 【cs服务】图片上传,设置10s超时 2025-08-18 16:38:09 +08:00
liguanjie
63f5bd86c0 【game】根据主体获取用户协议 2025-08-15 17:41:18 +08:00
liguanjie
f56cdad6d0 【passport】角色查询优化 2025-08-12 17:10:23 +08:00
huangqz
f296d38583 game_info 新增是否需要实名字段 2025-08-07 17:49:59 +08:00
liguanjie
96132c6cba Merge branch 'master' into develop/lgj/order 2025-08-05 14:29:01 +08:00
liguanjie
5e4a2468a7 【cs服务】faq详情,可返回null 2025-08-05 14:28:50 +08:00
9aa5924b97 更新 game 按版本获取配置接口 2025-07-25 17:20:51 +08:00
liguanjie
66ee953f5f 【cs服务】faq缓存清理 2025-07-25 11:07:35 +08:00
liguanjie
4b13de26bd 【cs服务】更新cs api域名 2025-07-22 20:02:50 +08:00
liguanjie
e6d4532874 Merge branch 'master' into develop/lgj/order 2025-07-22 20:00:24 +08:00
huangqz
e30ecac33b gameInfo新增字段 2025-07-21 17:07:12 +08:00
huangqz
b06b846be7 修改记录实名接口 2025-07-17 11:58:52 +08:00
liguanjie
699a113863 【cs服务】faq详情,返回模板code 2025-07-15 16:24:22 +08:00
liguanjie
22551147eb Merge branch 'develop/lgj/order' 2025-07-15 11:14:26 +08:00
ade7ca2d03 Merge branch 'refs/heads/master' into develop/yuxh/msdk 2025-07-15 09:29:28 +08:00
huangqz
51e0eaec33 新增更新实名信息接口 2025-07-14 21:53:09 +08:00
f3ab307f18 feat(utils): 添加随机字符串生成功能并优化追踪ID生成
- 新增随机字符串生成函数,支持不同模式(字母、数字、字母数字、字母十六进制)
-重构 RandStringBytes 函数,使用新的随机字符串生成逻辑
- 添加 MakeTraceId 函数,用于生成追踪ID
- 更新 Client 的 GetRefererHeader 方法,自动添加追踪ID
2025-07-14 20:30:19 +08:00
28d51baaab Merge branch 'refs/heads/master' into develop/yuxh/msdk 2025-07-10 19:52:51 +08:00
huangqz
d283be207b 修改获取游戏实名参数逻辑 2025-07-10 18:26:12 +08:00
f902dccb54 feat(sdk): 添加RefererHeader并扩展Client功能
- 在requests包中添加RefererHeader结构体
- 在Client结构中添加SetRefererHeader和GetRefererHeader方法
- 修改msdk客户端初始化时设置RefererHeader
- 在msdk客户端方法中添加RefererHeader到请求头
2025-07-10 18:05:44 +08:00
huangqz
2622e7c3c9 新增获取实名认证参数接口 2025-07-10 18:05:09 +08:00
huangqz
85ab17cfd6 Merge branch 'master' of https://golib.gaore.com/GaoreGo/gaore-common-sdk-go 2025-07-10 15:47:59 +08:00
huangqz
d2c5d53aba 新增用户实名黑名单接口 2025-07-10 15:45:07 +08:00
eb4425350b Merge remote-tracking branch 'origin/master' 2025-07-10 11:47:01 +08:00
huangqz
68a9435cb7 新增获取游戏全局配置接口 2025-07-10 11:42:07 +08:00
liguanjie
13bf104d52 【cs服务】工单详情,返回工单状态 2025-07-09 17:54:35 +08:00
liguanjie
083c5a7ba1 【cs服务】工单列表、详情,返回工单模板、uid 2025-07-09 12:25:13 +08:00
66eb586d88 新增发送短信v2接口优化 2025-07-07 16:40:10 +08:00
5f5a1160bf 新增发送短信v2接口 2025-07-07 16:26:39 +08:00
6a7beb5497 Merge branch 'refs/heads/master' into develop/yuxh/msdk 2025-07-03 18:31:46 +08:00
c02d5b5201 feat(sdk): 优化签名处理逻辑并添加 msdk 服务支持
- 修复了当 signer为 nil 时不执行签名逻辑的问题
- 优化了签名处理流程,提高了代码的可读性和性能
- 新增了对 msdk 服务的支持,包括用户归因和设备信息获取功能
- 添加了 md5 加密工具函数和相关测试
2025-07-03 18:06:31 +08:00
eb6157ce05 新增设置支付redis相关数据接口 2025-06-27 17:52:00 +08:00
a329d30296 Merge branch 'refs/heads/develop/yuxh/game' 2025-06-25 19:43:15 +08:00
liguanjie
49c41fb60b Merge branch 'develop/lgj/order' 2025-06-25 17:14:27 +08:00
liguanjie
384d257e03 【stat服务】1、查询用户角色汇总,提高超时时间 2025-06-25 17:11:15 +08:00
e1c163ef10 refactor(services/game): 更新游戏版本配置结构
- 新增 GameVersion 结构体,用于获取游戏客户端版本配置
- 修改 GetGameVersionResp 结构,将 Data 字段类型改为 GameVersion
-优化了游戏版本信息的组织和返回方式
2025-06-25 16:44:10 +08:00
45e449df11 Merge remote-tracking branch 'origin/master' 2025-06-25 15:58:43 +08:00
90cc6c3719 refactor(game): 删除未使用的 GetGameCompanyBySign 方法
-从 game/client.go 文件中移除了 GetGameCompanyBySign 函数- 此方法未在任何地方调用,删除以简化代码结构
2025-06-25 15:58:25 +08:00
liguanjie
b0027fd6e3 fix game服务报错 2025-06-25 15:43:41 +08:00
liguanjie
0b9b6ec0d9 Merge branch 'develop/lgj/order' 2025-06-25 15:43:15 +08:00
e4b852e4a6 refactor(game): 移除未使用的游戏公司信息获取功能 2025-06-25 14:59:31 +08:00
efaf155924 Merge branch 'refs/heads/develop/yuxh/game' 2025-06-25 14:24:25 +08:00
huangqz
ef5d453838 修改游戏详细download_id字段类型 2025-06-25 13:02:25 +08:00
liguanjie
a274190b01 【stat服务】
1、查询用户角色注册分页
2025-06-24 18:00:55 +08:00
liguanjie
eea0eb790e 【ip服务】
1、新增查询单个、多个ip地区信息
2025-06-24 11:55:49 +08:00
liguanjie
de55d3d7d5 【stat服务】
1、查询用户角色注册分页
2025-06-23 17:19:50 +08:00
6d3f8d8232 refactor(services/game): 修改获取游戏版本的 API 路径 2025-06-20 19:12:43 +08:00
089a9091ec feat(game): 添加根据游戏标识获取根游戏信息 2025-06-20 16:51:10 +08:00
ba79540f78 refactor(game): 重命名 GetGameByVersion 相关函数 2025-06-20 15:44:41 +08:00
7e9eae718c refactor(game): 重构游戏版本获取接口
- 将 GetGameByVersionReq 重命名为 GetGameVersionReq
- 将 GetGameByVersionResp 重命名为 GetGameVersionResp
- 更新了相关的函数和结构体名称,以提高代码的一致性和可读性
2025-06-20 15:13:16 +08:00
25552dd187 feat(game): 添加获取游戏客户端版本配置接口
- 在 game/client.go 中添加了 GetGameByVersion 方法- 在 game/game.go 中定义了 GetGameByVersionReq 和 GetGameByVersionResp 结构体
- 实现了创建请求和响应对象的函数 CreateGetGameByVersionReq 和 CreateGetGameByVersionResp
2025-06-20 12:09:20 +08:00
liguanjie
eb25c8f20a 【cs服务】
1、新增热门faq获取
2025-06-20 11:41:24 +08:00
liguanjie
92868ce4a0 【cs服务】
1、新增faq详情
2025-06-20 11:34:19 +08:00
liguanjie
f3a11907ee 【cs服务】
1、工单详情查询
2025-06-11 18:03:42 +08:00
liguanjie
e79d0819ad 【cs服务】
1、工单记录列表查询
2025-06-11 17:44:00 +08:00
liguanjie
32ba08b231 【cs服务】
1、用户补充资料
2025-06-11 16:35:33 +08:00
liguanjie
c0ced849fc 【cs服务】
1、用户提交工单
2025-06-11 16:09:29 +08:00
liguanjie
ce7d7f2ee7 【cs服务】
1、用户重启工单
2025-06-11 15:33:38 +08:00
liguanjie
bc565ac059 【cs服务】
1、用户催单
2、用户评价工单
2025-06-11 15:24:35 +08:00
liguanjie
6a7cfdc82f 【cs服务】
1、获取工单补充字段设置
2、获取工单模板详情,字段设置
2025-06-11 15:02:19 +08:00
liguanjie
73ca794581 Merge branch 'develop/lgj' 2025-06-10 21:47:41 +08:00
liguanjie
a5e43aa59a 【cs服务】
1、json参数优化
2025-06-10 21:46:21 +08:00
liguanjie
2ab968dfb2 【cs服务】
1、新增工单图片上传
2025-06-10 21:41:57 +08:00
huangqz
b69ed4b807 新增获取iOS切支付规则接口 2025-06-10 19:46:35 +08:00
liguanjie
607dbc87c6 【cs服务】
1、新增用户短信认证码发送
2025-06-10 14:46:46 +08:00
liguanjie
d3f303e20c 【cs服务】
1、新增用户角色列表获取
2025-06-10 14:19:18 +08:00
liguanjie
b282de0a2f 【cs服务】
1、新增用户基本信息获取
2025-06-10 10:32:20 +08:00
liguanjie
abb6cc61fb 【cs服务】
1、初始化 2、新增faq获取
2025-06-10 10:16:15 +08:00
liguanjie
7e664f3f29 【oss服务】修正Bucket参数,影响单个资源上传、删除 2025-06-09 12:29:19 +08:00
liguanjie
abca5f01ed 【game服务】获取根游戏游戏详情 2025-05-30 16:32:43 +08:00
liguanjie
34de4b0401 【passport服务】获取用户角色列表优化 2025-05-29 15:34:59 +08:00
liguanjie
71b93169e2 【game服务】获取游戏服务器列表v2 2025-05-29 12:09:18 +08:00
liguanjie
7dc4a177f9 【www服务】查询子游戏简单列表 2025-05-28 17:57:52 +08:00
liguanjie
9591e794f0 【passport服务】查询用户角色列表 2025-05-28 17:24:23 +08:00
liguanjie
055fb8abb9 【passport服务】查询用户列表 2025-05-28 16:45:20 +08:00
3652d43f34 sms优化 2025-05-27 12:33:28 +08:00
liguanjie
7c96d7163b Merge branch 'develop/lgj' of https://golib.gaore.com/GaoreGo/gaore-common-sdk-go 2025-05-26 16:37:53 +08:00
liguanjie
561eb1416a 【oss服务】新增上传单个短路径返回 2025-05-26 16:36:27 +08:00
huangqz
b9a481e71b 新增获取订单状态接口 2025-05-22 11:11:04 +08:00
5a8de98af3 Merge branch 'master' of https://golib.gaore.com/GaoreGo/gaore-common-sdk-go 2025-05-09 11:17:43 +08:00
6c3dfae18b sms新增绑定手机号模板,优化飞书webhook 2025-05-09 11:17:24 +08:00
b29010cac6 修改接口返回值 2025-05-07 15:44:37 +08:00
792d13fa32 sms host更正 2025-05-06 18:30:37 +08:00
ce30ff4ef9 新增sms相关接口 2025-05-06 18:09:59 +08:00
78d60083f7 新增 game 项目接口 2025-05-02 21:28:24 +08:00
bee78a0b12 添加获取渠道数据接口 2025-04-27 17:54:27 +08:00
c582fbf8ed 添加获取渠道数据接口 2025-04-27 17:43:54 +08:00
huangqz
14551a66b4 封装根据游戏id获取游戏信息方法 2025-04-27 10:59:33 +08:00
d8528ecbe8 优化投诉工单完成参数 2025-04-07 18:01:11 +08:00
b7bf3c7585 更新完成投诉工单参数 2025-04-07 17:11:42 +08:00
liguanjie
eae413bc00 【stat服务】新增推广渠道查询方法 2025-04-01 15:42:36 +08:00
631959c0ec 创建同步到游戏中心请求优化 2025-03-28 14:13:59 +08:00
4a8d29f57f 主体列表加上统一社会信用代码 2024-12-17 15:38:16 +08:00
4f63f8f302 注释test 2024-11-27 11:17:21 +08:00
956e294a2f pay项目测试环境使用pay.gaore.com 2024-11-27 10:59:22 +08:00
30afd2cbe1 apk Version 解析延长响应时间 2024-11-19 18:19:59 +08:00
517d422993 打包任务回调 2024-11-08 11:12:04 +08:00
721b735a0e 新增apk配置相关接口 2024-11-07 15:50:45 +08:00
e89f227e54 更新请求pay项目域名为pay.api.gaore.com 2024-11-06 14:46:44 +08:00
1902a769f8 增加 go.mod 2024-10-31 09:49:41 +08:00
857f7b9f90 新增母包Android SDK 支持版本获取 & 打包任务创建接口 2024-10-30 17:49:15 +08:00
5d941b865b Merge remote-tracking branch 'origin/master' 2024-10-12 15:28:45 +08:00
e26c54c474 更新分片上传初始化接口 2024-10-12 15:27:57 +08:00
liufk
a7a0099cb8 优化商户号参数调试接口 2024-09-30 17:44:22 +08:00
liufk
e3cfca5bfa 优化商户号参数调试接口 2024-09-30 17:41:22 +08:00
197 changed files with 20195 additions and 101 deletions

13
go.mod Normal file
View File

@ -0,0 +1,13 @@
module golib.gaore.com/GaoreGo/gaore-common-sdk-go
go 1.19
require (
github.com/json-iterator/go v1.1.12
github.com/spf13/cast v1.8.0
)
require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
)

26
go.sum Normal file
View File

@ -0,0 +1,26 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/spf13/cast v1.8.0 h1:gEN9K4b8Xws4EX0+a0reLmhq8moKn7ntRlQYgjPeCDk=
github.com/spf13/cast v1.8.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=

View File

@ -18,38 +18,40 @@ func signRpcRequest(request requests.AcsRequest, signer Signer) (err error) {
if err != nil {
return
}
if _, isContainsSign := request.GetQueryParams()["sign"]; isContainsSign {
delete(request.GetQueryParams(), "sign")
if signer != nil {
if _, isContainsSign := request.GetQueryParams()["sign"]; isContainsSign {
delete(request.GetQueryParams(), "sign")
}
stringToSign := buildRpcStringToSign(request)
request.SetStringToSign(stringToSign)
signature := signer.Sign(stringToSign, "&")
request.GetQueryParams()["sign"] = signature
debug("GrSdk sign: %s", signature)
debug("GrSdk sign string: %s", stringToSign)
debug("GrSdk sign: \r\n")
}
stringToSign := buildRpcStringToSign(request)
request.SetStringToSign(stringToSign)
signature := signer.Sign(stringToSign, "&")
request.GetQueryParams()["sign"] = signature
debug("GrSdk sign: %s", signature)
debug("GrSdk sign string: %s", stringToSign)
debug("GrSdk sign: \r\n")
return
}
func completeRpcSignParams(request requests.AcsRequest, signer Signer) (err error) {
if signer != nil {
var accessKeyFrom string
if accessKeyFrom, err = signer.GetAccessKeyFrom(); err != nil {
return
}
var accessKeyFrom string
if accessKeyFrom, err = signer.GetAccessKeyFrom(); err != nil {
return
queryParams := request.GetQueryParams()
queryParams["access_time"] = fmt.Sprintf("%d", time.Now().Unix())
queryParams["access_key"], err = signer.GetAccessKeyId()
queryParams["access_from"] = accessKeyFrom
request.GetHeaders()["Gr-Sdk-From"] = accessKeyFrom
if err != nil {
return
}
}
queryParams := request.GetQueryParams()
queryParams["access_time"] = fmt.Sprintf("%d", time.Now().Unix())
queryParams["access_key"], err = signer.GetAccessKeyId()
queryParams["access_from"] = accessKeyFrom
if err != nil {
return
}
request.GetHeaders()["Content-type"] = requests.Form
request.GetHeaders()["Gr-Sdk-From"] = accessKeyFrom
formString := utils.GetUrlFormedMap(request.GetFormParams())
request.SetContent(bytes.NewBufferString(formString).Bytes())
return

View File

@ -5,6 +5,7 @@ import (
"context"
"crypto/tls"
"fmt"
"github.com/json-iterator/go/extra"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth/credentials"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
@ -18,6 +19,7 @@ import (
"regexp"
"runtime"
"strings"
"sync"
"time"
)
@ -44,6 +46,27 @@ type Client struct {
httpProxy string
httpsProxy string
noProxy string
header *requests.RefererHeader
}
func (c *Client) SetRefererHeader(header *requests.RefererHeader) {
c.header = header
}
func (c *Client) GetRefererHeader() map[string]string {
var header *requests.RefererHeader
if c.header == nil {
header = &requests.RefererHeader{
TraceId: utils.MakeTraceId(),
}
} else {
header = c.header
}
return map[string]string{
"Referer": header.Referer,
"Traceparent": header.TraceId,
}
}
func (client *Client) GetNoProxy() string {
@ -89,11 +112,15 @@ func (client *Client) Init() (err error) {
func (client *Client) InitWithAccessKey(accessKeyId, accessKeySecret, accessKeyFrom string) (err error) {
config := client.InitWithConfig()
credential := &credentials.BaseCredential{
AccessKeyId: accessKeyId,
AccessKeySecret: accessKeySecret,
AccessKeyFrom: accessKeyFrom,
var credential auth.Credential
if accessKeyId != "" {
credential = &credentials.BaseCredential{
AccessKeyId: accessKeyId,
AccessKeySecret: accessKeySecret,
AccessKeyFrom: accessKeyFrom,
}
}
return client.InitWithOptions(config, credential)
}
@ -131,8 +158,9 @@ func (client *Client) InitWithOptions(config *Config, credential auth.Credential
if config.Timeout > 0 {
client.httpClient.Timeout = config.Timeout
}
client.signer, err = auth.NewSignerWithCredential(credential, client.ProcessCommonRequestWithSigner)
if credential != nil {
client.signer, err = auth.NewSignerWithCredential(credential, client.ProcessCommonRequestWithSigner)
}
return
}
@ -211,7 +239,7 @@ func (client *Client) DoAction(request requests.AcsRequest, response responses.A
}
func (client *Client) DoActionWithSigner(request requests.AcsRequest, response responses.AcsResponse, signer auth.Signer) (err error) {
request.AddHeaders(client.GetRefererHeader())
httpRequest, err := client.buildRequestWithSigner(request, signer)
if err != nil {
return err
@ -359,3 +387,10 @@ func (client *Client) getNoProxy(scheme string) []string {
func hookDo(fn func(req *http.Request) (*http.Response, error)) func(req *http.Request) (*http.Response, error) {
return fn
}
func init() {
once := sync.Once{}
once.Do(func() {
extra.RegisterFuzzyDecoders()
})
}

View File

@ -15,6 +15,7 @@ type JsonRequest struct {
func (request *JsonRequest) init() {
request.baseRequest = defaultBaseRequest()
request.baseRequest.AddHeaderParam("Content-Type", Json)
request.Method = POST
}
@ -35,12 +36,16 @@ func (request *JsonRequest) BuildUrl() string {
}
func (request *JsonRequest) GetStyle() string {
return RPC
return STREAM
}
func (request *JsonRequest) BuildQueries() string {
path := strings.TrimLeft(strings.TrimSpace(request.GetActionName()), "/")
request.queries = "/" + path + "?" + utils.GetUrlFormedMap(request.QueryParams)
mod := "&"
if !strings.Contains(path, "?") {
mod = "?"
}
request.queries = "/" + path + mod + utils.GetUrlFormedMap(request.QueryParams)
return request.queries
}
@ -56,8 +61,8 @@ func (request *JsonRequest) InitWithApiInfo(domain Host, version, urlPath string
}
func (request *JsonRequest) GetBodyReader() io.Reader {
if request.FormParams != nil && len(request.FormParams) > 0 {
body, err := json.Marshal(request.FormParams)
if request.JsonParams != nil && len(request.JsonParams) > 0 {
body, err := json.Marshal(request.JsonParams)
if err == nil {
return bytes.NewReader(body)
}

View File

@ -32,15 +32,17 @@ const (
HEAD = "HEAD"
OPTIONS = "OPTIONS"
Json = "application/json"
Xml = "application/xml"
Raw = "application/octet-stream"
Form = "application/x-www-form-urlencoded"
Json = "application/json"
Xml = "application/xml"
Raw = "application/octet-stream"
Form = "application/x-www-form-urlencoded"
FormData = "multipart/form-data"
Header = "Header"
Query = "Query"
Body = "Body"
Path = "Path"
Header = "Header"
Query = "Query"
Body = "Body"
BodyJson = "Json"
Path = "Path"
TEST = "TEST"
PRE = "PRE"
@ -54,6 +56,11 @@ type Host struct {
Func func(string) string
}
type RefererHeader struct {
Referer string
TraceId string
}
var debug utils.Debug
func init() {
@ -93,8 +100,10 @@ type AcsRequest interface {
GetBodyReader() io.Reader
AddHeaderParam(key, value string)
AddHeaders(headers map[string]string)
addQueryParam(key, value string)
addFormParam(key, value string)
addJsonParam(string, any)
}
type baseRequest struct {
@ -118,6 +127,7 @@ type baseRequest struct {
QueryParams map[string]string
Headers map[string]string
FormParams map[string]string
JsonParams map[string]any
Content []byte
queries string
@ -222,6 +232,12 @@ func (request *baseRequest) AddHeaderParam(key, val string) {
request.Headers[key] = val
}
func (request *baseRequest) AddHeaders(headers map[string]string) {
for key, val := range headers {
request.Headers[key] = val
}
}
func (request *baseRequest) addQueryParam(key, val string) {
request.QueryParams[key] = val
}
@ -230,6 +246,10 @@ func (request *baseRequest) addFormParam(key, val string) {
request.FormParams[key] = val
}
func (request *baseRequest) addJsonParam(key string, val any) {
request.JsonParams[key] = val
}
func defaultBaseRequest() (request *baseRequest) {
request = &baseRequest{
Scheme: HTTP,
@ -242,6 +262,7 @@ func defaultBaseRequest() (request *baseRequest) {
"Accept-Encoding": Json,
},
FormParams: make(map[string]string),
JsonParams: make(map[string]any),
}
return
}
@ -290,14 +311,14 @@ func flatRepeatedList(reflectValue reflect.Value, request AcsRequest, position s
value = fieldDefault
}
err = addParam(request, fieldPosition, name, value)
err = addParam(request, fieldPosition, name, value, reflectValue.Field(i).Interface())
}
}
return
}
func addParam(request AcsRequest, position, key, value string) (err error) {
func addParam(request AcsRequest, position, key, value string, vAny any) (err error) {
if len(value) > 0 {
switch position {
case Header:
@ -306,6 +327,8 @@ func addParam(request AcsRequest, position, key, value string) (err error) {
request.addQueryParam(key, value)
case Body:
request.addFormParam(key, value)
case BodyJson:
request.addJsonParam(key, vAny)
default:
errmsg := fmt.Sprintf("unsupport positions add param `%s`", position)
err = errors.New(errmsg)

View File

@ -13,6 +13,7 @@ type RpcRequest struct {
func (request *RpcRequest) init() {
request.baseRequest = defaultBaseRequest()
request.baseRequest.AddHeaderParam("Content-Type", Form)
request.Method = POST
}

View File

@ -14,7 +14,7 @@ type StreamRequest struct {
func (s *StreamRequest) init() {
s.baseRequest = defaultBaseRequest()
s.baseRequest.AddHeaderParam("Content-Type", "application/form-data")
s.baseRequest.AddHeaderParam("Content-Type", FormData)
s.Method = POST
}

View File

@ -1,9 +1,9 @@
package responses
import (
"encoding/json"
"errors"
"fmt"
"github.com/json-iterator/go"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"io/ioutil"
"net/http"
@ -89,7 +89,7 @@ func Unmarshal(response AcsResponse, httpResponse *http.Response, format string)
return
}
if _, isCommonResponse := response.(CommonResponse); isCommonResponse {
if _, isCommonResponse := response.(*CommonResponse); isCommonResponse {
return
}
@ -97,7 +97,10 @@ func Unmarshal(response AcsResponse, httpResponse *http.Response, format string)
if contentType, ok := response.GetHttpHeaders()["Content-Type"]; ok {
for _, v := range contentType {
if strings.Contains(v, requests.Json) {
json.Unmarshal(response.GetHttpContentBytes(), response)
err = jsoniter.Unmarshal(response.GetHttpContentBytes(), response)
if err != nil {
return errors.New("json Unmarshal:" + err.Error())
}
break
}
}
@ -108,10 +111,11 @@ func Unmarshal(response AcsResponse, httpResponse *http.Response, format string)
}
if format != "xml" {
err = json.Unmarshal(response.GetHttpContentBytes(), response)
err = jsoniter.Unmarshal(response.GetHttpContentBytes(), response)
if err != nil {
return errors.New("json Unmarshal:" + err.Error())
}
}
return
}

View File

@ -0,0 +1,69 @@
package random
import (
"math/rand"
"time"
"unsafe"
)
type Mode int // 随机数模式
const (
Letter Mode = iota
Number
LetterNumber
LetterHex
)
const (
letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
numbers = "0123456789"
lettersHex = "0123456789abcdef"
letterIdBit = 6
letterIdxMask = 1<<letterIdBit - 1
letterIdxMax = 63 / letterIdBit
)
func StrRandom(n int64) string {
return Random(n, Letter)
}
func NumRandom(n int64) string {
return Random(n, Number)
}
func Random(n int64, mode ...Mode) string {
var baseStr string
mode = append(mode, LetterNumber)
switch mode[0] {
case LetterHex:
baseStr = lettersHex
case Letter:
baseStr = letters
case Number:
baseStr = numbers
case LetterNumber:
fallthrough
default:
baseStr = letters + numbers
}
return random(n, baseStr)
}
func random(n int64, baseStr string) string {
var src = rand.NewSource(time.Now().UnixNano())
b := make([]byte, n)
for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
if remain == 0 {
cache, remain = src.Int63(), letterIdxMax
}
if idx := int(cache & letterIdxMask); idx < len(baseStr) {
b[i] = baseStr[idx]
i--
}
cache >>= letterIdBit
remain--
}
return *(*string)(unsafe.Pointer(&b))
}

View File

@ -5,8 +5,8 @@ import (
"crypto/rand"
"encoding/hex"
"fmt"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils/random"
"hash"
rand2 "math/rand"
"net/url"
"reflect"
"sort"
@ -36,11 +36,7 @@ func NewUUID() UUID {
}
func RandStringBytes(n int) string {
b := make([]byte, n)
for i := range b {
b[i] = letterBytes[rand2.Intn(len(letterBytes))]
}
return string(b)
return random.StrRandom(int64(n))
}
func newFromHash(h hash.Hash, ns UUID, name string) UUID {
@ -109,3 +105,12 @@ func InitStructWithDefaultTag(bean interface{}) {
}
}
}
func Md5(data string) string {
s := md5.Sum([]byte(data))
return hex.EncodeToString(s[:])
}
func MakeTraceId() string {
return fmt.Sprintf("00-%s-%s-01", random.Random(32, random.LetterHex), random.Random(16, random.LetterHex))
}

View File

@ -23,3 +23,7 @@ func TestInitStructWithDefaultTag(t *testing.T) {
InitStructWithDefaultTag(testcase)
fmt.Printf("%+v", testcase)
}
func TestMd5(t *testing.T) {
t.Log(Md5("123456"))
}

47
services/asdk/client.go Normal file
View File

@ -0,0 +1,47 @@
package asdk
import (
"fmt"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils"
"time"
)
const (
VERSION = "2020-11-16"
)
var HOST = requests.Host{
Default: "asdk",
}
type Client struct {
sdk.Client
}
func NewClient() (client *Client, err error) {
client = new(Client)
err = client.Init()
return
}
// GenerateInnerApiSign
// 生成内部接口签名
func GenerateInnerApiSign(ts int64) (int64, string) {
const InnerSignSecret = "sYbfhozSu^@K8~y*"
if ts == 0 {
ts = time.Now().Unix()
}
return ts, utils.Md5(fmt.Sprintf("%d%s", ts, InnerSignSecret))
}
// CreateKickUserReq 踢人
func (c *Client) CreateKickUserReq(req *KickUserReq) (resp *KickUserResp, err error) {
resp = CreateKickUserResp()
err = c.DoAction(req, resp)
if err != nil {
return
}
return
}

View File

@ -0,0 +1,26 @@
package asdk
import (
"fmt"
"testing"
)
// 获取用户累计付费
func TestKickUser(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
ts, sign := GenerateInnerApiSign(0)
req := CreateKickUserReq(KickUserParam{
Ts: ts,
Sign: sign,
UserName: "aq36604627",
})
resp, err := client.CreateKickUserReq(req)
if err != nil {
panic(err)
}
fmt.Println(resp.Code, resp.Msg, resp.Data)
}

View File

@ -0,0 +1,45 @@
package asdk
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
"strconv"
)
type KickUserReq struct {
*requests.RpcRequest
}
type KickUserResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data struct{} `json:"data"`
TraceId string `json:"trace_id"`
}
type KickUserParam struct {
Ts int64 `json:"ts"`
Sign string `json:"sign"`
UserName string `json:"user_name"`
}
func CreateKickUserReq(data KickUserParam) *KickUserReq {
req := &KickUserReq{
&requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/kick")
req.Method = requests.GET
req.QueryParams = map[string]string{
"ts": strconv.FormatInt(data.Ts, 10),
"sign": data.Sign,
"user_name": data.UserName,
}
return req
}
func CreateKickUserResp() *KickUserResp {
return &KickUserResp{
BaseResponse: &responses.BaseResponse{},
}
}

42
services/capk/client.go Normal file
View File

@ -0,0 +1,42 @@
package capk
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
)
const (
VERSION = "2024-10-30"
)
var HOST requests.Host = requests.Host{
Default: "capk.gaore.com",
}
type Client struct {
sdk.Client
}
func NewClient() (client *Client, err error) {
client = new(Client)
err = client.Init()
return
}
func (c *Client) TaskCreate(req *TaskCreateRequest) (resp *TaskCreateResponse, err error) {
resp = CreateTaskCreateResponse()
err = c.DoAction(req, resp)
return
}
func (c *Client) ConfigModify(req *ConfigModifyRequest) (resp *ConfigModifyResponse, err error) {
resp = CreateConfigModifyResponse()
err = c.DoAction(req, resp)
return
}
func (c *Client) ConfigGet(req *ConfigGetRequest) (resp *ConfigGetResponse, err error) {
resp = CreateConfigGetResponse()
err = c.DoAction(req, resp)
return
}

View File

@ -0,0 +1,39 @@
package capk
import "testing"
func TestTask_Create(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Fatal(err)
}
req := CreateTaskCreateRequest()
req.GameId = 7788
req.GameVersion = "1.0.1"
req.Config = "{\"data\":{\"sdkPath\":\"\",\"localPath\":\"\",\"plugins\":{\"addictioncheck\":\"\",\"msaid\":\"\",\"bugly\":\"\",\"gdt\":\"\",\"gdt_channel\":\"\"},\"decompileApk\":\"\"},\"game\":{\"appID\":\"7477\",\"appName\":\"xyxmz_xlhh_ylh\",\"appKey\":\"yWpx3hWQHFhSnTCj#7477#6KuRKuaAjLJ5sYRy\",\"appDescNew\":\"西游仙魔传\",\"orientation\":\"landscape\",\"cpuSupport\":\"armeabi-v7a|arm64-v8a\",\"minSdkVersion\":\"21\",\"targetSdkVersion\":\"31\",\"outputApkName\":\"{appName}_{appID}_{versionCode}_{versionName}_{time}.apk\",\"gameCategory\":\"25|771-2.0.4.3\",\"icon\":\"\",\"logoPath\":\"\",\"loadingPath\":\"\",\"certificatePath\":\"\"},\"channel\":{\"id\":\"1\",\"name\":\"gaore\",\"sdk\":\"gaore\",\"desc\":\"GRSDK\",\"suffix\":\"com.bjhr.xyxmz\",\"splash\":\"0\",\"splash_copy_to_unity\":\"0\",\"sdkParams\":{\"SCREEN_ORIENTATION\":\"0\",\"GAORE_CHANNELID\":\"1\",\"GAORE_VERSION_TAG\":\"1\",\"GAORE_LOGO_SHOW\":\"1\",\"GAORE_CHANNEL_KEY\":\"GRSDK\",\"GAORE_GAME_VERSION\":\"1.0.0\",\"GAORE_APPLICATION_PROXY_NAME\":\"com.gr.sdk.GaoreApplication,com.gr.sdk.MSAApplication,com.gr.sdk.addictioncheck.application.GaoreApplication,com.gr.sdk.BuglyProxyApplication,com.gr.sdk.GDTProxyApplication,com.gr.sdk.GDTChannelProxyApplication\",\"GAORE_WX_APP_ID\":\"\",\"GAORE_FLOAT_POSITION\":\"0|30\",\"GAORE_ROUND_ICON\":\"0\",\"GAORE_ROUND_ICON_PATH\":\"\",\"GAORE_ROUND_ICON_FOREGROUND_PATH\":\"\",\"GAORE_ROUND_ICON_BACKGROUND_PATH\":\"\",\"GR_AGEWARN\":\"true\",\"GR_REDPACKET\":\"1\",\"GR_REDPACKET_GUIDE\":\"1\",\"GAORE_INIT_SDK_TYPE\":\"2\",\"appkey_avscan\":\"\",\"seckey_avscan\":\"\",\"GDT_USER_ACTION_SET_ID\":\"1203968086\",\"GDT_APP_SECRET_KEY\":\"8ad271167be3dcf120468770a4ee9b21\",\"GISM_APPID\":\"\",\"GISM_APPNAME\":\"\",\"QL_APPID\":\"\",\"KUAISHOU_APPID\":\"\",\"KUAISHOU_APPNAME\":\"\",\"TOUTIAO_AID\":\"\",\"addPermissionActivity\":\"1\",\"VIVO_SRC_ID\":\"\"},\"sdkVersion\":{\"versionName\":\"2.6.1\"},\"plugins\":{\"addictioncheck\":\"\",\"msaid\":\"\",\"bugly\":\"\",\"gdt\":\"\",\"gdt_channel\":\"\"}}}"
req.Env = 0 // 灰度为 1 正式为0
resp, err := client.TaskCreate(req)
t.Logf("%v", resp.Data.TaskId)
}
func TestConfig_Modify(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Fatal(err)
}
req := CreateConfigModifyRequest()
req.Content = []byte(`<?xml version='1.0' encoding='UTF-8'?><xml><apks><!-- name母包文件名 --><!-- screen屏幕方向 0竖屏 1横屏 --><!-- targetSdktargetSdkVersion支持30以上 0否 1是 --><apk><param name="id" value="1" /><param name="name" value="heji" /><param name="desc" value="合击" /><param name="screen" value="1" /><param name="targetSdk" value="0" /></apk><apk><param name="id" value="2" /><param name="name" value="lanyue" /><param name="desc" value="蓝月" /><param name="screen" value="1" /><param name="targetSdk" value="0" /></apk></apks></xmls>`)
resp, err := client.ConfigModify(req)
t.Log(resp.Code, resp.Msg)
}
func TestConfig_Get(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Fatal(err)
}
req := CreateConfigGetRequest()
resp, err := client.ConfigGet(req)
t.Log(resp.Code, resp.Data)
}

View File

@ -0,0 +1,34 @@
package capk
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type ConfigGetRequest struct {
*requests.JsonRequest
}
type ConfigGetResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data string `json:"data"`
}
func CreateConfigGetRequest() *ConfigGetRequest {
req := &ConfigGetRequest{
JsonRequest: &requests.JsonRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/pack/config/get")
req.Method = requests.GET
return req
}
func CreateConfigGetResponse() *ConfigGetResponse {
return &ConfigGetResponse{
BaseResponse: &responses.BaseResponse{},
}
}

View File

@ -0,0 +1,33 @@
package capk
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type ConfigModifyRequest struct {
*requests.StreamRequest
}
type ConfigModifyResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data string `json:"data"`
}
func CreateConfigModifyRequest() (req *ConfigModifyRequest) {
req = &ConfigModifyRequest{
StreamRequest: &requests.StreamRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/pack/config/set")
req.Method = requests.POST
return
}
func CreateConfigModifyResponse() (resp *ConfigModifyResponse) {
return &ConfigModifyResponse{
BaseResponse: &responses.BaseResponse{},
}
}

View File

@ -0,0 +1,38 @@
package capk
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type TaskCreateRequest struct {
*requests.JsonRequest
GameId int `position:"Json" field:"game_id"`
GameVersion string `position:"Json" field:"game_version"`
Config string `position:"Json" field:"config"`
Env int `position:"Json" field:"env"`
}
type TaskCreateResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
TaskId string `json:"task_id"`
} `json:"data"`
}
func CreateTaskCreateRequest() (req *TaskCreateRequest) {
req = &TaskCreateRequest{
JsonRequest: &requests.JsonRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/pack/task/create")
return
}
func CreateTaskCreateResponse() (resp *TaskCreateResponse) {
resp = &TaskCreateResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}

View File

@ -0,0 +1,31 @@
package center_api
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
)
const (
VERSION = "2020-11-16"
)
var HOST = requests.Host{
Default: "center-api",
}
type Client struct {
sdk.Client
}
func NewClient() (client *Client, err error) {
client = new(Client)
err = client.Init()
return
}
// PackagingTaskCallback 打包任务回调
func (c *Client) PackagingTaskCallback(req *PackagingTaskCallbackReq) (resp *PackagingTaskCallbackResp, err error) {
resp = CreatePackagingTaskCallbackResp()
err = c.DoAction(req, resp)
return
}

View File

@ -0,0 +1,28 @@
package center_api
import (
"fmt"
"testing"
)
func TestPackagingTaskCallback(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
req := CreatePackagingTaskCallbackReq(Data{
TaskId: "asdada120",
Status: 1,
Msg: "test",
Url: "http://www.baidu.com",
Md5: "adadsadasdasda",
})
resp, err := client.PackagingTaskCallback(req)
if err != nil {
panic(err)
}
fmt.Println(resp.StatusCode, resp.StatusMsg)
}

View File

@ -0,0 +1,64 @@
package center_api
import (
"crypto/md5"
"encoding/hex"
"fmt"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type PackagingTaskCallbackReq struct {
*requests.RpcRequest
TaskId string `position:"Body" field:"task_id"`
Status int `position:"Body" field:"status"`
Msg string `position:"Body" field:"msg"`
Url string `position:"Body" field:"url"`
Md5 string `position:"Body" field:"md5"`
Sign string `position:"Body" field:"sign"`
Ts int64 `position:"Body" field:"ts"`
}
type PackagingTaskCallbackResp struct {
*responses.BaseResponse
StatusCode int `json:"status_code"`
StatusMsg string `json:"status_msg"`
}
type Data struct {
TaskId string `json:"task_id"`
Status int `json:"status"`
Msg string `json:"msg"`
Url string `json:"url"`
Md5 string `json:"md5"`
}
func CreatePackagingTaskCallbackReq(data Data) *PackagingTaskCallbackReq {
req := &PackagingTaskCallbackReq{
RpcRequest: &requests.RpcRequest{},
}
req.TaskId = data.TaskId
req.Status = data.Status
req.Msg = data.Msg
req.Url = data.Url
req.Md5 = data.Md5
req.Ts = 1730357662
// sign=md5(ts+task_id+sign_key) 32位
// 生成 MD5 哈希
hash := md5.Sum([]byte(fmt.Sprintf("%d%s%s", req.Ts, req.TaskId, "xBPVBJ132asdUeJC3XjD7AnFWD2sbGH6pJC4654y89")))
// 将哈希结果转换为十六进制字符串
hashString := hex.EncodeToString(hash[:])
req.Sign = hashString
req.InitWithApiInfo(HOST, VERSION, "/v1/packaging/task/callback")
req.Method = requests.POST
return req
}
func CreatePackagingTaskCallbackResp() *PackagingTaskCallbackResp {
return &PackagingTaskCallbackResp{
BaseResponse: &responses.BaseResponse{},
}
}

162
services/cs/client.go Normal file
View File

@ -0,0 +1,162 @@
package cs
import (
"errors"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"time"
)
const (
VERSION = "2025-06-10"
)
var HOST = requests.Host{
Default: "cs.api.gaore.com",
}
type Client struct {
sdk.Client
}
func NewClient() (client *Client, err error) {
client = new(Client)
err = client.Init()
return
}
func (client *Client) GetFaq(req *GetFaqRequest) (resp *GetFaqResponse, err error) {
resp = CreateGetFaqResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) GetUserInfo(req *GetUserInfoRequest) (resp *GetUserInfoResponse, err error) {
resp = CreateGetUserInfoResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) GetCsUserRoleList(req *GetUserRoleListRequest) (resp *GetUserRoleListResponse, err error) {
resp = CreateGetUserRoleListResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) GetUserServerList(req *GetUserServerListRequest) (resp *GetUserServerListResponse, err error) {
resp = CreateGetUserServerListResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) SendSmsCode(req *SendSmsRequest) (resp *SendSmsResponse, err error) {
resp = CreateSendSmsResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) Upload(req *UploadRequest) (resp *UploadResponse, err error) {
// check file stream
if req.FileStream == nil {
err = errors.New("stream is empty")
return
}
// 必须设置content
req.SetContent(req.FileStream)
// 考虑网络不佳的情况,提高超时时间
req.SetReadTimeout(10 * time.Second)
resp = CreateUploadResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) GetOrderTemplateDetail(req *OrderTemplateDetailReq) (resp *OrderTemplateDetailResp, err error) {
resp = CreateOrderTemplateDetailResp()
err = client.DoAction(req, resp)
return
}
func (client *Client) GetOrderFurtherPart(req *GetOrderFurtherPartRequest) (resp *GetOrderFurtherPartResponse, err error) {
resp = CreateGetOrderFurtherPartResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) OrderUrgent(req *OrderUrgentRequest) (resp *OrderUrgentResponse, err error) {
resp = CreateOrderUrgentResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) OrderUpdateHandle(req *OrderUpdateHandleRequest) (resp *OrderUpdateHandleResponse, err error) {
resp = CreateOrderUpdateHandleResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) OrderAppraise(req *OrderAppraiseRequest) (resp *OrderAppraiseResponse, err error) {
resp = CreateOrderAppraiseResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) OrderRestart(req *OrderRestartRequest) (resp *OrderRestartResponse, err error) {
resp = CreateOrderRestartResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) OrderSubmit(req *OrderSubmitRequest) (resp *OrderSubmitResponse, err error) {
resp = CreateOrderSubmitResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) OrderFurtherPart(req *OrderFurtherPartRequest) (resp *OrderFurtherPartResponse, err error) {
resp = CreateOrderFurtherPartResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) OrderRecordList(req *GetWorkOrderRecordListRequest) (resp *GetWorkOrderRecordListResponse, err error) {
resp = CreateGetWorkOrderRecordListResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) OrderRecordDetail(req *GetWorkOrderRecordDetailReq) (resp *GetWorkOrderRecordDetailResp, err error) {
resp = CreateGetWorkOrderRecordDetailResp()
err = client.DoAction(req, resp)
return
}
func (client *Client) GetFaqDetail(req *GetFaqDetailRequest) (resp *GetFaqDetailResponse, err error) {
resp = CreateGetFaqDetailResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) GetHotFaqList(req *GetHotFaqRequest) (resp *GetHotFaqResponse, err error) {
resp = CreateGetHotFaqResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) ClearFaqListCache(req *ClearFaqListCacheRequest) (resp *ClearFaqListCacheResponse, err error) {
resp = CreateClearFaqListCacheResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) ClearFaqDetailCache(req *ClearFaqDetailCacheRequest) (resp *ClearFaqDetailCacheResponse, err error) {
resp = CreateClearFaqDetailCacheResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) ClearHotFaqCache(req *ClearHotFaqCacheRequest) (resp *ClearHotFaqCacheResponse, err error) {
resp = CreateClearHotFaqCacheResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) GetLinkGameConfig(req *GetLinkGameConfigRequest) (resp *GetLinkGameConfigResponse, err error) {
resp = CreateGetLinkGameConfigResponse()
err = client.DoAction(req, resp)
return
}

478
services/cs/client_test.go Normal file
View File

@ -0,0 +1,478 @@
package cs
import (
"fmt"
"os"
"testing"
)
/**
* 客服工单服务单元测试
*/
// 获取faq树状数据
func TestGetFaq(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateGetFaqRequest()
faq, err := client.GetFaq(req)
if err != nil {
t.Error(err)
return
}
fmt.Printf(fmt.Sprintf("%#+v", faq))
}
// 获取玩家基本信息
func TestGetUserInfo(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateGetUserInfoRequest("ws45265737")
info, err := client.GetUserInfo(req)
if err != nil {
t.Error(err)
return
}
fmt.Printf(fmt.Sprintf("%v", info))
}
// 获取玩家角色列表
func TestGetUserRoleList(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateGetUserRoleListRequest(int64(63610626), int64(2850))
info, err := client.GetCsUserRoleList(req)
if err != nil {
t.Error(err)
return
}
if info.Code != 0 {
t.Error("获取玩家角色列表失败")
fmt.Printf(fmt.Sprintf("%v", info))
return
}
fmt.Printf(fmt.Sprintf("%v", info))
}
// 获取玩家区服列表
func TestGetUserServerList(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateGetUserServerListRequest(int64(63610626), int64(2850))
info, err := client.GetUserServerList(req)
if err != nil {
t.Error(err)
return
}
if info.Code != 0 {
t.Error("获取玩家区服列表失败")
fmt.Printf(fmt.Sprintf("%v", info))
return
}
fmt.Printf(fmt.Sprintf("%v", info))
}
// 给玩家发送短信
func TestSendSms(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateSendSmsRequest(SendSmsReq{
Phone: "13725263463",
})
info, err := client.SendSmsCode(req)
if err != nil {
t.Error(err)
return
}
if info.Code != 0 {
t.Error("给玩家发送短信失败")
}
fmt.Printf(fmt.Sprintf("%v", info))
}
// 工单图片上传
func TestUpload(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
// 读取文件流
file, err := os.ReadFile("test.png")
if err != nil {
t.Error(err)
return
}
req := CreateUploadRequest()
req.FileStream = file
res, err := client.Upload(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 {
t.Error("工单图片上传失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 工单模板查询
func TestGetOrderTemplateDetail(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
templateId := int64(12)
req := CreateOrderTemplateDetailReq(templateId)
res, err := client.GetOrderTemplateDetail(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 {
t.Error("工单模板查询失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 工单补充字段设置
func TestGetOrderFurtherPart(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateGetOrderFurtherPartRequest(GetOrderFurtherPartParam{
OrderNum: "20250605092301764049"})
res, err := client.GetOrderFurtherPart(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 {
t.Error("工单补充字段设置获取失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 用户催单
func TestOrderUrgent(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateOrderUrgentRequest(OrderUrgentParam{
OrderNum: "20250530173554491048"})
res, err := client.OrderUrgent(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 {
t.Error("用户催单失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 用户更新工单处理标识
func TestOrderUpdateHandle(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateOrderUpdateHandleRequest(OrderUpdateHandleParam{
IsHandle: 1,
OrderNum: "20250530173554491048"})
res, err := client.OrderUpdateHandle(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 {
t.Error("用户催单失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 用户评价工单
func TestOrderAppraise(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateOrderAppraiseRequest(OrderAppraiseParam{
OrderNum: "20250530173554491048",
Score: 5,
})
res, err := client.OrderAppraise(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 {
t.Error("用户评价失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 工单重启
func TestOrderRestart(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateOrderRestartRequest(OrderRestartParam{
OrderNum: "20250530173554491048",
SysRemarkContent: "模拟用户重启",
SysRemarkPic: []string{},
})
res, err := client.OrderRestart(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 {
t.Error("工单重启失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 提交工单
func TestOrderSubmit(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateOrderSubmitRequest(OrderSubmitParam{
SysGameId: 7874,
SysUserName: "rz35990497",
SysUid: 221016372,
SysRoleId: "265500394",
SysRoleName: "好玩的尼",
SysServerName: "碧水连天",
SysOrderTemplateCode: "findAccount",
SysDetail: "测试go-common改动。",
SysPhone: "13725263463",
ApplyIp: "192.168.1.202",
SysOrderParts: []OrderSubmitPart{
{
PartKey: "email",
PartName: "联系邮箱",
PartValue: "kingson2011@126.com",
PicValue: nil,
},
{
PartKey: "pay_pic",
PartName: "充值凭证",
PartValue: "",
PicValue: []string{
"uploads/068/068eefab055a96ae404db19b7a121898.jpeg",
"uploads/908/90822cca4e87ed49acaf82050dd3ac09.jpeg",
},
},
},
SysSmsCode: "7204",
})
res, err := client.OrderSubmit(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 {
t.Error("工单提交失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 用户工单补充资料
func TestOrderFurtherPart(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateOrderFurtherPartRequest(OrderFurtherPartParam{
OrderNum: "20250611160840208567",
OrderParts: []OrderSubmitPart{
{
PartKey: "game_name",
PartName: "游戏名称",
PartValue: "镇魂街:最终章",
},
},
})
res, err := client.OrderFurtherPart(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 {
t.Error("用户工单补充资料失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 工单列表查询
func TestGetWorkOrderRecordList(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateGetWorkOrderRecordListRequest(GetWorkOrderRecordListParam{
HandleStatus: "",
UserName: "ws45265737",
GameId: 7991,
Page: 1,
PageSize: 20,
})
res, err := client.OrderRecordList(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 {
t.Error("工单列表查询失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 工单详情查询
func TestOrderRecordDetail(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateGetWorkOrderRecordDetailRequest(OrderDetailParam{
OrderNum: "20250611160840208567",
})
res, err := client.OrderRecordDetail(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 {
t.Error("工单详情查询失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 获取faq详情
func TestGetFaqDetail(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateGetFaqDetailRequest(FaqDetailRequest{
Id: int64(31),
})
res, err := client.GetFaqDetail(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 || res.Data.Id == 0 {
t.Error("获取faq详情失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 获取热门faq
func TestGetFaqHotList(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateGetHotFaqRequest()
res, err := client.GetHotFaqList(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 || len(res.Data) == 0 {
t.Error("获取热门faq失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 清理faq列表缓存
func TestClearFaqListCache(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateClearFaqListCacheRequest()
res, err := client.ClearFaqListCache(req)
if err != nil {
t.Error(err)
}
if res.Code != 0 {
t.Error("清理faq列表缓存失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 清理faq详情缓存
func TestClearFaqDetailCache(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateClearFaqDetailCacheRequest(FaqDetailRequest{
Id: int64(30),
})
res, err := client.ClearFaqDetailCache(req)
if err != nil {
t.Error(err)
}
if res.Code != 0 {
t.Error("清理faq详情缓存失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 清理热门faq缓存
func TestClearHotFaqCache(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateClearHotFaqCacheRequest()
res, err := client.ClearHotFaqCache(req)
if err != nil {
t.Error(err)
}
if res.Code != 0 {
t.Error("清理热门faq缓存失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 获取人工客服链接,主体与游戏参数配置详情
func TestGetLinkGameConfigDetail(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateGetLinkGameConfigRequest(LinkGameConfigRequest{
Company: "JJW",
})
res, err := client.GetLinkGameConfig(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 || res.Data.SubjectSign == "" {
t.Error("获取人工客服链接,主体与游戏参数配置详情失败")
}
fmt.Printf(fmt.Sprintf("%v", res.Data))
}

45
services/cs/config.go Normal file
View File

@ -0,0 +1,45 @@
package cs
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
// 中旭人工客服链接,主体与游戏配置
type LinkGameConfig struct {
SubjectSign string `json:"subject_sign"`
SubjectName string `json:"subject_name"`
LinkGameId int64 `json:"link_game_id"`
CreatedAt string `json:"created_at"`
}
type GetLinkGameConfigRequest struct {
*requests.JsonRequest
Company string `position:"Json" field:"company"`
}
type GetLinkGameConfigResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data *LinkGameConfig `json:"data"`
}
type LinkGameConfigRequest struct {
Company string `json:"company"`
}
func CreateGetLinkGameConfigRequest(param LinkGameConfigRequest) (req *GetLinkGameConfigRequest) {
req = &GetLinkGameConfigRequest{
JsonRequest: &requests.JsonRequest{},
Company: param.Company,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/config/get_link_game_config")
req.Method = requests.POST
return
}
func CreateGetLinkGameConfigResponse() (response *GetLinkGameConfigResponse) {
response = &GetLinkGameConfigResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}

203
services/cs/faq.go Normal file
View File

@ -0,0 +1,203 @@
package cs
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
// Faq 树状结构
type Faq struct {
Id int64 `json:"id"`
ParentId int64 `json:"parent_id"`
Title string `json:"title"`
Answer string `json:"answer"`
Type int64 `json:"type"`
WorkOrderTemplateId int64 `json:"work_order_template_id"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
ProcessFlow string `json:"process_flow"`
Children []*Faq `json:"children"`
}
type GetFaqRequest struct {
*requests.RpcRequest
}
type GetFaqResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data Faq `json:"data"`
}
func CreateGetFaqRequest() (req *GetFaqRequest) {
req = &GetFaqRequest{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/v1/faq/list")
req.Method = requests.POST
return
}
func CreateGetFaqResponse() (response *GetFaqResponse) {
response = &GetFaqResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
// FaqDetail Faq详情
type FaqDetail struct {
Id int64 `json:"id"`
ParentId int64 `json:"parent_id"`
Title string `json:"title"`
Answer string `json:"answer"`
Type int64 `json:"type"`
WorkOrderTemplateId int64 `json:"work_order_template_id"`
ProcessFlow string `json:"process_flow"`
WorkOrderTemplateCode string `json:"work_order_template_code"`
}
type GetFaqDetailRequest struct {
*requests.JsonRequest
Id int64 `position:"Json" field:"id"`
}
type GetFaqDetailResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data *FaqDetail `json:"data"`
}
type FaqDetailRequest struct {
Id int64 `json:"id"`
}
func CreateGetFaqDetailRequest(param FaqDetailRequest) (req *GetFaqDetailRequest) {
req = &GetFaqDetailRequest{
JsonRequest: &requests.JsonRequest{},
Id: param.Id,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/faq/detail")
req.Method = requests.POST
return
}
func CreateGetFaqDetailResponse() (response *GetFaqDetailResponse) {
response = &GetFaqDetailResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
// 热门faq列表
type HotFaq struct {
Id int64 `json:"id"`
Title string `json:"title"`
ParentId int64 `json:"parent_id"`
ParentTitle string `json:"parent_title"`
}
type GetHotFaqRequest struct {
*requests.JsonRequest
}
type GetHotFaqResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data []HotFaq `json:"data"`
}
func CreateGetHotFaqRequest() (req *GetHotFaqRequest) {
req = &GetHotFaqRequest{
JsonRequest: &requests.JsonRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/v1/faq/hot_list")
req.Method = requests.POST
return
}
func CreateGetHotFaqResponse() (response *GetHotFaqResponse) {
response = &GetHotFaqResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
// 清理faq树缓存
type ClearFaqListCacheRequest struct {
*requests.JsonRequest
}
type ClearFaqListCacheResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
}
func CreateClearFaqListCacheRequest() (req *ClearFaqListCacheRequest) {
req = &ClearFaqListCacheRequest{
JsonRequest: &requests.JsonRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/v1/faq/clear_list_cache")
req.Method = requests.POST
return
}
func CreateClearFaqListCacheResponse() (response *ClearFaqListCacheResponse) {
response = &ClearFaqListCacheResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
// 清理faq详情缓存
type ClearFaqDetailCacheRequest struct {
*requests.JsonRequest
Id int64 `position:"Json" field:"id"`
}
type ClearFaqDetailCacheResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
}
func CreateClearFaqDetailCacheRequest(param FaqDetailRequest) (req *ClearFaqDetailCacheRequest) {
req = &ClearFaqDetailCacheRequest{
JsonRequest: &requests.JsonRequest{},
Id: param.Id,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/faq/clear_detail_cache")
req.Method = requests.POST
return
}
func CreateClearFaqDetailCacheResponse() (response *ClearFaqDetailCacheResponse) {
response = &ClearFaqDetailCacheResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
// 清理热门faq缓存
type ClearHotFaqCacheRequest struct {
*requests.JsonRequest
}
type ClearHotFaqCacheResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
}
func CreateClearHotFaqCacheRequest() (req *ClearHotFaqCacheRequest) {
req = &ClearHotFaqCacheRequest{
JsonRequest: &requests.JsonRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/v1/faq/clear_hot_list_cache")
req.Method = requests.POST
return
}
func CreateClearHotFaqCacheResponse() (response *ClearHotFaqCacheResponse) {
response = &ClearHotFaqCacheResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}

320
services/cs/order.go Normal file
View File

@ -0,0 +1,320 @@
package cs
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
/**
* 客服工单相关方法
*/
type UploadRequest struct {
*requests.StreamRequest
FileStream []byte
}
type UploadResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
FileName string `json:"file_name"`
FileUrl string `json:"file_url"`
FilePath string `json:"file_path"`
}
TraceId string `json:"trace_id"`
}
func CreateUploadRequest() (req *UploadRequest) {
req = &UploadRequest{
StreamRequest: &requests.StreamRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/v1/work_order/upload_image")
req.Method = requests.POST
return
}
func CreateUploadResponse() (resp *UploadResponse) {
return &UploadResponse{
BaseResponse: &responses.BaseResponse{},
}
}
// 获取工单补充字段设置
// GetOrderFurtherPartParam 请求参数
type GetOrderFurtherPartParam struct {
OrderNum string `json:"order_num"`
}
type GetOrderFurtherPartRequest struct {
*requests.JsonRequest
OrderNum string `position:"Json" field:"order_num"`
}
type OrderFurtherPart struct {
OrderNum string `json:"order_num"`
FurtherParts []*OrderPart `json:"further_parts"`
}
type GetOrderFurtherPartResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Data OrderFurtherPart `json:"data"`
Msg string `json:"msg"`
}
func CreateGetOrderFurtherPartRequest(param GetOrderFurtherPartParam) (req *GetOrderFurtherPartRequest) {
req = &GetOrderFurtherPartRequest{
JsonRequest: &requests.JsonRequest{},
OrderNum: param.OrderNum,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/work_order/get_order_further_part")
req.Method = requests.POST
return
}
func CreateGetOrderFurtherPartResponse() (resp *GetOrderFurtherPartResponse) {
return &GetOrderFurtherPartResponse{
BaseResponse: &responses.BaseResponse{},
}
}
// OrderUrgentParam 用户催单
type OrderUrgentParam struct {
OrderNum string `json:"order_num"`
}
type OrderUrgentRequest struct {
*requests.JsonRequest
OrderNum string `position:"Json" field:"order_num"`
}
type OrderUrgentResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
}
func CreateOrderUrgentRequest(param OrderUrgentParam) (req *OrderUrgentRequest) {
req = &OrderUrgentRequest{
JsonRequest: &requests.JsonRequest{},
OrderNum: param.OrderNum,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/work_order/order_urgent")
req.Method = requests.POST
return
}
func CreateOrderUrgentResponse() (resp *OrderUrgentResponse) {
return &OrderUrgentResponse{
BaseResponse: &responses.BaseResponse{},
}
}
// OrderUpdateHandleParam 更新工单处理标识
type OrderUpdateHandleParam struct {
OrderNum string `json:"order_num"`
IsHandle int64 `json:"is_handle"`
}
type OrderUpdateHandleRequest struct {
*requests.JsonRequest
OrderNum string `position:"Json" field:"order_num"`
IsHandle int64 `position:"Json" field:"is_handle"`
}
type OrderUpdateHandleResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
}
func CreateOrderUpdateHandleRequest(param OrderUpdateHandleParam) (req *OrderUpdateHandleRequest) {
req = &OrderUpdateHandleRequest{
JsonRequest: &requests.JsonRequest{},
OrderNum: param.OrderNum,
IsHandle: param.IsHandle,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/work_order/order_handle")
req.Method = requests.POST
return
}
func CreateOrderUpdateHandleResponse() (resp *OrderUpdateHandleResponse) {
return &OrderUpdateHandleResponse{
BaseResponse: &responses.BaseResponse{},
}
}
// OrderAppraiseParam 用户评价工单
type OrderAppraiseParam struct {
OrderNum string `json:"order_num"`
Score int `json:"score"`
}
type OrderAppraiseRequest struct {
*requests.JsonRequest
OrderNum string `position:"Json" field:"order_num"`
Score int `position:"Json" field:"score"`
}
type OrderAppraiseResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
}
func CreateOrderAppraiseRequest(param OrderAppraiseParam) (req *OrderAppraiseRequest) {
req = &OrderAppraiseRequest{
JsonRequest: &requests.JsonRequest{},
OrderNum: param.OrderNum,
Score: param.Score,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/work_order/order_appraise")
req.Method = requests.POST
return
}
func CreateOrderAppraiseResponse() (resp *OrderAppraiseResponse) {
return &OrderAppraiseResponse{
BaseResponse: &responses.BaseResponse{},
}
}
// OrderRestartParam 用户重启工单
type OrderRestartParam struct {
OrderNum string `json:"order_num"`
SysRemarkContent string `json:"sys_remark_content"`
SysRemarkPic []string `json:"sys_remark_pic"`
UserName string `json:"user_name"`
}
type OrderRestartRequest struct {
*requests.JsonRequest
OrderNum string `position:"Json" field:"order_num"`
SysRemarkContent string `position:"Json" field:"sys_remark_content"`
SysRemarkPic []string `position:"Json" field:"sys_remark_pic"`
UserName string `position:"Json" field:"user_name"`
}
type OrderRestartResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
}
func CreateOrderRestartRequest(param OrderRestartParam) (req *OrderRestartRequest) {
req = &OrderRestartRequest{
JsonRequest: &requests.JsonRequest{},
OrderNum: param.OrderNum,
SysRemarkContent: param.SysRemarkContent,
SysRemarkPic: param.SysRemarkPic,
UserName: param.UserName,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/work_order/order_restart")
req.Method = requests.POST
return
}
func CreateOrderRestartResponse() (resp *OrderRestartResponse) {
return &OrderRestartResponse{
BaseResponse: &responses.BaseResponse{},
}
}
// OrderSubmitParam 工单提交
type OrderSubmitParam struct {
SysGameId int64 `json:"sys_game_id"`
SysUserName string `json:"sys_user_name"`
SysUid int64 `json:"sys_uid"`
SysRoleId string `json:"sys_role_id"`
SysRoleName string `json:"sys_role_name"`
SysServerName string `json:"sys_server_name"`
SysOrderTemplateCode string `json:"sys_order_template_code"`
SysDetail string `json:"sys_detail"`
SysPhone string `json:"sys_phone"`
ApplyIp string `json:"apply_ip"`
SysOrderParts []OrderSubmitPart `json:"sys_order_parts"`
SysSmsCode string `json:"sys_sms_code"`
}
type OrderSubmitPart struct {
PartId int64 `json:"part_id"`
PartKey string `json:"part_key"`
PartName string `json:"part_name"`
PartValue string `json:"part_value"`
PartType int64 `json:"part_type"`
PicValue []string `json:"pic_value"`
}
type OrderSubmitRequest struct {
*requests.JsonRequest
SysGameId int64 `position:"Json" field:"sys_game_id"`
SysUserName string `position:"Json" field:"sys_user_name"`
SysUid int64 `position:"Json" field:"sys_uid"`
SysRoleId string `position:"Json" field:"sys_role_id"`
SysRoleName string `position:"Json" field:"sys_role_name"`
SysServerName string `position:"Json" field:"sys_server_name"`
SysOrderTemplateCode string `position:"Json" field:"sys_order_template_code"`
SysDetail string `position:"Json" field:"sys_detail"`
SysPhone string `position:"Json" field:"sys_phone"`
ApplyIp string `position:"Json" field:"apply_ip"`
SysOrderParts []OrderSubmitPart `position:"Json" field:"sys_order_parts"`
SysSmsCode string `position:"Json" field:"sys_sms_code"`
}
type OrderSubmitResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
OrderNum string `json:"order_num"`
} `json:"data"`
}
func CreateOrderSubmitRequest(param OrderSubmitParam) (req *OrderSubmitRequest) {
req = &OrderSubmitRequest{
JsonRequest: &requests.JsonRequest{},
SysGameId: param.SysGameId,
SysUserName: param.SysUserName,
SysUid: param.SysUid,
SysRoleId: param.SysRoleId,
SysRoleName: param.SysRoleName,
SysServerName: param.SysServerName,
SysOrderTemplateCode: param.SysOrderTemplateCode,
SysDetail: param.SysDetail,
SysPhone: param.SysPhone,
ApplyIp: param.ApplyIp,
SysOrderParts: param.SysOrderParts,
SysSmsCode: param.SysSmsCode,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/work_order/order_submit")
req.Method = requests.POST
return
}
func CreateOrderSubmitResponse() (resp *OrderSubmitResponse) {
return &OrderSubmitResponse{
BaseResponse: &responses.BaseResponse{},
}
}
// OrderFurtherPartParam 工单补充资料
type OrderFurtherPartParam struct {
OrderNum string `json:"order_num"`
OrderParts []OrderSubmitPart `json:"order_parts"`
UserName string `json:"user_name"`
}
type OrderFurtherPartRequest struct {
*requests.JsonRequest
OrderNum string `position:"Json" field:"order_num"`
OrderParts []OrderSubmitPart `position:"Json" field:"order_parts"`
UserName string `position:"Json" field:"user_name"`
}
type OrderFurtherPartResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
}
func CreateOrderFurtherPartRequest(param OrderFurtherPartParam) (req *OrderFurtherPartRequest) {
req = &OrderFurtherPartRequest{
JsonRequest: &requests.JsonRequest{},
OrderNum: param.OrderNum,
OrderParts: param.OrderParts,
UserName: param.UserName,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/work_order/order_further_data")
req.Method = requests.POST
return
}
func CreateOrderFurtherPartResponse() (resp *OrderFurtherPartResponse) {
return &OrderFurtherPartResponse{
BaseResponse: &responses.BaseResponse{},
}
}

140
services/cs/orderrecord.go Normal file
View File

@ -0,0 +1,140 @@
package cs
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
// 获取客服工单列表
type GetWorkOrderRecordListParam struct {
OrderNum string `position:"Json" field:"order_num"`
Page int64 `position:"Json" field:"page"`
PageSize int64 `position:"Json" field:"page_size"`
UserName string `position:"Json" field:"user_name"`
GameId int64 `position:"Json" field:"game_id"`
HandleStatus string `position:"Json" field:"handle_status"`
}
type OrderRecord struct {
OrderNum string `json:"order_num"`
WorkOrderTemplateFirstLevelName string `json:"work_order_template_first_level_name"`
UserName string `json:"user_name"`
GameId int64 `json:"game_id"`
GameName string `json:"game_name"`
RoleId string `json:"role_id"`
RoleName string `json:"role_name"`
ServerName string `json:"server_name"`
Detail string `json:"detail"`
ApplyTime string `json:"apply_time"`
HandleStatus string `json:"handle_status"`
HandleStatusName string `json:"handle_status_name"`
IsUrgent int64 `json:"is_urgent"`
IsAppraise int64 `json:"is_appraise"`
FinishTime string `json:"finish_time"`
OrderParts []*OrderSubmitPart `json:"order_parts"`
Id int64 `json:"id"`
WorkOrderTemplateFirstLevelId int64 `json:"work_order_template_first_level_id"`
WorkOrderTemplateId int64 `json:"work_order_template_id"`
WorkOrderTemplateName string `json:"work_order_template_name"`
Uid int64 `json:"uid"`
OrderStatus string `json:"order_status"`
OrderStatusName string `json:"order_status_name"`
}
// PageInfoResp 分页响应
type PageInfoResp struct {
Page int `json:"page"`
PageSize int `json:"page_size"`
TotalNumber int `json:"total_number"`
TotalPage int `json:"total_page"`
}
type GetWorkOrderRecordListResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Data struct {
Data []*OrderRecord `json:"data"`
PageInfo *PageInfoResp `json:"page_info"`
} `json:"data"`
Msg string `json:"msg"`
TraceId string `json:"trace_id"`
}
type GetWorkOrderRecordListRequest struct {
*requests.JsonRequest
OrderNum string `position:"Json" field:"order_num"`
Page int64 `position:"Json" field:"page"`
PageSize int64 `position:"Json" field:"page_size"`
UserName string `position:"Json" field:"user_name"`
GameId int64 `position:"Json" field:"game_id"`
HandleStatus string `position:"Json" field:"handle_status"`
}
func CreateGetWorkOrderRecordListRequest(param GetWorkOrderRecordListParam) (req *GetWorkOrderRecordListRequest) {
req = &GetWorkOrderRecordListRequest{
JsonRequest: &requests.JsonRequest{},
}
req.OrderNum = param.OrderNum
req.Page = param.Page
req.PageSize = param.PageSize
req.UserName = param.UserName
req.GameId = param.GameId
req.HandleStatus = param.HandleStatus
req.InitWithApiInfo(HOST, VERSION, "/v1/work_order/order_record_list")
req.Method = requests.POST
return
}
func CreateGetWorkOrderRecordListResponse() (resp *GetWorkOrderRecordListResponse) {
resp = &GetWorkOrderRecordListResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
// 工单详情
type OrderDetailParam struct {
OrderNum string `json:"order_num"`
}
type OrderLog struct {
Id int64 `json:"id"`
ApplyCount int64 `json:"apply_count"`
ActionType string `json:"action_type"`
PlayerLinkType string `json:"player_link_type"`
PlayerLinkTypeName string `json:"player_link_type_name"`
Content []*OrderSubmitPart `json:"content"`
PicContent []*OrderSubmitPart `json:"pic_content"`
CreatedAt string `json:"created_at"`
}
type OrderDetail struct {
OrderRecord *OrderRecord `json:"order_record"`
OrderLogs []*OrderLog `json:"order_logs"`
}
type GetWorkOrderRecordDetailResp struct {
*responses.BaseResponse
Code int `json:"code"`
Data OrderDetail `json:"data"`
Msg string `json:"msg"`
}
type GetWorkOrderRecordDetailReq struct {
*requests.JsonRequest
OrderNum string `position:"Json" field:"order_num"`
}
func CreateGetWorkOrderRecordDetailRequest(param OrderDetailParam) (req *GetWorkOrderRecordDetailReq) {
req = &GetWorkOrderRecordDetailReq{
JsonRequest: &requests.JsonRequest{},
}
req.OrderNum = param.OrderNum
req.InitWithApiInfo(HOST, VERSION, "/v1/work_order/order_record_detail")
req.Method = requests.POST
return
}
func CreateGetWorkOrderRecordDetailResp() (resp *GetWorkOrderRecordDetailResp) {
resp = &GetWorkOrderRecordDetailResp{
BaseResponse: &responses.BaseResponse{},
}
return
}

View File

@ -0,0 +1,55 @@
package cs
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
// OrderTemplate 工单模板
type OrderTemplate struct {
Id int64 `json:"id"`
Name string `json:"name"`
UniqueCode string `json:"unique_code"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
TemplateParts []*OrderPart `json:"template_parts"`
}
// OrderPart 工单字段
type OrderPart struct {
Id int64 `json:"id"`
PartName string `json:"part_name"`
PartKey string `json:"part_key"`
PartType int64 `json:"part_type"`
IsRequire int64 `json:"is_require"`
TipsContent string `json:"tips_content"`
MaxNum int64 `json:"max_num"`
}
type OrderTemplateDetailReq struct {
*requests.JsonRequest
Id int64 `position:"Json" field:"id"`
}
type OrderTemplateDetailResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data OrderTemplate `json:"data"`
}
func CreateOrderTemplateDetailReq(templateId int64) (req *OrderTemplateDetailReq) {
req = &OrderTemplateDetailReq{
JsonRequest: &requests.JsonRequest{},
Id: templateId,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/work_order_template/detail")
req.Method = requests.POST
return
}
func CreateOrderTemplateDetailResp() (response *OrderTemplateDetailResp) {
response = &OrderTemplateDetailResp{
BaseResponse: &responses.BaseResponse{},
}
return
}

BIN
services/cs/test.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

157
services/cs/user.go Normal file
View File

@ -0,0 +1,157 @@
package cs
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
/**
* 获取玩家用户相关信息
*/
// UserInfo 用户信息
type UserInfo struct {
UserName string `json:"user_name"`
Uid int64 `json:"uid"`
Telephone string `json:"telephone"`
}
type GetUserInfoRequest struct {
*requests.RpcRequest
}
type GetUserInfoResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data UserInfo `json:"data"`
}
func CreateGetUserInfoRequest(userName string) (req *GetUserInfoRequest) {
req = &GetUserInfoRequest{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/v1/user/info")
req.FormParams = map[string]string{
"user_name": userName,
}
req.Method = requests.POST
return
}
func CreateGetUserInfoResponse() (response *GetUserInfoResponse) {
response = &GetUserInfoResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
// UserRoleInfo 玩家角色信息
type UserRoleInfo struct {
Uid int64 `json:"uid"`
RoleName string `json:"role_name"`
RoleId string `json:"role_id"`
}
type GetUserRoleListRequest struct {
*requests.JsonRequest
}
type GetUserRoleListResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data []UserRoleInfo `json:"data"`
}
func CreateGetUserRoleListRequest(uId int64, gameId int64) (req *GetUserRoleListRequest) {
req = &GetUserRoleListRequest{
JsonRequest: &requests.JsonRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/v1/user/role_list")
req.JsonParams["uid"] = uId
req.JsonParams["game_id"] = gameId
req.Method = requests.POST
return
}
func CreateGetUserRoleListResponse() (response *GetUserRoleListResponse) {
response = &GetUserRoleListResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
// UserServerInfo 玩家区服信息
type UserServerInfo struct {
ServerName string `json:"server_name"`
}
type GetUserServerListRequest struct {
*requests.JsonRequest
}
type GetUserServerListResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data []UserServerInfo `json:"data"`
}
func CreateGetUserServerListRequest(uId int64, gameId int64) (req *GetUserServerListRequest) {
req = &GetUserServerListRequest{
JsonRequest: &requests.JsonRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/v1/user/server_list")
req.JsonParams["uid"] = uId
req.JsonParams["game_id"] = gameId
req.Method = requests.POST
return
}
func CreateGetUserServerListResponse() (response *GetUserServerListResponse) {
response = &GetUserServerListResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
type SendSmsReq struct {
Phone string `json:"phone"`
}
// SendSmsResp 发送短信返回
type SendSmsResp struct {
// 短信发送时间戳,工单模块 有效期5分钟
SendCodeTime int64 `json:"send_code_time"`
}
type SendSmsRequest struct {
*requests.JsonRequest
Phone string `position:"Json" field:"phone"`
}
type SendSmsResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data SendSmsResp `json:"data"`
}
func CreateSendSmsRequest(param SendSmsReq) (req *SendSmsRequest) {
req = &SendSmsRequest{
JsonRequest: &requests.JsonRequest{},
Phone: param.Phone,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/user/send_sms")
req.Method = requests.POST
return
}
func CreateSendSmsResponse() (response *SendSmsResponse) {
response = &SendSmsResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}

43
services/game/channel.go Normal file
View File

@ -0,0 +1,43 @@
package game
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type ChannelInfoReq struct {
*requests.RpcRequest
ChannelId int64 `position:"Body" field:"channelId"`
ChannelKey string `position:"Body" field:"channelKey"`
}
type ChannelInfoResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data map[int64]struct {
Id int64 `json:"id"`
PlatKey string `json:"plat_key"`
PlatName string `json:"plat_name"`
PlatCompany string `json:"plat_company"`
PlatUrl string `json:"plat_url"`
Company string `json:"company"`
PlatCategoryId int64 `json:"plat_category_id"`
CategoryName string `json:"category_name"`
} `json:"data"`
}
func CreateChannelInfoReq() *ChannelInfoReq {
req := &ChannelInfoReq{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/channel/getChannelInfo")
return req
}
func CreateChannelInfoResp() *ChannelInfoResp {
resp := &ChannelInfoResp{
BaseResponse: &responses.BaseResponse{},
}
return resp
}

View File

@ -6,7 +6,7 @@ import (
)
const (
VERSION = "2020-11-16"
VERSION = "2025-05-28"
)
var HOST = requests.Host{
@ -29,3 +29,97 @@ func (c *Client) GetGameOsInfo(req *GetGameOsInfoReq) (resp *GetGameOsInfoResp,
err = c.DoAction(req, resp)
return
}
// GetGameInfo 获取游戏信息
func (c *Client) GetGameInfo(req *GetGameInfoReq) (resp *GetGameInfoResp, err error) {
resp = CreateGetGameInfoByIdResp()
err = c.DoAction(req, resp)
return
}
func (c *Client) GetChannelInfo(req *ChannelInfoReq) (resp *ChannelInfoResp, err error) {
resp = CreateChannelInfoResp()
err = c.DoAction(req, resp)
return
}
func (c *Client) GetLoginInfoById(req *GetLoginInfoByIdReq) (resp *GetLoginInfoByIdResp, err error) {
resp = CreateGetLoginInfoByIdResp()
err = c.DoAction(req, resp)
return
}
func (c *Client) GetProtocolByGameId(req *GetProtocolByGameIdRep) (resp *GetProtocolByGameIdResp, err error) {
resp = CreateGetProtocolByGameIdResp()
err = c.DoAction(req, resp)
return
}
// GetGameSimpleList 获取子游戏简单列表
func (c *Client) GetGameSimpleList(req *GetGameSimpleListReq) (resp *GetGameSimpleListResp, err error) {
resp = CreateGetGameSimpleListResp()
err = c.DoAction(req, resp)
return
}
// GetGameServerV2 获取游戏服务器列表v2
func (c *Client) GetGameServerV2(req *GetServerV2Request) (resp *GetServerV2Response, err error) {
resp = CreateGetServerV2Response()
err = c.DoAction(req, resp)
return
}
// GetGameCompany 获取单个根游戏信息
func (c *Client) GetGameCompany(req *GetGameCompanyReq) (resp *GetGameCompanyResp, err error) {
resp = CreateGetGameCompanyResp()
err = c.DoAction(req, resp)
return
}
// GetIsBlockOutIos 获取iOS切支付规则
func (c *Client) GetIsBlockOutIos(req *IsBlockOutIosReq) (resp *IsBlockOutIosResp, err error) {
resp = CreateIsBlockOutIosResp()
err = c.DoAction(req, resp)
return
}
func (c *Client) GetGameVersion(req *GetGameVersionReq) (resp *GetGameVersionResp, err error) {
resp = CreateGetGameVersionResp()
err = c.DoAction(req, resp)
return
}
// GetConfig 获取游戏全局配置
func (c *Client) GetConfig(req *GetConfigReq) (resp *GetConfigResp, err error) {
resp = CreateGetConfigResp()
err = c.DoAction(req, resp)
return
}
// GetRealAuthBlackList 获取实名黑名单
func (c *Client) GetRealAuthBlackList(req *GetRealAuthBlackListReq) (resp *GetRealAuthBlackListResp, err error) {
resp = CreateGetRealAuthBlackListResp()
err = c.DoAction(req, resp)
return
}
// GetGameRealAuthInfo 获取实名参数
func (c *Client) GetGameRealAuthInfo(req *GetGameRealAuthInfoReq) (resp *GetGameRealAuthInfoResp, err error) {
resp = CreateGetGameRealAuthInfoResp()
err = c.DoAction(req, resp)
return
}
// GetProtocolByCompany 根据主体获取用户协议
func (c *Client) GetProtocolByCompany(req *GetProtocolByCompanyRep) (resp *GetProtocolByCompanyResp, err error) {
resp = CreateGetProtocolByCompanyResp()
err = c.DoAction(req, resp)
return
}
// KickUser 踢人
func (c *Client) KickUser(req *KickUserReq) (resp *KickUserResp, err error) {
resp = CreateKickUserResp()
err = c.DoAction(req, resp)
return
}

View File

@ -3,6 +3,7 @@ package game
import (
"fmt"
"testing"
"time"
)
func TestGetGameOsInfo(t *testing.T) {
@ -20,3 +21,209 @@ func TestGetGameOsInfo(t *testing.T) {
fmt.Println(resp.Code, resp.Msg, resp.Data.OsList, resp.Data.OsRelList2)
}
func TestGetGameInfo(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
resp, err := client.GetGameInfo(CreateGetGameInfoByIdReq(797, 1))
if err != nil {
panic(err)
}
fmt.Println(resp.Code, resp.Msg, resp.Data.GameHomeShortImage)
}
func TestChannelInfo(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
req := CreateChannelInfoReq()
req.ChannelKey = "GRSDK"
resp, err := client.GetChannelInfo(req)
if err != nil {
panic(err)
}
fmt.Println(resp)
}
func TestLoginInfoById(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
req := CreateGetLoginInfoByIdReq(7349, "1.0.0")
info, err := client.GetLoginInfoById(req)
if err != nil {
t.Error(err)
return
}
fmt.Println(info)
}
func TestGetProtocolByGameId(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
req := CreateGetProtocolByGameIdRep()
req.GameId = 8088
req.GameVersion = "1.1.0"
req.Type = 1
info, err := client.GetProtocolByGameId(req)
if err != nil {
t.Error(err)
return
}
fmt.Println(info)
}
func TestGetGameSimpleList(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
req := CreateGetGameSimpleListReq("8071,8062", "")
info, err := client.GetGameSimpleList(req)
if err != nil {
t.Error(err)
return
}
fmt.Println(info)
}
func TestGetGameServerV2(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateGetServerV2Request("n2", "", "")
info, err := client.GetGameServerV2(req)
if err != nil {
t.Error(err)
return
}
fmt.Println(info)
}
func TestGetGameCompany(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
}
req := CreateGetGameCompanyReq("ascq")
gameCompany, err := client.GetGameCompany(req)
if err != nil {
t.Error(err)
return
}
fmt.Println(gameCompany)
fmt.Println(gameCompany.Data.System)
}
func TestIsBlockOutIos(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
}
isBlockOutIosReq := CreateIsBlockOutIosReq("ec63860282", 4570, "116.26.129.38", "", 0, 0)
isBlockOutIos, err := client.GetIsBlockOutIos(isBlockOutIosReq)
if err != nil {
t.Error(err)
return
}
t.Log(isBlockOutIos)
}
// 获取游戏全局配置
func TestGetConfig(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
}
getConfigReq := CreateGetConfigReq("overlord_act_config")
isBlockOutIos, err := client.GetConfig(getConfigReq)
if err != nil {
t.Error(err)
return
}
t.Log(isBlockOutIos)
}
// 获取实名黑名单
func TestGetRealAuthBlackList(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
}
getRealAuthBlackListReq := CreateGetRealAuthBlackListReq()
isBlockOutIos, err := client.GetRealAuthBlackList(getRealAuthBlackListReq)
if err != nil {
t.Error(err)
return
}
t.Log(isBlockOutIos)
}
// 获取游戏实名参数
func TestGetGameRealAuthInfo(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
}
getGameRealAuthInfoReq := CreateGetGameRealAuthInfoReq(7081)
isBlockOutIos, err := client.GetGameRealAuthInfo(getGameRealAuthInfoReq)
if err != nil {
t.Error(err)
return
}
t.Log(isBlockOutIos)
}
func TestGetGameVersion(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
return
}
req := CreateGetGameVersionReq(8071, "1.0.6")
resp, err := client.GetGameVersion(req)
if err != nil {
t.Error(err)
return
}
t.Log(resp)
}
func TestClient_GetProtocolByCompany(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
return
}
req := CreateGetProtocolByCompanyRep()
req.Company = "GR"
req.Type = 0
resp, err := client.GetProtocolByCompany(req)
if err != nil {
t.Error(err)
return
}
t.Log(resp.Code, resp.Msg, resp.Data.Content)
}
// 测试踢人
func TestKickUser(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
} // CreateKickUserReq
getRealAuthBlackListReq := CreateKickUserReq(8677, "wzcqtest", "8676", time.Now().Unix())
kickUserResp, err := client.KickUser(getRealAuthBlackListReq)
if err != nil {
t.Error(err)
return
}
t.Log(kickUserResp)
}

View File

@ -1,6 +1,7 @@
package game
import (
"fmt"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
@ -47,3 +48,443 @@ func CreateGetGameOsInfoResp() *GetGameOsInfoResp {
BaseResponse: &responses.BaseResponse{},
}
}
type GetGameInfoReq struct {
*requests.RpcRequest
}
type GetGameInfoResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data GameInfoData `json:"data"`
}
type GetGameInfoReqData struct {
GameId int
NoCache int
}
type GameInfoData struct {
AcceptRelatedGame int `json:"accept_related_game"`
ActCodeState int `json:"act_code_state"`
AgentSign string `json:"agent_sign"`
AppId string `json:"app_id"`
AppName string `json:"app_name"`
Autologin int `json:"autologin"`
BName string `json:"b_name"`
BackResult int `json:"back_result"`
BusinessPurpose int `json:"business_purpose"`
ChannelShow int `json:"channel_show"`
ClientType int `json:"client_type"`
Company string `json:"company"`
CreatedAt string `json:"created_at"`
CreatedRealname string `json:"created_realname"`
CreatedUsername string `json:"created_username"`
DisableBack int `json:"disable_back"`
DisablePay int `json:"disable_pay"`
DisableRegister int `json:"disable_register"`
DisableRelatedBack int `json:"disable_related_back"`
DisableUnrelatedLogin int `json:"disable_unrelated_login"`
Discount int `json:"discount"`
Divide int `json:"divide"`
DownloadDomain string `json:"download_domain"`
DownloadId string `json:"download_id"`
ExchangeRate int `json:"exchange_rate"`
ExtData string `json:"ext_data"`
Fcmathod int `json:"fcmathod"`
FirstLetter string `json:"first_letter"`
FlashAuthId string `json:"flash_auth_id"`
FlashAuthKey string `json:"flash_auth_key"`
FlashAuthLogo string `json:"flash_auth_logo"`
FlashAuthName string `json:"flash_auth_name"`
FlashAuthStatus int `json:"flash_auth_status"`
FlashPassId string `json:"flash_pass_id"`
FlashPassKey string `json:"flash_pass_key"`
GameByname string `json:"game_byname"`
GameIconImg string `json:"game_icon_img"`
GameImage string `json:"game_image"`
GameHomeImage string `json:"game_home_image"`
GameHomeShortImage string `json:"game_home_short_image"`
GameSign string `json:"game_sign"`
GameTsUrl string `json:"game_ts_url"`
GameVersion string `json:"game_version"`
GameZsUrl string `json:"game_zs_url"`
GetRoleUrl string `json:"get_role_url"`
HideRedButton int `json:"hide_red_button"`
Icon string `json:"icon"`
Icp string `json:"icp"`
IcpUrl string `json:"icp_url"`
Id int `json:"id"`
IsAugment int `json:"is_augment"`
IsOpen int `json:"is_open"`
IsSync int `json:"is_sync"`
MarketName string `json:"market_name"`
MediaAbbr string `json:"media_abbr"`
MobileLoginState int `json:"mobile_login_state"`
MobileRegState int `json:"mobile_reg_state"`
Name string `json:"name"`
ObjectiveId int `json:"objective_id"`
OpenGame int `json:"open_game"`
Os int `json:"os"`
OsTwo int `json:"os_two"`
Owner int `json:"owner"`
PackageNameId int `json:"package_name_id"`
PayUrl string `json:"pay_url"`
PlatId int `json:"plat_id"`
Platform int `json:"platform"`
ProtocolPreState int `json:"protocol_pre_state"`
Rank int `json:"rank"`
RegisterProtocolState int `json:"register_protocol_state"`
RelateGame string `json:"relate_game"`
ReleaseState int `json:"release_state"`
Remark string `json:"remark"`
RequestDomain string `json:"request_domain"`
ResultCode string `json:"result_code"`
ScreenType int `json:"screen_type"`
ServerGroupId int `json:"server_group_id"`
ServerSign int `json:"server_sign"`
SimId int `json:"sim_id"`
SpareRequestDomain string `json:"spare_request_domain"`
TwOs int `json:"tw_os"`
TwPlatId int `json:"tw_plat_id"`
UpdatedAt string `json:"updated_at"`
UpdatedRealname string `json:"updated_realname"`
UpdatedUsername string `json:"updated_username"`
IsAuth int `json:"is_auth"`
}
func CreateGetGameInfoByIdReq(gameId, noCache int) *GetGameInfoReq {
req := &GetGameInfoReq{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, fmt.Sprintf("/api/game/getGameById/%d?no_cache=%d", gameId, noCache))
req.Method = requests.GET
return req
}
func CreateGetGameInfoByIdResp() *GetGameInfoResp {
return &GetGameInfoResp{
BaseResponse: &responses.BaseResponse{},
}
}
type GetGameSimpleListReq struct {
*requests.RpcRequest
}
type GetGameSimpleListResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data map[string]GameSimple `json:"data"`
}
type GameSimple struct {
ID int `json:"id"`
Name string `json:"name"`
GameSign string `json:"game_sign"`
}
// CreateGetGameSimpleListReq
// gids 子游戏字符串多个子游戏id用英文逗号分割
// game_signs 根游戏标识字符串,多个标识用英文逗号分割
func CreateGetGameSimpleListReq(gameIds string, gameSigns string) *GetGameSimpleListReq {
req := &GetGameSimpleListReq{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/game/getSimpleList")
tmpParams := make(map[string]string)
if gameIds != "" {
tmpParams["gids"] = gameIds
}
if gameSigns != "" {
tmpParams["game_signs"] = gameSigns
}
req.FormParams = tmpParams
req.Method = requests.POST
return req
}
func CreateGetGameSimpleListResp() *GetGameSimpleListResp {
return &GetGameSimpleListResp{
BaseResponse: &responses.BaseResponse{},
}
}
// GameCompany
// ==== 获取根游戏信息
type GameCompany struct {
Id int `json:"id"`
GameSign string `json:"game_sign"`
Name string `json:"name"`
GameName string `json:"game_name"`
ContractName string `json:"contract_name"`
PayKey string `json:"pay_key"`
LoginKey string `json:"login_key"`
LoginUrlH5 string `json:"login_url_h5"`
LoginUrlIos string `json:"login_url_ios"`
LoginUrlAndroid string `json:"login_url_android"`
PayUrl string `json:"pay_url"`
Ext string `json:"ext"`
Status int `json:"status"`
Company string `json:"company"`
System string `json:"system"`
Sync int `json:"sync"`
Type int `json:"type"`
GameProductId int `json:"game_product_id"`
}
type GetGameCompanyReq struct {
*requests.RpcRequest
}
type GetGameCompanyResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data GameCompany `json:"data"`
}
func CreateGetGameCompanyReq(gameSign string) *GetGameCompanyReq {
req := &GetGameCompanyReq{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/game/getGameCompanyBySign")
req.FormParams = map[string]string{
"gameSign": gameSign,
}
req.Method = requests.POST
return req
}
func CreateGetGameCompanyResp() *GetGameCompanyResp {
return &GetGameCompanyResp{
BaseResponse: &responses.BaseResponse{},
}
}
// ==== 获取游戏客户端版本配置
type GameVersion struct {
ID int `json:"id"`
GameID int `json:"game_id"`
GameVersion string `json:"version"`
GameURL string `json:"url"`
PayCallbackURL string `json:"pay_callback_url"`
DomainURL string `json:"domain_url"`
Status int `json:"status"`
H5Version int `json:"h5_version"`
H5Status int `json:"h5_status"`
IsH5Logout int `json:"is_h5_logout"`
HideWindow int `json:"hidewindow"`
PayInfo PayInfo `json:"pay_display_info"`
IsYsdk int `json:"is_ysdk"`
CheckVerified int `json:"check_verified"`
Company string `json:"company"`
CompanyKf string `json:"company_kf"`
CompanyProto string `json:"company_proto"`
CompanySms string `json:"company_sms"`
KfStatus int `json:"kf_status"`
PopupTime int `json:"popup_time"`
ExtData map[string]any `json:"ext_data"`
VersionStatus int `json:"version_status"`
VersionTime int `json:"version_time"`
RequestDomain string `json:"request_domain"`
SpareRequestDomain string `json:"spare_request_domain"`
OtherRequestDomain string `json:"other_request_domain"`
}
type GetGameVersionReq struct {
*requests.RpcRequest
GameId int `position:"Body" field:"game_id"`
GameVersion string `position:"Body" field:"game_version"`
}
type GetGameVersionResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data GameVersion `json:"data"`
}
func CreateGetGameVersionReq(gameId int, gameVersion string) *GetGameVersionReq {
req := &GetGameVersionReq{
RpcRequest: &requests.RpcRequest{},
}
req.GameId = gameId
req.GameVersion = gameVersion
req.InitWithApiInfo(HOST, VERSION, "/api/game/getGameVersion")
req.Method = requests.POST
return req
}
func CreateGetGameVersionResp() *GetGameVersionResp {
return &GetGameVersionResp{
BaseResponse: &responses.BaseResponse{},
}
}
// GetConfigReq
// 游戏全局配置
type GetConfigReq struct {
*requests.RpcRequest
Key string `position:"Query" field:"key" default:"-" `
}
type GetConfigRespData struct {
Id int `json:"id"`
Key string `json:"key"`
ExtData string `json:"ext_data"`
}
type GetConfigResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data GetConfigRespData `json:"data"`
}
func CreateGetConfigReq(key string) *GetConfigReq {
req := &GetConfigReq{
RpcRequest: &requests.RpcRequest{},
}
req.Key = key
req.InitWithApiInfo(HOST, VERSION, "/api/game/getConfig")
req.Method = requests.GET
return req
}
func CreateGetConfigResp() *GetConfigResp {
return &GetConfigResp{
BaseResponse: &responses.BaseResponse{},
}
}
// GetRealAuthBlackListReq
// 获取实名黑名单
type GetRealAuthBlackListReq struct {
*requests.RpcRequest
Key string `position:"Query" field:"key" default:"-" `
}
type GetRealAuthBlackListRespDataItem struct {
Id int `json:"id"`
TrueName string `json:"true_name"`
IdCard string `json:"id_card"`
Remark string `json:"remark"`
CreateBy string `json:"create_by"`
UpdateBy string `json:"update_by"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
}
type GetRealAuthBlackListResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data []GetRealAuthBlackListRespDataItem `json:"data"`
}
func CreateGetRealAuthBlackListReq() *GetRealAuthBlackListReq {
req := &GetRealAuthBlackListReq{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/game/getRealAuthBlackList")
req.Method = requests.GET
return req
}
func CreateGetRealAuthBlackListResp() *GetRealAuthBlackListResp {
return &GetRealAuthBlackListResp{
BaseResponse: &responses.BaseResponse{},
}
}
// GetGameRealAuthInfoReq
// 获取实名参数
type GetGameRealAuthInfoReq struct {
*requests.RpcRequest
GameId int64 `position:"Body" field:"game_id" default:"-" `
}
type GetGameRealAuthInfoRespData struct {
GroupName string `json:"group_name"`
GroupDescription int `json:"group_description"`
VerifiedTime string `json:"verified_time"`
AreaProvince string `json:"area_province"`
VersionInfo string `json:"version_info"`
IsReal int `json:"is_real"`
IsDirect int `json:"is_direct"`
AuthChannel string `json:"auth_channel"`
StandbyAuthChannel string `json:"standby_auth_channel"`
ProtectTime int `json:"protect_time"`
GovIoReport int `json:"gov_io_report"`
MinorBan int `json:"minor_ban"`
}
type GetGameRealAuthInfoResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data GetGameRealAuthInfoRespData `json:"data"`
}
func CreateGetGameRealAuthInfoReq(gameId int64) *GetGameRealAuthInfoReq {
req := &GetGameRealAuthInfoReq{
RpcRequest: &requests.RpcRequest{},
GameId: gameId,
}
req.InitWithApiInfo(HOST, VERSION, "/api/login/getGameRealAuthInfo")
req.Method = requests.POST
return req
}
func CreateGetGameRealAuthInfoResp() *GetGameRealAuthInfoResp {
return &GetGameRealAuthInfoResp{
BaseResponse: &responses.BaseResponse{},
}
}
// KickUserReq
// 踢人下线
type KickUserReq struct {
*requests.RpcRequest
Uid int64 `position:"Body" field:"uid" default:"-" `
GameSign string `position:"Body" field:"game_sign" default:"-" `
ServerSign string `position:"Body" field:"server_sign" default:"-" `
Time int64 `position:"Body" field:"time" default:"-" `
}
type KickUserRespDataCallCpInfo struct {
Url string `json:"url"`
RequestParam map[string]any `json:"request_param"`
Response map[string]any `json:"response"`
}
type KickUserRespData struct {
CallCpInfo KickUserRespDataCallCpInfo `json:"call_cp_info"`
}
type KickUserResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data KickUserRespData `json:"data"`
}
func CreateKickUserReq(uid int64, gameSign string, serverSign string, time int64) *KickUserReq {
req := &KickUserReq{
RpcRequest: &requests.RpcRequest{},
Uid: uid,
GameSign: gameSign,
ServerSign: serverSign,
Time: time,
}
req.InitWithApiInfo(HOST, VERSION, "/api/game/kickUser")
req.Method = requests.POST
return req
}
func CreateKickUserResp() *KickUserResp {
return &KickUserResp{
BaseResponse: &responses.BaseResponse{},
}
}

View File

@ -0,0 +1,107 @@
package game
import (
"crypto/md5"
"encoding/hex"
"fmt"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
"time"
)
var (
gameServerKey = "gaoreapi"
)
// GetGameServerSign 子游戏区服信息,特有验签
func GetGameServerSign(gameId int) (ts int64, sign string) {
ts = time.Now().Unix()
hash := md5.New()
hash.Write([]byte(fmt.Sprintf("%v%v%v", gameId, ts, gameServerKey)))
hashBytes := hash.Sum(nil)
sign = hex.EncodeToString(hashBytes)
return
}
type GetServerIdRequest struct {
*requests.RpcRequest
}
type GetServerIdResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data map[string]string `json:"data"`
}
// CreateGetServerIdRequest
// Deprecated 方法已废弃,不要用
func CreateGetServerIdRequest(gameId int) (req *GetServerIdRequest) {
req = &GetServerIdRequest{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/game/getServerId")
// 获取时间戳、签名
ts, sign := GetGameServerSign(gameId)
req.FormParams = map[string]string{
"appid": fmt.Sprintf("%v", gameId),
"time": fmt.Sprintf("%v", ts),
"sign": sign,
}
req.Method = requests.POST
return
}
// CreateGetServerIdResponse
// Deprecated 方法已废弃,不要用
func CreateGetServerIdResponse() (response *GetServerIdResponse) {
response = &GetServerIdResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
// --------------游戏区服v2列表查询----------
// GetServerV2Request 请求结构体
type GetServerV2Request struct {
*requests.RpcRequest
}
type GetServerV2Response struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data []GameServerV2 `json:"data"`
}
type GameServerV2 struct {
ServerId int `json:"server_id"`
Name string `json:"name"`
GameSign string `json:"game_sign"`
ServerSign int `json:"server_sign"`
}
func CreateGetServerV2Request(gameSign string, serverSigns string, types string) (req *GetServerV2Request) {
req = &GetServerV2Request{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/game/getServerV2")
req.FormParams = map[string]string{
"game_sign": gameSign,
"server_signs": serverSigns,
"types": types,
}
req.Method = requests.POST
return
}
func CreateGetServerV2Response() (response *GetServerV2Response) {
response = &GetServerV2Response{
BaseResponse: &responses.BaseResponse{},
}
return
}

73
services/game/login.go Normal file
View File

@ -0,0 +1,73 @@
package game
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type GetLoginInfoByIdReq struct {
*requests.RpcRequest
GameId int `position:"Body" field:"game_id"`
GameVersion string `position:"Body" field:"game_version"`
Uid int `position:"Body" field:"uid"`
UserName string `position:"Body" field:"uname"`
}
type PayInfo struct {
HiddenAlipay int `json:"hide_alipay"`
HiddenWx int `json:"hide_wx"`
HiddenUnionPay int `json:"hide_union_pay"`
}
type GameVersionInfo struct {
AppName string `json:"app_name"`
AppID string `json:"app_id"`
LoginURL string `json:"login_url"`
PayURL string `json:"pay_url"`
GameURL string `json:"game_url"`
PayCallbackURL string `json:"pay_callback_url"`
IsH5Logout int `json:"is_h5_logout"`
HideWindow int `json:"hidewindow"`
GameVersion string `json:"version"`
GameSign string `json:"game_sign"`
GameSignName string `json:"game_sign_name"`
GameSignID int `json:"game_sign_id"`
IsYsdk int `json:"is_ysdk"`
Company string `json:"company"`
CompanyKf string `json:"company_kf"`
CompanyProto string `json:"company_proto"`
CompanySms string `json:"company_sms"`
KfStatus int `json:"kf_status"`
PopupTime int `json:"popup_time"`
GameId int `json:"game_id"`
ScreenType int `json:"screen_type"`
GameSwitch int `json:"game_switch"` // 根据上下文0 或 1 的整数表示布尔值
ExtData map[string]any `json:"ext_data"`
OsName string `json:"os_name"`
PayInfo PayInfo `json:"pay_info"`
}
type GetLoginInfoByIdResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data GameVersionInfo `json:"data"`
}
func CreateGetLoginInfoByIdReq(gameId int, gameVersion string) *GetLoginInfoByIdReq {
req := &GetLoginInfoByIdReq{
RpcRequest: &requests.RpcRequest{},
}
req.GameId = gameId
req.GameVersion = gameVersion
req.InitWithApiInfo(HOST, VERSION, "/api/login/getInfoById")
req.Method = requests.POST
return req
}
func CreateGetLoginInfoByIdResp() *GetLoginInfoByIdResp {
resp := &GetLoginInfoByIdResp{
BaseResponse: &responses.BaseResponse{},
}
return resp
}

67
services/game/news.go Normal file
View File

@ -0,0 +1,67 @@
package game
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type GetProtocolByGameIdRep struct {
*requests.RpcRequest
GameId int `position:"Query" field:"game_id"`
GameVersion string `position:"Query" field:"game_version"`
Type int `position:"Query" field:"type"`
}
type GetProtocolByGameIdResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
Content string `json:"content"`
} `json:"data"`
}
func CreateGetProtocolByGameIdRep() *GetProtocolByGameIdRep {
req := &GetProtocolByGameIdRep{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/news/getProtocolByGameId")
req.Method = requests.GET
return req
}
func CreateGetProtocolByGameIdResp() *GetProtocolByGameIdResp {
return &GetProtocolByGameIdResp{
BaseResponse: &responses.BaseResponse{},
}
}
type GetProtocolByCompanyRep struct {
*requests.RpcRequest
Company string `position:"Query" field:"company"`
Type int `position:"Query" field:"type"`
}
type GetProtocolByCompanyResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
Content string `json:"content"`
} `json:"data"`
}
func CreateGetProtocolByCompanyRep() *GetProtocolByCompanyRep {
req := &GetProtocolByCompanyRep{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/news/getProtocolByCompany")
req.Method = requests.GET
return req
}
func CreateGetProtocolByCompanyResp() *GetProtocolByCompanyResp {
return &GetProtocolByCompanyResp{
BaseResponse: &responses.BaseResponse{},
}
}

60
services/game/pay.go Normal file
View File

@ -0,0 +1,60 @@
package game
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
// IsBlockOutIosReq
// 获取切支付规则
type IsBlockOutIosReq struct {
*requests.RpcRequest
UserName string `position:"Body" field:"user_name"`
GameId int64 `position:"Body" field:"appid"`
Ip string `position:"Body" field:"ip"`
Imei string `position:"Body" field:"imei"`
LoginDays int64 `position:"Body" field:"login_days"`
PlayTime int64 `position:"Body" field:"play_time"`
}
type IsBlockOutIosRespData struct {
PayInChannel bool `json:"pay_in_channel"`
PayInChannelMatchedRule []int64 `json:"pay_in_channel_matched_rule"`
DoDisplayIos bool `json:"do_display_ios"`
DoDisplayIosMatchedRule []int64 `json:"do_display_ios_matched_rule"`
DoDisplayWebsite bool `json:"do_display_website"`
DoDisplayWebsiteMatchedRule []int64 `json:"do_display_website_matched_rule"`
DoDisplayWebsiteWechatInfo string `json:"do_display_website_wechat_info"`
DoWebOrderPay bool `json:"do_web_order_pay"`
DoWebOrderPayMatchedRule []int64 `json:"do_web_order_pay_matched_rule"`
DoWebOrderPayWechatInfo string `json:"do_web_order_pay_wechat_info"`
}
type IsBlockOutIosResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data IsBlockOutIosRespData `json:"data"`
}
func CreateIsBlockOutIosReq(userName string, gameId int64, ip string, imei string, loginDays, playTime int64) *IsBlockOutIosReq {
req := &IsBlockOutIosReq{
RpcRequest: &requests.RpcRequest{},
}
req.UserName = userName
req.GameId = gameId
req.Ip = ip
req.Imei = imei
req.LoginDays = loginDays
req.PlayTime = playTime
req.InitWithApiInfo(HOST, VERSION, "/api/pay/isBlockOutIos")
req.Method = requests.POST
return req
}
func CreateIsBlockOutIosResp() *IsBlockOutIosResp {
resp := &IsBlockOutIosResp{
BaseResponse: &responses.BaseResponse{},
}
return resp
}

36
services/ip/client.go Normal file
View File

@ -0,0 +1,36 @@
package ip
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
)
const (
VERSION = "2025-06-24"
)
var HOST = requests.Host{
Default: "ip",
}
type Client struct {
sdk.Client
}
func NewClient() (client *Client, err error) {
client = new(Client)
err = client.Init()
return
}
func (client *Client) CreateGetIpRequest(req *IpRequest) (resp *IpResponse, err error) {
resp = CreateIpResponse()
err = client.DoAction(req, resp)
return
}
func (client *Client) CreateGetIpsRequest(req *IpsRequest) (resp *IpsResponse, err error) {
resp = CreateIpsResponse()
err = client.DoAction(req, resp)
return
}

View File

@ -0,0 +1,48 @@
package ip
import (
"fmt"
"testing"
)
// 测试获取单个ip地区信息
func TestGetIp(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateIpRequest(IpParam{
Ip: "114.234.202.136",
})
res, doErr := client.CreateGetIpRequest(req)
if doErr != nil {
panic(doErr)
}
if res.Code != 0 {
t.Error("查询多个ip失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}
// 测试获取多个ip地区信息
func TestGetIps(t *testing.T) {
client, newErr := NewClient()
if newErr != nil {
panic(newErr)
}
req := CreateIpsRequest(IpsParam{
Ips: []string{
"2001:ee0:5208:e600:4c51:3189:28a4:b668",
"114.234.202.136",
},
})
res, err := client.CreateGetIpsRequest(req)
if err != nil {
t.Error(err)
return
}
if res.Code != 0 {
t.Error("查询多个ip失败")
}
fmt.Printf(fmt.Sprintf("%v", res))
}

100
services/ip/ip.go Normal file
View File

@ -0,0 +1,100 @@
package ip
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type IpInfo struct {
Ip string `json:"ip"`
City string `json:"city"`
Province string `json:"province"`
Country string `json:"country"`
Isp string `json:"isp"`
Owner string `json:"owner"`
Continent string `json:"continent"`
Accuracy string `json:"accuracy"`
Adcode string `json:"adcode"`
Areacode string `json:"areacode"`
Asnumber string `json:"asnumber"`
Radius string `json:"radius"`
Latwgs string `json:"latwgs"`
Lngwgs string `json:"lngwgs"`
Source string `json:"source"`
Timezone string `json:"timezone"`
Zipcode string `json:"zipcode"`
District string `json:"district"`
}
// IpsParam
// 单个ip请求参数
type IpParam struct {
Ip string `json:"ip"`
}
type IpRequest struct {
*requests.JsonRequest
Ip string `position:"Json" field:"ip"`
}
// IpResponse
// 单个ip返回参数
type IpResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data IpInfo `json:"data"`
}
// CreateIpRequest
// 同时支持ipv4、ipv6格式查询
func CreateIpRequest(param IpParam) (req *IpRequest) {
req = &IpRequest{
JsonRequest: &requests.JsonRequest{},
Ip: param.Ip,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/getIp")
req.Method = requests.POST
return
}
func CreateIpResponse() (resp *IpResponse) {
resp = &IpResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
// 多个ip请求参数
type IpsParam struct {
Ips []string `json:"ips"`
}
type IpsRequest struct {
*requests.JsonRequest
Ips []string `position:"Json" field:"ips"`
}
// IpsResponse
// 多个ip返回参数
type IpsResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data map[string]IpInfo `json:"data"`
}
// CreateIpsRequest
// 同时支持ipv4、ipv6格式查询
func CreateIpsRequest(param IpsParam) (req *IpsRequest) {
req = &IpsRequest{
JsonRequest: &requests.JsonRequest{},
Ips: param.Ips,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/getIps")
req.Method = requests.POST
return
}
func CreateIpsResponse() (resp *IpsResponse) {
resp = &IpsResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}

View File

@ -1,6 +1,7 @@
package mkt
import (
"encoding/json"
"fmt"
"testing"
)
@ -18,5 +19,11 @@ func TestSubjectList(t *testing.T) {
panic(err)
}
marshal, err := json.Marshal(list.Data)
if err != nil {
panic(err)
}
fmt.Println(string(marshal))
fmt.Println(list.Status, list.Code, list.Msg, list.Data)
}

View File

@ -33,6 +33,7 @@ type Data struct {
State int `json:"state"`
System string `json:"system"`
Type int `json:"type"`
Uscc string `json:"uscc"`
}
// CreateSubjectListRequest 公司列表请求

61
services/msdk/client.go Normal file
View File

@ -0,0 +1,61 @@
package msdk
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
const VERSION = "2024-06-25"
var HOST = requests.Host{
Default: "msdk.api.gaore.com",
}
type Client struct {
sdk.Client
}
func NewClient() (client *Client, err error) {
client = &Client{}
err = client.Init()
return
}
// GetIdfa 获取设备归因信息
func (c *Client) GetIdfa(req *GetIdfaReq) (resp *GetIdfaResp, err error) {
resp = &GetIdfaResp{
BaseResponse: &responses.BaseResponse{},
}
if req.Imei == "" && req.Idfa != "" {
req.Imei = req.Idfa
}
err = c.DoAction(req, resp)
return
}
// GetUserAttr 获取用户归因信息
func (c *Client) GetUserAttr(req *GetUserAttrReq) (resp *GetUserAttrResp, err error) {
resp = &GetUserAttrResp{
BaseResponse: &responses.BaseResponse{},
}
err = c.DoAction(req, resp)
return
}
// GetImei 用户注册归因
func (c *Client) GetImei(req *GetImeiReq) (resp *GetImeiResp, err error) {
resp = &GetImeiResp{
BaseResponse: &responses.BaseResponse{},
}
err = c.DoAction(req, resp)
return
}
func (c *Client) SetImei(req *SetImeiReq) (resp *SetImeiResp, err error) {
resp = &SetImeiResp{
BaseResponse: &responses.BaseResponse{},
}
err = c.DoAction(req, resp)
return
}

View File

@ -0,0 +1,149 @@
package msdk
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils"
"testing"
)
func TestClient_GetUserAttr(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
return
}
req := CreateGetUserAttrReq("ql83649336", "xxhbbxxl")
resp, err := client.GetUserAttr(req)
if err != nil {
t.Error(err)
return
}
t.Log(resp)
}
func TestGetIdfa(t *testing.T) {
header := &requests.RefererHeader{
Referer: "https://www.gaore.com",
TraceId: utils.MakeTraceId(),
}
_ = header
client, err := NewClient()
if err != nil {
t.Error(err)
return
}
client.SetRefererHeader(header)
req := CreateGetIdfaReq()
req.ChannelId = 1
req.GameId = 3706
req.Ip = "112.23.230.210"
req.Imei = "00000000-0000-0000-0000-000000000000"
req.LongId = "daff65f07c7cf84862f4217773e3d613"
req.SdkVersion = "1.7.2"
req.Os = "ios"
req.GameOs = 2
req.GameSubOs = 0
req.Ua = "Mozilla/5.0 (iPad; CPU OS 15_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"
req.GameSign = "hlhj"
req.PkgAgentId = "100"
req.PkgSiteId = "1001"
req.Network = "Wifi"
req.Idfv = "53F2A5F7-B1D4-4716-9775-07727C29BC7A"
req.ScreenResolution = "2360*1640"
req.System = "15.6.1"
req.ProcessorModel = "iPad13,16"
req.BaseBand = ""
req.Model = "iPad13,16"
req.Battery = "74"
req.Oaid = ""
req.AdInfo = ""
req.WxPlatform = ""
req.AdDevice = "{\"bootTimeInSec\":\"1745364499\",\"countryCode\":\"CN\",\"language\":\"zh-Hans-CN\",\"deviceName\":\"1b9018182a49e16ba85bb095f224867c\",\"systemVersion\":\"15.6.1\",\"machine\":\"iPad13,16\",\"carrierInfo\":\"unknown\",\"memory\":\"8000356352\",\"disk\":\"255983177728\",\"sysFileTime\":\"1663537105.729985\",\"model\":\"J407AP\",\"timeZone\":\"28800\",\"mntId\":\"A058368B97B0D073829608AAC13FFA64D9BEFD0FE3E14EDB106F2BABD6DF94B1C2BFC7509CBB683EE5B22D91A19FF67A@/dev/disk0s1s1\",\"deviceInitTime\":\"1663537056.906820124\"}"
resp, err := client.GetIdfa(req)
if err != nil {
t.Error(err)
return
}
t.Log(resp)
}
func TestGetImei(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
return
}
req := CreateGetImeiReq()
req.Uid = 218047048
req.UserName = "ct939725671"
req.GameId = 8050
req.GameSign = "mrwld"
req.RegTime = 1750939725
req.Imei = "of5wO5sKWep0OFPt9rWQf6xNJVPg"
req.ChannelId = 1
req.AgentId = 100
req.SiteId = 1001
req.Ip = "1864204063"
req.Idfa = "of5wO5sKWep0OFPt9rWQf6xNJVPg"
req.Logined = 1
req.MatchType = 1
req.GameAwemeId = ""
req.ComeBackUser = 0
req.FanCode = ""
req.Network = ""
req.Idfv = ""
req.ScreenResolution = ""
req.System = ""
req.Electric = ""
req.ProcessorModel = ""
req.BaseBand = ""
req.Model = ""
req.Battery = ""
req.Oaid = ""
req.AdInfo = ""
req.AdDevice = ""
req.Ua = "WebSdk GaoreGame/1.3.1"
req.WxPlatform = ""
resp, err := client.GetImei(req)
if err != nil {
t.Error(err)
}
t.Log(resp)
}
func TestSetImei(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
return
}
req := CreateSetImeiReq()
// 基础字段赋值
req.UserName = "15179405888"
req.GameId = 6062
req.GameSign = "hlhj"
req.ChannelId = 1 // mtype
req.MatchType = 2
req.Imei = "96d9acdd57535c92-null"
req.Idfa = "96d9acdd57535c92-null"
req.Network = "4G"
req.Idfv = ""
req.ScreenResolution = "2132x1080"
req.System = "11"
req.ProcessorModel = ""
req.BaseBand = ""
req.Model = "PCDM10"
req.Battery = "45"
req.Oaid = "B9258E43A5084B43B72D94580C830898343a97328d6fd210b9e23859b1d5e83d_gaore_"
req.AdInfo = ""
req.AdDevice = ""
req.Ua = "Mozilla/5.0 (Linux; Android 11; PCDM10 Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36; SHGR GaoreGame/2.3.5"
req.WxPlatform = ""
resp, err := client.SetImei(req)
if err != nil {
t.Error(err)
return
}
t.Log(resp)
}

218
services/msdk/user.go Normal file
View File

@ -0,0 +1,218 @@
package msdk
import (
"fmt"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils"
"time"
)
const msdkKey = "msdk@gaore.com#!!"
type GetIdfaReq struct {
*requests.RpcRequest
ChannelId int `position:"Query" field:"mtype"`
GameId int `position:"Query" field:"game_id"`
GameSign string `position:"Query" field:"game_sign"`
Ip string `position:"Query" field:"ip"`
Imei string `position:"Query" field:"imei"`
Idfa string `position:"Query" field:"idfa"`
Idfv string `position:"Query" field:"idfv"`
LongId string `position:"Query" field:"long_id"`
SdkVersion string `position:"Query" field:"version"`
Os string `position:"Query" field:"os"`
GameOs int `position:"Query" field:"game_os"`
GameSubOs int `position:"Query" field:"game_sub_os"`
UserName string `position:"Query" field:"user_name"`
Ua string `position:"Query" field:"ua"`
LiveCode string `position:"Query" field:"live_code"`
AdDevice string `position:"Query" field:"ad_device"`
PkgAgentId string `position:"Query" field:"pkg_agent_id"`
PkgSiteId string `position:"Query" field:"pkg_site_id"`
Network string `position:"Query" field:"network"`
ScreenResolution string `position:"Query" field:"screen_resolution"`
System string `position:"Query" field:"system"`
Electric string `position:"Query" field:"electric"`
ProcessorModel string `position:"Query" field:"processor_model"`
BaseBand string `position:"Query" field:"baseband"`
Model string `position:"Query" field:"model"`
Battery string `position:"Query" field:"battery"`
Oaid string `position:"Query" field:"oaid"`
AdInfo string `position:"Query" field:"adinfo"`
WxPlatform string `position:"Query" field:"wx_platform"`
}
type GetIdfaResp struct {
*responses.BaseResponse
GameId int `json:"game_id"`
AgentId int `json:"agent_id"`
SiteId int `json:"site_id"`
GameAwemeId string `json:"game_aweme_id"`
LongId string `json:"long_id"`
DeviceId string `json:"device_id"`
Exists bool `json:"exists"`
FromAd bool `json:"from_ad"`
MatchType int `json:"match_type"`
ClickId string `json:"click_id,omitempty"` // 非必要字段,使用 omitempty 忽略空值
MatchTrace string `json:"match_trace,omitempty"` // 非必要字段
RegTime int64 `json:"reg_time"`
}
func CreateGetIdfaReq() *GetIdfaReq {
req := &GetIdfaReq{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/getidfa.php")
req.Method = requests.GET
return req
}
type GetUserAttrReq struct {
*requests.RpcRequest
UserName string `position:"Query" field:"user_name"`
GameSign string `position:"Query" field:"game_sign"`
Ts int64 `position:"Query" field:"ts"`
Sign string `position:"Query" field:"sign"`
}
type GetUserAttrResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
Uid int `json:"uid"`
UserName string `json:"user_name"`
RegTime int `json:"reg_time"` // 假设注册时间是时间戳
GameID int `json:"game_id"`
RegIP string `json:"reg_ip"`
AgentId int `json:"agent_id"`
SiteId int `json:"site_id"`
Imei string `json:"imei"`
Oaid string `json:"oaid"`
LongId string `json:"long_id"`
PromotionId string `json:"promotion_id"`
Mid3 string `json:"mid3"`
} `json:"data"`
}
func CreateGetUserAttrReq(userName, gameSign string) *GetUserAttrReq {
req := &GetUserAttrReq{
RpcRequest: &requests.RpcRequest{},
}
req.UserName = userName
req.GameSign = gameSign
req.Ts = time.Now().Unix()
req.Sign = utils.Md5(fmt.Sprintf("%d%s", req.Ts, msdkKey))
req.InitWithApiInfo(HOST, VERSION, "/getUserAttr.php")
req.Method = requests.GET
return req
}
type GetImeiReq struct {
*requests.RpcRequest
Uid int `position:"Query" field:"uid"`
UserName string `position:"Query" field:"user_name"`
GameId int `position:"Query" field:"game_id"`
GameSign string `position:"Query" field:"game_sign"`
RegTime int64 `position:"Query" field:"reg_time"`
Imei string `position:"Query" field:"imei"`
ChannelId int `position:"Query" field:"mtype"`
AgentId int `position:"Query" field:"agent_id"`
SiteId int `position:"Query" field:"site_id"`
Ip string `position:"Query" field:"ip"`
UserIp string `position:"Query" field:"user_ip"`
Idfa string `position:"Query" field:"idfa"`
Logined int `position:"Query" field:"logined"`
MatchType int `position:"Query" field:"match_type"`
GameAwemeId string `position:"Query" field:"game_aweme_id"`
ComeBackUser int `position:"Query" field:"come_back_user"` //回流用户标识 1=>回流用户
LpReg int `position:"Query" field:"lp_reg"` // 落地页注册用户标识
FanCode string `position:"Query" field:"fan_code"` // 粉丝码
Network string `position:"Query" field:"network"`
Idfv string `position:"Query" field:"idfv"`
ScreenResolution string `position:"Query" field:"screen_resolution"`
System string `position:"Query" field:"system"`
Electric string `position:"Query" field:"electric"`
ProcessorModel string `position:"Query" field:"processor_model"`
BaseBand string `position:"Query" field:"baseband"`
Model string `position:"Query" field:"model"`
Battery string `position:"Query" field:"battery"`
Oaid string `position:"Query" field:"oaid"`
AdInfo string `position:"Query" field:"adinfo"`
AdDevice string `position:"Query" field:"ad_device"`
Ua string `position:"Query" field:"ua"`
WxPlatform string `position:"Query" field:"wx_platform"`
}
type GetImeiResp struct {
*responses.BaseResponse
Uid string `json:"uid"`
UserName string `json:"user_name"`
Openid string `json:"openid"`
ChannelId string `json:"mtype"`
Logined int `json:"logined"`
GameId string `json:"game_id"`
GameSign string `json:"game_sign"`
MatchType int `json:"match_type"`
RegTime int64 `json:"reg_time"` // 原始时间戳字符串
Imei string `json:"imei"`
Oaid string `json:"oaid"`
Idfa string `json:"idfa"`
Ip int64 `json:"ip"`
UserIp string `json:"user_ip"`
Ua string `json:"ua"`
Media string `json:"media"`
AgentId int `json:"agent_id"`
SiteId int `json:"site_id"`
AdInfo string `json:"adinfo"`
GameAwemeId string `json:"game_aweme_id"`
}
func CreateGetImeiReq() *GetImeiReq {
req := &GetImeiReq{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/getimei.php")
req.Method = requests.GET
return req
}
type SetImeiReq struct {
*requests.RpcRequest
UserName string `position:"Query" field:"user_name"`
GameId int `position:"Query" field:"game_id"`
Imei string `position:"Query" field:"imei"`
Idfa string `position:"Query" field:"idfa"`
GameSign string `position:"Query" field:"game_sign"`
ChannelId int `position:"Query" field:"mtype"`
MatchType int `position:"Query" field:"match_type"`
Network string `position:"Query" field:"network"`
Idfv string `position:"Query" field:"idfv"`
ScreenResolution string `position:"Query" field:"screen_resolution"`
System string `position:"Query" field:"system"` // 可能为系统版本号字符串
ProcessorModel string `position:"Query" field:"processor_model"`
BaseBand string `position:"Query" field:"baseband"`
Model string `position:"Query" field:"model"`
Battery string `position:"Query" field:"battery"`
Oaid string `position:"Query" field:"oaid"`
AdInfo string `position:"Query" field:"adinfo"`
AdDevice string `position:"Query" field:"ad_device"`
Ua string `position:"Query" field:"ua"`
WxPlatform string `position:"Query" field:"wx_platform"`
}
type SetImeiResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
}
func CreateSetImeiReq() *SetImeiReq {
req := &SetImeiReq{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/setimei.php")
req.Method = requests.GET
return req
}

View File

@ -3,11 +3,12 @@ package oss
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
"time"
)
type GetApkVersionRequest struct {
*requests.JsonRequest
Filepath string `position:"Body" field:"filepath"`
Filepath string `position:"Json" field:"filepath"`
}
type GetApkVersionResponse struct {
@ -15,8 +16,10 @@ type GetApkVersionResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
VersionCode string `json:"versionCode"`
VersionName string `json:"versionName"`
VersionCode string `json:"versionCode"`
VersionName string `json:"versionName"`
MinSdkVersion string `json:"minSdkVersion"`
TargetSdkVersion string `json:"targetSdkVersion"`
} `json:"data"`
}
@ -26,6 +29,7 @@ func CreateGetApkVersionRequest() (req *GetApkVersionRequest) {
}
req.InitWithApiInfo(HOST, VERSION, "/api/apk/version")
req.Method = requests.POST
req.SetReadTimeout(30 * time.Second)
return
}

View File

@ -31,7 +31,7 @@ func NewClientWithSts() {
}
func (c *Client) PutOss(req *PutOssRequest) (resp *PutOssResponse, err error) {
if req.BucketName == "" {
if req.Bucket == "" {
err = errors.New("bucket name is empty")
return
}

View File

@ -8,7 +8,8 @@ import (
func TestUpload_Put(t *testing.T) {
req := CreatePutOssRequest()
req.BucketName = "image"
req.Bucket = "image"
//req.Bucket = "web"
file, err := os.ReadFile("test.jpg")
if err != nil {
t.Error(err)
@ -26,7 +27,7 @@ func TestUpload_Put(t *testing.T) {
func TestUpload_Del(t *testing.T) {
req := CreateDelOssRequest()
req.BucketName = "image"
req.Bucket = "image"
req.MediaUrl = "https://image.89yoo.com/uploads/549/549e887460a72333c361661683023018.jpeg"
client, err := NewClient()
if err != nil {
@ -43,10 +44,16 @@ func TestUpload_Del(t *testing.T) {
func TestCreateInitMultipartUpload(t *testing.T) {
req := CreateInitMultipartUploadRequest()
req.Filepath = "test.jpg"
extInfo := map[string]any{"game_byname": "tech_test_tencent"}
bExtInfo, _ := json.Marshal(extInfo)
req.UploadType = "package"
req.TargetType = "oss"
req.TargetName = "image"
req.FileHash = "51c68615b8d21f9b72b02f48c400cb87"
req.Filepath = "q5-01.zip"
req.ExtInfo = string(bExtInfo)
client, err := NewClient()
if err != nil {
t.Error(err)
@ -66,7 +73,7 @@ func TestCreateInitMultipartUpload(t *testing.T) {
func TestClient_GetApkVersion(t *testing.T) {
req := CreateGetApkVersionRequest()
req.Filepath = "36c55c4c3a2f4c79e3917b989d580496.zip"
req.Filepath = "uploads/files/package/1f57ac9693f0593fc9073f366b1c1936.zip"
client, err := NewClient()
if err != nil {
t.Error(err)

View File

@ -15,10 +15,12 @@ const (
type InitMultipartUploadRequest struct {
*requests.JsonRequest
Filepath string `position:"Body" field:"filepath"`
TargetType string `position:"Body" field:"target_type"`
TargetName string `position:"Body" field:"target_name"`
FileHash string `position:"Body" field:"file_hash"`
UploadType string `position:"Json" field:"upload_type"`
TargetType string `position:"Json" field:"target_type"`
TargetName string `position:"Json" field:"target_name"`
FileHash string `position:"Json" field:"file_hash"`
Filepath string `position:"Json" field:"filepath"`
ExtInfo string `position:"Json" field:"ext_info"`
}
type InitMultipartUploadResponse struct {
@ -50,7 +52,7 @@ func CreateInitMultipartUploadRequest() (req *InitMultipartUploadRequest) {
JsonRequest: &requests.JsonRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/upload/multipart/init?ts="+ts+"&sign="+sign)
req.InitWithApiInfo(HOST, VERSION, "/api/upload/multipart/init?_ts="+ts+"&_sign="+sign)
return
}

View File

@ -7,8 +7,8 @@ import (
type DelOssRequest struct {
*requests.JsonRequest
BucketName string `position:"Body" field:"bucket_name" default:"image"`
MediaUrl string `position:"Body" field:"url" default:"-"`
Bucket string `position:"Json" field:"bucket" default:"image"`
MediaUrl string `position:"Json" field:"url" default:"-"`
}
type DelOssResponse struct {

View File

@ -7,7 +7,7 @@ import (
type PutOssRequest struct {
*requests.StreamRequest
BucketName string `position:"Query" field:"bucket_name" default:"image"`
Bucket string `position:"Query" field:"bucket" default:"image"`
FileStream []byte
}
@ -16,7 +16,8 @@ type PutOssResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
Url string `json:"url"`
Url string `json:"url"`
SavePath string `json:"save_path"`
}
}

View File

@ -0,0 +1,81 @@
package passport
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"strings"
)
const (
VERSION = "2025-05-28"
// 对称加密密钥
appKey = "#gr*%com#"
)
var HOST requests.Host = requests.Host{
Default: "passport.gaore.com",
}
type Client struct {
sdk.Client
}
func NewClient() (client *Client, err error) {
client = new(Client)
err = client.Init()
return
}
// GetUserList
// 获取用户列表
func (c *Client) GetUserList(req *GetUserListRequest) (response *GetUserListResponse, err error) {
response = CreateGetUserListResponse()
err = c.DoAction(req, response)
return
}
// GetUserRoleList
// 获取用户角色列表
func (c *Client) GetUserRoleList(req *GetUserRoleListRequest) (response *GetUserRoleListResponse, err error) {
response = CreateGetUserRoleListResponse()
err = c.DoAction(req, response)
return
}
// EditCard
// 新增或修改实名信息
func (c *Client) EditCard(req EditCardRequestParam) (response string, err error) {
editCardRequest := CreateEditCardRequest(req)
createEditCardResponse := CreateEditCardResponse()
err = c.DoAction(editCardRequest, createEditCardResponse)
if err != nil && strings.Contains(err.Error(), "json Unmarshal:") {
return createEditCardResponse.GetHttpContentString(), nil
} else if err != nil {
return "", err
}
return createEditCardResponse.GetHttpContentString(), nil
}
// GetUserGameSign
// 获取用户登录过的游戏大类
func (c *Client) GetUserGameSign(req *GetUserGameSignRequest) (response *GetUserGameSignResponse, err error) {
response = CreateGetUserGameSignResponse()
err = c.DoAction(req, response)
return
}
// ChangePassword
// 用户修改密码
func (c *Client) ChangePassword(req *ChangePasswordRequest) (response *ChangePasswordResponse, err error) {
response = CreateChangePasswordResponse()
err = c.DoAction(req, response)
return
}
// UpdateUserState
// 修改用户状态
func (c *Client) UpdateUserState(req *UpdateUserStateRequest) (response *UpdateUserStateResponse, err error) {
response = CreateUpdateUserStateResponse()
err = c.DoAction(req, response)
return
}

View File

@ -0,0 +1,111 @@
package passport
import (
"testing"
)
// 单元测试
func TestGetUserList(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
}
req := CreateGetUserListRequest("ws45265737")
resp, err := client.GetUserList(req)
if err != nil {
t.Error(err)
}
t.Logf("resp code:%+v", resp.Code)
t.Logf("resp data:%+v", resp.Data)
}
func TestGetUserRoleList(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
}
// 不限定角色
//req := CreateGetUserRoleListRequest(221016372, 7874, 0, "")
// 限定角色
req := CreateGetUserRoleListRequest(221016372, 7874, 265500390, "勇闯关东")
resp, err := client.GetUserRoleList(req)
if err != nil {
t.Error(err)
}
t.Logf("resp code:%+v", resp.Code)
t.Logf("resp data:%+v", resp.Data)
}
func TestEditCard(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
}
editCardRequest := EditCardRequestParam{
Uid: 32455414,
GameId: 5010,
Imei: "11111111",
IsReal: 0,
DirectStatus: 1,
AuthChannel: "gjfcm_wzcq",
DirectExtData: "测试测试测试",
Pi: "",
Ip: "",
Ipv6: "",
UserName: "asfasfd",
RealName: "这艘啊",
IdCard: "33032419950123532X",
Mandatory: "3123123123",
}
editCardResponse, err := client.EditCard(editCardRequest)
t.Logf("%v", editCardResponse)
}
// 测试获取用户登录过的游戏大类
func TestGetUserGameSign(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
}
req := CreateGetUserGameSignRequest("oo70683572", "", "")
resp, err := client.GetUserGameSign(req)
if err != nil {
t.Error(err)
}
t.Logf("resp code:%+v", resp.Code)
t.Logf("resp data:%+v", resp.Data)
}
// 测试用户修改密码
func TestChangePassword(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
}
req := CreateChangePasswordRequest("rz35990497", "7654321")
resp, err := client.ChangePassword(req)
if err != nil {
t.Error(err)
}
// 记录文本结果
t.Logf("resp code:%+v, msg:%s", resp.Code, resp.Msg)
}
// 测试修改用户状态
func TestUpdateUserState(t *testing.T) {
client, err := NewClient()
if err != nil {
t.Error(err)
}
req := CreateUpdateUserStateRequest("masterpan", 0, 2)
resp, err := client.UpdateUserState(req)
if err != nil {
t.Error(err)
}
// 记录文本结果
t.Logf("resp code:%+v, msg:%s", resp.Code, resp.Msg)
}

View File

@ -0,0 +1,43 @@
package passport
import (
"fmt"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type ChangePasswordRequest struct {
*requests.RpcRequest
}
func CreateChangePasswordRequest(userName string, newPwd string) (req *ChangePasswordRequest) {
ts, sign := GetSign()
req = &ChangePasswordRequest{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/remote_login.php")
req.FormParams = map[string]string{
"act": "getpwd",
"do": "passwd",
"username": userName,
"newpwd": newPwd,
"time": fmt.Sprintf("%v", ts),
"sign": sign,
"format": "json",
}
req.Method = requests.POST
return
}
func CreateChangePasswordResponse() (response *ChangePasswordResponse) {
response = &ChangePasswordResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
type ChangePasswordResponse struct {
*responses.BaseResponse
}

View File

@ -0,0 +1,51 @@
package passport
import (
"fmt"
"github.com/spf13/cast"
_ "github.com/spf13/cast"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type UpdateUserStateRequest struct {
*requests.RpcRequest
}
type UpdateUserStateResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
State int `json:"state"`
} `json:"data"`
}
// CreateUpdateUserStateRequest 获取用户登录过的游戏大类
func CreateUpdateUserStateRequest(userName string, uid, state int) (req *UpdateUserStateRequest) {
ts, sign := GetSign()
req = &UpdateUserStateRequest{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/remote_login.php")
req.FormParams = map[string]string{
"act": "update",
"do": "update_user_state",
"user_name": userName,
"uid": cast.ToString(uid),
"state": cast.ToString(state),
"time": fmt.Sprintf("%v", ts),
"sign": sign,
}
req.Method = requests.POST
return
}
func CreateUpdateUserStateResponse() (response *UpdateUserStateResponse) {
response = &UpdateUserStateResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}

View File

@ -0,0 +1,202 @@
package passport
import (
"crypto/md5"
"encoding/hex"
"fmt"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
"time"
)
type GetUserListRequest struct {
*requests.RpcRequest
}
type GetUserListResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data []UserInfo `json:"data"`
}
type UserInfo struct {
Id string `json:"id"`
Uid string `json:"uid"`
BbsUid string `json:"bbs_uid"`
UserName string `json:"user_name"`
UserPwd string `json:"user_pwd"`
Email string `json:"email"`
Integral string `json:"integral"`
NickName string `json:"nick_name"`
TrueName string `json:"true_name"`
Sex string `json:"sex"`
IdType string `json:"id_type"`
IdCard string `json:"id_card"`
Birthday string `json:"birthday"`
Telephone string `json:"telephone"`
Mobile string `json:"mobile"`
Address string `json:"address"`
Zipcode int64 `json:"zipcode"`
Level string `json:"level"`
Qq string `json:"qq"`
Msn string `json:"msn"`
Question string `json:"question"`
Answer string `json:"answer"`
HeadPic string `json:"head_pic"`
Defendboss string `json:"defendboss"`
RegTime int64 `json:"reg_time"`
RegIp string `json:"reg_ip"`
LoginIp string `json:"login_ip"`
LoginTime string `json:"login_time"`
State string `json:"state"`
}
// CreateGetUserListRequest 获取玩家用户列表
func CreateGetUserListRequest(userName string) (req *GetUserListRequest) {
ts, sign := GetSign()
req = &GetUserListRequest{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/remote_login.php")
req.FormParams = map[string]string{
"act": "info",
"do": "get_user_list",
"user_names": userName,
"time": fmt.Sprintf("%v", ts),
"sign": sign,
}
req.Method = requests.POST
return
}
func CreateGetUserListResponse() (response *GetUserListResponse) {
response = &GetUserListResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
type GetUserRoleListRequest struct {
*requests.RpcRequest
}
type GetUserRoleListResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data []UserRoleInfo `json:"data"`
}
type UserRoleInfo struct {
Uid string `json:"uid"` // uid
GameId string `json:"game_id"` // 子游戏id
RoleId string `json:"role_id"` // 角色id
RoleName string `json:"role_name"` // 角色名
RoleServer string `json:"role_server"` // 角色服务器名
AddTime string `json:"add_time"` // 创建时间戳
UpdateTime string `json:"update_time"` // 更新时间戳
}
// GetSign 封装一个方法获取当天时间戳和api签名
func GetSign() (ts int64, sign string) {
ts = time.Now().Unix()
hash := md5.New()
hash.Write([]byte(fmt.Sprintf("%v%v", ts, appKey)))
hashBytes := hash.Sum(nil)
sign = hex.EncodeToString(hashBytes)
return
}
// CreateGetUserRoleListRequest 获取玩家角色列表
func CreateGetUserRoleListRequest(uid int, gameId int, roleId int, roleServer string) (req *GetUserRoleListRequest) {
ts, sign := GetSign()
req = &GetUserRoleListRequest{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/remote_login.php")
req.FormParams = map[string]string{
"act": "info",
"do": "user_role",
"method": "get",
"uid": fmt.Sprintf("%d", uid),
"game_id": fmt.Sprintf("%d", gameId),
"role_id": fmt.Sprintf("%d", roleId),
"role_server": roleServer,
"time": fmt.Sprintf("%v", ts),
"sign": sign,
}
req.Method = requests.POST
return
}
func CreateGetUserRoleListResponse() (response *GetUserRoleListResponse) {
response = &GetUserRoleListResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
type GetUserGameSignRequest struct {
*requests.RpcRequest
}
type GetUserGameSignResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
List []UserGameSign `json:"list"`
} `json:"data"`
}
type UserGameSign struct {
Id string `json:"id"`
AgentId string `json:"agent_id"`
SiteId string `json:"site_id"`
Uid string `json:"uid"`
UserName string `json:"user_name"`
GameId string `json:"game_id"`
GameSign string `json:"game_sign"`
Oaid string `json:"oaid"`
Imei string `json:"imei"`
Imei2 string `json:"imei2"`
Ua string `json:"ua"`
FirstLoginIp string `json:"first_login_ip"`
FirstLoginTime string `json:"first_login_time"`
LastLoginIp string `json:"last_login_ip"`
LastLoginTime string `json:"last_login_time"`
}
// CreateGetUserGameSignRequest 获取用户登录过的游戏大类
func CreateGetUserGameSignRequest(userName, gameSign, orderBy string) (req *GetUserGameSignRequest) {
ts, sign := GetSign()
req = &GetUserGameSignRequest{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/remote_login.php")
req.FormParams = map[string]string{
"act": "info",
"do": "get_user_game_sign",
"username": userName,
"game_sign": gameSign,
"order_by": orderBy,
"time": fmt.Sprintf("%v", ts),
"sign": sign,
}
req.Method = requests.POST
return
}
func CreateGetUserGameSignResponse() (response *GetUserGameSignResponse) {
response = &GetUserGameSignResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}

View File

@ -0,0 +1,97 @@
package passport
import (
"fmt"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils"
"time"
)
const weeDongKey = "aVCxX2B3yswpxCMjaaSUHFXAzLYyuGhW"
func weeDongGetSign(ts int64) string {
return utils.Md5(utils.Md5(fmt.Sprintf("%d", ts)+weeDongKey) + weeDongKey)
}
type EditCardRequestParam struct {
Uid int64 `position:"Body" field:"uid"`
GameId int64 `position:"Body" field:"game_id"`
Imei string `position:"Body" field:"imei"`
IsReal int64 `position:"Body" field:"is_real"`
IsDirect int64 `position:"Body" field:"is_direct"`
DirectStatus int64 `position:"Body" field:"direct_status"`
AuthChannel string `position:"Body" field:"auth_channel"`
DirectExtData string `position:"Body" field:"direct_ext_data"`
Pi string `position:"Body" field:"pi"`
Ip string `position:"Body" field:"ip"`
Ipv6 string `position:"Body" field:"ipv6"`
UserName string `position:"Body" field:"user_name"`
RealName string `position:"Body" field:"truename"`
IdCard string `position:"Body" field:"idcard"`
Mandatory string `position:"Body" field:"mandatory"`
}
type EditCardResponse struct {
*responses.BaseResponse
}
type EditCardRequest struct {
*requests.RpcRequest
Uid int64 `position:"Body" field:"uid"`
GameId int64 `position:"Body" field:"game_id"`
Imei string `position:"Body" field:"imei"`
IsReal int64 `position:"Body" field:"is_real"`
IsDirect int64 `position:"Body" field:"is_direct"`
DirectStatus int64 `position:"Body" field:"direct_status"`
AuthChannel string `position:"Body" field:"auth_channel"`
DirectExtData string `position:"Body" field:"direct_ext_data"`
Pi string `position:"Body" field:"pi"`
Ip string `position:"Body" field:"ip"`
Ipv6 string `position:"Body" field:"ipv6"`
UserName string `position:"Body" field:"user_name"`
RealName string `position:"Body" field:"truename"`
IdCard string `position:"Body" field:"idcard"`
Mandatory string `position:"Body" field:"mandatory"`
Action string `position:"Body" field:"action"`
Flag string `position:"Body" field:"flag"`
Time string `position:"Body" field:"time"`
}
// CreateEditCardRequest 记录实名结果接口
func CreateEditCardRequest(param EditCardRequestParam) (req *EditCardRequest) {
ts := time.Now().Unix()
sign := weeDongGetSign(ts)
req = &EditCardRequest{
RpcRequest: &requests.RpcRequest{},
Action: "edit_card",
Flag: sign,
Time: fmt.Sprintf("%v", ts),
IsDirect: param.IsDirect,
Uid: param.Uid,
GameId: param.GameId,
Imei: param.Imei,
IsReal: param.IsReal,
DirectStatus: param.DirectStatus,
AuthChannel: param.AuthChannel,
DirectExtData: param.DirectExtData,
Pi: param.Pi,
Ip: param.Ip,
Ipv6: param.Ipv6,
UserName: param.UserName,
RealName: param.RealName,
IdCard: param.IdCard,
Mandatory: param.Mandatory,
}
req.InitWithApiInfo(HOST, VERSION, "/weedong.php")
req.Method = requests.POST
return
}
func CreateEditCardResponse() (response *EditCardResponse) {
response = &EditCardResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}

View File

@ -10,11 +10,11 @@ const (
)
var HOST requests.Host = requests.Host{
Default: "pay.gaore.com",
Default: "pay.api.gaore.com",
Func: func(s string) string {
var a = map[string]string{
requests.RELEASE: "pay.gaore.com",
requests.PRE: "pay.gaore.com",
requests.RELEASE: "pay.api.gaore.com",
requests.PRE: "pay.api.gaore.com",
requests.TEST: "pay.gaore.com",
}
return a[s]
@ -49,8 +49,16 @@ func (c *Client) ComplaintUpload(req *ComplaintUploadRequest) (response *Complai
return
}
func (c *Client) ComplaintNotifyUrl(req *ComplaintNotifyUrlRequest) (response *ComplaintNotifyUrlResponse, err error) {
response = CreateComplaintNotifyUrlResponse()
func (c *Client) MerchantConfigDebug(req *merchantConfigDebugRequest) (response *merchantConfigDebugResponse, err error) {
response = CreateMerchantConfigDebugResponse()
err = c.DoAction(req, response)
return
}
// GetOrderState
// 获取订单状态
func (c *Client) GetOrderState(req *GetOrderStateRequest) (response *GetOrderStateResponse, err error) {
response = CreateGetOrderStateResponse()
err = c.DoAction(req, response)
return
}

View File

@ -1,28 +1,41 @@
package pay
import (
"fmt"
"log"
"testing"
)
func TestClient_GetUserInfo(t *testing.T) {
c, err := NewClient()
//c, err := NewClient()
//if err != nil {
// t.Error(err)
//}
//
//req := CreateComplaintNotifyUrlRequest()
//
//req.MchId = "3503"
//req.NotifyUrl = "https://pay.uu89.com/api/complaint/wxNotify/3503"
//req.Type = 1
//
//resp, err := c.ComplaintNotifyUrl(req)
//if err != nil {
// log.Fatalln(err)
//}
//fmt.Println(resp.GetHttpContentString())
//fmt.Println(resp.GetHttpHeaders())
}
func TestGetOrderState(t *testing.T) {
getOrderStateRequest := CreateGetOrderStateRequest("202112060000193551730")
client, err := NewClient()
if err != nil {
t.Error(err)
return
}
req := CreateComplaintNotifyUrlRequest()
req.MchId = "3503"
req.NotifyUrl = "https://pay.uu89.com/api/complaint/wxNotify/3503"
req.Type = 1
resp, err := c.ComplaintNotifyUrl(req)
getOrderStateResponse, err := client.GetOrderState(getOrderStateRequest)
if err != nil {
log.Fatalln(err)
t.Error(err)
return
}
fmt.Println(resp.GetHttpContentString())
fmt.Println(resp.GetHttpHeaders())
t.Log(getOrderStateResponse.GetHttpContentString())
}

View File

@ -9,6 +9,8 @@ type ComplaintCompleteRequest struct {
*requests.RpcRequest
MchId string `position:"Body" field:"mch_id" default:"" `
ComplaintId string `position:"Body" field:"complaint_id" default:"" `
ExtData string `position:"Body" field:"ext_data" default:"" `
PayType int `position:"Body" field:"pay_type" default:"" `
}
type ComplaintCompleteResponse struct {

View File

@ -11,6 +11,7 @@ type ComplaintReplyRequest struct {
ComplaintId string `position:"Body" field:"complaint_id" default:"" `
Content string `position:"Body" field:"content" default:"" `
Images string `position:"Body" field:"images" default:"" `
PayType int `position:"Body" field:"pay_type" default:"" `
}
type ComplaintReplyResponse struct {

View File

@ -10,6 +10,7 @@ type ComplaintUploadRequest struct {
MchId string `position:"Body" field:"mch_id" default:"" `
ImageUrl string `position:"Body" field:"image_url" default:"" `
ComplaintId string `position:"Body" field:"complaint_id" default:" " `
PayType int `position:"Body" field:"pay_type" default:"" `
}
type ComplaintUploadResponse struct {

View File

@ -0,0 +1,44 @@
package pay
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type GetOrderStateRequest struct {
*requests.RpcRequest
OrderId string `position:"Body" field:"orderid" default:"" `
}
type GetOrderStateResponse struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
Orderid string `json:"orderid"` // 订单号
Succ string `json:"succ"` // 是否成功
Money string `json:"money"` // 支付金额
UserName string `json:"user_name"` // 用户名
BNum string `json:"b_num"`
GameId string `json:"game_id"` // 游戏id
PayDate string `json:"pay_date"` // 付费日期
SyncDate string `json:"sync_date"` // 回调时间
} `json:"data"`
}
func CreateGetOrderStateRequest(orderId string) (req *GetOrderStateRequest) {
req = &GetOrderStateRequest{
RpcRequest: &requests.RpcRequest{},
OrderId: orderId,
}
req.InitWithApiInfo(HOST, VERSION, "/api/user/getOrderState")
req.Method = requests.POST
return
}
func CreateGetOrderStateResponse() (response *GetOrderStateResponse) {
response = &GetOrderStateResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}

View File

@ -7,7 +7,8 @@ import (
type merchantConfigDebugRequest struct {
*requests.RpcRequest
MchId string `position:"Body" field:"mch_id" default:"" `
MchId string `position:"Body" field:"mch_id" default:"" `
PayType int `position:"Body" field:"pay_type" default:"" `
}
type merchantConfigDebugResponse struct {
@ -16,8 +17,8 @@ type merchantConfigDebugResponse struct {
Msg string `json:"msg"`
}
func CreateMerchantConfigDebugRequest() (req *ComplaintNotifyUrlRequest) {
req = &ComplaintNotifyUrlRequest{
func CreateMerchantConfigDebugRequest() (req *merchantConfigDebugRequest) {
req = &merchantConfigDebugRequest{
RpcRequest: &requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/complaint/configDebug")
@ -25,8 +26,8 @@ func CreateMerchantConfigDebugRequest() (req *ComplaintNotifyUrlRequest) {
return
}
func CreateMerchantConfigDebugResponse() (response *ComplaintNotifyUrlResponse) {
response = &ComplaintNotifyUrlResponse{
func CreateMerchantConfigDebugResponse() (response *merchantConfigDebugResponse) {
response = &merchantConfigDebugResponse{
BaseResponse: &responses.BaseResponse{},
}
return

View File

@ -33,3 +33,14 @@ func (c *Client) OpenGame(req *OpenGameReq) (resp *OpenGameResp, err error) {
return
}
// NewPayRedisData 设置支付redis相关数据
func (c *Client) NewPayRedisData(req *NewPayRedisDataReq) (resp *NewPayRedisDataResp, err error) {
resp = CreateNewPayRedisDataResp()
err = c.DoAction(req, resp)
if err != nil {
return
}
return
}

View File

@ -19,3 +19,18 @@ func TestOpenGame(t *testing.T) {
fmt.Println(resp.Code, resp.Msg)
}
func TestNewPayRedisData(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
req := CreateNewPayRedisDataReq()
resp, err := client.NewPayRedisData(req)
if err != nil {
panic(err)
}
fmt.Println(resp.Code, resp.Msg)
}

View File

@ -2,19 +2,27 @@ package script
import (
"encoding/json"
"fmt"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type OpenGameReq struct {
*requests.RpcRequest
GameID int `position:"Query" field:"game_id"`
}
type OpenGameResp struct {
*responses.BaseResponse
}
type NewPayRedisDataReq struct {
*requests.RpcRequest
}
type NewPayRedisDataResp struct {
*responses.BaseResponse
}
// GetHttpContentBytes 因为http://script.gaore.com/open_game.php?game_id=这个接口返回的不是json反序列化会报错所以返回一个固定的json
func (baseResponse *OpenGameResp) GetHttpContentBytes() []byte {
b, _ := json.Marshal(map[string]interface{}{"code": 200, "msg": "success"})
@ -25,10 +33,11 @@ func (baseResponse *OpenGameResp) GetHttpContentBytes() []byte {
func CreateOpenGameReq(gameId int) *OpenGameReq {
req := &OpenGameReq{
&requests.RpcRequest{},
gameId,
}
req.InitWithApiInfo(HOST, VERSION, "open_game.php?game_id="+fmt.Sprintf("%v", gameId))
req.Method = requests.POST
req.InitWithApiInfo(HOST, VERSION, "open_game.php")
req.Method = requests.GET
return req
}
@ -39,3 +48,21 @@ func CreateOpenGameResp() *OpenGameResp {
BaseResponse: &responses.BaseResponse{},
}
}
// CreateNewPayRedisDataReq 设置支付redis相关数据
func CreateNewPayRedisDataReq() *NewPayRedisDataReq {
req := &NewPayRedisDataReq{
&requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "pay/new_pay_redis_data.php")
req.Method = requests.GET
return req
}
func CreateNewPayRedisDataResp() *NewPayRedisDataResp {
return &NewPayRedisDataResp{
BaseResponse: &responses.BaseResponse{},
}
}

115
services/sms/client.go Normal file
View File

@ -0,0 +1,115 @@
package sms
import (
"crypto/md5"
"encoding/hex"
"errors"
"fmt"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"time"
)
const (
VERSION = "2024-05-30"
)
var HOST = requests.Host{
Default: "sms.gaore.com",
}
type Client struct {
sdk.Client
}
func NewClient() (client *Client, err error) {
client = new(Client)
err = client.Init()
return
}
func (c *Client) SendEmail(req *SendEmailRequest) (resp *SendEmailResponse, err error) {
if len(req.Addresses) == 0 {
return nil, errors.New("addresses is empty")
}
if req.FromName == "" {
return nil, errors.New("from is empty")
}
if req.Subject == "" {
return nil, errors.New("subject is empty")
}
if req.Body == "" {
return nil, errors.New("content is empty")
}
ts, token := getToken("04573fc4c8e01999a0909ab9c00bca5a")
req.JsonParams["sign"] = token
req.JsonParams["time"] = ts
resp = CreateSendEmailResponse()
err = c.DoAction(req, resp)
return
}
func (c *Client) SendFeiShuWebHook(req *SendFeiShuWebHookRequest) (resp *SendFeiShuWebHookResponse, err error) {
if req.Content == "" {
err = errors.New("content is empty")
return
}
if req.Do == "" {
err = errors.New("webhook is empty")
return
}
if req.Token == "" {
err = errors.New("token is empty")
return
}
resp = CreateSendFeiShuWebHookResponse()
err = c.DoAction(req, resp)
return
}
func (c *Client) SendSms(req *SendSmsRequest) (resp *SendSmsResponse, err error) {
if req.Mobile == "" {
err = errors.New("mobile is empty")
return
}
if req.Type == "" {
err = errors.New("type is empty")
return
}
resp = CreateSendSmsResponse()
err = c.DoAction(req, resp)
return
}
func (c *Client) SendSmsV2(req *SendSmsRequestV2) (resp *SendSmsResponseV2, err error) {
if req.Phone == "" {
err = errors.New("phone is empty")
return
}
if req.Type == "" {
err = errors.New("type is empty")
return
}
resp = CreateSendSmsResponseV2()
err = c.DoAction(req, resp)
return
}
func getToken(key string) (ts int64, token string) {
ts = time.Now().Unix()
hash := md5.New()
hash.Write([]byte(fmt.Sprintf("%v%v", ts, key)))
hashBytes := hash.Sum(nil)
token = hex.EncodeToString(hashBytes)
return
}

170
services/sms/client_test.go Normal file
View File

@ -0,0 +1,170 @@
package sms
import (
"encoding/json"
"fmt"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"testing"
)
var (
client *Client
)
func TestMain(t *testing.M) {
var err error
client, err = NewClient()
if err != nil {
panic(err)
}
t.Run()
}
func TestClient_SendEmail(t *testing.T) {
req := CreateSendEmailRequest(SendEmailParam{
Addresses: []string{"xuyang@89you.com"},
Subject: "测试邮件",
Body: "xxx已修改密码新密码是xxx",
FromName: "高热监控",
})
email, err := client.SendEmail(req)
if err != nil {
panic(err)
}
fmt.Println(email)
}
func TestClient_SendFeiShuWebHook(t *testing.T) {
//req := CreateSendFeiShuWebHookRequest(SendFeiShuWebHookParam{
// Do: FeiShuWebHookDoTypeSendRichText,
// Token: "b762f80c-fe4f-4182-b48e-5c78041592bc",
// Content: "[[{\"tag\":\"text\",\"text\":\"富文本信息: \"},{\"tag\":\"a\",\"text\":\"请查看\",\"href\":\"http://www.example.com/\"},{\"tag\":\"at\",\"user_id\":\"ou_18eac8********17ad4f02e8bbbb\"}]]",
// Title: "卡片主标题",
// TitleColor: "purple",
//})
//
//resp, err := client.SendFeiShuWebHook(req)
//if err != nil {
// panic(err)
//}
//fmt.Println(resp.Msg)
//req2 := CreateSendFeiShuWebHookRequest(SendFeiShuWebHookParam{
// Do: FeiShuWebHookDoTypeSendSimpleText,
// Token: "b762f80c-fe4f-4182-b48e-5c78041592bc",
// Content: " - 苹果IDXXXX\n - 游戏IDXXXX\n - bundleIDXXXX\n - 应用名XXX\n - 下架时间2025-04-18 123652\n - IPXX城市A省份、XX城市B省份说明XX为具体的IP括号内为IP对应的城市",
//})
//
//resp2, err := client.SendFeiShuWebHook(req2)
//if err != nil {
// panic(err)
//}
//fmt.Println(resp2)
//[
// [
// {
// "tag": "text",
// "text": "苹果IDXXXX"
// }
// ],
// [
// {
// "tag": "text",
// "text": "游戏IDXXXX"
// }
// ]
//]
req3 := CreateSendFeiShuWebHookRequest(SendFeiShuWebHookParam{
TitleColor: "purple",
Title: "监控报警",
Do: FeiShuWebHookDoTypeSendCardText,
Token: "b762f80c-fe4f-4182-b48e-5c78041592bc",
Content: "[{\"tag\":\"div\",\"text\":{\"tag\":\"plain_text\",\"content\":\"苹果IDXXXX\"}},{\"tag\":\"div\",\"text\":{\"tag\":\"plain_text\",\"content\":\"游戏IDXXXX\"}}]",
})
resp3, err := client.SendFeiShuWebHook(req3)
if err != nil {
panic(err)
}
fmt.Println(resp3.Msg)
fmt.Println(resp3)
}
func TestClient_SendSmsCode(t *testing.T) {
req := CreateSendSmsRequest(SendSmsParam{
Mobile: "18320021439",
Type: SmsTypeBindPhone,
Replaces: []Item{{
Key: ReplaceKeyCode,
Value: "6379",
}, {
Key: ReplaceKeySecond,
Value: "120",
}},
})
req.Domain = requests.Host{
Default: "127.0.0.1:8804",
}
sms, err := client.SendSms(req)
if err != nil {
panic(err)
}
fmt.Println(sms)
}
func TestClient_SendSmsUrl(t *testing.T) {
req := CreateSendSmsRequest(SendSmsParam{
Mobile: "18320021439",
Type: TemplateTypeOrderComplete,
Replaces: []Item{{
Key: ReplaceKeyUrl,
Value: "http://www.baidu.com",
}},
})
req.Domain = requests.Host{
Default: "127.0.0.1:8804",
}
sms, err := client.SendSms(req)
if err != nil {
panic(err)
}
fmt.Println(sms)
}
func TestClient_SendSmsCodeV2(t *testing.T) {
req := CreateSendSmsRequestV2(SendSmsParamV2{
Phone: "18320021439",
Type: SmsTypeRegister,
Replaces: []Item{{
Key: ReplaceKeyCode,
Value: "6379",
}, {
Key: ReplaceKeySecond,
Value: "120",
}},
Company: "",
Ip: "192.168.1.103",
})
sms, err := client.SendSmsV2(req)
if err != nil {
panic(err)
}
marshal, err := json.Marshal(sms)
if err != nil {
panic(err)
}
fmt.Println(string(marshal))
}

45
services/sms/email.go Normal file
View File

@ -0,0 +1,45 @@
package sms
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type SendEmailRequest struct {
*requests.JsonRequest
Addresses []string `position:"Json" field:"addresses"`
Subject string `position:"Json" field:"subject"`
Body string `position:"Json" field:"body"`
FromName string `position:"Json" field:"from_name"`
}
type SendEmailResponse struct {
*responses.BaseResponse
}
type SendEmailParam struct {
Addresses []string
Subject string
Body string
FromName string
}
func CreateSendEmailRequest(param SendEmailParam) (req *SendEmailRequest) {
req = &SendEmailRequest{
JsonRequest: &requests.JsonRequest{},
Addresses: param.Addresses,
Subject: param.Subject,
Body: param.Body,
FromName: param.FromName,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/email/send")
req.Method = requests.POST
return
}
func CreateSendEmailResponse() (resp *SendEmailResponse) {
resp = &SendEmailResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}

57
services/sms/feishu.go Normal file
View File

@ -0,0 +1,57 @@
package sms
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type SendFeiShuWebHookRequest struct {
*requests.JsonRequest
Do string `position:"Json" field:"do"`
Token string `position:"Json" field:"token"`
Content string `position:"Json" field:"content"`
Title string `position:"Json" field:"title"`
TitleColor string `position:"Json" field:"title_color"`
}
type SendFeiShuWebHookResponse struct {
*responses.BaseResponse
FeishuData string `json:"feishu_data"`
}
type FeiShuWebHookDoType = string
const (
FeiShuWebHookDoTypeSendSimpleText FeiShuWebHookDoType = "sendSimpleText"
FeiShuWebHookDoTypeSendRichText FeiShuWebHookDoType = "sendRichText"
FeiShuWebHookDoTypeSendCardText FeiShuWebHookDoType = "sendCardText"
)
type SendFeiShuWebHookParam struct {
Do FeiShuWebHookDoType
Token string
Content string
Title string
TitleColor string
}
func CreateSendFeiShuWebHookRequest(param SendFeiShuWebHookParam) (req *SendFeiShuWebHookRequest) {
req = &SendFeiShuWebHookRequest{
JsonRequest: &requests.JsonRequest{},
Do: param.Do,
Token: param.Token,
Content: param.Content,
Title: param.Title,
TitleColor: param.TitleColor,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/feishu/webhook_send")
req.Method = requests.POST
return
}
func CreateSendFeiShuWebHookResponse() (resp *SendFeiShuWebHookResponse) {
resp = &SendFeiShuWebHookResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}

111
services/sms/sms.go Normal file
View File

@ -0,0 +1,111 @@
package sms
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
type ReplaceKey = string
const (
ReplaceKeyCode ReplaceKey = "${code}" // 验证码
ReplaceKeySecond ReplaceKey = "${second}" // 秒数
ReplaceKeyUrl ReplaceKey = "${url}" // 链接
ReplaceKeyUserName ReplaceKey = "${userName}" // 用户名
ReplaceKeyDateTime ReplaceKey = "${dateTime}" // 年月日时分秒
)
type Item struct {
Key ReplaceKey // 要替换的key
Value string // 要替换的值
}
type SendSmsRequest struct {
*requests.JsonRequest
Mobile string `position:"Json" field:"mobile"`
Type string `position:"Json" field:"type"`
Replaces []Item `position:"Json" field:"replaces"`
}
type SendSmsResponse struct {
*responses.BaseResponse
}
type SendSmsRequestV2 struct {
*requests.JsonRequest
Phone string `position:"Json" field:"phone"`
Type string `position:"Json" field:"type"`
Replaces []Item `position:"Json" field:"replaces"`
Company string `position:"Json" field:"company"`
Ip string `position:"Json" field:"ip"`
}
type SendSmsResponseV2 struct {
*responses.BaseResponse
TraceID string `json:"trace_id"`
}
type SmsType = string
const (
SmsTypeRegister SmsType = "reg" // 注册
SmsTypeBindPhone SmsType = "bind_phone" // 绑定手机号
TemplateTypeOrderComplete SmsType = "kf_order_complete" // 客服工单完成
TemplateTypeKFOrderAdditional SmsType = "kf_order_additional" // 客服工单完成
TemplateTypeCancelTip SmsType = "cancel_tip" // 提交账号注销申请
TemplateTypeReverseCancel SmsType = "reverse_cancel" // 终止账号注销申请
)
type SendSmsParam struct {
Mobile string // 手机号
Type SmsType // 验证码类型
Replaces []Item
}
type SendSmsParamV2 struct {
Phone string // 手机号
Type SmsType // 验证码类型
Replaces []Item
Company string // 子游戏公司主体
Ip string // ip
}
func CreateSendSmsRequest(param SendSmsParam) (req *SendSmsRequest) {
req = &SendSmsRequest{
JsonRequest: &requests.JsonRequest{},
Mobile: param.Mobile,
Type: param.Type,
Replaces: param.Replaces,
}
req.InitWithApiInfo(HOST, VERSION, "/v1/sms/send")
req.Method = requests.POST
return
}
func CreateSendSmsResponse() (resp *SendSmsResponse) {
resp = &SendSmsResponse{
BaseResponse: &responses.BaseResponse{},
}
return
}
func CreateSendSmsRequestV2(param SendSmsParamV2) (req *SendSmsRequestV2) {
req = &SendSmsRequestV2{
JsonRequest: &requests.JsonRequest{},
Phone: param.Phone,
Type: param.Type,
Replaces: param.Replaces,
Company: param.Company,
Ip: param.Ip,
}
req.InitWithApiInfo(HOST, VERSION, "/v2/sms/send")
req.Method = requests.POST
return
}
func CreateSendSmsResponseV2() (resp *SendSmsResponseV2) {
resp = &SendSmsResponseV2{
BaseResponse: &responses.BaseResponse{},
}
return
}

77
services/stat/agent.go Normal file
View File

@ -0,0 +1,77 @@
package stat
import (
"crypto/md5"
"encoding/hex"
"fmt"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
"time"
)
type GetAgentListReq struct {
*requests.RpcRequest
}
/**
返回json格式如下
{
code": 0,
"msg": "success",
"data": {
"list": []
}
}
*/
type GetAgentListResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data AgentList `json:"data"`
}
type AgentList struct {
List []Agent `json:"list"`
}
type Agent struct {
AgentId string `json:"agent_id"`
AgentName string `json:"agent_name"`
Media string `json:"media"`
Channel string `json:"channel"`
MediaName string `json:"media_name"`
ChannelName string `json:"channel_name"`
}
//const key = "gr_new_game"
// CreateGetAgentListReq 获取推广渠道列表请求
func CreateGetAgentListReq(data map[string]string) *GetAgentListReq {
req := &GetAgentListReq{
&requests.RpcRequest{},
}
ts := time.Now().Unix()
hash := md5.New()
hash.Write([]byte(fmt.Sprintf("%v%v", ts, key)))
hashBytes := hash.Sum(nil)
token := hex.EncodeToString(hashBytes)
req.InitWithApiInfo(HOST, VERSION, "/agent/getAgentList")
req.Method = requests.POST
req.FormParams = data
if req.FormParams == nil {
req.FormParams = make(map[string]string)
}
req.FormParams["sign"] = token
req.FormParams["time"] = fmt.Sprintf("%v", ts)
return req
}
// CreateGetAgentListResp 获取推广渠道列表响应
func CreateGetAgentListResp() *GetAgentListResp {
return &GetAgentListResp{
BaseResponse: &responses.BaseResponse{},
}
}

View File

@ -3,6 +3,7 @@ package stat
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"time"
)
const (
@ -39,3 +40,37 @@ func (c *Client) SetUserNewGameAuth(req *SetUserNewGameAuthReq) (resp *SetUserNe
err = c.DoAction(req, resp)
return
}
// GetAgentList 获取推广渠道列表
func (c *Client) GetAgentList(req *GetAgentListReq) (resp *GetAgentListResp, err error) {
resp = CreateGetAgentListResp()
err = c.DoAction(req, resp)
if err != nil {
return
}
return
}
// GetUserRoleRegPage 获取用户角色注册分页列表
func (c *Client) GetUserRoleRegPage(req *UserRoleRegReq) (resp *UserRoleRegResp, err error) {
resp = CreateUserRoleRegPageResp()
// 设置超时时间
req.SetConnectTimeout(10 * time.Second)
// 设置读取超时时间
req.SetReadTimeout(20 * time.Second)
err = c.DoAction(req, resp)
if err != nil {
return
}
return
}
// GetUserTotalPay 获取用户累计付费
func (c *Client) GetUserTotalPay(req *GetUserTotalPayReq) (resp *GetUserTotalPayResp, err error) {
resp = CreateGetUserTotalPayResp()
err = c.DoAction(req, resp)
if err != nil {
return
}
return
}

View File

@ -52,3 +52,68 @@ func TestClient_SetUserNewGameAuth(t *testing.T) {
fmt.Println(resp.Code, resp.Msg, resp.Data.Result)
}
// TestClient_GetAgentList 查询代理列表单元测试
func TestClient_GetAgentList(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
req := CreateGetAgentListReq(map[string]string{
"agent_id": "4051,68017",
//"agent_id": "99",
})
resp, err := client.GetAgentList(req)
if err != nil {
panic(err)
}
fmt.Println(resp.Code, resp.Msg, resp.Data)
// 断言 resp.Code = 1且 resp.Data 不空为正常
if resp.Code != 1 || len(resp.Data.List) == 0 {
t.Errorf("GetAgentList test failed")
} else {
t.Log("GetAgentList test passed")
}
}
// TestClient_GetUserRoleRegPage 查询用户角色注册分页
func TestClient_GetUserRoleRegPage(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
req := CreateUserRoleRegPageReq(UserRoleRegParam{
Page: 1,
PageSize: 10,
RoleId: "",
RoleName: "温文波箐魔灵",
})
resp, err := client.GetUserRoleRegPage(req)
if err != nil {
panic(err)
}
fmt.Println(resp.Code, resp.Msg, resp.Data)
}
// 获取用户累计付费
func TestGetUserTotalPay(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
req := CreateGetUserTotalPayReq(GetUserTotalPayParam{
Where: "user_name = 'yoyo685757'",
Fields: []string{"user_name", "sum(total_pay_money) as total_pay_money", "last_pay_time"},
GroupBy: []string{"user_name"},
})
resp, err := client.GetUserTotalPay(req)
if err != nil {
panic(err)
}
fmt.Println(resp.Code, resp.Msg, resp.Data)
}

63
services/stat/pay.go Normal file
View File

@ -0,0 +1,63 @@
package stat
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
"strings"
)
type GetUserTotalPayReq struct {
*requests.RpcRequest
}
type GetUserTotalPayParam struct {
Where string `json:"where"`
Fields []string `json:"fields"`
GroupBy []string `json:"group_by"`
}
type GetUserTotalPayResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data TotalPayList `json:"data"`
}
type TotalPayList struct {
List []TotalPay `json:"list"`
}
type TotalPay struct {
UserName string `json:"user_name"`
RegDate string `json:"reg_date"`
AgentId int64 `json:"agent_id"`
SiteId int64 `json:"site_id"`
GameId int64 `json:"game_id"`
FirstPayTime string `json:"first_pay_time"`
FirstPayMoney float64 `json:"first_pay_money"`
TotalPayMoney float64 `json:"total_pay_money"`
LastPayTime string `json:"last_pay_time"`
PayTimes int64 `json:"pay_times"`
IsFirst int64 `json:"is_first"`
}
// CreateGetUserTotalPayReq 获取用户累充
func CreateGetUserTotalPayReq(data GetUserTotalPayParam) *GetUserTotalPayReq {
req := &GetUserTotalPayReq{
&requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/pay/getUserTotalPay")
req.Method = requests.POST
req.FormParams = make(map[string]string)
req.FormParams["where"] = data.Where
req.FormParams["fields"] = strings.Join(data.Fields, ",")
req.FormParams["group_by"] = strings.Join(data.GroupBy, ",")
return req
}
// CreateGetUserTotalPayResp 获取用户累充
func CreateGetUserTotalPayResp() *GetUserTotalPayResp {
return &GetUserTotalPayResp{
BaseResponse: &responses.BaseResponse{},
}
}

View File

@ -57,3 +57,59 @@ func CreateSetUserNewGameAuthResp() *SetUserNewGameAuthResp {
BaseResponse: &responses.BaseResponse{},
}
}
// ------------------------------------
// UserRoleReg 玩家汇总角色创建记录
type UserRoleReg struct {
UserName string `json:"user_name"`
Uid string `json:"uid"`
RoleId string `json:"role_id"`
RoleName string `json:"role_name"`
GameSign string `json:"game_sign"`
Id string `json:"id"`
CreatedAt string `json:"created_at"`
}
type UserRoleRegPage struct {
Page int `json:"page"`
TotalCount int `json:"total_count"`
PageSize int `json:"page_size"`
Data []UserRoleReg `json:"data"`
}
type UserRoleRegParam struct {
Page int `json:"page"`
PageSize int `json:"page_size"`
RoleId string `json:"role_id"`
RoleName string `json:"role_name"`
}
type UserRoleRegReq struct {
*requests.RpcRequest
}
type UserRoleRegResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data UserRoleRegPage `json:"data"`
}
func CreateUserRoleRegPageReq(param UserRoleRegParam) *UserRoleRegReq {
req := &UserRoleRegReq{
&requests.RpcRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/user/getRoleRegPage")
req.Method = requests.POST
req.FormParams = map[string]string{
"page": fmt.Sprintf("%v", param.Page),
"page_size": fmt.Sprintf("%v", param.PageSize),
"role_id": param.RoleId,
"role_name": param.RoleName,
}
return req
}
func CreateUserRoleRegPageResp() *UserRoleRegResp {
return &UserRoleRegResp{
BaseResponse: &responses.BaseResponse{},
}
}

View File

@ -0,0 +1,55 @@
package userlive
import (
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
)
const (
VERSION = "2020-11-16"
)
var HOST = requests.Host{
Default: "userlive",
}
type Client struct {
sdk.Client
}
func NewClient() (client *Client, err error) {
client = new(Client)
err = client.Init()
return
}
// CreateBanReq 封禁
func (c *Client) CreateBanReq(req *BanReq) (resp *BanResp, err error) {
resp = CreateBanResp()
err = c.DoAction(req, resp)
if err != nil {
return
}
return
}
// CreateAddBanRuleCacheReq 添加封禁规则缓存
func (c *Client) CreateAddBanRuleCacheReq(req *AddBanRuleCacheReq) (resp *AddBanRuleCacheResp, err error) {
resp = CreateAddBanRuleCacheResp()
err = c.DoAction(req, resp)
if err != nil {
return
}
return
}
// CreateRemoveBanRuleCacheReq 删除封禁规则缓存
func (c *Client) CreateRemoveBanRuleCacheReq(req *RemoveBanRuleCacheReq) (resp *RemoveBanRuleCacheResp, err error) {
resp = CreateRemoveBanRuleCacheResp()
err = c.DoAction(req, resp)
if err != nil {
return
}
return
}

View File

@ -0,0 +1,104 @@
package userlive
import (
"fmt"
"testing"
"time"
)
// 踢人
func TestBan(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
req := CreateBanReq(BanReqParam{
ActionTime: time.Now().Unix(),
TriggerType: triggerTypeLogin,
Ip: "127.0.0.1",
GameId: 8654,
UserName: "aq36604627",
Uid: 632308087,
ServerId: 123,
RoleId: "123",
BundleId: "asdfas",
GameName: "fasdf",
GameVersion: "fasdf",
SdkVersion: "fasdf",
Os: "fasd",
OsVersion: "faf",
InApp: "fasdf",
Ua: "fasdfas",
NetworkType: "fasdfa",
IsVirtual: "-1",
Cpu: "cpu",
DeviceModel: "dfasdf",
Baseband: "fasdfa",
Resolution: "fasdfa",
Battery: "fasdf",
LongId: "fasdf",
OriginImei: "fasdf",
Imei: "fasdf",
OriginOaid: "fasdf",
Oaid: "fasdf",
AndroidId: "fasdf",
Idfa: "fsdf",
Idfv: "fasdf",
DeviceId: "fasdf",
})
resp, err := client.CreateBanReq(req)
if err != nil {
panic(err)
}
fmt.Println(resp.Code, resp.Msg, resp.Data)
}
// 添加封禁规则
func TestAddBanRuleCache(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
req := CreateAddBanRuleCacheReq(RuleInfo{
Id: 21,
Phone: "13247173568",
UserName: "gr24616919",
IdCard: "",
DeviceId: "device_id1",
LongId: "long_id1",
IsVirtual: 0,
EndTime: "2029-01-01",
})
resp, err := client.CreateAddBanRuleCacheReq(req)
if err != nil {
panic(err)
}
fmt.Println(resp.Code, resp.Msg, resp.Data)
}
// 删除封禁规则
func TestRemoveBanRuleCache(t *testing.T) {
client, err := NewClient()
if err != nil {
panic(err)
}
infos := []RuleInfo{{
Id: 21,
Phone: "13247173568",
UserName: "gr24616919",
IdCard: "",
DeviceId: "device_id1",
LongId: "long_id1",
IsVirtual: 0,
EndTime: "2029-01-01",
}}
req := CreateRemoveBanRuleCacheReq(RemoveBanRuleCacheReqParam{Rules: infos})
resp, err := client.CreateRemoveBanRuleCacheReq(req)
if err != nil {
panic(err)
}
fmt.Println(resp.Code, resp.Msg, resp.Data)
}

View File

@ -0,0 +1,159 @@
package userlive
import (
"encoding/json"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
)
const (
triggerTypeHeartbeat = "heartbeat" // 心跳上报触发
triggerTypeLogin = "login" // 用户登录、注册
)
// BanReq
// 上报用户设备信息,判断是否要踢用户下线
type BanReq struct {
*requests.JsonRequest
}
type BanResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
Ban bool `json:"ban"` // 是否要禁止
BanRuleId int64 `json:"ban_rule_id"` // 命中的封禁规则id
} `json:"data"`
}
type BanReqParam struct {
ActionTime int64 `json:"action_time" form:"action_time"` // 上报时间
TriggerType string `json:"trigger_type" form:"trigger_type"` // 触发类型
Ip string `json:"ip" form:"ip"` // ip
GameId int64 `json:"game_id" form:"game_id"` // 游戏id
UserName string `json:"user_name" form:"user_name"` // 用户名
Uid int64 `json:"uid" form:"uid"` // 用户id
ServerId string `json:"server_id" form:"server_id"` // 区服id
RoleId string `json:"role_id" form:"role_id"` // 角色id
BundleId string `json:"bundle_id" form:"bundle_id"` // ios 包名
GameName string `json:"game_name" from:"game_name"` // 应用名
GameVersion string `json:"game_version" from:"game_version"` // 游戏版本
SdkVersion string `json:"sdk_version" from:"sdk_version"` // sdk版本
Os string `json:"os" from:"os"` // 系统
OsVersion string `json:"os_version" from:"os_version"` // 系统版本
InApp string `json:"in_app" from:"in_app"` // 壳包系统,壳包传 如ios、android
Ua string `json:"ua" from:"ua"` // ua
NetworkType string `json:"network_type" from:"network_type"` // 网络类型
IsVirtual string `json:"is_virtual" from:"is_virtual"` // 是否是模拟器字符串01空字符串表示未知
Cpu string `json:"cpu" from:"cpu"` // cpu型号
DeviceModel string `json:"device_model" from:"device_model"` // 设备型号
Baseband string `json:"baseband" from:"baseband"` // 基带信息
Resolution string `json:"resolution" from:"resolution"` // 分辨率
Battery string `json:"battery" from:"battery"` // 电量
LongId string `json:"long_id" form:"long_id"` // 逻辑设备号
OriginImei string `json:"origin_imei" form:"origin_imei"` // imei原值
Imei string `json:"imei" form:"imei"` // 老sdk采集的imei
OriginOaid string `json:"origin_oaid" form:"origin_oaid"` // oaid原值
Oaid string `json:"oaid" form:"oaid"` // 老sdk采集的oaid
AndroidId string `json:"android_id" form:"android_id"` // 安卓id
Idfa string `json:"idfa" form:"idfa"` // idfa
Idfv string `json:"idfv" form:"idfv"` // idfv
DeviceId string `json:"device_id" form:"device_id"` // device_id
}
func CreateBanReq(data BanReqParam) *BanReq {
req := &BanReq{
&requests.JsonRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/user_ban/ban")
req.Method = requests.POST
marshal, _ := json.Marshal(data)
_ = json.Unmarshal(marshal, &req.JsonParams)
return req
}
// CreateBanResp 创建同步开服数据响应
func CreateBanResp() *BanResp {
return &BanResp{
BaseResponse: &responses.BaseResponse{},
}
}
// AddBanRuleCacheReq
// 添加封禁规则缓存
type AddBanRuleCacheReq struct {
*requests.JsonRequest
}
type AddBanRuleCacheResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data struct{} `json:"data"`
}
type RuleInfo struct {
Id int64 `json:"id"`
Phone string `json:"phone"`
UserName string `json:"user_name"`
IdCard string `json:"id_card"`
DeviceId string `json:"device_id"`
LongId string `json:"long_id"`
IsVirtual int64 `json:"is_virtual"`
EndTime string `json:"end_time"`
}
func CreateAddBanRuleCacheReq(data RuleInfo) *AddBanRuleCacheReq {
req := &AddBanRuleCacheReq{
&requests.JsonRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/user_ban/add_cache")
req.Method = requests.POST
marshal, _ := json.Marshal(data)
_ = json.Unmarshal(marshal, &req.JsonParams)
return req
}
func CreateAddBanRuleCacheResp() *AddBanRuleCacheResp {
return &AddBanRuleCacheResp{
BaseResponse: &responses.BaseResponse{},
}
}
// RemoveBanRuleCacheReq
// 删除封禁规则缓存
type RemoveBanRuleCacheReq struct {
*requests.JsonRequest
}
type RemoveBanRuleCacheReqParam struct {
Rules []RuleInfo `json:"rules"`
}
type RemoveBanRuleCacheResp struct {
*responses.BaseResponse
Code int `json:"code"`
Msg string `json:"msg"`
Data struct{} `json:"data"`
}
func CreateRemoveBanRuleCacheReq(param RemoveBanRuleCacheReqParam) *RemoveBanRuleCacheReq {
req := &RemoveBanRuleCacheReq{
&requests.JsonRequest{},
}
req.InitWithApiInfo(HOST, VERSION, "/api/user_ban/remove_cache")
req.Method = requests.POST
marshal, _ := json.Marshal(param)
_ = json.Unmarshal(marshal, &req.JsonParams)
return req
}
func CreateRemoveBanRuleCacheResp() *RemoveBanRuleCacheResp {
return &RemoveBanRuleCacheResp{
BaseResponse: &responses.BaseResponse{},
}
}

3
vendor/github.com/json-iterator/go/.codecov.yml generated vendored Normal file
View File

@ -0,0 +1,3 @@
ignore:
- "output_tests/.*"

4
vendor/github.com/json-iterator/go/.gitignore generated vendored Normal file
View File

@ -0,0 +1,4 @@
/vendor
/bug_test.go
/coverage.txt
/.idea

14
vendor/github.com/json-iterator/go/.travis.yml generated vendored Normal file
View File

@ -0,0 +1,14 @@
language: go
go:
- 1.8.x
- 1.x
before_install:
- go get -t -v ./...
script:
- ./test.sh
after_success:
- bash <(curl -s https://codecov.io/bash)

21
vendor/github.com/json-iterator/go/Gopkg.lock generated vendored Normal file
View File

@ -0,0 +1,21 @@
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
[[projects]]
name = "github.com/modern-go/concurrent"
packages = ["."]
revision = "e0a39a4cb4216ea8db28e22a69f4ec25610d513a"
version = "1.0.0"
[[projects]]
name = "github.com/modern-go/reflect2"
packages = ["."]
revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd"
version = "1.0.1"
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
inputs-digest = "ea54a775e5a354cb015502d2e7aa4b74230fc77e894f34a838b268c25ec8eeb8"
solver-name = "gps-cdcl"
solver-version = 1

26
vendor/github.com/json-iterator/go/Gopkg.toml generated vendored Normal file
View File

@ -0,0 +1,26 @@
# Gopkg.toml example
#
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
# name = "github.com/user/project"
# version = "1.0.0"
#
# [[constraint]]
# name = "github.com/user/project2"
# branch = "dev"
# source = "github.com/myfork/project2"
#
# [[override]]
# name = "github.com/x/y"
# version = "2.4.0"
ignored = ["github.com/davecgh/go-spew*","github.com/google/gofuzz*","github.com/stretchr/testify*"]
[[constraint]]
name = "github.com/modern-go/reflect2"
version = "1.0.1"

21
vendor/github.com/json-iterator/go/LICENSE generated vendored Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2016 json-iterator
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

85
vendor/github.com/json-iterator/go/README.md generated vendored Normal file
View File

@ -0,0 +1,85 @@
[![Sourcegraph](https://sourcegraph.com/github.com/json-iterator/go/-/badge.svg)](https://sourcegraph.com/github.com/json-iterator/go?badge)
[![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](https://pkg.go.dev/github.com/json-iterator/go)
[![Build Status](https://travis-ci.org/json-iterator/go.svg?branch=master)](https://travis-ci.org/json-iterator/go)
[![codecov](https://codecov.io/gh/json-iterator/go/branch/master/graph/badge.svg)](https://codecov.io/gh/json-iterator/go)
[![rcard](https://goreportcard.com/badge/github.com/json-iterator/go)](https://goreportcard.com/report/github.com/json-iterator/go)
[![License](http://img.shields.io/badge/license-mit-blue.svg?style=flat-square)](https://raw.githubusercontent.com/json-iterator/go/master/LICENSE)
[![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/json-iterator/Lobby)
A high-performance 100% compatible drop-in replacement of "encoding/json"
# Benchmark
![benchmark](http://jsoniter.com/benchmarks/go-benchmark.png)
Source code: https://github.com/json-iterator/go-benchmark/blob/master/src/github.com/json-iterator/go-benchmark/benchmark_medium_payload_test.go
Raw Result (easyjson requires static code generation)
| | ns/op | allocation bytes | allocation times |
| --------------- | ----------- | ---------------- | ---------------- |
| std decode | 35510 ns/op | 1960 B/op | 99 allocs/op |
| easyjson decode | 8499 ns/op | 160 B/op | 4 allocs/op |
| jsoniter decode | 5623 ns/op | 160 B/op | 3 allocs/op |
| std encode | 2213 ns/op | 712 B/op | 5 allocs/op |
| easyjson encode | 883 ns/op | 576 B/op | 3 allocs/op |
| jsoniter encode | 837 ns/op | 384 B/op | 4 allocs/op |
Always benchmark with your own workload.
The result depends heavily on the data input.
# Usage
100% compatibility with standard lib
Replace
```go
import "encoding/json"
json.Marshal(&data)
```
with
```go
import jsoniter "github.com/json-iterator/go"
var json = jsoniter.ConfigCompatibleWithStandardLibrary
json.Marshal(&data)
```
Replace
```go
import "encoding/json"
json.Unmarshal(input, &data)
```
with
```go
import jsoniter "github.com/json-iterator/go"
var json = jsoniter.ConfigCompatibleWithStandardLibrary
json.Unmarshal(input, &data)
```
[More documentation](http://jsoniter.com/migrate-from-go-std.html)
# How to get
```
go get github.com/json-iterator/go
```
# Contribution Welcomed !
Contributors
- [thockin](https://github.com/thockin)
- [mattn](https://github.com/mattn)
- [cch123](https://github.com/cch123)
- [Oleg Shaldybin](https://github.com/olegshaldybin)
- [Jason Toffaletti](https://github.com/toffaletti)
Report issue or pull request, or email taowen@gmail.com, or [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/json-iterator/Lobby)

150
vendor/github.com/json-iterator/go/adapter.go generated vendored Normal file
View File

@ -0,0 +1,150 @@
package jsoniter
import (
"bytes"
"io"
)
// RawMessage to make replace json with jsoniter
type RawMessage []byte
// Unmarshal adapts to json/encoding Unmarshal API
//
// Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v.
// Refer to https://godoc.org/encoding/json#Unmarshal for more information
func Unmarshal(data []byte, v interface{}) error {
return ConfigDefault.Unmarshal(data, v)
}
// UnmarshalFromString is a convenient method to read from string instead of []byte
func UnmarshalFromString(str string, v interface{}) error {
return ConfigDefault.UnmarshalFromString(str, v)
}
// Get quick method to get value from deeply nested JSON structure
func Get(data []byte, path ...interface{}) Any {
return ConfigDefault.Get(data, path...)
}
// Marshal adapts to json/encoding Marshal API
//
// Marshal returns the JSON encoding of v, adapts to json/encoding Marshal API
// Refer to https://godoc.org/encoding/json#Marshal for more information
func Marshal(v interface{}) ([]byte, error) {
return ConfigDefault.Marshal(v)
}
// MarshalIndent same as json.MarshalIndent. Prefix is not supported.
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {
return ConfigDefault.MarshalIndent(v, prefix, indent)
}
// MarshalToString convenient method to write as string instead of []byte
func MarshalToString(v interface{}) (string, error) {
return ConfigDefault.MarshalToString(v)
}
// NewDecoder adapts to json/stream NewDecoder API.
//
// NewDecoder returns a new decoder that reads from r.
//
// Instead of a json/encoding Decoder, an Decoder is returned
// Refer to https://godoc.org/encoding/json#NewDecoder for more information
func NewDecoder(reader io.Reader) *Decoder {
return ConfigDefault.NewDecoder(reader)
}
// Decoder reads and decodes JSON values from an input stream.
// Decoder provides identical APIs with json/stream Decoder (Token() and UseNumber() are in progress)
type Decoder struct {
iter *Iterator
}
// Decode decode JSON into interface{}
func (adapter *Decoder) Decode(obj interface{}) error {
if adapter.iter.head == adapter.iter.tail && adapter.iter.reader != nil {
if !adapter.iter.loadMore() {
return io.EOF
}
}
adapter.iter.ReadVal(obj)
err := adapter.iter.Error
if err == io.EOF {
return nil
}
return adapter.iter.Error
}
// More is there more?
func (adapter *Decoder) More() bool {
iter := adapter.iter
if iter.Error != nil {
return false
}
c := iter.nextToken()
if c == 0 {
return false
}
iter.unreadByte()
return c != ']' && c != '}'
}
// Buffered remaining buffer
func (adapter *Decoder) Buffered() io.Reader {
remaining := adapter.iter.buf[adapter.iter.head:adapter.iter.tail]
return bytes.NewReader(remaining)
}
// UseNumber causes the Decoder to unmarshal a number into an interface{} as a
// Number instead of as a float64.
func (adapter *Decoder) UseNumber() {
cfg := adapter.iter.cfg.configBeforeFrozen
cfg.UseNumber = true
adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)
}
// DisallowUnknownFields causes the Decoder to return an error when the destination
// is a struct and the input contains object keys which do not match any
// non-ignored, exported fields in the destination.
func (adapter *Decoder) DisallowUnknownFields() {
cfg := adapter.iter.cfg.configBeforeFrozen
cfg.DisallowUnknownFields = true
adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)
}
// NewEncoder same as json.NewEncoder
func NewEncoder(writer io.Writer) *Encoder {
return ConfigDefault.NewEncoder(writer)
}
// Encoder same as json.Encoder
type Encoder struct {
stream *Stream
}
// Encode encode interface{} as JSON to io.Writer
func (adapter *Encoder) Encode(val interface{}) error {
adapter.stream.WriteVal(val)
adapter.stream.WriteRaw("\n")
adapter.stream.Flush()
return adapter.stream.Error
}
// SetIndent set the indention. Prefix is not supported
func (adapter *Encoder) SetIndent(prefix, indent string) {
config := adapter.stream.cfg.configBeforeFrozen
config.IndentionStep = len(indent)
adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)
}
// SetEscapeHTML escape html by default, set to false to disable
func (adapter *Encoder) SetEscapeHTML(escapeHTML bool) {
config := adapter.stream.cfg.configBeforeFrozen
config.EscapeHTML = escapeHTML
adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)
}
// Valid reports whether data is a valid JSON encoding.
func Valid(data []byte) bool {
return ConfigDefault.Valid(data)
}

325
vendor/github.com/json-iterator/go/any.go generated vendored Normal file
View File

@ -0,0 +1,325 @@
package jsoniter
import (
"errors"
"fmt"
"github.com/modern-go/reflect2"
"io"
"reflect"
"strconv"
"unsafe"
)
// Any generic object representation.
// The lazy json implementation holds []byte and parse lazily.
type Any interface {
LastError() error
ValueType() ValueType
MustBeValid() Any
ToBool() bool
ToInt() int
ToInt32() int32
ToInt64() int64
ToUint() uint
ToUint32() uint32
ToUint64() uint64
ToFloat32() float32
ToFloat64() float64
ToString() string
ToVal(val interface{})
Get(path ...interface{}) Any
Size() int
Keys() []string
GetInterface() interface{}
WriteTo(stream *Stream)
}
type baseAny struct{}
func (any *baseAny) Get(path ...interface{}) Any {
return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)}
}
func (any *baseAny) Size() int {
return 0
}
func (any *baseAny) Keys() []string {
return []string{}
}
func (any *baseAny) ToVal(obj interface{}) {
panic("not implemented")
}
// WrapInt32 turn int32 into Any interface
func WrapInt32(val int32) Any {
return &int32Any{baseAny{}, val}
}
// WrapInt64 turn int64 into Any interface
func WrapInt64(val int64) Any {
return &int64Any{baseAny{}, val}
}
// WrapUint32 turn uint32 into Any interface
func WrapUint32(val uint32) Any {
return &uint32Any{baseAny{}, val}
}
// WrapUint64 turn uint64 into Any interface
func WrapUint64(val uint64) Any {
return &uint64Any{baseAny{}, val}
}
// WrapFloat64 turn float64 into Any interface
func WrapFloat64(val float64) Any {
return &floatAny{baseAny{}, val}
}
// WrapString turn string into Any interface
func WrapString(val string) Any {
return &stringAny{baseAny{}, val}
}
// Wrap turn a go object into Any interface
func Wrap(val interface{}) Any {
if val == nil {
return &nilAny{}
}
asAny, isAny := val.(Any)
if isAny {
return asAny
}
typ := reflect2.TypeOf(val)
switch typ.Kind() {
case reflect.Slice:
return wrapArray(val)
case reflect.Struct:
return wrapStruct(val)
case reflect.Map:
return wrapMap(val)
case reflect.String:
return WrapString(val.(string))
case reflect.Int:
if strconv.IntSize == 32 {
return WrapInt32(int32(val.(int)))
}
return WrapInt64(int64(val.(int)))
case reflect.Int8:
return WrapInt32(int32(val.(int8)))
case reflect.Int16:
return WrapInt32(int32(val.(int16)))
case reflect.Int32:
return WrapInt32(val.(int32))
case reflect.Int64:
return WrapInt64(val.(int64))
case reflect.Uint:
if strconv.IntSize == 32 {
return WrapUint32(uint32(val.(uint)))
}
return WrapUint64(uint64(val.(uint)))
case reflect.Uintptr:
if ptrSize == 32 {
return WrapUint32(uint32(val.(uintptr)))
}
return WrapUint64(uint64(val.(uintptr)))
case reflect.Uint8:
return WrapUint32(uint32(val.(uint8)))
case reflect.Uint16:
return WrapUint32(uint32(val.(uint16)))
case reflect.Uint32:
return WrapUint32(uint32(val.(uint32)))
case reflect.Uint64:
return WrapUint64(val.(uint64))
case reflect.Float32:
return WrapFloat64(float64(val.(float32)))
case reflect.Float64:
return WrapFloat64(val.(float64))
case reflect.Bool:
if val.(bool) == true {
return &trueAny{}
}
return &falseAny{}
}
return &invalidAny{baseAny{}, fmt.Errorf("unsupported type: %v", typ)}
}
// ReadAny read next JSON element as an Any object. It is a better json.RawMessage.
func (iter *Iterator) ReadAny() Any {
return iter.readAny()
}
func (iter *Iterator) readAny() Any {
c := iter.nextToken()
switch c {
case '"':
iter.unreadByte()
return &stringAny{baseAny{}, iter.ReadString()}
case 'n':
iter.skipThreeBytes('u', 'l', 'l') // null
return &nilAny{}
case 't':
iter.skipThreeBytes('r', 'u', 'e') // true
return &trueAny{}
case 'f':
iter.skipFourBytes('a', 'l', 's', 'e') // false
return &falseAny{}
case '{':
return iter.readObjectAny()
case '[':
return iter.readArrayAny()
case '-':
return iter.readNumberAny(false)
case 0:
return &invalidAny{baseAny{}, errors.New("input is empty")}
default:
return iter.readNumberAny(true)
}
}
func (iter *Iterator) readNumberAny(positive bool) Any {
iter.startCapture(iter.head - 1)
iter.skipNumber()
lazyBuf := iter.stopCapture()
return &numberLazyAny{baseAny{}, iter.cfg, lazyBuf, nil}
}
func (iter *Iterator) readObjectAny() Any {
iter.startCapture(iter.head - 1)
iter.skipObject()
lazyBuf := iter.stopCapture()
return &objectLazyAny{baseAny{}, iter.cfg, lazyBuf, nil}
}
func (iter *Iterator) readArrayAny() Any {
iter.startCapture(iter.head - 1)
iter.skipArray()
lazyBuf := iter.stopCapture()
return &arrayLazyAny{baseAny{}, iter.cfg, lazyBuf, nil}
}
func locateObjectField(iter *Iterator, target string) []byte {
var found []byte
iter.ReadObjectCB(func(iter *Iterator, field string) bool {
if field == target {
found = iter.SkipAndReturnBytes()
return false
}
iter.Skip()
return true
})
return found
}
func locateArrayElement(iter *Iterator, target int) []byte {
var found []byte
n := 0
iter.ReadArrayCB(func(iter *Iterator) bool {
if n == target {
found = iter.SkipAndReturnBytes()
return false
}
iter.Skip()
n++
return true
})
return found
}
func locatePath(iter *Iterator, path []interface{}) Any {
for i, pathKeyObj := range path {
switch pathKey := pathKeyObj.(type) {
case string:
valueBytes := locateObjectField(iter, pathKey)
if valueBytes == nil {
return newInvalidAny(path[i:])
}
iter.ResetBytes(valueBytes)
case int:
valueBytes := locateArrayElement(iter, pathKey)
if valueBytes == nil {
return newInvalidAny(path[i:])
}
iter.ResetBytes(valueBytes)
case int32:
if '*' == pathKey {
return iter.readAny().Get(path[i:]...)
}
return newInvalidAny(path[i:])
default:
return newInvalidAny(path[i:])
}
}
if iter.Error != nil && iter.Error != io.EOF {
return &invalidAny{baseAny{}, iter.Error}
}
return iter.readAny()
}
var anyType = reflect2.TypeOfPtr((*Any)(nil)).Elem()
func createDecoderOfAny(ctx *ctx, typ reflect2.Type) ValDecoder {
if typ == anyType {
return &directAnyCodec{}
}
if typ.Implements(anyType) {
return &anyCodec{
valType: typ,
}
}
return nil
}
func createEncoderOfAny(ctx *ctx, typ reflect2.Type) ValEncoder {
if typ == anyType {
return &directAnyCodec{}
}
if typ.Implements(anyType) {
return &anyCodec{
valType: typ,
}
}
return nil
}
type anyCodec struct {
valType reflect2.Type
}
func (codec *anyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
panic("not implemented")
}
func (codec *anyCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
obj := codec.valType.UnsafeIndirect(ptr)
any := obj.(Any)
any.WriteTo(stream)
}
func (codec *anyCodec) IsEmpty(ptr unsafe.Pointer) bool {
obj := codec.valType.UnsafeIndirect(ptr)
any := obj.(Any)
return any.Size() == 0
}
type directAnyCodec struct {
}
func (codec *directAnyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
*(*Any)(ptr) = iter.readAny()
}
func (codec *directAnyCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
any := *(*Any)(ptr)
if any == nil {
stream.WriteNil()
return
}
any.WriteTo(stream)
}
func (codec *directAnyCodec) IsEmpty(ptr unsafe.Pointer) bool {
any := *(*Any)(ptr)
return any.Size() == 0
}

278
vendor/github.com/json-iterator/go/any_array.go generated vendored Normal file
View File

@ -0,0 +1,278 @@
package jsoniter
import (
"reflect"
"unsafe"
)
type arrayLazyAny struct {
baseAny
cfg *frozenConfig
buf []byte
err error
}
func (any *arrayLazyAny) ValueType() ValueType {
return ArrayValue
}
func (any *arrayLazyAny) MustBeValid() Any {
return any
}
func (any *arrayLazyAny) LastError() error {
return any.err
}
func (any *arrayLazyAny) ToBool() bool {
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
return iter.ReadArray()
}
func (any *arrayLazyAny) ToInt() int {
if any.ToBool() {
return 1
}
return 0
}
func (any *arrayLazyAny) ToInt32() int32 {
if any.ToBool() {
return 1
}
return 0
}
func (any *arrayLazyAny) ToInt64() int64 {
if any.ToBool() {
return 1
}
return 0
}
func (any *arrayLazyAny) ToUint() uint {
if any.ToBool() {
return 1
}
return 0
}
func (any *arrayLazyAny) ToUint32() uint32 {
if any.ToBool() {
return 1
}
return 0
}
func (any *arrayLazyAny) ToUint64() uint64 {
if any.ToBool() {
return 1
}
return 0
}
func (any *arrayLazyAny) ToFloat32() float32 {
if any.ToBool() {
return 1
}
return 0
}
func (any *arrayLazyAny) ToFloat64() float64 {
if any.ToBool() {
return 1
}
return 0
}
func (any *arrayLazyAny) ToString() string {
return *(*string)(unsafe.Pointer(&any.buf))
}
func (any *arrayLazyAny) ToVal(val interface{}) {
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
iter.ReadVal(val)
}
func (any *arrayLazyAny) Get(path ...interface{}) Any {
if len(path) == 0 {
return any
}
switch firstPath := path[0].(type) {
case int:
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
valueBytes := locateArrayElement(iter, firstPath)
if valueBytes == nil {
return newInvalidAny(path)
}
iter.ResetBytes(valueBytes)
return locatePath(iter, path[1:])
case int32:
if '*' == firstPath {
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
arr := make([]Any, 0)
iter.ReadArrayCB(func(iter *Iterator) bool {
found := iter.readAny().Get(path[1:]...)
if found.ValueType() != InvalidValue {
arr = append(arr, found)
}
return true
})
return wrapArray(arr)
}
return newInvalidAny(path)
default:
return newInvalidAny(path)
}
}
func (any *arrayLazyAny) Size() int {
size := 0
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
iter.ReadArrayCB(func(iter *Iterator) bool {
size++
iter.Skip()
return true
})
return size
}
func (any *arrayLazyAny) WriteTo(stream *Stream) {
stream.Write(any.buf)
}
func (any *arrayLazyAny) GetInterface() interface{} {
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
return iter.Read()
}
type arrayAny struct {
baseAny
val reflect.Value
}
func wrapArray(val interface{}) *arrayAny {
return &arrayAny{baseAny{}, reflect.ValueOf(val)}
}
func (any *arrayAny) ValueType() ValueType {
return ArrayValue
}
func (any *arrayAny) MustBeValid() Any {
return any
}
func (any *arrayAny) LastError() error {
return nil
}
func (any *arrayAny) ToBool() bool {
return any.val.Len() != 0
}
func (any *arrayAny) ToInt() int {
if any.val.Len() == 0 {
return 0
}
return 1
}
func (any *arrayAny) ToInt32() int32 {
if any.val.Len() == 0 {
return 0
}
return 1
}
func (any *arrayAny) ToInt64() int64 {
if any.val.Len() == 0 {
return 0
}
return 1
}
func (any *arrayAny) ToUint() uint {
if any.val.Len() == 0 {
return 0
}
return 1
}
func (any *arrayAny) ToUint32() uint32 {
if any.val.Len() == 0 {
return 0
}
return 1
}
func (any *arrayAny) ToUint64() uint64 {
if any.val.Len() == 0 {
return 0
}
return 1
}
func (any *arrayAny) ToFloat32() float32 {
if any.val.Len() == 0 {
return 0
}
return 1
}
func (any *arrayAny) ToFloat64() float64 {
if any.val.Len() == 0 {
return 0
}
return 1
}
func (any *arrayAny) ToString() string {
str, _ := MarshalToString(any.val.Interface())
return str
}
func (any *arrayAny) Get(path ...interface{}) Any {
if len(path) == 0 {
return any
}
switch firstPath := path[0].(type) {
case int:
if firstPath < 0 || firstPath >= any.val.Len() {
return newInvalidAny(path)
}
return Wrap(any.val.Index(firstPath).Interface())
case int32:
if '*' == firstPath {
mappedAll := make([]Any, 0)
for i := 0; i < any.val.Len(); i++ {
mapped := Wrap(any.val.Index(i).Interface()).Get(path[1:]...)
if mapped.ValueType() != InvalidValue {
mappedAll = append(mappedAll, mapped)
}
}
return wrapArray(mappedAll)
}
return newInvalidAny(path)
default:
return newInvalidAny(path)
}
}
func (any *arrayAny) Size() int {
return any.val.Len()
}
func (any *arrayAny) WriteTo(stream *Stream) {
stream.WriteVal(any.val)
}
func (any *arrayAny) GetInterface() interface{} {
return any.val.Interface()
}

137
vendor/github.com/json-iterator/go/any_bool.go generated vendored Normal file
View File

@ -0,0 +1,137 @@
package jsoniter
type trueAny struct {
baseAny
}
func (any *trueAny) LastError() error {
return nil
}
func (any *trueAny) ToBool() bool {
return true
}
func (any *trueAny) ToInt() int {
return 1
}
func (any *trueAny) ToInt32() int32 {
return 1
}
func (any *trueAny) ToInt64() int64 {
return 1
}
func (any *trueAny) ToUint() uint {
return 1
}
func (any *trueAny) ToUint32() uint32 {
return 1
}
func (any *trueAny) ToUint64() uint64 {
return 1
}
func (any *trueAny) ToFloat32() float32 {
return 1
}
func (any *trueAny) ToFloat64() float64 {
return 1
}
func (any *trueAny) ToString() string {
return "true"
}
func (any *trueAny) WriteTo(stream *Stream) {
stream.WriteTrue()
}
func (any *trueAny) Parse() *Iterator {
return nil
}
func (any *trueAny) GetInterface() interface{} {
return true
}
func (any *trueAny) ValueType() ValueType {
return BoolValue
}
func (any *trueAny) MustBeValid() Any {
return any
}
type falseAny struct {
baseAny
}
func (any *falseAny) LastError() error {
return nil
}
func (any *falseAny) ToBool() bool {
return false
}
func (any *falseAny) ToInt() int {
return 0
}
func (any *falseAny) ToInt32() int32 {
return 0
}
func (any *falseAny) ToInt64() int64 {
return 0
}
func (any *falseAny) ToUint() uint {
return 0
}
func (any *falseAny) ToUint32() uint32 {
return 0
}
func (any *falseAny) ToUint64() uint64 {
return 0
}
func (any *falseAny) ToFloat32() float32 {
return 0
}
func (any *falseAny) ToFloat64() float64 {
return 0
}
func (any *falseAny) ToString() string {
return "false"
}
func (any *falseAny) WriteTo(stream *Stream) {
stream.WriteFalse()
}
func (any *falseAny) Parse() *Iterator {
return nil
}
func (any *falseAny) GetInterface() interface{} {
return false
}
func (any *falseAny) ValueType() ValueType {
return BoolValue
}
func (any *falseAny) MustBeValid() Any {
return any
}

83
vendor/github.com/json-iterator/go/any_float.go generated vendored Normal file
View File

@ -0,0 +1,83 @@
package jsoniter
import (
"strconv"
)
type floatAny struct {
baseAny
val float64
}
func (any *floatAny) Parse() *Iterator {
return nil
}
func (any *floatAny) ValueType() ValueType {
return NumberValue
}
func (any *floatAny) MustBeValid() Any {
return any
}
func (any *floatAny) LastError() error {
return nil
}
func (any *floatAny) ToBool() bool {
return any.ToFloat64() != 0
}
func (any *floatAny) ToInt() int {
return int(any.val)
}
func (any *floatAny) ToInt32() int32 {
return int32(any.val)
}
func (any *floatAny) ToInt64() int64 {
return int64(any.val)
}
func (any *floatAny) ToUint() uint {
if any.val > 0 {
return uint(any.val)
}
return 0
}
func (any *floatAny) ToUint32() uint32 {
if any.val > 0 {
return uint32(any.val)
}
return 0
}
func (any *floatAny) ToUint64() uint64 {
if any.val > 0 {
return uint64(any.val)
}
return 0
}
func (any *floatAny) ToFloat32() float32 {
return float32(any.val)
}
func (any *floatAny) ToFloat64() float64 {
return any.val
}
func (any *floatAny) ToString() string {
return strconv.FormatFloat(any.val, 'E', -1, 64)
}
func (any *floatAny) WriteTo(stream *Stream) {
stream.WriteFloat64(any.val)
}
func (any *floatAny) GetInterface() interface{} {
return any.val
}

74
vendor/github.com/json-iterator/go/any_int32.go generated vendored Normal file
View File

@ -0,0 +1,74 @@
package jsoniter
import (
"strconv"
)
type int32Any struct {
baseAny
val int32
}
func (any *int32Any) LastError() error {
return nil
}
func (any *int32Any) ValueType() ValueType {
return NumberValue
}
func (any *int32Any) MustBeValid() Any {
return any
}
func (any *int32Any) ToBool() bool {
return any.val != 0
}
func (any *int32Any) ToInt() int {
return int(any.val)
}
func (any *int32Any) ToInt32() int32 {
return any.val
}
func (any *int32Any) ToInt64() int64 {
return int64(any.val)
}
func (any *int32Any) ToUint() uint {
return uint(any.val)
}
func (any *int32Any) ToUint32() uint32 {
return uint32(any.val)
}
func (any *int32Any) ToUint64() uint64 {
return uint64(any.val)
}
func (any *int32Any) ToFloat32() float32 {
return float32(any.val)
}
func (any *int32Any) ToFloat64() float64 {
return float64(any.val)
}
func (any *int32Any) ToString() string {
return strconv.FormatInt(int64(any.val), 10)
}
func (any *int32Any) WriteTo(stream *Stream) {
stream.WriteInt32(any.val)
}
func (any *int32Any) Parse() *Iterator {
return nil
}
func (any *int32Any) GetInterface() interface{} {
return any.val
}

74
vendor/github.com/json-iterator/go/any_int64.go generated vendored Normal file
View File

@ -0,0 +1,74 @@
package jsoniter
import (
"strconv"
)
type int64Any struct {
baseAny
val int64
}
func (any *int64Any) LastError() error {
return nil
}
func (any *int64Any) ValueType() ValueType {
return NumberValue
}
func (any *int64Any) MustBeValid() Any {
return any
}
func (any *int64Any) ToBool() bool {
return any.val != 0
}
func (any *int64Any) ToInt() int {
return int(any.val)
}
func (any *int64Any) ToInt32() int32 {
return int32(any.val)
}
func (any *int64Any) ToInt64() int64 {
return any.val
}
func (any *int64Any) ToUint() uint {
return uint(any.val)
}
func (any *int64Any) ToUint32() uint32 {
return uint32(any.val)
}
func (any *int64Any) ToUint64() uint64 {
return uint64(any.val)
}
func (any *int64Any) ToFloat32() float32 {
return float32(any.val)
}
func (any *int64Any) ToFloat64() float64 {
return float64(any.val)
}
func (any *int64Any) ToString() string {
return strconv.FormatInt(any.val, 10)
}
func (any *int64Any) WriteTo(stream *Stream) {
stream.WriteInt64(any.val)
}
func (any *int64Any) Parse() *Iterator {
return nil
}
func (any *int64Any) GetInterface() interface{} {
return any.val
}

82
vendor/github.com/json-iterator/go/any_invalid.go generated vendored Normal file
View File

@ -0,0 +1,82 @@
package jsoniter
import "fmt"
type invalidAny struct {
baseAny
err error
}
func newInvalidAny(path []interface{}) *invalidAny {
return &invalidAny{baseAny{}, fmt.Errorf("%v not found", path)}
}
func (any *invalidAny) LastError() error {
return any.err
}
func (any *invalidAny) ValueType() ValueType {
return InvalidValue
}
func (any *invalidAny) MustBeValid() Any {
panic(any.err)
}
func (any *invalidAny) ToBool() bool {
return false
}
func (any *invalidAny) ToInt() int {
return 0
}
func (any *invalidAny) ToInt32() int32 {
return 0
}
func (any *invalidAny) ToInt64() int64 {
return 0
}
func (any *invalidAny) ToUint() uint {
return 0
}
func (any *invalidAny) ToUint32() uint32 {
return 0
}
func (any *invalidAny) ToUint64() uint64 {
return 0
}
func (any *invalidAny) ToFloat32() float32 {
return 0
}
func (any *invalidAny) ToFloat64() float64 {
return 0
}
func (any *invalidAny) ToString() string {
return ""
}
func (any *invalidAny) WriteTo(stream *Stream) {
}
func (any *invalidAny) Get(path ...interface{}) Any {
if any.err == nil {
return &invalidAny{baseAny{}, fmt.Errorf("get %v from invalid", path)}
}
return &invalidAny{baseAny{}, fmt.Errorf("%v, get %v from invalid", any.err, path)}
}
func (any *invalidAny) Parse() *Iterator {
return nil
}
func (any *invalidAny) GetInterface() interface{} {
return nil
}

69
vendor/github.com/json-iterator/go/any_nil.go generated vendored Normal file
View File

@ -0,0 +1,69 @@
package jsoniter
type nilAny struct {
baseAny
}
func (any *nilAny) LastError() error {
return nil
}
func (any *nilAny) ValueType() ValueType {
return NilValue
}
func (any *nilAny) MustBeValid() Any {
return any
}
func (any *nilAny) ToBool() bool {
return false
}
func (any *nilAny) ToInt() int {
return 0
}
func (any *nilAny) ToInt32() int32 {
return 0
}
func (any *nilAny) ToInt64() int64 {
return 0
}
func (any *nilAny) ToUint() uint {
return 0
}
func (any *nilAny) ToUint32() uint32 {
return 0
}
func (any *nilAny) ToUint64() uint64 {
return 0
}
func (any *nilAny) ToFloat32() float32 {
return 0
}
func (any *nilAny) ToFloat64() float64 {
return 0
}
func (any *nilAny) ToString() string {
return ""
}
func (any *nilAny) WriteTo(stream *Stream) {
stream.WriteNil()
}
func (any *nilAny) Parse() *Iterator {
return nil
}
func (any *nilAny) GetInterface() interface{} {
return nil
}

123
vendor/github.com/json-iterator/go/any_number.go generated vendored Normal file
View File

@ -0,0 +1,123 @@
package jsoniter
import (
"io"
"unsafe"
)
type numberLazyAny struct {
baseAny
cfg *frozenConfig
buf []byte
err error
}
func (any *numberLazyAny) ValueType() ValueType {
return NumberValue
}
func (any *numberLazyAny) MustBeValid() Any {
return any
}
func (any *numberLazyAny) LastError() error {
return any.err
}
func (any *numberLazyAny) ToBool() bool {
return any.ToFloat64() != 0
}
func (any *numberLazyAny) ToInt() int {
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
val := iter.ReadInt()
if iter.Error != nil && iter.Error != io.EOF {
any.err = iter.Error
}
return val
}
func (any *numberLazyAny) ToInt32() int32 {
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
val := iter.ReadInt32()
if iter.Error != nil && iter.Error != io.EOF {
any.err = iter.Error
}
return val
}
func (any *numberLazyAny) ToInt64() int64 {
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
val := iter.ReadInt64()
if iter.Error != nil && iter.Error != io.EOF {
any.err = iter.Error
}
return val
}
func (any *numberLazyAny) ToUint() uint {
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
val := iter.ReadUint()
if iter.Error != nil && iter.Error != io.EOF {
any.err = iter.Error
}
return val
}
func (any *numberLazyAny) ToUint32() uint32 {
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
val := iter.ReadUint32()
if iter.Error != nil && iter.Error != io.EOF {
any.err = iter.Error
}
return val
}
func (any *numberLazyAny) ToUint64() uint64 {
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
val := iter.ReadUint64()
if iter.Error != nil && iter.Error != io.EOF {
any.err = iter.Error
}
return val
}
func (any *numberLazyAny) ToFloat32() float32 {
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
val := iter.ReadFloat32()
if iter.Error != nil && iter.Error != io.EOF {
any.err = iter.Error
}
return val
}
func (any *numberLazyAny) ToFloat64() float64 {
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
val := iter.ReadFloat64()
if iter.Error != nil && iter.Error != io.EOF {
any.err = iter.Error
}
return val
}
func (any *numberLazyAny) ToString() string {
return *(*string)(unsafe.Pointer(&any.buf))
}
func (any *numberLazyAny) WriteTo(stream *Stream) {
stream.Write(any.buf)
}
func (any *numberLazyAny) GetInterface() interface{} {
iter := any.cfg.BorrowIterator(any.buf)
defer any.cfg.ReturnIterator(iter)
return iter.Read()
}

Some files were not shown because too many files have changed in this diff Show More