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
piggy
Voice
Posts: 14
Joined: Sun Aug 21, 2005 11:51 am
Location: London

Latest Urban Dictionary tcl

Post by piggy »

If anyone can help me out with this it would be most appreciated.
Alternatively if i should be contacting the author directly for this please let me know.

1) Is it possible to make it that the script below can be set for specific channels, eg: .chanset #channel +urbandictionary or any otherway of specifying what channels it should respond in?

2) Is there something that can be added that it prevents two users from issueing the same command within say 3 minutes.
eg:
<nick1> -ud irc
<nick2> -ud irc

Because as it is now when <nick1> issues "-ud irc" the bot displays the result and if <nick2> where to issue the same "-ud irc" 5 seconds later the bot would then display the result again.

Code: Select all

# Urban Dictionary
# Copyright (C) 2006 perpleXa
# http://perplexa.ugug.co.uk / #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.7;
  variable encoding "utf-8";
  variable client "Mozilla/5.0 (compatible; Y!J; for robot study; keyoshid)";
  bind pub -|- "-ud" [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=\"def_p\">.*?<p>(.*?)<\/p>} $data];
  set list [list];
  foreach {null definition} $matches {
    regsub -all {<[^>]*?>} [decode $definition] "" definition;
    regsub -all {[\r\n\s\t]+} $definition " " definition;
    lappend list $definition;
  }
  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} {
  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;
  }
  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 :\[$id/$count\] $definition";
    return 0;
  }
  foreach line [splitmsg $definition] {
    puthelp "PRIVMSG $chan :\[$id/$count\] $line";
  }
  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";
User avatar
rosc2112
Revered One
Posts: 1454
Joined: Sun Feb 19, 2006 8:36 pm
Location: Northeast Pennsylvania

Post by rosc2112 »

Yep. That's a mod I did to this script myself, too:

Code: Select all

Near the top add:

set udchans "#mychan #chan2 #etc"

Then at the top of "proc urbandict::pub" add:

if {[lsearch -exact $::udchans $chan] == -1} {return}
That's it! Nice script by the way, thank you perplexa! :)

Opps I missed the 2nd part of your question. I did not add a timer, I changed the responses from $chan to $nick, since the responses can be really long and I don't need it spamming the channel. Someone else might be able to post a timer for you tho.
User avatar
piggy
Voice
Posts: 14
Joined: Sun Aug 21, 2005 11:51 am
Location: London

Post by piggy »

rosc2112

Thanks for the help on that one, your solution works perfectly :D
I did not add a timer, I changed the responses from $chan to $nick,
I will keep that in mind if i allow -ud to be used in other channels, but for now i have one channel specificly for urban dictionary requests.

Thanks again.
User avatar
piggy
Voice
Posts: 14
Joined: Sun Aug 21, 2005 11:51 am
Location: London

Post by piggy »

rosc2112:

You wouldnt perhaps know what i can add to the code of this tcl to make it that a user can /msg <botnick> -ud <search string> and the bot will then display the result in private to that user that msg'd the bot?

Thanks
User avatar
rosc2112
Revered One
Posts: 1454
Joined: Sun Feb 19, 2006 8:36 pm
Location: Northeast Pennsylvania

Post by rosc2112 »

Add this somewhere above where the proc's begin:

Code: Select all

bind msg - !ud udmsg
proc udmsg {nick uhost hand text} {
        urbandict::pub $nick $uhost $hand privmsg $text
}


And in proc urbandict::pub

Change:

        if {[lsearch -exact $::udchans $chan] == -1} {return}

to:

        if {([lsearch -exact $::udchans $chan] == -1) && ($chan != "privmsg")} {return}  

And add:

        if {$chan == "privmsg"} {set chan $nick}
Should do the trick.
User avatar
piggy
Voice
Posts: 14
Joined: Sun Aug 21, 2005 11:51 am
Location: London

Post by piggy »

rosc2112: You right, that does do the trick.

Thanks alot for your help :)
t
teeone
Voice
Posts: 2
Joined: Sat Jun 30, 2007 12:30 am

fsck package

Post by teeone »

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

does anybody have this package available to download? That website has been dead for the last few weeks now :(

thx
User avatar
speechles
Revered One
Posts: 1398
Joined: Sat Aug 26, 2006 10:19 pm
Location: emerald triangle, california (coastal redwoods)

Re: fsck package

Post by speechles »

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

does anybody have this package available to download? That website has been dead for the last few weeks now :(

thx
Here is perplexa's package:
* fsck package 1.14+

Here is the latest urban dictionary script:
* urbandict.tcl [v1.8]
t
teeone
Voice
Posts: 2
Joined: Sat Jun 30, 2007 12:30 am

Post by teeone »

Thank you thank you thank you! UD is hilarious ;)
d
doubleu
Voice
Posts: 11
Joined: Sun Feb 10, 2008 11:19 pm

Post by doubleu »

is anyone else having problems with this script now?
User avatar
speechles
Revered One
Posts: 1398
Joined: Sat Aug 26, 2006 10:19 pm
Location: emerald triangle, california (coastal redwoods)

Post by speechles »

replace:

Code: Select all

set matches [regexp -all -inline {<div class=\"def_p\">.*?<p>(.*?)<\/p>} $data];
with:

Code: Select all

set matches [regexp -all -inline {<div class='definition'>(.*?)</div} $data];
s
shadrach
Halfop
Posts: 74
Joined: Fri Dec 14, 2007 6:29 pm

Post by shadrach »

Appears not to be working again.
User avatar
speechles
Revered One
Posts: 1398
Joined: Sat Aug 26, 2006 10:19 pm
Location: emerald triangle, california (coastal redwoods)

Post by speechles »

http://forum.egghelp.org/viewtopic.php?t=15715

issues like this should really go thru the ears of the original author first...
contact info for perplexa can be found at the above link.
s
shadrach
Halfop
Posts: 74
Joined: Fri Dec 14, 2007 6:29 pm

Post by shadrach »

It's come back to life.
d
doubleu
Voice
Posts: 11
Joined: Sun Feb 10, 2008 11:19 pm

Post by doubleu »

and dead again!
Last edited by doubleu on Wed May 21, 2008 3:18 pm, edited 1 time in total.
Post Reply