# heise.tcl v1.5 by domsen <domsen@domsen.org> (c)2oo4
#
# comments? bugs? ideas? requests? money? beer? 
# plz mail me or visit my homepage @ www.domsen.org
#
# das tcl  liest  die www.heise.de  news aus  und gibt  sie wieder,  gleich mit
# dem link zum eigentlichen artikel. per trigger lassen sich auch die letzten X
# news von hand auslesen.
#
# v1.5 - script ging nicht mehr, danke an pure_ascii
# v1.4 - komplett umgebaut by public request
#
# heisetrigger - der trigger auf den der bot reagiert (public und message)
# heiselimit - maximum der news die auf befehl geposted werden
# heisenewspost  - 1 für newsposting, 0 für keines
# heisechans  - die  chans in  denen das tcl aktiv  ist, "" für alle
# heisenewspostlimit - maximum der news die geposted werden
# isheisehub  - legt fest ob der bot newshub ist oder nicht
# heiseleafs  - die nicks der leafbots auf denen das leaf tcl läuft
#
####### config ######################

set heisetrigger "!heise"
#set heisechans "#linux #6mm"
set heisechans "#linux"
set heiselimit "3"
set heisenewspostlimit "3"
set heisenewspost "1"
set isheisehub "0"
set heiseleafs ""

####### ende der config #############

bind msg - $heisetrigger msg_heise
bind pub - $heisetrigger pub_heise
bind time - "?0 * * * *" heisecheck

proc sendheisenews { arg } {
global heiseleafs
foreach bot [bots] {
if {([lsearch -exact [string tolower $heiseleafs] [string tolower $bot]] != -1)} {
putbot $bot "heise: $arg"
}}}

proc shrink { calc number string start bl} { return [expr [string first "$string" $bl $start] $calc $number] }

proc heisecheck {nick uhost hand chan arg} {
global heisechans heisenewspost isheisehub heisenewspostlimit
set counter 0
if {$heisenewspost == 1 } {
putlog "heise: suche nach neuer newsline"
set heiselastnews "none"
if {[file exists heise.hdl]} {
set temp [open "heise.hdl" r]
set heiselastnews "[gets $temp]"
if {$heiselastnews == ""} { set heiselastnews "none" }
close $temp
}
set temp [open "heise.hdl" w+]
if {[catch {set sock [socket www.heise.de 80] } sockerror]} {
putlog "error: $sockerror"
return 0 } else {
puts $sock "GET /newsticker/heise.rdf HTTP/1.1"
puts $sock "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
puts $sock "Host: www.heise.de"
puts $sock ""
flush $sock
set counter 0
while {[eof $sock] != 1} {
set bl [gets $sock]

if {[string first "<title>" $bl] != -1 && [string first "heise online news" $bl] == -1 } { set newsline [string range $bl 9 [shrink - 1 "</" 0 $bl]]}
if {[string first "<link>" $bl] != -1 && [string first "newsticker/</link>" $bl] == -1} { set link [string range $bl 8 [shrink - 1 </ 0 $bl]]
set newsline1 [encoding convertto iso8859-1 [encoding convertfrom utf-8 $newsline]]
puts $temp "$newsline1 <$link>"
}}}
close $sock ; close $temp
if {$heiselastnews == "none" } { putlog "heise: headlinefile created" ; return 0 }
set temp [open "heise.hdl" r]
while { [eof $temp] != 1 } {
set heiseneunews [gets $temp]

# no utf8
#set heiseneunews1 [encoding convertto iso8859-1 [encoding convertfrom utf-8 $heiseneunews]]
#set heiselastnews1 [encoding convertto iso8859-1 [encoding convertfrom utf-8 $heiselastnews]]

if {($heiselastnews == $heiseneunews) || ($counter == $heisenewspostlimit)} { close $temp;return 0 }
incr counter
foreach chan [channels] {
if {$heisechans == "" } { putserv "privmsg $chan :(neue heise newsline) $heiseneunews" }
if {$heisechans != "" } {
if {([lsearch -exact [string tolower $heisechans] [string tolower $chan]] != -1) || ($heisechans == "")} {putserv "privmsg $chan :(\002Heise News\002) $heiseneunews"}
}
if { $isheisehub == "1" } { sendheisenews $heiseneunews }
}}}}


proc heisenews {target limit} {
if {[catch {set sock [socket www.heise.de 80] } sockerror]} {
putlog "error: $sockerror"
return 0 } else {
puts $sock "GET /newsticker/heise.rdf HTTP/1.1"
puts $sock "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
puts $sock "Host: www.heise.de"
puts $sock ""
flush $sock
set counter 0
while {[eof $sock] != 1} {
set bl [gets $sock]
if {[string first "<title>" $bl] != -1 && [string first "heise online news" $bl] == -1 } { set newsline [string range $bl 9 [shrink - 1 "</" 0 $bl]]}
if {[string first "<link>" $bl] != -1 && [string first "newsticker/</link>" $bl] == -1} { set link [string range $bl 8 [shrink - 1 </ 0 $bl]]
incr counter
putserv "privmsg $target : $newsline <$link>"
}
if {$counter == $limit} {close $sock ; return 0 }
}}}

proc msg_heise { nick uhost hand arg } { global heiselimit ; heisenews $nick $heiselimit }
proc pub_heise { nick uhost hand chan arg } { global heisechans heiselimit ; if {([lsearch -exact [string tolower $heisechans] [string tolower $chan]] != -1) || ($heisechans == "")} { heisenews $nick $heiselimit }}

putlog "heise.tcl v1.5 by domsen <domsen@domsen.org> succesfully loaded"

#[EOF]

