-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdata_getter.py
130 lines (121 loc) · 4.22 KB
/
data_getter.py
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
import os
import sys
import math
import requests
import json
import values
import tee_values
import date_values
import formula_parser
import time
import datetime
from logging import getLogger
logger = getLogger("ShojinPoint")
def data_refresh(val: values.values):
# dataver = val.dataver
# ver_url = "https://tools.kaminarinet.com/Shojin-Point-Web/data/data_version.json"
# res = requests.get(ver_url)
# dataver_new = json.loads(res.text)
# if dataver is None or dataver_new["problems"] > dataver:
# download_problems()
# print("dl_problems")
# val.dataver = dataver_new["problems"]
return get(val)
def get(val: values.values):
user = val.user
begin = val.begin_date
end = val.end_date
day = val.day
formula = val.formula
valx = val.valx
valy = val.valy
valz = val.valz
if user is None or begin is None or end is None or day is None or formula is None:
return None
submissions = user_submissions(val,user)
accepted = submissions["accepted"]
probs = problems()
tee_sum = tee_values.tee_sum(accepted, probs, begin, end)
tee_sum_today = tee_values.tee_sum_on_day(accepted, probs, day)
day, hour, minute = date_values.get_date_values_to_now(begin)
variables = {
"tee": tee_sum, "day": day, "hour": hour, "minute": minute,
"x": valx, "y": valy, "z": valz
}
variables_today = {
"tee": tee_sum_today, "day": 1, "hour": 24, "minute": 1440,
"x": valx, "y": valy, "z": valz
}
points = formula_parser.calculate(formula, variables)
points_today = formula_parser.calculate(formula, variables_today)
return points, tee_sum, points_today, tee_sum_today
def tee_problem(slope: float, intercept: float):
top_player_rating = 4000
log_time = slope * top_player_rating + intercept
return math.exp(log_time)
def user_submissions(val:values.values,user: str):
dir_path = os.path.dirname(__file__) + "/data"
user_sub_dir_path = dir_path + "/user_submissions/"
file_path = user_sub_dir_path + f"{user}.json"
if not os.path.isdir(dir_path):
os.makedirs(dir_path)
if not os.path.isdir(user_sub_dir_path):
os.makedirs(user_sub_dir_path)
if not os.path.isfile(file_path) or os.path.getsize(file_path) == 0:
with open(file_path, "w") as file:
file.write(json.dumps({"newest": 0, "accepted": {}}))
val.last_get_time = None
with open(file_path, "r") as file:
curr_data = json.load(file)
newest = curr_data["newest"]
if val.last_get_time is None or time.time() - val.last_get_time >= 60:
val.last_get_time = time.time()
with open(file_path, "w") as file:
while True:
time.sleep(1)
user_url = f"https://kenkoooo.com/atcoder/atcoder-api/v3/user/submissions?user={user}&from_second={newest}"
logger.info(f"user_submissions_getting... {user_url}")
res = requests.get(user_url)
cont = res.text
new_data = json.loads(cont)
if type(new_data) == list:
merge_submission_data(curr_data, new_data)
if len(new_data) == 0:
break
try:
newest = new_data[-1]["epoch_second"]
except Exception as e:
logger.error(f"An error occured: {e} - New data was: {new_data}")
return curr_data
if len(new_data) != 500:
break
else:
break
json.dump(curr_data, file)
return curr_data
def merge_submission_data(curr_data, new_data):
try:
curr_data["newest"] = new_data[-1]["epoch_second"]
except Exception as e:
logger.error(f"An error occured: {e} - New data was: {new_data}")
return
accepted = curr_data["accepted"]
for sub in new_data:
res = sub["result"]
prob_id = sub["problem_id"]
sub_time = sub["epoch_second"]
if res == "AC" and prob_id not in accepted:
accepted[prob_id] = sub_time
def download_problems():
logger.info("downloading problems...")
file_path = os.path.dirname(__file__) + "/data/problem-models.json"
problems_url = "https://kenkoooo.com/atcoder/resources/problem-models.json"
res = requests.get(problems_url)
cont = res.text
with open(file_path, "w") as file:
file.write(cont)
def problems():
file_path = os.path.dirname(__file__) + "/data/problem-models.json"
with open (file_path, "r") as file:
probs = json.load(file)
return probs