Yahoo! for mIRC — File Browser

YahooformIRCv0.0.18 / YahooformIRCv0.0.18 / yahoo.mrc

yahoo.mrc — 36.15 KB — Download this file

;// mIRC script for yahoo chat (YCHT) protocol
;// version: 0.0.18 (alpha)
;// home:    http://sourceforge.net/projects/mirc-yahoo/
;// contact: flipster12345@users.sourceforge.net

on *:exit:hsave -io yahdata $scriptdiryahoo.ini yahoo | hsave -io yahroom $scriptdiryahoo.ini rooms
on *:start:hmake yahdata 100 | hmake yahroom 100 | if ($scriptdiryahoo.ini) { hload -i yahdata $ifmatch yahoo | hload -i yahroom $ifmatch rooms }

;// Yahoo HTTP requests
alias -l yahoo.get.cookie.classic return $+(GET /config/login?.src=&login=,$hget(yahoo,user),&passwd=,$hget(yahoo,pass),&n=1 HTTP/1.0,$crlf,$yahoo.common.http.headers(edit),$crlf,$crlf)
alias -l yahoo.get.cookie.secure return $+(POST /config/login HTTP/1.0,$crlf,Content-Length: $calc(26 + $len($hget(yahoo,user)) + $len($hget(yahoo,pass))),$yahoo.common.http.headers(edit),$crlf,.src=&login=,$hget(yahoo,user),&passwd=,$hget(yahoo,pass),&n=1,$crlf)
alias -l yahoo.get.buddies return $+(GET /config/get_buddylist?.src=bl $yahoo.referer(edit),$yahoo.common.http.headers(edit),Cookie: $hget(yahoo,auth),; CHT=chid=,$hget(yahoo,user),&face=,$crlf,$crlf)
alias -l yahoo.get.catagories return $+(GET /c/roomlist/catfeed.html $yahoo.referer(chat),$yahoo.common.http.headers(chat),Cookie: $hget(yahoo,auth),; CHT=chid=,$hget(yahoo,user),&face=,$crlf,$crlf)
alias -l yahoo.get.rooms return $+(GET /c/roomlist/feed.html?.rmcat=,$hget(yahoo,get.room),&chat_client=Voice $yahoo.referer(chat),$yahoo.common.http.headers(chat),Cookie: $hget(yahoo,auth),; CHT=chid=,$hget(yahoo,user),&face=,$crlf,$crlf)
alias -l yahoo.common.http.headers return $+($crlf,Host:,$chr(32),$1,.yahoo.com,$crlf,Accept-Language: en,$crlf,Accept: */*,$crlf,User-Agent: Mozilla Compatible/2.0 (WinNT; I; NCC/2.0),$chr(32),$crlf,Cache-Control: no-cache,$crlf,Connection: close,$crlf)
alias -l yahoo.referer return $+(HTTP/1.0,$crlf,Referer: http://,$1,.yahoo.com)
;// Opens Yahoo!
alias yahoo {
  window -aek0l15mSwz @Yahoo!
  if ($hget(yahoo)) hfree yahoo
  if (!$hget(yahoo.ignores)) hmake yahoo.ignores 100
  if ($exists($scriptdiryahoo.dat)) hload yahoo.ignores $scriptdiryahoo.dat
  if ($hget(yahdata,auto.connect)) && ($hget(yahdata,auto.user)) && ($hget(yahdata,password)) tokenize 32 $hget(yahdata,auto.user) $hget(yahdata,password)
  if (!$2) { dialog -m yahoo.login yahoo.login | return }
  hadd -m yahoo user $1 
  hadd -m yahoo pass $2
  hadd -m yahoo auth.server $hget(yahdata,auth.server)
  hadd -m yahoo auth.port $hget(yahdata,auth.port)
  sockopen yahoo.check $hget(yahdata,auth.server) $hget(yahdata,auth.port)
}
;// Get auth code (cookie)
on *:sockopen:yahoo.check:{
  if ($sockerr > 0) { yahoo.sockerr $sock($sockname).wserr $sock($sockname).wsmsg | return }
  if ($hget(yahoo,auth)) hdel yahoo auth
  yahoo.echo Authenticating...
  if ($hget(yahdata,secure.server)) sockwrite -tn $sockname $yahoo.get.cookie.secure
  else sockwrite -tn $sockname $yahoo.get.cookie.classic
}
on *:sockread:yahoo.check:{
  if ($sockerr > 0) { yahoo.sockerr $sock($sockname).wserr $sock($sockname).wsmsg | return }
  while ($sock($sockname).rq) {
    sockread %t | if ($sockbr == 0) return | if (%t == $null) continue | tokenize 32 %t
    if ($1- == HTTP/1.1 200 OK) { 
      yahoo.echo Invalid Yahoo! id or password 
      sockclose $sockname
      yahoo
      return
    }
    if ($1 == Set-Cookie:) hadd -m yahoo auth $addtok($hget(yahoo,auth),$2,32)
  }
}
on *:sockclose:yahoo.check:{
  if (!$hget(yahoo,auth)) {
    if ($hget(yahdata,auto.connect)) hdel yahdata auto.connect
    yahoo.echo Please try another Yahoo! server
    yahoo
    return
  }
  yahoo.echo OK ( $+ $hget(yahoo,auth.server) $+ )
  hadd -m yahoo auth $left($hget(yahoo,auth),-1)
  if ($hget(yahoo.identities)) {
    yahoo.echo Done.
    dialog -m yahoo.start yahoo.start
  }
  else sockopen yahoo.buddy $hget(yahoo,auth.server) $hget(yahoo,auth.port)
}
;// Get buddy list
on *:sockopen:yahoo.buddy:{
  yahoo.echo Loading Nameslists...
  sockwrite -tn $sockname $yahoo.get.buddies
}
on *:sockread:yahoo.buddy:{
  if ($sockerr > 0) { yahoo.sockerr $sock($sockname).wserr $sock($sockname).wsmsg | return }
  while ($sock($sockname).rq) {
    sockread %t
    if (%t == BEGIN BUDDYLIST) { sockrename $sockname yahoo.buddies | return }
  }
}
on *:sockread:yahoo.buddies:{
  if ($sockerr > 0) { yahoo.sockerr $sock($sockname).wserr $sock($sockname).wsmsg | return }
  while ($sock($sockname).rq) {
    sockread -n &bud
    if ($bvar(&bud,1,13).text == END BUDDYLIST) continue
    if ($bvar(&bud,1,16).text == BEGIN IGNORELIST) { sockrename $sockname yahoo.ignores | return }
    var %title = $bvar(&bud,1,$calc($bfind(&bud,1,:) - 1)).text
    bcopy -c &bud 1 &bud $calc($bfind(&bud,1,:) + 1) -1
    while ($bfind(&bud,1,44)) {
      var %n = $bvar(&bud,1,$calc($bfind(&bud,1,44) - 1)).text
      hadd -m yahoo.friends $+(%title,.,%n) %n
      bcopy -c &bud 1 &bud $calc($bfind(&bud,1,44) + 1) -1
    }
    var %n = $bvar(&bud,1,$calc($bvar(&bud,0) - 1)).text
    hadd -m yahoo.friends $+(%title,.,%n) %n
  }
}
on *:sockread:yahoo.ignores:{
  if ($sockerr > 0) { yahoo.sockerr $sock($sockname).wserr $sock($sockname).wsmsg | return }
  while ($sock($sockname).rq) {
    sockread -n &bud
    if ($bvar(&bud,1,14).text == END IGNORELIST) continue
    if ($bvar(&bud,1,16).text == BEGIN IDENTITIES) { sockrename $sockname yahoo.identities | return }
    while ($bfind(&bud,1,44)) {
      var %n = $bvar(&bud,1,$calc($bfind(&bud,1,44) - 1)).text
      hadd -m yahoo.ignores %n %n
      bcopy -c &bud 1 &bud $calc($bfind(&bud,1,44) + 1) -1
    }
    var %n = $bvar(&bud,1,$calc($bvar(&bud,0) - 1)).text
    hadd -m yahoo.ignores %n %n
  }
}
on *:sockread:yahoo.identities:{
  if ($sockerr > 0) { yahoo.sockerr $sock($sockname).wserr $sock($sockname).wsmsg | return }
  while ($sock($sockname).rq) {
    sockread -n &bud
    if ($bvar(&bud,1,14).text == END IDENTITIES) continue
    if ($bvar(&bud,1,6).text == Login=) {
      hadd -m yahoo login $bvar(&bud,$calc($bfind(&bud,1,=) + 1),$calc($bvar(&bud,0) - 6)).text
      continue
    }
    if ($bvar(&bud,1,5).text == Mail=) {
      var %email = $bvar(&bud,$calc($bfind(&bud,1,=) + 1),$calc($bvar(&bud,0) - 5)).text
      if (%email == 0) continue
      if ($hget(yahdata,show.emails)) yahoo.echo You have %email $+(email,$iif((%email > 1),s)) on your Yahoo! mailbox
      continue
    }
    while ($bfind(&bud,1,44) > 0) {
      var %n = $bvar(&bud,1,$calc($ifmatch - 1)).text
      bcopy -c &bud 1 &bud $calc($ifmatch + 1) -1
      hadd -m yahoo.identities %n %n
    }
    var %n = $bvar(&bud,1,$calc($bvar(&bud,0) - 1)).text
    hadd -m yahoo.identities %n %n
  }
}
on *:sockclose:yahoo.identities:{
  yahoo.echo Done.
  dialog -m yahoo.start yahoo.start
}
dialog yahoo.login {
  title "Yahoo Chat Login"
  size -1 -1 136 145
  option dbu
  combo 2, 10 15 115 65, sort edit drop
  edit "", 4, 10 40 115 10, pass
  check "Remember password", 5, 10 55 60 10, flat left
  check "&Auto Connect", 6, 80 55 45 10, disable flat left
  text "&Password", 1, 10 30 40 8, group
  text "&Name", 3, 10 5 55 8
  check "Erase personal info at program exit", 7, 20 65 95 10, disable flat left
  box "", 9, 10 80 115 45
  button "Lo&gin >>>", 10, 90 130 37 12, default
  text "Please Login to Yahoo!", 11, 15 85 105 8, center
  text "Enter a Yahoo login name and password. After login you can select a Chat ID and start chatting on Yahoo!", 12, 15 100 105 23, center
  button "Delete name from list", 13, 10 80 117 12, hide disable
  text "Login mode:", 14, 10 96 30 8, hide
  radio "Classic", 15, 45 95 25 10, hide group flat left
  radio "More Secure", 16, 80 95 40 10, hide flat left
  combo 17, 10 115 70 40, hide edit drop
  text "Authentication Server", 18, 10 105 65 8, hide
  text "Port", 19, 85 105 25 8, hide
  combo 20, 85 115 40 25, hide edit drop
  text "Password is saved", 21, 10 40 115 8, hide center
  check "More Options", 8, 40 130 45 12, flat push
}
on *:dialog:yahoo.login:init:0:{ 
  if ($hget(yahdata,login.method)) did -c $dname 16 | else did -c $dname 15
  if ($hget(yahdata,remember.password)) { did -c $dname 5 | if ($hget(yahdata,password)) did -a $dname 4 $ifmatch | did -h $dname 4 | did -v $dname 21  }
  if ($hget(yahdata,auto.connect)) did -c $dname 6
  if ($hget(yahdata,erase.data)) did -c $dname 7
  if ($hget(yahdata,secure.server)) { did -c $dname 16 | did -u $dname 15 } | else did -c $dname 15
  var %names = $hget(yahdata,names),%servers = $yahoo.login.servers($hget(yahdata,auth.servers)),%ports = $yahoo.login.ports($hget(yahdata,auth.ports))
  while (%names) { did -a $dname 2 $gettok(%names,1,32) | %names = $deltok(%names,1,32) }
  while (%servers) { did -a $dname 17 $gettok(%servers,1,32) | %servers = $deltok(%servers,1,32) }
  while (%ports) { did -a $dname 20 $gettok(%ports,1,32) | %ports = $deltok(%ports,1,32) }
  if ($hget(yahoo,user)) { var %q = 1 | while (%q <= $did(2).lines) { if ($hget(yahoo,user) == $did(2,%q)) did -c $dname 2 %q | inc %q } }
  if ($hget(yahdata,auth.server)) did -c $dname 17 $didwm($dname,17,$ifmatch)
  else did -c $dname 17 1
  if ($hget(yahdata,auth.port)) did -c $dname 20 $didwm($dname,20,$ifmatch)
  else did -c $dname 20 1
  if ($did($dname,2,1)) did -c $dname 2 1
  did -f $dname 2
  if ($hget(yahdata,auto.connect)) did -e $dname 6
  if ($hget(yahdata,login.more)) { did -c $dname 8 | did -h $dname 9,11,12 | did -v $dname 13,14,15,16,17,18,19,20 | did -f $dname 17 }
}
on *:dialog:yahoo.login:close:0:{
  var %q = yahoo.login yahoo.start yahoo.rooms
  while (%q) { if ($dialog($gettok(%q,1,32))) dialog -x $ifmatch | %q = $deltok(%q,1,32) }
  sockclose yahoo.*
  hsave -o yahoo.ignores $scriptdiryahoo.dat
  if ($hget(yahoo)) hfree yahoo
  if ($window(@Yahoo!)) window -c @Yahoo!
}
on *:dialog:yahoo.login:*:2:if ($did(5).state) && ($did(2)) did -e $dname 6 | else did -b $dname 6
on *:dialog:yahoo.login:sclick:5:{
  if (!$did(4)) || (!$did(5).state) { did -u $dname 5 | did -h $dname 21 | did -rv $dname 4 | did -b $dname 6 }
  else { did -c $dname 5 | did -h $dname 4 | did -v $dname 21 | if ($did(2)) did -e $dname 6 }
}
on *:dialog:yahoo.login:sclick:8:{
  if ($did(8).state) { did -h $dname 9,11,12 | did -v $dname 13,14,15,16,17,18,19,20 | did -f $dname 17 | hadd -m yahdata login.more 1 }
  else { did -v $dname 9,11,12 | did -h $dname 13,14,15,16,17,18,19,20 | hadd -m yahdata login.more 0 }
}
on *:dialog:yahoo.login:sclick:10:{
  if ((!$did(2).sel)) && (!$did(4)) return
  hadd -m yahdata remember.password $did(5).state
  if ($did(5).state) hadd -m yahdata password $did(4)
  else hdel yahdata password
  hadd -m yahdata auto.connect $did(6).state
  if ($did(6).state) hadd -m yahdata auto.user $did(2)
  else hdel yahdata auto.user
  hadd -m yahdata erase.data $did(7).state
  hadd -m yahdata secure.server $did(16).state
  var %names = $didtok($dname,2,32),%servers = $didtok($dname,17,32),%ports = $didtok($dname,20,32)
  hadd -m yahdata names $iif((!$istok(%names,$did(2),32)),$addtok(%names,$did(2),32),%names)
  hadd -m yahdata auth.servers $iif((!$istok(%servers,$did(17),32)),$addtok(%servers,$did(17),32),%servers)
  hadd -m yahdata auth.ports $iif((!$istok(%ports,$did(20),32)),$addtok(%ports,$did(20),32),%ports)
  hadd -m yahdata auth.server $did(17)
  hadd -m yahdata auth.port $did(20) 
  hadd -m yahoo user $did(2)
  hadd -m yahoo pass $did(4)
  hadd -m yahoo auth.server $did(17)
  hadd -m yahoo auth.port $did(20)
  sockopen yahoo.check $did(17) $did(20)
  dialog -x $dname
}
dialog yahoo.start {
  title "Yahoo Chat Connect"
  size -1 -1 136 145
  option dbu
  combo 2, 10 15 115 45, sort edit drop
  text "&Start in Room", 1, 10 30 40 8, group
  text "&Your Chat Name", 3, 10 5 55 8
  button "&Chat >>>", 10, 90 130 37 12, default
  combo 4, 10 40 115 55, size edit drop
  button "Get the list of Yahoo &Rooms", 5, 10 55 117 12
  button "Chat protocol", 6, 10 70 37 12, disable
  check "Auto connect", 7, 80 70 45 10, disable flat left
  edit "YCHT", 9, 50 70 25 12, read center
  button "<<< Lo&gin", 11, 7 130 30 12
  button "Server (&Fasthost/Scan)", 12, 10 85 77 12, hide
  text "Port", 13, 90 85 25 8, hide
  combo 14, 10 100 80 45, hide size drop
  combo 15, 90 100 35 30, hide size drop
  check "Yahoo advertisement when closing chat", 16, 15 115 105 10, hide disable flat left
  text "Yahoo! Chat for mIRC was made completly by qwert (qwert` on dalnet, damn nickserv) It' is designed after the look and feel of Yahelite, a 3rd party Yahoo! Chat client.", 17, 0 85 135 23, center
  text "Any Comments, email:", 18, 10 110 115 8, center
  link "flipster12345@users.sourceforge.net", 19, 25 120 89 8
  check "More Options", 8, 40 130 45 12, flat push
}
on *:dialog:yahoo.start:init:0:{
  var %q = $hget(yahoo.identities,0).item
  while (%q) { did -a $dname 2 $hget(yahoo.identities,%q).data | dec %q }
  var %q = $hget(yahroom,0).item
  while (%q) { did -a $dname 4 $hget(yahroom,%q).data | dec %q }
  var %servers = $yahoo.chat.servers($hget(yahdata,chat.servers)),%ports = $yahoo.chat.ports($hget(yahdata,chat.ports))
  while (%servers) { did -a $dname 14 $gettok(%servers,1,32) | %servers = $deltok(%servers,1,32) }
  while (%ports) { did -a $dname 15 $gettok(%ports,1,32) | %ports = $deltok(%ports,1,32) }
  did -c $dname 2,4 1
  if ($hget(yahdata,chat.server)) did -c $dname 14 $didwm($dname,14,$ifmatch)
  else did -c $dname 14 5
  if ($hget(yahdata,chat.port)) did -c $dname 15 $didwm($dname,15,$ifmatch)
  else did -c $dname 15 1
  if ($hget(yahdata,start.more)) { did -c $dname 8 | did -v $dname 12,13,14,15,16 | did -h $dname 17,18,19 | did -f $dname 14 }
}
on *:dialog:yahoo.start:sclick:5:yahoo.rooms
on *:dialog:yahoo.start:sclick:8:{
  if ($did(8).state) { did -v $dname 12,13,14,15,16 | did -h $dname 17,18,19 | did -f $dname 14 | hadd -m yahdata start.more 1 }
  else { did -h $dname 12,13,14,15,16 | did -v $dname 17,18,19 | hadd -m yahdata start.more 0 }
}
on *:dialog:yahoo.start:sclick:10:{
  if ($did($dname,4).sel) hadd -m yahoo join $did($dname,4,$ifmatch)
  var %servers = $didtok($dname,14,32),%ports = $didtok($dname,15,32)
  hadd -m yahdata chat.servers $iif((!$istok(%servers,$did(14),32)),$addtok(%servers,$did(14),32),%servers)
  hadd -m yahdata chat.ports $iif((!$istok(%ports,$did(15),32)),$addtok(%ports,$did(15),32),%ports)
  hadd -m yahoo chat.server $did(14)
  hadd -m yahoo chat.port $did(15)
  hadd -m yahdata chat.server $did(14)
  hadd -m yahdata chat.port $did(15)
  if (!$hget(yahoo,inchan)) yahoo.chat
  else yahoo.join yahoo.chat $did(4)
  dialog -x $dname
}
on *:dialog:yahoo.start:sclick:11:dialog -m yahoo.login yahoo.login | dialog -x $dname
on *:dialog:yahoo.start:sclick:12:{
  yahoo.echo Scanning for fast YCHT hosts...
  if ($hget(yahoo,ticks)) hdel yahoo ticks
  sockclose yahoo.scan.*
  var %servers = $didtok(yahoo.start,14,32)
  while (%servers) { sockopen $+(yahoo.scan.,$numtok(%servers,32)) $gettok(%servers,1,32) $did(yahoo.start,15) | %servers = $deltok(%servers,1,32) }
}
on *:dialog:yahoo.start:sclick:19:run mailto: $+ $did($dname,19)
on *:sockopen:yahoo.scan.*:{
  if ($sockerr > 0) return
  bset &scan 1 Y C H T 0 0 1 0 0 0 0 113 0 0 0 4 h e l p
  hadd -m yahoo $+(scan.,$gettok($sockname,3,46)) $ticks
  sockwrite $sockname &scan
}
on *:sockread:yahoo.scan.*:{
  sockread -f %tmp
  if (%tmp == YCHT) {
    var %ticks = $calc($ticks - $hget(yahoo,$+(scan.,$gettok($sockname,3,46)))),%server = $+(cs,$gettok($sockname,3,46),.chat.sc5.yahoo.com)
    yahoo.echo %ticks $+ ms %server $+([,$sock($sockname).ip,])
    if ($hget(yahoo,ticks) < %ticks) return
    hadd -m yahoo ticks %ticks
    did -c yahoo.start 14 $didwm(yahoo.start,14,%server)
    sockclose $sockname
  }
}


;// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;// Get room list
alias yahoo.rooms sockopen yahoo.catagories chat.yahoo.com 80
on *:sockopen:yahoo.catagories:{
  if ($sockerr > 0) { yahoo.sockerr $sock($sockname).wserr $sock($sockname).wsmsg | return }
  hfree -w yahoo.channel.*
  if (!$dialog(yahoo.rooms)) dialog -m yahoo.rooms yahoo.rooms
  sockwrite -tn $sockname $yahoo.get.catagories
}
on *:sockread:yahoo.catagories:{
  if ($sockerr > 0) { yahoo.sockerr $sock($sockname).wserr $sock($sockname).wsmsg | return }
  if (!$dialog(yahoo.rooms)) return
  while ($sock($sockname).rq) {
    sockread %t
    if ($sockbr == 0) return
    if (%t == $null) continue
    tokenize 32 %t
    if ($numtok($1-,9) == 3) {
      tokenize 9 %t
      hadd -m yahoo.channel $+(name.,$1) $3
      did -a yahoo.rooms 5 $+($iif(($2 == 2),$str( ,2),$iif(($2 == 3),$str( ,4))),$3)
    }
  }
}
on *:sockclose:yahoo.catagories:{
  if ($dialog(yahoo.rooms)) did -ra $ifmatch 11 Loaded $did($ifmatch,5).lines catagories, $did($ifmatch,6).lines Yahoo rooms, $did($ifmatch,7).lines User rooms.
}
on *:sockopen:yahoo.rooms:{
  if ($sockerr > 0) { yahoo.sockerr $sock($sockname).wserr $sock($sockname).wsmsg | return }
  sockwrite -tn $sockname $yahoo.get.rooms
}
on *:sockread:yahoo.rooms:{
  if ($sockerr > 0) { yahoo.sockerr $sock($sockname).wserr $sock($sockname).wsmsg | return }
  while ($sock($sockname).rq) {
    sockread %t
    if ($sockbr == 0) return
    if (%t == $null) continue
    tokenize 32 %t
    if ($1- == PRIVATE_ROOMS) hadd -m yahoo private 1
    if ($numtok($1-,9) == 4) {
      tokenize 9 %t
      var %room = $4,%roomname = $2
      if (!$hget(yahoo,private)) {
        hadd -m yahoo.channel $+(name.,$1) $2
        hadd -m yahoo.channel $+(parent,$1) $hget(yahoo,get.room)
      }
      while (%room) {
        tokenize 44 %room
        var %list = $+(%roomname,:,$gettok($1,1,58),$chr(160),$chr(40),$gettok($1,2,58),$chr(41),$iif(($numtok($1,58) == 3),$+($chr(32),[v,$gettok($1,3,58),])))
        if (!$hget(yahoo,private)) did -a yahoo.rooms 6 %list
        else did -a yahoo.rooms 7 %list
        var %room = $deltok(%room,1,44)
      }
    }
  }
}
on *:sockclose:yahoo.rooms:{
  hdel yahoo private
  if ($dialog(yahoo.rooms)) did -ra $ifmatch 11 Loaded $did($ifmatch,5).lines catagories, $did($ifmatch,6).lines Yahoo rooms, $did($ifmatch,7).lines User rooms.
}
dialog yahoo.rooms {
  title "Yahoo Room List"
  size -1 -1 315 165
  option dbu
  button "&Refresh Catagories", 1, 5 5 57 12
  combo 2, 110 5 100 50, disable size drop
  button "L&ocale Listing", 3, 215 5 97 12, disable flat
  text "Locale &Server", 4, 65 5 45 8
  list 5, 5 20 100 125, size
  list 6, 110 20 100 125, sort size hsbar vsbar
  list 7, 215 20 95 125, size hsbar vsbar
  button "To Clipboard", 8, 5 150 42 12, disable
  button "Join Room", 9, 275 150 37 12, disable default ok
  box "", 10, 50 145 220 15
  text "", 11, 55 150 210 8, center
  edit "", 12, 50 155 220 10, hide
}
on *:dialog:yahoo.rooms:init:0:did -ra $dname 11 Loading catagories...
on *:dialog:yahoo.rooms:sclick:1:did -ra $dname 11 Loading catagories... | did -r $dname 5,6,7,12 | did -b $dname 8,9 | yahoo.rooms
on *:dialog:yahoo.rooms:sclick:5:var %room = $remove($did($dname,5,$did(5).sel),$chr(160)),%room = $+(%room,::,$gettok($hfind(yahoo.channel,%room,1).data,2,46)) | did -e $dname 8,9 | did -ra $dname 11,12 %room
on *:dialog:yahoo.rooms:dclick:5:{
  var %room = $remove($did($dname,5,$did(5).sel),$chr(160)),%id = $gettok($hfind(yahoo.channel,%room,1).data,2,46) | hadd -m yahoo get.room %id | did -ra $dname 12 $+(%room,::,%id)
  did -r $dname 6,7 | did -b $dname 8,9 | did -ra $dname 11 Loading rooms... | sockopen yahoo.rooms chat.yahoo.com 80
}
on *:dialog:yahoo.rooms:sclick:6:{
  var %line = $did($dname,6,$did(6).sel),%room = $gettok(%line,1,160),%id = $gettok($hfind(yahoo.channel,$gettok(%room,1,58),1).data,2,46),%info = $remove($gettok(%line,2,160),v,[,],$chr(40),$chr(41))
  did -ra $dname 11 $+(%line,::,%id) $gettok(%info,1,32) guests, $gettok(%info,2,32) in voice | did -ra $dname 12 %room | did -e $dname 8,9 | did -u $dname 7
}
on *:dialog:yahoo.rooms:sclick:7:{
  var %line = $did($dname,7,$did(7).sel),%room = $gettok(%line,1,160),%id = $hget(yahoo,get.room) = $remove($gettok(%line,2,160),v,[,],$chr(40),$chr(41))
  did -ra $dname 11 $+(%line,::,%id) $gettok(%info,1,32) guests | did -ra $dname 12 %room | did -e $dname 8,9 | did -u $dname 6
}
on *:dialog:yahoo.rooms:dclick:6:if ($hget(yahoo,connected)) return | elseif ($dialog(yahoo.start)) did -ci $ifmatch 4 1 $gettok($did($dname,6,$did(6).sel),1,160) | dialog -x $dname
on *:dialog:yahoo.rooms:dclick:7:if ($hget(yahoo,connected)) return | elseif ($dialog(yahoo.start)) did -ci $ifmatch 4 1 $gettok($did($dname,7,$did(7).sel),1,160) | dialog -x $dname
on *:dialog:yahoo.rooms:sclick:8:clipboard $did($dname,12)
on *:dialog:yahoo.rooms:sclick:9:if ($hget(yahoo,connected)) return | elseif ($dialog(yahoo.start)) did -ci $ifmatch 4 1 $did($dname,12) | dialog -x $dname
;// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

alias yahoo.sockerr set -u %:echo echo $color(info) -slmbfti2 | set -u %::text $+(Error,$chr(40),$1,$chr(41)) $2 | if ($mtsversion) theme.text Error | else %:echo *** %::text
alias -l yahoo.login.servers var %p = $1-,%q = edit.yahoo.com edit.my.yahoo.com edit.europe.yahoo.com msg.edit.yahoo.com edit.in.yahoo.com edit.tpe.yahoo.com | while (%q) { if (!$istok(%p,$gettok(%q,1,32),32)) %p = $addtok(%p,$gettok(%q,1,32),32) | %q = $deltok(%q,1,32) } | return %p
alias -l yahoo.login.ports var %p = $1-,%q = 80 | while (%q) { if (!$istok(%p,$gettok(%q,1,32),32)) %p = $addtok(%p,$gettok(%q,1,32),32) | %q = $deltok(%q,1,32) } | return %p
alias -l yahoo.chat.servers var %p = $1-,%q = cs1.chat.sc5.yahoo.com cs2.chat.sc5.yahoo.com cs3.chat.sc5.yahoo.com cs4.chat.sc5.yahoo.com cs5.chat.sc5.yahoo.com cs6.chat.sc5.yahoo.com cs7.chat.sc5.yahoo.com cs8.chat.sc5.yahoo.com cs9.chat.sc5.yahoo.com | while (%q) { if (!$istok(%p,$gettok(%q,1,32),32)) %p = $addtok(%p,$gettok(%q,1,32),32) | %q = $deltok(%q,1,32) } | return %p
alias -l yahoo.chat.ports var %p = $1-,%q = 8001 8002 | while (%q) { if (!$istok(%p,$gettok(%q,1,32),32)) %p = $addtok(%p,$gettok(%q,1,32),32) | %q = $deltok(%q,1,32) } | return %p

on *:sockwrite:yahoo.chat:{
  if ($sockerr > 0) { yahoo.sockerr $sock($sockname).wserr $sock($sockname).wsmsg | return }
}
on *:close:@Yahoo!:{
  var %q = yahoo.login yahoo.start yahoo.rooms
  while (%q) { if ($dialog($gettok(%q,1,32))) dialog -x $ifmatch | %q = $deltok(%q,1,32) }
  sockclose yahoo.*
  hsave -o yahoo.ignores $scriptdiryahoo.dat
  if ($hget(yahoo)) hfree yahoo
  window -c @Yahoo! Room
}


;// 12th byte definitions

;// 1   - Login complete
;// 2   - Logoff Successful
;// 17  - Join channel
;// 18  - Part channel
;// 65  - Channel message
;// 104 - User(s) is online
;// 69  - Private message
;// 70  - User is away/back
;// 62  - Ping?

alias yahoo.chat sockopen yahoo.chat $hget(yahoo,chat.server) $hget(yahoo,chat.port)
alias yahoo.re.chat {
  if ($input(Connection to the CHAT server failed. $crlf $+ Do you want to try another Yahoo server?,yq,$sock($sockname))) {
    echo -a $hget(yahoo,chat.server)
    dialog -m yahoo.start yahoo.start
  }
}
on *:sockopen:yahoo.chat:{
  if ($sockerr > 0) {
    yahoo.re.chat $sock($sockname)
    sockclose $sockname
    return
  }
  set -u %:echo echo $color(info) -lmbfti2 @Yahoo!
  set -u %::text Logging into Yahoo! chat 
  if ($mtsversion) theme.text Echo
  else %:echo *** %::text
  yahoo.login $sockname
}
on *:sockclose:yahoo.chat:{
  window -c @Yahoo!
  hsave -o yahoo.ignores $scriptdiryahoo.dat
  hfree yahoo
  hfree yahoo.channel
  set -u %:echo echo $color(info) -slmbfti2
  set -u %::text Disconnected from Yahoo! chat
  if ($mtsversion) theme.text Echo
  else %:echo *** %::text
}
on *:sockread:yahoo.chat:{
  if ($sockerr > 0) { yahoo.sockerr $sock($sockname).wserr $sock($sockname).wsmsg | return }
  echo -s rq = $sock($sockname).rq
  if (!$hget(yahoo,packet)) {
    sockread 16 &yahoo.header
    bwrite FILE -1 -1 <-
    bwrite FILE -1 -1 &yahoo.header
  }
  if (!$hget(yahoo,packet.size)) hadd -m yahoo packet.size $yahoo.size2($bvar(&yahoo.header,15,2))
  echo -s packet size = $hget(yahoo,packet.size) rq = $sock($sockname).rq
  if (!$hget(yahoo,packet.type)) hadd -m yahoo packet.type $bvar(&yahoo.header,12,1)
  if ($sock($sockname).rq < $hget(yahoo,packet.size)) {
    echo 6 -s Incomplete packet in recieve queue, saving data
    hadd -m yahoo packet.size $calc($hget(yahoo,packet.size) - $sock($sockname).rq)
    sockread $sock($sockname).rq &yahoo
    hadd -bm yahoo packet &yahoo
    bwrite FILE -1 -1 &yahoo
    bwrite FILE -1 -1 $crlf
  }
  else {
    sockread $hget(yahoo,packet.size) &yahoo
    bwrite FILE -1 -1 &yahoo
    bwrite FILE -1 -1 $crlf
    if ($hget(yahoo,packet,&yahoo.body)) {
      bcopy -c &yahoo.body $calc(1 + $bvar(&yahoo.body,0)) &yahoo 1 -1
      hdel yahoo packet
    }
    else bcopy -c &yahoo.body 1 &yahoo 1 -1
    bunset &yahoo
    hadd -bm yahoo text &yahoo.body
    if ($hget(yahoo,packet.type) == 1) yahoo.join $sockname $iif($hget(yahoo,join),$ifmatch)
    if ($hget(yahoo,packet.type) == 2) yahoo.quit
    if ($hget(yahoo,packet.type) == 17) yahoo.users
    if ($hget(yahoo,packet.type) == 18) yahoo.part
    if ($hget(yahoo,packet.type) == 65) yahoo.text
    if ($hget(yahoo,packet.type) == 67) yahoo.action
    if ($hget(yahoo,packet.type) == 104) yahoo.friend
    hdel yahoo packet.size
    hdel yahoo packet.type
  }
}
alias yahoo.login {
  bset &yahoo 1 Y C H T 0 0 1 125 0 0 0 1 0 0 $yahoo.size($+($hget(yahoo,user),1,$hget(yahoo,auth)))
  bset -t &yahoo $calc(1 + $bvar(&yahoo,0)) $hget(yahoo,user)
  bset &yahoo $calc(1 + $bvar(&yahoo,0)) 1
  bset -t &yahoo $calc(1 + $bvar(&yahoo,0)) $hget(yahoo,auth)
  sockwrite -b $1 $bvar(&yahoo,0) &yahoo
  bwrite FILE -1 -1 ->
  bwrite FILE -1 -1 &yahoo
  bwrite FILE -1 -1 $crlf
}
alias yahoo.join {
  bset &yahoo.join 1 Y C H T 0 0 1 125 0 0 0 17 0 0
  if ($2) {
    bset &yahoo.join $calc(1 + $bvar(&yahoo.join,0)) $yahoo.size($2-)
    bset -t &yahoo.join $calc(1 + $bvar(&yahoo.join,0)) $2-
  }
  else bset &yahoo.join $calc(1 + $bvar(&yahoo.join,0)) 0 0
  bwrite FILE -1 -1 ->
  bwrite FILE -1 -1 &yahoo.join
  bwrite FILE -1 -1 $crlf
  sockwrite -b yahoo.chat $bvar(&yahoo,0) &yahoo.join
  hdel yahoo join
  if ($2) {
    hadd -m yahoo chan $2-
    set -u %:echo echo $color(join) -lmbfti2 @Yahoo!
    set -u %::text Attempting to join $2-
    if ($mtsversion) theme.text JoinSelf
    else %:echo *** %::text
  }
}

alias yahoo.ignore {
  hadd -m yahoo.ignores $1 $1
  cline -l $color(grayed) $fline(@Yahoo!,$1,1,1)
}
alias yahoo.quit {
  window -c @Yahoo!
  sockclose yahoo.chat
}
alias yahoo.text {
  if ($hget(yahoo,text,&yahoo.text)) {
    tokenize 1 $replace($bvar(&yahoo.text,1,800).text,À€,)
    if ($hfind(yahoo.ignores,$2,1,W)) return
    var %strip = .<font.</font.<fade.</fade.<alt.</alt.<b.</b.<red.<green.<purple,%stripend = m.>.>.>.>.>.>.>.>.>.>.>,%text = $replace($+(`,$3-),$chr(32),$chr(160))
    while (%strip) {
      while ($pos(%text,$gettok(%strip,1,46),1)) { var %left = $left(%text,$calc($ifmatch - 1)),%right = $right(%text,$+(-,$ifmatch)),%pos2 = $pos(%right,$gettok(%stripend,1,46),1),%right = $right(%right,$+(-,%pos2)),%text = %left $+ %right }
      var %strip = $gettok(%strip,2-,46),%stripend = $gettok(%stripend,2-,46)
    }
    set -u %:echo echo $color(text) -lmbfti2 @Yahoo!
    set -u %::text $replace($right(%text,$calc($len(%text) - 1)),$chr(160),$chr(32))
    set -u %::nick $2
    if ($mtsversion) theme.text TextChan
    else %:echo $+(<,$2,>) %::text
  }
}
alias yahoo.action {
  if ($hget(yahoo,text,&yahoo.text)) {
    tokenize 1 $replace($bvar(&yahoo.text,1,800).text,À€,)
    if ($hfind(yahoo.ignores,$2,1,W)) return
    var %strip = .<font.</font.<fade.</fade.<alt.</alt.<b.</b.<red.<green.<purple,%stripend = m.>.>.>.>.>.>.>.>.>.>.>,%text = $replace($+(`,$3-),$chr(32),$chr(160))
    while (%strip) {
      while ($pos(%text,$gettok(%strip,1,46),1)) { var %left = $left(%text,$calc($ifmatch - 1)),%right = $right(%text,$+(-,$ifmatch)),%pos2 = $pos(%right,$gettok(%stripend,1,46),1),%right = $right(%right,$+(-,%pos2)),%text = %left $+ %right }
      var %strip = $gettok(%strip,2-,46),%stripend = $gettok(%stripend,2-,46)
    }
    set -u %:echo echo $color(action) -lmbfti2 @Yahoo!
    set -u %::text $replace($right(%text,$calc($len(%text) - 1)),$chr(160),$chr(32))
    set -u %::nick $2
    if ($mtsversion) theme.text ActionChan
    else %:echo $2 %::text
  }
}
alias yahoo.users {
  if ($hget(yahoo,text,&yahoo.user)) {
    if ($bvar(&yahoo.user,1,18).text == That room is full.) {
      aline 4 @Yahoo! $hget(yahoo,chan) is full. Use /knock to keep trying, or join another room.
      return
    }
    if (!$hget(yahoo,inchan)) {
      if ($bvar(&yahoo.user,1,27).text == *** Danger Will Robinson!!!) return
      hadd -m yahoo inchan $true
      hadd -m yahoo vcauth $bvar(&yahoo.user,$calc($bfind(&yahoo.user,$calc($bfind(&yahoo.user,$calc($bfind(&yahoo.user,$calc($bfind(&yahoo.user,1,128) + 1),128) + 1),61) + 1),61) + 1),34).text
      var %chan = $bvar(&yahoo.user,1,$calc($bfind(&yahoo.user,1,À) - 1)).text
      bcopy -c &yahoo.user 1 &yahoo.user $calc($bfind(&yahoo.user,$calc($bfind(&yahoo.user,$calc($bfind(&yahoo.user,$calc($bfind(&yahoo.user,1,128) + 1),128) + 1),128) + 1),128) + 1) -1
      while ($bfind(&yahoo.user,1,) > 0) {
        var %n = $bvar(&yahoo.user,1,$calc($bfind(&yahoo.user,1,2) - 1)).text
        bcopy -c &yahoo.user 1 &yahoo.user $calc($bfind(&yahoo.user,1,) + 1) -1
        if ($hfind(yahoo.ignores,%n,1,W)) aline -l $color(greyed) @Yahoo! %n
        elseif ($hget(yahoo.friends,%n)) aline -l $color(title) @Yahoo! %n
        else aline -l @Yahoo! %n
      }
      var %n = $bvar(&yahoo.user,1,$calc($bfind(&yahoo.user,1,2) - 1)).text
      hadd -m yahoo camauth $bvar(&yahoo.user,$calc($bvar(&yahoo.user,0) - 33),34).text
      if ($hfind(yahoo.ignores,%n,1,W)) aline -l $color(greyed) @Yahoo! %n
      elseif ($hget(yahoo.friends,%n)) aline -l $color(title) @Yahoo! %n
      else aline -l @Yahoo! %n
      hadd -m yahoo chan %chan
      hadd -m yahroom %chan %chan
      titlebar @Yahoo! %chan $+([,$line(@Yahoo!,0,1),])
      set -u %:echo echo $color(join) -lmbfti2
      set -u %::chan %chan
      if ($mtsversion) theme.text JoinSelf
      else %:echo * Now talking in %chan
    }
    else {
      if ($bvar(&yahoo.user,1,27).text == *** Danger Will Robinson!!!) return
      tokenize 1 $replace($bvar(&yahoo.body,1,800).text,À€,)
      var %n = $gettok($5,1,2)
      if (!$hfind(yahoo.ignores,%n,W)) {
        set -u %:echo echo $color(join) -lmbfti2 @Yahoo!
        set -u %::chan $1
        set -u %::address $+(%n,@Yahoo!.com)
        set -u %::nick %n
        if ($mtsversion) theme.text Join
        else %:echo * %n has joined $1 
        if ($hfind(yahoo.friends,$+(*.,%n),1,w)) aline -l $color(title) @Yahoo! %n
        aline -l @Yahoo! %n
      }
      else aline -l $color(grayed) @Yahoo! %n
      titlebar @Yahoo! $gettok($window(@Yahoo!).title,1,32) $+([,$line(@Yahoo!,0,1),])
    }
  }
}
alias yahoo.part {
  if ($hget(yahoo,text,&yahoo.part)) {
    tokenize 1 $replace($bvar(&yahoo.part,1,800).text,À€,)
    if ($2 == $hget(yahoo,user)) {
      dline -l @Yahoo! $+(1-,$line(@Yahoo!,0))
    }
    else {
      dline -l @Yahoo! $fline(@Yahoo!,$2,1,1)
    }
    if (!$hfind(yahoo.ignores,$2,1,W)) {
      set -u %:echo echo $color(quit) -lmbfti2 @Yahoo!
      set -u %::address $+($2,@Yahoo!.com)
      set -u %::nick $2
      if ($mtsversion) theme.text Quit
      else %:echo * $2 has Quit
    }
    titlebar @Yahoo! $gettok($window(@Yahoo!).title,1,32) $+([,$line(@Yahoo!,0,1),])
  }
}
alias yahoo.quit {
  hsave -o yahoo.ignores $scriptdiryahoo.dat
  window -c @Yahoo!
  hfree yahoo
  hfree yahoo.channel
  set -u %:echo echo $color(info) -slmbfti2
  set -u %::text You have been logged off of Yahoo! chat
  if ($mtsversion) theme.text Error
  else %:echo *** %::text
}
alias yahoo.friend {
  if ($hget(yahoo,text,&yahoo.friend)) {
    if ($bvar(&yahoo.friend,1) == 48) {
      var %a = $bvar(&yahoo.friend,4,$calc($bfind(&yahoo.friend,4,À) - 4)).text
      if ($hget(yahoo.online.friends,%a)) hdel yahoo.online.friends $hget(yahoo.online.friends,%a)
    }
    else {
      bcopy -c &yahoo.friend 1 &yahoo.friend 4 -1
      while ($bfind(&yahoo.friend,1,À) != 0) {
        var %end = $calc($bfind(&yahoo.friend,1,À) - 1)
        hadd -m yahoo.online.friends $bvar(&yahoo.friend,1,%end).text $bvar(&yahoo.friend,1,%end).text
        if ($calc($bvar(&yahoo.friend,0) - %end) = 3) break
        bcopy -c &yahoo.friend 1 &yahoo.friend $calc(%end + 6) -1
      }
    }
  }
}

;// Misc functions

;// Echo info to the @Yahoo! window
alias -l yahoo.echo {
  set -u %:echo echo $color(info) -lmbfti2 @Yahoo!
  set -u %::text $1-
  if ($mtsversion) theme.text Echo
  else %:echo *** %::text
}
;// Size of outgoing packet
alias yahoo.size {
  var %a = $gettok($calc($len($1-) / 256),1,46)
  var %b = $calc($len($1-) - $calc(%a * 256))
  return %a %b
}
;// Size of incoming packet
alias yahoo.size2 {
  tokenize 32 $1-
  var %a = $calc($1 * 256)
  return $calc(%a + $2)
}
menu @Yahoo! {
  $iif(($sline(@Yahoo!,1)),View Profile):run $+(http://profiles.yahoo.com/,$$1)
  Ignore
  .Ignore this user:yahoo.ignore $$1
  .Bot ignore:yahoo.ignore $replace($$1,1,?,2,?,3,?,4,?,5,?,6,?,7,?,8,?,9,?,0,?)
  -
  Change rooms:dialog -m yahoo.start yahoo.start
  Get Yahoo! room list:yahoo.rooms
  -
  Buddy List:yahoo.buddy
  -
  Quit Yahoo! chat:yahoo.quit
}
on *:input:@Yahoo!:{
  if (($left($1,1) == $readini($mircini,text,commandchar)) && (!$ctrlenter)) {
    if (($1 == /join) || ($1 == /j)) yahoo.join yahoo.chat $2
    if (($1 == /ignore) || ($1 == /i)) yahoo.ignore yahoo.chat $2
if ($1 == /buddy) yahoo.buddy
    if ($1 == /knock) aline 4 @Yahoo! /knock Command not implimented yet
    if (($1 == /list) || ($1 == /l)) yahoo.rooms
  }
  else {
    bset &yahoo.send 1 Y C H T 0 0 1 125 0 0 0 65 0 0 $yahoo.size($+($hget(yahoo,chan),1,$1-))
    bset -t &yahoo.send $calc(1 + $bvar(&yahoo.send,0)) $hget(yahoo,chan)
    bset &yahoo.send $calc(1 + $bvar(&yahoo.send,0)) 1
    ;// Truncating lines to 450 characters cuz YCHT can only send 500, and im not sure if thats entire
    ;// data packet or just message
    bset -t &yahoo.send $calc(1 + $bvar(&yahoo.send,0)) $left($1-,450)
    bwrite FILE -1 -1 ->
    bwrite FILE -1 -1 &yahoo.send
    bwrite FILE -1 -1 $crlf
    sockwrite -b yahoo.chat $bvar(&yahoo.send,0) &yahoo.send
  }
  halt
}

;// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;// Misc stuff

alias yahoo.buddy dialog -m yahoo.buddy.list yahoo.buddy.list
dialog yahoo.buddy.list {
  title "'s Buddylist"
  size -1 -1 145 110
  option dbu
  text "Selected &Friends", 5, -10 20 90 8, center
  list 6, 0 30 80 60, size
  button "&Go To", 7, 0 95 17 12, disable
  button "&Invite", 8, 20 95 17 12, disable
  button "P&M", 9, 40 95 12 12, disable
  button "&Delete", 10, 55 95 22 12
  text "C=Chat, P=Pager, G=Games, Y=Yahoo Buddy Note: Close Messenger before deleting buddies.", 11, 80 0 65 58, center
  check "In &Chat", 1, 0 0 35 10, disable push
  check "On &Pager", 2, 35 0 40 10, push
  check "In G&ames", 3, 0 10 35 10, disable push
  check "&Offline", 4, 35 10 40 10, push
}
on *:dialog:yahoo.buddy.list:init:0:{
  if ($hget(yahdata,buddy.inchat)) did -c $dname 1
  if ($hget(yahdata,buddy.onpager)) did -c $dname 2
  if ($hget(yahdata,buddy.ingames)) did -c $dname 3
  if ($hget(yahdata,buddy.offline)) did -c $dname 4
  yahoo.fill.buddylist
}
on *:dialog:yahoo.buddy.list:sclick:2:{
  hadd -m yahdata buddy.onpager $did(2).state
  if (!$did(4).state) yahoo.fill.buddylist
}
on *:dialog:yahoo.buddy.list:sclick:4:{
  hadd -m yahdata buddy.offline $did(4).state
  yahoo.fill.buddylist
}
alias -l yahoo.fill.buddylist {
  var %q = $hget(yahoo.friends,0).item,%p = $hget(yahoo.online.friends,0).item,%d = yahoo.buddy.list
  did -r %d 6
  if ($did(yahoo.buddy.list,4).state) {
    while (%q) {
      var %w = $hget(yahoo.friends,%q).data
      did -a %d 6 $yahoo.buddy.flags(%w) %w
      dec %q
    }
  }
  elseif ($did(yahoo.buddy.list,2).state) {
    while (%p) {
      var %w = $hget(yahoo.online.friends,%p).data
      did -a %d 6 $yahoo.buddy.flags(%w) %w
      dec %p
    }
  }
}
alias -l yahoo.buddy.flags {
  return $+($iif(($hget(yahoo.room.users,$1)),C,-),$iif(($hget(yahoo.online.friends,$1)),P,-),$iif((1 = 0),G,-),$iif(($gettok($hfind(yahoo.friends,$1,1).data,1,46) == Friends),Y,-))
}