This is the new home of the egghelp.org community forum.
All data has been migrated (including user logins/passwords) to a new phpBB version.


For more information, see this announcement post. Click the X in the top right-corner of this box to dismiss this message.

Latest Urban Dictionary tcl

Support & discussion of released scripts, and announcements of new releases.
User avatar
Trixar_za
Op
Posts: 143
Joined: Wed Nov 18, 2009 1:44 pm
Location: South Africa
Contact:

Post by Trixar_za »

Change:

Code: Select all

set matches [regexp -all -inline {<td class='text' colspan='3' id='.*?'>(.*?)</td} $data];
to

Code: Select all

set matches [regexp -all -inline {<td class='text' colspan='.' id='.*?'>(.*?)</td} $data];
For those that are interested, I modified this script to be more like mine and made a zip archive of it with fsck.tcl and http.tcl included for easy use. You can download it here.
g
goalie204
Halfop
Posts: 44
Joined: Thu Apr 28, 2011 7:31 pm

Post by goalie204 »

thx for the fix,

what is yours like that it is more like yours?
User avatar
Trixar_za
Op
Posts: 143
Joined: Wed Nov 18, 2009 1:44 pm
Location: South Africa
Contact:

Post by Trixar_za »

Default:
[~Trixar_za] -ud test
[@GameBot] [1/8] A process for testing things (This is a test message)

My way:
[~Trixar_za] !ud test
[@GameBot] Definition [1/8]: A process for testing things
[@GameBot] Example [1/8]: This is a test message

Just feels nicer this way.
g
goalie204
Halfop
Posts: 44
Joined: Thu Apr 28, 2011 7:31 pm

Post by goalie204 »

Ya, that would be nice, but for long definitions it's going to be too spammy :(
User avatar
Trixar_za
Op
Posts: 143
Joined: Wed Nov 18, 2009 1:44 pm
Location: South Africa
Contact:

Post by Trixar_za »

goalie204 wrote:Ya, that would be nice, but for long definitions it's going to be too spammy :(
Not really. It still follows the max lines limit that you set so if it's set to 2, then only two lines for the definition and two lines for the example is allowed (making up four lines in total). The default value is 3 lines, so that means a max of six lines for both. Set it to 1 if you only want it to take up a max of 2 lines.
User avatar
Trixar_za
Op
Posts: 143
Joined: Wed Nov 18, 2009 1:44 pm
Location: South Africa
Contact:

Post by Trixar_za »

Update: http://www.trixarian.net/downloads/urband.zip

Changes:
* The maximum amount of lines for definitions and examples can now be set individually.
* The bug that made it not show definitions without examples has been fixed.
* The included http.tcl has been updated.

Enjoy! ;)
User avatar
spithash
Master
Posts: 248
Joined: Thu Jul 12, 2007 9:21 am
Location: Libera
Contact:

Post by spithash »

awesome :-)
Libera ##rtlsdr & ##re - Nick: spithash
Click here for troll.tcl
User avatar
spithash
Master
Posts: 248
Joined: Thu Jul 12, 2007 9:21 am
Location: Libera
Contact:

Post by spithash »

I think that the script needs update again :roll:
Libera ##rtlsdr & ##re - Nick: spithash
Click here for troll.tcl
s
sputnik
Voice
Posts: 20
Joined: Wed Feb 23, 2011 1:16 pm

Post by sputnik »

Replacing

Code: Select all

set matches [regexp -all -inline {<td class='text' colspan='.' id='.*?'>(.*?)</td} $data];
with

Code: Select all

set matches [regexp -all -inline {<div class='text' colspan='.' id='.*?'>(.*?)</div>\n} $data];
should do the trick.
s
sputnik
Voice
Posts: 20
Joined: Wed Feb 23, 2011 1:16 pm

Post by sputnik »

Ok, this should work a little bit better:

Code: Select all

set matches [regexp -all -inline {<div class='text' colspan='.' id='.*?'>(.*?)</div>\n<div class='zazzle_links'>} $data];
but it's still dirty one. It's gonna stop working as soon as urban dictionary changes their html again.
s
slaapliedje
Voice
Posts: 5
Joined: Mon Jul 30, 2012 2:08 pm

Post by slaapliedje »

I made the changes to the new version of the urband.tcl file as posted here yesterday, but unfortunately, (after unzipping the latest version a few posts back) the script no longer works at all.

I'm getting this error;

[07:11:23] Tcl error [::urbandict::pub]: can't read "define": no such variable

Any ideas?
s
sputnik
Voice
Posts: 20
Joined: Wed Feb 23, 2011 1:16 pm

Post by sputnik »

The thing is i don't really remember which version of the script i have. The above solution only works with the version i have. So here's the script:

Code: Select all

# Urban Dictionary
# Copyright (C) 2006-2008 perpleXa
# http://perplexa.ugug.org / #perpleXa on QuakeNet
#
# Redistribution, with or without modification, are permitted provided
# that redistributions retain the above copyright notice, this condition
# and the following disclaimer.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
#
# Usage:
#  -ud [id] <term>

# fsck is available at http://perplexa.ugug.co.uk
package require fsck 1.10;
package require http;

namespace eval urbandict {
  variable version 1.13;

  # flood protection (seconds)
  variable antiflood 10;
 
  # maximum number of lines to output
  variable max_lines 3;

  variable encoding "utf-8";
  variable client "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080420 Firefox/2.0.0.14";
  bind pub -|- "!ud" [namespace current]::pub;
  bind pub -|- ".ud" [namespace current]::pub;
  bind pub -|- "!urban" [namespace current]::pub;
  bind pub -|- ".urban" [namespace current]::pub
  namespace export pub;
}

proc urbandict::getdefinition {definition} {
  variable client;
  http::config -useragent $client;
  set url "http://www.urbandictionary.com/define.php?term=[urlencode $definition]";
  if {[catch {http::geturl $url -timeout 20000} token]} {
    return [list 0 "Warning: Couldn't connect to \[$url\]"];
  }
  upvar 0 $token state;
  if {![string equal -nocase $state(status) "ok"]} {
    return [list 0 "Warning: Couldn't connect to \[$url\] (connection $state(status))."];
  }
  set data [http::data $token];
  http::cleanup $token;
  set matches [regexp -all -inline {<div class='text' colspan='.' id='.*?'>(.*?)</div>\n<div class='zazzle_links'>} $data];
  set list [list];
  foreach {null match} $matches {
    set definition "n/a"
    #regexp -nocase -- {<p>(.*?)</p>} $match -> definition
    regexp -nocase -- {<div class="definition">(.*?)</div>} $match -> definition
    regsub -all {[\r\n\s\t]+} $definition " " definition
    regsub -all {<[^>]*?>} [string trim [decode $definition]] "" definition;
    set example ""
    #regexp -nocase -- {<p style="font-style: italic">(.*?)</p>} $match -> example
    regexp -nocase -- {<div class="example">(.*?)</div>} $match -> example
    regsub -all {[\r\n\s\t]+} [string trim $example] " " example
    regsub -all {<[^>]*?>} [string trim [decode $example]] "" example;
    lappend list "$definition[expr {$example == "" ? "" : " ($example)"}]";
  }
  return [concat [llength $list] $list];
}

proc urbandict::urlencode {i} {
  variable encoding
  set index 0;
  set i [encoding convertto $encoding $i]
  set length [string length $i]
  set n ""
  while {$index < $length} {
    set activechar [string index $i $index]
    incr index 1
    if {![regexp {^[a-zA-Z0-9]$} $activechar]} {
      append n %[format "%02X" [scan $activechar %c]]
    } else {
      append n $activechar
    }
  }
  return $n
}

proc urbandict::pub {nick host hand chan argv} {
  variable flood; variable antiflood; variable max_lines;
  if {![info exists flood($chan)]} { set flood($chan) 0; }
  if {![string compare $argv ""]} {
    puthelp "NOTICE $nick :Usage: !ud \[id\] <definition>";
    return 1;
  }
  if {[string is digit -strict [getword $argv 0]]} {
    if {[splitline $argv cargv 2]!=2} {
      puthelp "NOTICE $nick :Usage: !ud \[id\] <definition>";
      return 1;
    }
    set id [lindex $cargv 0];
    set argv [lindex $cargv 1];
    if {!$id} {
      set id 1;
    }
  } else {
    set id 1;
  }

  if {[unixtime] - $flood($chan) <= $antiflood} { return 0; }
  set flood($chan) [unixtime];

  set definitions [getdefinition $argv];
  set count [lindex $definitions 0];
  if {!$count} {
    puthelp "PRIVMSG $chan :Nothing found for \"$argv\".";
    return 1;
  } elseif {$id > $count} {
    puthelp "PRIVMSG $chan :Only $count results found for \"$argv\".";
    return 1;
  }
  set definition [lindex $definitions $id];
  if {[string length $definition] <= 400} {
    puthelp "PRIVMSG $chan :\[\002$id/$count\002\] $definition";
    return 0;
  }
  set skip 0;
  set definition [splitmsg $definition];
  set required_lines [llength $definition];
  foreach line $definition {
    puthelp "PRIVMSG $chan :\[\002$id/$count\002\] $line";
    if {[incr skip] == $max_lines && $required_lines != $max_lines} {
      puthelp "PRIVMSG $chan :\[\002$id/$count\002\] Truncated output to 3 of $required_lines lines.";
      break;
    }
  }
  return 0;
}

proc urbandict::decode {content} {
  if {![string match *&* $content]} {
    return $content;
  }
  set escapes {
      \x20 " \x22 & \x26 &apos; \x27 – \x2D
    < \x3C > \x3E ˜ \x7E € \x80 ¡ \xA1
    ¢ \xA2 £ \xA3 ¤ \xA4 ¥ \xA5 ¦ \xA6
    § \xA7 ¨ \xA8 © \xA9 ª \xAA « \xAB
    ¬ \xAC ­ \xAD ® \xAE &hibar; \xAF ° \xB0
    ± \xB1 ² \xB2 ³ \xB3 ´ \xB4 µ \xB5
    ¶ \xB6 · \xB7 ¸ \xB8 ¹ \xB9 º \xBA
    » \xBB ¼ \xBC ½ \xBD ¾ \xBE ¿ \xBF
    À \xC0 Á \xC1 Â \xC2 Ã \xC3 Ä \xC4
    Å \xC5 Æ \xC6 Ç \xC7 È \xC8 É \xC9
    Ê \xCA Ë \xCB Ì \xCC Í \xCD Î \xCE
    Ï \xCF Ð \xD0 Ñ \xD1 Ò \xD2 Ó \xD3
    Ô \xD4 Õ \xD5 Ö \xD6 × \xD7 Ø \xD8
    Ù \xD9 Ú \xDA Û \xDB Ü \xDC Ý \xDD
    Þ \xDE ß \xDF à \xE0 á \xE1 â \xE2
    ã \xE3 ä \xE4 å \xE5 æ \xE6 ç \xE7
    è \xE8 é \xE9 ê \xEA ë \xEB ì \xEC
    í \xED î \xEE ï \xEF ð \xF0 ñ \xF1
    ò \xF2 ó \xF3 ô \xF4 õ \xF5 ö \xF6
    ÷ \xF7 ø \xF8 ù \xF9 ú \xFA û \xFB
    ü \xFC ý \xFD þ \xFE ÿ \xFF
  };
  set content [string map $escapes $content];
  set content [string map [list "\]" "\\\]" "\[" "\\\[" "\$" "\\\$" "\\" "\\\\"] $content];
  regsub -all -- {&#([[:digit:]]{1,5});} $content {[format %c [string trimleft "\1" "0"]]} content;
  regsub -all -- {&#x([[:xdigit:]]{1,4});} $content {[format %c [scan "\1" %x]]} content;
  regsub -all -- {&#?[[:alnum:]]{2,7};} $content "?" content;
  return [subst $content];
} 

putlog "Script loaded: Urban Dictionary v$urbandict::version by perpleXa";
s
slaapliedje
Voice
Posts: 5
Joined: Mon Jul 30, 2012 2:08 pm

Post by slaapliedje »

Sweet, thanks! That version works! At least until next time.
n
neocharles
Voice
Posts: 34
Joined: Tue Apr 23, 2013 4:29 pm

Post by neocharles »

Is there a version that doesn't use fsck?

I noticed when I have fsck loading (well, I had to take out the package require fsck 1.10; line from the ud.tcl file to get ud to load, but I noticed that it had an error when I rehashed:

fatal error(fsck): Couldn't load scripts/steiner-youtube.tcl [can't find package json]

Without fsck, it loads fine..
User avatar
Trixar_za
Op
Posts: 143
Joined: Wed Nov 18, 2009 1:44 pm
Location: South Africa
Contact:

Post by Trixar_za »

Replace

Code: Select all

set matches [regexp -all -inline {<td class='text' colspan='.' id='.*?'>(.*?)</td} $data];
with

Code: Select all

  if {[regexp -all -inline {<td class='text' colspan='.' id='.*?'>(.*?)</td} $data] != ""} {
    set matches [regexp -all -inline {<td class='text' colspan='.' id='.*?'>(.*?)</td} $data];
  } elseif {[regexp -all -inline {<div class='text' colspan='.' id='entry.*?'>(.*?)<a class} $data] != ""} {
    set matches [regexp -all -inline {<div class='text' colspan='.' id='entry.*?'>(.*?)<a class} $data];
  } else {
    set matches "";
  }
This should make it a bit more future proof and it's already updated @ http://www.trixarian.net/downloads/urband.zip

I try to keep the regexes as generic as possible because zazzle_links and it's like may change in the future. The initial one actually broke examples, which is why my version freaked out

neocharles: Try my urban.tcl @ http://www.trixarian.net/Projects/
Last edited by Trixar_za on Wed Oct 09, 2013 4:26 pm, edited 1 time in total.
Post Reply