Weather Bar for mIRC — File Browser

WeatherBarformIRCv1.0 / WeatherBarformIRCv1.0 / weather / weather.mrc

weather.mrc — 12.83 KB — Download this file

alias -l weather {
  if (!%weather_.position) set %weather_.position 10
  if (!%weather_.location) set %weather_.location RSXX0063
  if (!%weather_.location2) set %weather_.location2 Moscow, Russia
  if (!%weather_.units) set %weather_.units m
  window -Bph +d @weather 0 0 150 25
  dll $+(",$scriptdir,tbwin.dll") Attach @weather
  weatherplace $dll($+(",$scriptdir,tbwin.dll"), GetTBInfo, NOT_USED)
  dll $+(",$scriptdir,tbwin.dll") OnSize /weatherdraw2
  if (!$weather.update) return
  window -a @weather
  if (%weather_.autoupd) .timerweather 0 1800 weather.update
}
alias weather.update {
  if (!$getweather) { weather.disable | var %temp $input(Failed to connect to the server,dow,Error!) | return 0 }
  weather.xml
  return 1
}
alias weatherdraw {
  drawrect -nrf @weather $rgb(255,255,255) 1 0 0 500 25 
  var %temp
  var %temp2
  if ($numtok($1-,32) == 2) {
    drawtext -n @weather 1 MS Sans Serif 18 $calc($pic($scriptdiricons\ $+ $2).width + 3) 4  $1
    drawpic -n @weather 1 1 $+(",$scriptdiricons\,$2,")
    set %temp2 $calc($width($1,MS Sans Serif,18) + 6 + $pic($scriptdiricons\ $+ $2).width)
    set %cur.weather $1-
  }

  else {
    drawtext -n @weather 1 MS Sans Serif 18 3 4  N/A
    set %temp2 $calc($width(N/A,MS Sans Serif,18) + 6)
    unset %cur.weather
  }

  drawrect -nr @weather $rgb(shadow) 1 0 0 %temp2 25 
  drawline -nr @weather $rgb(face) 1 4 0 0 0 0 5
  drawline -nr @weather $rgb(face) 1 2 1 1 1 1 3
  drawline -nr @weather $rgb(shadow) 1 4 1 3 1 1 3 1 5
  drawline -nr @weather $rgb(face) 1 $calc(%temp2 - 5) 0 $calc(%temp2 - 1) 0 $calc(%temp2 - 1) 5
  drawline -nr @weather $rgb(face) 1 $calc(%temp2 - 3) 1 $calc(%temp2 - 2) 1 $calc(%temp2 - 2) 3
  drawline -nr @weather $rgb(shadow) 1 $calc(%temp2 - 5) 1 $calc(%temp2 - 4) 1 $calc(%temp2 - 2) 3 $calc(%temp2 - 2) 5
  drawline -nr @weather $rgb(face) 1 0 20 0 24 5 24
  drawline -nr @weather $rgb(face) 1 1 22 1 23 3 23
  drawline -nr @weather $rgb(shadow) 1 1 20 1 21 3 23 5 23
  drawline -nr @weather $rgb(face) 1 $calc(%temp2 - 1) 20 $calc(%temp2 - 1) 24 $calc(%temp2 - 6) 24
  drawline -nr @weather $rgb(face) 1 $calc(%temp2 - 2) 22 $calc(%temp2 - 2) 23 $calc(%temp2 - 4) 23
  drawline -nr @weather $rgb(shadow) 1 $calc(%temp2 - 2) 20 $calc(%temp2 - 2) 21 $calc(%temp2 - 4) 23 $calc(%temp2 - 6) 23
  weatherplace $dll($+(",$scriptdir,tbwin.dll"), GetTBInfo, NOT_USED) %temp2
  drawdot @weather
  return 1
}

alias getweather {
  return $download($+(",$scriptdir,weather.xml"), GET, http://xoap.weather.com/weather/local/ $+ %weather_.location $+ ?cc=*&prod=xoap&par=1018315462&key=5df01b6967eadd9c&unit= $+ %weather_.units, 2)
}

alias -l download {
  var %r = $(|,) return $false, %e = scon -r !echo $color(info) -a $!!download: Error -
  if (!$isid) %e this snippet can only be called as an identifier. %r
  if ($os isin 9598) %e this snippet requires Windows ME or higher. %r
  if ($version < 6) %e this snippet requires mIRC version 6.0 or higher. %r
  var %dir = $nofile($1), %file = $nopath($1), %method = $upper($2), %url = $3
  var %bit = $4, %headers = $iif($2 == get,$5,$6), %postdata = " $+ $5", %res
  if (* !iswm %file) %e you must specify a file to save the data to. %r
  if (%file != $mkfn(%file)) %e file %file contains illegal characters. %r
  if (* !iswm %dir) %dir = $mircdir
  elseif (!$isdir(%dir)) %e no such folder %dir %r
  if (!$istok(get head post,$2,32)) %e method can only be GET, HEAD or POST. %r
  if (!$regex(%e,$3,/^\S+\.\S+\.\S+$/)) %e you didn't specify an url to download from. %r
  if ($2 != head) {
    if ($4 !isnum 1-3) %e bitmask should be a digit in range 1-3. %r
    if ($2 == post) && (* !iswm $5) %e you didn't specify any post data. %r
    if (%headers) && (!$regsub(%e,%headers,/(\S+?): (.+?)(?=\s?\n|$)/g,"\1" $chr(44) "\2",%headers)) {
      %e bad header syntax. Correct -> Label: value seperated by $!!lf's %r
    }
  }
  var %file = $+(",%dir,%file,"), %id = $+(@download,$ticks,$r(1111,9999),.vbs), %a = aline %id
  if (http://* !iswm $3) %url = http:// $+ $3
  .comopen %id wscript.shell
  if ($comerr) %e could not open Wscript.Shell. %r
  write -c %file
  window -h %id
  %a on error resume next
  %a sub quit $lf set http = nothing : set ado = nothing : wscript.quit $lf end sub
  %a sub errmsg
  %a set fso = createobject("scripting.filesystemobject")
  %a set file = fso.createtextfile( %file ,true)
  %a file.write("Err number: " & err.number & " = " & err.description) : file.close
  %a set fso = nothing
  %a quit
  %a end sub
  %a arr = array("winhttp.winhttprequest.5.1","winhttp.winhttprequest","msxml2.serverxmlhttp","microsoft.xmlhttp")
  %a i = 0 $lf while i < 4 and not isobject(http) : set http = createobject(arr(i)) : i = i + 1 : wend
  %a if not isobject(http) then errmsg
  %a err.clear
  %a http.open $+(",%method,") , $+(",%url,") ,false
  %a http.setrequestheader "User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)"
  if (%headers) { tokenize 10 %headers | scon -r %a http.setrequestheader $* }
  if (%method == post) {
    %a http.setrequestheader "Content-Type","application/x-www-form-urlencoded"
    %a http.send %postdata
  }
  else %a http.send
  %a if err then errmsg
  %a set ado = createobject("adodb.stream")
  %a if not isobject(ado) then errmsg
  %a ado.open
  if (%bit != 2) {
    %a ado.type = 2 : ado.charset = "ascii"
    %a ado.writetext "HTTP/1.1 " & http.status & " " & http.statustext,1
    %a ado.writetext http.getallresponseheaders,1 : ado.position = 0
  }
  if (%bit != 1) %a ado.type = 1 : ado.read : ado.write http.responsebody
  %a ado.savetofile %file ,2 : ado.close : quit
  savebuf %id %id
  close -@ %id
  .comclose %id $com(%id,run,1,bstr*,%id,uint,0,bool,true)
  .remove %id
  %res = $read(%file,t,1)
  if (Err number:*=* iswm %res) || (!$file(%file)) %e $iif(%res,%res,no data could be retrieved) - %url %r
  return $true
  :error
  if ($com(%id)) .comclose %id
  if ($isfile(%id)) .remove %id
  if ($window(%id)) close -@ %id
  return $false
}

alias weather.xml {
  var %a = $dll($+(",$scriptdir,xml.dll"),create_parser,parseweather)
  if (%a != S_OK) { echo 6 Error - create_parser: %a | return 0 }

  dll $+(",$scriptdir,xml.dll") set_handler_chardata parseweather weather.data
  dll $+(",$scriptdir,xml.dll") set_handler_cdata parseweather weather.data

  dll $+(",$scriptdir,xml.dll") set_file parseweather $+(",$scriptdir,weather.xml")

  var %a = $dll($+(",$scriptdir,xml.dll"),parse_file,parseweather)
  if (%a != S_OK) { echo 6 Error - parse_file: %a }

  dll $+(",$scriptdir,xml.dll") free_parser parseweather
  if (!$weatherdraw($+(%weather.tmp,°,%weather.ut),%weather.icon $+ .gif)) { var %temp $input(Drawing Error,dow,Error!) | weather.disable | return 0 }
  unset %weather.*
}

alias weather.data {
  var %curelem $gettok($gettok($dll($scriptdirxml.dll,get_abspath,$1),-1,47),-1,58)
  var %curelem2 $gettok($gettok($dll($scriptdirxml.dll,get_abspath,$1),-2,47),-1,58)
  if (%curelem2 == head) {
    if (%curelem == ut) { 
      set %weather.ut $2
    }
  }
  elseif (%curelem2 == cc) {
    if (%curelem == tmp) { 
      set %weather.tmp $2
    }
    elseif (%curelem == icon) { 
      set %weather.icon $2
    }
  }
}
alias weatherplace { window @weather $calc($1 - $iif($3,$iif(%weather_.fromtype,$calc($3 + %weather_.position),$calc($1 - %weather_.position)),110)) $int($calc($calc($2 - 25) / 2)) $iif($3,$3,100) 25 }
alias weatherdraw2 { if (!$weatherdraw($gettok(%cur.weather,1,32),$gettok(%cur.weather,2,32),$gettok(%cur.weather,3,32),$gettok(%cur.weather,4,32))) { var %temp $input(Drawing error,dow,Error!) | weather.disable } }

dialog weather.calibration {
  title "Weather script position"
  size -1 -1 206 60
  option pixels

  edit "", 1, 65 10 74 20,  center
  button ">", 2, 150 10 44 20,  flat
  button "<", 3, 10 10 44 20,  flat
  radio "Left", 4, 10 40 75 14,
  radio "Right", 5, 150 40 75 14,
  text "From", 6, 90 39 35 24,
}
on 1:dialog:weather.calibration:init:*:{
  if (!%weather_.position) set %weather_.position 10
  did -o $dname 1 1 %weather_.position
  if (%weather_.fromtype) did -c $dname 5
  else did -c $dname 4
}
on 1:dialog:weather.calibration:sclick:*:{
  if ($did == 2) {
    $iif(%weather_.fromtype,dec,inc) %weather_.position
    did -o $dname 1 1 %weather_.position
    weatherdraw2
  }
  if ($did == 3) {
    $iif(%weather_.fromtype,inc,dec) %weather_.position
    did -o $dname 1 1 %weather_.position
    weatherdraw2
  }
  if ($did == 4) {
    unset %weather_.fromtype
    weatherdraw2
  }
  if ($did == 5) {
    set %weather_.fromtype 1
    weatherdraw2
  }
}
on 1:dialog:weather.calibration:edit:*:{
  if ($did == 1) {
    set %weather_.position $did(1).text
    weatherdraw2
  }
}

alias weather.search.xml {
  var %t $+(",$scriptdir,xml.dll")
  var %v parsesearch
  var %a = $dll(%t,create_parser,%v)
  if (%a != S_OK) { echo 6 Error - create_parser: %a | return 0 }

  dll %t set_handler_chardata %v weather.search.data
  dll %t set_handler_cdata %v weather.search.data
  dll %t set_handler_attribute %v weather.search.attribute
  dll %t set_handler_startelement %v weather.search.startelement

  dll %t set_file %v $+(",$scriptdir,search.xml")

  var %a = $dll(%t,parse_file,%v)
  if (%a != S_OK) { echo 6 Error - parse_file: %a }

  dll %t free_parser %v
  unset weather.*
}

alias weather.search.data {
  var %curelem $gettok($gettok($dll($scriptdirxml.dll,get_abspath,$1),-1,47),-1,58)
  if (%curelem == loc) {
    did -i weather.location 2 %weather.temp $2-
    did -i weather.location 8 %weather.temp %weather.temp2
    inc %weather.temp
  }
}
alias weather.search.attribute {
  if ($2 == loc) {
    if ($3 == id) set %weather.temp2 $4-
  }
}
alias weather.search.hendelement {
  if ($2 == search) {
  }
}
alias weather.search.startelement {
  if ($2 == search) {
    did -r weather.location 2 
    did -r weather.location 8 
    set %weather.temp 1
  }
}

dialog weather.location {
  title "Search Location"
  size -1 -1 328 238
  option pixels

  edit "", 1, 10 20 125 20,
  list 2, 140 20 185 212,  extsel hsbar vsbar
  button "Search", 3, 10 50 125 27,
  button "Set as default", 4, 10 160 125 27,  disable
  button "Ok", 5, 10 206 60 27,  ok
  icon 6, 10 83 120 70, $scriptdiricons\TWClogo_64px.gif, 0,
  button "Cancel", 7, 75 206 60 27,  cancel
  list 8, 310 0 15 15,  disable hide
}
on 1:dialog:weather.location:init:*:{
  did -i $dname 1 1 %weather_.location2
  did -t $dname 3
  did -z $dname 2
}
on 1:dialog:weather.location:sclick:*:{
  if ($did == 2) {
    if ($did(2).seltext) did -e $dname 4
  }
  if ($did == 3) {
    if (!$did(1).text) { var %a $input(There is no search request!,dow,Error) | halt }
    did -b $dname 3
    if ($download($+(",$scriptdir,search.xml"), GET, http://xoap.weather.com/search/search?where= $+ $replace($did(1).text,$chr(32),$+($chr(37),20)), 2)) weather.search.xml
    did -e $dname 3
    did -b $dname 4
  }
  if ($did == 4) {
    set %weather.location $did(8,$did(2,1).sel).text
    set %weather.location2 $did(2,$did(2,1).sel).text
    did -i $dname 1 1 $did(2,$did(2,1).sel).text
  }
  if ($did == 5) {
    set %weather_.location %weather.location
    set %weather_.location2 %weather.location2
    unset %weather.*
    if (!$weather.update) return

  }
  if ($did == 6) {
    run http://www.weather.com/?prod=xoap&par=1018315462
  }
  if ($did == 7) {
    unset %weather.*
  }
}


menu @weather {
  %weather_.location2 :dialog -mn weather.location weather.location
  -
  Update:{
    weather.update
    .timerweather off
    if (%weather_.autoupd) .timerweather 0 1800 weather.update
  }
  -
  Change position:dialog -mn weather.calibration weather.calibration
  Units
  .$iif(%weather_.units == s,$style(3)) Standart:{ set %weather_.units s | weather.update }
  .$iif(%weather_.units == m,$style(3)) Metric:{ set %weather_.units m | weather.update }
  $iif(%weather_.autoupd,$style(1)) Autoupdate: {
    if (%weather_.autoupd) unset %weather_.autoupd
    else { set %weather_.autoupd on | .timerweather 0 1800 weather.update }
  }  
  $iif(%weather_.autorun,$style(1)) Autorun: {
    if (%weather_.autorun) unset %weather_.autorun
    else set %weather_.autorun on
  }
  -
  Disable weather bar:weather.disable
}

menu status,menubar {
  Weather
  .$iif($window(@weather),Disable,Enable) Weather bar:{
    if (!$window(@weather)) weather
    else { window -c @weather | .timerweather* off }
  }
  .Unload script:unload -rs $scriptdirweather.mrc
}

on *:START:{
  if (%weather_.autorun) weather
}
on *:LOAD:{
  if ($version < 6.17) { var %temp $input(This script is for mIRC 6.17 only,ow,Erorr!) | unload -rs $scriptdirweather.mrc }
  set %weather_.fromtype 1
}
on *:UNLOAD:{
  unset %weather.*
  unset %weather_.*
  unset %cur.weather
  window -c @weather
}
alias -l weather.disable {
  window -c @weather
  .timerweather off
}