mirc

MSL Socket Script displaying html and body tag


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.


Solution

  • 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