207 Commits

Author SHA1 Message Date
df25b0bc76 Shamrock: 支持添加QQ收藏(文本) /fav/add_rich_media_msg 2023-12-22 03:08:46 +08:00
d07eea7766 Shamrock: Shamrock更新后自动重新启动 2023-12-22 02:26:39 +08:00
5000453002 Shamrock: 完成QQ收藏数据分析 2023-12-21 02:25:20 +08:00
35c82fcc51 Shamrock: fix #169 2023-12-21 00:55:56 +08:00
89a4912ed7 Shamrock: fix #166 2023-12-20 18:58:17 +08:00
aeabc66067 Shamrock: 兼容性正反向HTTP调整 2023-12-20 18:52:24 +08:00
ccbfc9a1e1 Shamrock: fix #159 2023-12-19 22:11:22 +08:00
31936feb98 Merge remote-tracking branch 'origin/master' 2023-12-19 22:10:03 +08:00
538db69754 Shamrock: fix #159 2023-12-19 22:09:23 +08:00
25ea5bd6a8 Merge pull request #162 from callng/master
`Shamrock`: Upgrade build tools
2023-12-19 22:07:32 +08:00
460cd84258 Shamrock: Upgrade build tools 2023-12-19 21:13:28 +08:00
3f9613c43c Shamrock: 输出心跳日志 2023-12-19 21:07:28 +08:00
34eccda233 Shamrock: Määritetty tunnus ei vaadi suuraakkosia 2023-12-19 01:21:08 +08:00
741d2c7a84 Shamrock: fix #117 2023-12-19 01:13:39 +08:00
6ee5ceb321 Shamrock: fix #155 2023-12-18 21:15:56 +08:00
6107ec6ffb Shamrock: fix #156 2023-12-17 11:40:05 +08:00
4ef014a8ac Shamrock: fix card event and kickme operation 2023-12-13 15:09:46 +08:00
135a7c2f56 Shamrock: 优化构建流程 2023-12-13 01:23:40 +08:00
420f11784d Shamrock: fix field error 2023-12-13 00:22:06 +08:00
951e7462c4 Shamrock: add shut_up_timestamp field to get_group_member_list 2023-12-13 00:18:57 +08:00
1b0550b5e1 readme: fix broken link 2023-12-12 17:17:31 +08:00
919c4a7d80 Shamrock: fix #149 again 2023-12-12 11:11:21 +08:00
dcb2b0a26f Shamrock: fix #149 2023-12-12 10:28:24 +08:00
d388e5df0c Shamrock: fix #149 2023-12-11 14:29:07 +08:00
5776524579 Shamrock: 好友请求系统消息 2023-12-10 18:40:33 +08:00
1d0a0731fb Shamrock: 修复群消息撤回事件群号获取错误 2023-12-10 01:57:38 +08:00
4dafa75944 Shamrock: 修复群禁言事件群号获取错误 #148 2023-12-10 01:21:38 +08:00
85cdc86b07 Merge pull request #144 from PisLuanyao/master
`Clover.cpp`: NoxAppPlayer里的鸡脚so
2023-12-10 01:09:21 +08:00
cd19426d1b Clover.cpp: NoxAppPlayer
稍微动了一下,方便看,希望没搞错
2023-12-09 19:14:22 +08:00
48b1b40e1c Clover.cpp: NoxAppPlayer
也许是无效的?
2023-12-09 18:56:00 +08:00
50d469cc45 Clover.cpp: NoxAppPlayer
夜神模拟器里的鸡脚so
2023-12-09 18:41:53 +08:00
37f74d5284 Shamrock: 优化检测逻辑 2023-12-09 16:18:30 +08:00
adb7b12c16 Shamrock: feat 群打卡 2023-12-08 21:52:35 +08:00
27791cc848 Shamrock: fix friend request type typo 2023-12-08 12:54:34 +08:00
bd45523e25 Shamrock: 修正被动WebSocket日志 2023-12-07 23:44:55 +08:00
c0f2242679 Shamrock: 修复防止系统打盹错误 2023-12-07 00:24:06 +08:00
c309a2b3ed Shamrock: fix 部分事件日志错误打印 2023-12-06 16:42:00 +08:00
48c9048a00 Merge branch 'master' of github.com:whitechi73/OpenShamrock 2023-12-06 15:53:11 +08:00
4d2f7a794b Shamrock: 补充群成员信息area、age和level字段 2023-12-06 15:53:01 +08:00
ab6e431872 Merge remote-tracking branch 'origin/master' 2023-12-06 09:44:20 +08:00
9423df2670 Shamrock: 修复回复类型id错误 2023-12-06 09:44:10 +08:00
a2b3e42eee Shamrock: fix #125 2023-12-06 00:52:57 +08:00
d9a045bbf0 Shamrock: 修复构建 2023-12-05 18:26:15 +08:00
42ca17339e Shamrock: 不处理发给自己的消息 2023-12-05 18:24:22 +08:00
003c4d4456 Shamrock: 修复群戳一戳丶群打卡获取的群号错误 2023-12-04 19:42:46 +08:00
ec39aa7bc3 Shamrock: fix #124 2023-12-04 15:07:33 +08:00
4e3870a512 Shamrock: fix #124 2023-12-04 12:58:53 +08:00
97534b01a6 Merge pull request #121 from Miuzarte/patch-1
go-cqhttp like card and nickname field
2023-12-03 12:43:16 +08:00
61bed61bfb go-cqhttp like card and nickname field 2023-12-03 02:15:17 +08:00
a0ff4782db Merge remote-tracking branch 'origin/master' 2023-12-02 23:55:57 +08:00
41dd1de8f8 Shamrock: try fix #120 2023-12-02 23:55:48 +08:00
fa6634d6af Shamrock: fix #111 and add group sign event 2023-12-02 22:59:37 +08:00
6201d12f5f Shamrock: error fix 2023-12-02 18:08:35 +08:00
b2adc5cedf Shamrock: fix #106 2023-12-02 17:54:53 +08:00
0bb871bf01 Shamrock: fix #115 2023-12-02 17:36:34 +08:00
dc969440ee Shamrock: fix #116 2023-12-02 16:21:16 +08:00
b9b6e133d0 Shamrock: fix #117 2023-12-02 16:19:05 +08:00
b5a9884448 Shamrock: fix 群头衔推送 2023-12-02 11:11:22 +08:00
bffb7caf04 Shamrock: A60's PING-PONG 2023-12-02 09:51:39 +08:00
2c3466b4c3 Shamrock: fix 96 crash 2023-12-01 19:30:48 +08:00
007e5fef2f Merge branch 'master' of github.com:whitechi73/OpenShamrock 2023-12-01 15:22:04 +08:00
48773cc47c Shamrock: JSON メッセージのクラッシュと QQ ミュージックのカバーを修正 2023-12-01 15:21:58 +08:00
b2ad4438ab Shamrock: fix #114 2023-12-01 14:47:33 +08:00
2fdcfe332b Shamrock: fix #109 2023-11-30 22:38:44 +08:00
7d8772ebf6 Shamrock: スーパーアンチチェックのオフを許可 2023-11-30 21:36:57 +08:00
2a75160ef8 Merge remote-tracking branch 'origin/master' 2023-11-30 21:33:43 +08:00
76bd58d984 Shamrock: スーパーアンチチェックのオフを許可 2023-11-30 21:33:32 +08:00
39120bdeae Shamrock: fix 群精华消息推送 2023-11-30 19:04:25 +08:00
7b07698f7b Shamrock: fix #110 2023-11-30 12:27:07 +08:00
5c10a5a04e Shamrock: 支持篮球超表情, 新猜拳超表情 2023-11-30 10:28:12 +08:00
3a0dc41329 Shamrock: 支持NTQQ骰子消息(new_dice) 2023-11-29 22:11:36 +08:00
64c800c945 Merge remote-tracking branch 'origin/master' 2023-11-29 10:11:35 +08:00
ecb3cea5a5 Shamrock: fix #105 2023-11-29 10:11:24 +08:00
8e0ae6f85b Shamrock: fix #104 2023-11-28 23:49:21 +08:00
9d893b481d Shamrock: fix group ban user_id error 2023-11-28 17:33:33 +08:00
85aaa54e4e Shamrock: friend poke event detail fix #103 2023-11-28 17:19:08 +08:00
c6dad5677c Shamrock: #103 2023-11-28 17:10:19 +08:00
80a4a208b9 Shamrock: 尝试修复 #98 2023-11-27 12:06:02 +08:00
ae663e6b2e Shamrock: 中二通事 2023-11-27 01:13:40 +08:00
780f3577a5 Shamrock: optimize clover.cpp 2023-11-27 00:42:15 +08:00
3518f974cc Shamrock: bypass emu detection 2023-11-27 00:28:43 +08:00
911b003f7f Shamrock: Modify required fields according to the document 2023-11-27 00:23:02 +08:00
69bc80e9b3 Merge branch 'master' of github.com:whitechi73/OpenShamrock 2023-11-27 00:18:56 +08:00
da0b74db1a Shamrock: fix #92 2023-11-27 00:18:51 +08:00
7212938df3 Shamrock: fix troopowneruin 2023-11-26 22:34:00 +08:00
ae1e78b267 Merge remote-tracking branch 'origin/master' 2023-11-26 22:29:18 +08:00
b7266e490f Shamrock: アンチシミュレータ検出 2023-11-26 22:29:11 +08:00
6b4a429821 Shamrock: fix forward msg nesting(x 2023-11-26 22:06:26 +08:00
4a4507dfcd Shamrock: add switch of anti trace 2023-11-26 19:28:36 +08:00
f63bcabf1b Shamrock: 添加native检测绕过模板 2023-11-26 18:32:55 +08:00
4932b36ee1 Shamrock: fix: グループリクエストイベントの通知と処理ロジックを最適化する 2023-11-26 12:59:48 +08:00
8c307c4f6e Shamrock: fix #90 2023-11-25 20:28:14 +08:00
8d8846fafb Shamrock: 复皆如何推送,遗类也。 2023-11-25 20:05:32 +08:00
544e216ddb Merge remote-tracking branch 'origin/master' 2023-11-25 19:55:09 +08:00
4fedab719b Shamrock: Support télécharger un fichier obtenir un ID de fichier 2023-11-25 19:55:00 +08:00
75a567d5cd Shamrock: fix 重複したグループ参加イベントを削除する 2023-11-25 19:47:35 +08:00
1a814e565a Shamrock: fix #89 2023-11-25 18:50:48 +08:00
5ea260c24b Shamrock: #89 2023-11-25 18:31:08 +08:00
2d57dc021d Merge branch 'master' of github.com:whitechi73/OpenShamrock 2023-11-25 13:51:21 +08:00
dabe2ea886 Shamrock: グループファイルのハッシュ値が増加する 2023-11-25 13:51:16 +08:00
673902e514 Shamrock: fix typo 2023-11-25 13:33:06 +08:00
5062ff7c3a Shamrock: ログスライス #78 2023-11-25 11:53:39 +08:00
0de6f851a6 Merge remote-tracking branch 'origin/master' 2023-11-25 11:29:26 +08:00
c758b1576d Shamrock: アクティブWebSocketハートビートの修復 2023-11-25 11:29:06 +08:00
5ba8bd11e2 Shamrock: essence, card change and title change event 2023-11-25 02:09:16 +08:00
679b7619ce Shamrock: wsハートビート間隔の制御をサポート 2023-11-25 00:42:10 +08:00
282233131a Shamrock: fix 非常に奇妙なフォームデータの問題 2023-11-24 15:18:50 +08:00
edf857bcb6 Shamrock: _send_group_notice 2023-11-24 13:21:22 +08:00
cd1d1e928a Merge branch 'master' of github.com:whitechi73/OpenShamrock 2023-11-24 01:00:59 +08:00
45d6421153 Shamrock: _get_group_notice 2023-11-24 01:00:53 +08:00
8c6f529b4b Merge pull request #76 from DouchChunFeng/master
有个空格
2023-11-24 00:24:57 +08:00
b23620b5ef Shamrock: get_essence_msg_list 2023-11-24 00:21:05 +08:00
e09e00fcd3 有个空格 2023-11-24 00:06:50 +08:00
0d35d5834b Shamrock: 金メダル免除、システムレベルの保活をサポートする 2023-11-23 23:53:11 +08:00
ee8dc75be3 Shamrock: fix: implement request type event 2023-11-23 19:33:50 +08:00
5f91be547e Shamrock: fix group apply flag error 2023-11-23 18:15:20 +08:00
7439622cd6 Shamrock: fix #73 2023-11-23 12:51:26 +08:00
5f0cf952e8 Shamrock: support /switch_account 2023-11-23 09:48:30 +08:00
03d62c55c2 Shamrock: fix wrong group request event 2023-11-23 01:24:47 +08:00
89154f0c49 Shamrock: fix wrong types of get_group_system_msg 2023-11-23 00:38:55 +08:00
5218c153f0 fix: merge conflict 2023-11-22 23:54:36 +08:00
2b64aa8b2c Shamrock feat: GroupSystemMessage 2023-11-22 23:53:26 +08:00
67ef465f14 Shamrock: fix #70 2023-11-22 23:08:23 +08:00
ea62640057 Shamrock: support /get_prohibited_member_list 2023-11-22 23:03:20 +08:00
f67dfac4d9 Shamrock: support /get_prohibited_member_list for #72 2023-11-22 22:59:05 +08:00
1593d973a0 Merge branch 'master' of github.com:whitechi73/OpenShamrock 2023-11-21 23:39:26 +08:00
3e27c64e84 Shamrock: 友人およびグループのメンバーシップ要求の処理 2023-11-21 23:39:20 +08:00
c87268df09 Create FUNDING.yml 2023-11-21 22:47:38 +08:00
98c6316e23 Shamrock: fix #61 2023-11-21 22:30:53 +08:00
2af8d6d817 Shamrock: Gwellekaat dilemel ar restr strollad 2023-11-21 22:05:34 +08:00
b9c2de744e Merge pull request #69 from XSana/master
视频类型消息,md5文件名携带后缀导致hex2bytes失败
2023-11-21 21:09:41 +08:00
fcf18bd3fd Shamrock: fix #68 2023-11-21 21:09:07 +08:00
8265f74ca3 视频类型消息,md5文件名携带后缀导致hex2bytes失败 2023-11-21 18:15:54 +08:00
2c49b10772 Shamrock: fix #66 2023-11-21 11:58:32 +08:00
4266afd1a5 Merge remote-tracking branch 'origin/master' 2023-11-21 11:55:33 +08:00
b9ef0ca8f5 Shamrock: fix #67 2023-11-21 11:55:14 +08:00
040b132836 Shamrock: fix action name 2023-11-20 19:19:45 +08:00
16f77de5a6 Shamrock: feat: 精华消息 2023-11-20 18:36:46 +08:00
46c83f5cb9 Shamrock: fix #62 2023-11-20 17:07:24 +08:00
ca71ecae09 fix: #60 2023-11-19 19:51:48 +08:00
58d93b8f56 Shamrock: fix #33 2023-11-17 20:20:33 +08:00
472b17f744 Merge pull request #55 from ikechan8370/master
fix: グループイベントが正しく通知されない問題
2023-11-17 19:32:28 +08:00
8a4212ffd7 feat: グループに参加して友達と一緒に通知を申請しましょう 2023-11-17 19:18:50 +08:00
bd28b0f7f7 fix: グループイベントが正しく通知されない問題 2023-11-17 16:02:27 +08:00
f2dc3bc9fd Shamrock: fix #45 2023-11-16 11:23:31 +08:00
ba8322dc55 Merge pull request #50 from super1207/master
允许崩溃后快速重启
2023-11-16 00:25:27 +08:00
cf445d17d9 Merge pull request #49 from ikechan8370/master
fix: グループ限定タイトルインターフェースの問題
2023-11-16 00:24:50 +08:00
e6e03ee328 support vote 2023-11-15 19:50:06 +08:00
497df6b649 允许崩溃后快速重启 2023-11-15 17:20:36 +08:00
f87fd3887a fix: エコーフィールド欠落の問題 2023-11-15 16:18:37 +08:00
71a462e48f fix: グループ限定タイトルインターフェースの問題 2023-11-15 15:30:00 +08:00
93cb6fc46b Merge pull request #43 from ikechan8370/master
fix: add response headers and fix a null pointer exception
2023-11-14 22:52:00 +08:00
8fdea083b0 fix: add more response headers 2023-11-14 16:15:51 +08:00
1620e18bf4 fix: 私聊获取文件类型消息时的空指针异常 2023-11-13 22:45:33 +08:00
2f264ee9e4 Merge branch 'master' of https://github.com/ikechan8370/OpenShamrock 2023-11-13 22:45:15 +08:00
19e3846e40 Shamrock: fix #41 2023-11-13 01:32:53 +08:00
6b4f763a90 Merge pull request #35 from callng/dev
`Shamrock`: 使拦截的收包cmd更加清晰
2023-11-12 12:22:37 +08:00
d5378d8acb Shamrock: 使拦截的收包cmd更加清晰 2023-11-12 05:49:22 +08:00
ca62b33275 Shamrock: 修复获取历史消息丢失当前ID的消息 2023-11-11 23:02:36 +08:00
e09b68576a fix: Add response headers for some actions 2023-11-11 20:36:10 +08:00
80bb591a1b Shamrock: support /shell 2023-11-11 11:48:53 +08:00
08bce05c66 Shamrock: Sofitu pa unviar ficheros con nomes personalizaos 2023-11-10 21:42:29 +08:00
0fb2eeb2d8 Shamrock: Error fixa en cargar l'interface d'archivo sin parametro headers 2023-11-10 21:28:18 +08:00
3cf2474938 Shamrock: mkaefaɛu khWe’Wmɔdɔ, owsɛeɛe ɛgaooa 2023-11-10 21:03:37 +08:00
ce1e850c78 Shamrock: 連結転送のサポート(去勢) 2023-11-10 20:25:07 +08:00
5200a4d8d4 Shamrock: fix #26 2023-11-10 18:33:04 +08:00
0a41429d71 Shamrock: 連結転送逆順の修正 2023-11-10 00:39:58 +08:00
bc967cf926 Shamrock: Support du chat de groupe et transfert de messages 2023-11-10 00:34:51 +08:00
d28c6dc820 Shamrock: 返信ファイルメッセージの修正 2023-11-07 09:43:15 +08:00
10d25167e8 Shamrock: チャンネルフラッシュバックの修正を試みる 2023-11-07 09:28:13 +08:00
346798dc9a Shamrock: 履歴メッセージの取得をサポート x2 2023-11-07 09:15:00 +08:00
7584390408 Shamrock: 履歴メッセージの取得をサポート 2023-11-07 09:09:29 +08:00
3988ad3811 Shamrock: ローカルキャッシュメッセージの削除をサポート 2023-11-06 00:18:24 +08:00
72600364ff Shamrock: 修復ファイルリストの取得に失敗しました 2023-11-05 15:58:20 +08:00
68977e4a86 Shamrock: Nothing 2023-11-05 14:19:41 +08:00
92b3d4f94e Shamrock: Reparieren der Gruppenstimme kann nicht gesendet werden 2023-11-05 12:58:45 +08:00
852eb0d87b Shamrock: HTTPコールバック繰り返し登録Listenerの修正 2023-11-04 22:56:44 +08:00
c8143bcf67 Shamrock: 雑談音声フラッシュバックの修正 2023-11-04 22:53:01 +08:00
75dc5c0294 ShamrockPublic: オーバメモリローミング検出
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-04 03:41:43 +08:00
21341caf62 ShamrockSafe: 这是一次提交测试
Signed-off-by: WhiteChi <tencent@qq.com>
2023-11-03 22:53:31 +08:00
ee9cf694a0 ShamrockPrivate: 正确GUI配置配置文件
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-03 22:14:05 +08:00
d347bd0a41 ShamrockPublic: キャッシュディレクトリへのファイルのアップロードをサポートする
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-03 17:54:40 +08:00
e5cca58198 ShamrockPublic: 異なるスキーマの音声ライブラリの修復
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-03 15:12:27 +08:00
259de3d3aa ShamrockPublic: アクティブな一時チャットを許可する
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-03 15:12:06 +08:00
c30e3db1a1 伏秋洛: 那天早上雾散了,不止早上,不止雾。
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-03 02:19:58 +08:00
fb5718dc61 ShamrockPublic: 自動メッセージイベントの撤回エラーの修正
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-03 01:24:38 +08:00
6043c21de5 ShamrockPublic: 自発メッセージ同期ロジックの変更 x2
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-03 01:17:11 +08:00
c3c14d6ead ShamrockPublic: 自発メッセージ同期ロジックの変更
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-03 01:11:42 +08:00
41675ed874 ShamrockPrivate: 尝试修复自发消息异常闪退
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-02 18:44:02 +08:00
dc2503b045 ShamrockPrivate: 修改WebSocket发信逻辑
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-02 08:22:59 +08:00
b76ef7efb3 Shamrock: Allow modification of active WebSocket listening address
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-02 08:05:16 +08:00
c67b49790f Shamrock: 修复被动WS缺失链接
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-01 23:59:47 +08:00
86b29b982c Shamrock: 添加被动WS链接日志
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-01 22:47:44 +08:00
f17b4924c9 Shamrock: 雑談ニックネームの紛失を修正する
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-01 21:32:16 +08:00
e162da7e7b Merge remote-tracking branch 'origin/master' 2023-11-01 21:24:24 +08:00
6f1ba71664 Shamrock: 自発メッセージメッセージIDエラーの修正
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-11-01 21:24:16 +08:00
16e0c9542e Shamrock: 增加拦截内部浏览器的URL检测 2023-11-01 06:50:39 +08:00
e41b7515d3 Shamrock: 臨時メッセージ
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-10-31 14:30:40 +08:00
52b8db70be Shamrock: 暗黙的コンフィギュレータの追加
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-10-31 13:47:49 +08:00
184064d199 Shamrock: 更新逆検出
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-10-31 10:26:16 +08:00
ae1684a885 Shamrock: グループメンバーリスト取得ロジックの変更
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-10-31 10:21:06 +08:00
688041b6be Shamrock: わけのわからないフラッシュバックを修復する
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-10-31 00:40:42 +08:00
4adf2eb84a Shamrock: プロファイルロジックの変更
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-10-31 00:19:51 +08:00
3f8af384b0 Shamrock: 外部リンクライブラリ初期化ロジックの変更
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-10-30 09:37:47 +08:00
79f2594a2f Shamrock: 更新反检测逻辑
Signed-off-by: WhiteChi <whitechi73@outlook.com>
2023-10-29 18:04:03 +08:00
547f224140 fix: README.md 2023-10-28 11:40:38 +08:00
94937a75a2 fix: README.md 2023-10-28 11:40:06 +08:00
207 changed files with 8341 additions and 1312 deletions

13
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1,13 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: shamrock320 # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

View File

@ -6,7 +6,7 @@ labels: bug
---
警告: 在进一步操作之前,请检查下列选项。如果您忽视此模板或者没有提供关键信息,您的 Issue 将直接被关闭
- 确保您使用的是 [最新开发版本](https://github.com/whitechi73/Shamrock/actions/workflows/build-apk.yml) 的 Shamrock.
- 确保您使用的是 [最新开发版本](https://github.com/whitechi73/OpenShamrock/actions/workflows/build-apk.yml) 的 Shamrock.
- 确保您的问题尚未在 Issues 列表中提出.
- 确保您的问题不是由于您的代码错误导致的.
@ -22,5 +22,6 @@ labels: bug
- Shamrock 版本:
- Android 版本:
- LSPosed 框架版本:
- 设备的制造商和型号:
- 设备的 CPU 架构:

View File

@ -7,7 +7,7 @@ labels: enhancement
警告: 在进一步操作之前,请检查下列选项。如果您忽视此模板或者没有提供关键信息,您的 Issue 将直接被关闭
- 确保您使用的是 [最新开发版本](https://github.com/whitechi73/Shamrock/actions/workflows/build-apk.yml) 的 Shamrock.
- 确保您使用的是 [最新开发版本](https://github.com/whitechi73/OpenShamrock/actions/workflows/build-apk.yml) 的 Shamrock.
- 确保您的功能请求尚未在 Issues 列表中提出.
- 确保您的功能请求是与 Shamrock 相关的,且可以实现.

View File

@ -13,24 +13,38 @@ on:
jobs:
build:
name: Build APK
name: Build Shamrock
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v3
with:
distribution: "temurin"
fetch-depth: 0
- name: Setup JDK 17
uses: actions/setup-java@v4.0.0
with:
java-version: 17
cache: 'gradle'
distribution: "adopt"
- name: Setup cmake
run: |
echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "cmake;3.22.1" --sdk_root=${ANDROID_SDK_ROOT} &> /dev/null
echo "sdk.dir=${ANDROID_HOME}" > local.properties
- name: Cache Gradle Dependencies
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
!~/.gradle/caches/build-cache-*
key: gradle-deps-core-${{ hashFiles('**/build.gradle.kts') }}
restore-keys: gradle-deps
- name: Setup Gradle
uses: gradle/gradle-build-action@v2.9.0
- name: Cache Gradle Build
uses: actions/cache@v3
with:
path: |
~/.gradle/caches/build-cache-*
~/.gradle/buildOutputCleanup/cache.properties
key: gradle-builds-core-${{ github.sha }}
restore-keys: gradle-builds
- name: Build with Gradle
run: |
@ -46,42 +60,41 @@ jobs:
KEY_ALIAS: ${{ secrets.SIGN_ALIAS }}
KEY_PASSWORD: ${{ secrets.SIGN_KEY_PASSWORD }}
- name: Install aapt
run: sudo apt-get update && sudo apt-get install -y aapt
- name: Set Shamrock Version
run: |
apk_file=${{ env.APK_FILE_ALL }}
apk_dump=$(aapt dump badging "$apk_file")
version_name=$(sed -n "s/.*versionName='\([^']*\)'.*/\1/p" <<< "$apk_dump")
echo "SHAMROCK_VERSION=$version_name" >> $GITHUB_ENV
version_name_all=$(basename -s .apk "${{ env.APK_FILE_ALL }}")
version_name_arm64=$(basename -s .apk "${{ env.APK_FILE_ARM64 }}")
version_name_x86_64=$(basename -s .apk "${{ env.APK_FILE_X86_64 }}")
echo "SHAMROCK_VERSION_ALL=$version_name_all" >> $GITHUB_ENV
echo "SHAMROCK_VERSION_ARM64=$version_name_arm64" >> $GITHUB_ENV
echo "SHAMROCK_VERSION_x86_64=$version_name_x86_64" >> $GITHUB_ENV
- name: Show Artifacts SHA256
run: |
echo "### Build Success :rocket:" >> $GITHUB_STEP_SUMMARY
echo "|ABI|SHA256|" >> $GITHUB_STEP_SUMMARY
echo "|:--------:|:----------|" >> $GITHUB_STEP_SUMMARY
all=($(sha256sum ${{ env.APK_FILE_ALL }}))
all=($(sha256sum "${{ env.APK_FILE_ALL }}"))
echo "|all|$all" >> $GITHUB_STEP_SUMMARY
arm64=($(sha256sum ${{ env.APK_FILE_ARM64 }}))
arm64=($(sha256sum "${{ env.APK_FILE_ARM64 }}"))
echo "|arm64|$arm64" >> $GITHUB_STEP_SUMMARY
x86_64=($(sha256sum ${{ env.APK_FILE_X86_64 }}))
x86_64=($(sha256sum "${{ env.APK_FILE_X86_64 }}"))
echo "|x86_64|$x86_64" >> $GITHUB_STEP_SUMMARY
- name: Upload ALL APK RELEASE
uses: actions/upload-artifact@v3
with:
name: Shamrock-v${{ env.SHAMROCK_VERSION }}-all
path: ${{ env.APK_FILE_ALL }}
name: "${{ env.SHAMROCK_VERSION_ALL }}"
path: "${{ env.APK_FILE_ALL }}"
- name: Upload ARM64 APK RELEASE
uses: actions/upload-artifact@v3
with:
name: Shamrock-v${{ env.SHAMROCK_VERSION }}-arm64
path: ${{ env.APK_FILE_ARM64 }}
name: "${{ env.SHAMROCK_VERSION_ARM64 }}"
path: "${{ env.APK_FILE_ARM64 }}"
- name: Upload X86_64 APK RELEASE
uses: actions/upload-artifact@v3
with:
name: Shamrock-v${{ env.SHAMROCK_VERSION }}-x86_64
path: ${{ env.APK_FILE_X86_64 }}
name: "${{ env.SHAMROCK_VERSION_x86_64 }}"
path: "${{ env.APK_FILE_X86_64 }}"

View File

@ -1,57 +0,0 @@
name: "CodeQL"
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
schedule:
- cron: '24 7 * * 4'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
timeout-minutes: 360
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'cpp', 'java' ]
steps:
- name: Checkout repository
uses: actions/checkout@v3.6.0
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
- name: Setup JDK 17
uses: actions/setup-java@v3.12.0
with:
distribution: "temurin"
java-version: 17
- name: Setup Gradle
uses: gradle/gradle-build-action@v2.8.0
- name: Setup cmake
run: |
echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "cmake;3.22.1" --sdk_root=${ANDROID_SDK_ROOT} &> /dev/null
echo "sdk.dir=${ANDROID_HOME}" > local.properties
- name: Build
run: |
chmod +x ./gradlew
./gradlew :app:assembleAppRelease
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{matrix.language}}"

View File

@ -1,73 +0,0 @@
name: Shamrock Release
on:
push:
tags:
- 'v*'
jobs:
build:
name: Release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v3
with:
distribution: "temurin"
java-version: 17
cache: 'gradle'
- name: Setup cmake
run: |
echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "cmake;3.22.1" --sdk_root=${ANDROID_SDK_ROOT} &> /dev/null
echo "sdk.dir=${ANDROID_HOME}" > local.properties
- name: Setup Gradle
uses: gradle/gradle-build-action@v2.9.0
- name: Build with Gradle
run: |
echo ${{ secrets.SIGN_KEYSTORE_BASE64 }} | base64 -d > keystore.jks
chmod +x ./gradlew
./gradlew :app:assembleRelease --build-cache --parallel --daemon --warning-mode all --stacktrace
echo "APK_FILE_ALL=$(find app/build/outputs/apk/app/release -name '*.apk')" >> $GITHUB_ENV
echo "APK_FILE_ARM64=$(find app/build/outputs/apk/arm64/release -name '*.apk')" >> $GITHUB_ENV
echo "APK_FILE_X86_64=$(find app/build/outputs/apk/x64/release -name '*.apk')" >> $GITHUB_ENV
env:
KEYSTORE_PATH: "../keystore.jks"
KEYSTORE_PASSWORD: ${{ secrets.SIGN_KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.SIGN_ALIAS }}
KEY_PASSWORD: ${{ secrets.SIGN_KEY_PASSWORD }}
- name: Install aapt
run: sudo apt-get update && sudo apt-get install -y aapt
- name: Set Shamrock Version
run: |
apk_file=${{ env.APK_FILE_ALL }}
apk_dump=$(aapt dump badging "$apk_file")
version_name=$(sed -n "s/.*versionName='\([^']*\)'.*/\1/p" <<< "$apk_dump")
echo "SHAMROCK_VERSION=$version_name" >> $GITHUB_ENV
- name: Show Artifacts SHA256
run: |
echo "### Build Success :rocket:" >> $GITHUB_STEP_SUMMARY
echo "|ABI|SHA256|" >> $GITHUB_STEP_SUMMARY
echo "|:--------:|:----------|" >> $GITHUB_STEP_SUMMARY
all=($(sha256sum ${{ env.APK_FILE_ALL }}))
echo "|all|$all" >> $GITHUB_STEP_SUMMARY
arm64=($(sha256sum ${{ env.APK_FILE_ARM64 }}))
echo "|arm64|$arm64" >> $GITHUB_STEP_SUMMARY
x86_64=($(sha256sum ${{ env.APK_FILE_X86_64 }}))
echo "|x86_64|$x86_64" >> $GITHUB_STEP_SUMMARY
- name: Release
uses: marvinpinto/action-automatic-releases@latest
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
automatic_release_tag: Shamrock v${{ env.SHAMROCK_VERSION }}
files: |
${{ env.APK_FILE_ALL }}
${{ env.APK_FILE_ARM64 }}
${{ env.APK_FILE_X86_64 }}

BIN
AudioLibrary-x64.zip Normal file

Binary file not shown.

View File

@ -10,7 +10,7 @@
![][onebot-12]
[![][license]](LICENSE)
[下载][download-link] | [部署][deploy-link] | [接口][api-link] | [文档][docs-link] | [加群][group-link]
[下载][download-link] | [部署][deploy-link] | [接口][api-link] | [文档][docs-link]
</div>
@ -22,14 +22,13 @@
> 本项目目的是研究 Xposed 和 LSPosed 框架的使用。 Epic 框架开发相关知识。
> 如有违反法律,请联系删除。
> 请勿在任何平台宣传,宣扬,转发本项目,请勿恶意修改企业安装包造成相关企业产生损失,如有违背,必将追责到底。
> 官方论坛,[点我直达](https://forum.libfekit.so/)
## 兼容|迁移|替代 说明
- 一键移植:本项目基于 go-cqhttp 的文档进行开发实现。
- 平行部署:可多平台部署,未来将会支持 Docker 部署的教程。
> 若您追求小而轻便的Bot服务, [Chronocat](https://chronocat.vercel.app/)是您的不二之选。
## 权限声明
> 如出现未在此处声明的权限,请警惕 Shamrock 是否被修改/植入恶意代码
@ -44,7 +43,7 @@
## 贡献说明
<img src="https://github.com/whitechi73/OpenShamrock/assets/98259561/f04d60bc-ec40-41fc-bc15-62c146f1a1f1" width="160px"> **我可爱吗?欢迎你的到来,这里是一个很大的地方,有着无限可能,主要是有你啦!**
<img src="https://github.com/whitechi73/OpenShamrock/assets/98259561/f04d60bc-ec40-41fc-bc15-62c146f1a1f1" width="160px" alt="Shamrock"> **我可爱吗?欢迎你的到来,这里是一个很大的地方,有着无限可能,主要是有你啦!**
## 开源协议
@ -69,38 +68,36 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
[![][contrib-image]][contrib-link]
[banner]: https://socialify.git.ci/whitechi73/Shamrock/image?description=1&forks=1&issues=1&logo=https%3A%2F%2Fwhitechi73.github.io%2FShamrock%2Fshamrock.jpg&pattern=Plus&pulls=1&stargazers=1&theme=Auto
[banner]: https://socialify.git.ci/whitechi73/OpenShamrock/image?description=1&forks=1&issues=1&logo=https%3A%2F%2Fwhitechi73.github.io%2FOpenShamrock%2Fshamrock.jpg&pattern=Plus&pulls=1&stargazers=1&theme=Auto
[actions]: https://img.shields.io/github/actions/workflow/status/whitechi73/Shamrock/build-apk.yml?style=for-the-badge
[actions]: https://img.shields.io/github/actions/workflow/status/whitechi73/OpenShamrock/build-apk.yml?style=for-the-badge
[actions-link]: https://github.com/whitechi73/Shamrock/actions/workflows/build-apk.yml
[actions-link]: https://github.com/whitechi73/OpenShamrock/actions/workflows/build-apk.yml
[releases]: https://img.shields.io/github/v/release/whitechi73/Shamrock?style=for-the-badge
[releases]: https://img.shields.io/github/v/release/whitechi73/OpenShamrock?style=for-the-badge
[releases-link]: https://github.com/whitechi73/Shamrock/releases
[releases-link]: https://github.com/whitechi73/OpenShamrock/releases
[downloads]: https://img.shields.io/github/downloads/whitechi73/Shamrock/total?style=for-the-badge
[downloads]: https://img.shields.io/github/downloads/whitechi73/OpenShamrock/total?style=for-the-badge
[license]: https://img.shields.io/github/license/whitechi73/Shamrock?style=for-the-badge
[license]: https://img.shields.io/github/license/whitechi73/OpenShamrock?style=for-the-badge
[onebot-11]: https://img.shields.io/badge/OneBot-11-black?style=for-the-badge
[onebot-12]: https://img.shields.io/badge/OneBot-12-black?style=for-the-badge
[download-link]: https://whitechi73.github.io/Shamrock/guide/getting-started.html#%E4%B8%8B%E8%BD%BD
[download-link]: https://whitechi73.github.io/OpenShamrock/guide/getting-started.html#%E4%B8%8B%E8%BD%BD
[deploy-link]: https://whitechi73.github.io/Shamrock/guide/getting-started.html#%E9%83%A8%E7%BD%B2
[deploy-link]: https://whitechi73.github.io/OpenShamrock/guide/getting-started.html#%E9%83%A8%E7%BD%B2
[api-link]: https://whitechi73.github.io/Shamrock/api
[api-link]: https://whitechi73.github.io/OpenShamrock/api
[docs-link]: https://whitechi73.github.io/Shamrock/
[docs-link]: https://whitechi73.github.io/OpenShamrock/
[group-link]: https://whitechi73.github.io/Shamrock/group.html
[hook-system]: https://github.com/whitechi73/OpenShamrock/blob/master/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/loader/KeepAlive.kt
[hook-system]: https://github.com/whitechi73/Shamrock/wiki/perm_hook_android
[voice-support]: https://whitechi73.github.io/OpenShamrock/advanced/voice.html
[voice-support]: https://whitechi73.github.io/Shamrock/advanced/voice.html
[contrib-image]: https://contrib.rocks/image?repo=whitechi73/OpenShamrock
[contrib-image]: https://contrib.rocks/image?repo=whitechi73/Shamrock
[contrib-link]: https://github.com/whitechi73/Shamrock/graphs/contributors
[contrib-link]: https://github.com/whitechi73/OpenShamrock/graphs/contributors

View File

@ -1,12 +1,5 @@
import com.android.build.api.dsl.ApplicationExtension
fun gitCommitHash(): String {
val builder = ProcessBuilder("git", "rev-parse", "--short", "HEAD")
val process = builder.start()
val reader = process.inputReader()
val hash = reader.readText().trim()
return if (hash.isNotEmpty()) ".$hash" else ""
}
import java.io.ByteArrayOutputStream
plugins {
id("com.android.application")
@ -17,19 +10,20 @@ plugins {
android {
namespace = "moe.fuqiuluo.shamrock"
ndkVersion = "25.1.8937393"
compileSdk = 33
compileSdk = 34
defaultConfig {
applicationId = "moe.fuqiuluo.shamrock"
minSdk = 24
targetSdk = 33
versionCode = (System.currentTimeMillis() / 1000).toInt()
versionName = "1.0.5-dev" + gitCommitHash()
minSdk = 27
targetSdk = 34
versionCode = getVersionCode()
versionName = "1.0.7" + ".r${getGitCommitCount()}." + getVersionName()
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
@Suppress("UnstableApiUsage")
externalNativeBuild {
cmake {
cppFlags += ""
@ -50,8 +44,7 @@ android {
android.applicationVariants.all {
outputs.map { it as com.android.build.gradle.internal.api.BaseVariantOutputImpl }
.forEach {
val abi = it.outputFileName.split("-")[1].split(".apk")[0]
val abiName = when (abi) {
val abiName = when (val abi = it.outputFileName.split("-")[1].split(".apk")[0]) {
"app" -> "all"
"x64" -> "x86_64"
else -> abi
@ -66,6 +59,7 @@ android {
create("app") {
dimension = "mode"
ndk {
println("Full architecture and full compilation.")
abiFilters.add("arm64-v8a")
abiFilters.add("x86_64")
}
@ -73,12 +67,14 @@ android {
create("arm64") {
dimension = "mode"
ndk {
println("Full compilation of arm64 architecture")
abiFilters.add("arm64-v8a")
}
}
create("x64") {
dimension = "mode"
ndk {
println("Full compilation of x64 architecture")
abiFilters.add("x86_64")
}
}
@ -130,6 +126,11 @@ android {
}
configureAppSigningConfigsForRelease(project)
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
fun configureAppSigningConfigsForRelease(project: Project) {
@ -151,10 +152,39 @@ fun configureAppSigningConfigsForRelease(project: Project) {
release {
signingConfig = signingConfigs.findByName("release")
}
debug {
signingConfig = signingConfigs.findByName("release")
}
}
}
}
fun getGitCommitCount(): Int {
val out = ByteArrayOutputStream()
exec {
commandLine("git", "rev-list", "--count", "HEAD")
standardOutput = out
}
return out.toString().trim().toInt()
}
fun getGitCommitHash(): String {
val out = ByteArrayOutputStream()
exec {
commandLine("git", "rev-parse", "--short", "HEAD")
standardOutput = out
}
return out.toString().trim()
}
fun getVersionCode(): Int {
return (System.currentTimeMillis() / 1000L).toInt()
}
fun getVersionName(): String {
return getGitCommitHash()
}
dependencies {
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1")
@ -173,24 +203,19 @@ dependencies {
implementation("io.coil-kt:coil:2.4.0")
implementation("io.coil-kt:coil-compose:2.4.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
implementation("org.jetbrains.kotlinx:kotlinx-io-jvm:0.1.16")
implementation("io.ktor:ktor-server-core:2.3.3")
implementation("io.ktor:ktor-server-host-common:2.3.3")
implementation("io.ktor:ktor-server-status-pages:2.3.3")
implementation("io.ktor:ktor-server-netty:2.3.3")
implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.3")
implementation("io.ktor:ktor-server-content-negotiation:2.3.3")
implementation("io.ktor:ktor-client-core:2.3.3")
implementation("io.ktor:ktor-client-cio:2.3.3")
implementation("io.ktor:ktor-client-content-negotiation:2.3.3")
implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.3")
// useless
//implementation ("com.maxkeppeler.sheets-compose-dialogs:core:1.2.0")
//implementation ("com.maxkeppeler.sheets-compose-dialogs:info:1.2.0")
//implementation ("com.maxkeppeler.sheets-compose-dialogs:input:1.2.0")
//implementation ("com.maxkeppeler.sheets-compose-dialogs:list:1.2.0")
//implementation ("com.maxkeppeler.sheets-compose-dialogs:state:1.2.0")
val ktorVersion = "2.3.3"
implementation("io.ktor:ktor-server-core:$ktorVersion")
implementation("io.ktor:ktor-server-host-common:$ktorVersion")
implementation("io.ktor:ktor-server-status-pages:$ktorVersion")
implementation("io.ktor:ktor-server-netty:$ktorVersion")
implementation("io.ktor:ktor-server-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-cio:$ktorVersion")
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
//implementation("io.ktor:ktor-serialization-kotlinx-protobuf:$ktorVersion")
implementation(project(":xposed"))

View File

@ -3,10 +3,6 @@
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application
android:name=".app.MyApplication"
@ -18,6 +14,7 @@
android:supportsRtl="true"
android:theme="@style/Theme.Shamrock"
android:zygotePreloadName="@string/app_name"
android:multiArch="true"
tools:targetApi="31">
<activity
android:name=".MainActivity"
@ -47,7 +44,7 @@
android:value="基于 Xposed 实现 OneBot 标准的 QQ 机器人框架" />
<meta-data
android:name="xposedminversion"
android:value="23" />
android:value="93" />
<meta-data
android:name="xposedscope"
android:resource="@array/xposed_scope" />

View File

@ -99,6 +99,8 @@ void decode_cqcode(const std::string& code, std::vector<std::unordered_map<std::
replace_string(cache, "&#93;", "]");
replace_string(cache, "&#44;", ",");
kv.emplace(key_tmp, cache);
} else {
kv.emplace("_type", cache);
}
dest.push_back(kv);
kv.clear();

View File

@ -61,8 +61,8 @@ const std::byte MD5::PADDING[64] = { (byte) 0x80 };
const char MD5::HEX[16] = {
'0', '1', '2', '3',
'4', '5', '6', '7',
'8', '9', 'a', 'b',
'c', 'd', 'e', 'f'
'8', '9', 'A', 'B',
'C', 'D', 'E', 'F'
};

View File

@ -120,6 +120,7 @@ private fun AppMainView() {
val coreVersion = remember { mutableStateOf(getShamrockVersion(context)) }
val coreName = remember { mutableStateOf("Xposed") }
val voiceSwitch = remember { mutableStateOf(false) }
@Suppress("LocalVariableName") val LocalString = LocalString
if (!AppRuntime.isInit) {
AppRuntime.state = remember {
@ -140,7 +141,7 @@ private fun AppMainView() {
mutableStateOf("2854200454")
}
it.nick = remember {
mutableStateOf("测试昵称")
mutableStateOf(LocalString.testName)
}
}
@ -150,13 +151,12 @@ private fun AppMainView() {
}
val ctx = LocalContext.current
@Suppress("LocalVariableName") val LocalString = LocalString
LaunchedEffect(isFined.value) {
if (isFined.value) {
AppRuntime.log("日志框架激活成功,开放操作许可。")
AppRuntime.log(LocalString.logCentralLoadSuccessfully)
Toast.makeText(ctx, LocalString.frameworkYes, Toast.LENGTH_SHORT).show()
} else {
AppRuntime.log("日志框架处于未激活状态,请检查。")
AppRuntime.log(LocalString.logCentralLoadFailed)
Toast.makeText(ctx, LocalString.frameworkNo, Toast.LENGTH_SHORT).show()
}
}

View File

@ -224,6 +224,16 @@ object ShamrockConfig {
preferences.edit().putBoolean("debug", v).apply()
}
fun isAntiTrace(ctx: Context): Boolean {
val preferences = ctx.getSharedPreferences("config", 0)
return preferences.getBoolean("anti_qq_trace", true)
}
fun setAntiTrace(ctx: Context, v: Boolean) {
val preferences = ctx.getSharedPreferences("config", 0)
preferences.edit().putBoolean("anti_qq_trace", v).apply()
}
fun isInjectPacket(ctx: Context): Boolean {
val preferences = ctx.getSharedPreferences("config", 0)
return preferences.getBoolean("inject_packet", false)
@ -239,29 +249,49 @@ object ShamrockConfig {
return preferences.getBoolean("enable_auto_start", false)
}
fun enableAliveReply(ctx: Context): Boolean {
val preferences = ctx.getSharedPreferences("config", 0)
return preferences.getBoolean("alive_reply", false)
}
fun allowShell(ctx: Context): Boolean {
val preferences = ctx.getSharedPreferences("config", 0)
return preferences.getBoolean("shell", false)
}
fun setAutoStart(ctx: Context, v: Boolean) {
val preferences = ctx.getSharedPreferences("config", 0)
preferences.edit().putBoolean("enable_auto_start", v).apply()
}
fun setAliveReply(ctx: Context, v: Boolean) {
val preferences = ctx.getSharedPreferences("config", 0)
preferences.edit().putBoolean("alive_reply", v).apply()
}
fun setShellStatus(ctx: Context, v: Boolean) {
val preferences = ctx.getSharedPreferences("config", 0)
preferences.edit().putBoolean("shell", v).apply()
}
fun enableSelfMsg(ctx: Context): Boolean {
val preferences = ctx.getSharedPreferences("config", 0)
return preferences.getBoolean("enable_self_msg", false)
}
fun enableSyncMsgAsSentMsg(ctx: Context): Boolean {
val preferences = ctx.getSharedPreferences("config", 0)
return preferences.getBoolean("enable_sync_msg_as_sent_msg", false)
}
fun setEnableSelfMsg(ctx: Context, v: Boolean) {
val preferences = ctx.getSharedPreferences("config", 0)
preferences.edit().putBoolean("enable_self_msg", v).apply()
}
fun isEchoNumber(ctx: Context): Boolean {
fun setEnableSyncMsgAsSentMsg(ctx: Context, v: Boolean) {
val preferences = ctx.getSharedPreferences("config", 0)
return preferences.getBoolean("echo_number", false)
}
fun setEchoNumber(ctx: Context, v: Boolean) {
val preferences = ctx.getSharedPreferences("config", 0)
preferences.edit().putBoolean("echo_number", v).apply()
preferences.edit().putBoolean("enable_sync_msg_as_sent_msg", v).apply()
}
fun getConfigMap(ctx: Context): Map<String, Any?> {
@ -283,11 +313,15 @@ object ShamrockConfig {
"ssl_pwd" to preferences.getString("ssl_pwd", ""),
"inject_packet" to preferences.getBoolean("inject_packet", false),
"debug" to preferences.getBoolean("debug", false),
"auto_clear" to preferences.getBoolean("auto_clear", false),
"anti_qq_trace" to preferences.getBoolean("anti_qq_trace", true),
//"auto_clear" to preferences.getBoolean("auto_clear", false),
"ssl_private_pwd" to preferences.getString("ssl_private_pwd", ""),
"key_store" to preferences.getString("key_store", ""),
"enable_self_msg" to preferences.getBoolean("enable_self_msg", false),
"echo_number" to preferences.getBoolean("echo_number", false),
"shell" to preferences.getBoolean("shell", false),
"alive_reply" to preferences.getBoolean("alive_reply", false),
"enable_sync_msg_as_sent_msg" to preferences.getBoolean("enable_sync_msg_as_sent_msg", false),
)
}

View File

@ -50,6 +50,7 @@ import moe.fuqiuluo.shamrock.ui.app.AppRuntime
import moe.fuqiuluo.shamrock.ui.app.Level
import moe.fuqiuluo.shamrock.ui.app.ShamrockConfig
import moe.fuqiuluo.shamrock.ui.theme.GlobalColor
import moe.fuqiuluo.shamrock.ui.theme.LocalString
import moe.fuqiuluo.shamrock.ui.theme.ThemeColor
import moe.fuqiuluo.shamrock.ui.tools.InputDialog
@ -70,7 +71,7 @@ fun DashboardFragment(
AccountCard(nick, uin)
InformationCard(ctx)
APIInfoCard(ctx)
FunctionCard(scope, ctx, "功能设置")
FunctionCard(scope, ctx, LocalString.functionSetting)
SSLCard(ctx)
}
}
@ -80,7 +81,7 @@ private fun SSLCard(ctx: Context) {
ActionBox(
modifier = Modifier.padding(top = 12.dp),
painter = painterResource(id = R.drawable.baseline_security_24),
title = "SSL配置"
title = LocalString.sslSetting
) {
Column {
Divider(
@ -257,10 +258,10 @@ private fun APIInfoCard(
hint = "请输入被动地址",
error = "输入的地址不合法",
checker = {
it.isNotBlank()
true
},
confirm = {
if (it.startsWith("ws://") || it.startsWith("wss://")) {
if (it.startsWith("ws://") || it.startsWith("wss://") || it.isBlank()) {
ShamrockConfig.setWsAddr(ctx, wsAddress.value)
AppRuntime.log("设置被动WebSocket地址为[${wsAddress.value}]。")
} else {
@ -277,9 +278,7 @@ private fun APIInfoCard(
text = authToken,
hint = "请填写鉴权token",
error = "输入的参数不合法",
checker = {
it.length in 0 .. 36
},
checker = { true },
confirm = {
ShamrockConfig.setToken(ctx, authToken.value)
AppRuntime.log("设置鉴权Token为[${authToken.value}]。")

View File

@ -1,6 +1,6 @@
package moe.fuqiuluo.shamrock.ui.fragment
import android.widget.Toast
import android.content.Context
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.absolutePadding
import androidx.compose.foundation.layout.fillMaxSize
@ -22,6 +22,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import moe.fuqiuluo.shamrock.R
import moe.fuqiuluo.shamrock.ui.app.AppRuntime
import moe.fuqiuluo.shamrock.ui.app.Level
import moe.fuqiuluo.shamrock.ui.app.ShamrockConfig
import moe.fuqiuluo.shamrock.ui.theme.GlobalColor
import moe.fuqiuluo.shamrock.ui.theme.LocalString
@ -46,10 +47,11 @@ fun LabFragment() {
}
NoticeTextDialog(
openDialog = showNoticeDialog,
title = "温馨提示",
text = "实验室功能会导致一些奇怪的问题,请谨慎使用!"
title = LocalString.warnTitle,
text = LocalString.labWarning
)
val LocalString = LocalString
ActionBox(
modifier = Modifier.padding(top = 12.dp),
painter = painterResource(id = R.drawable.baseline_preview_24),
@ -63,19 +65,19 @@ fun LabFragment() {
)
Function(
title = "中二病模式",
desc = "也许会导致奇怪的问题,大抵就是你看不懂罢了。",
title = LocalString.b2Mode,
desc = LocalString.b2ModeDesc,
descColor = it,
isSwitch = ShamrockConfig.is2B(ctx)
) {
ShamrockConfig.set2B(ctx, it)
scope.toast(ctx, "重启生效哦!")
scope.toast(ctx, LocalString.restartToast)
return@Function true
}
Function(
title = "显示调试日志",
desc = "会导致日志刷屏。",
title = LocalString.showDebugLog,
desc = LocalString.showDebugLogDesc,
descColor = it,
isSwitch = ShamrockConfig.isDebug(ctx)
) {
@ -90,7 +92,92 @@ fun LabFragment() {
modifier = Modifier.padding(top = 12.dp),
painter = painterResource(id = R.drawable.round_logo_dev_24),
title = "实验功能"
) {
) { color ->
Column {
Divider(
modifier = Modifier,
color = GlobalColor.Divider,
thickness = 0.2.dp
)
/*
Function(
title = "自动清理QQ垃圾",
desc = "也许会导致奇怪的问题(无效)。",
descColor = color,
isSwitch = ShamrockConfig.isAutoClean(ctx)
) {
ShamrockConfig.setAutoClean(ctx, it)
ShamrockConfig.pushUpdate(ctx)
return@Function false
}*/
Function(
title = "自回复测试",
desc = "发送[ping],机器人发送一个具有调试信息的返回。",
descColor = color,
isSwitch = ShamrockConfig.enableAliveReply(ctx)
) {
ShamrockConfig.setAliveReply(ctx, it)
return@Function true
}
Function(
title = "开启Shell接口",
desc = "可能导致设备被入侵,请勿随意开启。",
descColor = color,
isSwitch = ShamrockConfig.allowShell(ctx)
) {
ShamrockConfig.setShellStatus(ctx, it)
return@Function true
}
Function(
title = "自动唤醒QQ",
desc = "QQ进程死亡时重新打开QQ进程前提本进程存活。",
descColor = color,
isSwitch = ShamrockConfig.enableAutoStart(ctx)
) {
ShamrockConfig.setAutoStart(ctx, it)
return@Function true
}
kotlin.runCatching {
ctx.getSharedPreferences("shared_config", Context.MODE_WORLD_READABLE)
}.onSuccess {
Function(
title = LocalString.persistentText,
desc = LocalString.persistentTextDesc,
descColor = color,
isSwitch = it.getBoolean("persistent", false)
) { v ->
it.edit().putBoolean("persistent", v).apply()
scope.toast(ctx, LocalString.restartSysToast)
return@Function true
}
Function(
title = "禁用Doze模式",
desc = "禁止系统进入节能模式。",
descColor = color,
isSwitch = it.getBoolean("hook_doze", false)
) { value ->
it.edit().putBoolean("hook_doze", value).apply()
scope.toast(ctx, LocalString.restartSysToast)
return@Function true
}
}.onFailure {
AppRuntime.log("无法启用附加选项LSPosed模块未激活或者不支持XSharedPreferences", Level.WARN)
}
}
}
ActionBox(
modifier = Modifier.padding(top = 12.dp),
painter = painterResource(id = R.drawable.sharp_lock_24),
title = "安全性设置"
) { color ->
Column {
Divider(
modifier = Modifier,
@ -99,20 +186,9 @@ fun LabFragment() {
)
Function(
title = "自动清理QQ垃圾",
desc = "也许会导致奇怪的问题。",
descColor = it,
isSwitch = ShamrockConfig.isAutoClean(ctx)
) {
ShamrockConfig.setAutoClean(ctx, it)
ShamrockConfig.pushUpdate(ctx)
return@Function false
}
Function(
title = "拦截QQ无用发包",
desc = "测试阶段,可能导致网络异常。",
descColor = it,
title = LocalString.injectPacket,
desc = LocalString.injectPacketDesc,
descColor = color,
isSwitch = ShamrockConfig.isInjectPacket(ctx)
) {
ShamrockConfig.setInjectPacket(ctx, it)
@ -121,16 +197,31 @@ fun LabFragment() {
}
Function(
title = "自动唤醒QQ",
desc = "QQ进程死亡时重新打开QQ进程前提本进程存活。",
descColor = it,
isSwitch = ShamrockConfig.enableAutoStart(ctx)
title = LocalString.antiTrace,
desc = LocalString.antiTraceDesc,
descColor = color,
isSwitch = ShamrockConfig.isAntiTrace(ctx)
) {
ShamrockConfig.setAutoStart(ctx, it)
ShamrockConfig.setAntiTrace(ctx, it)
ShamrockConfig.pushUpdate(ctx)
return@Function true
}
}
kotlin.runCatching {
ctx.getSharedPreferences("shared_config", Context.MODE_WORLD_READABLE)
}.onSuccess {
Function(
title = "反检测加强",
desc = "可能导致某些设备频繁闪退",
descColor = color,
isSwitch = it.getBoolean("super_anti", false)
) { v ->
it.edit().putBoolean("super_anti", v).apply()
scope.toast(ctx, LocalString.restartToast)
return@Function true
}
}
}
}
ActionBox(
@ -151,7 +242,11 @@ fun LabFragment() {
descColor = it,
isSwitch = AppRuntime.state.supportVoice.value
) {
if(AppRuntime.state.supportVoice.value) {
scope.toast(ctx, "关闭请手动删除文件。")
} else {
scope.toast(ctx, "请按照Github提示手动操作。")
}
return@Function false
}
}
@ -180,6 +275,18 @@ fun LabFragment() {
return@Function true
}
Function(
title = "同步消息推送类型异换",
desc = "推送来自同号异设备消息,将同步消息作为自发消息推送。",
descColor = it,
isSwitch = ShamrockConfig.enableSyncMsgAsSentMsg(ctx)
) {
ShamrockConfig.setEnableSyncMsgAsSentMsg(ctx, it)
ShamrockConfig.pushUpdate(ctx)
return@Function true
}
/*
Function(
title = "使用纯数字ECHO",
desc = "在部分强类型语言框架,需要打开此开关。",
@ -189,7 +296,7 @@ fun LabFragment() {
ShamrockConfig.setEchoNumber(ctx, it)
ShamrockConfig.pushUpdate(ctx)
return@Function true
}
}*/
}
}
}

View File

@ -8,6 +8,7 @@ import android.os.Bundle
import androidx.core.content.ContextCompat.startActivity
import io.ktor.client.request.get
import io.ktor.client.request.header
import io.ktor.client.request.parameter
import io.ktor.client.request.url
import io.ktor.client.statement.bodyAsText
import io.ktor.http.HttpStatusCode
@ -58,7 +59,7 @@ object DashboardInitializer {
url("http://127.0.0.1:$servicePort/get_account_info")
val token = ShamrockConfig.getToken(context)
if (token.isNotBlank()) {
header("Authorization", "Bearer $token")
parameter("token", token)
}
}.let {
if (it.status == HttpStatusCode.OK) {

View File

@ -69,6 +69,24 @@ private open class Chūnibyō: Default() {
"执明起,至除免于灾祸。\n" +
"元冥浩浩,非凡不可动之。"
labWarning = "寒酥降矣,梅熟日久,莫不可测。"
logTitle = "无极"
testName = "未名之人"
logCentralLoadSuccessfully = "无极开,天地始纷争。"
logCentralLoadFailed = "无极闭,天地始归宁。"
functionSetting = "天地法则"
sslSetting = "天行御令"
warnTitle = "仙人指路"
b2Mode = "通仙之路"
b2ModeDesc = "凡人勿近"
restartToast = "复关喏哉!"
showDebugLog = "窥探天机"
showDebugLogDesc = "迷失自我,走火入魔"
antiTrace = "鬼影迷踪"
antiTraceDesc = "唐门绝学,已有取死之道"
injectPacket = "遮匿无用之禀"
injectPacketDesc = "试于试之,逆则魂飞魄散"
persistentText = "丹书铁券"
persistentTextDesc = "由天地之起也,须复动之。"
}
}
@ -84,7 +102,25 @@ private open class Default: VarString(
"同时声明本项目仅用于学习与交流请于24小时内删除。\n" +
"同时开源贡献者均享受免责条例。",
labWarning = "实验室功能可能会导致出乎意料的BUG!",
"日志"
logTitle = "日志",
testName = "测试昵称",
logCentralLoadSuccessfully = "日志框架激活成功,开放操作许可。",
logCentralLoadFailed = "日志框架处于未激活状态,请检查。",
functionSetting = "功能设置",
sslSetting = "SSL配置",
warnTitle = "温馨提示",
b2Mode = "中二病模式",
b2ModeDesc = "也许会导致奇怪的问题,大抵就是你看不懂罢了。",
restartToast = "重启生效哦!",
restartSysToast = "重启系统生效哦!",
showDebugLog = "显示调试日志",
showDebugLogDesc = "会导致日志刷屏。",
antiTrace = "防止调用栈检测",
antiTraceDesc = "防止QQ进行堆栈跟踪检测需要重新启动QQ。",
injectPacket = "拦截QQ无用收包",
injectPacketDesc = "测试阶段,可能导致网络异常或掉线。",
persistentText = "免死金牌",
persistentTextDesc = "由系统复活QQ和Shamrock需要重新启动系统。"
)
open class VarString(
@ -99,5 +135,33 @@ open class VarString(
var labWarning: String,
var logTitle: String
var logTitle: String,
var testName: String,
var logCentralLoadSuccessfully: String,
var logCentralLoadFailed: String,
var functionSetting: String,
var sslSetting: String,
var warnTitle: String,
var b2Mode: String,
var b2ModeDesc: String,
var restartToast: String,
var restartSysToast: String,
var showDebugLog: String,
var showDebugLogDesc: String,
var antiTrace: String,
var antiTraceDesc: String,
var injectPacket: String,
var injectPacketDesc: String,
var persistentText: String,
var persistentTextDesc: String
)

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#9D9D9D"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20,8h-3L17,6.21c0,-2.61 -1.91,-4.94 -4.51,-5.19C9.51,0.74 7,3.08 7,6v2L4,8v14h16L20,8zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM9,8L9,6c0,-1.66 1.34,-3 3,-3s3,1.34 3,3v2L9,8z"/>
</vector>

View File

@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id("com.android.application") version "8.1.2" apply false
id("com.android.application") version "8.2.0" apply false
id("org.jetbrains.kotlin.android") version "1.8.10" apply false
id("com.android.library") version "8.1.2" apply false
id("com.android.library") version "8.2.0" apply false
//id("io.realm.kotlin") version "1.11.0" apply false
}

Binary file not shown.

View File

@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
zipStorePath=wrapper/dists

3
gradlew vendored
View File

@ -83,7 +83,8 @@ done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum

View File

@ -5,12 +5,11 @@ plugins {
android {
namespace = "moe.fuqiuluo.qqinterface"
compileSdk = 33
compileSdk = 34
defaultConfig {
minSdk = 24
minSdk = 27
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
}
@ -36,7 +35,4 @@ dependencies {
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.9.0")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}

View File

@ -33,7 +33,7 @@ public class MMKV implements SharedPreferences, SharedPreferences.Editor {
return null;
}
public SharedPreferences.Editor putBoolean(String str, boolean z) {
public SharedPreferences.Editor putBoolean(String s, boolean z) {
return this;
}

View File

@ -1,6 +1,50 @@
package com.tencent.mobileqq.pb;
import java.lang.reflect.Field;
import java.util.Arrays;
public class MessageMicro<T extends MessageMicro<T>> {
public static final class FieldMap {
private Object[] defaultValues;
private Field[] fields;
private int[] tags;
FieldMap(int[] iArr, String[] strArr, Object[] objArr, Class<?> cls) {
this.tags = iArr;
this.defaultValues = objArr;
this.fields = new Field[iArr.length];
for (int i2 = 0; i2 < iArr.length; i2++) {
try {
this.fields[i2] = cls.getField(strArr[i2]);
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
void clear(MessageMicro<?> messageMicro) {
}
<U extends MessageMicro<U>> void copyFields(U u, U u2) {
}
Field get(int i2) {
int binarySearch = Arrays.binarySearch(this.tags, i2);
if (binarySearch < 0) {
return null;
}
return this.fields[binarySearch];
}
int getSerializedSize(MessageMicro<?> messageMicro) {
return 0;
}
}
public static FieldMap initFieldMap(int[] iArr, String[] strArr, Object[] objArr, Class<?> cls) {
return new FieldMap(iArr, strArr, objArr, cls);
}
public final T mergeFrom(byte[] bArr) {
return null;
}

View File

@ -21,6 +21,10 @@ public abstract class PBField<T> {
return new PBBytesField(byteStringMicro, false);
}
public static PBFloatField initFloat(float paramFloat) {
return new PBFloatField(paramFloat, false);
}
public static PBBoolField initBool(boolean z) {
return new PBBoolField(z, false);
}

View File

@ -0,0 +1,13 @@
package com.tencent.mobileqq.pb;
public class PBFloatField extends PBPrimitiveField<Float> {
public PBFloatField(float i2, boolean z) {
}
public int get() {
return 0;
}
public void set(int i2) {
}
}

View File

@ -0,0 +1,186 @@
package com.tencent.mobileqq.relation.api;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import com.tencent.common.app.AppInterface;
import com.tencent.mobileqq.data.MessageRecord;
import com.tencent.mobileqq.data.PhoneContact;
import com.tencent.mobileqq.qroute.QRouteApi;
import java.util.ArrayList;
import java.util.HashMap;
import tencent.mobileim.structmsg.*;
public interface IAddFriendTempApi extends QRouteApi {
public static final int ENTER_FROM_CONTACT_TAB = 1;
public static final int ENTER_FROM_DEFAULT = 0;
public static final int ENTER_FROM_MESSAGE_TAB = 2;
public static final int ENTER_FROM_NEW_FRIEND = 3;
public static final int ENTER_FROM_NEW_FRIEND_MORE = 4;
// void addBatchQIMFriends(List<QIMNotifyAddFriend> paramList, AppInterface paramAppInterface);
void addFriendToFriendList(AppInterface paramAppInterface, String paramString1, int paramInt1, int paramInt2, String paramString2, boolean paramBoolean1, boolean paramBoolean2, long paramLong);
void addListener(Object paramObject, AppInterface paramAppInterface);
void cancelMayKnowRecommend(String paramString, AppInterface paramAppInterface);
// void changeStructMsgActions(structmsg.StructMsg paramStructMsg, int paramInt1, String paramString, int paramInt2);
// boolean changeStructMsgActionsWhenFail(structmsg.StructMsg paramStructMsg, int paramInt, String paramString1, String paramString2);
void checkReadContactPermission(Runnable paramRunnable, AppInterface paramAppInterface);
void checkUpdate(AppInterface paramAppInterface, String paramString);
void clearAllSystemMsg(AppInterface paramAppInterface);
void clickQIMSource(Context paramContext, MessageRecord paramMessageRecord, AppInterface paramAppInterface);
Intent composeReturnIntent(Class<?> paramClass, String paramString, Activity paramActivity);
void deleteAllSuspiciousMsg(AppInterface paramAppInterface);
// void deleteQIMNotifyAddFriendData(QIMNotifyAddFriend paramQIMNotifyAddFriend, AppInterface paramAppInterface);
boolean enableCheckPermission();
void followUser(String paramString, boolean paramBoolean);
Intent getAddRequestIntent(Context paramContext);
Intent getBindNumberIntent(Context paramContext);
Intent getChatActivityIntent(Context paramContext);
// ArrayList<MayKnowRecommend> getConnectionsPersonLocal(int paramInt, AppInterface paramAppInterface);
void getConnectionsPersonRemoteNextPage(int paramInt, AppInterface paramAppInterface);
// ArrayList<a> getConnectionsTabInfoListLocal(AppInterface paramAppInterface);
void getDiscussInfo(long paramLong, AppInterface paramAppInterface);
String getDiscussionNameCanNull(AppInterface paramAppInterface, String paramString);
int getForwardSelectionRequest();
Intent getFriendProfileMoreInfoIntent(Context paramContext);
int getMayKnowLoadConnectionBizTypeFirstLoad();
int getMayKnowPersonNum(AppInterface paramAppInterface);
boolean getMayKnowRecommendRemoteFromNewFrd(AppInterface paramAppInterface);
String getQIMNewFriendSource(AppInterface paramAppInterface);
// ArrayList<s> getQIMNotifyAddFriendsMsg(boolean paramBoolean, AppInterface paramAppInterface);
String getQQInfoFromQQUin(long paramLong1, long paramLong2, AppInterface paramAppInterface);
HashMap<String, String> getQidianExternal(HashMap<String, Object> paramHashMap);
// String getRecommendLabelString(List<MayKnowRecommend.MayKnowRecommendLabel> paramList);
int getRequestForSetting();
int getSizeSmall();
void getSuspiciousFriendsUnreadNum(AppInterface paramAppInterface);
int getTypeSetConnectionsSwitch();
Object getValue(String paramString1, String paramString2, int paramInt1, int paramInt2);
void gotoFriendSettingBrowser(Context paramContext);
boolean hasQidianExternal(HashMap<String, Object> paramHashMap);
boolean hasQimSource(AppInterface paramAppInterface);
void insertCommonHobbyIfNeeded(AppInterface paramAppInterface, String paramString);
boolean isMayKnowConnectionsUserClosed(AppInterface paramAppInterface);
boolean isNewFrdMiniCardSwitchOn(AppInterface paramAppInterface);
boolean isPhoneContactEnabled(AppInterface paramAppInterface);
boolean isQidianMaster(AppInterface paramAppInterface, String paramString);
boolean isStudyMode(AppInterface paramAppInterface);
boolean isSuspiciousSwitchOpen();
// void jumpToMoveGroup(Activity paramActivity, QBaseFragment paramQBaseFragment, String paramString, int paramInt1, int paramInt2);
void jumpToNewFriendMoreSysMsgSuspiciousFragment(Context paramContext);
void jumpToNewFriendMoreSysMsgSuspiciousFragment(Context paramContext, Intent paramIntent, int paramInt);
void jumpToQidianProfile(String paramString, Activity paramActivity);
void jumpToSplash(Activity paramActivity);
void launchPluginBroadcastWhenToggleSwitch(String paramString, AppInterface paramAppInterface, boolean paramBoolean);
void loadConnectionsTabData(AppInterface paramAppInterface, int paramInt1, int paramInt2);
void markQIMNotifyAddFriendsRead(AppInterface paramAppInterface);
// void openSecCheckWebForFragment(AppInterface paramAppInterface, Context paramContext, QBaseFragment paramQBaseFragment, int paramInt, String paramString1, String paramString2);
// void recordStartExpose(MayKnowRecommend paramMayKnowRecommend, int paramInt1, int paramInt2, int paramInt3, AppInterface paramAppInterface);
// void recordStopExpose(MayKnowRecommend paramMayKnowRecommend, int paramInt1, int paramInt2, int paramInt3, AppInterface paramAppInterface);
void removeListener(Object paramObject, AppInterface paramAppInterface);
void reportExtendFriend(int paramInt, String paramString, Intent paramIntent);
void reportRecommend(AppInterface paramAppInterface, String paramString1, String paramString2, int paramInt1, int paramInt2, String paramString3, int paramInt3, byte[] paramArrayOfbyte, String paramString4, int paramInt4);
void reportRecommendExpose(AppInterface paramAppInterface, int paramInt1, ArrayList<String> paramArrayList1, ArrayList<String> paramArrayList2, ArrayList<Integer> paramArrayList, ArrayList<byte[]> paramArrayList3, int paramInt2);
void sendAddFriendNoticeForBaby(AppInterface paramAppInterface, Intent paramIntent);
// void sendDelSingleSystemMsg(structmsg.StructMsg paramStructMsg, String paramString, int paramInt, long paramLong, AppInterface paramAppInterface);
void sendFriendSystemMsgAction(int msg_type, long msg_seq, long req_uin, int sub_type, int src_id, int sub_src_id, int group_msg_type, structmsg$SystemMsgActionInfo action_info, int system_msg_action_type, structmsg$StructMsg paramStructMsg, boolean isUncommonlyUsedFrd, AppInterface paramAppInterface);
void sendFriendSystemMsgReadedReport(AppInterface paramAppInterface);
void sendGetNextFriendSystemMsg(AppInterface paramAppInterface);
void sendPokeMsg(AppInterface paramAppInterface, Context paramContext, String paramString);
void setConnectionsSwitch(boolean paramBoolean, AppInterface paramAppInterface);
boolean shouldShowMayKnowInNewFriend(AppInterface paramAppInterface);
// void startAddContactsPage(Context paramContext, int paramInt1, int paramInt2, LaunchMode paramLaunchMode, @Nullable Bundle paramBundle);
void startAddContactsPageForResult(Activity paramActivity, int paramInt1, int paramInt2, int paramInt3);
void startAddRequestPage(Context paramContext, Intent paramIntent);
void startAddRequestPageForResult(Activity paramActivity, Intent paramIntent, int paramInt);
void startAddRequestSuspiciousPage(Context paramContext, Intent paramIntent);
void startContactBindFromOther(AppInterface paramAppInterface, int paramInt1, int paramInt2, Intent paramIntent);
void startContactBindFromOther(AppInterface paramAppInterface, int paramInt, ArrayList<PhoneContact> paramArrayList);
void startRemarkAfterAgree(Activity paramActivity, int paramInt, String paramString, long paramLong, Bundle paramBundle);
void updateCustomNoteTxt(TextView paramTextView, int paramInt1, int paramInt2);
}

View File

@ -8,6 +8,11 @@ import java.util.concurrent.atomic.AtomicBoolean;
import mqq.app.AppRuntime;
public class BaseTransFileController implements ITransFileController {
@Override
public boolean containsProcessor(String name, long uin) {
return false;
}
@Override
public IHttpCommunicatorListener findProcessor(String str) {
return null;

View File

@ -0,0 +1,51 @@
package com.tencent.mobileqq.transfile;
public class HttpNetReq extends NetReq {
public static final int HTTP_GET = 0;
public static final int HTTP_POST = 1;
public IFlowDecoder decoder;
public DnsParseCallback mDnsParseCallback;
public boolean mHaveIpConnect;
public String mHostForHttpsVerify;
public int mHttpMethod;
public boolean mIsHostIP;
public boolean mIsHttps;
public boolean mIsPreStructPic;
public boolean mIsSync;
public boolean mNeedIpConnect;
public boolean mNeedNotReferer;
public boolean mNeedRedirectCallback;
public String mReqUrl;
public TimeoutParam mTimeoutParam;
public boolean mUseCmwapConnectionTypeFromDpc;
public String[] mWhiteListContentType;
public interface DecoderState {
public static final int STATE_END = 2;
public static final int STATE_INIT = 0;
public static final int STATE_RUNNING = 1;
}
public interface DnsParseCallback {
void end();
void start();
}
public interface IFlowDecoder {
byte[] decode(byte[] bArr);
boolean isFinish();
void reset();
}
public HttpNetReq() {
this.mHttpMethod = 0;
this.mNeedIpConnect = false;
this.mHaveIpConnect = false;
this.mNeedRedirectCallback = false;
this.mUseCmwapConnectionTypeFromDpc = false;
this.mNeedNotReferer = false;
}
}

View File

@ -0,0 +1,7 @@
package com.tencent.mobileqq.transfile;
public interface INetEngineListener {
void onResp(NetResp netResp);
void onUpdateProgeress(NetReq netReq, long j2, long j3);
}

View File

@ -0,0 +1,5 @@
package com.tencent.mobileqq.transfile;
public interface NetFailedListener {
void onFailed(NetResp netResp);
}

View File

@ -0,0 +1,89 @@
package com.tencent.mobileqq.transfile;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
public class NetReq {
public static final int PRIOTY_HIGH = 0;
public static final int PRIOTY_LOW = 2;
public static final int PRIOTY_NORMAL = 1;
public boolean bAcceptNegativeContentLength;
public int mBusiProtoType;
public INetEngineListener mCallback;
public boolean mCanPrintUrl;
public int mContinuErrorLimit;
public int mContinueConnReusedErrorLimit;
public long mDelayTime;
public long mEndDownOffset;
public long mExcuteTimeLimit;
public NetFailedListener mFailedListener;
public int mFileType;
public HostParseToIp mHostParseToIp;
public boolean mIsNetChgAsError;
public boolean mIsRenameInEngine;
public String mKey;
public String mMsgId;
public String mOutPath;
public OutputStream mOutStream;
public int mPrioty;
public Object mPrivate;
public HashMap<String, String> mReqProperties;
public NetResp mResp;
public byte[] mSendData;
public List<ServerAddr> mServerList;
public long mStartDownOffset;
public boolean mSupportBreakResume;
public String mTempPath;
public boolean mUseByteArrayPool;
public boolean mUseRaf;
private Object mUserData;
public long taskStartTime;
public interface HostParseToIp {
List<ServerAddr> getIpByHost(String str);
}
public NetReq() {
this.mStartDownOffset = 0L;
this.mEndDownOffset = 0L;
this.mIsRenameInEngine = true;
this.mDelayTime = 0L;
this.mExcuteTimeLimit = 480000L;
this.mContinuErrorLimit = 8;
this.mContinueConnReusedErrorLimit = 5;
this.mIsNetChgAsError = false;
this.mPrioty = 1;
this.mResp = null;
this.mCanPrintUrl = true;
this.bAcceptNegativeContentLength = true;
this.mUseByteArrayPool = false;
this.mKey = null;
this.taskStartTime = -1L;
this.mReqProperties = new HashMap<>();
}
public long getTaskCostTime() {
return System.currentTimeMillis() - taskStartTime;
}
public synchronized Object getUserData() {
return mUserData;
}
public boolean isWriteToFile() {
return this.mOutPath != null;
}
public boolean isWriteToStream() {
return this.mOutStream != null;
}
public boolean saveRecvDataInTransLayer() {
return this.mOutPath != null || this.mOutStream != null;
}
public synchronized void setUserData(Object obj) {
this.mUserData = obj;
}
}

View File

@ -0,0 +1,72 @@
package com.tencent.mobileqq.transfile;
import java.util.HashMap;
public class NetResp {
public static final String KEY_FIRST_USE_IP = "firstserverip";
public static final String KEY_RAW_REQ_HTTP_HEADER = "param_reqHeader";
public static final String KEY_RAW_RESP_HTTP_HEADER = "param_rspHeader";
public static final String KEY_REASON = "netresp_param_reason";
public static final String KEY_USE_SERVER_IP = "serverip";
public static final String KEY_USE_URL = "param_url";
public static final int RESULT_DOWNLOADING = 3;
public static final int RESULT_FAIL = 1;
public static final int RESULT_NOT_SET = 2;
public static final int RESULT_OK = 0;
public long inQueueCost;
public long mConsumeTime;
public int mErrCode;
public String mErrDesc;
public int mHttpCode;
public long mLastReqStartTime;
public int mRedirectCount;
public long mRedirectTime;
public NetReq mReq;
public byte[] mRespData;
public HashMap<String, String> mRespProperties;
public int mResult;
public long mTotalBlockLen;
public long mTotalFileLen;
public int mTryTime;
public long mWrittenBlockLen;
public long reqCost;
public NetResp(NetReq netReq) {
this.mResult = 2;
this.mTotalFileLen = 0L;
this.mTotalBlockLen = 0L;
this.mWrittenBlockLen = 0L;
this.mConsumeTime = 0L;
this.mTryTime = 0;
this.mRespProperties = new HashMap<>();
this.mRedirectCount = 0;
this.mRedirectTime = 0L;
this.reqCost = 0L;
this.inQueueCost = 0L;
this.mReq = netReq;
this.mLastReqStartTime = System.currentTimeMillis();
}
public void reset() {
this.mResult = 2;
this.mErrCode = 0;
this.mErrDesc = "";
this.mHttpCode = 0;
this.mTotalFileLen = 0L;
this.mTotalBlockLen = 0L;
this.mWrittenBlockLen = 0L;
this.mConsumeTime = 0L;
this.mTryTime = 0;
this.mRespData = null;
this.mRespProperties.clear();
}
public void setResult(int i2, int i3, String str, HashMap<String, String> hashMap) {
this.mResult = i2;
this.mErrCode = i3;
this.mErrDesc = str;
if (hashMap != null) {
this.mRespProperties.putAll(hashMap);
}
}
}

View File

@ -0,0 +1,72 @@
package com.tencent.mobileqq.transfile;
public class TimeoutParam {
public static final int TIMEOUT_STEP = 2000;
private int connectTimeoutBias;
public int connectTimeoutFor2G;
public int connectTimeoutFor3G;
public int connectTimeoutForWifi;
public int readTimeoutFor2G;
public int readTimeoutFor3G;
public int readTimeoutForWifi;
public TimeoutParam() {
this.readTimeoutFor2G = 40000;
this.readTimeoutFor3G = 30000;
this.readTimeoutForWifi = 20000;
this.connectTimeoutFor2G = 20000;
this.connectTimeoutFor3G = 15000;
this.connectTimeoutForWifi = 10000;
this.connectTimeoutBias = 0;
}
public void adjustConnectTimeout(int i2) {
this.connectTimeoutBias = i2 * 2000;
}
public int getConnectTimeout(int i2) {
if (i2 != 1) {
if (i2 == 3) {
return this.connectTimeoutFor3G + this.connectTimeoutBias;
}
if (i2 != 4 && i2 != 5) {
return this.connectTimeoutFor2G + this.connectTimeoutBias;
}
}
return this.connectTimeoutForWifi + this.connectTimeoutBias;
}
public int getReadTimeout(int i2) {
if (i2 != 1) {
if (i2 == 3) {
return this.readTimeoutFor3G;
}
if (i2 != 4 && i2 != 5) {
return this.readTimeoutFor2G;
}
}
return this.readTimeoutForWifi;
}
//public TimeoutParam clone() {
// IPatchRedirector iPatchRedirector = $redirector_;
// return (iPatchRedirector == null || !iPatchRedirector.hasPatch((short) 4)) ? new TimeoutParam(this) : (TimeoutParam) iPatchRedirector.redirect((short) 4, (Object) this);
//}
TimeoutParam(TimeoutParam timeoutParam) {
this.readTimeoutFor2G = 40000;
this.readTimeoutFor3G = 30000;
this.readTimeoutForWifi = 20000;
this.connectTimeoutFor2G = 20000;
this.connectTimeoutFor3G = 15000;
this.connectTimeoutForWifi = 10000;
this.connectTimeoutBias = 0;
this.readTimeoutFor2G = timeoutParam.readTimeoutFor2G;
this.readTimeoutFor3G = timeoutParam.readTimeoutFor3G;
this.readTimeoutForWifi = timeoutParam.readTimeoutForWifi;
this.connectTimeoutFor2G = timeoutParam.connectTimeoutFor2G;
this.connectTimeoutFor3G = timeoutParam.connectTimeoutFor3G;
this.connectTimeoutForWifi = timeoutParam.connectTimeoutForWifi;
}
}

View File

@ -0,0 +1,15 @@
package com.tencent.mobileqq.transfile.api;
import com.tencent.mobileqq.transfile.NetReq;
import com.tencent.mobileqq.transfile.NetResp;
import mqq.app.api.IRuntimeService;
@Deprecated
public interface IHttpEngineService extends IRuntimeService {
void cancelReq(NetReq netReq);
void sendReq(NetReq netReq);
NetResp sendReqSync(NetReq netReq);
}

View File

@ -0,0 +1,14 @@
package com.tencent.mobileqq.transfile.api;
import com.tencent.mobileqq.qroute.QRouteApi;
import com.tencent.mobileqq.transfile.NetReq;
public interface IOldHttpEngineProcessor extends QRouteApi {
//void cancelMsg(HttpMsg httpMsg);
void cancelReq(NetReq netReq);
//int sendMsg(HttpMsg httpMsg);
void sendReq(NetReq netReq);
}

View File

@ -14,7 +14,7 @@ public interface ITransFileController extends IRuntimeService {
//@Deprecated
//void addProcessor(String str, IHttpCommunicatorListener iHttpCommunicatorListener);
//boolean containsProcessor(String str, long j2);
boolean containsProcessor(String name, long uin);
IHttpCommunicatorListener findProcessor(String str);

View File

@ -0,0 +1,28 @@
package com.tencent.mobileqq.troop.api;
import mqq.app.api.IRuntimeService;
import com.tencent.mobileqq.data.troop.TroopMemberInfo;
public interface ITroopMemberNameService extends IRuntimeService {
String getTroopMemberColorNick(String str, String str2);
String getTroopMemberName(TroopMemberInfo troopMemberInfo);
String getTroopMemberName(String str, String str2);
String getTroopMemberName(String str, String str2, String str3, String str4);
String getTroopMemberName(String str, String str2, boolean z, boolean z2);
//void getTroopMemberNameAsync(String str, String str2, a aVar);
String getTroopMemberNameInUI(String str, String str2);
String getTroopMemberNameRemarkFirst(String str, String str2);
String getTroopMemberNameWithoutRemark(String str, String str2);
String getTroopMemberNick(String str, String str2);
String getTroopMemberNickByTroopCode(String str, String str2);
}

View File

@ -1,7 +1,9 @@
package com.tencent.qqnt.kernel.api.impl;
import com.tencent.qqnt.kernel.nativeinterface.IKernelMsgListener;
import com.tencent.qqnt.kernel.nativeinterface.IOperateCallback;
import com.tencent.qqnt.kernel.nativeinterface.RichMediaFilePathInfo;
import com.tencent.qqnt.kernel.nativeinterface.TempChatPrepareInfo;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ -18,4 +20,8 @@ public class MsgService {
public String getRichMediaFilePathForMobileQQSend(@NotNull RichMediaFilePathInfo richMediaFilePathInfo) {
return null;
}
public void prepareTempChat(TempChatPrepareInfo tempChatPrepareInfo, IOperateCallback cb) {
}
}

View File

@ -44,8 +44,6 @@ public final class Contact implements IKernelModel, Serializable {
public Contact(int i2, String str, String str2) {
this.serialVersionUID = 1L;
this.peerUid = "";
this.guildId = "";
this.chatType = i2;
this.peerUid = str;
this.guildId = str2;

View File

@ -1,7 +1,5 @@
package com.tencent.qqnt.kernel.nativeinterface;
/* compiled from: P */
/* loaded from: classes2.dex */
public final class GroupFileCommonResult {
String clientWording;
int retCode;
@ -29,8 +27,6 @@ public final class GroupFileCommonResult {
}
public GroupFileCommonResult(int i2, String str, String str2) {
this.retMsg = "";
this.clientWording = "";
this.retCode = i2;
this.retMsg = str;
this.clientWording = str2;

View File

@ -0,0 +1,4 @@
package com.tencent.qqnt.kernel.nativeinterface;
public class GuildInteractiveNotificationItem {
}

View File

@ -0,0 +1,4 @@
package com.tencent.qqnt.kernel.nativeinterface;
public class GuildNotificationAbstractInfo {
}

View File

@ -0,0 +1,5 @@
package com.tencent.qqnt.kernel.nativeinterface;
public interface IClearMsgRecordsCallback {
void onResult(int code, String reason, long lastMsgId);
}

View File

@ -1,5 +1,5 @@
package com.tencent.qqnt.kernel.nativeinterface;
public interface IDeleteGroupFileCallback {
void onResult(int i2, String str, DeleteGroupFileResult deleteGroupFileResult);
void onResult(int code, String why, DeleteGroupFileResult result);
}

View File

@ -42,6 +42,10 @@ public interface IKernelMsgListener {
void onGroupTransferInfoUpdate(GroupFileListResult groupFileListResult);
void onGuildInteractiveUpdate(GuildInteractiveNotificationItem guildInteractiveNotificationItem);
void onGuildNotificationAbstractUpdate(GuildNotificationAbstractInfo guildNotificationAbstractInfo);
void onHitCsRelatedEmojiResult(DownloadRelateEmojiResultInfo downloadRelateEmojiResultInfo);
void onHitEmojiKeywordResult(HitRelatedEmojiWordsResult hitRelatedEmojiWordsResult);

View File

@ -1,5 +1,7 @@
package com.tencent.qqnt.kernel.nativeinterface;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.HashMap;
@ -16,7 +18,25 @@ public interface IKernelMsgService {
void addLocalRecordMsg(Contact contact, long msgId, MsgElement elem, HashMap<Integer, MsgAttributeInfo> hashMap, boolean z, IOperateCallback callback);
void getMultiMsg(Contact contact, long msgId, long uniseq, IGetMultiMsgCallback cb);
long getMsgUniqueId(long time);
void addSendMsg(long msgId, Contact contact, ArrayList<MsgElement> msgList, HashMap<Integer, MsgAttributeInfo> hashMap);
void getMsgs(@NotNull Contact contact, long startMsgId, int cnt, boolean queryOrder, @NotNull IMsgOperateCallback iMsgOperateCallback);
void getMsgsIncludeSelf(Contact contact, long startMsgId, int count, boolean queryOrder, IMsgOperateCallback iMsgOperateCallback);
void translatePtt2Text(long j2, Contact contact, MsgElement msgElement, IOperateCallback iOperateCallback);
void getMultiMsg(Contact contact, long rootMsgId, long parentMsgId, IGetMultiMsgCallback cb);
void multiForwardMsg(ArrayList<MultiMsgInfo> arrayList, Contact from, Contact to, IOperateCallback cb);
void setAllC2CAndGroupMsgRead(IOperateCallback cb);
void clearMsgRecords(Contact contact, IClearMsgRecordsCallback cb);
String createUidFromTinyId(long j2, long j3);
void switchBackGround(BackGroundInfo backGroundInfo, IOperateCallback cb);

View File

@ -9,7 +9,7 @@ public interface IKernelRichMediaService {
void cancelTransferTask(Contact contact, ArrayList<Long> arrayList, ArrayList<Integer> arrayList2, IOperateTransferInfoCallback iOperateTransferInfoCallback);
void deleteGroupFile(long j2, String str, int i2, IDeleteGroupFileCallback iDeleteGroupFileCallback);
void deleteGroupFile(long groupCode, String fileUid, int bizId, IDeleteGroupFileCallback cb);
void deleteTransferInfo(Contact contact, ArrayList<Long> arrayList, IOperateTransferInfoCallback iOperateTransferInfoCallback);

View File

@ -18,7 +18,6 @@ public final class MarkdownElement {
}
public MarkdownElement(String str) {
this.content = "";
this.content = str;
}
}

View File

@ -1,7 +1,5 @@
package com.tencent.qqnt.kernel.nativeinterface;
/* compiled from: P */
/* loaded from: classes2.dex */
public final class MultiMsgInfo {
long msgId;
String senderShowName;
@ -21,8 +19,6 @@ public final class MultiMsgInfo {
return "MultiMsgInfo{msgId=" + this.msgId + ",senderShowName=" + this.senderShowName + ",}";
}
public MultiMsgInfo(long j2, String str) {
this.msgId = j2;
this.senderShowName = str;
public MultiMsgInfo(long msgId, String showName) {
}
}

View File

@ -1,7 +1,5 @@
package com.tencent.qqnt.kernel.nativeinterface;
/* compiled from: P */
/* loaded from: classes.dex */
public final class TempChatInfo {
int chatType;
String fromNick;

View File

@ -56,20 +56,14 @@ public final class TempChatPrepareInfo {
return "TempChatPrepareInfo{chatType=" + this.chatType + ",peerUid=" + this.peerUid + ",peerNickname=" + this.peerNickname + ",fromGroupCode=" + this.fromGroupCode + ",sig=" + this.sig + ",selfUid=" + this.selfUid + ",selfPhone=" + this.selfPhone + ",gameSession=" + this.gameSession + ",}";
}
public TempChatPrepareInfo(int i2, String str, String str2, String str3, byte[] bArr, String str4, String str5, TempChatGameSession tempChatGameSession) {
this.peerUid = "";
this.peerNickname = "";
this.fromGroupCode = "";
this.sig = new byte[0];
this.selfUid = "";
this.selfPhone = "";
this.chatType = i2;
this.peerUid = str;
this.peerNickname = str2;
this.fromGroupCode = str3;
this.sig = bArr;
this.selfUid = str4;
this.selfPhone = str5;
this.gameSession = tempChatGameSession;
public TempChatPrepareInfo(int chatType, String peerId, String nickName, String fromGroup, byte[] sig, String selfUid, String selfPhone, TempChatGameSession session) {
this.chatType = chatType;
this.peerUid = peerId;
this.peerNickname = nickName;
this.fromGroupCode = fromGroup;
this.sig = sig;
this.selfUid = selfUid;
this.selfPhone = selfPhone;
this.gameSession = session;
}
}

View File

@ -5,6 +5,7 @@ import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.tencent.qphone.base.remote.SimpleAccount;
import com.tencent.qphone.base.remote.ToServiceMsg;
import mqq.app.api.IRuntimeService;
@ -72,6 +73,10 @@ public abstract class AppRuntime {
public <T extends IRuntimeService> T getRuntimeServiceIPCSync(@NonNull Class<T> cls, String str) {
throw new UnsupportedOperationException();
}
public void switchAccount(SimpleAccount simpleAccount, String process) {
}
public String getAccount() {
return "";
}
@ -81,6 +86,10 @@ public abstract class AppRuntime {
return !"0".equals(getCurrentAccountUin()) ? getCurrentAccountUin() : "";
}
public String getCurrentUid() {
return "";
}
public long getLongAccountUin() {
return 0;
}

View File

@ -3,6 +3,7 @@ package mqq.manager;
import android.content.Context;
import oicq.wlogin_sdk.request.Ticket;
import oicq.wlogin_sdk.request.WtTicketPromise;
public interface TicketManager extends Manager {
String getA2(String uin);
@ -15,6 +16,8 @@ public interface TicketManager extends Manager {
String getPskey(String uin, String domain);
Ticket getPskey(String str, long j2, String[] strArr, WtTicketPromise wtTicketPromise);
String getPt4Token(String uin, String domain);
String getSkey(String uin); // 假的Skey

View File

@ -0,0 +1,11 @@
package oicq.wlogin_sdk.request;
import oicq.wlogin_sdk.tools.ErrMsg;
public interface WtTicketPromise {
void Done(Ticket ticket);
void Failed(ErrMsg errMsg);
void Timeout(ErrMsg errMsg);
}

View File

@ -0,0 +1,118 @@
package oicq.wlogin_sdk.tools;
import android.os.Parcel;
import android.os.Parcelable;
public class ErrMsg implements Cloneable, Parcelable {
public static final Parcelable.Creator<ErrMsg> CREATOR = new Parcelable.Creator<ErrMsg>() { // from class: oicq.wlogin_sdk.tools.ErrMsg.1
@Override // android.os.Parcelable.Creator
public ErrMsg createFromParcel(Parcel parcel) {
return new ErrMsg(parcel);
}
@Override // android.os.Parcelable.Creator
public ErrMsg[] newArray(int i2) {
return new ErrMsg[i2];
}
};
private String message;
private String otherinfo;
private String title;
private int type;
private int version;
public ErrMsg() {
this.version = 0;
this.type = 0;
//this.title = InternationMsg.a(InternationMsg.MSG_TYPE.MSG_0);
//this.message = InternationMsg.a(InternationMsg.MSG_TYPE.MSG_1);
this.otherinfo = "";
}
public ErrMsg(int i2, int i3, String str, String str2, String str3) {
this.version = i2;
this.type = i3;
this.title = str;
this.message = str2;
this.otherinfo = str3;
}
private ErrMsg(Parcel parcel) {
readFromParcel(parcel);
}
@Override // android.os.Parcelable
public int describeContents() {
return 0;
}
public String getMessage() {
return this.message;
}
public String getOtherinfo() {
return this.otherinfo;
}
public String getTitle() {
return this.title;
}
public int getType() {
return this.type;
}
public int getVersion() {
return this.version;
}
public void readFromParcel(Parcel parcel) {
this.version = parcel.readInt();
this.type = parcel.readInt();
this.title = parcel.readString();
this.message = parcel.readString();
this.otherinfo = parcel.readString();
}
public void setMessage(String str) {
this.message = str;
}
public void setOtherinfo(String str) {
this.otherinfo = str;
}
public void setTitle(String str) {
this.title = str;
}
public void setType(int i2) {
this.type = i2;
}
public void setVersion(int i2) {
this.version = i2;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("(");
int i2 = this.version;
sb.append(i2 < 0 ? Integer.valueOf(i2) : Integer.toString(i2));
sb.append(")(");
int i3 = this.type;
sb.append(i3 < 0 ? Integer.valueOf(i3) : Integer.toString(i3));
sb.append(")[");
String sb2 = sb.toString();
return sb2 + this.title + "]" + this.message + "[" + this.otherinfo + "]";
}
@Override // android.os.Parcelable
public void writeToParcel(Parcel parcel, int i2) {
parcel.writeInt(this.version);
parcel.writeInt(this.type);
parcel.writeString(this.title);
parcel.writeString(this.message);
parcel.writeString(this.otherinfo);
}
}

View File

@ -0,0 +1,326 @@
package tencent.im.group;
import com.tencent.mobileqq.pb.ByteStringMicro;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBBoolField;
import com.tencent.mobileqq.pb.PBBytesField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBRepeatField;
import com.tencent.mobileqq.pb.PBRepeatMessageField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public class group_member_info {
public static class CustomEntry extends MessageMicro<tencent.im.group.group_member_info.CustomEntry> {
static final FieldMap __fieldMap__;
public final PBBoolField bool_clicked;
public final PBBytesField str_name;
public final PBBytesField str_url;
public final PBBytesField str_value;
public final PBUInt64Field uint64_report_id;
static {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
Boolean bool = Boolean.FALSE;
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 34, 40 }, new String[] { "str_name", "str_value", "bool_clicked", "str_url", "uint64_report_id" }, new Object[] { byteStringMicro, byteStringMicro, bool, byteStringMicro, Long.valueOf(0L) }, tencent.im.group.group_member_info.CustomEntry.class);
}
public CustomEntry() {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
this.str_name = PBField.initBytes(byteStringMicro);
this.str_value = PBField.initBytes(byteStringMicro);
this.bool_clicked = PBField.initBool(false);
this.str_url = PBField.initBytes(byteStringMicro);
this.uint64_report_id = PBField.initUInt64(0L);
}
}
public static class ErrorInfo extends MessageMicro<tencent.im.group.group_member_info.ErrorInfo> {
static final FieldMap __fieldMap__;
public final PBUInt32Field error_code = PBField.initUInt32(0);
public final PBBytesField error_desc = PBField.initBytes(ByteStringMicro.EMPTY);
static {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 18 }, new String[] { "error_code", "error_desc" }, new Object[] { Integer.valueOf(0), byteStringMicro }, tencent.im.group.group_member_info.ErrorInfo.class);
}
}
public static class FlowersEntry extends MessageMicro<tencent.im.group.group_member_info.FlowersEntry> {
static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8 }, new String[] { "uint64_flower_count" }, new Object[] { Long.valueOf(0L) }, tencent.im.group.group_member_info.FlowersEntry.class);
public final PBUInt64Field uint64_flower_count = PBField.initUInt64(0L);
}
public static class GBarInfo extends MessageMicro<tencent.im.group.group_member_info.GBarInfo> {
static final FieldMap __fieldMap__;
public final PBBytesField bytes_gbar_name;
public final PBBytesField str_head_portrait;
public final PBUInt32Field uint32_gbar_id = PBField.initUInt32(0);
public final PBUInt32Field uint32_uin_lev = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 26, 34 }, new String[] { "uint32_gbar_id", "uint32_uin_lev", "str_head_portrait", "bytes_gbar_name" }, new Object[] { integer, integer, byteStringMicro, byteStringMicro }, tencent.im.group.group_member_info.GBarInfo.class);
}
public GBarInfo() {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
this.str_head_portrait = PBField.initBytes(byteStringMicro);
this.bytes_gbar_name = PBField.initBytes(byteStringMicro);
}
}
public static class MemberGameInfo extends MessageMicro<tencent.im.group.group_member_info.MemberGameInfo> {
static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26, 34, 42, 50, 58 }, new String[] { "str_game_name", "str_level_name", "str_level_icon", "str_game_font_color", "str_game_background_color", "str_game_url", "str_desc_info" }, new Object[] { "", "", "", "", "", "", "" }, tencent.im.group.group_member_info.MemberGameInfo.class);
public final PBRepeatField<String> str_desc_info = PBField.initRepeat(PBField.initString(""));
public final PBStringField str_game_background_color = PBField.initString("");
public final PBStringField str_game_font_color = PBField.initString("");
public final PBStringField str_game_name = PBField.initString("");
public final PBStringField str_game_url = PBField.initString("");
public final PBStringField str_level_icon = PBField.initString("");
public final PBStringField str_level_name = PBField.initString("");
}
public static class MemberInfo extends MessageMicro<tencent.im.group.group_member_info.MemberInfo> {
public static final int CONCERN_TYPE_CONCERN = 1;
public static final int CONCERN_TYPE_GENERAL = 0;
public static final int CONCERN_TYPE_HATE = 2;
static final FieldMap __fieldMap__;
public final PBBoolField bool_is_allow_mod_card;
public final PBBoolField bool_is_concerned;
public final PBBoolField bool_is_friend;
public final PBBoolField bool_is_super_qq;
public final PBBoolField bool_is_super_vip;
public final PBBoolField bool_is_vip;
public final PBBoolField bool_is_year_vip;
public final PBBoolField bool_location_shared;
public final PBBytesField bytes_group_honor;
public final PBBytesField bytes_job;
public final PBBytesField bytes_phone_num;
public final PBBytesField bytes_special_title;
public final PBUInt32Field medal_id;
public tencent.im.group.group_member_info.FlowersEntry msg_flower_entry;
public tencent.im.group.group_member_info.MemberGameInfo msg_game_info;
public group_member_info.TeamEntry msg_team_entry;
// public group_member_info.RspGroupCardGetStory qqstory_infocard;
public final PBRepeatMessageField<tencent.im.group.group_member_info.CustomEntry> rpt_msg_custom_enties;
public final PBRepeatMessageField<tencent.im.group.group_member_info.GBarInfo> rpt_msg_gbar_concerned;
public final PBBytesField str_card;
public final PBBytesField str_errmsg;
public final PBBytesField str_gbar_title;
public final PBBytesField str_gbar_url;
public final PBBytesField str_lev;
public final PBBytesField str_location;
public final PBBytesField str_nick;
public final PBBytesField str_remark;
public final PBUInt32Field uint32_age;
public final PBUInt32Field uint32_concern_type;
public final PBUInt32Field uint32_credit;
public final PBUInt32Field uint32_gbar_cnt;
public final PBUInt32Field uint32_group_honor_bit;
public final PBUInt32Field uint32_level;
public final PBUInt32Field uint32_result = PBField.initUInt32(0);
public final PBUInt32Field uint32_role;
public final PBUInt32Field uint32_sex;
public final PBUInt32Field uint32_special_title_expire_time;
public final PBUInt32Field uint32_vip_lev;
public final PBUInt64Field uint64_distance;
public final PBUInt64Field uint64_join;
public final PBUInt64Field uint64_last_speak;
public final PBUInt64Field uint64_uin = PBField.initUInt64(0L);
static {
Long long_ = Long.valueOf(0L);
Integer integer = Integer.valueOf(0);
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
Boolean bool = Boolean.FALSE;
__fieldMap__ = MessageMicro.initFieldMap(new int[] {
8, 16, 26, 32, 42, 48, 56, 66, 72, 82,
90, 96, 106, 112, 120, 130, 138, 146, 154, 160,
168, 176, 184, 192, 200, 208, 216, 224, 232, 240,
250, 256, 266, 274, 282, 290, 296, 306, 312, 322,
330, 336 }, new String[] {
"uint64_uin", "uint32_result", "str_errmsg", "bool_is_friend", "str_remark", "bool_is_concerned", "uint32_credit", "str_card", "uint32_sex", "str_location",
"str_nick", "uint32_age", "str_lev", "uint64_join", "uint64_last_speak", "rpt_msg_custom_enties", "rpt_msg_gbar_concerned", "str_gbar_title", "str_gbar_url", "uint32_gbar_cnt",
"bool_is_allow_mod_card", "bool_is_vip", "bool_is_year_vip", "bool_is_super_vip", "bool_is_super_qq", "uint32_vip_lev", "uint32_role", "bool_location_shared", "uint64_distance", "uint32_concern_type",
"bytes_special_title", "uint32_special_title_expire_time", "msg_flower_entry", "msg_team_entry", "bytes_phone_num", "bytes_job", "medal_id", "qqstory_infocard", "uint32_level", "msg_game_info",
"bytes_group_honor", "uint32_group_honor_bit" }, new Object[] {
long_, integer, byteStringMicro, bool, byteStringMicro, bool, integer, byteStringMicro, integer, byteStringMicro,
byteStringMicro, integer, byteStringMicro, long_, long_, null, null, byteStringMicro, byteStringMicro, integer,
bool, bool, bool, bool, bool, integer, integer, bool, long_, integer,
byteStringMicro, integer, null, null, byteStringMicro, byteStringMicro, integer, null, integer, null,
byteStringMicro, integer }, tencent.im.group.group_member_info.MemberInfo.class);
}
public MemberInfo() {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
this.str_errmsg = PBField.initBytes(byteStringMicro);
this.bool_is_friend = PBField.initBool(false);
this.str_remark = PBField.initBytes(byteStringMicro);
this.bool_is_concerned = PBField.initBool(false);
this.uint32_credit = PBField.initUInt32(0);
this.str_card = PBField.initBytes(byteStringMicro);
this.uint32_sex = PBField.initUInt32(0);
this.str_location = PBField.initBytes(byteStringMicro);
this.str_nick = PBField.initBytes(byteStringMicro);
this.uint32_age = PBField.initUInt32(0);
this.str_lev = PBField.initBytes(byteStringMicro);
this.uint64_join = PBField.initUInt64(0L);
this.uint64_last_speak = PBField.initUInt64(0L);
this.rpt_msg_custom_enties = PBField.initRepeatMessage(tencent.im.group.group_member_info.CustomEntry.class);
this.rpt_msg_gbar_concerned = PBField.initRepeatMessage(tencent.im.group.group_member_info.GBarInfo.class);
this.str_gbar_title = PBField.initBytes(byteStringMicro);
this.str_gbar_url = PBField.initBytes(byteStringMicro);
this.uint32_gbar_cnt = PBField.initUInt32(0);
this.bool_is_allow_mod_card = PBField.initBool(false);
this.bool_is_vip = PBField.initBool(false);
this.bool_is_year_vip = PBField.initBool(false);
this.bool_is_super_vip = PBField.initBool(false);
this.bool_is_super_qq = PBField.initBool(false);
this.uint32_vip_lev = PBField.initUInt32(0);
this.uint32_role = PBField.initUInt32(0);
this.bool_location_shared = PBField.initBool(false);
this.uint64_distance = PBField.initUInt64(0L);
this.uint32_concern_type = PBField.initUInt32(0);
this.bytes_special_title = PBField.initBytes(byteStringMicro);
this.uint32_special_title_expire_time = PBField.initUInt32(0);
this.msg_flower_entry = new tencent.im.group.group_member_info.FlowersEntry();
this.msg_team_entry = new group_member_info.TeamEntry();
this.bytes_phone_num = PBField.initBytes(byteStringMicro);
this.bytes_job = PBField.initBytes(byteStringMicro);
this.medal_id = PBField.initUInt32(0);
// this.qqstory_infocard = new group_member_info.RspGroupCardGetStory();
this.uint32_level = PBField.initUInt32(0);
this.msg_game_info = new tencent.im.group.group_member_info.MemberGameInfo();
this.bytes_group_honor = PBField.initBytes(byteStringMicro);
this.uint32_group_honor_bit = PBField.initUInt32(0);
}
}
public static class ReqBody extends MessageMicro<tencent.im.group.group_member_info.ReqBody> {
static final FieldMap __fieldMap__;
public final PBBoolField bool_new_client = PBField.initBool(false);
public final PBUInt32Field uint32_client_type = PBField.initUInt32(0);
public final PBUInt32Field uint32_rich_card_name_ver = PBField.initUInt32(0);
public final PBUInt64Field uint64_group_code = PBField.initUInt64(0L);
public final PBUInt64Field uint64_uin = PBField.initUInt64(0L);
static {
Long long_ = Long.valueOf(0L);
Integer integer = Integer.valueOf(0);
Boolean bool = Boolean.FALSE;
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 40 }, new String[] { "uint64_group_code", "uint64_uin", "bool_new_client", "uint32_client_type", "uint32_rich_card_name_ver" }, new Object[] { long_, long_, bool, integer, integer }, tencent.im.group.group_member_info.ReqBody.class);
}
}
public static class RspBody extends MessageMicro<RspBody> {
static final FieldMap __fieldMap__;
public final PBBoolField bool_self_location_shared = PBField.initBool(false);
public MemberInfo msg_meminfo = new MemberInfo();
public final PBUInt32Field uint32_group_type = PBField.initUInt32(0);
public final PBUInt32Field uint32_self_role = PBField.initUInt32(0);
public final PBUInt64Field uint64_group_code = PBField.initUInt64(0L);
static {
Integer integer = Integer.valueOf(0);
Boolean bool = Boolean.FALSE;
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 26, 32, 40 }, new String[] { "uint64_group_code", "uint32_self_role", "msg_meminfo", "bool_self_location_shared", "uint32_group_type" }, new Object[] { Long.valueOf(0L), integer, null, bool, integer }, tencent.im.group.group_member_info.RspBody.class);
}
}
public static class TeamEntry extends MessageMicro<TeamEntry> {
static final FieldMap __fieldMap__;
public final PBRepeatField<Long> rpt_uint64_depid;
public final PBRepeatField<Long> rpt_uint64_self_depid;
static {
Long long_ = Long.valueOf(0L);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16 }, new String[] { "rpt_uint64_depid", "rpt_uint64_self_depid" }, new Object[] { long_, long_ }, tencent.im.group.group_member_info.TeamEntry.class);
}
public TeamEntry() {
PBUInt64Field pBUInt64Field = (PBUInt64Field) PBUInt64Field.__repeatHelper__;
this.rpt_uint64_depid = PBField.initRepeat((PBField)pBUInt64Field);
this.rpt_uint64_self_depid = PBField.initRepeat((PBField)pBUInt64Field);
}
}
}

View File

@ -0,0 +1,84 @@
package tencent.im.oidb.cmd0x899;
import com.tencent.mobileqq.pb.ByteStringMicro;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBBytesField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBRepeatField;
import com.tencent.mobileqq.pb.PBRepeatMessageField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public class oidb_0x899 {
public static class ReqBody extends MessageMicro<ReqBody> {
//static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 32, 42, 48, 56, 64}, new String[]{
// "uint64_group_code",
// "uint64_start_uin",
// "uint32_identify_flag",
// "rpt_uint64_uin_list",
// "memberlist_opt",
// "uint32_member_num", "uint32_filter_method", "uint32_online_flag"}, new Object[]{0L, 0L, 0, 0L, null, 0, 0, 0}, ReqBody.class);
public final PBUInt64Field uint64_group_code = PBField.initUInt64(0);
public final PBUInt64Field uint64_start_uin = PBField.initUInt64(0);
public final PBUInt32Field uint32_identify_flag = PBField.initUInt32(0);
public final PBRepeatField<Long> rpt_uint64_uin_list = PBField.initRepeat(PBUInt64Field.__repeatHelper__);
public memberlist memberlist_opt = new memberlist();
public final PBUInt32Field uint32_member_num = PBField.initUInt32(0);
public final PBUInt32Field uint32_filter_method = PBField.initUInt32(0);
public final PBUInt32Field uint32_online_flag = PBField.initUInt32(0);
}
public static class RspBody extends MessageMicro<RspBody> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 34, 42}, new String[]{"uint64_group_code", "uint64_start_uin", "uint32_identify_flag", "rpt_memberlist", "str_errorinfo"}, new Object[]{0L, 0L, 0, null, ByteStringMicro.EMPTY}, RspBody.class);
public final PBUInt64Field uint64_group_code = PBField.initUInt64(0);
public final PBUInt64Field uint64_start_uin = PBField.initUInt64(0);
public final PBUInt32Field uint32_identify_flag = PBField.initUInt32(0);
public final PBRepeatMessageField<memberlist> rpt_memberlist = PBField.initRepeatMessage(memberlist.class);
public final PBBytesField str_errorinfo = PBField.initBytes(ByteStringMicro.EMPTY);
}
public static class memberlist extends MessageMicro<memberlist> {
static final MessageMicro.FieldMap __fieldMap__;
public final PBBytesField bytes_rich_info;
public final PBBytesField bytes_special_title;
public final PBBytesField bytes_uin_key;
public final PBUInt32Field uint32_active_day;
public final PBUInt32Field uint32_privilege;
public final PBUInt32Field uint32_special_title_expire_time;
public final PBUInt64Field uint64_member_uin = PBField.initUInt64(0);
public final PBUInt32Field uint32_uin_flag = PBField.initUInt32(0);
public final PBUInt32Field uint32_uin_flagex = PBField.initUInt32(0);
public final PBUInt32Field uint32_uin_mobile_flag = PBField.initUInt32(0);
public final PBUInt32Field uint32_uin_arch_flag = PBField.initUInt32(0);
public final PBUInt32Field uint32_join_time = PBField.initUInt32(0);
public final PBUInt32Field uint32_old_msg_seq = PBField.initUInt32(0);
public final PBUInt32Field uint32_new_msg_seq = PBField.initUInt32(0);
public final PBUInt32Field uint32_last_speak_time = PBField.initUInt32(0);
public final PBUInt32Field uint32_level = PBField.initUInt32(0);
public final PBUInt32Field uint32_point = PBField.initUInt32(0);
public final PBUInt32Field uint32_shutup_timestap = PBField.initUInt32(0);
public final PBUInt32Field uint32_flagex2 = PBField.initUInt32(0);
static {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
__fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 114, 120, 128, 138, 144, 154}, new String[]{
"uint64_member_uin", // 1
"uint32_uin_flag", "uint32_uin_flagex", "uint32_uin_mobile_flag", "uint32_uin_arch_flag", "uint32_join_time", "uint32_old_msg_seq", "uint32_new_msg_seq", "uint32_last_speak_time", "uint32_level", "uint32_point",
"uint32_shutup_timestap", //12
"uint32_flagex2", "bytes_special_title", "uint32_special_title_expire_time", "uint32_active_day", "bytes_uin_key", "uint32_privilege", "bytes_rich_info"}, new Object[]{0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, byteStringMicro, 0, 0, byteStringMicro, 0, byteStringMicro}, memberlist.class);
}
public memberlist() {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
this.bytes_special_title = PBField.initBytes(byteStringMicro);
this.uint32_special_title_expire_time = PBField.initUInt32(0);
this.uint32_active_day = PBField.initUInt32(0);
this.bytes_uin_key = PBField.initBytes(byteStringMicro);
this.uint32_privilege = PBField.initUInt32(0);
this.bytes_rich_info = PBField.initBytes(byteStringMicro);
}
}
}

View File

@ -0,0 +1,245 @@
package tencent.im.oidb.cmd0xeb7;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBFloatField;
import com.tencent.mobileqq.pb.PBInt32Field;
import com.tencent.mobileqq.pb.PBInt64Field;
import com.tencent.mobileqq.pb.PBRepeatField;
import com.tencent.mobileqq.pb.PBRepeatMessageField;
import com.tencent.mobileqq.pb.PBStringField;
public class oidb_0xeb7 {
public static class ReqBody extends MessageMicro<ReqBody> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18 }, new String[] { "signInStatusReq", "signInWriteReq" }, new Object[] { null, null }, ReqBody.class);
public StSignInStatusReq signInStatusReq = new StSignInStatusReq();
public StSignInWriteReq signInWriteReq = new StSignInWriteReq();
}
public static class RspBody extends MessageMicro<RspBody>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18 }, new String[] { "signInStatusRsp", "signInWriteRsp" }, new Object[] { null, null }, RspBody.class);
public StSignInStatusRsp signInStatusRsp = new StSignInStatusRsp();
public StSignInWriteRsp signInWriteRsp = new StSignInWriteRsp();
}
public static class StSignInWriteRsp
extends MessageMicro<StSignInWriteRsp>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26 }, new String[] { "ret", "doneInfo", "groupScore" }, new Object[] { null, null, null }, StSignInWriteRsp.class);
public SignInStatusDoneInfo doneInfo = new SignInStatusDoneInfo();
public SignInStatusGroupScore groupScore = new SignInStatusGroupScore();
public Ret ret = new Ret();
}
public static class StSignInStatusRsp
extends MessageMicro<StSignInStatusRsp>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26, 34, 42, 50, 58, 66 }, new String[] { "ret", "base", "yesterday", "notInfo", "doneInfo", "groupScore", "mantleUrl", "backgroundUrl" }, new Object[] { null, null, null, null, null, null, "", "" }, StSignInStatusRsp.class);
public final PBStringField backgroundUrl = PBField.initString("");
public SignInStatusBase base = new SignInStatusBase();
public SignInStatusDoneInfo doneInfo = new SignInStatusDoneInfo();
public SignInStatusGroupScore groupScore = new SignInStatusGroupScore();
public final PBStringField mantleUrl = PBField.initString("");
public SignInStatusNotInfo notInfo = new SignInStatusNotInfo();
public Ret ret = new Ret();
public SignInStatusYesterdayFirst yesterday = new SignInStatusYesterdayFirst();
}
public static class SignInStatusYesterdayFirst
extends MessageMicro<SignInStatusYesterdayFirst>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26 }, new String[] { "yesterdayFirstUid", "yesterdayWord", "yesterdayNick" }, new Object[] { "", "", "" }, SignInStatusYesterdayFirst.class);
public final PBStringField yesterdayFirstUid = PBField.initString("");
public final PBStringField yesterdayNick = PBField.initString("");
public final PBStringField yesterdayWord = PBField.initString("");
}
public static class SignInStatusNotInfo
extends MessageMicro<SignInStatusNotInfo>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26 }, new String[] { "buttonWord", "signDescWordLeft", "signDescWordRight" }, new Object[] { "", "", "" }, SignInStatusNotInfo.class);
public final PBStringField buttonWord = PBField.initString("");
public final PBStringField signDescWordLeft = PBField.initString("");
public final PBStringField signDescWordRight = PBField.initString("");
}
public static class SignInStatusGroupScore
extends MessageMicro<SignInStatusGroupScore>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18 }, new String[] { "groupScoreWord", "scoreUrl" }, new Object[] { "", "" }, SignInStatusGroupScore.class);
public final PBStringField groupScoreWord = PBField.initString("");
public final PBStringField scoreUrl = PBField.initString("");
}
public static class SignInStatusDoneInfo
extends MessageMicro<SignInStatusDoneInfo>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26, 34 }, new String[] { "leftTitleWrod", "rightDescWord", "belowPortraitWords", "recordUrl" }, new Object[] { "", "", "", "" }, SignInStatusDoneInfo.class);
public final PBRepeatField<String> belowPortraitWords = PBField.initRepeat(PBField.initString(""));
public final PBStringField leftTitleWrod = PBField.initString("");
public final PBStringField recordUrl = PBField.initString("");
public final PBStringField rightDescWord = PBField.initString("");
}
public static class StSignInRecordDaySigned extends MessageMicro<StSignInRecordDaySigned> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 13, 16, 26, 34 }, new String[] { "daySignedRatio", "dayTotalSignedUid", "daySignedPage", "daySignedUrl" }, new Object[] { Float.valueOf(0.0F), Integer.valueOf(0), null, "" }, StSignInRecordDaySigned.class);
public StDaySignedPage daySignedPage = new StDaySignedPage();
public final PBFloatField daySignedRatio = PBField.initFloat(0.0F);
public final PBStringField daySignedUrl = PBField.initString("");
public final PBInt32Field dayTotalSignedUid = PBField.initInt32(0);
}
public static class SignInStatusBase extends MessageMicro<SignInStatusBase> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16 }, new String[] { "status", "currentTimeStamp" }, new Object[] { Integer.valueOf(0), Long.valueOf(0L) }, SignInStatusBase.class);
public final PBInt64Field currentTimeStamp = PBField.initInt64(0L);
public final PBEnumField status = PBField.initEnum(0);
}
public static class StSignInRecordRsp extends MessageMicro<StSignInRecordRsp> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26, 34, 42, 50 }, new String[] { "ret", "base", "userRecord", "daySigned", "kingRecord", "level" }, new Object[] { null, null, null, null, null, null }, StSignInRecordRsp.class);
public SignInStatusBase base = new SignInStatusBase();
public StSignInRecordDaySigned daySigned = new StSignInRecordDaySigned();
public StSignInRecordKing kingRecord = new StSignInRecordKing();
public StViewGroupLevel level = new StViewGroupLevel();
public Ret ret = new Ret();
public StSignInRecordUser userRecord = new StSignInRecordUser();
}
public static class Ret extends MessageMicro<Ret> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 18 }, new String[] { "code", "msg" }, new Object[] { Integer.valueOf(0), "" }, Ret.class);
public final PBEnumField code = PBField.initEnum(0);
public final PBStringField msg = PBField.initString("");
}
public static class StSignInRecordUser extends MessageMicro<StSignInRecordUser> {
static final MessageMicro.FieldMap __fieldMap__;
public final PBInt64Field continueSignedDays = PBField.initInt64(0L);
public final PBInt64Field earliestSignedTimeStamp = PBField.initInt64(0L);
public final PBStringField groupName = PBField.initString("");
public final PBRepeatField<String> historySignedDays = PBField.initRepeat(PBField.initString(""));
public final PBInt32Field totalSignedDays = PBField.initInt32(0);
static {
Long long_ = Long.valueOf(0L);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 16, 24, 32, 42, 50 }, new String[] { "totalSignedDays", "earliestSignedTimeStamp", "continueSignedDays", "historySignedDays", "groupName" }, new Object[] { Integer.valueOf(0), long_, long_, "", "" }, StSignInRecordUser.class);
}
}
public static class StDaySignedInfo extends MessageMicro<StDaySignedInfo> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 32 }, new String[] { "uid", "uidGroupNick", "signedTimeStamp", "signInRank" }, new Object[] { "", "", Long.valueOf(0L), Integer.valueOf(0) }, StDaySignedInfo.class);
public final PBInt32Field signInRank = PBField.initInt32(0);
public final PBInt64Field signedTimeStamp = PBField.initInt64(0L);
public final PBStringField uid = PBField.initString("");
public final PBStringField uidGroupNick = PBField.initString("");
}
public static class StDaySignedPage extends MessageMicro<StDaySignedPage> {
static final MessageMicro.FieldMap __fieldMap__;
public final PBRepeatMessageField<StDaySignedInfo> infos = PBField.initRepeatMessage(StDaySignedInfo.class);
public final PBInt32Field offset = PBField.initInt32(0);
public final PBInt32Field total = PBField.initInt32(0);
static {
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 16, 24 }, new String[] { "infos", "offset", "total" }, new Object[] { null, integer, integer }, StDaySignedPage.class);
}
}
public static class StKingSignedInfo extends MessageMicro<StKingSignedInfo> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 32 }, new String[] { "uid", "groupNick", "signedTimeStamp", "signedCount" }, new Object[] { "", "", Long.valueOf(0L), Integer.valueOf(0) }, StKingSignedInfo.class);
public final PBStringField groupNick = PBField.initString("");
public final PBInt32Field signedCount = PBField.initInt32(0);
public final PBInt64Field signedTimeStamp = PBField.initInt64(0L);
public final PBStringField uid = PBField.initString("");
}
public static class StSignInStatusReq extends MessageMicro<StSignInStatusReq> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 34 }, new String[] { "uid", "groupId", "scene", "clientVersion" }, new Object[] { "", "", Integer.valueOf(0), "" }, StSignInStatusReq.class);
public final PBStringField clientVersion = PBField.initString("");
public final PBStringField groupId = PBField.initString("");
public final PBEnumField scene = PBField.initEnum(0);
public final PBStringField uid = PBField.initString("");
}
public static class StSignInWriteReq extends MessageMicro<StSignInWriteReq> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26 }, new String[] { "uid", "groupId", "clientVersion" }, new Object[] { "", "", "" }, StSignInWriteReq.class);
public final PBStringField clientVersion = PBField.initString("");
public final PBStringField groupId = PBField.initString("");
public final PBStringField uid = PBField.initString("");
}
public static class StViewGroupLevel extends MessageMicro<StViewGroupLevel> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18 }, new String[] { "title", "url" }, new Object[] { "", "" }, StViewGroupLevel.class);
public final PBStringField title = PBField.initString("");
public final PBStringField url = PBField.initString("");
}
public static class StSignInRecordKing extends MessageMicro<StSignInRecordKing> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26, 34 }, new String[] { "yesterdayFirst", "topSignedTotal", "topSignedContinue", "kingUrl" }, new Object[] { null, null, null, "" }, StSignInRecordKing.class);
public final PBStringField kingUrl = PBField.initString("");
public final PBRepeatMessageField<StKingSignedInfo> topSignedContinue = PBField.initRepeatMessage(StKingSignedInfo.class);
public final PBRepeatMessageField<StKingSignedInfo> topSignedTotal = PBField.initRepeatMessage(StKingSignedInfo.class);
public StKingSignedInfo yesterdayFirst = new StKingSignedInfo();
}
}

View File

@ -0,0 +1,21 @@
package tencent.im.troop.honor;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBRepeatField;
import com.tencent.mobileqq.pb.PBUInt32Field;
public class troop_honor {
public static class GroupUserCardHonor extends MessageMicro<GroupUserCardHonor> {
static final FieldMap __fieldMap__;
public final PBRepeatField<Integer> id = PBField.initRepeat((PBField) PBUInt32Field.__repeatHelper__);
public final PBUInt32Field level = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16 }, new String[] { "id", "level" }, new Object[] { integer, integer }, GroupUserCardHonor.class);
}
}
}

View File

@ -0,0 +1,19 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
public final class structmsg$AddFrdSNInfo extends MessageMicro<structmsg$AddFrdSNInfo> {
static final FieldMap __fieldMap__;
public final PBUInt32Field uint32_not_see_dynamic = PBField.initUInt32(0);
public final PBUInt32Field uint32_set_sn = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16 }, new String[] { "uint32_not_see_dynamic", "uint32_set_sn" }, new Object[] { integer, integer }, structmsg$AddFrdSNInfo.class);
}
}

View File

@ -0,0 +1,54 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
public final class structmsg$FlagInfo extends MessageMicro<structmsg$FlagInfo> {
static final FieldMap __fieldMap__;
public final PBUInt32Field FrdMsg_Discuss2ManyChat = PBField.initUInt32(0);
public final PBUInt32Field FrdMsg_GetBusiCard = PBField.initUInt32(0);
public final PBUInt32Field FrdMsg_NeedWaitingMsg = PBField.initUInt32(0);
public final PBUInt32Field FrdMsg_uint32_need_all_unread_msg = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_GetC2cInviteJoinGroup = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_GetDisbandedByAdmin = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_GetOfficialAccount = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_GetPayInGroup = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_HiddenGrp = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_Kick_Admin = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_NeedAutoAdminWording = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_NotAllowJoinGrp_InviteNotFrd = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_WordingDown = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_get_quit_pay_group_msg_flag = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_get_transfer_group_msg_flag = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_mask_invite_auto_join = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_support_invite_auto_join = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] {
8, 16, 24, 32, 40, 48, 56, 64, 72, 80,
88, 96, 104, 112, 120, 128, 136 }, new String[] {
"GrpMsg_Kick_Admin", "GrpMsg_HiddenGrp", "GrpMsg_WordingDown", "FrdMsg_GetBusiCard", "GrpMsg_GetOfficialAccount", "GrpMsg_GetPayInGroup", "FrdMsg_Discuss2ManyChat", "GrpMsg_NotAllowJoinGrp_InviteNotFrd", "FrdMsg_NeedWaitingMsg", "FrdMsg_uint32_need_all_unread_msg",
"GrpMsg_NeedAutoAdminWording", "GrpMsg_get_transfer_group_msg_flag", "GrpMsg_get_quit_pay_group_msg_flag", "GrpMsg_support_invite_auto_join", "GrpMsg_mask_invite_auto_join", "GrpMsg_GetDisbandedByAdmin", "GrpMsg_GetC2cInviteJoinGroup" }, new Object[] {
integer, integer, integer, integer, integer, integer, integer, integer, integer, integer,
integer, integer, integer, integer, integer, integer, integer }, structmsg$FlagInfo.class);
}
}

View File

@ -0,0 +1,13 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBStringField;
public final class structmsg$FriendInfo extends MessageMicro<structmsg$FriendInfo> {
static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18 }, new String[] { "msg_joint_friend", "msg_blacklist" }, new Object[] { "", "" }, structmsg$FriendInfo.class);
public final PBStringField msg_blacklist = PBField.initString("");
public final PBStringField msg_joint_friend = PBField.initString("");
}

View File

@ -0,0 +1,27 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
public final class structmsg$GroupInfo extends MessageMicro<structmsg$GroupInfo> {
static final FieldMap __fieldMap__;
public final PBUInt32Field display_action = PBField.initUInt32(0);
public final PBUInt32Field group_auth_type = PBField.initUInt32(0);
public final PBStringField msg_alert = PBField.initString("");
public final PBStringField msg_detail_alert = PBField.initString("");
public final PBStringField msg_other_admin_done = PBField.initString("");
public final PBUInt32Field uint32_app_privilege_flag = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 26, 34, 42, 48 }, new String[] { "group_auth_type", "display_action", "msg_alert", "msg_detail_alert", "msg_other_admin_done", "uint32_app_privilege_flag" }, new Object[] { integer, integer, "", "", "", integer }, structmsg$GroupInfo.class);
}
}

View File

@ -0,0 +1,21 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$MsgInviteExt extends MessageMicro<structmsg$MsgInviteExt> {
static final FieldMap __fieldMap__;
public final PBUInt32Field uint32_src_type = PBField.initUInt32(0);
public final PBUInt32Field uint32_wait_state = PBField.initUInt32(0);
public final PBUInt64Field uint64_src_code = PBField.initUInt64(0L);
static {
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24 }, new String[] { "uint32_src_type", "uint64_src_code", "uint32_wait_state" }, new Object[] { integer, Long.valueOf(0L), integer }, structmsg$MsgInviteExt.class);
}
}

View File

@ -0,0 +1,18 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$MsgPayGroupExt extends MessageMicro<structmsg$MsgPayGroupExt> {
static final FieldMap __fieldMap__;
public final PBUInt64Field uint64_join_grp_time = PBField.initUInt64(0L);
public final PBUInt64Field uint64_quit_grp_time = PBField.initUInt64(0L);
static {
Long long_ = Long.valueOf(0L);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16 }, new String[] { "uint64_join_grp_time", "uint64_quit_grp_time" }, new Object[] { long_, long_ }, structmsg$MsgPayGroupExt.class);
}
}

View File

@ -0,0 +1,37 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$ReqNextSystemMsg extends MessageMicro<structmsg$ReqNextSystemMsg> {
static final FieldMap __fieldMap__;
public final PBEnumField checktype = PBField.initEnum(1);
public structmsg$FlagInfo flag = new structmsg$FlagInfo();
public final PBUInt64Field following_friend_seq = PBField.initUInt64(0L);
public final PBUInt64Field following_group_seq = PBField.initUInt64(0L);
public final PBUInt64Field friend_msg_type_flag = PBField.initUInt64(0L);
public final PBUInt32Field language = PBField.initUInt32(0);
public final PBUInt32Field msg_num = PBField.initUInt32(0);
public final PBUInt32Field uint32_need_uid = PBField.initUInt32(0);
public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0);
public final PBUInt32Field version = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
Long long_ = Long.valueOf(0L);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 42, 48, 56, 64, 72, 128 }, new String[] { "msg_num", "following_friend_seq", "following_group_seq", "checktype", "flag", "language", "version", "friend_msg_type_flag", "uint32_req_msg_type", "uint32_need_uid" }, new Object[] { integer, long_, long_, Integer.valueOf(1), null, integer, integer, long_, integer, integer }, structmsg$ReqNextSystemMsg.class);
}
}

View File

@ -0,0 +1,35 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$ReqSystemMsgAction extends MessageMicro<structmsg$ReqSystemMsgAction> {
static final FieldMap __fieldMap__;
public structmsg$SystemMsgActionInfo action_info = new structmsg$SystemMsgActionInfo();
public final PBUInt32Field group_msg_type = PBField.initUInt32(0);
public final PBUInt32Field language = PBField.initUInt32(0);
public final PBUInt64Field msg_seq = PBField.initUInt64(0L);
public final PBEnumField msg_type = PBField.initEnum(1);
public final PBUInt64Field req_uin = PBField.initUInt64(0L);
public final PBUInt32Field src_id = PBField.initUInt32(0);
public final PBUInt32Field sub_src_id = PBField.initUInt32(0);
public final PBUInt32Field sub_type = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
Long long_ = Long.valueOf(0L);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 40, 48, 56, 66, 72 }, new String[] { "msg_type", "msg_seq", "req_uin", "sub_type", "src_id", "sub_src_id", "group_msg_type", "action_info", "language" }, new Object[] { Integer.valueOf(1), long_, long_, integer, integer, integer, integer, null, integer }, structmsg$ReqSystemMsgAction.class);
}
}

View File

@ -0,0 +1,49 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBBoolField;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$ReqSystemMsgNew extends MessageMicro<structmsg$ReqSystemMsgNew> {
static final FieldMap __fieldMap__;
public final PBEnumField checktype = PBField.initEnum(1);
public structmsg$FlagInfo flag = new structmsg$FlagInfo();
public final PBUInt64Field friend_msg_type_flag = PBField.initUInt64(0L);
public final PBBoolField is_get_frd_ribbon = PBField.initBool(true);
public final PBBoolField is_get_grp_ribbon = PBField.initBool(true);
public final PBUInt32Field language = PBField.initUInt32(0);
public final PBUInt64Field latest_friend_seq = PBField.initUInt64(0L);
public final PBUInt64Field latest_group_seq = PBField.initUInt64(0L);
public final PBUInt32Field msg_num = PBField.initUInt32(0);
public final PBUInt32Field uint32_need_uid = PBField.initUInt32(0);
public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0);
public final PBUInt32Field version = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
Long long_ = Long.valueOf(0L);
Boolean bool = Boolean.TRUE;
__fieldMap__ = MessageMicro.initFieldMap(new int[] {
8, 16, 24, 32, 40, 50, 56, 64, 72, 80,
88, 128 }, new String[] {
"msg_num", "latest_friend_seq", "latest_group_seq", "version", "checktype", "flag", "language", "is_get_frd_ribbon", "is_get_grp_ribbon", "friend_msg_type_flag",
"uint32_req_msg_type", "uint32_need_uid" }, new Object[] {
integer, long_, long_, integer, Integer.valueOf(1), null, integer, bool, bool, long_,
integer, integer }, structmsg$ReqSystemMsgNew.class);
}
}

View File

@ -0,0 +1,27 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$ReqSystemMsgRead extends MessageMicro<structmsg$ReqSystemMsgRead> {
static final FieldMap __fieldMap__;
public final PBEnumField checktype = PBField.initEnum(1);
public final PBUInt64Field latest_friend_seq = PBField.initUInt64(0L);
public final PBUInt64Field latest_group_seq = PBField.initUInt64(0L);
public final PBUInt32Field type = PBField.initUInt32(0);
public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0);
static {
Long long_ = Long.valueOf(0L);
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 40 }, new String[] { "latest_friend_seq", "latest_group_seq", "type", "checktype", "uint32_req_msg_type" }, new Object[] { long_, long_, integer, Integer.valueOf(1), integer }, structmsg$ReqSystemMsgRead.class);
}
}

View File

@ -0,0 +1,15 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBInt32Field;
import com.tencent.mobileqq.pb.PBStringField;
public final class structmsg$RspHead extends MessageMicro<structmsg$RspHead> {
static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 18 }, new String[] { "result", "msg_fail" }, new Object[] { Integer.valueOf(0), "" }, structmsg$RspHead.class);
public final PBStringField msg_fail = PBField.initString("");
public final PBInt32Field result = PBField.initInt32(0);
}

View File

@ -0,0 +1,37 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.ByteStringMicro;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBBytesField;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBRepeatMessageField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$RspNextSystemMsg extends MessageMicro<structmsg$RspNextSystemMsg> {
static final FieldMap __fieldMap__;
public final PBStringField bytes_game_nick = PBField.initString("");
public final PBBytesField bytes_undecid_for_qim = PBField.initBytes(ByteStringMicro.EMPTY);
public final PBEnumField checktype = PBField.initEnum(1);
public final PBUInt64Field following_friend_seq = PBField.initUInt64(0L);
public final PBUInt64Field following_group_seq = PBField.initUInt64(0L);
public structmsg$RspHead head = new structmsg$RspHead();
public final PBRepeatMessageField<structmsg$StructMsg> msgs = PBField.initRepeatMessage(structmsg$StructMsg.class);
public final PBUInt32Field uint32_un_read_count3 = PBField.initUInt32(0);
static {
Long long_ = Long.valueOf(0L);
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 32, 40, 802, 810, 816 }, new String[] { "head", "msgs", "following_friend_seq", "following_group_seq", "checktype", "bytes_game_nick", "bytes_undecid_for_qim", "uint32_un_read_count3" }, new Object[] { null, null, long_, long_, Integer.valueOf(1), "", byteStringMicro, Integer.valueOf(0) }, structmsg$RspNextSystemMsg.class);
}
}

View File

@ -0,0 +1,25 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
public final class structmsg$RspSystemMsgAction extends MessageMicro<structmsg$RspSystemMsgAction> {
static final FieldMap __fieldMap__;
public structmsg$RspHead head = new structmsg$RspHead();
public final PBStringField msg_detail = PBField.initString("");
public final PBStringField msg_invalid_decided = PBField.initString("");
public final PBUInt32Field remark_result = PBField.initUInt32(0);
public final PBUInt32Field type = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 42, 48 }, new String[] { "head", "msg_detail", "type", "msg_invalid_decided", "remark_result" }, new Object[] { null, "", integer, "", integer }, structmsg$RspSystemMsgAction.class);
}
}

View File

@ -0,0 +1,66 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.ByteStringMicro;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBBytesField;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBRepeatMessageField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$RspSystemMsgNew extends MessageMicro<structmsg$RspSystemMsgNew> {
static final FieldMap __fieldMap__;
public final PBStringField bytes_game_nick = PBField.initString("");
public final PBBytesField bytes_undecid_for_qim = PBField.initBytes(ByteStringMicro.EMPTY);
public final PBEnumField checktype = PBField.initEnum(1);
public final PBUInt64Field following_friend_seq = PBField.initUInt64(0L);
public final PBUInt64Field following_group_seq = PBField.initUInt64(0L);
public final PBRepeatMessageField<structmsg$StructMsg> friendmsgs = PBField.initRepeatMessage(structmsg$StructMsg.class);
public final PBRepeatMessageField<structmsg$StructMsg> groupmsgs = PBField.initRepeatMessage(structmsg$StructMsg.class);
public final PBStringField grp_msg_display = PBField.initString("");
public structmsg$RspHead head = new structmsg$RspHead();
public final PBUInt64Field latest_friend_seq = PBField.initUInt64(0L);
public final PBUInt64Field latest_group_seq = PBField.initUInt64(0L);
public final PBStringField msg_display = PBField.initString("");
public structmsg$StructMsg msg_ribbon_friend = new structmsg$StructMsg();
public structmsg$StructMsg msg_ribbon_group = new structmsg$StructMsg();
public final PBUInt32Field uint32_has_suspicious_flag = PBField.initUInt32(0);
public final PBUInt32Field uint32_over = PBField.initUInt32(0);
public final PBUInt32Field uint32_un_read_count3 = PBField.initUInt32(0);
public final PBUInt32Field unread_friend_count = PBField.initUInt32(0);
public final PBUInt32Field unread_group_count = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
Long long_ = Long.valueOf(0L);
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
__fieldMap__ = MessageMicro.initFieldMap(new int[] {
10, 16, 24, 32, 40, 48, 56, 74, 82, 90,
98, 106, 114, 120, 160, 802, 810, 816, 824 }, new String[] {
"head", "unread_friend_count", "unread_group_count", "latest_friend_seq", "latest_group_seq", "following_friend_seq", "following_group_seq", "friendmsgs", "groupmsgs", "msg_ribbon_friend",
"msg_ribbon_group", "msg_display", "grp_msg_display", "uint32_over", "checktype", "bytes_game_nick", "bytes_undecid_for_qim", "uint32_un_read_count3", "uint32_has_suspicious_flag" }, new Object[] {
null, integer, integer, long_, long_, long_, long_, null, null, null,
null, "", "", integer, Integer.valueOf(1), "", byteStringMicro, integer, integer }, structmsg$RspSystemMsgNew.class);
}
}

View File

@ -0,0 +1,17 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
public final class structmsg$RspSystemMsgRead extends MessageMicro<structmsg$RspSystemMsgRead> {
static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 16, 24 }, new String[] { "head", "type", "checktype" }, new Object[] { null, Integer.valueOf(0), Integer.valueOf(1) }, structmsg$RspSystemMsgRead.class);
public final PBEnumField checktype = PBField.initEnum(1);
public structmsg$RspHead head = new structmsg$RspHead();
public final PBUInt32Field type = PBField.initUInt32(0);
}

View File

@ -0,0 +1,31 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$StructMsg extends MessageMicro<structmsg$StructMsg> {
static final FieldMap __fieldMap__;
public structmsg$SystemMsg msg = new structmsg$SystemMsg();
public final PBUInt64Field msg_seq = PBField.initUInt64(0L);
public final PBUInt64Field msg_time = PBField.initUInt64(0L);
public final PBEnumField msg_type = PBField.initEnum(1);
public final PBUInt64Field req_uin = PBField.initUInt64(0L);
public final PBUInt32Field uint32_unread_flag = PBField.initUInt32(0);
public final PBUInt32Field version = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
Long long_ = Long.valueOf(0L);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 40, 48, 402 }, new String[] { "version", "msg_type", "msg_seq", "msg_time", "req_uin", "uint32_unread_flag", "msg" }, new Object[] { integer, Integer.valueOf(1), long_, long_, long_, integer, null }, structmsg$StructMsg.class);
}
}

View File

@ -0,0 +1,186 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.ByteStringMicro;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBBytesField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBInt32Field;
import com.tencent.mobileqq.pb.PBRepeatMessageField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$SystemMsg extends MessageMicro<structmsg$SystemMsg> {
static final FieldMap __fieldMap__;
public final PBUInt64Field action_uin = PBField.initUInt64(0L);
public final PBStringField action_uin_nick;
public final PBBytesField action_uin_qq_nick;
public final PBBytesField action_uin_remark;
public final PBRepeatMessageField<structmsg$SystemMsgAction> actions = PBField.initRepeatMessage(structmsg$SystemMsgAction.class);
public final PBUInt64Field actor_uin = PBField.initUInt64(0L);
public final PBStringField actor_uin_nick;
public final PBBytesField bytes_addtion;
public final PBBytesField bytes_game_msg;
public final PBBytesField bytes_game_nick;
public final PBBytesField bytes_name_more;
public final PBBytesField bytes_source_desc;
public final PBBytesField bytes_transparent_group_notify;
public final PBBytesField bytes_warning_tips;
public final PBUInt32Field card_switch;
public final PBUInt64Field clone_uin = PBField.initUInt64(0L);
public final PBStringField clone_uin_nick;
public final PBBytesField eim_group_id_name;
public structmsg$FriendInfo friend_info = new structmsg$FriendInfo();
public final PBUInt64Field group_code = PBField.initUInt64(0L);
public final PBUInt32Field group_ext_flag;
public structmsg$GroupInfo group_info = new structmsg$GroupInfo();
public final PBUInt32Field group_inviter_role = PBField.initUInt32(0);
public final PBUInt32Field group_msg_type = PBField.initUInt32(0);
public final PBStringField group_name;
public final PBStringField msg_actor_describe = PBField.initString("");
public final PBStringField msg_additional = PBField.initString("");
public final PBStringField msg_additional_list = PBField.initString("");
public final PBStringField msg_decided = PBField.initString("");
public final PBStringField msg_describe = PBField.initString("");
public final PBStringField msg_detail;
public structmsg$MsgInviteExt msg_invite_extinfo = new structmsg$MsgInviteExt();
public structmsg$MsgPayGroupExt msg_pay_group_extinfo = new structmsg$MsgPayGroupExt();
public final PBStringField msg_qna;
public final PBStringField msg_source = PBField.initString("");
public final PBStringField msg_title = PBField.initString("");
public final PBBytesField pic_url;
public final PBUInt32Field relation = PBField.initUInt32(0);
public final PBUInt32Field req_uin_age;
public final PBBytesField req_uin_business_card;
public final PBInt32Field req_uin_faceid;
public final PBUInt32Field req_uin_gender;
public final PBStringField req_uin_nick;
public final PBBytesField req_uin_pre_remark;
public final PBUInt32Field reqsubtype = PBField.initUInt32(0);
public final PBUInt32Field src_id = PBField.initUInt32(0);
public final PBUInt32Field sub_src_id = PBField.initUInt32(0);
public final PBUInt32Field sub_type = PBField.initUInt32(0);
public final PBStringField uid;
public final PBUInt32Field uint32_c2c_invite_join_group_flag;
public final PBUInt32Field uint32_doubt_flag;
public final PBUInt32Field uint32_group_flagext3;
public final PBUInt32Field uint32_source_flag = PBField.initUInt32(0);
public final PBUInt64Field uint64_discuss_uin = PBField.initUInt64(0L);
public final PBUInt64Field uint64_eim_group_id = PBField.initUInt64(0L);
public final PBUInt64Field uint64_group_owner_uin;
static {
Integer integer = Integer.valueOf(0);
Long long_ = Long.valueOf(0L);
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
__fieldMap__ = MessageMicro.initFieldMap(new int[] {
8, 18, 26, 34, 42, 50, 56, 64, 74, 80,
88, 96, 104, 114, 122, 128, 138, 146, 152, 160,
168, 176, 184, 194, 202, 208, 218, 226, 232, 240,
248, 258, 266, 274, 282, 400, 410, 418, 426, 434,
442, 456, 466, 474, 482, 490, 506, 514, 522, 530,
536, 544, 552, 808, 866, 882 }, new String[] {
"sub_type", "msg_title", "msg_describe", "msg_additional", "msg_source", "msg_decided", "src_id", "sub_src_id", "actions", "group_code",
"action_uin", "group_msg_type", "group_inviter_role", "friend_info", "group_info", "actor_uin", "msg_actor_describe", "msg_additional_list", "relation", "reqsubtype",
"clone_uin", "uint64_discuss_uin", "uint64_eim_group_id", "msg_invite_extinfo", "msg_pay_group_extinfo", "uint32_source_flag", "bytes_game_nick", "bytes_game_msg", "uint32_group_flagext3", "uint64_group_owner_uin",
"uint32_doubt_flag", "bytes_warning_tips", "bytes_name_more", "bytes_addtion", "bytes_transparent_group_notify", "req_uin_faceid", "req_uin_nick", "group_name", "action_uin_nick", "msg_qna",
"msg_detail", "group_ext_flag", "actor_uin_nick", "pic_url", "clone_uin_nick", "req_uin_business_card", "eim_group_id_name", "req_uin_pre_remark", "action_uin_qq_nick", "action_uin_remark",
"req_uin_gender", "req_uin_age", "uint32_c2c_invite_join_group_flag", "card_switch", "bytes_source_desc", "uid" }, new Object[] {
integer, "", "", "", "", "", integer, integer, null, long_,
long_, integer, integer, null, null, long_, "", "", integer, integer,
long_, long_, long_, null, null, integer, byteStringMicro, byteStringMicro, integer, long_,
integer, byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, integer, "", "", "", "",
"", integer, "", byteStringMicro, "", byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro,
integer, integer, integer, integer, byteStringMicro, "" }, structmsg$SystemMsg.class);
}
public structmsg$SystemMsg() {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
this.bytes_game_nick = PBField.initBytes(byteStringMicro);
this.bytes_game_msg = PBField.initBytes(byteStringMicro);
this.uint32_group_flagext3 = PBField.initUInt32(0);
this.uint64_group_owner_uin = PBField.initUInt64(0L);
this.uint32_doubt_flag = PBField.initUInt32(0);
this.bytes_warning_tips = PBField.initBytes(byteStringMicro);
this.bytes_name_more = PBField.initBytes(byteStringMicro);
this.bytes_addtion = PBField.initBytes(byteStringMicro);
this.bytes_transparent_group_notify = PBField.initBytes(byteStringMicro);
this.req_uin_faceid = PBField.initInt32(0);
this.req_uin_nick = PBField.initString("");
this.group_name = PBField.initString("");
this.action_uin_nick = PBField.initString("");
this.msg_qna = PBField.initString("");
this.msg_detail = PBField.initString("");
this.group_ext_flag = PBField.initUInt32(0);
this.actor_uin_nick = PBField.initString("");
this.pic_url = PBField.initBytes(byteStringMicro);
this.clone_uin_nick = PBField.initString("");
this.req_uin_business_card = PBField.initBytes(byteStringMicro);
this.eim_group_id_name = PBField.initBytes(byteStringMicro);
this.req_uin_pre_remark = PBField.initBytes(byteStringMicro);
this.action_uin_qq_nick = PBField.initBytes(byteStringMicro);
this.action_uin_remark = PBField.initBytes(byteStringMicro);
this.req_uin_gender = PBField.initUInt32(0);
this.req_uin_age = PBField.initUInt32(0);
this.uint32_c2c_invite_join_group_flag = PBField.initUInt32(0);
this.card_switch = PBField.initUInt32(0);
this.bytes_source_desc = PBField.initBytes(byteStringMicro);
this.uid = PBField.initString("");
}
}

View File

@ -0,0 +1,20 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
public final class structmsg$SystemMsgAction extends MessageMicro<structmsg$SystemMsgAction> {
static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 34, 42 }, new String[] { "name", "result", "action", "action_info", "detail_name" }, new Object[] { "", "", Integer.valueOf(0), null, "" }, structmsg$SystemMsgAction.class);
public final PBUInt32Field action = PBField.initUInt32(0);
public structmsg$SystemMsgActionInfo action_info = new structmsg$SystemMsgActionInfo();
public final PBStringField detail_name = PBField.initString("");
public final PBStringField name = PBField.initString("");
public final PBStringField result = PBField.initString("");
}

View File

@ -0,0 +1,40 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.ByteStringMicro;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBBoolField;
import com.tencent.mobileqq.pb.PBBytesField;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$SystemMsgActionInfo extends MessageMicro<structmsg$SystemMsgActionInfo> {
static final FieldMap __fieldMap__;
public structmsg$AddFrdSNInfo addFrdSNInfo = new structmsg$AddFrdSNInfo();
public final PBBoolField blacklist = PBField.initBool(false);
public final PBUInt64Field group_code = PBField.initUInt64(0L);
public final PBUInt32Field group_id = PBField.initUInt32(0);
public final PBStringField msg = PBField.initString("");
public final PBStringField remark = PBField.initString("");
public final PBBytesField sig = PBField.initBytes(ByteStringMicro.EMPTY);
public final PBEnumField type = PBField.initEnum(1);
public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
Boolean bool = Boolean.FALSE;
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 26, 402, 408, 418, 424, 434, 440 }, new String[] { "type", "group_code", "sig", "msg", "group_id", "remark", "blacklist", "addFrdSNInfo", "uint32_req_msg_type" }, new Object[] { Integer.valueOf(1), Long.valueOf(0L), byteStringMicro, "", integer, "", bool, null, integer }, structmsg$SystemMsgActionInfo.class);
}
}

View File

@ -3,18 +3,18 @@ plugins {
id("org.jetbrains.kotlin.android")
//id("io.realm.kotlin")
id("kotlin-kapt")
kotlin("plugin.serialization") version "1.8.0"
kotlin("plugin.serialization") version "1.8.10"
}
android {
namespace = "moe.fuqiuluo.xposed"
compileSdk = 33
compileSdk = 34
defaultConfig {
minSdk = 24
minSdk = 27
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
@Suppress("UnstableApiUsage")
externalNativeBuild {
cmake {
cppFlags += ""
@ -50,6 +50,9 @@ android {
}
dependencies {
compileOnly ("de.robv.android.xposed:api:82")
compileOnly (project(":qqinterface"))
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.9.0")
@ -59,7 +62,8 @@ dependencies {
//implementation("io.realm.kotlin:library-sync:1.11.0")
val ktorVersion = "2.3.3"
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
//implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
implementation("io.github.xn32:json5k:0.3.0")
implementation("org.jetbrains.kotlinx:kotlinx-io-jvm:0.1.16")
implementation("io.ktor:ktor-server-core:$ktorVersion")
implementation("io.ktor:ktor-server-host-common:$ktorVersion")
@ -71,6 +75,7 @@ dependencies {
implementation("io.ktor:ktor-client-cio:$ktorVersion")
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
//implementation("io.ktor:ktor-serialization-kotlinx-protobuf:$ktorVersion")
implementation("io.ktor:ktor-network-tls-certificates:$ktorVersion")
/**
@ -93,11 +98,10 @@ dependencies {
// optional - Kotlin Extensions and Coroutines support for Room
implementation("androidx.room:room-ktx:$roomVersion")
compileOnly ("de.robv.android.xposed:api:82")
compileOnly (project(":qqinterface"))
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation(platform("androidx.compose:compose-bom:2023.06.01"))
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
}

View File

@ -0,0 +1 @@
libclover.so

View File

@ -1,38 +1,17 @@
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html.
# For more examples on how to use CMake, see https://github.com/android/ndk-samples.
# Sets the minimum CMake version required for this project.
cmake_minimum_required(VERSION 3.22.1)
# Declares the project name. The project name can be accessed via ${ PROJECT_NAME},
# Since this is the top level CMakeLists.txt, the project name is also accessible
# with ${CMAKE_PROJECT_NAME} (both CMake variables are in-sync within the top level
# build script scope).
project("xposed")
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project("clover")
include_directories(helper)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
#
# In this top level CMakeLists.txt, ${CMAKE_PROJECT_NAME} is used to define
# the target library name; in the sub-module's CMakeLists.txt, ${PROJECT_NAME}
# is preferred for the same purpose.
#
# In order to load a library into your app from Java/Kotlin, you must call
# System.loadLibrary() and pass the name of the library defined here;
# for GameActivity/NativeActivity derived applications, the same library name must be
# used in the AndroidManifest.xml file.
add_library(${CMAKE_PROJECT_NAME} SHARED
# List C/C++ source files with relative paths to this CMakeLists.txt.
xposed.cpp)
anti_detection/anti_detection.cpp
helper/jnihelper.cpp
clover.cpp)
# Specifies libraries CMake should link to your target library. You
# can link libraries from various origins, such as libraries defined in this
# build script, prebuilt third-party libraries, or Android system libraries.
target_link_libraries(${CMAKE_PROJECT_NAME}
# List libraries link to the target library
android
log)

View File

@ -0,0 +1,6 @@
#include "anti_detection.h"

View File

@ -0,0 +1,24 @@
#ifndef SHAMROCK_ANTI_DETECTION_H
#define SHAMROCK_ANTI_DETECTION_H
#include <vector>
#include <string>
#include <initializer_list>
#include "lsposed.h"
#include "jnihelper.h"
static std::vector<std::string> qemu_detect_props = {
"init.svc.qemu-props", "qemu.hw.mainkeys", "qemu.sf.fake_camera", "ro.kernel.android.qemud",
"qemu.sf.lcd_density", "init.svc.qemud", "ro.kernel.qemu",
"libc.debug.malloc"
};
static int (*backup_system_property_get)(const char *name, char *value);
static FILE* (*backup_fopen)(const char *filename, const char *mode);
//int fake_system_property_get(const char *name, char *value);
//FILE* fake_fopen(const char *filename, const char *mode);
//void on_library_loaded(const char *name, void *handle);
#endif //SHAMROCK_ANTI_DETECTION_H

View File

@ -0,0 +1,140 @@
#include <jni.h>
#include "anti_detection/anti_detection.h"
#include "helper/lsposed.h"
#include "jnihelper.h"
static JavaVM *global_jvm = nullptr;
static HookFunType hook_function = nullptr;
extern "C" [[gnu::visibility("default")]] [[gnu::used]]
jint JNI_OnLoad(JavaVM *jvm, void*) {
global_jvm = jvm;
int attach = 0;
JNIEnv *env = JNIHelper::getJNIEnv(jvm, &attach);
// do something
LOGI("[Shamrock] JNI_OnLoad NativeModule Init: %p", env);
if (attach == 1) {
JNIHelper::delJNIEnv(jvm);
}
//hook_function((void *)env->functions->FindClass, (void *)fake_FindClass, (void **)&backup_FindClass);
return JNI_VERSION_1_6;
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_moe_fuqiuluo_shamrock_xposed_XposedEntry_00024Companion_injected(JNIEnv *env, jobject thiz) {
LOGI("[Shamrock] injected: %p", hook_function);
return hook_function != nullptr;
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_moe_fuqiuluo_shamrock_xposed_XposedEntry_00024Companion_hasEnv(JNIEnv *env, jobject thiz) {
LOGI("[Shamrock] hasEnv: %p", global_jvm);
return global_jvm != nullptr;
}
int fake_system_property_get(const char *name, char *value) {
for (auto &prop: qemu_detect_props) {
if (strstr(name, prop.c_str())) {
LOGI("[Shamrock] bypass qemu detection");
value[0] = 0;
return 0;
}
}
if (strstr(name, "ro.debuggable")
|| strstr(name, "ro.kernel.qemu.gles")
|| strstr(name, "debug.atrace.tags.enableflags")) {
strcpy(value, "0");
return 1;
}
if (strstr(name, "ro.product.cpu.abilist")) {
int len = backup_system_property_get(name, value);
if (len > 0) {
if (strstr(value, "x86")) {
strcpy(value, "arm64-v8a,armeabi-v7a,armeabi");
return 29;
}
}
return len;
}
if (strstr(name, "ro.hardware")) {
int len = backup_system_property_get(name, value);
if (len > 0) {
if (strstr(value, "generic")
|| strstr(value, "unknown")
|| strstr(value, "emulator")
|| strstr(value, "vbox")
|| strstr(value, "nox") //部分NoxAppPlayer
|| strstr(value, "genymotion")
|| strstr(value, "goldfish")) {
strcpy(value, "qcom");
return 4;
}
}
return len;
}
//LOGI("[Shamrock] fake_system_property_get(%s)", name);
return backup_system_property_get(name, value);
}
FILE* fake_fopen(const char *filename, const char *mode) {
if (strstr(filename, "qemu_pipe")) {
LOGI("[Shamrock] bypass qemu detection");
return nullptr;
}
const char* emuSpecFile[] = {
"libhoudini.so",
"libndk.so",
"libnoxd.so", //NoxAppPlayer
"libnoxspeedup.so", //NoxAppPlayer
"nox-prop", //NoxAppPlayer (MayUseless?)
"nox-vbox-sf", //NoxAppPlayer (MayUseless?)
"noxd", //NoxAppPlayer (MayUseless?)
"noxspeedup", //NoxAppPlayer (MayUseless?)
};
for (const char* keyword : emuSpecFile) {
if (strstr(filename, keyword)) {
LOGI("[Shamrock] bypass emu detection");
return nullptr;
}
}
if (strstr(filename, "libdobby.so")) {
LOGI("[Shamrock] bypass dobby detection");
return nullptr;
}
return backup_fopen(filename, mode);
}
void on_library_loaded(const char *name, void *handle) {
}
extern "C" [[gnu::visibility("default")]] [[gnu::used]]
NativeOnModuleLoaded native_init(const NativeAPIEntries *entries) {
hook_function = entries->hook_func;
LOGI("[Shamrock] LSPosed NativeModule Init: %p", hook_function);
return on_library_loaded;
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_moe_fuqiuluo_shamrock_xposed_actions_AntiDetection_antiNativeDetections(JNIEnv *env,
jobject thiz) {
if (hook_function == nullptr) return false;
hook_function((void*) __system_property_get, (void *)fake_system_property_get, (void **) &backup_system_property_get);
hook_function((void*) fopen, (void*) fake_fopen, (void**) &backup_fopen);
return true;
}

View File

@ -0,0 +1,26 @@
#include "jnihelper.h"
JNIEnv *JNIHelper::getJNIEnv(JavaVM * jvm, int *attach) {
if (jvm == NULL) return NULL;
*attach = 0;
JNIEnv *jni_env = NULL;
int status = jvm->GetEnv((void **)&jni_env, JNI_VERSION_1_6);
if (status == JNI_EDETACHED || jni_env == NULL) {
status = jvm->AttachCurrentThread(&jni_env, NULL);
if (status < 0) {
jni_env = NULL;
} else {
*attach = 1;
}
}
return jni_env;
}
jint JNIHelper::delJNIEnv(JavaVM * jvm) {
if (jvm == nullptr) return 0;
return jvm->DetachCurrentThread();
}

View File

@ -0,0 +1,14 @@
#ifndef SHAMROCK_JNIHELPER_H
#define SHAMROCK_JNIHELPER_H
#include "jni.h"
#include "android/log.h"
namespace JNIHelper {
JNIEnv *getJNIEnv(JavaVM * jvm, int *attach);
jint delJNIEnv(JavaVM * jvm);
}
#endif //SHAMROCK_JNIHELPER_H

View File

@ -0,0 +1,27 @@
#ifndef SHAMROCK_LSPOSED_H
#define SHAMROCK_LSPOSED_H
#include "stdint.h"
#define TAG "LSPosed-Bridge"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__)
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__)
typedef int (*HookFunType)(void *func, void *replace, void **backup);
typedef int (*UnhookFunType)(void *func);
typedef void (*NativeOnModuleLoaded)(const char *name, void *handle);
typedef struct {
uint32_t version;
HookFunType hook_func;
UnhookFunType unhook_func;
} NativeAPIEntries;
typedef NativeOnModuleLoaded (*NativeInit)(const NativeAPIEntries *entries);
#endif //SHAMROCK_LSPOSED_H

View File

@ -1,5 +0,0 @@
#include <jni.h>
#include <string>
#include <utility>
#include <sys/auxv.h>

View File

@ -50,7 +50,7 @@ val ProtoValue.asLong: Long
get() = (this as ProtoNumber).value.toLong()
val ProtoValue.asULong: Long
get() = (this as ProtoNumber).value.toLong() and 0xFFFFFFFFL
get() = (this as ProtoNumber).value.toLong() and Long.MAX_VALUE
val ProtoValue.asMap: ProtoMap
get() = (this as ProtoMap)

View File

@ -0,0 +1,5 @@
@file:OptIn(ExperimentalSerializationApi::class)
package moe.fuqiuluo.qqinterface.entries
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.Serializable

View File

@ -11,6 +11,8 @@ import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withTimeoutOrNull
import moe.fuqiuluo.proto.protobufOf
import moe.fuqiuluo.shamrock.utils.PlatformUtils
import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher
@ -35,45 +37,41 @@ internal abstract class BaseSvc {
return ToServiceMsg("mobileqq.service", app.currentAccountUin, cmd)
}
suspend fun sendOidbAW(cmd: String, cmdId: Int, serviceId: Int, data: ByteArray, trpc: Boolean = false): ByteArray? {
return suspendCoroutine { continuation ->
val seq = MsfCore.getNextSeq()
val timer = timer(initialDelay = 5000L, period = 5000L) {
suspend fun sendOidbAW(cmd: String, cmdId: Int, serviceId: Int, data: ByteArray, trpc: Boolean = false, timeout: Long = 5000L): ByteArray? {
val seq = MsfCore.getNextSeq()
return withTimeoutOrNull(timeout) {
suspendCancellableCoroutine { continuation ->
GlobalScope.launch(Dispatchers.Default) {
PacketHandler.unregisterLessHandler(seq)
continuation.resume(null)
DynamicReceiver.register(IPCRequest(cmd, seq) {
val buffer = it.getByteArrayExtra("buffer")!!
continuation.resume(buffer)
})
}
if (trpc) sendTrpcOidb(cmd, cmdId, serviceId, data, seq)
else sendOidb(cmd, cmdId, serviceId, data, seq)
}
GlobalScope.launch(Dispatchers.Default) {
DynamicReceiver.register(IPCRequest(cmd, seq) {
val buffer = it.getByteArrayExtra("buffer")!!
timer.cancel()
continuation.resume(buffer)
})
}
if (trpc) sendTrpcOidb(cmd, cmdId, serviceId, data, seq)
else sendOidb(cmd, cmdId, serviceId, data, seq)
}
}.also {
if (it == null)
DynamicReceiver.unregister(seq)
}?.copyOf()
}
suspend fun sendBufferAW(cmd: String, isPb: Boolean, data: ByteArray): ByteArray? {
return suspendCoroutine { continuation ->
val seq = MsfCore.getNextSeq()
val timer = timer(initialDelay = 5000L, period = 5000L) {
suspend fun sendBufferAW(cmd: String, isPb: Boolean, data: ByteArray, timeout: Long = 5000L): ByteArray? {
val seq = MsfCore.getNextSeq()
return withTimeoutOrNull<ByteArray?>(timeout) {
suspendCancellableCoroutine { continuation ->
GlobalScope.launch(Dispatchers.Default) {
PacketHandler.unregisterLessHandler(seq)
continuation.resume(null)
DynamicReceiver.register(IPCRequest(cmd, seq) {
val buffer = it.getByteArrayExtra("buffer")!!
continuation.resume(buffer)
})
sendBuffer(cmd, isPb, data, seq)
}
}
GlobalScope.launch(Dispatchers.Default) {
DynamicReceiver.register(IPCRequest(cmd, seq) {
val buffer = it.getByteArrayExtra("buffer")!!
timer.cancel()
continuation.resume(buffer)
})
sendBuffer(cmd, isPb, data, seq)
}
}
}.also {
if (it == null)
DynamicReceiver.unregister(seq)
}?.copyOf()
}
fun sendOidb(cmd: String, cmdId: Int, serviceId: Int, buffer: ByteArray, seq: Int = -1, trpc: Boolean = false) {
@ -110,7 +108,7 @@ internal abstract class BaseSvc {
app.sendToService(to)
}
fun sendBuffer(cmd: String, isPb: Boolean, buffer: ByteArray, seq: Int) {
fun sendBuffer(cmd: String, isPb: Boolean, buffer: ByteArray, seq: Int = MsfCore.getNextSeq()) {
val toServiceMsg = ToServiceMsg("mobileqq.service", app.currentUin, cmd)
toServiceMsg.putWupBuffer(buffer)
toServiceMsg.addAttribute("req_pb_protocol_flag", isPb)

View File

@ -109,7 +109,7 @@ internal object CardSvc: BaseSvc() {
val dataService = app
.getRuntimeService(IProfileDataService::class.java, "all")
val card = refreshCardLock.withLock {
suspendCancellableCoroutine<Card?> {
suspendCancellableCoroutine {
app.addObserver(object: ProfileCardObserver() {
override fun onGetProfileCard(success: Boolean, obj: Any) {
app.removeObserver(this)

View File

@ -1,12 +1,15 @@
package moe.fuqiuluo.qqinterface.servlet
import com.tencent.mobileqq.pb.ByteStringMicro
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import moe.fuqiuluo.proto.protobufOf
import moe.fuqiuluo.qqinterface.servlet.entries.*
import moe.fuqiuluo.qqinterface.servlet.transfile.RichProtoSvc
import moe.fuqiuluo.shamrock.helper.Level
import moe.fuqiuluo.shamrock.helper.LogCenter
import moe.fuqiuluo.shamrock.tools.EMPTY_BYTE_ARRAY
import moe.fuqiuluo.shamrock.tools.slice
import moe.fuqiuluo.shamrock.tools.toHexString
import moe.fuqiuluo.shamrock.utils.DeflateTools
import tencent.im.oidb.cmd0x6d8.oidb_0x6d8
import tencent.im.oidb.oidb_sso
@ -33,8 +36,23 @@ internal object FileSvc: BaseSvc() {
}
fun deleteGroupFile(groupId: String, bizId: Int, fileUid: String) {
/*
val kernelService = NTServiceFetcher.kernelService
val sessionService = kernelService.wrapperSession
val richMediaService = sessionService.richMediaService
val result = withTimeoutOrNull(3000L) {
suspendCancellableCoroutine {
richMediaService.deleteGroupFile(groupId.toLong(), fileUid, bizId) { code, _, result ->
it.resume(code to result.result)
}
}
}
return if (result == null) Result.failure(RuntimeException("delete group file timeout")) else Result.success(result)*/
// 调用QQ内部实现会导致闪退
sendOidb("OidbSvc.0x6d6_3", 1750, 3, protobufOf(
4 to mapOf(
4 to mapOf(
1 to groupId.toLong(),
2 to 3,
3 to bizId,
@ -92,7 +110,7 @@ internal object FileSvc: BaseSvc() {
)
}
suspend fun getGroupRootFiles(groupId: Long): GroupFileList {
suspend fun getGroupRootFiles(groupId: Long): Result<GroupFileList> {
return getGroupFiles(groupId, "/")
}
@ -100,7 +118,7 @@ internal object FileSvc: BaseSvc() {
return FileUrl(RichProtoSvc.getGroupFileDownUrl(groupId, fileId, busid))
}
suspend fun getGroupFiles(groupId: Long, folderId: String): GroupFileList {
suspend fun getGroupFiles(groupId: Long, folderId: String): Result<GroupFileList> {
val fileSystemInfo = getGroupFileSystemInfo(groupId)
val rspGetFileListBuffer = sendOidbAW("OidbSvc.0x6d8_1", 1752, 1, oidb_0x6d8.ReqBody().also {
it.file_list_info_req.set(oidb_0x6d8.GetFileListReqBody().apply {
@ -122,17 +140,20 @@ internal object FileSvc: BaseSvc() {
uint32_show_onlinedoc_folder.set(0)
})
}.toByteArray())
}.toByteArray(), timeout = 15_000L)
val files = arrayListOf<FileInfo>()
val dirs = arrayListOf<FolderInfo>()
if (rspGetFileListBuffer != null) {
oidb_0x6d8.RspBody().mergeFrom(oidb_sso.OIDBSSOPkg()
.mergeFrom(rspGetFileListBuffer.slice(4))
.bytes_bodybuffer.get()
.toByteArray()).file_list_info_rsp.apply {
return kotlin.runCatching {
val files = arrayListOf<FileInfo>()
val dirs = arrayListOf<FolderInfo>()
if (rspGetFileListBuffer != null) {
val oidb = oidb_sso.OIDBSSOPkg().mergeFrom(rspGetFileListBuffer.slice(4).let {
if (it[0] == 0x78.toByte()) DeflateTools.uncompress(it) else it
})
oidb_0x6d8.RspBody().mergeFrom(oidb.bytes_bodybuffer.get().toByteArray())
.file_list_info_rsp.apply {
rpt_item_list.get().forEach { file ->
if (file.uint32_type.get() == 1) {
if (file.uint32_type.get() == oidb_0x6d8.GetFileListRspBody.TYPE_FILE) {
val fileInfo = file.file_info
files.add(FileInfo(
groupId = groupId,
@ -145,9 +166,14 @@ internal object FileSvc: BaseSvc() {
modifyTime = fileInfo.uint32_modify_time.get(),
downloadTimes = fileInfo.uint32_download_times.get(),
uploadUin = fileInfo.uint64_uploader_uin.get(),
uploadNick = fileInfo.str_uploader_name.get()
uploadNick = fileInfo.str_uploader_name.get(),
md5 = fileInfo.bytes_md5.get().toByteArray().toHexString(),
sha = fileInfo.bytes_sha.get().toByteArray().toHexString(),
// 根本没有
sha3 = fileInfo.bytes_sha3.get().toByteArray().toHexString(),
))
} else if (file.uint32_type.get() == 2) {
}
else if (file.uint32_type.get() == oidb_0x6d8.GetFileListRspBody.TYPE_FOLDER) {
val folderInfo = file.folder_info
dirs.add(FolderInfo(
groupId = groupId,
@ -158,58 +184,18 @@ internal object FileSvc: BaseSvc() {
creator = folderInfo.uint64_create_uin.get(),
creatorNick = folderInfo.str_creator_name.get()
))
} else {
LogCenter.log("未知文件类型: ${file.uint32_type.get()}", Level.WARN)
}
}
}
} else {
throw RuntimeException("获取群文件列表失败")
}
} else {
throw RuntimeException("获取群文件列表失败")
GroupFileList(files, dirs)
}.onFailure {
LogCenter.log(it.message + ", buffer: ${rspGetFileListBuffer.toHexString()}", Level.ERROR)
}
return GroupFileList(files, dirs)
}
@Serializable
data class FileUrl(
@SerialName("url") val url: String,
)
@Serializable
data class GroupFileList(
@SerialName("files") val files: List<FileInfo>,
@SerialName("folders") val folders: List<FolderInfo>,
)
@Serializable
data class FileInfo(
@SerialName("group_id") val groupId: Long,
@SerialName("file_id") val fileId: String,
@SerialName("file_name") val fileName: String,
@SerialName("file_size") val fileSize: Long,
@SerialName("busid") val busid: Int,
@SerialName("upload_time") val uploadTime: Int,
@SerialName("dead_time") val deadTime: Int,
@SerialName("modify_time") val modifyTime: Int,
@SerialName("download_times") val downloadTimes: Int,
@SerialName("uploader") val uploadUin: Long,
@SerialName("upload_name") val uploadNick: String,
)
@Serializable
data class FolderInfo(
@SerialName("group_id") val groupId: Long,
@SerialName("folder_id") val folderId: String,
@SerialName("folder_name") val folderName: String,
@SerialName("total_file_count") val totalFileCount: Int,
@SerialName("create_time") val createTime: Int,
@SerialName("creator") val creator: Long,
@SerialName("creator_name") val creatorNick: String,
)
@Serializable
data class FileSystemInfo(
@SerialName("file_count") val fileCount: Int,
@SerialName("limit_count") val fileLimitCount: Int,
@SerialName("used_space") val usedSpace: Long,
@SerialName("total_space") val totalSpace: Long,
)
}

View File

@ -1,19 +1,28 @@
@file:OptIn(DelicateCoroutinesApi::class)
@file:Suppress("IllegalIdentifier")
package moe.fuqiuluo.qqinterface.servlet
import com.tencent.common.app.AppInterface
import com.tencent.mobileqq.data.Friends
import com.tencent.mobileqq.friend.api.IFriendDataService
import com.tencent.mobileqq.friend.api.IFriendHandlerService
import com.tencent.mobileqq.qroute.QRoute
import com.tencent.mobileqq.relation.api.IAddFriendTempApi
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine
import moe.fuqiuluo.qqinterface.servlet.BaseSvc
import moe.fuqiuluo.shamrock.tools.slice
import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher
import mqq.app.AppRuntime
import mqq.app.MobileQQ
import tencent.mobileim.structmsg.`structmsg$FlagInfo`
import tencent.mobileim.structmsg.`structmsg$ReqSystemMsgNew`
import tencent.mobileim.structmsg.`structmsg$RspSystemMsgNew`
import kotlin.coroutines.resume
import tencent.mobileim.structmsg.`structmsg$SystemMsgActionInfo` as ActionInfo
import tencent.mobileim.structmsg.`structmsg$AddFrdSNInfo` as AddFrdSNInfo
import tencent.mobileim.structmsg.`structmsg$StructMsg` as StructMsg
internal object FriendSvc: BaseSvc() {
@ -28,6 +37,75 @@ internal object FriendSvc: BaseSvc() {
return Result.success(service.allFriends)
}
// ProfileService.Pb.ReqSystemMsgAction.Friend
fun requestFriendRequest(msgSeq: Long, uin: Long, remark: String = "", approve: Boolean? = true, notSee: Boolean? = false) {
val app = AppRuntimeFetcher.appRuntime
if (app !is AppInterface)
throw RuntimeException("AppRuntime cannot cast to AppInterface")
val service = QRoute.api(IAddFriendTempApi::class.java)
val action = ActionInfo()
action.type.set(if (approve != false) 2 else 3)
action.group_id.set(0)
action.remark.set(remark)
val snInfo = AddFrdSNInfo()
snInfo.uint32_not_see_dynamic.set(if (notSee != false) 1 else 0)
snInfo.uint32_set_sn.set(0)
action.addFrdSNInfo.set(snInfo)
service.sendFriendSystemMsgAction(1, msgSeq, uin, 1, 2004, 11, 0, action, 0, StructMsg(), false,
app
)
}
suspend fun requestFriendSystemMsgNew(msgNum: Int, latestFriendSeq: Long = 0, latestGroupSeq: Long = 0, retryCnt: Int = 3): List<StructMsg>? {
if (retryCnt < 0) {
return ArrayList()
}
val req = `structmsg$ReqSystemMsgNew`()
req.msg_num.set(msgNum)
req.latest_friend_seq.set(latestFriendSeq)
req.latest_group_seq.set(latestGroupSeq)
req.version.set(1000)
req.checktype.set(2)
val flag = `structmsg$FlagInfo`()
// flag.GrpMsg_Kick_Admin.set(1)
// flag.GrpMsg_HiddenGrp.set(1)
// flag.GrpMsg_WordingDown.set(1)
flag.FrdMsg_GetBusiCard.set(1)
// flag.GrpMsg_GetOfficialAccount.set(1)
// flag.GrpMsg_GetPayInGroup.set(1)
flag.FrdMsg_Discuss2ManyChat.set(1)
// flag.GrpMsg_NotAllowJoinGrp_InviteNotFrd.set(1)
flag.FrdMsg_NeedWaitingMsg.set(1)
flag.FrdMsg_uint32_need_all_unread_msg.set(1)
// flag.GrpMsg_NeedAutoAdminWording.set(1)
// flag.GrpMsg_get_transfer_group_msg_flag.set(1)
// flag.GrpMsg_get_quit_pay_group_msg_flag.set(1)
// flag.GrpMsg_support_invite_auto_join.set(1)
// flag.GrpMsg_mask_invite_auto_join.set(1)
// flag.GrpMsg_GetDisbandedByAdmin.set(1)
flag.GrpMsg_GetC2cInviteJoinGroup.set(1)
req.flag.set(flag)
req.is_get_frd_ribbon.set(false)
req.is_get_grp_ribbon.set(false)
req.friend_msg_type_flag.set(1)
req.uint32_req_msg_type.set(1)
req.uint32_need_uid.set(1)
val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgNew.Friend", true, req.toByteArray())
return if (respBuffer == null) {
ArrayList()
} else {
try {
val msg = `structmsg$RspSystemMsgNew`()
msg.mergeFrom(respBuffer.slice(4))
return msg.friendmsgs.get()
} catch (err: Throwable) {
requestFriendSystemMsgNew(msgNum, latestFriendSeq, latestGroupSeq, retryCnt - 1)
}
}
}
private suspend fun requestFriendList(runtime: AppRuntime, dataService: IFriendDataService): Boolean {
val service = runtime.getRuntimeService(IFriendHandlerService::class.java, "all")
service.requestFriendList(true, 0)

View File

@ -2,6 +2,7 @@
package moe.fuqiuluo.qqinterface.servlet
import androidx.core.text.HtmlCompat
import com.tencent.common.app.AppInterface
import com.tencent.mobileqq.app.BusinessHandlerFactory
import com.tencent.mobileqq.app.QQAppInterface
@ -13,7 +14,22 @@ import com.tencent.mobileqq.troop.api.ITroopMemberInfoService
import com.tencent.protofile.join_group_link.join_group_link
import com.tencent.qphone.base.remote.ToServiceMsg
import com.tencent.qqnt.kernel.nativeinterface.MemberInfo
import com.tencent.qqnt.kernel.nativeinterface.MsgConstant
import friendlist.stUinInfo
import io.ktor.client.call.body
import io.ktor.client.request.forms.MultiPartFormDataContent
import io.ktor.client.request.forms.formData
import io.ktor.client.request.forms.submitForm
import io.ktor.client.request.get
import io.ktor.client.request.header
import io.ktor.client.request.post
import io.ktor.client.request.setBody
import io.ktor.http.ContentType
import io.ktor.http.Headers
import io.ktor.http.HttpHeaders
import io.ktor.http.contentType
import io.ktor.http.headers
import io.ktor.http.parameters
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
@ -22,21 +38,56 @@ import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withTimeoutOrNull
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.decodeFromStream
import kotlinx.serialization.json.jsonObject
import moe.fuqiuluo.proto.ProtoUtils
import moe.fuqiuluo.proto.asInt
import moe.fuqiuluo.proto.asUtf8String
import moe.fuqiuluo.proto.protobufOf
import moe.fuqiuluo.qqinterface.servlet.TicketSvc.getUin
import moe.fuqiuluo.qqinterface.servlet.entries.ProhibitedMemberInfo
import moe.fuqiuluo.shamrock.helper.Level
import moe.fuqiuluo.shamrock.helper.LogCenter
import moe.fuqiuluo.shamrock.helper.MessageHelper
import moe.fuqiuluo.shamrock.remote.service.data.EssenceMessage
import moe.fuqiuluo.shamrock.remote.service.data.GroupAnnouncement
import moe.fuqiuluo.shamrock.remote.service.data.GroupAnnouncementMessage
import moe.fuqiuluo.shamrock.remote.service.data.GroupAnnouncementMessageImage
import moe.fuqiuluo.shamrock.tools.EmptyJsonArray
import moe.fuqiuluo.shamrock.tools.GlobalClient
import moe.fuqiuluo.shamrock.tools.asInt
import moe.fuqiuluo.shamrock.tools.asJsonArrayOrNull
import moe.fuqiuluo.shamrock.tools.asJsonObject
import moe.fuqiuluo.shamrock.tools.asLong
import moe.fuqiuluo.shamrock.tools.asString
import moe.fuqiuluo.shamrock.tools.asStringOrNull
import moe.fuqiuluo.shamrock.tools.ifNullOrEmpty
import moe.fuqiuluo.shamrock.tools.putBuf32Long
import moe.fuqiuluo.shamrock.tools.slice
import moe.fuqiuluo.shamrock.utils.FileUtils
import moe.fuqiuluo.shamrock.utils.PlatformUtils
import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher
import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher
import mqq.app.MobileQQ
import tencent.im.group.group_member_info
import tencent.im.oidb.cmd0x899.oidb_0x899
import tencent.im.oidb.cmd0x89a.oidb_0x89a
import tencent.im.oidb.cmd0x8a0.oidb_0x8a0
import tencent.im.oidb.cmd0x8fc.Oidb_0x8fc
import tencent.im.oidb.cmd0xeb7.oidb_0xeb7
import tencent.im.oidb.oidb_sso
import tencent.im.troop.honor.troop_honor
import java.lang.reflect.Method
import java.lang.reflect.Modifier
import java.nio.ByteBuffer
import kotlin.coroutines.resume
import tencent.mobileim.structmsg.`structmsg$ReqSystemMsgNew` as ReqSystemMsgNew
import tencent.mobileim.structmsg.`structmsg$FlagInfo` as FlagInfo
import tencent.mobileim.structmsg.`structmsg$RspSystemMsgNew` as RspSystemMsgNew
import tencent.mobileim.structmsg.`structmsg$StructMsg` as StructMsg
internal object GroupSvc: BaseSvc() {
private val RefreshTroopMemberInfoLock by lazy {
Mutex()
@ -51,6 +102,28 @@ internal object GroupSvc: BaseSvc() {
private lateinit var METHOD_REQ_TROOP_MEM_LIST: Method
private lateinit var METHOD_REQ_MODIFY_GROUP_NAME: Method
suspend fun getProhibitedMemberList(groupId: Long): Result<List<ProhibitedMemberInfo>> {
val buffer = sendOidbAW("OidbSvc.0x899_0", 2201, 0, oidb_0x899.ReqBody().apply {
uint64_group_code.set(groupId)
uint64_start_uin.set(0)
uint32_identify_flag.set(6)
memberlist_opt.set(oidb_0x899.memberlist().apply {
uint64_member_uin.set(0)
uint32_shutup_timestap.set(0)
})
}.toByteArray()) ?: return Result.failure(RuntimeException("[oidb] timeout"))
val body = oidb_sso.OIDBSSOPkg()
body.mergeFrom(buffer.slice(4))
if(body.uint32_result.get() != 0) {
return Result.failure(RuntimeException(body.str_error_msg.get()))
}
val resp = oidb_0x899.RspBody().mergeFrom(body.bytes_bodybuffer.get().toByteArray())
return Result.success(resp.rpt_memberlist.get().map {
ProhibitedMemberInfo(it.uint64_member_uin.get(), it.uint32_shutup_timestap.get())
})
}
fun poke(groupId: String, userId: String) {
sendOidb("OidbSvc.0xed3", 3795, 1, protobufOf(
1 to userId.toLong(),
@ -68,6 +141,12 @@ internal object GroupSvc: BaseSvc() {
}.getOrThrow()
}
getGroupInfo(groupId, true).onSuccess {
if(it.wMemberNum > memberList.size) {
return getGroupMemberList(groupId, true)
}
}
return Result.success(memberList)
}
@ -107,7 +186,7 @@ internal object GroupSvc: BaseSvc() {
val memberInfo = Oidb_0x8fc.MemberInfo()
memberInfo.uint64_uin.set(userId.toLong())
memberInfo.bytes_uin_name.set(ByteStringMicro.copyFromUtf8(localMemberInfo.troopnick.ifBlank {
localMemberInfo.troopremark
localMemberInfo.troopremark.ifNullOrEmpty("")
}))
memberInfo.bytes_special_title.set(ByteStringMicro.copyFromUtf8(title))
memberInfo.uint32_special_title_expire_time.set(-1)
@ -133,6 +212,49 @@ internal object GroupSvc: BaseSvc() {
return true
}
suspend fun setEssenceMessage(groupId: Long, seq: Long, rand: Long): Pair<Boolean, String> {
val array = protobufOf(
1 to groupId,
2 to seq,
3 to rand
).toByteArray()
val buffer = sendOidbAW("OidbSvc.0xeac_1", 3756, 1, array)
?: return Pair(false, "unknown error")
val body = oidb_sso.OIDBSSOPkg()
body.mergeFrom(buffer.slice(4))
val result = ProtoUtils.decodeFromByteArray(body.bytes_bodybuffer.get().toByteArray())
return if (result.has(1)) {
LogCenter.log("设置群精华失败: ${result[1].asUtf8String}")
Pair(false, "设置群精华失败: ${result[1].asUtf8String}")
} else {
LogCenter.log("设置群精华 -> $groupId:$seq")
Pair(true, "ok")
}
}
suspend fun deleteEssenceMessage(groupId: Long, seq: Long, rand: Long): Pair<Boolean, String> {
val array = protobufOf(
1 to groupId,
2 to seq,
3 to rand
).toByteArray()
val buffer = sendOidbAW("OidbSvc.0xeac_2", 3756, 2, array)
val body = oidb_sso.OIDBSSOPkg()
if (buffer == null) {
return Pair(false, "unknown error")
}
body.mergeFrom(buffer.slice(4))
val result = ProtoUtils.decodeFromByteArray(body.bytes_bodybuffer.get().toByteArray())
return if (result.has(1)) {
LogCenter.log("移除群精华失败: ${result[1].asUtf8String}")
Pair(false, "移除群精华失败: ${result[1].asUtf8String}")
} else {
LogCenter.log("移除群精华 -> $groupId:$seq")
Pair(true, "ok")
}
}
fun setGroupAdmin(groupId: Long, userId: Long, enable: Boolean) {
val buffer = ByteBuffer.allocate(9)
buffer.putBuf32Long(groupId)
@ -204,7 +326,7 @@ internal object GroupSvc: BaseSvc() {
fun getOwner(groupId: String): Long {
val groupInfo = getGroupInfo(groupId)
return groupInfo.troopowneruin.toLong()
return groupInfo.troopowneruin?.toLong() ?: 0
}
fun isOwner(groupId: String): Boolean {
@ -306,6 +428,36 @@ internal object GroupSvc: BaseSvc() {
}
}
}
try {
if (info != null && (info.alias == null || info.alias.isBlank())) {
val req = group_member_info.ReqBody()
req.uint64_group_code.set(groupId.toLong())
req.uint64_uin.set(uin.toLong())
req.bool_new_client.set(true)
req.uint32_client_type.set(1)
req.uint32_rich_card_name_ver.set(1)
val respBuffer = sendBufferAW("group_member_card.get_group_member_card_info", true, req.toByteArray())
if (respBuffer != null) {
val rsp = group_member_info.RspBody()
rsp.mergeFrom(respBuffer.slice(4))
if (rsp.msg_meminfo.str_location.has()) {
info.alias = rsp.msg_meminfo.str_location.get().toStringUtf8()
}
if (rsp.msg_meminfo.uint32_age.has()) {
info.age = rsp.msg_meminfo.uint32_age.get().toByte()
}
if (rsp.msg_meminfo.bytes_group_honor.has()) {
val honorBytes = rsp.msg_meminfo.bytes_group_honor.get().toByteArray()
val honor = troop_honor.GroupUserCardHonor()
honor.mergeFrom(honorBytes)
info.level = honor.level.get()
// 10315: medal_id not real group level
}
}
}
} catch (err: Throwable) {
LogCenter.log(err.stackTraceToString(), Level.WARN)
}
return if (info != null) {
Result.success(info)
} else {
@ -412,7 +564,7 @@ internal object GroupSvc: BaseSvc() {
throw RuntimeException("AppRuntime cannot cast to AppInterface")
val businessHandler = app.getBusinessHandler(BusinessHandlerFactory.TROOP_MEMBER_LIST_HANDLER)
// void C(boolean foreRefresh, String groupId, String troopcode, int reqType); // RequestedTroopList/refreshMemberListFromServer
// void C(boolean forceRefresh, String groupId, String troopcode, int reqType); // RequestedTroopList/refreshMemberListFromServer
if (!GroupSvc::METHOD_REQ_TROOP_MEM_LIST.isInitialized) {
METHOD_REQ_TROOP_MEM_LIST = businessHandler.javaClass.declaredMethods.first {
it.parameterCount == 4
@ -518,4 +670,311 @@ internal object GroupSvc: BaseSvc() {
Result.failure(Exception("获取群成员信息失败"))
}
}
// ProfileService.Pb.ReqSystemMsgAction.Group
suspend fun requestGroupRequest(
msgSeq: Long,
uin: Long,
gid: Long,
msg: String? = "",
approve: Boolean? = true,
notSee: Boolean? = false,
subType: String
): Result<String>{
// 实在找不到接口了 发pb吧
val buffer: ByteArray
when (subType) {
"invite" -> {
buffer = protobufOf(
1 to 1,
2 to msgSeq,
3 to uin, // self
4 to 1,
5 to 3,
6 to 10016,
7 to 2,
8 to mapOf(
1 to if (approve != false) 11 else 12,
2 to gid
),
9 to 1000
).toByteArray()
}
"add" -> {
buffer = protobufOf(
1 to 2,
2 to msgSeq,
3 to uin,
4 to 1,
5 to 2,
6 to 30024,
7 to 1,
8 to mapOf(
1 to if (approve != false) 11 else 12,
2 to gid,
50 to msg,
53 to if (notSee != false) 1 else 0
),
9 to 1000
).toByteArray()
}
else -> {
return Result.failure(Exception("不支持的sub_type"))
}
}
val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgAction.Group", true, buffer)
?: return Result.failure(Exception("操作失败"))
val result = ProtoUtils.decodeFromByteArray(respBuffer.slice(4))
return if (result.has(1, 1)) {
if (result[1, 1].asInt == 0) {
Result.success(result[2].asUtf8String)
} else {
Result.failure(Exception(result[1, 2].asUtf8String))
}
} else {
Result.failure(Exception("操作失败"))
}
}
suspend fun requestGroupSystemMsgNew(msgNum: Int, reqMsgType: Int = 1, latestFriendSeq: Long = 0, latestGroupSeq: Long = 0, retryCnt: Int = 5): List<StructMsg> {
if (retryCnt < 0) {
return ArrayList()
}
val req = ReqSystemMsgNew()
req.msg_num.set(msgNum)
req.latest_friend_seq.set(latestFriendSeq)
req.latest_group_seq.set(latestGroupSeq)
req.version.set(1000)
req.checktype.set(3)
val flag = FlagInfo()
flag.GrpMsg_Kick_Admin.set(1)
flag.GrpMsg_HiddenGrp.set(1)
flag.GrpMsg_WordingDown.set(1)
// flag.FrdMsg_GetBusiCard.set(1)
flag.GrpMsg_GetOfficialAccount.set(1)
flag.GrpMsg_GetPayInGroup.set(1)
flag.FrdMsg_Discuss2ManyChat.set(1)
flag.GrpMsg_NotAllowJoinGrp_InviteNotFrd.set(1)
flag.FrdMsg_NeedWaitingMsg.set(1)
// flag.FrdMsg_uint32_need_all_unread_msg.set(1)
flag.GrpMsg_NeedAutoAdminWording.set(1)
flag.GrpMsg_get_transfer_group_msg_flag.set(1)
flag.GrpMsg_get_quit_pay_group_msg_flag.set(1)
flag.GrpMsg_support_invite_auto_join.set(1)
flag.GrpMsg_mask_invite_auto_join.set(1)
flag.GrpMsg_GetDisbandedByAdmin.set(1)
flag.GrpMsg_GetC2cInviteJoinGroup.set(1)
req.flag.set(flag)
req.is_get_frd_ribbon.set(false)
req.is_get_grp_ribbon.set(false)
req.friend_msg_type_flag.set(1)
req.uint32_req_msg_type.set(reqMsgType)
req.uint32_need_uid.set(1)
val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgNew.Group", true, req.toByteArray())
return if (respBuffer == null) {
ArrayList()
} else {
try {
val msg = RspSystemMsgNew()
msg.mergeFrom(respBuffer.slice(4))
return msg.groupmsgs.get().orEmpty()
} catch (err: Throwable) {
requestGroupSystemMsgNew(msgNum, reqMsgType, latestFriendSeq, latestGroupSeq, retryCnt - 1)
}
}
}
@OptIn(ExperimentalSerializationApi::class)
suspend fun getEssenceMessageList(groupId: Long, page: Int = 0, pageSize: Int = 20): Result<List<EssenceMessage>>{
// GlobalClient.get()
val cookie = TicketSvc.getCookie("qun.qq.com")
val bkn = TicketSvc.getBkn(TicketSvc.getRealSkey(TicketSvc.getUin()))
val url = "https://qun.qq.com/cgi-bin/group_digest/digest_list?bkn=${bkn}&group_code=${groupId}&page_start=${page}&page_limit=${pageSize}"
val response = GlobalClient.get(url) {
header("Cookie", cookie)
}
val body = Json.decodeFromStream<JsonElement>(response.body())
if (body.jsonObject["retcode"].asInt == 0) {
val data = body.jsonObject["data"].asJsonObject
val list = data["msg_list"].asJsonArrayOrNull
?: // is_end
return Result.success(ArrayList())
return Result.success(list.map {
val obj = it.jsonObject
val msgSeq = obj["msg_seq"].asInt
val msg = EssenceMessage(
senderId = obj["sender_uin"].asString.toLong(),
senderNick = obj["sender_nick"].asString,
senderTime = obj["sender_time"].asLong,
operatorId = obj["add_digest_uin"].asString.toLong(),
operatorNick = obj["add_digest_nick"].asString,
operatorTime = obj["add_digest_time"].asLong,
messageId = 0,
messageSeq = msgSeq,
messageContent = obj["msg_content"] ?: EmptyJsonArray
)
val mapping = MessageHelper.getMsgMappingBySeq(MsgConstant.KCHATTYPEGROUP, msgSeq)
if (mapping != null) {
msg.messageId = mapping.msgHashId
}
msg
})
} else {
return Result.failure(Exception(body.jsonObject["retmsg"].asStringOrNull))
}
}
@OptIn(ExperimentalSerializationApi::class)
suspend fun getGroupAnnouncements(groupId: Long): Result<List<GroupAnnouncement>>{
val cookie = TicketSvc.getCookie("qun.qq.com")
val bkn = TicketSvc.getBkn(TicketSvc.getRealSkey(TicketSvc.getUin()))
val url = "https://web.qun.qq.com/cgi-bin/announce/get_t_list?bkn=${bkn}&qid=${groupId}&ft=23&s=-1&n=20"
val response = GlobalClient.get(url) {
header("Cookie", cookie)
}
val body = Json.decodeFromStream<JsonElement>(response.body())
if (body.jsonObject["ec"].asInt == 0) {
val list = body.jsonObject["feeds"].asJsonArrayOrNull
?: return Result.success(ArrayList())
return Result.success(list.map {
val obj = it.jsonObject
GroupAnnouncement(
senderId = obj["u"].asLong,
publishTime = obj["pubt"].asLong,
message = GroupAnnouncementMessage(
// text = obj["msg"].asJsonObject["text"].asString,
text = fromHtml(obj["msg"].asJsonObject["text"].asString),
images = obj["msg"].asJsonObject["pics"].asJsonArrayOrNull?.map { pic ->
GroupAnnouncementMessageImage(
id = pic.jsonObject["id"].asString,
width = pic.jsonObject["w"].asString,
height = pic.jsonObject["h"].asString,
)
} ?: ArrayList()
)
)
})
} else {
return Result.failure(Exception(body.jsonObject["em"].asStringOrNull))
}
}
private fun fromHtml(htmlString: String): String {
return HtmlCompat
// 特殊处理&#10;目的是替换为换行符否则会被fromHtml忽略并移除
.fromHtml(htmlString.replace("&#10;", "[shamrockplaceholder]"), HtmlCompat.FROM_HTML_MODE_LEGACY)
.toString()
.replace("[shamrockplaceholder]", "\n")
}
@OptIn(ExperimentalSerializationApi::class)
suspend fun uploadImageTroopNotice(image: String): Result<GroupAnnouncementMessageImage> {
val file = FileUtils.parseAndSave(image)
val cookie = TicketSvc.getCookie("qun.qq.com")
val bkn = TicketSvc.getBkn(TicketSvc.getRealSkey(TicketSvc.getUin()))
val response = GlobalClient.post("https://web.qun.qq.com/cgi-bin/announce/upload_img") {
headers {
header("Cookie", cookie)
}
contentType(ContentType.MultiPart.FormData)
setBody(MultiPartFormDataContent(
// 黑人问号 ktor默认formdata传的tx不认。默认是name=bkn非要写成name="bkn"才认?
formData {
append("filename", "001.png", Headers.build {
append(HttpHeaders.ContentDisposition, "name=\"filename\"")
})
append("source", "troopNotice", Headers.build {
append(HttpHeaders.ContentDisposition, "name=\"source\"")
})
append("bkn", bkn, Headers.build {
append(HttpHeaders.ContentDisposition, "name=\"bkn\"")
})
append("m", "0", Headers.build {
append(HttpHeaders.ContentDisposition, "name=\"m\"")
})
append("pic_up", file.readBytes(), Headers.build {
append(HttpHeaders.ContentType, "image/png")
append(HttpHeaders.ContentDisposition, "name=\"pic_up\" filename=\"001.png\"")
})
}
))
}
val body = Json.decodeFromStream<JsonElement>(response.body())
if (body.jsonObject["ec"].asInt == 0) {
var idJsonStr = body.jsonObject["id"].asStringOrNull
return if (idJsonStr != null) {
idJsonStr = idJsonStr.replace("&quot;", "\"")
val idJson = Json.decodeFromString<JsonElement>(idJsonStr)
LogCenter.log(idJson.toString())
Result.success(GroupAnnouncementMessageImage(
height = idJson.asJsonObject["h"].asString,
width = idJson.asJsonObject["w"].asString,
id = idJson.asJsonObject["id"].asString,
))
} else {
Result.failure(Exception("图片上传失败"))
}
} else {
return Result.failure(Exception(body.jsonObject["em"].asStringOrNull))
}
}
@OptIn(ExperimentalSerializationApi::class)
suspend fun addQunNotice(groupId: Long, text: String, image: GroupAnnouncementMessageImage?) : Result<Boolean> {
val cookie = TicketSvc.getCookie("qun.qq.com")
val bkn = TicketSvc.getBkn(TicketSvc.getRealSkey(TicketSvc.getUin()))
val response = GlobalClient.submitForm(
url = "https://web.qun.qq.com/cgi-bin/announce/add_qun_notice",
formParameters = parameters {
append("qid", groupId.toString())
append("bkn", bkn)
append("text", text)
append("pinned", "0")
append("type", "1")
// todo allow custom settings
append("settings", "{\"is_show_edit_card:\"1,\"tip_window_type\":1,\"confirm_required\":1}")
if (null != image) {
append("pic", image.id)
append("imgWidth", image.width)
append("imgHeight", image.height)
}
},
block = {
headers {
header("Cookie", cookie)
}
}
)
val body = Json.decodeFromStream<JsonElement>(response.body())
return if (body.jsonObject["ec"].asInt == 0) {
Result.success(true)
} else {
Result.failure(Exception(body.jsonObject["em"].asStringOrNull))
}
}
suspend fun groupSign(groupId: Long): Result<String> {
val req = oidb_0xeb7.ReqBody()
val signInWriteReq = oidb_0xeb7.StSignInWriteReq()
signInWriteReq.groupId.set(groupId.toString())
signInWriteReq.uid.set(getUin())
var version = PlatformUtils.getClientVersion(MobileQQ.getContext())
version = version.replace("android", "").trimStart()
signInWriteReq.clientVersion.set(version)
req.signInWriteReq.set(signInWriteReq)
val buffer = sendOidbAW("OidbSvc.0xeb7", 3767, 1, req.toByteArray())
return if (buffer == null) {
Result.failure(Exception("操作失败"))
} else {
val body = oidb_sso.OIDBSSOPkg()
body.mergeFrom(buffer.slice(4))
val rsp = oidb_0xeb7.RspBody()
rsp.mergeFrom(body.bytes_bodybuffer.get().toByteArray())
val doneInfo = rsp.signInWriteRsp.doneInfo
LogCenter.log(rsp.toString(), Level.DEBUG)
Result.success("${doneInfo.leftTitleWrod.get()} ${doneInfo.rightDescWord.get()} ${doneInfo.belowPortraitWords.get().joinToString(" ")}")
}
}
}

View File

@ -1,23 +1,61 @@
@file:OptIn(DelicateCoroutinesApi::class)
package moe.fuqiuluo.qqinterface.servlet
import com.tencent.mobileqq.qroute.QRoute
import com.tencent.mobileqq.troop.api.ITroopMemberNameService
import com.tencent.qqnt.kernel.api.IKernelService
import com.tencent.qqnt.kernel.nativeinterface.IOperateCallback
import com.tencent.qqnt.kernel.nativeinterface.MsgConstant
import com.tencent.qqnt.kernel.nativeinterface.MsgRecord
import com.tencent.qqnt.kernel.nativeinterface.TempChatGameSession
import com.tencent.qqnt.kernel.nativeinterface.TempChatPrepareInfo
import com.tencent.qqnt.msg.api.IMsgService
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withTimeoutOrNull
import kotlinx.serialization.json.JsonArray
import moe.fuqiuluo.shamrock.helper.ContactHelper
import moe.fuqiuluo.shamrock.helper.Level
import moe.fuqiuluo.shamrock.helper.MessageHelper
import moe.fuqiuluo.shamrock.helper.LogCenter
import moe.fuqiuluo.shamrock.helper.MessageHelper
import moe.fuqiuluo.shamrock.helper.SendMsgException
import moe.fuqiuluo.shamrock.tools.EMPTY_BYTE_ARRAY
import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher
import moe.fuqiuluo.shamrock.xposed.helper.msgService
import java.util.UUID
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
internal object MsgSvc: BaseSvc() {
fun uploadForwardMsg(): Result<String> {
return Result.failure(Exception("Not implemented"))
}
suspend fun prepareTempChatFromGroup(
groupId: String,
peerId: String
): Result<Unit> {
LogCenter.log("主动临时消息,创建临时会话。", Level.INFO)
val msgService = app.getRuntimeService(IKernelService::class.java, "all").msgService
?: return Result.failure(Exception("获取消息服务失败"))
msgService.prepareTempChat(TempChatPrepareInfo(
MsgConstant.KCHATTYPETEMPC2CFROMGROUP,
ContactHelper.getUidByUinAsync(peerId = peerId.toLong()),
app.getRuntimeService(ITroopMemberNameService::class.java, "all")
.getTroopMemberNameRemarkFirst(groupId, peerId),
groupId, EMPTY_BYTE_ARRAY, app.currentUid, "", TempChatGameSession()
)) { code, reason ->
if (code != 0) {
LogCenter.log("临时会话创建失败: $code, $reason", Level.ERROR)
}
}
return Result.success(Unit)
}
/**
* 正常获取
*/
@ -51,6 +89,34 @@ internal object MsgSvc: BaseSvc() {
}
}
suspend fun getMsgByQMsgId(
chatType: Int,
peerId: String,
qqMsgId: Long
): Result<MsgRecord> {
val contact = MessageHelper.generateContact(chatType, peerId)
val service = QRoute.api(IMsgService::class.java) ?:
return Result.failure(Exception("获取消息服务"))
val msg = withTimeoutOrNull(5000) {
suspendCoroutine { continuation ->
service.getMsgsByMsgId(contact, arrayListOf(qqMsgId)) { code, _, msgRecords ->
if (code == 0 && msgRecords.isNotEmpty()) {
continuation.resume(msgRecords.first())
} else {
continuation.resume(null)
}
}
}
}
return if (msg != null) {
Result.success(msg)
} else {
Result.failure(Exception("获取消息失败"))
}
}
/**
* 什么鸟屎都获取不到
*/
@ -60,7 +126,7 @@ internal object MsgSvc: BaseSvc() {
seq: Long
): Result<MsgRecord> {
val contact = MessageHelper.generateContact(chatType, peerId)
val msg = withTimeoutOrNull(60 * 1000) {
val msg = withTimeoutOrNull(1000) {
val service = QRoute.api(IMsgService::class.java)
suspendCancellableCoroutine { continuation ->
service.getMsgsBySeqs(contact, arrayListOf(seq)) { code, _, msgRecords ->
@ -103,10 +169,80 @@ internal object MsgSvc: BaseSvc() {
*
* Aio 腾讯内部命名 All In One
*/
suspend fun sendToAio(chatType: Int, peedId: String, message: JsonArray): Pair<Long, Int> {
suspend fun sendToAio(
chatType: Int,
peedId: String,
message: JsonArray,
fromId: String = peedId,
retryCnt: Int = 3
): Result<Pair<Long, Int>> {
//LogCenter.log(message.toString(), Level.ERROR)
//callback.msgHash = result.second 什么垃圾代码万一cb比你快你不就寄了
return MessageHelper.sendMessageWithoutMsgId(chatType, peedId, message, MessageCallback(peedId, 0))
// 主动临时消息
when (chatType) {
MsgConstant.KCHATTYPETEMPC2CFROMGROUP -> {
prepareTempChatFromGroup(fromId, peedId).onFailure {
LogCenter.log("主动临时消息,创建临时会话失败。", Level.ERROR)
return Result.failure(Exception("主动临时消息,创建临时会话失败。"))
}
}
}
val result = MessageHelper.sendMessageWithoutMsgId(
chatType,
peedId,
message,
fromId,
MessageCallback(peedId, 0)
)
return if (result.isFailure
&& result.exceptionOrNull()?.javaClass == SendMsgException::class.java
&& retryCnt > 0) {
// 发送失败,可能网络问题出现红色感叹号,重试
// 例如 rich media transfer failed
delay(100)
sendToAio(chatType, peedId, message, fromId, retryCnt - 1)
} else {
result
}
}
suspend fun getMultiMsg(resId: String): Result<List<MsgRecord>> {
val kernelService = NTServiceFetcher.kernelService
val sessionService = kernelService.wrapperSession
val msgService = sessionService.msgService
val contact = MessageHelper.generateContact(MsgConstant.KCHATTYPEC2C, TicketSvc.getUin())
val content = "{\"app\":\"com.tencent.multimsg\",\"config\":{\"autosize\":1,\"forward\":1,\"round\":1,\"type\":\"normal\",\"width\":300},\"desc\":\"[聊天记录]\",\"extra\":\"\",\"meta\":{\"detail\":{\"news\":[{\"text\":\"Shamrock: 这是条假消息!\"}],\"resid\":\"$resId\",\"source\":\"聊天记录\",\"summary\":\"转发消息\",\"uniseq\":\"${UUID.randomUUID()}\"}},\"prompt\":\"[聊天记录]\",\"ver\":\"0.0.0.5\",\"view\":\"contact\"}"
val msgId = PacketSvc.fakeSelfRecvJsonMsg(msgService, content)
if (msgId < 0) {
return Result.failure(Exception("获取合并转发消息ID失败"))
}
val msgList = withTimeoutOrNull(5000L) {
suspendCancellableCoroutine<ArrayList<MsgRecord>> {
val job = GlobalScope.launch {
var hasResult = false
while (!hasResult) {
msgService.getMultiMsg(contact, msgId, msgId) { code, why, msgList ->
if (code == 0) {
it.resume(msgList)
hasResult = true
} else {
LogCenter.log("获取合并转发消息失败: $code($why): $msgId", Level.ERROR)
}
}
delay(200)
}
}
it.invokeOnCancellation {
job.cancel()
}
}
} ?: return Result.failure(Exception("获取合并转发消息失败"))
//msgService.deleteMsg(contact, arrayListOf(msgId), null)
return Result.success(msgList)
}
class MessageCallback(

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