Class: Atcoder

Inherits:
Object
  • Object
show all
Includes:
Log
Defined in:
lib/atcoder_tools/atcoder.rb

Constant Summary

Constants included from Log

Log::LoggerIns

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Log

#log_debug, #log_error, #log_info, #log_warn

Constructor Details

#initializeAtcoder

Returns a new instance of Atcoder.



7
8
9
10
11
# File 'lib/atcoder_tools/atcoder.rb', line 7

def initialize
  @settings = Settings.new
  @agent = Mechanize.new
  @agent.user_agent_alias = 'Mac Mozilla'
end

Class Method Details

.submit(task) ⇒ Object



18
19
20
21
22
# File 'lib/atcoder_tools/atcoder.rb', line 18

def self.submit(task)
  atcoder = Atcoder.new
  atcoder.
  atcoder.submit(task)
end

.test_login(username, password) ⇒ Object



13
14
15
16
# File 'lib/atcoder_tools/atcoder.rb', line 13

def self.(username, password)
  atcoder = Atcoder.new
  return atcoder.(username=username, password=password)
end

Instance Method Details

#login(username = nil, password = nil) ⇒ Object



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
# File 'lib/atcoder_tools/atcoder.rb', line 54

def (username=nil, password=nil)

  username ||= @settings.credentials.username
  password ||= @settings.credentials.password

  response = nil
  log_debug "try login to atcoder"
  @agent.get("https://atcoder.jp/login") do |page|
    # 1つ目のフォームはログアウト用なので2つ目を使用
    form = page.forms.last
    form.field_with(name: 'username').value = username
    form.field_with(name: 'password').value = password
    response = @agent.submit(form)
  end

  # print(response.response)
  res = response.body.include?("Welcome, #{username}.")
  if res
    log_debug "login secceed!"
  else
    log_warn "login falied!"
  end

  return res
end

#submit(task) ⇒ Object

引数はcontest, taskクラス



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/atcoder_tools/atcoder.rb', line 30

def submit(task)
  response = nil
  language_id = nil
  case task.contest.language
  when "ruby"
    language_id = "4049"
  when "c++(gcc)"
    language_id = "4003"
  end

    @agent.get(task_url(task)) do |page|
    # 1つ目のフォームはログアウト用なので2つ目を使用   
    form = page.forms.last
    form.field_with(name: 'data.LanguageId').value = language_id
    form.field_with(name: 'sourceCode').value = task.code
    response = @agent.submit(form)
  end

  if response.code.to_i == 200
    return true
  end
  return false
end

#task_url(task) ⇒ Object

引数はtaskクラス



25
26
27
# File 'lib/atcoder_tools/atcoder.rb', line 25

def task_url(task)
  "https://atcoder.jp/contests/#{task.contest.name}/tasks/#{task.contest.name}_#{task.name}"
end