Skip to content

Instantly share code, notes, and snippets.

@johannesfritsch
Created February 13, 2012 09:38
Show Gist options
  • Save johannesfritsch/1815495 to your computer and use it in GitHub Desktop.
Save johannesfritsch/1815495 to your computer and use it in GitHub Desktop.
LSF Checker
require 'mechanize'
require 'highline'
require 'prowl'
class String
def remove_non_ascii(replacement="")
self.gsub(/[\u0080-\u00ff]/,replacement)
end
end
hl = HighLine.new
puts "Before we begin, would you please authenticate yourself?"
u = hl.ask("1. Username: ")
p = hl.ask("2. Password: ") { |q| q.echo = "*" }
last_grade_count = -1
while(true)
begin
agent = Mechanize.new
page = agent.get('https://www.lsf.hs-weingarten.de/qisserver/rds?state=user&type=0')
login_form = page.form_with(:name => 'loginform')
login_form.username = u
login_form.password = p
main_page =agent.submit(login_form, login_form.buttons.first)
grades_page = main_page.links_with(:text => ' Notenspiegel ').first.click
rows = grades_page.parser.xpath('//table/tr[@bgcolor="#EFEFEF"]')
grades = []
rows.each do |row|
grades << {
:nr => row.xpath('./td[1]').text.remove_non_ascii.to_i,
:name => row.xpath('./td[2]').text.remove_non_ascii,
:semester => row.xpath('./td[3]').text.remove_non_ascii,
:grade => row.xpath('./td[4]').text.remove_non_ascii.sub(',', '.').to_f,
:status => row.xpath('./td[5]').text.remove_non_ascii,
:credits => row.xpath('./td[6]').text.remove_non_ascii.sub(',', '.').to_f,
:tries => row.xpath('./td[7]').text.remove_non_ascii.to_i
}
end
puts "Found #{grades.count} grades"
grades_sum = 0.0
credits_sum = 0.0
grades.each { |row| grades_sum += row[:grade] * row[:credits] ; credits_sum += row[:credits] }
avg = grades_sum / credits_sum
puts "Average grade: #{avg}"
if(last_grade_count != -1 && grades.count > last_grade_count)
puts "NEW GRADES ARRIVED!!!"
100.times { system('tput bel') }
Prowl.add(:apikey => 'xxx', :application => 'LSF Checker', :event => 'New Grade!', :description => 'There is a new grade!')
end
last_grade_count = grades.count
rescue
# When there's an error sleep and try again later
end
sleep(600)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment