class MyBcycle::User

Attributes

city[R]
password[R]
username[R]

Public Class Methods

new(city: :austin, username:, password:) click to toggle source
# File lib/my_bcycle.rb, line 10
def initialize(city: :austin, username:, password:)
  @city = city
  @username = username
  @password = password
end

Public Instance Methods

statistics_for(time) click to toggle source
# File lib/my_bcycle.rb, line 16
def statistics_for(time)
  return unless session_token
  response = do_request! Typhoeus::Request.new(
    "https://portal-den.bcycle.com/1/user/trips",
    params: {
      month: time.month,
      year: time.year,
    },
    headers: { 'Bcycle-Session-Token': session_token },
    accept_encoding: "gzip"
  )
  parse_statistics(response.body)
end

Private Instance Methods

do_request!(request) click to toggle source
# File lib/my_bcycle.rb, line 81
def do_request!(request)
  request.on_complete do |response|
    next if response.success?

    if response.timed_out?
      raise CommunicationProblem, "Timeout"
    elsif response.code == 0
      raise CommunicationProblem, response.return_message.to_s
    else
      raise CommunicationProblem, "Got error code #{response.code}"
    end
  end
  request.run
end
login_params() click to toggle source
# File lib/my_bcycle.rb, line 104
def login_params
  {
    UserName: username,
    Password: password,
  }
end
login_request!(cookie_path) click to toggle source
# File lib/my_bcycle.rb, line 60
def login_request!(cookie_path)
  login_req = do_request! Typhoeus::Request.new(
    login_url,
    method: :post,
    cookiefile: cookie_path,
    cookiejar: cookie_path,
    body: login_params
  )
  if login_req.body =~ /Invalid UserName/i
    raise InvalidCredentials
  end
end
login_url() click to toggle source
# File lib/my_bcycle.rb, line 96
def login_url
  "https://#{city}.bcycle.com/api/Authenticate"
end
parse_statistics(body) click to toggle source
# File lib/my_bcycle.rb, line 32
def parse_statistics(body)
  JSON.parse(body).map do |entry|
    k = Time.parse entry["checkOutDate"]
    v = {
      miles:  entry["miles"],
      duration:  entry["duration"],
      money_saved:  entry["moneySaved"],
    }
    [k, v]
  end.to_h
end
retrieve_token() click to toggle source
# File lib/my_bcycle.rb, line 48
def retrieve_token
  cookiefile = Tempfile.new("bcycle-cookie")
  cookie_path = cookiefile.path
  begin
    login_request!(cookie_path)
    token_request!(cookie_path).body[/\A"([a-z0-9\-]{36})"/i, 1]
  end
ensure
  cookiefile.close
  cookiefile.unlink
end
session_token() click to toggle source
# File lib/my_bcycle.rb, line 44
def session_token
  @session_token ||= retrieve_token
end
token_request!(cookie_path) click to toggle source
# File lib/my_bcycle.rb, line 73
def token_request!(cookie_path)
  do_request! Typhoeus::Request.new(
    token_url,
    cookiefile: cookie_path,
    cookiejar: cookie_path
  )
end
token_url() click to toggle source
# File lib/my_bcycle.rb, line 100
def token_url
  "https://#{city}.bcycle.com/api/sessiontoken/get"
end