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.

Users can request the bot for their channel

Requests for complete scripts or modifications/fixes for scripts you didn't write. Response not guaranteed, and no thread bumping!
Post Reply
B
Bento
Voice
Posts: 5
Joined: Tue May 29, 2007 9:36 am

Users can request the bot for their channel

Post by Bento »

I'm running an online radio station and would like to have a script for my bot so the people in my channel can type !request #channel and the bot checks how many users there are in the channel. if L or Q is in it and if that all meets the requirements the bot will join that channel.

The bot needs to check if:
- There are more than 20 users in the channel
- L or Q is in the channel (Quakenet)
- The requester is op in the requested channel.

Any takers? Would love to see this being made!
r
r0t3n
Owner
Posts: 507
Joined: Tue May 31, 2005 6:56 pm
Location: UK

Post by r0t3n »

Try metroid's great basic request script:

Code: Select all

# Basic Request script

# GNU License
# This program is free software; you can redistribute it and/or modify     
# it under the terms of the GNU General Public License as published by     
# the Free Software Foundation; either version 2 of the License, or         
# (at your option) any later version.                                       
#                                                                           
# This program is distributed in the hope that it will be useful,           
# but WITHOUT ANY WARRANTY; without even the implied warranty of           
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             
# GNU General Public License for more details.                             
#                                                                           
# You should have received a copy of the GNU General Public License         
# along with this program; if not, write to the Free Software               
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

# /* This is a basic request script, It will join the channel, check some settings and stay/part if accepted.
# *  This does NOT add other bots to that channel.
# *  If you want it to do that, You will have to make it do that yourself :)
# *  If you have any questions about this script, feel free to ask me in #v1per on irc.quakenet.org
# *  Also, if you find any bugs, the same channel, my nickname is metroid
# *  Also, leave my copyright in, If you want to put your own copyright in MY script, Make your own script completely from scratch.
# */

# /* Installing the request script
# *  First, put the script into your /home/user/*eggdrop name*/scripts folder.
# *  Then at the end of your eggdrop.conf, Put:
# *  source scripts/request.tcl
# *  Just rehash the bot after you've done this and it should work.
# */

# /* This is a VERY basic idea of what you can use for a request system with eggdrops.
# *  It's very flexible as it's really easy to just add whatever you want to it :)
# *  Good luck with making your own request script and if you need some help, you can contact me.
# */

namespace eval request {
 variable version "1.0"
 variable author  "metroid"
 
 # Configuration!
 # Our homechannel, they can only request here.
 variable homechan "#v1per"
 # Ammount of people we require.
 variable needed   "30"
 # Do we want a Q or L?
 variable service  "1"
 
 # Do we send a message to the homechannel when a request fails?
 variable tell     "1"
 
 # End of Config!
 # Do NOT edit anything below these lines
 
 variable busy     "0"
 
 bind PUB  -|-  !request  [namespace current]::request
}

proc request::request {nickname hostname handle channel arguments} {
 if {[string equal -nocase $channel $request::homechan]} {
  if {!$request::busy} {
   set chan [lindex [split $arguments] 0]
   if {$chan != "" && ![validchan $chan]} {
    if {[string index $chan 0] == "#"} {
     set request::busy 1
    bind RAW -|- 315 [namespace current]::who
    utimer 30 [list [namespace current]::timeout $chan]
    channel add $chan
    set ::info "$nickname $chan"
   } else {
    putquick "NOTICE $nickname :A channel name starts with an #."
   }
   } else {
    putquick "NOTICE $nickname :You seem to have given an improper syntax for the channel."
   }
  } else {
   putquick "NOTICE $nickname :Sorry, there is already a request in progress."
  }
 }
}

proc request::who {server raw arguments} {
unbind RAW -|- 315 [namespace current]::who
if {$request::busy} {
 if {![info exists ::info]} { return 0 }
 set nickname [lindex [split $::info] 0]
 set channel [lindex [split $::info] 1]
 unset ::info
 set request::busy 0
 if {![onchan $nickname $channel] || ![isop $nickname $channel]} {
  putquick "NOTICE $nickname :You are not on $channel or you aren't opped."
  if {$request::tell} {
   putquick "PRIVMSG $request::homechan :Request for $channel failed. $nickname is not on $channel or is not opped."
  }
  channel remove $channel
  return 0
 }
 if {$request::service} {
   if {![onchan L $channel] && ![onchan Q $channel]} {
    set busy 0
    putquick "NOTICE $nickname :Q or L was not found on $channel."
    if {$request::tell} {
     putserv "PRIVMSG $request::homechan :Request for $channel failed. There is no Q or L on $channel."
    }
    channel remove $channel
    return 0
   }
  }
  if {[llength [chanlist $channel]] < $request::needed} {
    putquick "NOTICE $nickname :$channel has less than $request::needed users."
    if {$request::tell} {
     putserv "PRIVMSG $request::homechan :Request for $channel failed. There are not enough users on $channel (There are [llength [chanlist $channel]] users)."
    }
    channel remove $channel
    return 0
  }
  # Request is accepted
  putquick "NOTICE $nickname :Your request is accepted. I will stay on $channel."
  putquick "PRIVMSG $request::home :Request from $nickname for $channel was accepted. The channel has [llength [chanlist $channel]] users."
  if {![validuser [nick2hand $nickname]]} {
   adduser $nickname *![getchanhost $nickname]
   chattr $nickname |+n $channel
  } else {
   chattr [nick2hand $nickname] |+n $channel
  }
 }
}
 
proc request::timeout {chan} {
 if {[validchan $chan] && ![botonchan $chan]} {
  channel remove $chan
  putquick "PRIVMSG $request::homechan :Request for $chan failed. Bot cannot join $chan."
  if {[info exists ::info]} { unset ::info }
 }
}

proc request::version {} {
 putlog "Basic Request script version: $request::version by $request::author was loaded successfully."
}
   
request::version 
r0t3n @ #r0t3n @ Quakenet
B
Bento
Voice
Posts: 5
Joined: Tue May 29, 2007 9:36 am

Post by Bento »

Will give it a shot, tnx!
B
Bento
Voice
Posts: 5
Joined: Tue May 29, 2007 9:36 am

Post by Bento »

Okay this is a good start. What i'm trying to do here:

Ive got 2 eggdrops.
I want 1 eggdrop to check the requirements and if they are met, the bot stays in the channel. If the 1st eggdrop (the one which checks requirements) is in 19 channels (20 is the max on Quakenet) the 1st eggdrop should check the requirements in the channel, then part the channel and say to the 2nd eggdrop to join the channel he just checked.

Pls reply if u dont understand what i mean.
r
r0t3n
Owner
Posts: 507
Joined: Tue May 31, 2005 6:56 pm
Location: UK

Post by r0t3n »

A better way is to have 3 eggdrops, one dedicated to the requests, and 2 dedicated for the radio script.

Or, with a few mod's you can make a !request botnick #channel of which the botnick selected would carry out the request.
r0t3n @ #r0t3n @ Quakenet
B
Bento
Voice
Posts: 5
Joined: Tue May 29, 2007 9:36 am

Post by Bento »

3 eggdrops is fine i guess, i should be able to get that running. but then i would still need the script :P
B
Bento
Voice
Posts: 5
Joined: Tue May 29, 2007 9:36 am

Post by Bento »

Anyone?
r
r0t3n
Owner
Posts: 507
Joined: Tue May 31, 2005 6:56 pm
Location: UK

Post by r0t3n »

Ok, try this:

The syntax will be: !request <botnick> <#channel>

Code: Select all

# Basic Request script

# GNU License
# This program is free software; you can redistribute it and/or modify     
# it under the terms of the GNU General Public License as published by     
# the Free Software Foundation; either version 2 of the License, or         
# (at your option) any later version.                                       
#                                                                           
# This program is distributed in the hope that it will be useful,           
# but WITHOUT ANY WARRANTY; without even the implied warranty of           
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             
# GNU General Public License for more details.                             
#                                                                           
# You should have received a copy of the GNU General Public License         
# along with this program; if not, write to the Free Software               
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

# /* This is a basic request script, It will join the channel, check some settings and stay/part if accepted.
# *  This does NOT add other bots to that channel.
# *  If you want it to do that, You will have to make it do that yourself :)
# *  If you have any questions about this script, feel free to ask me in #v1per on irc.quakenet.org
# *  Also, if you find any bugs, the same channel, my nickname is metroid
# *  Also, leave my copyright in, If you want to put your own copyright in MY script, Make your own script completely from scratch.
# */

# /* Installing the request script
# *  First, put the script into your /home/user/*eggdrop name*/scripts folder.
# *  Then at the end of your eggdrop.conf, Put:
# *  source scripts/request.tcl
# *  Just rehash the bot after you've done this and it should work.
# */

# /* This is a VERY basic idea of what you can use for a request system with eggdrops.
# *  It's very flexible as it's really easy to just add whatever you want to it :)
# *  Good luck with making your own request script and if you need some help, you can contact me.
# */

namespace eval request {
 variable version "1.0"
 variable author  "metroid"
 
 # Configuration!
 # Our homechannel, they can only request here.
 variable homechan "#v1per"
 # Ammount of people we require.
 variable needed   "30"
 # Do we want a Q or L?
 variable service  "1"

 # Set here all the requestable bots (making sure they are online!)
 variable botlist "[list bot1 bot2 bot3 etc]"
 
 # Do we send a message to the homechannel when a request fails?
 variable tell     "1"
 
 # End of Config!
 # Do NOT edit anything below these lines
 
 variable busy     "0"
 
 bind PUB  -|-  !request  [namespace current]::request
}

proc request::request {nickname hostname handle channel arguments} {
 if {[string equal -nocase $channel $request::homechan]} {
  if {!$request::busy} {
   set bot [lindex [split $arguments] 0]
   set chan [lindex [split $arguments] 1]
   if {$bot == ""} {
     putserv "NOTICE $nickname :Syntax for request is as follows: $::lastbind <botnick> <#channel>."
     return
   }
   if {[lsearch -exact $request::botlist $bot] == -1} {
     putserv "NOTICE $nickname :User '$bot' is not in my botlist for request."
     putserv "NOTICE $nickname :These bot's are requestable: [join $request::botlist ", "]"
     return
   }
   if {$chan != "" && ![validchan $chan]} {
    if {[string index $chan 0] == "#"} {
     set request::busy 1
    bind RAW -|- 315 [namespace current]::who
    utimer 30 [list [namespace current]::timeout $chan]
    channel add $chan
    set ::info "$nickname $chan $bot"
   } else {
    putquick "NOTICE $nickname :A channel name starts with an #."
   }
   } else {
    putquick "NOTICE $nickname :You seem to have given an improper syntax for the channel."
   }
  } else {
   putquick "NOTICE $nickname :Sorry, there is already a request in progress."
  }
 }
}

proc request::who {server raw arguments} {
unbind RAW -|- 315 [namespace current]::who
if {$request::busy} {
 if {![info exists ::info]} { return 0 }
 set nickname [lindex [split $::info] 0]
 set channel [lindex [split $::info] 1]
 set bot [lindex [split $::info] 2]
 unset ::info
 set request::busy 0
 if {![onchan $nickname $channel] || ![isop $nickname $channel]} {
  putquick "NOTICE $nickname :You are not on $channel or you aren't opped."
  if {$request::tell} {
   putquick "PRIVMSG $request::homechan :Request for $channel failed. $nickname is not on $channel or is not opped."
  }
  channel remove $channel
  return 0
 }
 if {$request::service} {
   if {![onchan L $channel] && ![onchan Q $channel]} {
    set busy 0
    putquick "NOTICE $nickname :Q or L was not found on $channel."
    if {$request::tell} {
     putserv "PRIVMSG $request::homechan :Request for $channel failed. There is no Q or L on $channel."
    }
    channel remove $channel
    return 0
   }
  }
  if {[llength [chanlist $channel]] < $request::needed} {
    putquick "NOTICE $nickname :$channel has less than $request::needed users."
    if {$request::tell} {
     putserv "PRIVMSG $request::homechan :Request for $channel failed. There are not enough users on $channel (There are [llength [chanlist $channel]] users)."
    }
    channel remove $channel
    return 0
  }
  # Request is accepted
  putquick "NOTICE $nickname :Your request is accepted. $bot will join $channel."
  putquick "PRIVMSG $request::home :Request from $nickname for $channel was accepted. The channel has [llength [chanlist $channel]] users."
  putquick "PRIVMSG $bot :rjoin $channel $nickname *![getchanhost $nickname]"
 }
}
 
proc request::timeout {chan} {
 if {[validchan $chan] && ![botonchan $chan]} {
  channel remove $chan
  putquick "PRIVMSG $request::homechan :Request for $chan failed. Bot cannot join $chan."
  if {[info exists ::info]} { unset ::info }
 }
}

proc request::version {} {
 putlog "Basic Request script version: $request::version by $request::author was loaded successfully."
}
   
request::version
And put this script on your requestable bot(s):

Code: Select all

bind msg H| rjoin request:dojoin

proc request:dojoin {nickname hostname handle text} {
 set channel [lindex [split $text] 0]
 set nick [lindex [split $text] 1]
 set host [lindex [split $text] 2]
 if {![validuser [nick2hand $nick]]} {
   adduser $nick $host
   chattr $nick |+n $channel
  } else {
   chattr [nick2hand $nick] |+n $channel
 }
 putserv "NOTICE $nick :Hello $nick. Im your new bot. Your added to my userlist as '[nick2hand $nick]' with the hostname '$host'. Enjoy!"
}
Give it a try, not tested so it may or may not work...
r0t3n @ #r0t3n @ Quakenet
User avatar
Wuff
Voice
Posts: 7
Joined: Wed Oct 10, 2007 1:12 pm

Post by Wuff »

This script is just what I've been looking for. I've tested it and I works like a charm. Really great script!

I have some requests, for some extra features though. But I'm afraid I havent got the required knowhow to program it myself.

I would love if the script could quarantine a request, if it fails. For example, if a user requests the bot, and the requirements for the channel aren't met, the bot can't be requested for that particular channel for another 15 minutes.

I'm allso looking for another variation of the modification for a botnet. I would like to have a hub bot, that handles all the requests, and joins the requested channels to verify their validity. Then if the channel meets the requirements, the hub bot will send a request to all the leaf bots to join the channel. One leafbot, that hasn't reached it's channel limit, will then join the channel, and the hub bot will leave again, ready to take another request.

So the hub bot acts as a request handler, and as a scout, requesting an availible hub bot to join valid channels.

I really hope someone can help me, at least with some of it, or point me to something similar I can modify or use :)

Thanks
Post Reply