; Name : Leo GER<->ENG translator script ; Ver. : v1.10 (Last edited 04.08.2006) ; Coder: Jay2k1 (Jay2k1 @ #scripting @ QuakeNet) ; mIRC : v6.17 or above ; ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; Desc.: This is a translator script for german and english which works ; bidirectional, e.g. you can do !leo to get the ; german translation and vice versa. I'ts based on the well-known ; website 'http://dict.leo.org'. ; ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; Syntax with default settings: ; ; !leo ; ; Examples: ; ; !leo to sneeze ; !leo Kuh ; ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; Settings: ; ; - public trigger (default: !leo) ; alias -l leo.trigger { return !leo } ; ; ; - target (put either notice, channel or query there) ; alias -l leo.target { return notice } ; ; ; - number of max. results in output (default: 7) ; alias -l leo.results { return 7 } ; ; ; - linking (put on or off) adds the URL to the results ; page to the output ; alias -l leo.linking { return on } ; ; ; - Channels to exclude (separate by comma) ; alias -l leo.exclude { return #help,#help.script,#scripting } ; ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; Special thanks to the guys in #scripting and #help.script ; on QuakeNet who did their part to make this script work. ; ; ; Don't edit anything below here unless you know what you're ; doing or you might screw the script up. ; ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; I added this to replace occuring HTML codes with their ascii ; pendants, the first is the ® (registered trademark) sign. alias -l htmlreplace { return $replace(%leo.results,®,$chr(174)) } ; Let's tell people who do not specify a search term some information. on *:TEXT:$($leo.trigger):#:{ if $istok($leo.exclude,$chan,44) { return } .notice $nick [Leo] German <-> English translator script, based on http://dict.leo.org/. Syntax: $leo.trigger  } ; The actual on text event to start the script on *:TEXT:$($leo.trigger *):#:{ if $istok($leo.exclude,$chan,44) { return } set %leo.chan $chan set %leo.nick $nick leo $2- } alias -l leo { ; For the URL format, we replace spaces with plus (+) signs. set %leo.term $replace($1-,$chr(32),+) ; If, for some reason, the leo socket is still open, close it, ; and delete an existing temp file. if $sock(leo) { sockclose leo } if $exists(leo.tmp) { .remove leo.tmp } ; Let's connect. .sockopen leo dict.leo.org 80 .sockmark leo %leo.term } on *:sockopen:leo:{ sockwrite -n $sockname GET /ende?lp=ende&lang=en&relink=off&search= $+ $sock($sockname).mark HTTP/1.1 sockwrite -n $sockname Host: dict.leo.org sockwrite -n $sockname $crlf sockmark leo } on *:sockread:leo: { sockread -f &temp ; Skip headers if (!$sock($sockname).mark && $bfind(&temp,1,$crlf $+ $crlf)) { var %i = $calc($bfind(&temp,1,Content-Length:) + 15), %ii = $bfind(&temp,%i,$crlf) - %i sockmark $sockname $calc($v1 + 3 + $bvar(&temp,%i,%ii).text) } ; add results to the temp file .bwrite leo.tmp -1 &temp if ($file(leo.tmp).size >= $sock($sockname).mark) { leo.process } } alias -l leo.process { ; Now, we have to process the HTML-coded results to a ; suitable output format. ; Load the results into a binvar bread leo.tmp 0 $file(leo.tmp).size &html ; Check for zero entries if $bfind(&html,0,The dictionary does not contain any entries for) { set %leo.results Sorry, no entry found for " $+ %leo.term $+ " } else { ; Specify the position of the results in the binvar var %start = $bfind(&html,$bfind(&html,0,search results),   ) + 18 var %end = $bfind(&html,%start,) ; Get rid of the unnecessary code in the binvar bcopy -c &html 1 &html %start $calc(%end - %start) var %pos = 1, %nr = 1 ; Using a while loop without an ending condition ; because we want to decide when it should end while (1) { ; get english term var %i = $bfind(&html,%pos,) - %i var %english = $regsubex($bvar(&html,%i,%m).text,/<[^>]+>/g,$null) if %english isnum { break } ; get german term var %i = $bfind(&html,$calc(%i +3),) - %i var %german = $regsubex($bvar(&html,%i,%m).text,/<[^>]+>/g,$null) if   !isin %english &&   !isin %german { ; "add" the result to one variable if %nr <= $leo.results { set %leo.results $iif(%leo.results,%leo.results $+($chr(47),$chr(47)),) %nr $+ . %english - %german } inc %nr elseif %nr <= $leo.results { set %leo.results %leo.results $chr(47) $+ $chr(47) %nr $+ . %english - %german inc %nr } } ; jump to next row of the HTML table var %pos = %i + %m if !$bfind(&html,%pos,