-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathmain.py
More file actions
145 lines (113 loc) · 6.35 KB
/
Copy pathmain.py
File metadata and controls
145 lines (113 loc) · 6.35 KB
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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
import requests
import os
import json
hoyo_uid = os.environ['HOYO_UID']
hoyo_token = os.environ['HOYO_TOKEN']
hoyo_tmid = os.environ['HOYO_TMID']
game_code = os.environ['GAME_CODE']
gist_id = os.environ['GIST_ID']
gh_token = os.environ['GH_TOKEN']
def get_data_from_hoyolab(hoyo_uid, hoyo_token, hoyo_tmid) :
url = f'https://bbs-api-os.hoyolab.com/game_record/card/wapi/getGameRecordCard?uid={hoyo_uid}'
headers = {
'x-rpc-language': 'en-us',
'Cookie': f'ltoken_v2={hoyo_token}; ltmid_v2={hoyo_tmid};'
}
response = requests.get(url=url, headers=headers)
if response.status_code != 200 :
print(f"Error: API request failed with status code {response.status_code}")
return None
try :
json_data = response.json()
except json.JSONDecodeError :
print("Error: Failed to decode JSON response")
return None
if ('data' not in json_data) or ('list' not in json_data['data']) :
print("Error: Unexpected JSON structure")
return None
return json_data['data']['list']
def get_stat(stats, keys) :
for key in keys :
if key in stats :
return stats[key]
return "N/A"
def list_for_format(hoyo_data, game_code) :
list_hoyo_data = []
for selected_game in game_code :
for game in hoyo_data :
if game['game_id'] != int(selected_game) :
continue
game_id = game['game_id']
game_name = game['game_name']
level = game['level']
stats = {item['name'] : item['value'] for item in game['data']}
if game_id == 1 : # Honkai Impact 3rd
list_hoyo_data.append(["🎮 {:<27}".format(game_name),\
"🏆 Level : {:>4} ".format(level),\
"🏆 Battlesuits : {:>4} ".format(get_stat(stats, ['Battlesuits', 'Battlesuit Count', '装甲数'])),\
"🏆 Outfits : {:>4} ".format(get_stat(stats, ['Outfits', 'Outfit Count', '服装数'])),\
"🏆 Active Days : {:>4} ".format(get_stat(stats, ['Total Check-ins', 'Cumulative Check-in Days', '累计登舰']))])
elif game_id == 2 : # Genshin Impact
list_hoyo_data.append(["🎮 {:<27}".format(game_name),\
"🏆 Level : {:>4} ".format(level),\
"🏆 Characters : {:>4} ".format(get_stat(stats, ['Characters', 'Characters Obtained', '获得角色数'])),\
"🏆 Achievements : {:>4} ".format(get_stat(stats, ['Achievements', 'Achievements Unlocked', '成就达成数'])),\
"🏆 Active Days : {:>4} ".format(get_stat(stats, ['Active Days', 'Days Active', '活跃天数']))])
elif game_id == 6 : # Honkai: Star Rail
list_hoyo_data.append(["🎮 {:<27}".format(game_name),\
"🏆 Level : {:>4} ".format(level),\
"🏆 Characters : {:>4} ".format(get_stat(stats, ['Characters Unlocked', 'Characters', 'Characters Obtained', '已解锁角色'])),\
"🏆 Achievements : {:>4} ".format(get_stat(stats, ['Achievements Unlocked', 'Achievements', 'Achievement Count', '达成成就数'])),\
"🏆 Active Days : {:>4} ".format(get_stat(stats, ['Time Active', 'Active Days', 'Days Active', '活跃天数']))])
elif game_id == 8 : # Zenless Zone Zero
list_hoyo_data.append(["🎮 {:<27}".format(game_name),\
"🏆 Level : {:>4} ".format(level),\
"🏆 Agents : {:>4} ".format(get_stat(stats, ['Agents Recruited', 'Characters', '已解锁角色'])),\
"🏆 Achievements : {:>4} ".format(get_stat(stats, ['No. of Achievements Earned', 'Achievements', '达成成就数'])),\
"🏆 Active Days : {:>4} ".format(get_stat(stats, ['Days Active', 'Active Days', '活跃天数']))])
else : # Generic format for unknown games
list_hoyo_data.append(["🎮 {:<27}".format(game_name),\
"🏆 Level : {:>4} ".format(level),\
"🏆 Characters : {:>4} ".format(' '),\
"🏆 Achievements : {:>4} ".format(' '),\
"🏆 Active Days : {:>4} ".format(' ')])
return list_hoyo_data
def format_for_one_game(list_hoyo_data) :
str_hoyo_data = "\n".join(list_hoyo_data[0])
return str_hoyo_data
def format_for_two_games(list_hoyo_data) :
str_hoyo_data = ""
for line in range(len(list_hoyo_data[0])) :
str_hoyo_data += list_hoyo_data[0][line] + list_hoyo_data[1][line] + "\n"
return str_hoyo_data
def update_gist(str_hoyo_data, gist_id, gh_token) :
url = f'https://api.github.com/gists/{gist_id}'
headers = {
'Authorization': f'token {gh_token}',
'Accept': 'application/json'
}
data = {
'description' : '🎮 HoYoverse gameplay stats',
'files' : {'🎮 HoYoverse gameplay stats' : {'content' : str_hoyo_data}}
}
try :
response = requests.patch(url=url, headers=headers, json=data)
response.raise_for_status()
print("Gist updated successfully!")
except requests.exceptions.RequestException as e :
print(f"Error updating gist: {e}")
#################### Main ####################
if __name__ == '__main__' :
hoyo_data = get_data_from_hoyolab(hoyo_uid, hoyo_token, hoyo_tmid)
if hoyo_data :
list_hoyo_data = list_for_format(hoyo_data, game_code)
if len(game_code) == 1 :
str_hoyo_data = format_for_one_game(list_hoyo_data)
update_gist(str_hoyo_data, gist_id, gh_token)
elif len(game_code) == 2 :
str_hoyo_data = format_for_two_games(list_hoyo_data)
update_gist(str_hoyo_data, gist_id, gh_token)
else :
print("Error: Unexpected game code length")
else :
print("Failed to retrieve data from HoYoLab")