def updata_user(id, oj, username, password, last_rid, user_last_rid, user_id, mysql): sql = "UPDATE users_oj_account SET is_using = '1', updating = '0' WHERE id = '%s'" % id mysql.update(sql) ac = Access(oj, username, password) if ac.logined(): status = [] url = user_status[oj] % ('', username) html = ac.get_html(url=url) match = re.compile(get_status[oj], re.M | re.I | re.S) result = match.findall(html) i = 0 while result[i][0] != user_last_rid: p_id = mysql.query( "SELECT id FROM problem_problem WHERE oj = '%s' AND problem_id = '%s'" % (oj, result[i][3])) if not p_id: mysql.update( "INSERT INTO problem_problem (oj, problem_id, defunct, judge_type, date, title, description, input, output, sample_input, sample_output, hint, source, submit, solved, type, memory_limit_c, memory_limit_java, time_limit_c, time_limit_java, data_number) VALUES('%s', '%s', '1', '1', '%s', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', '0', ' ', '0', '0', '0', '0', '-1')" % ( oj, result[i][3], date.today())) p_id = mysql.get_id() else: p_id = p_id[0][0] status.append( [result[i][2], p_id, result[i][4], result[i][5], result[i][6], result[i][7], result[i][1], result[i][0]]) i += 1 if i == len(result): url = user_status[oj] % (int(result[i - 1][0]) - 1, username) html = ac.get_html(url=url) result = match.findall(html) if len(result) == 0: break i = 0 l = len(status) j = 1 for i in status: code = get_code(ac.get_html(url=get_code_url[oj] % i[7]), oj) sql = "INSERT INTO status_solve (status, submit_time, problem_id, use_time, use_memory, length, language, code, user_id) VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')" % ( i[0], i[6], i[1], i[2], i[3], i[4], i[5], code, user_id) mysql.update(sql) solve_id = mysql.get_id() if i[0] == 'Compilation Error': ce_info_t = get_ce_info(ac.get_html(url=get_ce_url[oj] % i[7]), oj) sql = "INSERT INTO status_ce_info (info, solve_id) VALUES('%s', '%s')" % (ce_info_t, solve_id) mysql.update(sql) sql = "SELECT ac FROM users_submit_problem WHERE user_id = '%s' AND problem_id = '%s'" % (user_id, i[1]) result = mysql.query(sql) if result: if i[0] == 'Accepted' and int(result[0][0]) == 0: sql = "UPDATE users_submit_problem SET ac = '1' WHERE user_id = '%s' AND problem_id = '%s'" % ( user_id, i[1]) mysql.update(sql) else: sql = "INSERT INTO users_submit_problem (ac, problem_id, user_id) VALUES('%s', '%s', '%s')" % ( '1' if i[0] == 'Accepted' else '0', i[1], user_id) mysql.update(sql) sql = "UPDATE users_oj_account SET updating = '%d' WHERE id = '%s'" % (int(j / float(l) * 100), id) mysql.update(sql) j += 1 sql = "UPDATE users_oj_account SET is_using = '0', last_rid = '%s' WHERE id = '%s'" % (last_rid, id) mysql.update(sql)
class Vjudge: def __init__(self, sid, username, password, last_result): self.mysql = MySQL() self.sid = sid self.get_info(sid) self.username = username self.ac = Access(self.oj, username, password) self.ce_info = '' self.last_result = last_result def get_info(self, sid): result = self.mysql.query("SELECT problem_id, language, code, user_id FROM status_solve WHERE id = '%s'" % sid) self.problem_id = result[0][0] self.language = result[0][1] self.code = result[0][2] self.uid = result[0][3] result = self.mysql.query("SELECT oj, problem_id FROM problem_problem WHERE id = '%s'" % self.problem_id) self.oj = result[0][0] self.pid = result[0][1] def submit(self): url = url_submit[self.oj] referer = url_referer[self.oj] + self.pid postdata = post_data[self.oj] postdata[judge_listmap[self.oj][0]] = self.pid postdata[judge_listmap[self.oj][1]] = language_map[self.oj][self.language] postdata[judge_listmap[self.oj][2]] = self.code self.ac.get_html(url, postdata, referer) def hdu_get_status(self): if not self.rid: url = url_status[self.oj][0] html = self.ac.get_html(url) match = re.search(re_string[self.oj][0] % self.username, html, re.M | re.I | re.S) s = match.group() self.rid = re.findall(re_string[self.oj][1], s, re.M | re.I | re.S)[-1] url = url_status[self.oj][1] + self.rid html = self.ac.get_html(url) match = re.search(re_string[self.oj][2] % self.rid, html, re.M | re.I | re.S) if match.group(1) == 'Compilation Error': url = url_ce[self.oj] + self.rid html = self.ac.get_html(url) t = re.search(re_string[self.oj][3], html, re.M | re.I | re.S) self.ce_info = t.group(1) return match.group(1), match.group(2), match.group(3) def hdu_again(self, s): if s == 'Queuing' or s == 'Compiling' or s == 'Running': return True return False def run(self): self.submit() self.rid = '' sleep(0.5) o = eval('self.' + self.oj + '_get_status')() self.mysql.update( "UPDATE status_solve SET status = '%s', use_time = '%s', use_memory = '%s' WHERE id = '%s'" % ( o[0], o[1], o[2], self.sid)) sleep(0.2) while eval('self.' + self.oj + '_again')(o[0]): o = eval('self.' + self.oj + '_get_status')() self.mysql.update( "UPDATE status_solve SET status = '%s', use_time = '%s', use_memory = '%s' WHERE id = '%s'" % ( o[0], o[1], o[2], self.sid)) sleep(0.2) # print o if self.ce_info: sql = "SELECT info FROM status_ce_info WHERE solve_id = '%s'" % self.sid result = self.mysql.query(sql) if result: sql = "UPDATE status_ce_info SET info = '%s' WHERE solve_id = '%s'" % (self.ce_info, self.sid) self.mysql.update(sql) else: sql = "INSERT INTO status_ce_info (info, solve_id) VALUES('%s', '%s')" % (self.ce_info, self.sid) self.mysql.update(sql) sql = "SELECT ac FROM users_submit_problem WHERE user_id = '%s' AND problem_id = '%s'" % (self.uid, self.problem_id) result = self.mysql.query(sql) if result: if o[0] == 'Accepted' and int(result[0][0]) == 0: sql = "UPDATE users_submit_problem SET ac = '1' WHERE user_id = '%s' AND problem_id = '%s'" % ( self.uid, self.problem_id) self.mysql.update(sql) else: sql = "INSERT INTO users_submit_problem (ac, problem_id, user_id) VALUES('%s', '%s', '%s')" % ( '1' if o[0] == 'Accepted' else '0', self.problem_id, self.uid) self.mysql.update(sql)
def get_last_rid(oj, username): ac = Access(oj=oj) url = user_status[oj] % ('', username) html = ac.get_html(url=url) match = re.search(user_last_rid[oj], html, re.M) return match.group(1)