1

When ever the mirc radio bot announces the song playing and the ammount of listeners a stray html and body tag show up as seen below.

mirc chat screenshot

The code for the radio bot is as follows

#announcer on

ctcp *:*:*:{
  if ($1 == SRstats) {
    set %sctat.chan $chan
    sockclose scstat
    sockopen scstat 149.202.90.221 8132
  }
}
on *:SOCKOPEN:scstat:{
  sockwrite -n $sockname GET /7.html HTTP/1.0
  sockwrite -n $sockname User-Agent: Mozilla
  sockwrite -n $sockname $crlf
}
on *:sockread:scstat:{
  if ($sockerr > 0) return
  :nextread
  sockread -f %scasttemp
  if ($sockbr == 0) return
  if (%scasttemp == $null) %scasttemp = empty
  set %scasttemp $remove(%scasttemp,<html><head><meta http-equiv="Pragma" content="no-cache"></head><body>,</body></html>)
  if ((HTTP/1.* !iswm %scasttemp) && (content-type* !iswm %scasttemp) && (%scasttemp != empty)) {
    set %scstat.song.temp $gettok(%scasttemp,7-,44)
    set %scstat.bitrate $gettok(%scasttemp,6,44)
    set %scstat.listeners $gettok(%scasttemp,1,44)
    set %scstat.maxlist $gettok(%scasttemp,4,44)
    set %scstat.peak $gettok(%scasttemp,3,44)
    if ($gettok(%scasttemp,2,44) == 1) set %scstat.livedj connected
    else set %scstat.livedj not connected
    ; changing some of the html codes back to regular characters
    set %scast.song $replace(%scast.song,&,$chr(38),',$chr(39))
  }
  goto nextread
}
on *:sockclose:scstat:{
  if (( %scstat.song.temp == %scstat.song ) || ( %scstat.song.temp == Line Recording )) { goto scstat.end }
  else {
    set %scstat.song %scstat.song.temp 
    set %song.msg  6,0 $+ %dj_nick is playing  6 : 12 %scstat.song $+ .   0,1 Tune into Radio-Airwaves, type !radiohelp/4 %scstat.listeners $+ --listeners are tuned in.
    ; set %chans $chan(0)
    ;    while %chans {
    /scid -a msg #Radio-Airwaves-Lounge %song.msg  
    ; dec %chans 
    ;   }
    :scstat.end  
  }
}
on *:TEXT:!playing:#: msg $chan %song.msg
#announcer end

I thought the first fix should be changing the , between the body tags to html number code but that just displayed the number code and not the actually comma. I also maybe there were mismatched tags/stray tags so I check for that. I didn't find any. I've yet to see the cause of the stray tags appearing when the accouner is on. Any help would be greatly appericated.

Nalani
  • 387
  • 3
  • 13

1 Answers1

1

The line your trying to extract the information from, <html><body> at the start and end of the retrieved text.

You can solve this by setting %scasttemp using several techniques.

  1. Strip the Html tags using $nohtml a like script. - Recomended
  2. Staticly Substring from $right(%text, -12)
  3. Dynamically find the first occurrence after body**>** and substring the rest of the text.
  4. Use Regular Expressions
  5. And many more..

$nohtml

alias nohtml { var %x,%y = $regsub($1-,/(<[^>]+>)/g,$null,%x) | return %x }

Additionally, when handling sockread i would use Tokenize to handle $1.. identifier instead of tokens.

if (!$sockbr || !%scasttemp) {
    return
}

tokenize 32 $nohtml(%scasttemp)

;;; Comment out the below line if you still want to use the old variable, otherwise you should change the rest of the code.
;;;set %scasttemp $1- 

;;; Identify the data we wish to extract the information, else return.
if ($numtok($1-, 44) < 7) {
    return
}

;;; Rest of the code here..

Sending to server header request suggesting to close the connection after the information received is a good practice.

sockwrite -n $sockname Connection: close

Also adding the sockclose after all information received is a good convention instead of letting the sockets to hang around. (If Connection: close was not requested)

goto nextread
sockclose $sockname
Orel Eraki
  • 11,940
  • 3
  • 28
  • 36