|
Joined: Jan 2011
Posts: 34
Ameglian cow
|
OP
Ameglian cow
Joined: Jan 2011
Posts: 34 |
on *:TEXT:i like*:#mychannel:{ if (%flood) { return } set -u5 %flood On if ((myreallifename isin $1-) || ($me isin $1-)) msg $chan (message1) $nick $+ . elseif $read(text.txt) isin $1-) msg $chan (message2) $nick $+ . else msg $chan $1- also } This is what i have, and it works as i intended... but not always. For example: someone says "i like stuff" it will skip the first if and elseif statement as normal and do the else statement. If someone says "i like ($me)" it will do the if statement as normal. But if someone says "i like (word thats in file text.txt)" sometimes the elseif statement will activate, but the majority of the time it just goes straight to the else statement. I've been messing with this script for several hours trying to figure out why it's not working 100% of the time like i want, and i can't figure it out. Theres no other scripts running so they aren't conflicting.
|
|
|
|
Joined: Jan 2003
Posts: 64
Babel fish
|
Babel fish
Joined: Jan 2003
Posts: 64 |
mm.. I'm looking at the elseif. What is the ELSEIF statement supposed to do? To me, it says you're reading a line from text.txt and then checking that line against $1-.
|
|
|
|
Joined: Jan 2011
Posts: 34
Ameglian cow
|
OP
Ameglian cow
Joined: Jan 2011
Posts: 34 |
right and if that word or phrase is in $1- then it says (message2) but it only works 5% of the time it seems. Im guesstimating when i say 5%.
|
|
|
|
Joined: Jan 2003
Posts: 64
Babel fish
|
Babel fish
Joined: Jan 2003
Posts: 64 |
Your current code will only check one line from the file against $1-... is that what you want?
|
|
|
|
Joined: Jun 2007
Posts: 933
Hoopy frood
|
Hoopy frood
Joined: Jun 2007
Posts: 933 |
$read(text.txt) returns a RANDOM line from the text file. If the text file contains single words, then you want: $read(text.txt,w,$$3) ($3 is the word after "i like" and $$ means $3 must be present) If you want to match everything after "i like" then you probably want $read(text.txt,w,$+(*,$1-,*)) or $read(text.txt,w,$+(*,$$3-,*)) depending on if you have included "i like" in your txt file or not.
See /help $read for clarification.
|
|
|
|
Joined: Jan 2011
Posts: 34
Ameglian cow
|
OP
Ameglian cow
Joined: Jan 2011
Posts: 34 |
Ok i changed $read(text.txt) to $read(text.txt,w,$$3) and it works without fail but now it wont work if someone says the word in a plural form. For example: someone says "i like dogs" and the word "dog" is in my text.txt file, it doesnt work but if they say "i like dog" it works. How can i fix that?
Edit: basically i need it so that if the text.txt word is anywhere in the "i like" sentence i need the elseif line to display (message2).
Last edited by ohaithar; 21/01/11 08:49 AM.
|
|
|
|
Joined: Nov 2006
Posts: 1,559
Hoopy frood
|
Hoopy frood
Joined: Nov 2006
Posts: 1,559 |
For that kind of matching and $read, a loop over all lines of the file is inevitable. [...]
else {
; loop all lines of the file
var %n = 1
while ($read(text.txt,n,%n) != $null) {
; check for current line matching the third word
if ($v1 isin $3) {
; output and stop further processing in case of success
msg $chan message for line $v1 matching word $3
return
}
inc %n
}
; no success
msg $chan message for no match
} Hash tables would allow you to search for both: any <data> matched by <wildtext> (like $read and w), and any <wilddata> matching <text> (what you're after). Especially if you have a file with a lot of lines, the method outlined below should perform much better: [...]
else {
; create hash table if it does not exist
if (!$hget(likefile)) { likefile.load }
; check for any hash table data wildmatching the third word (returns first match only)
if ($hfind(likefile,$3,1,W).data) { msg $chan data $hget(likefile,$v1) matches text $3 }
; no match
else { msg $chan message for no match }
}
[...]
}
; load file into a hash table
; hash table items will be a numerical index ("line number"), the content of each line the data for that item
alias likefile.load {
if ($hget(likefile)) { hfree likefile }
hmake likefile
hload -n likefile "text.txt"
} Note that your text file now has to contain a list of words with wildcards like *dog* or cat* As you're not checking the file but the hash table, use the /likefile.load command after any modification of the textfile.
Last edited by Horstl; 21/01/11 11:07 AM.
|
|
|
|
Joined: Oct 2004
Posts: 8,330
Hoopy frood
|
Hoopy frood
Joined: Oct 2004
Posts: 8,330 |
In addition to what Horstl gave, if all you are having trouble with are plurals, just add the plurals to your file unless that is a problem for whatever reason.
Hash tables are definitely going to be faster, though. And a regex search can also help considerably by ignoring punctuation and such.
Invision Support #Invision on irc.irchighway.net
|
|
|
|
Joined: Jan 2011
Posts: 34
Ameglian cow
|
OP
Ameglian cow
Joined: Jan 2011
Posts: 34 |
Alright thank you guys, i think i have it working exactly how i want it to but just one last thing. I also want the script to be triggered by the words "i love" along with "i like" how would i incorporate that in the script?
Last edited by ohaithar; 22/01/11 11:27 PM.
|
|
|
|
Joined: Nov 2006
Posts: 1,559
Hoopy frood
|
Hoopy frood
Joined: Nov 2006
Posts: 1,559 |
Possibilities include ; check text parameters without matchtext restriction
on *:text:*:#chan: {
if (($1-2 == i love) || ($1-2 == i like)) && ($3 != $null) {
[...]
}
}
; limit matchtext and check second text parameter
on *:text:i l* *:#chan: {
if ($istok(love.like,$2,46)) {
[...]
}
}
; a regular expression for either case as matchtext
on $*:text:/^i (love|like) ./i:#chan: {
[...]
}
|
|
|
|
Joined: Jul 2007
Posts: 1,129
Hoopy frood
|
Hoopy frood
Joined: Jul 2007
Posts: 1,129 |
I think only one letter l is needed.
|
|
|
|
Joined: Nov 2006
Posts: 1,559
Hoopy frood
|
Hoopy frood
Joined: Nov 2006
Posts: 1,559 |
*gives Tomao a cookie byte
|
|
|
|
Joined: Jul 2007
Posts: 1,129
Hoopy frood
|
Hoopy frood
Joined: Jul 2007
Posts: 1,129 |
Horstl, thanks for the cookie, and I take a bite byte of your scrumptious cookie.
|
|
|
|
|