@@ -1,185 +0,0 @@
|
|||||||
{
|
|
||||||
"result": {
|
|
||||||
"tab_list": [
|
|
||||||
{
|
|
||||||
"tab_name": "μ’s",
|
|
||||||
"asset_list": [
|
|
||||||
{
|
|
||||||
"unit_type_id": 1,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_1.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 2,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_2.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 3,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_3.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 4,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_4.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 5,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_5.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 6,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_6.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 7,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_7.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 8,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_8.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 9,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_9.png"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"tab_name": "Aqours",
|
|
||||||
"asset_list": [
|
|
||||||
{
|
|
||||||
"unit_type_id": 101,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_10.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 102,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_11.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 103,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_12.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 104,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_13.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 105,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_14.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 106,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_15.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 107,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_16.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 108,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_17.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 109,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_18.png"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"tab_name": "虹咲",
|
|
||||||
"asset_list": [
|
|
||||||
{
|
|
||||||
"unit_type_id": 201,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_24.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 202,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_25.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 203,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_26.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 204,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_27.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 205,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_28.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 206,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_29.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 207,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_30.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 208,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_31.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 209,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_32.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 212,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_33.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 213,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_34.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 214,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_35.png"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"tab_name": "Liella!",
|
|
||||||
"asset_list": [
|
|
||||||
{
|
|
||||||
"unit_type_id": 301,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_19.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 302,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_20.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 303,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_21.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 304,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_22.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 305,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_23.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 306,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_36.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 307,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_37.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 308,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_38.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unit_type_id": 309,
|
|
||||||
"asset_path": "assets/image/accessory/list/list_39.png"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"status": 200,
|
|
||||||
"commandNum": false,
|
|
||||||
"timeStamp": 1679237529
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"tab_name": "μ’s",
|
||||||
|
"asset_list": [
|
||||||
|
{
|
||||||
|
"unit_type_id": 1,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_1.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 2,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_2.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 3,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_3.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 4,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_4.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 5,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_5.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 6,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_6.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 7,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_7.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 8,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_8.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 9,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_9.png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tab_name": "Aqours",
|
||||||
|
"asset_list": [
|
||||||
|
{
|
||||||
|
"unit_type_id": 101,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_10.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 102,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_11.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 103,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_12.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 104,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_13.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 105,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_14.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 106,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_15.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 107,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_16.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 108,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_17.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 109,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_18.png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tab_name": "虹咲",
|
||||||
|
"asset_list": [
|
||||||
|
{
|
||||||
|
"unit_type_id": 201,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_24.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 202,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_25.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 203,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_26.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 204,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_27.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 205,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_28.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 206,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_29.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 207,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_30.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 208,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_31.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 209,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_32.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 212,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_33.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 213,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_34.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 214,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_35.png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tab_name": "Liella!",
|
||||||
|
"asset_list": [
|
||||||
|
{
|
||||||
|
"unit_type_id": 301,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_19.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 302,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_20.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 303,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_21.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 304,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_22.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 305,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_23.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 306,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_36.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 307,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_37.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 308,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_38.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unit_type_id": 309,
|
||||||
|
"asset_path": "assets/image/accessory/list/list_39.png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,110 +0,0 @@
|
|||||||
{
|
|
||||||
"response_data": {
|
|
||||||
"clear_scenario": {
|
|
||||||
"scenario_id": 3244
|
|
||||||
},
|
|
||||||
"before_user_info": {
|
|
||||||
"level": 1028,
|
|
||||||
"exp": 28853572,
|
|
||||||
"previous_exp": 27734700,
|
|
||||||
"next_exp": 28941885,
|
|
||||||
"game_coin": 112462154,
|
|
||||||
"sns_coin": 11,
|
|
||||||
"free_sns_coin": 11,
|
|
||||||
"paid_sns_coin": 0,
|
|
||||||
"social_point": 1442340,
|
|
||||||
"unit_max": 904,
|
|
||||||
"waiting_unit_max": 700,
|
|
||||||
"current_energy": 222,
|
|
||||||
"energy_max": 417,
|
|
||||||
"training_energy": 8,
|
|
||||||
"training_energy_max": 10,
|
|
||||||
"energy_full_time": "2023-03-30 23:05:52",
|
|
||||||
"license_live_energy_recoverly_time": 60,
|
|
||||||
"friend_max": 99,
|
|
||||||
"tutorial_state": -1,
|
|
||||||
"over_max_energy": 0,
|
|
||||||
"unlock_random_live_muse": 1,
|
|
||||||
"unlock_random_live_aqours": 1
|
|
||||||
},
|
|
||||||
"after_user_info": {
|
|
||||||
"level": 1028,
|
|
||||||
"exp": 28853572,
|
|
||||||
"previous_exp": 27734700,
|
|
||||||
"next_exp": 28941885,
|
|
||||||
"game_coin": 112482154,
|
|
||||||
"sns_coin": 12,
|
|
||||||
"free_sns_coin": 12,
|
|
||||||
"paid_sns_coin": 0,
|
|
||||||
"social_point": 1442340,
|
|
||||||
"unit_max": 904,
|
|
||||||
"waiting_unit_max": 700,
|
|
||||||
"current_energy": 222,
|
|
||||||
"energy_max": 417,
|
|
||||||
"training_energy": 8,
|
|
||||||
"training_energy_max": 10,
|
|
||||||
"energy_full_time": "2023-03-30 23:05:52",
|
|
||||||
"license_live_energy_recoverly_time": 60,
|
|
||||||
"friend_max": 99,
|
|
||||||
"tutorial_state": -1,
|
|
||||||
"over_max_energy": 0,
|
|
||||||
"unlock_random_live_muse": 1,
|
|
||||||
"unlock_random_live_aqours": 1
|
|
||||||
},
|
|
||||||
"next_level_info": [
|
|
||||||
{
|
|
||||||
"level": 1028,
|
|
||||||
"from_exp": 28853572
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"base_reward_info": {
|
|
||||||
"game_coin_reward_box_flag": false,
|
|
||||||
"game_coin": 20000
|
|
||||||
},
|
|
||||||
"item_reward_info": [
|
|
||||||
{
|
|
||||||
"add_type": 3001,
|
|
||||||
"reward_item_id": 4,
|
|
||||||
"item_category_id": 0,
|
|
||||||
"amount": 1,
|
|
||||||
"comment": "\u652f\u7ebf\u5267\u60c5\u5b8c\u6210\uff01",
|
|
||||||
"reward_box_flag": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"class_system": {
|
|
||||||
"rank_info": {
|
|
||||||
"before_class_rank_id": 10,
|
|
||||||
"after_class_rank_id": 10,
|
|
||||||
"rank_up_date": "2020-02-12 11:57:15"
|
|
||||||
},
|
|
||||||
"complete_flag": false,
|
|
||||||
"is_opened": true,
|
|
||||||
"is_visible": true
|
|
||||||
},
|
|
||||||
"museum_info": {
|
|
||||||
"parameter": {
|
|
||||||
"smile": 228,
|
|
||||||
"pure": 300,
|
|
||||||
"cool": 372
|
|
||||||
},
|
|
||||||
"contents_id_list": [
|
|
||||||
1597,
|
|
||||||
1598,
|
|
||||||
1599,
|
|
||||||
1600,
|
|
||||||
1601,
|
|
||||||
1694,
|
|
||||||
1695,
|
|
||||||
1696,
|
|
||||||
1697,
|
|
||||||
1699,
|
|
||||||
1700,
|
|
||||||
1701
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"server_timestamp": 1680118815,
|
|
||||||
"present_cnt": 0
|
|
||||||
},
|
|
||||||
"release_info": [],
|
|
||||||
"status_code": 200
|
|
||||||
}
|
|
||||||
@@ -1,708 +0,0 @@
|
|||||||
{
|
|
||||||
"result": {
|
|
||||||
"owning_stamp_ids": [
|
|
||||||
1001,
|
|
||||||
1002,
|
|
||||||
1003,
|
|
||||||
1004,
|
|
||||||
1005,
|
|
||||||
1006,
|
|
||||||
1007,
|
|
||||||
1008,
|
|
||||||
1009,
|
|
||||||
1,
|
|
||||||
2,
|
|
||||||
19,
|
|
||||||
28,
|
|
||||||
3,
|
|
||||||
4,
|
|
||||||
20,
|
|
||||||
29,
|
|
||||||
5,
|
|
||||||
6,
|
|
||||||
21,
|
|
||||||
30,
|
|
||||||
7,
|
|
||||||
8,
|
|
||||||
22,
|
|
||||||
31,
|
|
||||||
9,
|
|
||||||
10,
|
|
||||||
23,
|
|
||||||
32,
|
|
||||||
11,
|
|
||||||
12,
|
|
||||||
24,
|
|
||||||
33,
|
|
||||||
13,
|
|
||||||
14,
|
|
||||||
25,
|
|
||||||
34,
|
|
||||||
15,
|
|
||||||
16,
|
|
||||||
26,
|
|
||||||
35,
|
|
||||||
17,
|
|
||||||
18,
|
|
||||||
27,
|
|
||||||
36,
|
|
||||||
201,
|
|
||||||
101,
|
|
||||||
102,
|
|
||||||
119,
|
|
||||||
128,
|
|
||||||
103,
|
|
||||||
104,
|
|
||||||
120,
|
|
||||||
129,
|
|
||||||
105,
|
|
||||||
106,
|
|
||||||
121,
|
|
||||||
130,
|
|
||||||
107,
|
|
||||||
108,
|
|
||||||
122,
|
|
||||||
131,
|
|
||||||
109,
|
|
||||||
110,
|
|
||||||
123,
|
|
||||||
132,
|
|
||||||
111,
|
|
||||||
112,
|
|
||||||
124,
|
|
||||||
133,
|
|
||||||
113,
|
|
||||||
114,
|
|
||||||
125,
|
|
||||||
134,
|
|
||||||
115,
|
|
||||||
116,
|
|
||||||
126,
|
|
||||||
135,
|
|
||||||
117,
|
|
||||||
118,
|
|
||||||
127,
|
|
||||||
136,
|
|
||||||
301,
|
|
||||||
401,
|
|
||||||
402,
|
|
||||||
10001,
|
|
||||||
10002
|
|
||||||
],
|
|
||||||
"stamp_setting": [
|
|
||||||
{
|
|
||||||
"stamp_type": 1,
|
|
||||||
"setting_list": [
|
|
||||||
{
|
|
||||||
"stamp_setting_id": 1,
|
|
||||||
"main_flag": 1,
|
|
||||||
"stamp_list": [
|
|
||||||
{
|
|
||||||
"position": 1,
|
|
||||||
"stamp_id": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 2,
|
|
||||||
"stamp_id": 17
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 3,
|
|
||||||
"stamp_id": 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 4,
|
|
||||||
"stamp_id": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 5,
|
|
||||||
"stamp_id": 19
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 6,
|
|
||||||
"stamp_id": 15
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 7,
|
|
||||||
"stamp_id": 28
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 8,
|
|
||||||
"stamp_id": 16
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 9,
|
|
||||||
"stamp_id": 5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 10,
|
|
||||||
"stamp_id": 12
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 11,
|
|
||||||
"stamp_id": 6
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 12,
|
|
||||||
"stamp_id": 109
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 13,
|
|
||||||
"stamp_id": 21
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 14,
|
|
||||||
"stamp_id": 110
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 15,
|
|
||||||
"stamp_id": 30
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 16,
|
|
||||||
"stamp_id": 112
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 17,
|
|
||||||
"stamp_id": 128
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 18,
|
|
||||||
"stamp_id": 117
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"stamp_setting_id": 2,
|
|
||||||
"main_flag": 0,
|
|
||||||
"stamp_list": [
|
|
||||||
{
|
|
||||||
"position": 1,
|
|
||||||
"stamp_id": 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 2,
|
|
||||||
"stamp_id": 119
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 3,
|
|
||||||
"stamp_id": 3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 4,
|
|
||||||
"stamp_id": 103
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 5,
|
|
||||||
"stamp_id": 21
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 6,
|
|
||||||
"stamp_id": 121
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 7,
|
|
||||||
"stamp_id": 22
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 8,
|
|
||||||
"stamp_id": 108
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 9,
|
|
||||||
"stamp_id": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 10,
|
|
||||||
"stamp_id": 110
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 11,
|
|
||||||
"stamp_id": 11
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 12,
|
|
||||||
"stamp_id": 112
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 13,
|
|
||||||
"stamp_id": 14
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 14,
|
|
||||||
"stamp_id": 113
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 15,
|
|
||||||
"stamp_id": 16
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 16,
|
|
||||||
"stamp_id": 126
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 17,
|
|
||||||
"stamp_id": 17
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 18,
|
|
||||||
"stamp_id": 117
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"stamp_setting_id": 3,
|
|
||||||
"main_flag": 0,
|
|
||||||
"stamp_list": [
|
|
||||||
{
|
|
||||||
"position": 1,
|
|
||||||
"stamp_id": 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 2,
|
|
||||||
"stamp_id": 101
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 3,
|
|
||||||
"stamp_id": 4
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 4,
|
|
||||||
"stamp_id": 103
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 5,
|
|
||||||
"stamp_id": 5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 6,
|
|
||||||
"stamp_id": 105
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 7,
|
|
||||||
"stamp_id": 7
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 8,
|
|
||||||
"stamp_id": 108
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 9,
|
|
||||||
"stamp_id": 10
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 10,
|
|
||||||
"stamp_id": 110
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 11,
|
|
||||||
"stamp_id": 12
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 12,
|
|
||||||
"stamp_id": 112
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 13,
|
|
||||||
"stamp_id": 13
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 14,
|
|
||||||
"stamp_id": 114
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 15,
|
|
||||||
"stamp_id": 16
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 16,
|
|
||||||
"stamp_id": 116
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 17,
|
|
||||||
"stamp_id": 17
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 18,
|
|
||||||
"stamp_id": 117
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"stamp_setting_id": 4,
|
|
||||||
"main_flag": 0,
|
|
||||||
"stamp_list": [
|
|
||||||
{
|
|
||||||
"position": 1,
|
|
||||||
"stamp_id": 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 2,
|
|
||||||
"stamp_id": 101
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 3,
|
|
||||||
"stamp_id": 4
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 4,
|
|
||||||
"stamp_id": 103
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 5,
|
|
||||||
"stamp_id": 5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 6,
|
|
||||||
"stamp_id": 105
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 7,
|
|
||||||
"stamp_id": 7
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 8,
|
|
||||||
"stamp_id": 108
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 9,
|
|
||||||
"stamp_id": 10
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 10,
|
|
||||||
"stamp_id": 110
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 11,
|
|
||||||
"stamp_id": 12
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 12,
|
|
||||||
"stamp_id": 112
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 13,
|
|
||||||
"stamp_id": 13
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 14,
|
|
||||||
"stamp_id": 114
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 15,
|
|
||||||
"stamp_id": 16
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 16,
|
|
||||||
"stamp_id": 116
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 17,
|
|
||||||
"stamp_id": 17
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 18,
|
|
||||||
"stamp_id": 117
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"stamp_setting_id": 5,
|
|
||||||
"main_flag": 0,
|
|
||||||
"stamp_list": [
|
|
||||||
{
|
|
||||||
"position": 1,
|
|
||||||
"stamp_id": 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 2,
|
|
||||||
"stamp_id": 101
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 3,
|
|
||||||
"stamp_id": 4
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 4,
|
|
||||||
"stamp_id": 103
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 5,
|
|
||||||
"stamp_id": 5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 6,
|
|
||||||
"stamp_id": 105
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 7,
|
|
||||||
"stamp_id": 7
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 8,
|
|
||||||
"stamp_id": 108
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 9,
|
|
||||||
"stamp_id": 10
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 10,
|
|
||||||
"stamp_id": 110
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 11,
|
|
||||||
"stamp_id": 12
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 12,
|
|
||||||
"stamp_id": 112
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 13,
|
|
||||||
"stamp_id": 13
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 14,
|
|
||||||
"stamp_id": 114
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 15,
|
|
||||||
"stamp_id": 16
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 16,
|
|
||||||
"stamp_id": 116
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 17,
|
|
||||||
"stamp_id": 17
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 18,
|
|
||||||
"stamp_id": 117
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"stamp_type": 2,
|
|
||||||
"setting_list": [
|
|
||||||
{
|
|
||||||
"stamp_setting_id": 1,
|
|
||||||
"main_flag": 1,
|
|
||||||
"stamp_list": [
|
|
||||||
{
|
|
||||||
"position": 1,
|
|
||||||
"stamp_id": 1001
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 2,
|
|
||||||
"stamp_id": 1002
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 3,
|
|
||||||
"stamp_id": 1003
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 4,
|
|
||||||
"stamp_id": 1004
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 5,
|
|
||||||
"stamp_id": 1005
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 6,
|
|
||||||
"stamp_id": 1006
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 7,
|
|
||||||
"stamp_id": 1007
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 8,
|
|
||||||
"stamp_id": 1008
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 9,
|
|
||||||
"stamp_id": 1009
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"stamp_setting_id": 2,
|
|
||||||
"main_flag": 0,
|
|
||||||
"stamp_list": [
|
|
||||||
{
|
|
||||||
"position": 1,
|
|
||||||
"stamp_id": 1001
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 2,
|
|
||||||
"stamp_id": 1002
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 3,
|
|
||||||
"stamp_id": 1003
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 4,
|
|
||||||
"stamp_id": 1004
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 5,
|
|
||||||
"stamp_id": 1005
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 6,
|
|
||||||
"stamp_id": 1006
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 7,
|
|
||||||
"stamp_id": 1007
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 8,
|
|
||||||
"stamp_id": 1008
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 9,
|
|
||||||
"stamp_id": 1009
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"stamp_setting_id": 3,
|
|
||||||
"main_flag": 0,
|
|
||||||
"stamp_list": [
|
|
||||||
{
|
|
||||||
"position": 1,
|
|
||||||
"stamp_id": 1001
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 2,
|
|
||||||
"stamp_id": 1002
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 3,
|
|
||||||
"stamp_id": 1003
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 4,
|
|
||||||
"stamp_id": 1004
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 5,
|
|
||||||
"stamp_id": 1005
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 6,
|
|
||||||
"stamp_id": 1006
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 7,
|
|
||||||
"stamp_id": 1007
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 8,
|
|
||||||
"stamp_id": 1008
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 9,
|
|
||||||
"stamp_id": 1009
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"stamp_setting_id": 4,
|
|
||||||
"main_flag": 0,
|
|
||||||
"stamp_list": [
|
|
||||||
{
|
|
||||||
"position": 1,
|
|
||||||
"stamp_id": 1001
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 2,
|
|
||||||
"stamp_id": 1002
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 3,
|
|
||||||
"stamp_id": 1003
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 4,
|
|
||||||
"stamp_id": 1004
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 5,
|
|
||||||
"stamp_id": 1005
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 6,
|
|
||||||
"stamp_id": 1006
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 7,
|
|
||||||
"stamp_id": 1007
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 8,
|
|
||||||
"stamp_id": 1008
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 9,
|
|
||||||
"stamp_id": 1009
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"stamp_setting_id": 5,
|
|
||||||
"main_flag": 0,
|
|
||||||
"stamp_list": [
|
|
||||||
{
|
|
||||||
"position": 1,
|
|
||||||
"stamp_id": 1001
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 2,
|
|
||||||
"stamp_id": 1002
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 3,
|
|
||||||
"stamp_id": 1003
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 4,
|
|
||||||
"stamp_id": 1004
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 5,
|
|
||||||
"stamp_id": 1005
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 6,
|
|
||||||
"stamp_id": 1006
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 7,
|
|
||||||
"stamp_id": 1007
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 8,
|
|
||||||
"stamp_id": 1008
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"position": 9,
|
|
||||||
"stamp_id": 1009
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"status": 200,
|
|
||||||
"commandNum": false,
|
|
||||||
"timeStamp": 1680244575
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,559 @@
|
|||||||
|
{
|
||||||
|
"owning_stamp_ids": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
4,
|
||||||
|
5,
|
||||||
|
6,
|
||||||
|
7,
|
||||||
|
8,
|
||||||
|
9,
|
||||||
|
10,
|
||||||
|
11,
|
||||||
|
12,
|
||||||
|
13,
|
||||||
|
14,
|
||||||
|
15,
|
||||||
|
16,
|
||||||
|
17,
|
||||||
|
18,
|
||||||
|
19,
|
||||||
|
20,
|
||||||
|
21,
|
||||||
|
22,
|
||||||
|
23,
|
||||||
|
24,
|
||||||
|
25,
|
||||||
|
26,
|
||||||
|
27,
|
||||||
|
28,
|
||||||
|
29,
|
||||||
|
30,
|
||||||
|
31,
|
||||||
|
32,
|
||||||
|
33,
|
||||||
|
34,
|
||||||
|
35,
|
||||||
|
36,
|
||||||
|
37,
|
||||||
|
38,
|
||||||
|
39,
|
||||||
|
40,
|
||||||
|
41,
|
||||||
|
42,
|
||||||
|
43,
|
||||||
|
44,
|
||||||
|
45,
|
||||||
|
46,
|
||||||
|
47,
|
||||||
|
48,
|
||||||
|
49,
|
||||||
|
50,
|
||||||
|
51,
|
||||||
|
52,
|
||||||
|
53,
|
||||||
|
54,
|
||||||
|
101,
|
||||||
|
102,
|
||||||
|
103,
|
||||||
|
104,
|
||||||
|
105,
|
||||||
|
106,
|
||||||
|
107,
|
||||||
|
108,
|
||||||
|
109,
|
||||||
|
110,
|
||||||
|
111,
|
||||||
|
112,
|
||||||
|
113,
|
||||||
|
114,
|
||||||
|
115,
|
||||||
|
116,
|
||||||
|
117,
|
||||||
|
118,
|
||||||
|
119,
|
||||||
|
120,
|
||||||
|
121,
|
||||||
|
122,
|
||||||
|
123,
|
||||||
|
124,
|
||||||
|
125,
|
||||||
|
126,
|
||||||
|
127,
|
||||||
|
128,
|
||||||
|
129,
|
||||||
|
130,
|
||||||
|
131,
|
||||||
|
132,
|
||||||
|
133,
|
||||||
|
134,
|
||||||
|
135,
|
||||||
|
136,
|
||||||
|
137,
|
||||||
|
138,
|
||||||
|
139,
|
||||||
|
140,
|
||||||
|
141,
|
||||||
|
142,
|
||||||
|
143,
|
||||||
|
144,
|
||||||
|
145,
|
||||||
|
146,
|
||||||
|
147,
|
||||||
|
148,
|
||||||
|
149,
|
||||||
|
150,
|
||||||
|
151,
|
||||||
|
152,
|
||||||
|
153,
|
||||||
|
154,
|
||||||
|
201,
|
||||||
|
301,
|
||||||
|
401,
|
||||||
|
402,
|
||||||
|
1001,
|
||||||
|
1002,
|
||||||
|
1003,
|
||||||
|
1004,
|
||||||
|
1005,
|
||||||
|
1006,
|
||||||
|
1007,
|
||||||
|
1008,
|
||||||
|
1009,
|
||||||
|
10001,
|
||||||
|
10002
|
||||||
|
],
|
||||||
|
"stamp_setting": [
|
||||||
|
{
|
||||||
|
"stamp_type": 1,
|
||||||
|
"setting_list": [
|
||||||
|
{
|
||||||
|
"stamp_setting_id": 1,
|
||||||
|
"main_flag": 1,
|
||||||
|
"stamp_list": [
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"stamp_id": 1001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 2,
|
||||||
|
"stamp_id": 1002
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 3,
|
||||||
|
"stamp_id": 1003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 4,
|
||||||
|
"stamp_id": 1004
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 5,
|
||||||
|
"stamp_id": 1005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 6,
|
||||||
|
"stamp_id": 1006
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 7,
|
||||||
|
"stamp_id": 1007
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 8,
|
||||||
|
"stamp_id": 1008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 9,
|
||||||
|
"stamp_id": 1009
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stamp_setting_id": 2,
|
||||||
|
"main_flag": 0,
|
||||||
|
"stamp_list": [
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"stamp_id": 1001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 2,
|
||||||
|
"stamp_id": 1002
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 3,
|
||||||
|
"stamp_id": 1003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 4,
|
||||||
|
"stamp_id": 1004
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 5,
|
||||||
|
"stamp_id": 1005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 6,
|
||||||
|
"stamp_id": 1006
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 7,
|
||||||
|
"stamp_id": 1007
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 8,
|
||||||
|
"stamp_id": 1008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 9,
|
||||||
|
"stamp_id": 1009
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stamp_setting_id": 3,
|
||||||
|
"main_flag": 0,
|
||||||
|
"stamp_list": [
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"stamp_id": 1001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 2,
|
||||||
|
"stamp_id": 1002
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 3,
|
||||||
|
"stamp_id": 1003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 4,
|
||||||
|
"stamp_id": 1004
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 5,
|
||||||
|
"stamp_id": 1005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 6,
|
||||||
|
"stamp_id": 1006
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 7,
|
||||||
|
"stamp_id": 1007
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 8,
|
||||||
|
"stamp_id": 1008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 9,
|
||||||
|
"stamp_id": 1009
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stamp_setting_id": 4,
|
||||||
|
"main_flag": 0,
|
||||||
|
"stamp_list": [
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"stamp_id": 1001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 2,
|
||||||
|
"stamp_id": 1002
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 3,
|
||||||
|
"stamp_id": 1003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 4,
|
||||||
|
"stamp_id": 1004
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 5,
|
||||||
|
"stamp_id": 1005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 6,
|
||||||
|
"stamp_id": 1006
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 7,
|
||||||
|
"stamp_id": 1007
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 8,
|
||||||
|
"stamp_id": 1008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 9,
|
||||||
|
"stamp_id": 1009
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stamp_setting_id": 5,
|
||||||
|
"main_flag": 0,
|
||||||
|
"stamp_list": [
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"stamp_id": 1001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 2,
|
||||||
|
"stamp_id": 1002
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 3,
|
||||||
|
"stamp_id": 1003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 4,
|
||||||
|
"stamp_id": 1004
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 5,
|
||||||
|
"stamp_id": 1005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 6,
|
||||||
|
"stamp_id": 1006
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 7,
|
||||||
|
"stamp_id": 1007
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 8,
|
||||||
|
"stamp_id": 1008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 9,
|
||||||
|
"stamp_id": 1009
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stamp_type": 2,
|
||||||
|
"setting_list": [
|
||||||
|
{
|
||||||
|
"stamp_setting_id": 1,
|
||||||
|
"main_flag": 1,
|
||||||
|
"stamp_list": [
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"stamp_id": 1001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 2,
|
||||||
|
"stamp_id": 1002
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 3,
|
||||||
|
"stamp_id": 1003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 4,
|
||||||
|
"stamp_id": 1004
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 5,
|
||||||
|
"stamp_id": 1005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 6,
|
||||||
|
"stamp_id": 1006
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 7,
|
||||||
|
"stamp_id": 1007
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 8,
|
||||||
|
"stamp_id": 1008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 9,
|
||||||
|
"stamp_id": 1009
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stamp_setting_id": 2,
|
||||||
|
"main_flag": 0,
|
||||||
|
"stamp_list": [
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"stamp_id": 1001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 2,
|
||||||
|
"stamp_id": 1002
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 3,
|
||||||
|
"stamp_id": 1003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 4,
|
||||||
|
"stamp_id": 1004
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 5,
|
||||||
|
"stamp_id": 1005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 6,
|
||||||
|
"stamp_id": 1006
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 7,
|
||||||
|
"stamp_id": 1007
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 8,
|
||||||
|
"stamp_id": 1008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 9,
|
||||||
|
"stamp_id": 1009
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stamp_setting_id": 3,
|
||||||
|
"main_flag": 0,
|
||||||
|
"stamp_list": [
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"stamp_id": 1001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 2,
|
||||||
|
"stamp_id": 1002
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 3,
|
||||||
|
"stamp_id": 1003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 4,
|
||||||
|
"stamp_id": 1004
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 5,
|
||||||
|
"stamp_id": 1005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 6,
|
||||||
|
"stamp_id": 1006
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 7,
|
||||||
|
"stamp_id": 1007
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 8,
|
||||||
|
"stamp_id": 1008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 9,
|
||||||
|
"stamp_id": 1009
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stamp_setting_id": 4,
|
||||||
|
"main_flag": 0,
|
||||||
|
"stamp_list": [
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"stamp_id": 1001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 2,
|
||||||
|
"stamp_id": 1002
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 3,
|
||||||
|
"stamp_id": 1003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 4,
|
||||||
|
"stamp_id": 1004
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 5,
|
||||||
|
"stamp_id": 1005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 6,
|
||||||
|
"stamp_id": 1006
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 7,
|
||||||
|
"stamp_id": 1007
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 8,
|
||||||
|
"stamp_id": 1008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 9,
|
||||||
|
"stamp_id": 1009
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stamp_setting_id": 5,
|
||||||
|
"main_flag": 0,
|
||||||
|
"stamp_list": [
|
||||||
|
{
|
||||||
|
"position": 1,
|
||||||
|
"stamp_id": 1001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 2,
|
||||||
|
"stamp_id": 1002
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 3,
|
||||||
|
"stamp_id": 1003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 4,
|
||||||
|
"stamp_id": 1004
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 5,
|
||||||
|
"stamp_id": 1005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 6,
|
||||||
|
"stamp_id": 1006
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 7,
|
||||||
|
"stamp_id": 1007
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 8,
|
||||||
|
"stamp_id": 1008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": 9,
|
||||||
|
"stamp_id": 1009
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,110 +0,0 @@
|
|||||||
{
|
|
||||||
"response_data": {
|
|
||||||
"clear_subscenario": {
|
|
||||||
"subscenario_id": 3244
|
|
||||||
},
|
|
||||||
"before_user_info": {
|
|
||||||
"level": 1028,
|
|
||||||
"exp": 28853572,
|
|
||||||
"previous_exp": 27734700,
|
|
||||||
"next_exp": 28941885,
|
|
||||||
"game_coin": 112462154,
|
|
||||||
"sns_coin": 11,
|
|
||||||
"free_sns_coin": 11,
|
|
||||||
"paid_sns_coin": 0,
|
|
||||||
"social_point": 1442340,
|
|
||||||
"unit_max": 904,
|
|
||||||
"waiting_unit_max": 700,
|
|
||||||
"current_energy": 222,
|
|
||||||
"energy_max": 417,
|
|
||||||
"training_energy": 8,
|
|
||||||
"training_energy_max": 10,
|
|
||||||
"energy_full_time": "2023-03-30 23:05:52",
|
|
||||||
"license_live_energy_recoverly_time": 60,
|
|
||||||
"friend_max": 99,
|
|
||||||
"tutorial_state": -1,
|
|
||||||
"over_max_energy": 0,
|
|
||||||
"unlock_random_live_muse": 1,
|
|
||||||
"unlock_random_live_aqours": 1
|
|
||||||
},
|
|
||||||
"after_user_info": {
|
|
||||||
"level": 1028,
|
|
||||||
"exp": 28853572,
|
|
||||||
"previous_exp": 27734700,
|
|
||||||
"next_exp": 28941885,
|
|
||||||
"game_coin": 112482154,
|
|
||||||
"sns_coin": 12,
|
|
||||||
"free_sns_coin": 12,
|
|
||||||
"paid_sns_coin": 0,
|
|
||||||
"social_point": 1442340,
|
|
||||||
"unit_max": 904,
|
|
||||||
"waiting_unit_max": 700,
|
|
||||||
"current_energy": 222,
|
|
||||||
"energy_max": 417,
|
|
||||||
"training_energy": 8,
|
|
||||||
"training_energy_max": 10,
|
|
||||||
"energy_full_time": "2023-03-30 23:05:52",
|
|
||||||
"license_live_energy_recoverly_time": 60,
|
|
||||||
"friend_max": 99,
|
|
||||||
"tutorial_state": -1,
|
|
||||||
"over_max_energy": 0,
|
|
||||||
"unlock_random_live_muse": 1,
|
|
||||||
"unlock_random_live_aqours": 1
|
|
||||||
},
|
|
||||||
"next_level_info": [
|
|
||||||
{
|
|
||||||
"level": 1028,
|
|
||||||
"from_exp": 28853572
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"base_reward_info": {
|
|
||||||
"game_coin_reward_box_flag": false,
|
|
||||||
"game_coin": 20000
|
|
||||||
},
|
|
||||||
"item_reward_info": [
|
|
||||||
{
|
|
||||||
"add_type": 3001,
|
|
||||||
"reward_item_id": 4,
|
|
||||||
"item_category_id": 0,
|
|
||||||
"amount": 1,
|
|
||||||
"comment": "\u652f\u7ebf\u5267\u60c5\u5b8c\u6210\uff01",
|
|
||||||
"reward_box_flag": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"class_system": {
|
|
||||||
"rank_info": {
|
|
||||||
"before_class_rank_id": 10,
|
|
||||||
"after_class_rank_id": 10,
|
|
||||||
"rank_up_date": "2020-02-12 11:57:15"
|
|
||||||
},
|
|
||||||
"complete_flag": false,
|
|
||||||
"is_opened": true,
|
|
||||||
"is_visible": true
|
|
||||||
},
|
|
||||||
"museum_info": {
|
|
||||||
"parameter": {
|
|
||||||
"smile": 228,
|
|
||||||
"pure": 300,
|
|
||||||
"cool": 372
|
|
||||||
},
|
|
||||||
"contents_id_list": [
|
|
||||||
1597,
|
|
||||||
1598,
|
|
||||||
1599,
|
|
||||||
1600,
|
|
||||||
1601,
|
|
||||||
1694,
|
|
||||||
1695,
|
|
||||||
1696,
|
|
||||||
1697,
|
|
||||||
1699,
|
|
||||||
1700,
|
|
||||||
1701
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"server_timestamp": 1680118815,
|
|
||||||
"present_cnt": 0
|
|
||||||
},
|
|
||||||
"release_info": [],
|
|
||||||
"status_code": 200
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 106 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 144 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 133 KiB |
@@ -15,7 +15,7 @@ require (
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/bytedance/gopkg v0.1.4 // indirect
|
github.com/bytedance/gopkg v0.1.4 // indirect
|
||||||
github.com/bytedance/sonic v1.15.1 // indirect
|
github.com/bytedance/sonic v1.15.2 // indirect
|
||||||
github.com/bytedance/sonic/loader v0.5.1 // indirect
|
github.com/bytedance/sonic/loader v0.5.1 // indirect
|
||||||
github.com/cloudwego/base64x v0.1.7 // indirect
|
github.com/cloudwego/base64x v0.1.7 // indirect
|
||||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||||
@@ -48,7 +48,6 @@ require (
|
|||||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||||
github.com/go-playground/validator/v10 v10.30.3 // indirect
|
github.com/go-playground/validator/v10 v10.30.3 // indirect
|
||||||
github.com/goccy/go-json v0.10.6 // indirect
|
github.com/goccy/go-json v0.10.6 // indirect
|
||||||
github.com/google/gopacket v1.1.19
|
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/leodido/go-urn v1.4.0 // indirect
|
github.com/leodido/go-urn v1.4.0 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.22 // indirect
|
github.com/mattn/go-isatty v0.0.22 // indirect
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGq
|
|||||||
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
|
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
|
||||||
github.com/bytedance/gopkg v0.1.4 h1:oZnQwnX82KAIWb7033bEwtxvTqXcYMxDBaQxo5JJHWM=
|
github.com/bytedance/gopkg v0.1.4 h1:oZnQwnX82KAIWb7033bEwtxvTqXcYMxDBaQxo5JJHWM=
|
||||||
github.com/bytedance/gopkg v0.1.4/go.mod h1:v1zWfPm21Fb+OsyXN2VAHdL6TBb2L88anLQgdyje6R4=
|
github.com/bytedance/gopkg v0.1.4/go.mod h1:v1zWfPm21Fb+OsyXN2VAHdL6TBb2L88anLQgdyje6R4=
|
||||||
github.com/bytedance/sonic v1.15.1 h1:nJD5PmM0vY7J8CT6MxoqbVAAMhkSmV2HgRAUrrpLoOw=
|
github.com/bytedance/sonic v1.15.2 h1:90H+rcF/FwLXwfB1cudOLq/je83n683Utf4Cbp0xHCo=
|
||||||
github.com/bytedance/sonic v1.15.1/go.mod h1:mT2NbXunuaEbnZ+mRIX/vYqKISmgEuHFDI4UzmKx2SA=
|
github.com/bytedance/sonic v1.15.2/go.mod h1:mT2NbXunuaEbnZ+mRIX/vYqKISmgEuHFDI4UzmKx2SA=
|
||||||
github.com/bytedance/sonic/loader v0.5.1 h1:Ygpfa9zwRCCKSlrp5bBP/b/Xzc3VxsAW+5NIYXrOOpI=
|
github.com/bytedance/sonic/loader v0.5.1 h1:Ygpfa9zwRCCKSlrp5bBP/b/Xzc3VxsAW+5NIYXrOOpI=
|
||||||
github.com/bytedance/sonic/loader v0.5.1/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo=
|
github.com/bytedance/sonic/loader v0.5.1/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo=
|
||||||
github.com/cloudwego/base64x v0.1.7 h1:NppS+Fgzg5ovhn4NkUXaDT3x9jldgH5ToMCqzBSi2zI=
|
github.com/cloudwego/base64x v0.1.7 h1:NppS+Fgzg5ovhn4NkUXaDT3x9jldgH5ToMCqzBSi2zI=
|
||||||
@@ -49,8 +49,6 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX
|
|||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
||||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
|
|
||||||
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
|
|
||||||
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
|
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
|
||||||
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
|
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
@@ -126,35 +124,24 @@ go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
|
|||||||
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
|
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
|
||||||
golang.org/x/arch v0.27.0 h1:0WNVcR8u9yFz8j5FvdHpgwNp3FS5U4guYdzHwEiGjoU=
|
golang.org/x/arch v0.27.0 h1:0WNVcR8u9yFz8j5FvdHpgwNp3FS5U4guYdzHwEiGjoU=
|
||||||
golang.org/x/arch v0.27.0/go.mod h1:0X+GdSIP+kL5wPmpK7sdkEVTt2XoYP0cSjQSbZBwOi8=
|
golang.org/x/arch v0.27.0/go.mod h1:0X+GdSIP+kL5wPmpK7sdkEVTt2XoYP0cSjQSbZBwOi8=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988=
|
golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988=
|
||||||
golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc=
|
golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc=
|
||||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
|
||||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
|
||||||
golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4=
|
golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4=
|
||||||
golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ=
|
golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=
|
golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=
|
||||||
golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww=
|
golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
||||||
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
|
golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
|
||||||
golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
|
golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
|
||||||
golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
|
golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
|
||||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
|
||||||
golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8=
|
golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8=
|
||||||
golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0=
|
golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
|
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
|
||||||
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
|||||||
@@ -1,13 +1,23 @@
|
|||||||
package item
|
package item
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
itemapischema "honoka-chan/internal/schema/api/item"
|
||||||
"honoka-chan/pkg/utils"
|
honokautils "honoka-chan/internal/utils"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func itemList() (res any, err error) {
|
func itemList() (res any, err error) {
|
||||||
itemResp := utils.ReadAllText("assets/serverdata/item.json")
|
itemData, err := honokautils.LoadServerData[itemapischema.ListData]("item_data.json")
|
||||||
err = json.Unmarshal([]byte(itemResp), &res)
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
res = itemapischema.ListResp{
|
||||||
|
Result: itemData,
|
||||||
|
Status: 200,
|
||||||
|
CommandNum: false,
|
||||||
|
TimeStamp: time.Now().Unix(),
|
||||||
|
}
|
||||||
|
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ func loginTopInfo(ctx *gin.Context) (res any, err error) {
|
|||||||
ss := session.Get(ctx)
|
ss := session.Get(ctx)
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
|
|
||||||
friendsRequestCnt64, err := ss.UserEng.Table(new(usermodel.UserFriend)).
|
friendsRequestCnt, err := ss.UserEng.Table(new(usermodel.UserFriend)).
|
||||||
Where("user_id = ?", ss.UserID).
|
Where("user_id = ?", ss.UserID).
|
||||||
Where("status = ?", usermodel.FriendStatusAwaitingApproval).
|
Where("status = ?", usermodel.FriendStatusAwaitingApproval).
|
||||||
Where("is_new = ?", true).
|
Where("is_new = ?", true).
|
||||||
@@ -22,7 +22,7 @@ func loginTopInfo(ctx *gin.Context) (res any, err error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
friendsApprovalWaitCnt64, err := ss.UserEng.Table(new(usermodel.UserFriend)).
|
friendsApprovalWaitCnt, err := ss.UserEng.Table(new(usermodel.UserFriend)).
|
||||||
Where("user_id = ?", ss.UserID).
|
Where("user_id = ?", ss.UserID).
|
||||||
Where("status = ?", usermodel.FriendStatusPending).
|
Where("status = ?", usermodel.FriendStatusPending).
|
||||||
Count()
|
Count()
|
||||||
@@ -30,7 +30,7 @@ func loginTopInfo(ctx *gin.Context) (res any, err error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
friendGreetCnt64, err := ss.UserEng.Table(new(usermodel.UserGreet)).
|
friendGreetCnt, err := ss.UserEng.Table(new(usermodel.UserGreet)).
|
||||||
Where("receiver_id = ?", ss.UserID).
|
Where("receiver_id = ?", ss.UserID).
|
||||||
Where("deleted_from_receiver = ?", false).
|
Where("deleted_from_receiver = ?", false).
|
||||||
Where("readed = ?", false).
|
Where("readed = ?", false).
|
||||||
@@ -39,10 +39,6 @@ func loginTopInfo(ctx *gin.Context) (res any, err error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
friendsRequestCnt := int(friendsRequestCnt64)
|
|
||||||
friendsApprovalWaitCnt := int(friendsApprovalWaitCnt64)
|
|
||||||
friendGreetCnt := int(friendGreetCnt64)
|
|
||||||
|
|
||||||
res = loginapischema.TopInfoResp{
|
res = loginapischema.TopInfoResp{
|
||||||
Result: loginapischema.TopInfoData{
|
Result: loginapischema.TopInfoData{
|
||||||
FriendActionCnt: friendGreetCnt,
|
FriendActionCnt: friendGreetCnt,
|
||||||
|
|||||||
@@ -1,22 +1,19 @@
|
|||||||
package profile
|
package profile
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
profileapischema "honoka-chan/internal/schema/api/profile"
|
profileapischema "honoka-chan/internal/schema/api/profile"
|
||||||
"honoka-chan/pkg/utils"
|
honokautils "honoka-chan/internal/utils"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func cardRanking() (res any, err error) {
|
func cardRanking() (res any, err error) {
|
||||||
var result []any
|
cardRankingData, err := honokautils.LoadServerData[[]profileapischema.CardRankingData]("card_ranking_data.json")
|
||||||
love := utils.ReadAllText("assets/serverdata/love.json")
|
|
||||||
err = json.Unmarshal([]byte(love), &result)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
res = profileapischema.CardRankingResp{
|
res = profileapischema.CardRankingResp{
|
||||||
Result: result,
|
Result: cardRankingData,
|
||||||
Status: 200,
|
Status: 200,
|
||||||
CommandNum: false,
|
CommandNum: false,
|
||||||
TimeStamp: time.Now().Unix(),
|
TimeStamp: time.Now().Unix(),
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ func profileInfo(ctx *gin.Context, targetUserID int) (res any, err error) {
|
|||||||
UnitMax: 5000,
|
UnitMax: 5000,
|
||||||
EnergyMax: targetPref.EffectiveEnergyMax(),
|
EnergyMax: targetPref.EffectiveEnergyMax(),
|
||||||
FriendMax: 99,
|
FriendMax: 99,
|
||||||
UnitCnt: int(unitCount),
|
UnitCnt: unitCount,
|
||||||
InviteCode: targetPref.InviteCode,
|
InviteCode: targetPref.InviteCode,
|
||||||
ElapsedTimeFromLogin: formatProfileElapsedTime(lastLoginTime),
|
ElapsedTimeFromLogin: formatProfileElapsedTime(lastLoginTime),
|
||||||
Introduction: targetPref.UserDesc,
|
Introduction: targetPref.UserDesc,
|
||||||
|
|||||||
@@ -1,13 +1,23 @@
|
|||||||
package stamp
|
package stamp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
stampapischema "honoka-chan/internal/schema/api/stamp"
|
||||||
"honoka-chan/pkg/utils"
|
honokautils "honoka-chan/internal/utils"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func stampInfo() (res any, err error) {
|
func stampInfo() (res any, err error) {
|
||||||
stampResp := utils.ReadAllText("assets/serverdata/stamp.json")
|
stampData, err := honokautils.LoadServerData[stampapischema.InfoData]("stamp_data.json")
|
||||||
err = json.Unmarshal([]byte(stampResp), &res)
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
res = stampapischema.InfoResp{
|
||||||
|
Result: stampData,
|
||||||
|
Status: 200,
|
||||||
|
CommandNum: false,
|
||||||
|
TimeStamp: time.Now().Unix(),
|
||||||
|
}
|
||||||
|
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,25 @@
|
|||||||
package unit
|
package unit
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
unitapischema "honoka-chan/internal/schema/api/unit"
|
unitapischema "honoka-chan/internal/schema/api/unit"
|
||||||
"honoka-chan/pkg/utils"
|
honokautils "honoka-chan/internal/utils"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func unitAccessoryTab() (res any, err error) {
|
func unitAccessoryTab() (res any, err error) {
|
||||||
data := utils.ReadAllText("assets/serverdata/accessoryTab.json")
|
tabList, err := honokautils.LoadServerData[[]unitapischema.TabList]("accessory_tab_list.json")
|
||||||
resp := unitapischema.AccessoryTabResp{}
|
|
||||||
err = json.Unmarshal([]byte(data), &resp)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
resp.TimeStamp = time.Now().Unix()
|
|
||||||
|
|
||||||
return resp, err
|
res = unitapischema.AccessoryTabResp{
|
||||||
|
Result: unitapischema.AccessoryTabData{
|
||||||
|
TabList: tabList,
|
||||||
|
},
|
||||||
|
Status: 200,
|
||||||
|
CommandNum: false,
|
||||||
|
TimeStamp: time.Now().Unix(),
|
||||||
|
}
|
||||||
|
|
||||||
|
return res, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package eventscenario
|
||||||
|
|
||||||
|
import (
|
||||||
|
"honoka-chan/internal/middleware"
|
||||||
|
"honoka-chan/internal/router"
|
||||||
|
eventscenarioschema "honoka-chan/internal/schema/eventscenario"
|
||||||
|
"honoka-chan/internal/session"
|
||||||
|
honokautils "honoka-chan/internal/utils"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func startup(ctx *gin.Context) {
|
||||||
|
ss := session.Get(ctx)
|
||||||
|
defer ss.Finalize()
|
||||||
|
|
||||||
|
startReq := eventscenarioschema.StartUpReq{}
|
||||||
|
err := honokautils.ParseRequestData(ctx, &startReq)
|
||||||
|
if ss.CheckErr(err) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ss.Respond(eventscenarioschema.StartUpResp{
|
||||||
|
ResponseData: eventscenarioschema.StartUpData{},
|
||||||
|
ReleaseInfo: []any{},
|
||||||
|
StatusCode: 200,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
router.AddHandler("main.php", "POST", "/eventscenario/startup", middleware.Common, startup)
|
||||||
|
}
|
||||||
@@ -115,7 +115,7 @@ func list(ctx *gin.Context) {
|
|||||||
|
|
||||||
ss.Respond(friendschema.ListResp{
|
ss.Respond(friendschema.ListResp{
|
||||||
ResponseData: friendschema.ListData{
|
ResponseData: friendschema.ListData{
|
||||||
ItemCount: int(totalCount),
|
ItemCount: totalCount,
|
||||||
FriendList: friendList,
|
FriendList: friendList,
|
||||||
NewFriendList: []any{},
|
NewFriendList: []any{},
|
||||||
ServerTimestamp: time.Now().Unix(),
|
ServerTimestamp: time.Now().Unix(),
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ func search(ctx *gin.Context) {
|
|||||||
UnitMax: 5000,
|
UnitMax: 5000,
|
||||||
EnergyMax: positiveIntOrDefault(row.EnergyMax, usermodel.DefaultUserEnergyMax),
|
EnergyMax: positiveIntOrDefault(row.EnergyMax, usermodel.DefaultUserEnergyMax),
|
||||||
FriendMax: 99,
|
FriendMax: 99,
|
||||||
UnitCnt: int(unitCount),
|
UnitCnt: unitCount,
|
||||||
ElapsedTimeFromLogin: formatElapsedTime(row.LastLoginTime),
|
ElapsedTimeFromLogin: formatElapsedTime(row.LastLoginTime),
|
||||||
Comment: row.UserDesc,
|
Comment: row.UserDesc,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
_ "honoka-chan/internal/handler/background"
|
_ "honoka-chan/internal/handler/background"
|
||||||
_ "honoka-chan/internal/handler/download"
|
_ "honoka-chan/internal/handler/download"
|
||||||
_ "honoka-chan/internal/handler/event"
|
_ "honoka-chan/internal/handler/event"
|
||||||
|
_ "honoka-chan/internal/handler/eventscenario"
|
||||||
_ "honoka-chan/internal/handler/friend"
|
_ "honoka-chan/internal/handler/friend"
|
||||||
_ "honoka-chan/internal/handler/gdpr"
|
_ "honoka-chan/internal/handler/gdpr"
|
||||||
_ "honoka-chan/internal/handler/ghome"
|
_ "honoka-chan/internal/handler/ghome"
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"honoka-chan/internal/constant"
|
"honoka-chan/internal/constant"
|
||||||
"honoka-chan/internal/middleware"
|
"honoka-chan/internal/middleware"
|
||||||
usermodel "honoka-chan/internal/model/user"
|
|
||||||
"honoka-chan/internal/router"
|
"honoka-chan/internal/router"
|
||||||
commonschema "honoka-chan/internal/schema/common"
|
commonschema "honoka-chan/internal/schema/common"
|
||||||
liveschema "honoka-chan/internal/schema/live"
|
liveschema "honoka-chan/internal/schema/live"
|
||||||
|
liverecordschema "honoka-chan/internal/schema/liverecord"
|
||||||
"honoka-chan/internal/session"
|
"honoka-chan/internal/session"
|
||||||
honokautils "honoka-chan/internal/utils"
|
honokautils "honoka-chan/internal/utils"
|
||||||
"honoka-chan/pkg/utils"
|
"honoka-chan/pkg/utils"
|
||||||
@@ -173,7 +173,7 @@ func preciseScore(ctx *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DeckInfo
|
// DeckInfo
|
||||||
var deckInfo usermodel.DeckInfo
|
var deckInfo liverecordschema.DeckInfo
|
||||||
err = json.Unmarshal([]byte(record.DeckInfoJSON), &deckInfo)
|
err = json.Unmarshal([]byte(record.DeckInfoJSON), &deckInfo)
|
||||||
if ss.CheckErr(err) {
|
if ss.CheckErr(err) {
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -25,11 +25,10 @@ func reward(ctx *gin.Context) {
|
|||||||
if ss.CheckErr(err) {
|
if ss.CheckErr(err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// fmt.Println(ctx.MustGet("request_data").(string))
|
|
||||||
|
|
||||||
difficultyID := playRewardReq.LiveDifficultyID
|
difficultyID := playRewardReq.LiveDifficultyID
|
||||||
_, liveInfo := ss.GetLiveInfo(difficultyID)
|
_, liveInfo := ss.GetLiveInfo(difficultyID)
|
||||||
_, progress := ss.GetLiveInProgress() // TODO: 添加返回指定状态码的方法
|
_, progress := ss.GetLiveInProgress()
|
||||||
_, deckInfo := ss.GetDeckInfo(progress.DeckID)
|
_, deckInfo := ss.GetDeckInfo(progress.DeckID)
|
||||||
deckInfo.LiveDifficultyID = difficultyID
|
deckInfo.LiveDifficultyID = difficultyID
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ func userGreetingHistory(ctx *gin.Context) {
|
|||||||
|
|
||||||
ss.Respond(noticeschema.UserGreetingResp{
|
ss.Respond(noticeschema.UserGreetingResp{
|
||||||
ResponseData: noticeschema.UserGreetingData{
|
ResponseData: noticeschema.UserGreetingData{
|
||||||
ItemCount: int(totalCount),
|
ItemCount: totalCount,
|
||||||
HasNext: totalCount > int64(len(rows)),
|
HasNext: totalCount > int64(len(rows)),
|
||||||
NoticeList: noticeList,
|
NoticeList: noticeList,
|
||||||
ServerTimestamp: time.Now().Unix(),
|
ServerTimestamp: time.Now().Unix(),
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
package scenario
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"honoka-chan/internal/middleware"
|
|
||||||
"honoka-chan/internal/router"
|
|
||||||
"honoka-chan/internal/session"
|
|
||||||
"honoka-chan/pkg/utils"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
)
|
|
||||||
|
|
||||||
func reward(ctx *gin.Context) {
|
|
||||||
ss := session.Get(ctx)
|
|
||||||
defer ss.Finalize()
|
|
||||||
|
|
||||||
data := utils.ReadAllText("assets/serverdata/reward.json")
|
|
||||||
var resp map[string]any
|
|
||||||
err := json.Unmarshal([]byte(data), &resp)
|
|
||||||
if ss.CheckErr(err) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
ss.Respond(resp)
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
router.AddHandler("main.php", "POST", "/scenario/reward", middleware.Common, reward)
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
package subscenario
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"honoka-chan/internal/middleware"
|
|
||||||
"honoka-chan/internal/router"
|
|
||||||
"honoka-chan/internal/session"
|
|
||||||
"honoka-chan/pkg/utils"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
)
|
|
||||||
|
|
||||||
func reward(ctx *gin.Context) {
|
|
||||||
ss := session.Get(ctx)
|
|
||||||
defer ss.Finalize()
|
|
||||||
|
|
||||||
data := utils.ReadAllText("assets/serverdata/subreward.json")
|
|
||||||
var resp map[string]any
|
|
||||||
err := json.Unmarshal([]byte(data), &resp)
|
|
||||||
if ss.CheckErr(err) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
ss.Respond(resp)
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
router.AddHandler("main.php", "POST", "/subscenario/reward", middleware.Common, reward)
|
|
||||||
}
|
|
||||||
@@ -1,70 +1,69 @@
|
|||||||
package unitmodel
|
package unitmodel
|
||||||
|
|
||||||
type CommonUnitData struct {
|
type CommonUnitData struct {
|
||||||
ID int `xorm:"id pk autoincr" json:"-"`
|
ID int `xorm:"id pk autoincr"`
|
||||||
UnitNumber int `xorm:"unit_number" json:"-"`
|
UnitNumber int `xorm:"unit_number"`
|
||||||
UnitID int `xorm:"unit_id" json:"unit_id"`
|
UnitID int `xorm:"unit_id"`
|
||||||
UnitTypeID int `xorm:"unit_type_id" json:"unit_type_id"`
|
UnitTypeID int `xorm:"unit_type_id"`
|
||||||
Name string `xorm:"name" json:"name"`
|
Name string `xorm:"name"`
|
||||||
Eponym string `xorm:"eponym" json:"eponym"`
|
Eponym string `xorm:"eponym"`
|
||||||
Rarity int `xorm:"rarity" json:"rarity"`
|
Rarity int `xorm:"rarity"`
|
||||||
Attribute int `xorm:"attribute" json:"attribute"`
|
Attribute int `xorm:"attribute"`
|
||||||
Smile int `xorm:"smile" json:"smile"`
|
Smile int `xorm:"smile"`
|
||||||
Cute int `xorm:"cute" json:"cute"`
|
Cute int `xorm:"cute"`
|
||||||
Cool int `xorm:"cool" json:"cool"`
|
Cool int `xorm:"cool"`
|
||||||
Exp int `xorm:"exp" json:"exp"`
|
Exp int `xorm:"exp"`
|
||||||
Level int `xorm:"level" json:"level"`
|
Level int `xorm:"level"`
|
||||||
MaxLevel int `xorm:"max_level" json:"max_level"`
|
MaxLevel int `xorm:"max_level"`
|
||||||
LevelLimitID int `xorm:"level_limit_id" json:"level_limit_id"`
|
LevelLimitID int `xorm:"level_limit_id"`
|
||||||
Rank int `xorm:"rank" json:"rank"`
|
Rank int `xorm:"rank"`
|
||||||
MaxRank int `xorm:"max_rank" json:"max_rank"`
|
MaxRank int `xorm:"max_rank"`
|
||||||
Love int `xorm:"love" json:"love"`
|
Love int `xorm:"love"`
|
||||||
MaxLove int `xorm:"max_love" json:"max_love"`
|
MaxLove int `xorm:"max_love"`
|
||||||
UnitSkillExp int `xorm:"unit_skill_exp" json:"unit_skill_exp"`
|
UnitSkillExp int `xorm:"unit_skill_exp"`
|
||||||
UnitSkillLevel int `xorm:"unit_skill_level" json:"unit_skill_level"`
|
UnitSkillLevel int `xorm:"unit_skill_level"`
|
||||||
MaxHp int `xorm:"max_hp" json:"max_hp"`
|
MaxHp int `xorm:"max_hp"`
|
||||||
UnitRemovableSkillCapacity int `xorm:"unit_removable_skill_capacity" json:"unit_removable_skill_capacity"`
|
UnitRemovableSkillCapacity int `xorm:"unit_removable_skill_capacity"`
|
||||||
IsRankMax bool `xorm:"is_rank_max" json:"is_rank_max"`
|
IsRankMax bool `xorm:"is_rank_max"`
|
||||||
IsLoveMax bool `xorm:"is_love_max" json:"is_love_max"`
|
IsLoveMax bool `xorm:"is_love_max"`
|
||||||
IsLevelMax bool `xorm:"is_level_max" json:"is_level_max"`
|
IsLevelMax bool `xorm:"is_level_max"`
|
||||||
IsSigned bool `xorm:"is_signed" json:"is_signed"`
|
IsSigned bool `xorm:"is_signed"`
|
||||||
IsSkillLevelMax bool `xorm:"is_skill_level_max" json:"is_skill_level_max"`
|
IsSkillLevelMax bool `xorm:"is_skill_level_max"`
|
||||||
IsRemovableSkillCapacityMax bool `xorm:"is_removable_skill_capacity_max" json:"is_removable_skill_capacity_max"`
|
IsRemovableSkillCapacityMax bool `xorm:"is_removable_skill_capacity_max"`
|
||||||
InsertDate int64 `xorm:"insert_date" json:"insert_date"`
|
InsertDate int64 `xorm:"insert_date"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type UnitDataMap struct {
|
type UnitDataMap struct {
|
||||||
|
ID int `xorm:"id pk autoincr"`
|
||||||
UnitOwningUserID int `xorm:"unit_owning_user_id pk autoincr"`
|
UnitOwningUserID int `xorm:"unit_owning_user_id pk autoincr"`
|
||||||
FavoriteFlag bool `xorm:"favorite_flag"`
|
UnitID int `xorm:"unit_id"`
|
||||||
|
UnitTypeID int `xorm:"unit_type_id"`
|
||||||
|
Name string `xorm:"name"`
|
||||||
|
Eponym string `xorm:"eponym"`
|
||||||
|
Rarity int `xorm:"rarity"`
|
||||||
|
Attribute int `xorm:"attribute"`
|
||||||
|
Smile int `xorm:"smile"`
|
||||||
|
Cute int `xorm:"cute"`
|
||||||
|
Cool int `xorm:"cool"`
|
||||||
|
Exp int `xorm:"exp"`
|
||||||
|
Level int `xorm:"level"`
|
||||||
|
MaxLevel int `xorm:"max_level"`
|
||||||
|
LevelLimitID int `xorm:"level_limit_id"`
|
||||||
|
Rank int `xorm:"rank"`
|
||||||
|
MaxRank int `xorm:"max_rank"`
|
||||||
DisplayRank int `xorm:"display_rank"`
|
DisplayRank int `xorm:"display_rank"`
|
||||||
|
Love int `xorm:"love"`
|
||||||
ID int `xorm:"id pk autoincr" json:"-"`
|
MaxLove int `xorm:"max_love"`
|
||||||
UnitID int `xorm:"unit_id" json:"unit_id"`
|
UnitSkillExp int `xorm:"unit_skill_exp"`
|
||||||
UnitTypeID int `xorm:"unit_type_id" json:"unit_type_id"`
|
UnitSkillLevel int `xorm:"unit_skill_level"`
|
||||||
Name string `xorm:"name" json:"name"`
|
MaxHp int `xorm:"max_hp"`
|
||||||
Eponym string `xorm:"eponym" json:"eponym"`
|
UnitRemovableSkillCapacity int `xorm:"unit_removable_skill_capacity"`
|
||||||
Rarity int `xorm:"rarity" json:"rarity"`
|
IsRankMax bool `xorm:"is_rank_max"`
|
||||||
Attribute int `xorm:"attribute" json:"attribute"`
|
IsLoveMax bool `xorm:"is_love_max"`
|
||||||
Smile int `xorm:"smile" json:"smile"`
|
IsLevelMax bool `xorm:"is_level_max"`
|
||||||
Cute int `xorm:"cute" json:"cute"`
|
IsSigned bool `xorm:"is_signed"`
|
||||||
Cool int `xorm:"cool" json:"cool"`
|
IsSkillLevelMax bool `xorm:"is_skill_level_max"`
|
||||||
Exp int `xorm:"exp" json:"exp"`
|
IsRemovableSkillCapacityMax bool `xorm:"is_removable_skill_capacity_max"`
|
||||||
Level int `xorm:"level" json:"level"`
|
FavoriteFlag bool `xorm:"favorite_flag"`
|
||||||
MaxLevel int `xorm:"max_level" json:"max_level"`
|
InsertDate int64 `xorm:"insert_date"`
|
||||||
LevelLimitID int `xorm:"level_limit_id" json:"level_limit_id"`
|
|
||||||
Rank int `xorm:"rank" json:"rank"`
|
|
||||||
MaxRank int `xorm:"max_rank" json:"max_rank"`
|
|
||||||
Love int `xorm:"love" json:"love"`
|
|
||||||
MaxLove int `xorm:"max_love" json:"max_love"`
|
|
||||||
UnitSkillExp int `xorm:"unit_skill_exp" json:"unit_skill_exp"`
|
|
||||||
UnitSkillLevel int `xorm:"unit_skill_level" json:"unit_skill_level"`
|
|
||||||
MaxHp int `xorm:"max_hp" json:"max_hp"`
|
|
||||||
UnitRemovableSkillCapacity int `xorm:"unit_removable_skill_capacity" json:"unit_removable_skill_capacity"`
|
|
||||||
IsRankMax bool `xorm:"is_rank_max" json:"is_rank_max"`
|
|
||||||
IsLoveMax bool `xorm:"is_love_max" json:"is_love_max"`
|
|
||||||
IsLevelMax bool `xorm:"is_level_max" json:"is_level_max"`
|
|
||||||
IsSigned bool `xorm:"is_signed" json:"is_signed"`
|
|
||||||
IsSkillLevelMax bool `xorm:"is_skill_level_max" json:"is_skill_level_max"`
|
|
||||||
IsRemovableSkillCapacityMax bool `xorm:"is_removable_skill_capacity_max" json:"is_removable_skill_capacity_max"`
|
|
||||||
InsertDate int64 `xorm:"insert_date" json:"insert_date"`
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,123 +26,3 @@ type UserLiveRecord struct {
|
|||||||
func (UserLiveRecord) TableName() string {
|
func (UserLiveRecord) TableName() string {
|
||||||
return "user_live_record"
|
return "user_live_record"
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: 转移到 schema 下
|
|
||||||
type NotesList struct {
|
|
||||||
TimingSec float64 `json:"timing_sec"`
|
|
||||||
NotesAttribute int `json:"notes_attribute"`
|
|
||||||
NotesLevel int `json:"notes_level"`
|
|
||||||
Effect int `json:"effect"`
|
|
||||||
EffectValue int `json:"effect_value"`
|
|
||||||
Position int `json:"position"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type LiveInfo struct {
|
|
||||||
LiveDifficultyID int `json:"live_difficulty_id"`
|
|
||||||
IsRandom bool `json:"is_random"`
|
|
||||||
AcFlag int `json:"ac_flag"`
|
|
||||||
SwingFlag int `json:"swing_flag"`
|
|
||||||
NotesList []NotesList `json:"notes_list"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: 转移到 schema 下
|
|
||||||
type PreciseList struct {
|
|
||||||
Count int `json:"count"`
|
|
||||||
Effect int `json:"effect"`
|
|
||||||
Accuracy int `json:"accuracy"`
|
|
||||||
Tap float64 `json:"tap"`
|
|
||||||
IsSame bool `json:"is_same"`
|
|
||||||
Release any `json:"release"`
|
|
||||||
Position int `json:"position"`
|
|
||||||
NoteNumber int `json:"note_number"`
|
|
||||||
FirstTouch any `json:"first_touch"`
|
|
||||||
Tp bool `json:"tp"`
|
|
||||||
Tpf any `json:"tpf"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: 转移到 schema 下
|
|
||||||
type TotalStatus struct {
|
|
||||||
Hp int `json:"hp"`
|
|
||||||
Smile int `json:"smile"`
|
|
||||||
Cute int `json:"cute"`
|
|
||||||
Cool int `json:"cool"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type CenterBonus struct {
|
|
||||||
Hp int `json:"hp"`
|
|
||||||
Smile int `json:"smile"`
|
|
||||||
Cute int `json:"cute"`
|
|
||||||
Cool int `json:"cool"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type SiBonus struct {
|
|
||||||
Hp int `json:"hp"`
|
|
||||||
Smile int `json:"smile"`
|
|
||||||
Cute int `json:"cute"`
|
|
||||||
Cool int `json:"cool"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type AccessoryInfo struct {
|
|
||||||
AccessoryOwningUserID int `json:"accessory_owning_user_id"`
|
|
||||||
AccessoryID int `json:"accessory_id"`
|
|
||||||
Exp int `json:"exp"`
|
|
||||||
NextExp int `json:"next_exp"`
|
|
||||||
Level int `json:"level"`
|
|
||||||
MaxLevel int `json:"max_level"`
|
|
||||||
RankUpCount int `json:"rank_up_count"`
|
|
||||||
FavoriteFlag bool `json:"favorite_flag"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type UnitList struct {
|
|
||||||
UnitID int `json:"unit_id"`
|
|
||||||
Position int `json:"position"`
|
|
||||||
Level int `json:"level"`
|
|
||||||
LevelLimitID int `json:"level_limit_id"`
|
|
||||||
DisplayRank int `json:"display_rank"`
|
|
||||||
Love int `json:"love"`
|
|
||||||
UnitSkillLevel int `json:"unit_skill_level"`
|
|
||||||
IsRankMax bool `json:"is_rank_max"`
|
|
||||||
IsLoveMax bool `json:"is_love_max"`
|
|
||||||
IsLevelMax bool `json:"is_level_max"`
|
|
||||||
IsSigned bool `json:"is_signed"`
|
|
||||||
Rank int `json:"rank"`
|
|
||||||
MaxHp int `json:"max_hp"`
|
|
||||||
UnitRemovableSkillCapacity int `json:"unit_removable_skill_capacity"`
|
|
||||||
RemovableSkillIds []int `json:"removable_skill_ids"`
|
|
||||||
TotalStatus TotalStatus `json:"total_status"`
|
|
||||||
SiBonus SiBonus `json:"si_bonus"`
|
|
||||||
AccessoryInfo *AccessoryInfo `json:"accessory_info,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type DeckInfo struct {
|
|
||||||
LiveDifficultyID int `json:"live_difficulty_id"`
|
|
||||||
TotalStatus TotalStatus `json:"total_status"`
|
|
||||||
CenterBonus CenterBonus `json:"center_bonus"`
|
|
||||||
SiBonus SiBonus `json:"si_bonus"`
|
|
||||||
UnitList []UnitList `json:"unit_list"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: 转移到 schema 下
|
|
||||||
type Icon struct {
|
|
||||||
NormalID int `json:"normal_id"`
|
|
||||||
JustID int `json:"just_id"`
|
|
||||||
SlideID int `json:"slide_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type LiveSetting struct {
|
|
||||||
NotesSpeed float64 `json:"notes_speed"`
|
|
||||||
CutinBrightness int `json:"cutin_brightness"`
|
|
||||||
CutinType int `json:"cutin_type"`
|
|
||||||
EffectFlag bool `json:"effect_flag"`
|
|
||||||
StringSize int `json:"string_size"`
|
|
||||||
SeID int `json:"se_id"`
|
|
||||||
Icon Icon `json:"icon"`
|
|
||||||
BackgroundID int `json:"background_id"`
|
|
||||||
RandomValue int `json:"random_value"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: 转移到 schema 下
|
|
||||||
type TriggerLog struct {
|
|
||||||
Position int `json:"position"`
|
|
||||||
ActivationRate int `json:"activation_rate"`
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package itemapischema
|
||||||
|
|
||||||
|
type GeneralItemList struct {
|
||||||
|
ItemID int `json:"item_id"`
|
||||||
|
Amount int `json:"amount"`
|
||||||
|
UseButtonFlag bool `json:"use_button_flag"`
|
||||||
|
GeneralItemType int `json:"general_item_type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type BuffItemList struct {
|
||||||
|
ItemID int `json:"item_id"`
|
||||||
|
Amount int `json:"amount"`
|
||||||
|
BuffType int `json:"buff_type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ListData struct {
|
||||||
|
GeneralItemList []GeneralItemList `json:"general_item_list"`
|
||||||
|
BuffItemList []BuffItemList `json:"buff_item_list"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ListResp struct {
|
||||||
|
Result ListData `json:"result"`
|
||||||
|
Status int `json:"status"`
|
||||||
|
CommandNum bool `json:"commandNum"`
|
||||||
|
TimeStamp int64 `json:"timeStamp"`
|
||||||
|
}
|
||||||
@@ -8,18 +8,18 @@ type LicenseInfo struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type TopInfoData struct {
|
type TopInfoData struct {
|
||||||
FriendActionCnt int `json:"friend_action_cnt"`
|
FriendActionCnt int64 `json:"friend_action_cnt"`
|
||||||
FriendGreetCnt int `json:"friend_greet_cnt"`
|
FriendGreetCnt int64 `json:"friend_greet_cnt"`
|
||||||
FriendVarietyCnt int `json:"friend_variety_cnt"`
|
FriendVarietyCnt int64 `json:"friend_variety_cnt"`
|
||||||
FriendNewCnt int `json:"friend_new_cnt"`
|
FriendNewCnt int64 `json:"friend_new_cnt"`
|
||||||
PresentCnt int `json:"present_cnt"`
|
PresentCnt int64 `json:"present_cnt"`
|
||||||
SecretBoxBadgeFlag bool `json:"secret_box_badge_flag"`
|
SecretBoxBadgeFlag bool `json:"secret_box_badge_flag"`
|
||||||
ServerDatetime string `json:"server_datetime"`
|
ServerDatetime string `json:"server_datetime"`
|
||||||
ServerTimestamp int64 `json:"server_timestamp"`
|
ServerTimestamp int64 `json:"server_timestamp"`
|
||||||
NoticeFriendDatetime string `json:"notice_friend_datetime"`
|
NoticeFriendDatetime string `json:"notice_friend_datetime"`
|
||||||
NoticeMailDatetime string `json:"notice_mail_datetime"`
|
NoticeMailDatetime string `json:"notice_mail_datetime"`
|
||||||
FriendsApprovalWaitCnt int `json:"friends_approval_wait_cnt"`
|
FriendsApprovalWaitCnt int64 `json:"friends_approval_wait_cnt"`
|
||||||
FriendsRequestCnt int `json:"friends_request_cnt"`
|
FriendsRequestCnt int64 `json:"friends_request_cnt"`
|
||||||
IsTodayBirthday bool `json:"is_today_birthday"`
|
IsTodayBirthday bool `json:"is_today_birthday"`
|
||||||
LicenseInfo LicenseInfo `json:"license_info"`
|
LicenseInfo LicenseInfo `json:"license_info"`
|
||||||
UsingBuffInfo []any `json:"using_buff_info"`
|
UsingBuffInfo []any `json:"using_buff_info"`
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ type CardRankingData struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type CardRankingResp struct {
|
type CardRankingResp struct {
|
||||||
Result any `json:"result"`
|
Result []CardRankingData `json:"result"`
|
||||||
Status int `json:"status"`
|
Status int `json:"status"`
|
||||||
CommandNum bool `json:"commandNum"`
|
CommandNum bool `json:"commandNum"`
|
||||||
TimeStamp int64 `json:"timeStamp"`
|
TimeStamp int64 `json:"timeStamp"`
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ type UserInfo struct {
|
|||||||
UnitMax int `json:"unit_max"`
|
UnitMax int `json:"unit_max"`
|
||||||
EnergyMax int `json:"energy_max"`
|
EnergyMax int `json:"energy_max"`
|
||||||
FriendMax int `json:"friend_max"`
|
FriendMax int `json:"friend_max"`
|
||||||
UnitCnt int `json:"unit_cnt"`
|
UnitCnt int64 `json:"unit_cnt"`
|
||||||
InviteCode string `json:"invite_code"`
|
InviteCode string `json:"invite_code"`
|
||||||
ElapsedTimeFromLogin string `json:"elapsed_time_from_login"`
|
ElapsedTimeFromLogin string `json:"elapsed_time_from_login"`
|
||||||
Introduction string `json:"introduction"`
|
Introduction string `json:"introduction"`
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package stampapischema
|
||||||
|
|
||||||
|
type StampList struct {
|
||||||
|
Position int `json:"position"`
|
||||||
|
StampID int `json:"stamp_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SettingList struct {
|
||||||
|
StampSettingID int `json:"stamp_setting_id"`
|
||||||
|
MainFlag int `json:"main_flag"`
|
||||||
|
StampList []StampList `json:"stamp_list"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type StampSetting struct {
|
||||||
|
StampType int `json:"stamp_type"`
|
||||||
|
SettingList []SettingList `json:"setting_list"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type InfoData struct {
|
||||||
|
OwningStampIds []int `json:"owning_stamp_ids"`
|
||||||
|
StampSetting []StampSetting `json:"stamp_setting"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type InfoResp struct {
|
||||||
|
Result InfoData `json:"result"`
|
||||||
|
Status int `json:"status"`
|
||||||
|
CommandNum bool `json:"commandNum"`
|
||||||
|
TimeStamp int64 `json:"timeStamp"`
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package eventscenarioschema
|
||||||
|
|
||||||
|
type StartUpReq struct {
|
||||||
|
Module string `json:"module"`
|
||||||
|
EventScenarioID int `json:"event_scenario_id"`
|
||||||
|
Action string `json:"action"`
|
||||||
|
TimeStamp int `json:"timeStamp"`
|
||||||
|
Mgd int `json:"mgd"`
|
||||||
|
CommandNum string `json:"commandNum"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type EventScenarioList struct {
|
||||||
|
EventID int `json:"event_id"`
|
||||||
|
Progress int `json:"progress"`
|
||||||
|
Status int `json:"status"`
|
||||||
|
EventScenarioID int `json:"event_scenario_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type StartUpData struct {
|
||||||
|
EventScenarioList EventScenarioList `json:"event_scenario_list"`
|
||||||
|
ScenarioAdjustment int `json:"scenario_adjustment"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type StartUpResp struct {
|
||||||
|
ResponseData StartUpData `json:"response_data"`
|
||||||
|
ReleaseInfo []any `json:"release_info"`
|
||||||
|
StatusCode int `json:"status_code"`
|
||||||
|
}
|
||||||
@@ -71,7 +71,7 @@ type FriendList struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ListData struct {
|
type ListData struct {
|
||||||
ItemCount int `json:"item_count"`
|
ItemCount int64 `json:"item_count"`
|
||||||
FriendList []FriendList `json:"friend_list"`
|
FriendList []FriendList `json:"friend_list"`
|
||||||
NewFriendList []any `json:"new_friend_list"`
|
NewFriendList []any `json:"new_friend_list"`
|
||||||
ServerTimestamp int64 `json:"server_timestamp"`
|
ServerTimestamp int64 `json:"server_timestamp"`
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ type SearchUserInfo struct {
|
|||||||
UnitMax int `json:"unit_max"`
|
UnitMax int `json:"unit_max"`
|
||||||
EnergyMax int `json:"energy_max"`
|
EnergyMax int `json:"energy_max"`
|
||||||
FriendMax int `json:"friend_max"`
|
FriendMax int `json:"friend_max"`
|
||||||
UnitCnt int `json:"unit_cnt"`
|
UnitCnt int64 `json:"unit_cnt"`
|
||||||
ElapsedTimeFromLogin string `json:"elapsed_time_from_login"`
|
ElapsedTimeFromLogin string `json:"elapsed_time_from_login"`
|
||||||
Comment string `json:"comment"`
|
Comment string `json:"comment"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
package liverecordschema
|
||||||
|
|
||||||
|
type TotalStatus struct {
|
||||||
|
Hp int `json:"hp"`
|
||||||
|
Smile int `json:"smile"`
|
||||||
|
Cute int `json:"cute"`
|
||||||
|
Cool int `json:"cool"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CenterBonus struct {
|
||||||
|
Hp int `json:"hp"`
|
||||||
|
Smile int `json:"smile"`
|
||||||
|
Cute int `json:"cute"`
|
||||||
|
Cool int `json:"cool"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SiBonus struct {
|
||||||
|
Hp int `json:"hp"`
|
||||||
|
Smile int `json:"smile"`
|
||||||
|
Cute int `json:"cute"`
|
||||||
|
Cool int `json:"cool"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccessoryInfo struct {
|
||||||
|
AccessoryOwningUserID int `json:"accessory_owning_user_id"`
|
||||||
|
AccessoryID int `json:"accessory_id"`
|
||||||
|
Exp int `json:"exp"`
|
||||||
|
NextExp int `json:"next_exp"`
|
||||||
|
Level int `json:"level"`
|
||||||
|
MaxLevel int `json:"max_level"`
|
||||||
|
RankUpCount int `json:"rank_up_count"`
|
||||||
|
FavoriteFlag bool `json:"favorite_flag"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type UnitList struct {
|
||||||
|
UnitID int `json:"unit_id"`
|
||||||
|
Position int `json:"position"`
|
||||||
|
Level int `json:"level"`
|
||||||
|
LevelLimitID int `json:"level_limit_id"`
|
||||||
|
DisplayRank int `json:"display_rank"`
|
||||||
|
Love int `json:"love"`
|
||||||
|
UnitSkillLevel int `json:"unit_skill_level"`
|
||||||
|
IsRankMax bool `json:"is_rank_max"`
|
||||||
|
IsLoveMax bool `json:"is_love_max"`
|
||||||
|
IsLevelMax bool `json:"is_level_max"`
|
||||||
|
IsSigned bool `json:"is_signed"`
|
||||||
|
Rank int `json:"rank"`
|
||||||
|
MaxHp int `json:"max_hp"`
|
||||||
|
UnitRemovableSkillCapacity int `json:"unit_removable_skill_capacity"`
|
||||||
|
RemovableSkillIds []int `json:"removable_skill_ids"`
|
||||||
|
TotalStatus TotalStatus `json:"total_status"`
|
||||||
|
SiBonus SiBonus `json:"si_bonus"`
|
||||||
|
AccessoryInfo *AccessoryInfo `json:"accessory_info,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DeckInfo struct {
|
||||||
|
LiveDifficultyID int `json:"live_difficulty_id"`
|
||||||
|
TotalStatus TotalStatus `json:"total_status"`
|
||||||
|
CenterBonus CenterBonus `json:"center_bonus"`
|
||||||
|
SiBonus SiBonus `json:"si_bonus"`
|
||||||
|
UnitList []UnitList `json:"unit_list"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Icon struct {
|
||||||
|
NormalID int `json:"normal_id"`
|
||||||
|
JustID int `json:"just_id"`
|
||||||
|
SlideID int `json:"slide_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type LiveSetting struct {
|
||||||
|
NotesSpeed float64 `json:"notes_speed"`
|
||||||
|
CutinBrightness int `json:"cutin_brightness"`
|
||||||
|
CutinType int `json:"cutin_type"`
|
||||||
|
EffectFlag bool `json:"effect_flag"`
|
||||||
|
StringSize int `json:"string_size"`
|
||||||
|
SeID int `json:"se_id"`
|
||||||
|
Icon Icon `json:"icon"`
|
||||||
|
BackgroundID int `json:"background_id"`
|
||||||
|
RandomValue int `json:"random_value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type TriggerLog struct {
|
||||||
|
Position int `json:"position"`
|
||||||
|
ActivationRate int `json:"activation_rate"`
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package noticeschema
|
package noticeschema
|
||||||
|
|
||||||
type UserGreetingData struct {
|
type UserGreetingData struct {
|
||||||
ItemCount int `json:"item_count"`
|
ItemCount int64 `json:"item_count"`
|
||||||
HasNext bool `json:"has_next"`
|
HasNext bool `json:"has_next"`
|
||||||
NoticeList []UserGreetingNotice `json:"notice_list"`
|
NoticeList []UserGreetingNotice `json:"notice_list"`
|
||||||
ServerTimestamp int64 `json:"server_timestamp"`
|
ServerTimestamp int64 `json:"server_timestamp"`
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package session
|
|||||||
import (
|
import (
|
||||||
accessorymodel "honoka-chan/internal/model/accessory"
|
accessorymodel "honoka-chan/internal/model/accessory"
|
||||||
usermodel "honoka-chan/internal/model/user"
|
usermodel "honoka-chan/internal/model/user"
|
||||||
|
liverecordschema "honoka-chan/internal/schema/liverecord"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (ss *Session) GetUserAccessoryWearByUnitOwningUserID(unitOwningUserID int) (bool, *usermodel.UserAccessoryWear) {
|
func (ss *Session) GetUserAccessoryWearByUnitOwningUserID(unitOwningUserID int) (bool, *usermodel.UserAccessoryWear) {
|
||||||
@@ -29,7 +30,7 @@ func (ss *Session) GetAccessoryByAccessoryOwningUserID(accessoryOwningUserID int
|
|||||||
return has, &accessoryData
|
return has, &accessoryData
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ss *Session) GetUserAccessoryInfoByUnitOwningUserID(unitOwningUserID int) (bool, *usermodel.AccessoryInfo) {
|
func (ss *Session) GetUserAccessoryInfoByUnitOwningUserID(unitOwningUserID int) (bool, *liverecordschema.AccessoryInfo) {
|
||||||
has, wearData := ss.GetUserAccessoryWearByUnitOwningUserID(unitOwningUserID)
|
has, wearData := ss.GetUserAccessoryWearByUnitOwningUserID(unitOwningUserID)
|
||||||
if !has {
|
if !has {
|
||||||
return false, nil
|
return false, nil
|
||||||
@@ -40,7 +41,7 @@ func (ss *Session) GetUserAccessoryInfoByUnitOwningUserID(unitOwningUserID int)
|
|||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return has, &usermodel.AccessoryInfo{
|
return has, &liverecordschema.AccessoryInfo{
|
||||||
AccessoryOwningUserID: wearData.AccessoryOwningUserID,
|
AccessoryOwningUserID: wearData.AccessoryOwningUserID,
|
||||||
AccessoryID: accessoryData.AccessoryID,
|
AccessoryID: accessoryData.AccessoryID,
|
||||||
Exp: accessoryData.Exp,
|
Exp: accessoryData.Exp,
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"honoka-chan/internal/constant"
|
"honoka-chan/internal/constant"
|
||||||
usermodel "honoka-chan/internal/model/user"
|
usermodel "honoka-chan/internal/model/user"
|
||||||
liveschema "honoka-chan/internal/schema/live"
|
liveschema "honoka-chan/internal/schema/live"
|
||||||
|
liverecordschema "honoka-chan/internal/schema/liverecord"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Move from LevelDB to SQLite
|
// Move from LevelDB to SQLite
|
||||||
@@ -110,14 +111,14 @@ func (ss *Session) GetLiveInfo(LiveDifficultyID int) (bool, *liveschema.LiveInfo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ss *Session) GetDeckInfo(deckID int) (bool, *usermodel.DeckInfo) {
|
func (ss *Session) GetDeckInfo(deckID int) (bool, *liverecordschema.DeckInfo) {
|
||||||
// 卡片信息
|
// 卡片信息
|
||||||
totalHp, totalSmile, totalCute, totalCool := 0, 0, 0, 0
|
totalHp, totalSmile, totalCute, totalCool := 0, 0, 0, 0
|
||||||
unitData := []usermodel.UnitList{}
|
unitData := []liverecordschema.UnitList{}
|
||||||
units := ss.GetUserDeckUnit(deckID)
|
units := ss.GetUserDeckUnit(deckID)
|
||||||
for _, u := range units {
|
for _, u := range units {
|
||||||
_, uData := ss.GetUnitInfo(u.UnitID)
|
_, uData := ss.GetUnitInfo(u.UnitID)
|
||||||
tempUnitData := usermodel.UnitList{
|
tempUnitData := liverecordschema.UnitList{
|
||||||
UnitID: u.UnitID,
|
UnitID: u.UnitID,
|
||||||
Position: u.Position,
|
Position: u.Position,
|
||||||
Level: u.Level,
|
Level: u.Level,
|
||||||
@@ -132,13 +133,13 @@ func (ss *Session) GetDeckInfo(deckID int) (bool, *usermodel.DeckInfo) {
|
|||||||
Rank: uData.Rank,
|
Rank: uData.Rank,
|
||||||
MaxHp: uData.MaxHp,
|
MaxHp: uData.MaxHp,
|
||||||
UnitRemovableSkillCapacity: uData.UnitRemovableSkillCapacity,
|
UnitRemovableSkillCapacity: uData.UnitRemovableSkillCapacity,
|
||||||
TotalStatus: usermodel.TotalStatus{
|
TotalStatus: liverecordschema.TotalStatus{
|
||||||
Hp: uData.MaxHp,
|
Hp: uData.MaxHp,
|
||||||
Smile: uData.Smile,
|
Smile: uData.Smile,
|
||||||
Cute: uData.Cute,
|
Cute: uData.Cute,
|
||||||
Cool: uData.Cool,
|
Cool: uData.Cool,
|
||||||
},
|
},
|
||||||
SiBonus: usermodel.SiBonus{
|
SiBonus: liverecordschema.SiBonus{
|
||||||
Hp: 0,
|
Hp: 0,
|
||||||
Smile: 0,
|
Smile: 0,
|
||||||
Cute: 0,
|
Cute: 0,
|
||||||
@@ -165,20 +166,20 @@ func (ss *Session) GetDeckInfo(deckID int) (bool, *usermodel.DeckInfo) {
|
|||||||
unitData = append(unitData, tempUnitData)
|
unitData = append(unitData, tempUnitData)
|
||||||
}
|
}
|
||||||
|
|
||||||
return true, &usermodel.DeckInfo{
|
return true, &liverecordschema.DeckInfo{
|
||||||
TotalStatus: usermodel.TotalStatus{
|
TotalStatus: liverecordschema.TotalStatus{
|
||||||
Hp: totalHp,
|
Hp: totalHp,
|
||||||
Smile: totalSmile,
|
Smile: totalSmile,
|
||||||
Cute: totalCute,
|
Cute: totalCute,
|
||||||
Cool: totalCool,
|
Cool: totalCool,
|
||||||
},
|
},
|
||||||
CenterBonus: usermodel.CenterBonus{ // TODO: 计算C位加成
|
CenterBonus: liverecordschema.CenterBonus{ // TODO: 计算C位加成
|
||||||
Hp: 0,
|
Hp: 0,
|
||||||
Smile: 0,
|
Smile: 0,
|
||||||
Cute: 0,
|
Cute: 0,
|
||||||
Cool: 0,
|
Cool: 0,
|
||||||
},
|
},
|
||||||
SiBonus: usermodel.SiBonus{
|
SiBonus: liverecordschema.SiBonus{
|
||||||
Hp: 0,
|
Hp: 0,
|
||||||
Smile: 0,
|
Smile: 0,
|
||||||
Cute: 0,
|
Cute: 0,
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"honoka-chan/pkg/utils"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
const serverDataPath = "assets/serverdata"
|
||||||
|
|
||||||
|
func LoadServerData[T any](fileName string) (T, error) {
|
||||||
|
var data T
|
||||||
|
filePath := filepath.Join(serverDataPath, fileName)
|
||||||
|
err := json.Unmarshal([]byte(utils.ReadAllText(filePath)), &data)
|
||||||
|
return data, err
|
||||||
|
}
|
||||||
@@ -1,620 +0,0 @@
|
|||||||
// Copyright 2012 Google, Inc. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style license
|
|
||||||
// that can be found in the LICENSE file in the root of the source
|
|
||||||
// tree.
|
|
||||||
|
|
||||||
// The pcapdump binary implements a tcpdump-like command line tool with gopacket
|
|
||||||
// using pcap as a backend data collection mechanism.
|
|
||||||
package sifcap
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"bytes"
|
|
||||||
"compress/gzip"
|
|
||||||
"encoding/binary"
|
|
||||||
"encoding/hex"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"os/signal"
|
|
||||||
"runtime/pprof"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/google/gopacket"
|
|
||||||
"github.com/google/gopacket/examples/util"
|
|
||||||
"github.com/google/gopacket/ip4defrag"
|
|
||||||
"github.com/google/gopacket/layers" // pulls in all layers decoders
|
|
||||||
"github.com/google/gopacket/pcap"
|
|
||||||
"github.com/google/gopacket/reassembly"
|
|
||||||
)
|
|
||||||
|
|
||||||
var maxcount = flag.Int("c", -1, "Only grab this many packets, then exit")
|
|
||||||
var decoder = flag.String("decoder", "", "Name of the decoder to use (default: guess from capture)")
|
|
||||||
var statsevery = flag.Int("stats", 1000, "Output statistics every N packets")
|
|
||||||
var lazy = flag.Bool("lazy", false, "If true, do lazy decoding")
|
|
||||||
var nodefrag = flag.Bool("nodefrag", false, "If true, do not do IPv4 defrag")
|
|
||||||
var checksum = flag.Bool("checksum", false, "Check TCP checksum")
|
|
||||||
var nooptcheck = flag.Bool("nooptcheck", false, "Do not check TCP options (useful to ignore MSS on captures with TSO)")
|
|
||||||
var ignorefsmerr = flag.Bool("ignorefsmerr", false, "Ignore TCP FSM errors")
|
|
||||||
var allowmissinginit = flag.Bool("allowmissinginit", false, "Support streams without SYN/SYN+ACK/ACK sequence")
|
|
||||||
var verbose = flag.Bool("verbose", false, "Be verbose")
|
|
||||||
var debug = flag.Bool("debug", false, "Display debug information")
|
|
||||||
var quiet = flag.Bool("quiet", true, "Be quiet regarding errors")
|
|
||||||
|
|
||||||
// http
|
|
||||||
var nohttp = flag.Bool("nohttp", false, "Disable HTTP parsing")
|
|
||||||
|
|
||||||
var hexdump = flag.Bool("dump", false, "Dump HTTP request/response as hex")
|
|
||||||
var hexdumppkt = flag.Bool("dumppkt", false, "Dump packet as hex")
|
|
||||||
|
|
||||||
// capture
|
|
||||||
var iface = flag.String("i", "enp8s0", "Interface to read packets from")
|
|
||||||
var fname = flag.String("r", "", "Filename to read from, overrides -i")
|
|
||||||
var snaplen = flag.Int("s", 65536, "Snap length (number of bytes max to read per packet")
|
|
||||||
var tstype = flag.String("timestamp_type", "", "Type of timestamps to use")
|
|
||||||
var promisc = flag.Bool("promisc", true, "Set promiscuous mode")
|
|
||||||
|
|
||||||
var memprofile = flag.String("memprofile", "", "Write memory profile")
|
|
||||||
|
|
||||||
var stats struct {
|
|
||||||
ipdefrag int
|
|
||||||
missedBytes int
|
|
||||||
pkt int
|
|
||||||
sz int
|
|
||||||
totalsz int
|
|
||||||
rejectFsm int
|
|
||||||
rejectOpt int
|
|
||||||
rejectConnFsm int
|
|
||||||
reassembled int
|
|
||||||
outOfOrderBytes int
|
|
||||||
outOfOrderPackets int
|
|
||||||
biggestChunkBytes int
|
|
||||||
biggestChunkPackets int
|
|
||||||
overlapBytes int
|
|
||||||
overlapPackets int
|
|
||||||
}
|
|
||||||
|
|
||||||
const closeTimeout time.Duration = time.Hour * 24 // Closing inactive: TODO: from CLI
|
|
||||||
const timeout time.Duration = time.Minute * 5 // Pending bytes: TODO: from CLI
|
|
||||||
|
|
||||||
/*
|
|
||||||
* HTTP part
|
|
||||||
*/
|
|
||||||
|
|
||||||
type httpReader struct {
|
|
||||||
ident string
|
|
||||||
isClient bool
|
|
||||||
bytes chan []byte
|
|
||||||
data []byte
|
|
||||||
hexdump bool
|
|
||||||
parent *tcpStream
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *httpReader) Read(p []byte) (int, error) {
|
|
||||||
ok := true
|
|
||||||
for ok && len(h.data) == 0 {
|
|
||||||
h.data, ok = <-h.bytes
|
|
||||||
}
|
|
||||||
if !ok || len(h.data) == 0 {
|
|
||||||
return 0, io.EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
l := copy(p, h.data)
|
|
||||||
h.data = h.data[l:]
|
|
||||||
return l, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var outputLevel int
|
|
||||||
var errorsMap map[string]uint
|
|
||||||
var errorsMapMutex sync.Mutex
|
|
||||||
var errors uint
|
|
||||||
|
|
||||||
// Too bad for perf that a... is evaluated
|
|
||||||
func Error(t string, s string, a ...any) {
|
|
||||||
errorsMapMutex.Lock()
|
|
||||||
errors++
|
|
||||||
errorsMap[t] = errorsMap[t] + 1
|
|
||||||
errorsMapMutex.Unlock()
|
|
||||||
if outputLevel >= 0 {
|
|
||||||
fmt.Printf(s, a...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func Info(s string, a ...any) {
|
|
||||||
if outputLevel >= 1 {
|
|
||||||
fmt.Printf(s, a...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func Debug(s string, a ...any) {
|
|
||||||
if outputLevel >= 2 {
|
|
||||||
fmt.Printf(s, a...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *httpReader) run(wg *sync.WaitGroup) {
|
|
||||||
defer wg.Done()
|
|
||||||
b := bufio.NewReader(h)
|
|
||||||
for {
|
|
||||||
if h.isClient {
|
|
||||||
req, err := http.ReadRequest(b)
|
|
||||||
if err == io.EOF || err == io.ErrUnexpectedEOF {
|
|
||||||
break
|
|
||||||
} else if err != nil {
|
|
||||||
Error("HTTP-request", "HTTP/%s Request error: %s (%v,%+v)\n", h.ident, err, err, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
body, err := io.ReadAll(req.Body)
|
|
||||||
s := len(body)
|
|
||||||
if err != nil {
|
|
||||||
Error("HTTP-request-body", "Got body err: %s\n", err)
|
|
||||||
} else if h.hexdump {
|
|
||||||
Info("Body(%d/0x%x)\n%s\n", len(body), len(body), hex.Dump(body))
|
|
||||||
}
|
|
||||||
req.Body.Close()
|
|
||||||
Info("HTTP/%s Request: %s %s (body:%d)\n", h.ident, req.Method, req.URL, s)
|
|
||||||
h.parent.Lock()
|
|
||||||
h.parent.urls = append(h.parent.urls, req.URL.String())
|
|
||||||
h.parent.Unlock()
|
|
||||||
} else {
|
|
||||||
res, err := http.ReadResponse(b, nil)
|
|
||||||
var req string
|
|
||||||
h.parent.Lock()
|
|
||||||
if len(h.parent.urls) == 0 {
|
|
||||||
req = "<no-request-seen>"
|
|
||||||
} else {
|
|
||||||
req, h.parent.urls = h.parent.urls[0], h.parent.urls[1:]
|
|
||||||
}
|
|
||||||
h.parent.Unlock()
|
|
||||||
if err == io.EOF || err == io.ErrUnexpectedEOF {
|
|
||||||
break
|
|
||||||
} else if err != nil {
|
|
||||||
Error("HTTP-response", "HTTP/%s Response error: %s (%v,%+v)\n", h.ident, err, err, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
body, _ := io.ReadAll(res.Body)
|
|
||||||
s := len(body)
|
|
||||||
if err != nil {
|
|
||||||
Error("HTTP-response-body", "HTTP/%s: failed to get body(parsed len:%d): %s\n", h.ident, s, err)
|
|
||||||
}
|
|
||||||
if h.hexdump {
|
|
||||||
Info("Body(%d/0x%x)\n%s\n", len(body), len(body), hex.Dump(body))
|
|
||||||
}
|
|
||||||
res.Body.Close()
|
|
||||||
sym := ","
|
|
||||||
if res.ContentLength > 0 && res.ContentLength != int64(s) {
|
|
||||||
sym = "!="
|
|
||||||
}
|
|
||||||
contentType, ok := res.Header["Content-Type"]
|
|
||||||
if !ok {
|
|
||||||
contentType = []string{http.DetectContentType(body)}
|
|
||||||
}
|
|
||||||
encoding := res.Header["Content-Encoding"]
|
|
||||||
Info("HTTP/%s Response: %s URL:%s (%d%s%d%s) -> %s\n", h.ident, res.Status, req, res.ContentLength, sym, s, contentType, encoding[0])
|
|
||||||
if err == nil {
|
|
||||||
var r io.Reader
|
|
||||||
r = bytes.NewBuffer(body)
|
|
||||||
if len(encoding) > 0 && (encoding[0] == "gzip" || encoding[0] == "deflate") {
|
|
||||||
r, err = gzip.NewReader(r)
|
|
||||||
if err != nil {
|
|
||||||
Error("HTTP-gunzip", "Failed to gzip decode: %s", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
res, _ := io.ReadAll(r)
|
|
||||||
fmt.Println(string(res))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The TCP factory: returns a new Stream
|
|
||||||
*/
|
|
||||||
type tcpStreamFactory struct {
|
|
||||||
wg sync.WaitGroup
|
|
||||||
doHTTP bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (factory *tcpStreamFactory) New(net, transport gopacket.Flow, tcp *layers.TCP, ac reassembly.AssemblerContext) reassembly.Stream {
|
|
||||||
Debug("* NEW: %s %s\n", net, transport)
|
|
||||||
fsmOptions := reassembly.TCPSimpleFSMOptions{
|
|
||||||
SupportMissingEstablishment: *allowmissinginit,
|
|
||||||
}
|
|
||||||
stream := &tcpStream{
|
|
||||||
net: net,
|
|
||||||
transport: transport,
|
|
||||||
isDNS: tcp.SrcPort == 53 || tcp.DstPort == 53,
|
|
||||||
isHTTP: (tcp.SrcPort == 80 || tcp.DstPort == 80) && factory.doHTTP,
|
|
||||||
reversed: tcp.SrcPort == 80,
|
|
||||||
tcpstate: reassembly.NewTCPSimpleFSM(fsmOptions),
|
|
||||||
ident: fmt.Sprintf("%s:%s", net, transport),
|
|
||||||
optchecker: reassembly.NewTCPOptionCheck(),
|
|
||||||
}
|
|
||||||
if stream.isHTTP {
|
|
||||||
stream.client = httpReader{
|
|
||||||
bytes: make(chan []byte),
|
|
||||||
ident: fmt.Sprintf("%s %s", net, transport),
|
|
||||||
hexdump: *hexdump,
|
|
||||||
parent: stream,
|
|
||||||
isClient: true,
|
|
||||||
}
|
|
||||||
stream.server = httpReader{
|
|
||||||
bytes: make(chan []byte),
|
|
||||||
ident: fmt.Sprintf("%s %s", net.Reverse(), transport.Reverse()),
|
|
||||||
hexdump: *hexdump,
|
|
||||||
parent: stream,
|
|
||||||
}
|
|
||||||
factory.wg.Add(2)
|
|
||||||
go stream.client.run(&factory.wg)
|
|
||||||
go stream.server.run(&factory.wg)
|
|
||||||
}
|
|
||||||
return stream
|
|
||||||
}
|
|
||||||
|
|
||||||
func (factory *tcpStreamFactory) WaitGoRoutines() {
|
|
||||||
factory.wg.Wait()
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The assembler context
|
|
||||||
*/
|
|
||||||
type Context struct {
|
|
||||||
CaptureInfo gopacket.CaptureInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Context) GetCaptureInfo() gopacket.CaptureInfo {
|
|
||||||
return c.CaptureInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TCP stream
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* It's a connection (bidirectional) */
|
|
||||||
type tcpStream struct {
|
|
||||||
tcpstate *reassembly.TCPSimpleFSM
|
|
||||||
fsmerr bool
|
|
||||||
optchecker reassembly.TCPOptionCheck
|
|
||||||
net, transport gopacket.Flow
|
|
||||||
isDNS bool
|
|
||||||
isHTTP bool
|
|
||||||
reversed bool
|
|
||||||
client httpReader
|
|
||||||
server httpReader
|
|
||||||
urls []string
|
|
||||||
ident string
|
|
||||||
sync.Mutex
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *tcpStream) Accept(tcp *layers.TCP, ci gopacket.CaptureInfo, dir reassembly.TCPFlowDirection, nextSeq reassembly.Sequence, start *bool, ac reassembly.AssemblerContext) bool {
|
|
||||||
// FSM
|
|
||||||
if !t.tcpstate.CheckState(tcp, dir) {
|
|
||||||
Error("FSM", "%s: Packet rejected by FSM (state:%s)\n", t.ident, t.tcpstate.String())
|
|
||||||
stats.rejectFsm++
|
|
||||||
if !t.fsmerr {
|
|
||||||
t.fsmerr = true
|
|
||||||
stats.rejectConnFsm++
|
|
||||||
}
|
|
||||||
if !*ignorefsmerr {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Options
|
|
||||||
err := t.optchecker.Accept(tcp, ci, dir, nextSeq, start)
|
|
||||||
if err != nil {
|
|
||||||
Error("OptionChecker", "%s: Packet rejected by OptionChecker: %s\n", t.ident, err)
|
|
||||||
stats.rejectOpt++
|
|
||||||
if !*nooptcheck {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Checksum
|
|
||||||
accept := true
|
|
||||||
if *checksum {
|
|
||||||
c, err := tcp.ComputeChecksum()
|
|
||||||
if err != nil {
|
|
||||||
Error("ChecksumCompute", "%s: Got error computing checksum: %s\n", t.ident, err)
|
|
||||||
accept = false
|
|
||||||
} else if c != 0x0 {
|
|
||||||
Error("Checksum", "%s: Invalid checksum: 0x%x\n", t.ident, c)
|
|
||||||
accept = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !accept {
|
|
||||||
stats.rejectOpt++
|
|
||||||
}
|
|
||||||
return accept
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *tcpStream) ReassembledSG(sg reassembly.ScatterGather, ac reassembly.AssemblerContext) {
|
|
||||||
dir, start, end, skip := sg.Info()
|
|
||||||
length, saved := sg.Lengths()
|
|
||||||
// update stats
|
|
||||||
sgStats := sg.Stats()
|
|
||||||
if skip > 0 {
|
|
||||||
stats.missedBytes += skip
|
|
||||||
}
|
|
||||||
stats.sz += length - saved
|
|
||||||
stats.pkt += sgStats.Packets
|
|
||||||
if sgStats.Chunks > 1 {
|
|
||||||
stats.reassembled++
|
|
||||||
}
|
|
||||||
stats.outOfOrderPackets += sgStats.QueuedPackets
|
|
||||||
stats.outOfOrderBytes += sgStats.QueuedBytes
|
|
||||||
if length > stats.biggestChunkBytes {
|
|
||||||
stats.biggestChunkBytes = length
|
|
||||||
}
|
|
||||||
if sgStats.Packets > stats.biggestChunkPackets {
|
|
||||||
stats.biggestChunkPackets = sgStats.Packets
|
|
||||||
}
|
|
||||||
if sgStats.OverlapBytes != 0 && sgStats.OverlapPackets == 0 {
|
|
||||||
fmt.Printf("bytes:%d, pkts:%d\n", sgStats.OverlapBytes, sgStats.OverlapPackets)
|
|
||||||
panic("Invalid overlap")
|
|
||||||
}
|
|
||||||
stats.overlapBytes += sgStats.OverlapBytes
|
|
||||||
stats.overlapPackets += sgStats.OverlapPackets
|
|
||||||
|
|
||||||
var ident string
|
|
||||||
if dir == reassembly.TCPDirClientToServer {
|
|
||||||
ident = fmt.Sprintf("%v %v(%s): ", t.net, t.transport, dir)
|
|
||||||
} else {
|
|
||||||
ident = fmt.Sprintf("%v %v(%s): ", t.net.Reverse(), t.transport.Reverse(), dir)
|
|
||||||
}
|
|
||||||
Debug("%s: SG reassembled packet with %d bytes (start:%v,end:%v,skip:%d,saved:%d,nb:%d,%d,overlap:%d,%d)\n", ident, length, start, end, skip, saved, sgStats.Packets, sgStats.Chunks, sgStats.OverlapBytes, sgStats.OverlapPackets)
|
|
||||||
if skip == -1 && *allowmissinginit {
|
|
||||||
// this is allowed
|
|
||||||
} else if skip != 0 {
|
|
||||||
// Missing bytes in stream: do not even try to parse it
|
|
||||||
return
|
|
||||||
}
|
|
||||||
data := sg.Fetch(length)
|
|
||||||
if t.isDNS {
|
|
||||||
dns := &layers.DNS{}
|
|
||||||
var decoded []gopacket.LayerType
|
|
||||||
if len(data) < 2 {
|
|
||||||
if len(data) > 0 {
|
|
||||||
sg.KeepFrom(0)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
dnsSize := binary.BigEndian.Uint16(data[:2])
|
|
||||||
missing := int(dnsSize) - len(data[2:])
|
|
||||||
Debug("dnsSize: %d, missing: %d\n", dnsSize, missing)
|
|
||||||
if missing > 0 {
|
|
||||||
Info("Missing some bytes: %d\n", missing)
|
|
||||||
sg.KeepFrom(0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
p := gopacket.NewDecodingLayerParser(layers.LayerTypeDNS, dns)
|
|
||||||
err := p.DecodeLayers(data[2:], &decoded)
|
|
||||||
if err != nil {
|
|
||||||
Error("DNS-parser", "Failed to decode DNS: %v\n", err)
|
|
||||||
} else {
|
|
||||||
Debug("DNS: %s\n", gopacket.LayerDump(dns))
|
|
||||||
}
|
|
||||||
if len(data) > 2+int(dnsSize) {
|
|
||||||
sg.KeepFrom(2 + int(dnsSize))
|
|
||||||
}
|
|
||||||
} else if t.isHTTP {
|
|
||||||
if length > 0 {
|
|
||||||
if *hexdump {
|
|
||||||
Debug("Feeding http with:\n%s", hex.Dump(data))
|
|
||||||
}
|
|
||||||
if dir == reassembly.TCPDirClientToServer && !t.reversed {
|
|
||||||
t.client.bytes <- data
|
|
||||||
} else {
|
|
||||||
t.server.bytes <- data
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *tcpStream) ReassemblyComplete(ac reassembly.AssemblerContext) bool {
|
|
||||||
Debug("%s: Connection closed\n", t.ident)
|
|
||||||
if t.isHTTP {
|
|
||||||
close(t.client.bytes)
|
|
||||||
close(t.server.bytes)
|
|
||||||
}
|
|
||||||
// do not remove the connection to allow last ACK
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func Start() {
|
|
||||||
defer util.Run()()
|
|
||||||
var handle *pcap.Handle
|
|
||||||
var err error
|
|
||||||
if *debug {
|
|
||||||
outputLevel = 2
|
|
||||||
} else if *verbose {
|
|
||||||
outputLevel = 1
|
|
||||||
} else if *quiet {
|
|
||||||
outputLevel = -1
|
|
||||||
}
|
|
||||||
errorsMap = make(map[string]uint)
|
|
||||||
if *fname != "" {
|
|
||||||
if handle, err = pcap.OpenOffline(*fname); err != nil {
|
|
||||||
log.Fatal("PCAP OpenOffline error:", err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// This is a little complicated because we want to allow all possible options
|
|
||||||
// for creating the packet capture handle... instead of all this you can
|
|
||||||
// just call pcap.OpenLive if you want a simple handle.
|
|
||||||
inactive, err := pcap.NewInactiveHandle(*iface)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("could not create: %v", err)
|
|
||||||
}
|
|
||||||
defer inactive.CleanUp()
|
|
||||||
if err = inactive.SetSnapLen(*snaplen); err != nil {
|
|
||||||
log.Fatalf("could not set snap length: %v", err)
|
|
||||||
} else if err = inactive.SetPromisc(*promisc); err != nil {
|
|
||||||
log.Fatalf("could not set promisc mode: %v", err)
|
|
||||||
} else if err = inactive.SetTimeout(time.Second); err != nil {
|
|
||||||
log.Fatalf("could not set timeout: %v", err)
|
|
||||||
}
|
|
||||||
if *tstype != "" {
|
|
||||||
if t, err := pcap.TimestampSourceFromString(*tstype); err != nil {
|
|
||||||
log.Fatalf("Supported timestamp types: %v", inactive.SupportedTimestamps())
|
|
||||||
} else if err := inactive.SetTimestampSource(t); err != nil {
|
|
||||||
log.Fatalf("Supported timestamp types: %v", inactive.SupportedTimestamps())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if handle, err = inactive.Activate(); err != nil {
|
|
||||||
log.Fatal("PCAP Activate error:", err)
|
|
||||||
}
|
|
||||||
defer handle.Close()
|
|
||||||
}
|
|
||||||
if len(flag.Args()) > 0 {
|
|
||||||
bpffilter := strings.Join(flag.Args(), " ")
|
|
||||||
Info("Using BPF filter %q\n", bpffilter)
|
|
||||||
if err = handle.SetBPFFilter(bpffilter); err != nil {
|
|
||||||
log.Fatal("BPF filter error:", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var dec gopacket.Decoder
|
|
||||||
var ok bool
|
|
||||||
decoder_name := *decoder
|
|
||||||
if decoder_name == "" {
|
|
||||||
decoder_name = handle.LinkType().String()
|
|
||||||
}
|
|
||||||
if dec, ok = gopacket.DecodersByLayerName[decoder_name]; !ok {
|
|
||||||
log.Fatalln("No decoder named", decoder_name)
|
|
||||||
}
|
|
||||||
source := gopacket.NewPacketSource(handle, dec)
|
|
||||||
source.Lazy = *lazy
|
|
||||||
source.NoCopy = true
|
|
||||||
Info("Starting to read packets\n")
|
|
||||||
count := 0
|
|
||||||
bytes := int64(0)
|
|
||||||
start := time.Now()
|
|
||||||
defragger := ip4defrag.NewIPv4Defragmenter()
|
|
||||||
|
|
||||||
streamFactory := &tcpStreamFactory{doHTTP: !*nohttp}
|
|
||||||
streamPool := reassembly.NewStreamPool(streamFactory)
|
|
||||||
assembler := reassembly.NewAssembler(streamPool)
|
|
||||||
|
|
||||||
signalChan := make(chan os.Signal, 1)
|
|
||||||
signal.Notify(signalChan, os.Interrupt)
|
|
||||||
|
|
||||||
for packet := range source.Packets() {
|
|
||||||
count++
|
|
||||||
Debug("PACKET #%d\n", count)
|
|
||||||
data := packet.Data()
|
|
||||||
bytes += int64(len(data))
|
|
||||||
if *hexdumppkt {
|
|
||||||
Debug("Packet content (%d/0x%x)\n%s\n", len(data), len(data), hex.Dump(data))
|
|
||||||
}
|
|
||||||
|
|
||||||
// defrag the IPv4 packet if required
|
|
||||||
if !*nodefrag {
|
|
||||||
ip4Layer := packet.Layer(layers.LayerTypeIPv4)
|
|
||||||
if ip4Layer == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
ip4 := ip4Layer.(*layers.IPv4)
|
|
||||||
l := ip4.Length
|
|
||||||
newip4, err := defragger.DefragIPv4(ip4)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln("Error while de-fragmenting", err)
|
|
||||||
} else if newip4 == nil {
|
|
||||||
Debug("Fragment...\n")
|
|
||||||
continue // packet fragment, we don't have whole packet yet.
|
|
||||||
}
|
|
||||||
if newip4.Length != l {
|
|
||||||
stats.ipdefrag++
|
|
||||||
Debug("Decoding re-assembled packet: %s\n", newip4.NextLayerType())
|
|
||||||
pb, ok := packet.(gopacket.PacketBuilder)
|
|
||||||
if !ok {
|
|
||||||
panic("Not a PacketBuilder")
|
|
||||||
}
|
|
||||||
nextDecoder := newip4.NextLayerType()
|
|
||||||
nextDecoder.Decode(newip4.Payload, pb)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tcp := packet.Layer(layers.LayerTypeTCP)
|
|
||||||
if tcp != nil {
|
|
||||||
tcp := tcp.(*layers.TCP)
|
|
||||||
if *checksum {
|
|
||||||
err := tcp.SetNetworkLayerForChecksum(packet.NetworkLayer())
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to set network layer for checksum: %s\n", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
c := Context{
|
|
||||||
CaptureInfo: packet.Metadata().CaptureInfo,
|
|
||||||
}
|
|
||||||
stats.totalsz += len(tcp.Payload)
|
|
||||||
assembler.AssembleWithContext(packet.NetworkLayer().NetworkFlow(), tcp, &c)
|
|
||||||
}
|
|
||||||
if count%*statsevery == 0 {
|
|
||||||
ref := packet.Metadata().CaptureInfo.Timestamp
|
|
||||||
flushed, closed := assembler.FlushWithOptions(reassembly.FlushOptions{T: ref.Add(-timeout), TC: ref.Add(-closeTimeout)})
|
|
||||||
Debug("Forced flush: %d flushed, %d closed (%s)", flushed, closed, ref)
|
|
||||||
}
|
|
||||||
|
|
||||||
done := *maxcount > 0 && count >= *maxcount
|
|
||||||
if count%*statsevery == 0 || done {
|
|
||||||
errorsMapMutex.Lock()
|
|
||||||
errorMapLen := len(errorsMap)
|
|
||||||
errorsMapMutex.Unlock()
|
|
||||||
fmt.Fprintf(os.Stderr, "Processed %v packets (%v bytes) in %v (errors: %v, errTypes:%v)\n", count, bytes, time.Since(start), errors, errorMapLen)
|
|
||||||
}
|
|
||||||
select {
|
|
||||||
case <-signalChan:
|
|
||||||
fmt.Fprintf(os.Stderr, "\nCaught SIGINT: aborting\n")
|
|
||||||
done = true
|
|
||||||
default:
|
|
||||||
// NOP: continue
|
|
||||||
}
|
|
||||||
if done {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
closed := assembler.FlushAll()
|
|
||||||
Debug("Final flush: %d closed", closed)
|
|
||||||
if outputLevel >= 2 {
|
|
||||||
streamPool.Dump()
|
|
||||||
}
|
|
||||||
|
|
||||||
if *memprofile != "" {
|
|
||||||
f, err := os.Create(*memprofile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
pprof.WriteHeapProfile(f)
|
|
||||||
f.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
streamFactory.WaitGoRoutines()
|
|
||||||
Debug("%s\n", assembler.Dump())
|
|
||||||
if !*nodefrag {
|
|
||||||
fmt.Printf("IPdefrag:\t\t%d\n", stats.ipdefrag)
|
|
||||||
}
|
|
||||||
fmt.Printf("TCP stats:\n")
|
|
||||||
fmt.Printf(" missed bytes:\t\t%d\n", stats.missedBytes)
|
|
||||||
fmt.Printf(" total packets:\t\t%d\n", stats.pkt)
|
|
||||||
fmt.Printf(" rejected FSM:\t\t%d\n", stats.rejectFsm)
|
|
||||||
fmt.Printf(" rejected Options:\t%d\n", stats.rejectOpt)
|
|
||||||
fmt.Printf(" reassembled bytes:\t%d\n", stats.sz)
|
|
||||||
fmt.Printf(" total TCP bytes:\t%d\n", stats.totalsz)
|
|
||||||
fmt.Printf(" conn rejected FSM:\t%d\n", stats.rejectConnFsm)
|
|
||||||
fmt.Printf(" reassembled chunks:\t%d\n", stats.reassembled)
|
|
||||||
fmt.Printf(" out-of-order packets:\t%d\n", stats.outOfOrderPackets)
|
|
||||||
fmt.Printf(" out-of-order bytes:\t%d\n", stats.outOfOrderBytes)
|
|
||||||
fmt.Printf(" biggest-chunk packets:\t%d\n", stats.biggestChunkPackets)
|
|
||||||
fmt.Printf(" biggest-chunk bytes:\t%d\n", stats.biggestChunkBytes)
|
|
||||||
fmt.Printf(" overlap packets:\t%d\n", stats.overlapPackets)
|
|
||||||
fmt.Printf(" overlap bytes:\t\t%d\n", stats.overlapBytes)
|
|
||||||
fmt.Printf("Errors: %d\n", errors)
|
|
||||||
for e := range errorsMap {
|
|
||||||
fmt.Printf(" %s:\t\t%d\n", e, errorsMap[e])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -36,14 +36,38 @@
|
|||||||
background-color: #e4007f;
|
background-color: #e4007f;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layui-nav-tree .layui-nav-child dd.layui-this,
|
|
||||||
.layui-nav-tree .layui-nav-child dd.layui-this a,
|
|
||||||
.layui-nav-tree .layui-this,
|
.layui-nav-tree .layui-this,
|
||||||
.layui-nav-tree .layui-this>a,
|
.layui-nav-tree .layui-this>a,
|
||||||
.layui-nav-tree .layui-this>a:hover {
|
.layui-nav-tree .layui-this>a:hover {
|
||||||
background-color: #ff6699 !important;
|
background-color: #ff6699 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.layui-nav-tree .layui-nav-child {
|
||||||
|
padding: 0 !important;
|
||||||
|
background-color: rgba(0, 0, 0, 0.18) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layui-nav-tree .layui-nav-child dd {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layui-nav-tree .layui-nav-child dd>a {
|
||||||
|
display: block;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
padding: 0 20px 0 42px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layui-nav-tree .layui-nav-child dd>a.admin-subnav-active,
|
||||||
|
.layui-nav-tree .layui-nav-child dd>a.admin-subnav-active:hover {
|
||||||
|
background-color: #ff6699 !important;
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
|
||||||
.admin-mobile-mask {
|
.admin-mobile-mask {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,14 +5,14 @@
|
|||||||
<li class="layui-nav-item {{ if eq .menu 2 }} layui-nav-itemed {{ end }}">
|
<li class="layui-nav-item {{ if eq .menu 2 }} layui-nav-itemed {{ end }}">
|
||||||
<a class="" href="javascript:;">用户设置</a>
|
<a class="" href="javascript:;">用户设置</a>
|
||||||
<dl class="layui-nav-child">
|
<dl class="layui-nav-child">
|
||||||
<dd {{ if eq .url "/admin/profile" }} class="layui-this" {{ end }}><a href="/admin/profile">个人资料</a></dd>
|
<dd><a class="{{ if eq .url "/admin/profile" }}admin-subnav-active{{ end }}" href="/admin/profile">个人资料</a></dd>
|
||||||
</dl>
|
</dl>
|
||||||
</li>
|
</li>
|
||||||
<li class="layui-nav-item {{ if eq .menu 1 }} layui-nav-itemed {{ end }}">
|
<li class="layui-nav-item {{ if eq .menu 1 }} layui-nav-itemed {{ end }}">
|
||||||
<a class="" href="javascript:;">卡片管理</a>
|
<a class="" href="javascript:;">卡片管理</a>
|
||||||
<dl class="layui-nav-child">
|
<dl class="layui-nav-child">
|
||||||
<dd {{ if eq .url "/admin/card" }} class="layui-this" {{ end }}><a href="/admin/card">卡片一览</a></dd>
|
<dd><a class="{{ if eq .url "/admin/card" }}admin-subnav-active{{ end }}" href="/admin/card">卡片一览</a></dd>
|
||||||
<dd {{ if eq .url "/admin/upload" }} class="layui-this" {{ end }}><a href="/admin/upload">卡片导入</a>
|
<dd><a class="{{ if eq .url "/admin/upload" }}admin-subnav-active{{ end }}" href="/admin/upload">卡片导入</a>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<title>SIF 小助手</title>
|
<title>SIF 小助手</title>
|
||||||
{{ template "admin/nav/css.html" . }}
|
{{ template "admin/nav/css.html" . }}
|
||||||
<style>
|
<style>
|
||||||
li {
|
.upload-help li {
|
||||||
list-style-type: decimal !important;
|
list-style-type: decimal !important;
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
}
|
}
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
<div class="layui-colla-item">
|
<div class="layui-colla-item">
|
||||||
<h2 class="layui-colla-title">使用帮助</h2>
|
<h2 class="layui-colla-title">使用帮助</h2>
|
||||||
<div class="layui-colla-content">
|
<div class="layui-colla-content">
|
||||||
<ol>
|
<ol class="upload-help">
|
||||||
<li>从 <a href="https://card.niconi.co.ni/" target="_blank">LLSIF
|
<li>从 <a href="https://card.niconi.co.ni/" target="_blank">LLSIF
|
||||||
查卡器</a> 查询需要导入的卡片 ID,卡片信息上的 No.xxx 数字。
|
查卡器</a> 查询需要导入的卡片 ID,卡片信息上的 No.xxx 数字。
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
Reference in New Issue
Block a user