IRcap — File Browser

ircap871-mircscripts_2799 / ircap871-mircscripts_2799 / mod / Jabber / Jabber.mrc

Jabber.mrc — 32 KB — Download this file

;IRcap8 a09446827cb943df7e5f839e022e7915
;v2.1

alias XMPP {
  goto $1

  :CONN
  unset %tmp.xmpp4096 | .remove xmpp.tmp
  if ($hget(roster)) { hfree roster } | .hmake -s roster
  if (!$2-) return
  set -u60 %tmp.xmpp $2-
  if ($gettok($1-,-1,32) == REG) { %tmp.xmpp.reg = 1 }
  sockclose XMPP | sockopen XMPP $gettok($2,2,64) $4 | sockmark xmpp conn
  return

  :RAW
  xm $2-
  return

  :SUBSCRIBE
  var %g = $3- | if (!%g) { %g = - }
  xm <iq type="set"><query xmlns="jabber:iq:roster"><item name=" $+ $gettok($2,1,64)  $+ " jid=" $+ $2 $+ "></item></query></iq>
  hadd roster $2 $gettok($2,1,64) $+ -----
  xm <presence to=" $+ $2 $+ " type="subscribe"/>
  return

  :SUBSCRIBED
  xm <presence to=" $+ $2 $+ " type="subscribe"/><presence to=" $+ $2 $+ " type="subscribed"/>
  return

  :UNSUBSCRIBED
  xm <iq type="set"><query xmlns="jabber:iq:roster"><item jid=" $+ $2 $+ " subscription="remove"></item></query></iq>
  hdel roster $2
  return

  :NICK
  var %i = $hget(roster,$2) , %n = $iif($3 != *,$3,$gettok(%i,1,22)) , %g = $iif($4 != *,$4,$gettok(%i,2,22))
  xm <iq type="set"><query xmlns="jabber:iq:roster"><item jid=" $+ $2 $+ " name=" $+ $mrcjab(%n) $+ "> $+ $iif($4 != -,<group> $+ $mrcjab(%g) $+ </group>) $+ </item></query></iq>
  %i = $puttok(%i,%n,1,22) | %i = $puttok(%i,$iif(%g,%g,-),2,22) | hadd roster $2 %i
  return

  :SHOW
  xm <presence><show> $+ $2 $+ </show> $+ $iif($3-,<status> $+ $3- $+ </status>) $+ <priority>0</priority></presence>
  return

  :REGAGENT
  if $2 == key { 
    xm <iq to=" $+ $gettok(%tmp.xmppagent,1,32) $+ " type="set" id="TRANSPORTE"><query xmlns="jabber:iq:register"> $+ $iif($3,<key> $+ $3 $+ </key>) $+ <username> $+ $gettok(%tmp.xmppagent,2,32) $+ </username><password> $+ $gettok(%tmp.xmppagent,3,32) $+ </password> $+ $iif($gettok(%tmp.xmppagent,4,32),<nick> $+ $ifmatch $+ </nick>)  $+ $iif(%tmp.remagent == on,<remove/>) $+ </query></iq>
    unset %tmp.xmppagent %tmp.remagent
    return
  }
  set -u60 %tmp.xmppagent $2- 
  xm <iq to=" $+ $2 $+ " type="get" id="REGAGENT"><query xmlns="jabber:iq:register"/></iq>
  return
}

on 1:sockopen:XMPP: {
  if $sockerr > 0 { xmppui discon ( $sock(xmpp).wsmsg ) | return }
  xm <?xml version="1.0"?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" to=" $+ $gettok($gettok(%tmp.xmpp,1,32),2,64) $+ " version="1.0">

  var %r = 30
  if (%tmp.xmpp.reg) {
    .timer 1 5 unset %tmp.xmpp.reg | %r = 5000
    .timer -o 1 2 xm <iq type="set" to=" $+ $gettok($gettok(%tmp.xmpp,1,32),2,64) $+ " id="REG"><query xmlns="jabber:iq:register"><username> $+ $jabmrc($lower($gettok($gettok(%tmp.xmpp,1,32),1,64))) $+ </username><password> $+ $gettok(%tmp.xmpp,2,32) $+ </password></query></iq>
    .timer -o 1 5   xmpp CONN $gettok(%ujabber,1,32) $decode64($gettok(%ujabber,2,32),m) $gettok(%ujabber,3-,32) $1-
    return
  }
  sockmark xmpp
}
on 1:sockclose:XMPP: xmppui DISCON $sock(xmpp).wsmsg


on 1:sockread:XMPP: {
  sockread &a | breplace &a ' "
  if $group(#xmppdebug) == on dbug 4 %tmp.xmpp4096 $bvar(&a,0)  $bvar(&a,1,800).text $iif($bvar(&a,0) > 800,4...2 $bvar(&a,$calc($bvar(&a,0) - 9),10).text)

  if (%tmp.xmpp4096 == on) { bwrite xmpp.tmp -1 $bvar(&a,0) &a | bunset &a | bread xmpp.tmp 0 999999 &a | unset %tmp.xmpp4096 | bwrite debugxmpp.txt 0 $bvar(&a,0) &a | .remove xmpp.tmp }
  var %ul = $bvar(&a,$calc($bvar(&a,0) - 9),10).text | if (*/presence> !iswm %ul) && (*/message> !iswm %ul) && (*/iq> !iswm %ul) && (*/> !iswm %ul) && (!%tmp.xmpp) { if $bvar(&a,0) > 1 {   if $group(#xmppdebug) == on dbug 4... | bwrite xmpp.tmp -1 $bvar(&a,0) &a | %tmp.xmpp4096 = on | return } }

  var %p = 1 , %p0 = $calc($bvar(&a,0) + 1)
  :L1
  if %p == %p0 { bunset &a | return } | var %p1 = $calc(%p + 1)
  var %f = ç $+ $sorttok(%p0 $+ ç $+ $bfind(&a,%p1,<presence) $+ ç $+ $bfind(&a,%p1,<message) $+ ç $+ $bfind(&a,%p1,<iq),231,n) | %f = $gettok($remove(%f,ç0),1,231)
  bunset &h | bcopy &h 1 &a %p $calc(%f - %p) | %p = %f | xmpproc | goto L1
}

alias XMPPROC {
  if $bfind(&h,1,<iq) != 0 {
    if $bfind(&h,1,type="error) != 0 { xmppui iqerror | return }
    if $bfind(&h,1,id="getroster") != 0 { LLroster | return }
    if $bfind(&h,1,id="getagent") != 0 { xmppui agent | return }
    if $bfind(&h,1,id="getagentinfo-) != 0 { xmppui agentinfo | return }
    if $bfind(&h,1,id="getvcard") != 0 { xmppui vcard | return }
    if $bfind(&h,1,id="buscogente") != 0 { xmppui jud | return }
    if $bfind(&h,1,id="CONN") != 0 { 
      xm <iq id="GETroster" type="get"><query xmlns="jabber:iq:roster"/></iq>
      xmppui CONN
    }
    if $bfind(&h,1,id="regagent") != 0 { if ($xmltag($bvar(&h,1,900).text,key)) { xmpp regagent key $ifmatch } | else xmpp regagent key }
    if $bfind(&h,1,type="set") != 0 { 
      var %p = $bfind(&h,1,jid=") , %f = $bfind(&h,$calc(%p + 5),"), %de = $bvar(&h,$calc(%p + 5),$calc(%f - %p - 5)).text
      var %i = $hget(roster,%de) | if (!%i) return
      var %p = $bfind(&h,1,subscription=") , %f = $bfind(&h,$calc(%p + 14),"), %su = $bvar(&h,$calc(%p + 14),$calc(%f - %p - 14)).text
      var %p = $bfind(&h,1,ask=") , %f = $bfind(&h,$calc(%p + 5),") | if (%p != 0) { var %ak = $bvar(&h,$calc(%p + 5),$calc(%f - %p - 5)).text }
      var %es = $gettok(%i,6,22) | if (%ak == subscribe) { %es = $m(510) } | if (%su == none) && (!%ak) { %es = 4 $+ $m(509) $+  }
      %i = $puttok(%i,%su %ak,3,22) | %i = $puttok(%i,%es,6,22) | hadd roster %de %i
      xmppui rost1c %de
      return
    }

  }

  if $bfind(&h,1,<presence) != 0 {
    var %p = $bfind(&h,1,from=") , %t = $bvar(&h,$calc(%p + 6),500).text , %de = $gettok($gettok(%t,1,34),1,47) , %rec = $gettok($gettok(%t,1,34),2,47)
    if (%de == $gettok(%ujabber,1,32)) return
    var %i = $hget(roster,%de) , %pre = $gettok(%i,5,22) | if (!%i) { %i = $gettok(%de,1,64) $+ ???---- | hadd roster %de %i | %pre = unavailable }

    if ($xmltag(%t,show)) { %i = $puttok(%i,$ifmatch,5,22) } | else { %i = $puttok(%i,available,5,22) }
    if ($xmltag(%t,status)) { %i = $puttok(%i,$jabmrc($ifmatch),6,22) } | else { %i = $puttok(%i,-,6,22) }
    if (%rec) { %i = $puttok(%i,%rec,4,22) }

    if ($bfind(&h,1,type="unsubscribe") != 0) { xmppui unsubscribe %de | return }
    if ($bfind(&h,1,type="unsubscribed") != 0) { xmppui unsubscribed %de | return }
    if ($bfind(&h,1,type="subscribed") != 0) { xmppui subscribed %de | return }
    if ($bfind(&h,1,type="subscribe") != 0) { 
      hadd roster %de $gettok(%de,1,64) $+ -----
      xm <iq type="set"><query xmlns="jabber:iq:roster"><item jid=" $+ %de $+ " name=" $+ $gettok($gettok(%de,1,64),1,37) $+ " subscription="from"></item></query></iq>
      xmppui subscribe %de | return 
    }

    if ($bfind(&h,1,type="error") != 0) { %i = $puttok(%i,unavailable,5,22) | %i = $puttok(%i,error: $jabmrc($xmltag(%t,text)),6,22) }
    if ($bfind(&h,1,type="unavailable") != 0) { %i = $puttok(%i,unavailable,5,22) }

    hadd roster %de %i

    var %ne = $gettok(%i,5,22) , %e = aw
    if (%ne != unavailable) && (%pre == unavailable) { %e = con }
    if (%ne == unavailable) && (%pre != unavailable) { %e = dis }
    xmppui PRESENCE %de %e %i
  }

  if $bfind(&h,1,<message) != 0 {
    var %p = $bfind(&h,1,from=") , %t = $bvar(&h,$calc(%p + 6),900).text , %de = $gettok(%t,1,34)
    if (<body> isin %t) xmppui MSG $gettok(%de,1,47) 12 $bvar(&h,1,900).text
  }

  if (!%tmp.xmpp) return
  if (%tmp.xmpp.reg) return

  ;auth
  if $bfind(&h,1,stream:features) != 0 {
    if $bfind(&h,1,digest-md5) != 0 { xm <auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="DIGEST-MD5" /> }
  }

  if $bfind(&h,1,<success) != 0 {
    xm <?xml version="1.0"?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" to=" $+ $gettok($gettok(%ujabber,1,32),2,64) $+ " version="1.0">
    return
  }

  if $bfind(&h,1,urn:ietf:params:xml:ns:xmpp-bind) != 0 {
    if $bfind(&h,1,type="result") != 0 { unset %tmp.xmpp | xm <iq type="set"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq> | xm <iq type="get" id="GETroster"><query xmlns="jabber:iq:roster"/></iq> | xmppui CONN | return } 
    xm <iq type="set"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource> $+ $gettok(%ujabber,4,32) $+ </resource></bind></iq>
  }

  if $bfind(&h,1,<failure) != 0 {
    xmppui discon $xmltag($bvar(&h,1,500).text,failure) | xmppui cancela
    return
  }

  if $bfind(&h,1,<challenge) != 0 {
    var %t = $decode64($xmltag($bvar(&h,1,500).text,challenge),m)
    if (rspauth= isin %t) {
      xm <response xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
      return
    }

    var %a = $pos(%t,realm=") , %realm = $jabmrc($gettok($mid(%t,%a,100),2,34)) , %a = $pos(%t,nonce=") , %nonce = $jabmrc($gettok($mid(%t,%a,100),2,34))

    if (!%realm) { %realm = $gettok($gettok(%ujabber,1,32),2,64) }

    var %cnonce = $md5(IRcap $ticks)

    var %X = $lower($gettok(%ujabber,1,64)) $+ : $+ %realm $+ : $+ $decode64($gettok(%ujabber,2,32),m)

    bset -t &Y 1 y
    Bmd5dec $md5(%X)  

    bset -t &Y 17 : $+ %nonce $+ : $+ %cnonce

    var %A2 = AUTHENTICATE:xmpp/ $+ %realm

    var %HA1 = $md5(&Y,1)

    var %HA2 = $md5(%A2)

    var %KD = %HA1 $+ : $+ %nonce $+ :00000001: $+ %cnonce $+ :auth: $+ %HA2

    var %response = $md5(%KD)

    var %r = username=" $+ $lower($gettok(%ujabber,1,64)) $+ ",realm=" $+ %realm $+ ",nonce=" $+ %nonce $+ ",cnonce=" $+ %cnonce $+  ",nc=00000001,digest-uri="xmpp/ $+ %realm $+ ",qop=auth,response= $+ %response $+ ,charset=utf-8
    %r = $encode(%r,m)
    xm <response xmlns="urn:ietf:params:xml:ns:xmpp-sasl"> $+ %r $+ </response>
  }
}

alias -l Bmd5dec {
  var %b = 1 , %n = 1
  :L1
  var %a = $mid($1-,%n,2)
  if (%b < 17) {  
    bset &Y %b $base(%a,16,10)
    inc %n 2
    inc %b 1
    goto L1
  }
}


alias -l LLroster {
  var %i = 1 , %co = 1
  %xmpp.gr =
  :L1
  var %p = $bfind(&h,%i,<item) | if %p == 0 { xmppui roster | return }
  var %f = $bfind(&h,%p,</item>) , %f2 = $bfind(&h,%p,/>)
  if (%f == 0) || (%f2 < %f && %f2 > 0) { %f = %f2 } | if %f == 0 { xmppui roster | return }
  var %item = $bvar(&h,%p,$calc(%f - %p)).text
  var %a = $pos(%item,jid=") , %id = $gettok($mid(%item,%a,100),2,34)
  var %a = $pos(%item,name=") , %na = $jabmrc($gettok($mid(%item,%a,100),2,34))
  var %a = $pos(%item,subscription=") , %sus = $gettok($mid(%item,%a,100),2,34)
  var %a = $pos(%item,ask=") , %ask = $gettok($mid(%item,%a,100),2,34)
  var %gr = $jabmrc($xmltag(%item,group))
  if (!%na) { %na = %id }
  if (!%gr) { %gr = - } | else { %xmpp.gr = $addtok(%xmpp.gr,%gr,22) }
  var %es = - | if (%ask == subscribe) { %es = $m(510) } | if (%sus == none) && (!%ask) { %es = 4 $+ $m(509) $+  }
  var %eD = unavailable | if ($hget(roster,%id)) { var %eD = $gettok($ifmatch,5,22) , %es = $gettok($ifmatch,6,22) }
  hadd roster %id %na $+  $+ %gr $+  $+ %sus %ask $+  $+ n/a $+  $+ %eD $+  $+ %es
  %i = %f | goto L1
}

alias XMLTAGB {
  var %i = 1 | if ($3) { %i = $bfind(&h,1,< $+ $3) | if (%i == 0) { %i = 1 } }
  var %a = $bfind(&h,%i,< $+ $2) , %b = $bfind(&h,%i,</ $+ $2 $+ >) , %c = $bfind(&h,%i,< $+ $2 $+ />)
  if (%b == 0) { return } |  if (%c != 0) && (%c < %b) return
  var %a = $calc($bfind(&h,%a,>) + 1) | return %a $calc(%b - %a)
}

alias XM {
  if (!%tmp.qjab) xm2 $1- | else .timer -mo 1 %tmp.qjab xm2 $1-
  inc %tmp.qjab 30 | .timerQJAB -o 1 1 unset %tmp.qjab
}
alias -l XM2 {
  if (!$sock(xmpp)) { xmppui discon ERROR | return }
  bset -t &x 1 $1-
  sockwrite xmpp &x
  if $group(#xmppdebug) == on dbug --> $1-
}

alias jabmrc return $replace($1-,ñ,ñ,Ñ,Ñ,á,á,é,é,í,í,ó,ó,ú,ú,&lt;,<,&gt;,>,¿,¿,¡,¡,&quot;,",Á,Á,É,É,Í,Í,Ó,Ó,Ú,Ú,Ü,Ü,ü,ü,ç,ç,Ç,Ç,&amp;,&,´,´,&apos;,',¬,¬,¦,¦,€,€,•,•,Â,$chr(32))
alias mrcjab {
  var %a = $1- , %i = $len($1-) , %f = &ñÑ¡áéíóú<>¿"ÁÉÍÓÚÜüçÇ´'¬¦€•
  :L1 | while (%i > 0) { if ($asc($mid(%a,%i,1)) > 126) { if ($mid(%a,%i,1) !isin %f) { %a = $mid(%a,1,$calc(%i - 1)) $+ * $+ $mid(%a,$calc(%i + 1),999) } } | dec %i }
  %a = $replace(%a,&,&amp;,ñ,ñ,Ñ,Ñ,¡,¡,á,á,é,é,í,í,ó,ó,ú,ú,<,&lt;,>,&gt;,¿,¿,",&quot;,Á,Á,É,É,Í,Í,Ó,Ó,Ú,Ú,Ü,Ü,ü,ü,ç,ç,Ç,Ç,´,´,',&apos;,¬,¬,¦,¦,€,€,•,•)
  return %a
}

#xmppdebug on
alias -l dbug if (!$window(@jab.debug)) { window -ken @JAB.debug } | echo @JAB.debug $timestamp $1-
on 1:input:@jab.debug: xm $1-
menu @jab.debug {
  clear: clear $active
  -
  ping: xm <message to=' $+ $gettok(%ujabber,1,32) $+ ' type="chat"><body/><ping> $+ $ticks $+ </ping></message>
}
#xmppdebug end

alias jabwin {
  if ($window(@jabber)) jabgui
  if ($isalias(sba.jabber)) { sbarra redib }
}

alias jabgui {
  var %w = $window(@jabber).w , %h = $window(@jabber).h
  if (!$window(@jabber)) { window -c @jabber | %jabber.skla = 140 154 | guiwin @jabber $readini ircap.ini ww jabber Jabber | var %act = 1 }
  else { guiwin @jabber x x $window(@jabber).w $window(@jabber).h Jabber }

  var %w = $window(@jabber).w , %h = $window(@jabber).h

  if ($sock(xmpp).mark == conn) || ($timer(jab.recon)) {
    unset %jabber.ls1 %jabber.tx
    var %x = $int($calc($window(@jabber).w / 2 - 60)) , %y = $int($calc($window(@jabber).h / 2 - 8))
    %jabber.bt = $calc(%x + 9) %y 90 xmppui_cancela $iif($timer(jab.recon),$m(539) ...,$m(540) ...)
  }

  else if ($sock(xmpp)) {
    %jabber.bt = $int($calc(%w / 2 - 56)) $calc(%h - 36) 70 jab.opc $m(504) $chr(124) $int($calc(%w / 2 + 34)) $calc(%h - 36) 6 jab.opc_h ?
    unset %jabber.tx
    var %l = $gettok(%jabber.ls1,5,32) | %jabber.ls1 = 10 68 $calc(%w - 40) $int($calc((%h / 14) - 8)) 1 0 jabclick @xmppls arbol | unset %xmpp.gr
    if (%l) { %jabber.ls1 = $puttok(%jabber.ls1,%l,5,32) }

    if $1 != redim { xmppui roster } | else guilista @jabber jabber.ls1 
    jab.estado %jab.estado
  }

  else {
    unset %jabber.ls1
    %jab.con.id = $gettok(%ujabber,1,32)
    var %x = $int($calc($window(@jabber).w / 2 - 60)) , %y = $int($calc($window(@jabber).h / 2 - 44))
    cuagr @jabber %x $calc(%y + 30) 120 44
    %jabber.tx = $calc(%x + 5) $calc(%y + 50) 110 jab.con.id ! $+ $m(538)
    %jabber.bt = $calc(%x + 9) %y 68 jab.opc_12 $upper($left($m(269),1)) $+ $mid($m(269),2,99) $chr(124) $int($calc(%x + 92)) %y 6 jab.opc_h ? $chr(124) $calc(%x + 9) $calc(%y + 84) 90 jab.conn $m(532)
  }

  guidib @jabber | if (%act) window -wa @jabber
}

alias redim.@jabber jabgui redim | if $1 == fin { wmueve2 @jabber }
alias onedit.@jabber {
  if ($1 == jab.con.id) { 
    if (!%jab.con.id)  { unset %ujabber | wrini %perfil Jabber id | return }
    .timer -mo 1 100 jabpidepass
  }
}
alias jabpidepass {
  unset %jab.min
  var %a = $?*=" $mg(ppass) "
  if (!%a) return
  var %pt = $?=" $mg(jid2) " | if (!%pt) { %pt = 5222 }
  var %r = $?=" $mg(jid3) " | if (!%r) { %r = IRcap }
  %ujabber = %jab.con.id $encode(%a,m) %pt %r
  wrini %perfil Jabber id %ujabber
}

alias jab.estado {
  %jab.estado = $1-
  if (!$window(@jabber)) return
  var %w = $window(@jabber).w | cuagi @jabber 10 34 $calc(%w - 22) 26 gui
  var %e1 = avchatawayxadndinv , %e2 = $m(500) , %e3 = 335556

  drawtext -nroc @jabber $gettok(%gui.cc,6,44) Verdana 10 36 36 $calc(%w - 55) 14 $gettok(%ujabber,1,32)
  drawtext -nrc @jabber $gettok(%gui.cc,6,44) Verdana 9 36 46 $calc(%w - 55) 14 $gettok(%e2,$findtok(%e1,$1,22),22) $iif($2,: $2-)
  drawpic -cnt @jabber 65280 15 41 $calc($gettok(%e3,$findtok(%e1,$1,22),22) *  14) 0 14 14 " $+ $mircdirskin\ $+ %skin $+ \miniconos.bmp"
}

alias sclick.@jabber if ($inrect($1,$2,10,34,999,26)) && ($window(@xmppls)) { %tmp.xmppestado = 1 | wpulsa @jabber 10 34 $calc($window(@jabber).w - 20) 28 | sss clik }
alias uclick.@jabber if ($inrect($1,$2,10,34,999,26)  && ($window(@xmppls)) && (%tmp.xmppestado)) smenu jab.sta 100 $gettok($m(500),1-5,22) $+ - $+ $gettok($m(500),6,22) $+ - $+ $m(503) | unset %tmp.xmppestado
alias jab.opc {
  if (!$1) { smenu jab.opc 160 $m(505) ( $iif(%jab.veo == on,*) )- $m(506) - $m(46)  $m(507) - $m(508) -debug XML ( $iif($group(#xmppdebug) == on,*) )- $m(269) | return }
  goto $1
  :h | url $urlcap(1) $+ /ayuda/jabber/index.html | return
  :1 | if (%jab.veo == on) { %jab.veo = off } | else { %jab.veo = on } | xmppui roster | return
  :3 | xmenu + | return
  :5 | jabprivado $$?=" $m(246) ?" | return
  :6 | xmppui info $$?=" $m(246) ?" | return
  :8 | xm <iq id="getagent" type="get" to=" $+ $gettok($gettok(%ujabber,1,32),2,64) $+ "><query xmlns="http://jabber.org/protocol/disco#items"/></iq><iq id="getagentinfo-server" type="get" to=" $+ $gettok($gettok(%ujabber,1,32),2,64) $+ "><query xmlns="http://jabber.org/protocol/disco#info"/></iq> | jabber2 jab.disco - | return
  :10 | if ($group(#xmppdebug) == on) { .disable #xmppdebug | window -c @jab.debug } | else { .enable #xmppdebug } | return
  :12 | F3 setup_jabber
  :13
}
alias jab.sta {
  if $1 == listador { var %a = $2 | xmpp show $2 $mrcjab($strip($3-)) | goto L1 }
  %jab.idle = $puttok(%jab.idle,$ctime,1,32)
  var %a = $gettok(avchatawayxadnd-inv-dis,$1,22)
  if (%a isin away xa chat dnd) { loads listador | $listador($gettok($m(500),3,22),JABBER : $gettok($m(500),3,22),$nofile(%perfil) $+ away.txt,jab.sta listador %a <item>,1) | return }
  if %a == av { xm <presence><priority>0</priority></presence> }
  if %a == inv { xm <presence type="invisible"><status></status><priority>0</priority></presence> }
  if %a == dis { sockclose xmpp | xmppui cancela | jabwin | return }
  :L1
  jab.estado %a $strip($3-) | if ($window(@jabber)) drawline @jabber
  if (%sba.jabstpos) { jab.estado2 %a $strip($3-) | drawline @sba }
}

alias JAB.CONn {
  %jab.st = $m(500)
  xmpp CONN $gettok(%ujabber,1,32) $decode64($gettok(%ujabber,2,32),m) $gettok(%ujabber,3-,32) $1-
  jabwin
}


alias XMPPUI {
  goto $1
  :ROSTER
  var %tic = $ticks
  clear @xmppls
  var %i = 1 , %gt | while ($hget(roster,%i).item) {
    var %v = $hget(roster,%i).data , %e = $gettok(%v,5,22) , %d = $ifmatch , %g = $gettok(%v,2,22) , %su = $gettok(%v,3,22) | if (%g == -) { %g = $m(501) }

    if (@ !isin %d) goto L2
    if (%su == none) goto L2
    if (%jab.veo != on) { if (%e == unavailable) goto L1 }
    :L2
    var %ico = $iif(%e isin available chat,4,5) | if (%e isin away dnd xa) { %ico = 6 } | if $gettok($gettok(%v,3,22),1,32) != both { %ico = 7 }

    if (!$findtok(%jab.min,%g,22)) aline -l @xmppls %g $+ i $+ $gettok(%v,1,22) $iif($gettok(%v,6,22) != -,14( $ifmatch )) $+  $+ %d $+ - $+ %ico
    if (!$findtok(%gt,%g,22)) { aline -l @xmppls %g $+ g $+ %g  -- $+ $iif($findtok(%jab.min,%g,22),2,1) | %gt = $addtok(%gt,%g,22) }
    :L1
    %xmpp.gr = $addtok(%xmpp.gr,%g,22)
    inc %i
  }

  if ($window(@jabber)) { guilista @jabber jabber.ls1 | guidib @jabber }
  if (%sba.ls1.jabber) { guilista @sba sba.ls1.jabber | drawline @sba }
  return

  :ROST1C
  var %l = $fline(@xmppls,*i* $+ $2 $+ **,1)
  if (%l) {
    var %g = $gettok($line(@xmppls,%l),1,8) | if (%g == -) { %g = $m(501) }
    dline @xmppls %l
    if ($fline(@xmppls,%g $+ i****,0) < 1) { var %gl = $fline(@xmppls,%g $+ g****,1) | if (%gl) dline @xmppls %gl }
  }
  var %v = $hget(roster,$2) , %e = $gettok(%v,5,22) , %su = $gettok(%v,3,22) , %g = $gettok(%v,2,22) | if (%g == -) { %g = $m(501) }
  if (!%l) {
    if ($fline(@xmppls,%g $+ g****,1)) && ($findtok(%jab.min,%g,22)) && (%e == unavailable) goto roster
  }

  if (%v) {
    if (@ !isin $2) goto Lr2
    if (%su == none) goto Lr2
    if (%jab.veo != on) { if (%e == unavailable) goto Lr1 }
    :Lr2
    var %ico = $iif(%e isin available chat,4,5) | if (%e isin away dnd xa) { %ico = 6 } | if $gettok($gettok(%v,3,22),1,32) != both { %ico = 7 }
    if (!$findtok(%jab.min,%g,22)) aline -l @xmppls %g $+ i $+ $gettok(%v,1,22) $iif($gettok(%v,6,22) != -,14( $ifmatch )) $+  $+ $2 $+ - $+ %ico
    if (!$fline(@xmppls,%g $+ g****,1)) { aline -l @xmppls %g $+ g $+ %g  -- $+ $iif($findtok(%jab.min,%g,22),2,1) }
    :Lr1
    %xmpp.gr = $addtok(%xmpp.gr,%g,22)
  }
  .timerLISTA -mo 1 300 listaroster
  return

  :PRESENCE
  var %v = $hget(roster,$2) , %w = @jab> $+ $2
  if $3 == con { 
    var %m = $logo <c3> $gettok(%v,1,22) <c2> $+ $m(535) $+  ( $jabreplace($gettok(%v,5,22)) $iif($gettok(%v,6,22) != -,: $ifmatch) )
    if ($jo(4)) { ecot -st %m | .timerNOTIFY 1 1 raya } | if ($window(%w)) ecot -t %w %m
    if ($jo(6)) .timerJABONLINE -m 1 50 slocal $gettok(%jab.tex,3,22)
    if ($jo(3)) { if ($isalias(cartelito)) $cartelito($gettok(%v,1,22),$m(535)) }
  }
  if $3 == dis { 
    var %m = $logo <c3> $gettok(%v,1,22) <c2> $+ $m(536) $+  ( $jabreplace($gettok(%v,5,22)) $iif($gettok(%v,6,22) != -,: $ifmatch) )
    if ($jo(4)) { ecot -st %m | .timerNOTIFY 1 1 raya } | if ($window(%w)) ecot -t %w %m 
    if ($jo(7)) .timerJABONLINE -m 1 50 slocal $gettok(%jab.tex,4,22)
    if ($jo(3)) { if ($isalias(cartelito)) $cartelito($gettok(%v,1,22),$m(536)) }
  }
  if $3 == aw { 
    var %m = $logo <c2> $gettok(%v,1,22) <c3> $+ $m(537) $jabreplace($gettok(%v,5,22)) $+  $+ $iif($gettok(%v,6,22) != -,: $ifmatch)
    if ($window(%w)) ecot -t %w %m 
  }
  goto rost1c

  :SUBSCRIBED 
  ecot -st $logo <c2> $2 <c3> $+ $mg(jsus1)
  goto roster

  :SUBSCRIBE
  ecot -st $logo <c2> $2 <c3> $+ $mg(jsus2)
  pregunta $2 $mg(jsus2) xmenusubs + $2 xmenusubs - $2
  goto roster

  :UNSUBSCRIBED 
  ecot -st $logo <c2> $2 <c3> $+ $mg(jsus3)
  goto roster

  :UNSUBSCRIBE
  ecot -st $logo <c2> $2 <c3> $+ $mg(jsus4)
  pregunta $2 $mg(jsus4) xmenusubs - $2 xmenusubs
  goto roster

  :MSG
  if ($findtok(%jab.block,$2,1,22)) return
  if (!$hget(roster,$2)) { if ($jo(10)) return }
  if ($gettok($2,1,47) == $gettok(%ujabber,1,32)) { var %a = $xmltag($3-,ping) | if (%a) { if $group(#xmppdebug) == on dbug $logo PING server: $calc(($ticks - %a) / 1000) segundos | return } }
  var %w = @jab> $+ $gettok($2,1,47) , %ni = $gettok($hget(roster,$2),1,22) | if (!%ni) { %ni = $gettok($2,1,47) } | if (!$window(%w)) { jabprivado $gettok($2,1,47) focus | echo -st $tma(query,%ni,$2) | .timerRAYA 1 1 raya | sss priv | if ($jo(3)) { if ($isalias(cartelito)) $cartelito($jabmrc(%ni),query (jabber)) } | if ($appstate != tray)  flash -r9 : $2 priv }
  else { if ($jo(8)) && (%w != $active || (!$appactive)) .timerJABMSG -m 1 50 slocal $gettok(%jab.tex,5,22) }
  if (<error isin $3-) { echo -t %w $logo ERROR: $jabmrc($xmltag($3-,error)) $jabmrc($xmltag($3-,text)) }
  else {
    if (xmlns="jabber:x:delay" isin $3-) { if (!%jab.moff) { echo -t %w == $mg(jmsgof) == } | set -u2 %jab.moff on }

    var %m = $xmltag($3-,body) , %n = $window(%w).titlebar

    if ($xmltag($3-,subject)) { echo -t %w -----> $mg(jmsg) $+ : $ifmatch }

    if ($gettok(%m,1,32) == !PING) && ($gettok(%m,2,32) isnum) && (%jab.estado != inv) { xm <message to=' $+ $2 $+ ' type="chat"><body>!PONG $gettok(%m,2,32) $+ </body></message> | echo -t %w $logo %n PING | return }
    if ($gettok(%m,1,32) == !PONG) && ($gettok(%m,2,32) isnum) { echo -t %w $logo LAG: $calc($ctime - $gettok(%m,2,32)) segundos | return }

    var %ni = %tma.n1 $+ %tma.n3 $+ %n $+ %tma.n4 $+  
    if ($isalias(tma.text)) { $tma.text(-tli $+ %tma.tab,%w,%ni,%ni,$jabmrc(%m)) } | else { echo -tli $+ %tma.tab %w %ni $jabmrc(%m) }
  }
  return

  :CONN
  window -hsl @xmppls | clear @xmppls
  %jab.estado = inv
  jabwin
  .timerJAB1MIN -o 0 60 jab1min | %jab.idle = $ctime $ctime $ctime
  if (%tmp.jab.estado) { var %a = listador %tmp.jab.estado | if (%tmp.jab.estado == av) { %a = 1 } | if (%tmp.jab.estado == inv) { %a = 7 } | .timer -m 1 100 jab.sta %a | unset %tmp.jab.estado | return }
  if (!$jo(1)) { .timer -m 1 100 xm <presence><priority>0</priority></presence> | jab.estado av | if (%sba.jabstpos) { jab.estado2 av | drawline @sba } }
  else { .timer -m 1 100 xm <presence type="invisible"><status></status><priority>3</priority></presence> | jab.estado inv | if (%sba.jabstpos) { jab.estado2 inv | drawline @sba } }
  return

  :DISCON
  echo -st $logo ERROR: $2-
  .timerJAB1MIN off
  sockclose xmpp | if ($hget(roster)) { hfree roster } | window -c @xmppls
  if ($jo(2)) .timerJAB.RECON -o 1 30 JAB.CONn
  set -u60 %tmp.jab.estado %jab.estado
  jabwin
  sss cae
  return

  :CANCELA
  .timerJAB.RECON off
  .timerJAB1MIN off
  sockclose xmpp | if ($hget(roster)) { hfree roster } | window -c @xmppls
  unset %tmp.jab.estado
  jabwin
  return

  :INFO
  xm <iq type="get" to=" $+ $2 $+ " id='GETVCARD'><vCard xmlns="vcard-temp"/></iq>
  return

  :VCARD 
  jabber2 jab.vcard
  return

  :AGENT
  jabber2 jab.disco
  return
  :AGENTINFO
  if ($isalias(jab.agentinfo)) jab.agentinfo
  return

  :JUD
  jabber2 jab.jud
  return

  :IQERROR
  var %a = $bvar(&h,1,900).text , %e = $xmltag(%a,error) | if ($xmltag(%e,text)) { %e = $ifmatch }
  echo -st $logo IQ ERROR: %e | beep 1 1
  return
}

alias -l listaroster   if ($window(@jabber)) { guilista @jabber jabber.ls1 | drawline @jabber } | if (%sba.ls1.jabber) { guilista @sba sba.ls1.jabber | drawline @sba }

alias jabclick {
  if ($gettok($3-,2,8) == g) && ($1 == 2) {
    if ($gettok($3-,6,8) == 1) { %jab.min = $addtok(%jab.min,$gettok($3-,1,8),22) }
    else { %jab.min = $remtok(%jab.min,$gettok($3-,1,8),1,22) }
    xmppui roster
  }
  if ($gettok($3-,2,8) == i) {
    if ($1 == 2) { jabprivado $gettok($3-,4,8) | .timerPRITIP off }
    else {
      var %v = $hget(roster,$gettok($3-,4,8))
      var %t =  $gettok(%v,1,22)  $m(524) $+ : $gettok($3-,4,8)  $m(525) $+ : $jabreplace($gettok(%v,5,22)) $iif($gettok(%v,6,22) != -,( $ifmatch )) $iif($findtok(%jab.block,$gettok($3-,4,8),1,22), $m(530))  $m(526) $+ : $gettok(%v,4,22)  $m(527) $+ : $jabreplace($gettok(%v,3,22))
      .timerPRITIP -m 1 300 tttip $remove(%t,$chr(124),$chr(125))
    }
  }
}


#guimgen.@jabber on
menu @guimgen {
  $m(46): xmenu privado
  -
  $m(511)
  .$m(512): xmenu ok
  .-
  .$m(220): xmenu -
  .-
  .$m(513): xmenu re+
  .-
  .$m(506): xmenu +
  $m(514)
  .$m(515) (log ON): xmenu vis
  .-
  .$m(516) (log OFF): xmenu invis
  $m(517)
  .$m(518): xmenu nick
  .-
  .$m(519)
  .$submenu($eligegrupo($1))
  .-
  .$m(520): xmenu grupo
  $iif($findtok(%jab.block,$gettok($sline(@xmppls,1),4,8),1,22),$m(522),$m(521)): xmenu block
  -
  $m(59): xmenu log
  $m(50): xmenu vcard
}
#guimgen.xmpp end

alias eligegrupo {
  if ($1 == begin) return -
  if ($1 == end) return -
  var %a = $gettok(%xmpp.gr,$1,22)
  if (%a) return %a : xmenu grupo %a
}


menu @jabprivado {
  $m(514)
  .$m(515) (log ON): xmenu vis
  .-
  .$m(516) (log OFF): xmenu invis
  $m(517)
  .$m(518): xmenu nick
  .-
  .$m(519)
  .$submenu($eligegrupo($1))
  .-
  .$m(520): xmenu grupo
  $iif($findtok(%jab.block,$remove($active,@jab>),1,22),$m(522),$m(521)): xmenu block
  -
  $m(523): xm <message to=' $+ $remove($active,@JAB>),32) $+ ' type="chat"><body>!PING $ctime $+ </body></message> | echo -t $logo PING
  -
  $m(59): xmenu log
  $m(50): xmenu vcard
}

menu menubar {
  jabber
  .$lower($m(532))
  ..$gettok(%ujabber,1,32): jab.conn
  .$lower($m(503)):jab.sta 9
  .-
  .$lower($gettok($m(500),1,22)):jab.sta 1
  .$lower($gettok($m(500),3,22)):jab.sta 3
  .$lower($gettok($m(500),6,22)):jab.sta 7
  .-
  .$m(46): jab.opc 5
  .-
  .$m(82): jabgui
  .$m(269):jab.opc 12
}


alias xmenu {
  if (!$sock(xmpp)) return
  var %i = $sline(@xmppls,1) , %de = $gettok(%i,4,8) 
  if (@jab> isin $active) { var %de = $remove($active,@jab>) }
  var %r = $hget(roster,%de)
  if $1 == + { jabber2 jab.auser }
  if $1 == ok { xmenusubs + %de }
  if $1 == - { xmenusubs - %de }
  if $1 == re+ { xm <presence to=" $+ %de $+ " type="subscribe"/> }
  if $1 == nick { var %a = $input(¿ Nuevo nick ?,egdq,?,$gettok(%r,1,22)) | if (%a) { $xmpp(nick,%de,%a,*) | xmppui rost1c %de } | if ($window(@jab> $+ %de)) titlebar @jab> $+ %de %a }
  if $1 == grupo { if $2- == $m(501) { $xmpp(nick,%de,*,-) } | else $xmpp(nick,%de,*,$iif($2-,$2-,$?=" $m(519) ")) | xmppui rost1c %de }
  if $1 == privado jabprivado %de P
  if $1 == vcard xmppui info %de
  if $1 == vis xm <presence to=" $+ %de $+ "/>
  if $1 == invis xm <presence to=" $+ %de $+ " type="unavailable"/>
  if $1 == block {
    if ($findtok(%jab.block,%de,1,22)) { %jab.block = $remtok(%jab.block,%de,1,22) | var %a = $logo %de $m(533) }
    else { %jab.block = $addtok(%jab.block,%de,22) | var %a = $logo %de $m(530) }
    echo -st %a | if ($window(@jab> $+ %de)) echo -t $ifmatch %a
    wrini %perfil jabber blk $replace(%jab.block,,)
  }
  if $1 == log vlog @jab> $+ %de
}
alias xmenusubs {
  if $1 == + { xmppui rost1c $2 | if (@ !isin $2) $xmpp(nick,$2,*,$m(502)) | xmpp subscribed $2 }
  if $1 == - { 
    xmpp unsubscribed $2 | xmppui rost1c $2
    if (@ !isin $2) { set -u60 %tmp.remagent on | xmpp regagent $2 }
  }
}


alias jabber2 .load -rs mod/jabber/jabber2.mrc | $1-

alias JABPRIVADO {
  var %m = $readini mirc.ini windows wquery
  var %w = @jab> $+ $1
  window -kein %w $calc($gettok(%m,1,44) + $rand(1,100)) $calc($gettok(%m,3,44) + $rand(1,100)) $gettok(%m,2,44) $gettok(%m,4,44) @jabprivado
  if $2 == focus focus %w $cid | else window -a %w 
  var %n = $hget(roster,$1) | titlebar %w $iif(($gettok(%n,1,22)),$ifmatch,$gettok($1,1,64))

  if (%priv.bu == on) { var %a = " $+ $logdir $+ $mkfn(%w) $+ .log" | if ($exists(%a)) { loadbuf 20 -pc14 %w " $+ $logdir $+ $mkfn(%w) $+ .log" | echo %w  } }

  aline %w $_tm(<c4>---------(<c2> $fulldate <c4>) $+ $str(-,50))
  ecot %w <c2> $+ $m(534) $+ : $gettok(%n,1,22) ( $+ $1 $+ )
  ecot %w <c2> $+ $m(525) $+ : $jabreplace($gettok(%n,5,22)) $iif($gettok(%n,6,22) != -,( $ifmatch ))
  if ($findtok(%jab.block,$1,1,22)) ecot %w $logo $1 <c2> $+ $m(530)
  if (%jab.estado == inv) ecot %w $logo $mg(jinv)
  if ($jo(5)) .log on %w
  aline %w $_tm(<c4> $+ $str(-,95))
}

on 1:input:@JAB>*: {
  var %yo = %tma.m1 $+ %tma.m3 $+ $gettok(%ujabber,1,64) $+ %tma.n4 $+ 
  if ($isalias(tma.say)) { $tma.say(%tma.tab,$active,%yo,$strip($1-)) }
  else { echo $color(own) -tli $+ %tma.tab $active %yo $strip($1-) }
  xm <message to=' $+ $gettok($active,2,62) $+ ' type='chat'><body> $+ $mrcjab($strip($1-)) $+ </body></message>
  %jab.idle = $puttok(%jab.idle,$ctime,1,32) | if (%jab.estado == away $gettok(%jab.tex,2,22)) { .timerSAW -m 1 100 jab.sta 1 | %jab.idle = $puttok(%jab.idle,$ctime,3,32) }
  halt
}
on 1:close:@jab>*: if ($jo(5)) .remini mirc.ini logging $active


alias -l JAB1MIN {
  var %a = $gettok(%jab.idle,1,32) , %b = $gettok(%jab.idle,2,32)
  if ($jo(9)) {
    if ($calc($ctime - %a) >= $calc($gettok(%jab.tex,1,22) * 60)) { 
      if ($gettok(%jab.estado,1,32) isin av chat) { .timer -m 1 100 jab.sta listador away $gettok(%jab.tex,2,22) | %jab.idle = $puttok(%jab.idle,auto,3,32) }
    }
  }
  if ($calc($ctime - %b) >= 300) { %jab.idle = $puttok(%jab.idle,$ctime,2,32) | xm <message to=' $+ $gettok(%ujabber,1,32) $+ ' type="chat"><body/><ping> $+ $ticks $+ </ping></message> }
}

alias -l JO if ($gettok(%jab.o,$1,44) == on) return $true | else return $false

alias -l jabreplace {
  var %t = $1- , %a = $m(500) $+  $+ $m(531) | tokenize 22 %a
  return $replacex(%t,available,$1,chat,$2,away,$3,xa,$4,dnd,$5,inv,$6,unavailable,$7,both,$8,none,$9,to,$10,from,$11)
}

on 1:SiGNAL:skin: if ($window(@jabber)) jabgui
on 1:START: if $gettok(%jab.o,11,44) == on { jabgui | if ($window(@conn)) window -a @conn } | if 2) isin %jab.conex jab.conn
on 1:CONNECT: if 3) isin %jab.conex && (!$sock(xmpp)) jab.conn
on 1:LOAD: {
  %jab.o = $readini(%perfil,jabber,op) | if ($numtok(%jab.o,44) != 11) { %jab.o = off,off,on,on,off,on,off,off,off,off,on }
  %jab.tex = $replace($readini(%perfil,jabber,txt),,) | if ($numtok(%jab.tex,22) != 5) { %jab.tex = 5auto-awaymod\Jabber\online.wav** }
  %jab.conex = 1) Manual
  %jab.block = $readini(%perfil,jabber,blk)
  %ujabber = $readini(%perfil,jabber,id) | if ($numtok(%ujabber,32) == 2) { %ujabber = %ujabber 5222 IRcap }
}

alias jab.descarga {
  sockclose xmpp
  unset %jab.* %xmpp.* %ujabber %jabber.* %vcard.*
  .timerJAB* off
  .hfree -w roster
  .hfree -w jabber2
  sbarset - jabber
  jabgui | guicierra @jabber | window -c @vcard | window -c @jabauser  | window -c @jabdisco | window -c @jabjud
  window -c @xmppls | window -c @jab.debug | window -c @jabjudls1 | window -c @jabdiscols1
  if ($script(jabber2.mrc)) .unload -rs jabber2.mrc | unload -rs jabber.mrc
}

;EOF