egghelp.org community Forum Index
[ egghelp.org home | forum home ]
egghelp.org community
Discussion of eggdrop bots, shell accounts and tcl scripts.
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

relay.tcl

 
Post new topic   Reply to topic    egghelp.org community Forum Index -> Script Support & Releases
View previous topic :: View next topic  
Author Message
Football
Master


Joined: 26 Dec 2008
Posts: 205
Location: Quakenet, #Football

PostPosted: Tue Jun 28, 2011 6:32 am    Post subject: relay.tcl Reply with quote

Hey, I`m using relay.tcl, it relays words that are written in a text file from one channel another, the problem is that if you have two words in the text file that match in the same setence, it will relay the message more then once.

Lets say our text file includes the words "Hello there"
and the sentence is "Hello there Tony"
It will relay the sentence twice (as many times as it matches the text file)

Can anyone fix it so it won't relay it more then once please?

Thank you.
Code:
# Set here, the channel you want the bot to listen for messages on                       

set mchan "#PremierLeague"

# Set here, the channel you want the messages to be relayed to.                           

set rchan "#EPL"

# Add a word for relay
bind pub n|o !addword addword

# View a list of your relays
bind pub o|o !relays relays

# Clear all relays from wordsEPL.txt
bind pub o|o !relayclr msgclear

# This is what searches for and relays lines
bind pubm * * relay_to_chan

# Delete a relay word from file
bind pub n|o !delword delword

proc addword {nick host hand chan text} {
 global mchan
    if {[string equal -nocase $chan $mchan]} {
 set mfs "wordsEPL.txt"
        set word [join [lindex [split $text] 0]]
        if {![file exists $mfs]} {
            close [open $mfs w]
        }
        set fs [open $mfs]
        set data [read -nonewline $fs]
  close $fs
        if {![string length $data]} {
            set fs [open $mfs w]
        } else {
            set fs [open $mfs a]
        }
 puts $fs "$word"
  close $fs
   putserv "NOTICE $nick :Relay added: $word"
    }
 return
}

proc relays {nick host hand chan text} {
    set fs [open "wordsEPL.txt"]
    set data [read -nonewline $fs]
  close $fs
    if {![string length $data]} {
  putserv "NOTICE $nick :I don't currently have any messages to relay."
 return 0
    }
  putserv "NOTICE $nick :My list of relay messages is as follows:"
    set fs [open "wordsEPL.txt"]
  seek $fs 0 start
    while {[gets $fs line] >= 0} {
  puthelp "NOTICE $nick :$line"
    }
 close $fs
}

proc msgclear {nick host hand chan text} {
    close [open "wordsEPL.txt" w]
}

proc relay_to_chan {nick host hand chan text} {
  global mchan rchan
        if {[string equal -nocase $chan $mchan]} {
 set fs [open "wordsEPL.txt"]
   seek $fs 0 start
     while {[gets $fs line] >= 0} {
         if {[regexp -nocase ".*$line.*" [join [lrange [split $text] 0 end]] match]} {
   putserv "PRIVMSG $rchan :$match"
         }
   }
 close $fs
 return
        }
 return
}

proc delword {nick host hand chan text} {
 global mchan
    if {[string equal -nocase $chan $mchan]} {
 set word [lindex [split $text] 0]
 set fs [open "wordsEPL.txt"]
 set words [split [read -nonewline $fs] \n]
   close $fs
 set match [lsearch -exact $words $word]
 set fs [open "wordsEPL.txt" w]
 set newwords [lreplace $words $match $match]
   puts $fs [join $newwords "\n"]
   close $fs
    putserv "NOTICE $nick :Relay deleted: $word."
    }
   return
}

_________________
Idling at #Football, Quakenet.
Back to top
View user's profile Send private message
username
Op


Joined: 06 Oct 2005
Posts: 196
Location: Russian Federation, Podolsk

PostPosted: Tue Jun 28, 2011 9:31 am    Post subject: Reply with quote

Try to change

Code:
set fs [open "wordsEPL.txt"]
seek $fs 0 start
while {[gets $fs line] >= 0} {
if {[regexp -nocase ".*$line.*" [join [lrange [split $text] 0 end]] match]} {
putserv "PRIVMSG $rchan :$match"
}


to

Code:
foreach line [split [read [set fid [open "wordsEPL.txt" "r"]]] "\n"] {
    if {[string match -nocase "*line*" $text]} {
        putserv "PRIVMSG $rchan :$text"
    }
}
close $fid

_________________
Архив TCL скриптов для ботов Eggdrop/Windrop:
http://egghelp.ru/
Back to top
View user's profile Send private message Send e-mail Visit poster's website
nml375
Revered One


Joined: 04 Aug 2006
Posts: 2857

PostPosted: Tue Jun 28, 2011 11:28 am    Post subject: Reply with quote

I'm afraid that change will not sort the issue;

I'd suggest you add a break to stop the loop once you've found a match:
Code:
set fs [open "wordsEPL.txt"]
seek $fs 0 start
while {[gets $fs line] >= 0} {
  if {[regexp -nocase ".*$line.*" $text match]} {
    putserv "PRIVMSG $rchan :$match"
    break
  }
}
close $fs


PS. I took the liberty of removing some pointless list operations (split, lrange all, join). DS
_________________
NML_375, idling at #eggdrop@IrcNET
Back to top
View user's profile Send private message
Football
Master


Joined: 26 Dec 2008
Posts: 205
Location: Quakenet, #Football

PostPosted: Tue Jun 28, 2011 12:06 pm    Post subject: Reply with quote

hey nml375 and username.

Thanks so much for the reply.

nml375 - that worked well, though it seems to have caused a new problem:

[19:04:50] <@DontPanic> !relays
[19:04:07] <BarraBrava> [16:04:14] Tcl error [relays]: can't read "data": no such variable
_________________
Idling at #Football, Quakenet.
Back to top
View user's profile Send private message
nml375
Revered One


Joined: 04 Aug 2006
Posts: 2857

PostPosted: Tue Jun 28, 2011 4:32 pm    Post subject: Reply with quote

Could you post your new version of the relays proc?
_________________
NML_375, idling at #eggdrop@IrcNET
Back to top
View user's profile Send private message
Football
Master


Joined: 26 Dec 2008
Posts: 205
Location: Quakenet, #Football

PostPosted: Tue Jun 28, 2011 4:35 pm    Post subject: Reply with quote

Sure
Code:
# Set here, the channel you want the bot to listen for messages on
set mchan "#PremierLeague"

# Set here, the channel you want the messages to be relayed to.
set rchan "#EPL"

# Add a word for relay
bind pub n|o !addword addword

# View a list of your relays
bind pub o|o !relays relays

# Clear all relays from words.txt
bind pub o|o !relayclr msgclear

# This is what searches for and relays lines
bind pubm * * relay_to_chan

# Delete a relay word from file
bind pub n|o !delword delword

proc addword {nick host hand chan text} {
 global mchan
    if {[string equal -nocase $chan $mchan]} {
 set mfs "wordsEPL.txt"
        set word [join [lindex [split $text] 0]]
        if {![file exists $mfs]} {
            close [open $mfs w]
        }
        set fs [open $mfs]
        set data [read -nonewline $fs]
  close $fs
        if {![string length $data]} {
            set fs [open $mfs w]
        } else {
            set fs [open $mfs a]
        }
 puts $fs "$word"
  close $fs
   putserv "NOTICE $nick :Relay added: $word"
    }
 return
}

proc relays {nick host hand chan text} {
    set fs [open "wordsEPL.txt"]
set fs [open "wordsEPL.txt"]
seek $fs 0 start
while {[gets $fs line] >= 0} {
  if {[regexp -nocase ".*$line.*" $text match]} {
    putserv "PRIVMSG $rchan :$match"
    break
  }
}
close $fs
    if {![string length $data]} {
  putserv "NOTICE $nick :I don't currently have any messages to relay."
 return 0
    }
  putserv "NOTICE $nick :My list of relay messages is as follows:"
   set fs [open "wordsEPL.txt"]
seek $fs 0 start
while {[gets $fs line] >= 0} {
  if {[regexp -nocase ".*$line.*" $text match]} {
    putserv "PRIVMSG $rchan :$match"
    break
  }
}
close $fs
}

proc msgclear {nick host hand chan text} {
    close [open "wordsEPL.txt" w]
}

proc relay_to_chan {nick host hand chan text} {
  global mchan rchan
        if {[string equal -nocase $chan $mchan]} {
 set fs [open "wordsEPL.txt"]
   set fs [open "wordsEPL.txt"]
seek $fs 0 start
while {[gets $fs line] >= 0} {
  if {[regexp -nocase ".*$line.*" $text match]} {
    putserv "PRIVMSG $rchan :$match"
    break
  }
}
close $fs
return
        }
 return
}

proc delword {nick host hand chan text} {
 global mchan
    if {[string equal -nocase $chan $mchan]} {
 set word [lindex [split $text] 0]
 set fs [open "wordsEPL.txt"]
 set words [split [read -nonewline $fs] \n]
   close $fs
 set match [lsearch -exact $words $word]
 set fs [open "wordsEPL.txt" w]
 set newwords [lreplace $words $match $match]
   puts $fs [join $newwords "\n"]
   close $fs
    putserv "NOTICE $nick :Relay deleted: $word."
    }
   return
}

_________________
Idling at #Football, Quakenet.
Back to top
View user's profile Send private message
nml375
Revered One


Joined: 04 Aug 2006
Posts: 2857

PostPosted: Tue Jun 28, 2011 5:09 pm    Post subject: Reply with quote

That is quite far from the original proc. The suggested fix should be applied to the relay_to_chan proc, not the other ones.
_________________
NML_375, idling at #eggdrop@IrcNET
Back to top
View user's profile Send private message
Football
Master


Joined: 26 Dec 2008
Posts: 205
Location: Quakenet, #Football

PostPosted: Tue Jun 28, 2011 5:11 pm    Post subject: Reply with quote

oh, errr

might writing the proper script in full?
_________________
Idling at #Football, Quakenet.
Back to top
View user's profile Send private message
nml375
Revered One


Joined: 04 Aug 2006
Posts: 2857

PostPosted: Tue Jun 28, 2011 5:16 pm    Post subject: Reply with quote

Code:
# Set here, the channel you want the bot to listen for messages on                       
set mchan "#PremierLeague"

# Set here, the channel you want the messages to be relayed to.                           
set rchan "#EPL"

# Add a word for relay
bind pub n|o !addword addword

# View a list of your relays
bind pub o|o !relays relays

# Clear all relays from wordsEPL.txt
bind pub o|o !relayclr msgclear

# This is what searches for and relays lines
bind pubm * * relay_to_chan

# Delete a relay word from file
bind pub n|o !delword delword

proc addword {nick host hand chan text} {
  global mchan
  if {[string equal -nocase $chan $mchan]} {
    set mfs "wordsEPL.txt"
    set word [join [lindex [split $text] 0]]
    if {![file exists $mfs]} {
      close [open $mfs w]
    }
    set fs [open $mfs]
    set data [read -nonewline $fs]
    close $fs
    if {![string length $data]} {
      set fs [open $mfs w]
    } else {
      set fs [open $mfs a]
    }
    puts $fs "$word"
    close $fs
    putserv "NOTICE $nick :Relay added: $word"
  }
  return
}

proc relays {nick host hand chan text} {
  set fs [open "wordsEPL.txt"]
  set data [read -nonewline $fs]
  close $fs
  if {![string length $data]} {
    putserv "NOTICE $nick :I don't currently have any messages to relay."
    return 0
  }
  putserv "NOTICE $nick :My list of relay messages is as follows:"
  set fs [open "wordsEPL.txt"]
  seek $fs 0 start
  while {[gets $fs line] >= 0} {
    puthelp "NOTICE $nick :$line"
  }
  close $fs
}

proc msgclear {nick host hand chan text} {
  close [open "wordsEPL.txt" w]
}

proc relay_to_chan {nick host hand chan text} {
  global mchan rchan
  if {[string equal -nocase $chan $mchan]} {
    set fs [open "wordsEPL.txt"]
    seek $fs 0 start
    while {[gets $fs line] >= 0} {
      if {[regexp -nocase ".*$line.*" $text match]} {
        putserv "PRIVMSG $rchan :$match"
        break
      }
    }
    close $fs
    return
  }
  return
}

proc delword {nick host hand chan text} {
  global mchan
  if {[string equal -nocase $chan $mchan]} {
    set word [lindex [split $text] 0]
    set fs [open "wordsEPL.txt"]
    set words [split [read -nonewline $fs] \n]
    close $fs
    set match [lsearch -exact $words $word]
    set fs [open "wordsEPL.txt" w]
    set newwords [lreplace $words $match $match]
    puts $fs [join $newwords "\n"]
    close $fs
    putserv "NOTICE $nick :Relay deleted: $word."
  }
  return
}


Adjusted indenting, and added the changes in my earlier post. Rest is as it was initially.
_________________
NML_375, idling at #eggdrop@IrcNET
Back to top
View user's profile Send private message
Football
Master


Joined: 26 Dec 2008
Posts: 205
Location: Quakenet, #Football

PostPosted: Tue Jun 28, 2011 5:36 pm    Post subject: Reply with quote

splendid! thanks for all the help.
_________________
Idling at #Football, Quakenet.
Back to top
View user's profile Send private message
username
Op


Joined: 06 Oct 2005
Posts: 196
Location: Russian Federation, Podolsk

PostPosted: Wed Jun 29, 2011 2:09 am    Post subject: Reply with quote

Sorry, I forgot about
Code:
return 0
after
Code:
putserv "PRIVMSG $rchan :$text"

_________________
Архив TCL скриптов для ботов Eggdrop/Windrop:
http://egghelp.ru/
Back to top
View user's profile Send private message Send e-mail Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    egghelp.org community Forum Index -> Script Support & Releases All times are GMT - 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Forum hosting provided by Reverse.net

Powered by phpBB © 2001, 2005 phpBB Group
subGreen style by ktauber