All pastes #173699 Raw Edit

Someone

public text v1 · immutable
·published 2006-09-17 05:41 UTC
rendered paste body
################################################################################
#
#  TCL scripts by Ofloo all rights reserved.
#
#  HomePage: http://ofloo.net/
#  CVS: http://cvs.ofloo.net/
#  Email: support[at]ofloo.net
#
#  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.
#
################################################################################

################################################################################
# CREATE TABLE oper_module_killchan (
#   chan_id int(11) NOT NULL auto_increment,
#   chan_name varchar(250) NOT NULL default '',
#   chan_reason text NOT NULL,
#   PRIMARY KEY  (chan_id,chan_id),
#   UNIQUE KEY chan_id (chan_id,chan_name)
# ) TYPE=MyISAM;
################################################################################

#####################################
# Rehash proc
#####################################
proc rehash_msg {nick host hand arg} {
  if {[llength $arg] != 0} {
    putserv "NOTICE $nick :Invalid arguments. /msg $botnick help rehash"
    return
  }
  rehash
  putserv "NOTICE $nick :Hasing service config files, script arrays & librarys."
}

#####################################
# Oper Help proc
#####################################
proc oper_help_msg {nick host hand arg} {
  global botnick
  puts "$nick $host $hand arg: $arg"
  if {[string equal {} [lindex $arg 0]]} {
    putserv "NOTICE $nick :** - :: IRC operator command list :: - **"
    putserv "NOTICE $nick : +  KILL      Kill handle or clear channel"
    putserv "NOTICE $nick : +  SLAY      Slay channel"
    putserv "NOTICE $nick : +  LIST      List handle"
    if {[matchattr $nick a]} {
      putserv "NOTICE $nick : +  REHASH    Rehash services"
    }
    putserv "NOTICE $nick : +  REOP      Reop user"
    putserv "NOTICE $nick : +  UKILL     Unkill handle or channel"
  } elseif {[string equal -nocase "kill" [lindex $arg 0]]} {
    putserv "NOTICE $nick :** - :: Kills a user or clears a channel by mass kick :: - **"
    putserv "NOTICE $nick : +  KILL - Syntax: /msg $botnick kill <channel|nick> <reason>"
  } elseif {[string equal -nocase "rehash" [lindex $arg 0]]} {
    if {[matchattr $nick a]} {
      putserv "NOTICE $nick :** - :: Hashes config files scripts and libs. :: - **"
      putserv "NOTICE $nick : +  REHASH - Syntax: /msg $botnick rehash"
    } else {
      putserv "NOTICE $nick :You don't have access to this option."
    }
  } elseif {[string equal -nocase "reop" [lindex $arg 0]]} {
    putserv "NOTICE $nick :** - :: Ops a user in a channel. :: - **"
    putserv "NOTICE $nick : +  REOP - Syntax: /msg $botnick reop <channel> <nick>"
  } elseif {[string equal -nocase "ukill" [lindex $arg 0]]} {
    putserv "NOTICE $nick :** - :: Removes a slayed or killed channel :: - **"
    putserv "NOTICE $nick : + UKILL - Syntax: /msg $botnick ukill <channel>"
  } elseif {[string equal -nocase "list" [lindex $arg 0]]} {
    if {[isloaded module_ctcp]} {
      putserv "NOTICE $nick :** - :: List bans :: - **."
      putserv "NOTICE $nick : +  LIST - Syntax: /msg $botnick list <type>"
      putserv "NOTICE $nick : +   |- channels - Shows banned channels"
      putserv "NOTICE $nick : +   `- version - Shows banned versions"
    } else {
      putserv "NOTICE $nick :** List bans."
      putserv "NOTICE $nick : +  LIST - Syntax: /msg $botnick list <type>"
      putserv "NOTICE $nick : +   `- channels - Shows banned channels"
    }
  }
}

#####################################
# Kill proc
#####################################
proc kill_handle_msg {nick host hand arg} {
  global botnick
  if {[llength $arg] >= 2} {
    if {[ischan [lindex $arg 0]]} {
      if {[killchan [lindex $arg 0] [join [lrange $arg 1 end]]]} {
        putserv "NOTICE $nick :Killing channel [lindex $arg 0]."
      } else {
        putserv "NOTICE $nick :Was unable to kill channel [lindex $arg 0]."
      }
    } else {
      putserv "KILL [lindex $arg 0] :<reason>: [join [lrange $arg 1 end]]"
    }
  } else {
    putserv "NOTICE $nick :Invalid arguments. /msg $botnick help kill"
  }
}
proc slay_handle_msg {nick host hand arg} {
  global botnick
  if {[llength $arg] >= 2} {
    if {[ischan [lindex $arg 0]]} {
      if {[slaychan [lindex $arg 0] [join [lrange $arg 1 end]]]} {
        putserv "NOTICE $nick :Killing channel [lindex $arg 0]."
      } else {
        putserv "NOTICE $nick :Was unable to kill channel [lindex $arg 0]."
      }
    } else {
      putserv "KILL [lindex $arg 0] :<reason>: [join [lrange $arg 1 end]]"
    }
  } else {
    putserv "NOTICE $nick :Invalid arguments. /msg $botnick help kill"
  }
}

#####################################
# Ops a user in a channel
#####################################
proc reop_user_msg {nick host hand arg} {
  global botnick
  if {[llength $arg] != 2} {
    putserv "NOTICE $nick :Invalid arguments. /msg $botnick help reop"
  } else {
    if {[ischan [lindex $arg 0]]} {
      putlink "MODE [lindex $arg 0] +o [lindex $arg 1]"
    } else {
      putserv "NOTICE $nick :Invalid channel. /msg $botnick help reop"
    }
  }
}

#####################################
# Removes a channel kill proc
#####################################
proc ukill_handle_msg {nick host hand arg} {
  global botnick
  if {[llength $arg] != 1} {
    putserv "NOTICE $nick :Invalid arguments. /msg $botnick help ukill"
  } else {
    if {[ukillchan [lindex $arg 0]]} {
      putserv "NOTICE $nick :Removed channel."
    } else {
      putserv "NOTICE $nick :Failed to remove channel."
    }
  }
}

#####################################
# Kills a channel proc.
#####################################
proc killchan {chan {arg {}}} {
  global modesArray srv sql
  if {[string equal {} $arg]} {
    set arg "Channel is being killed for an unknown reason"
  }
  if {[ischan $chan]} {
    mysqluse $sql(hand) $sql(db)
    if {[catch {mysqlexec $sql(hand) "INSERT INTO oper_module_killchan (chan_id,chan_name,chan_reason) VALUES ('NULL','$chan','$arg');"} err]} {
      return 0
    }
    putlink "SJOIN [clock seconds] $chan + :$srv(nick)"
    putlink "MODE $chan +o $srv(nick)"
    if {[info exists modesArray($chan)]} {
      putlink "MODE $chan -$modesArray($chan)"
    }
    putlink "MODE $chan +ntispm"
    putserv "TOPIC $chan :\002\[CHANNEL CLOSED\]:\002 $arg"
    foreach x [array names modesArray] {
      if {[regexp {^(.+?)_(#.*)$} $x s n c]} {
        if {[string equal -nocase $c $chan]} {
          if {[string match -nocase *\x40* $n]} {
            if {[matchattr $n -|e $c]} {
              putserv "MODE $chan -e $n"
            }
            if {[matchattr $n -|I $c]} {
              putserv "MODE $chan -I $n"
            }
          } else {
            if {![matchattr $n o]} {
              if {[matchattr $n -|o $c]} {
                putserv "MODE $c -o $n"
              }
              putserv "KICK $c $n :$arg"
            }
          }
        }
      }
    }
    return 1
  }
  return 0
}
}
#################################
# Slay Channel
#################################

proc slaychan {chan {arg {}}} {
  global modesArray srv sql
  if {[string equal {} $arg]} {
    set arg "Channel is being killed for an unknown reason"
  }
  if {[ischan $chan]} {
    mysqluse $sql(hand) $sql(db)
    if {[catch {mysqlexec $sql(hand) "INSERT INTO oper_module_killchan (chan_id,chan_name,chan_reason) VALUES ('NULL','$chan','$arg');"} err]} {
      return 0
    }
    putlink "SJOIN [clock seconds] $chan + :$srv(nick)"
    putlink "MODE $chan +o $srv(nick)"
    if {[info exists modesArray($chan)]} {
      putlink "MODE $chan -$modesArray($chan)"
    }
    putlink "MODE $chan +ntispm"
    putserv "TOPIC $chan :\002\[CHANNEL CLOSED\]:\002 $arg"
    foreach x [array names modesArray] {
      if {[regexp {^(.+?)_(#.*)$} $x s n c]} {
        if {[string equal -nocase $c $chan]} {
          if {[string match -nocase *\x40* $n]} {
            if {[matchattr $n -|e $c]} {
              putserv "MODE $chan -e $n"
            }
            if {[matchattr $n -|I $c]} {
              putserv "MODE $chan -I $n"
            }
          } else {
            if {![matchattr $n o]} {
              if {[matchattr $n -|o $c]} {
                putserv "MODE $c -o $n"
              }
              putserv "KILL $n :$arg"
            }
          }
        }
      }
    }
    return 1
  }
  return 0
}

}
#####################################
# Removes a channel kill
#####################################
proc ukillchan {chan} {
  global srv sql
  mysqluse $sql(hand) $sql(db)
  if {![catch {mysqlexec $sql(hand) "DELETE FROM oper_module_killchan WHERE chan_name = '$chan';"} err]} {
    putlink "MODE $chan -ntispm"
    putserv "PART $chan"
    return 1
  }
  return 0
}

#####################################
# On burst channelkill, why on burst
# only then all server clients and
# channels are set
#####################################
proc load_array_channels {ctime} {
  global srv sql modesArray
  mysqluse $sql(hand) $sql(db)
  foreach {a b} [mysqlsel $sql(hand) "SELECT chan_name,chan_reason FROM oper_module_killchan;" -flatlist] {
    putlink "SJOIN [clock seconds] $a + :$srv(nick)"
    putlink "MODE $a +o $srv(nick)"
    putlink "MODE $a +ntispm"
    putserv "TOPIC $a :\002\[CHANNEL CLOSED\]\002 $b"
    }
  foreach a {[mysqlsel $sql(hand) "SELECT chan_name FROM oper_module_regchan;" -flatlist]} {
    putlink "SJOIN [clock seconds] $a + :$srv(nick)"
    putlink "MODE $a +o $srv(nick)"
    }
  if {$srv(debug)} {
    puts "LOAD --> Loading banned channels."
    puts "LOAD --> Loading registered channels."
  }
}

#####################################
# List proc
#####################################
proc oper_list_msg {nick host hand arg} {
  global botnick sql
  if {[llength $arg] != 1} {
    putserv "NOTICE $nick :Invalid arguments. /msg $botnick help list"
  } else {
    mysqluse $sql(hand) $sql(db)
    if {[string equal -nocase channels [lindex $arg 0]]} {
      putserv "NOTICE $nick :** Listing banned channels."
      foreach {a b} [mysqlsel $sql(hand) "SELECT chan_name,chan_reason FROM oper_module_killchan;" -flatlist] {
        putserv "NOTICE $nick :  + Channel: $a Reason: $b"
      }
    }
    if {[string equal -nocase version [lindex $arg 0]] && [isloaded module_ctcp]} {
      putserv "NOTICE $nick :** Banned ctcp replys."
      foreach {a b} [mysqlsel $sql(hand) "SELECT ctcp_reply,ctcp_reason FROM ctcp_module;" -flatlist] {
        putserv "NOTICE $nick :  + Reply: $a Reason: $b"
      }
    }
  }
}

#####################################
# Kick join made when netsplits
# occour.
#####################################
proc kick_chan_join {nick uhost hand chan} {
  if {![matchattr $nick o] && ![matchattr $nick a]} {
    if {[ischanban $chan]} {
      putserv "KICK $chan $nick :Read topic."
    }
  }
}

#####################################
# Checks if a chan is banned.
#####################################
proc ischanban {chan} {
  global sql
  mysqluse $sql(hand) $sql(db)
  if {[mysqlsel $sql(hand) "SELECT COUNT(*) FROM oper_module_killchan WHERE chan_name = '$chan';" -flatlist]} {
    return 1
  }
  return 0
}

######################################
# Owner...
######################################
#proc owner_msg {chan {arg {}}} {
#  global botnick sql
#  if {[llength $arg] != 1} {
#    putserv "NOTICE $nick :Invalid arguments. /msg $botnick help owner"
#  } else {
#      foreach {a b} [mysqlsel $sql(hand) "SELECT chan_name,chan_owner FROM oper_module_regchan;" -flatlist] {
#        putserv "NOTICE $nick :Channel $a Information"
#        putserv "NOTICE $nick :Owner: $b"
#    }
#  }
#}

######################################
# REGISTER
######################################
proc regchan {chan {arg {}}} {
  global modesArray srv sql
  if {[string equal {} $arg]} {
    set arg "Channel is being registered"
  }
  if {[ischan $chan]} {
    mysqluse $sql(hand) $sql(db)
    if {[catch {mysqlexec $sql(hand) "INSERT INTO oper_module_regchan (chan_id,chan_name,chan_owner) VALUES ('NULL','$chan','$arg');"} err]} {
      return 1
    }
    putlink "SJOIN [clock seconds] $chan + :$srv(nick)"
    putlink "MODE $chan +o $srv(nick)"
    if {[info exists modesArray($chan)]} {
      putlink "MODE $chan -$modesArray($chan)"
    }
    putlink "MODE $chan +nt"
    putserv "TOPIC $chan :\002\Channel successfully registered\002"
    }
    return 0
}

proc regchan_handle_msg {nick host hand arg} {
  global botnick
  if {[llength $arg] >= 2} {
    if {[ischan [lindex $arg 0]]} {
      if {[regchan [lindex $arg 0] [join [lrange $arg 1 end]]]} {
        putserv "NOTICE $nick :Registering channel [lindex $arg 0]."
      } else {
        putserv "NOTICE $nick :Was unable to register channel [lindex $arg 0]."
      }
    }
  } else {
    putserv "NOTICE $nick :Invalid arguments. /msg $botnick help register"
  }
}

bind join - * kick_chan_join

bind msg o ukill ukill_handle_msg
bind msg o kill kill_handle_msg
bind msg o slay slay_handle_msg
bind msg o regchan regchan_handle_msg
#bind msg o owner owner_msg
bind msg a rehash rehash_msg
bind msg o reop reop_user_msg
bind msg o help oper_help_msg
bind msg o list oper_list_msg
bind evnt - eob load_array_channels

set srv(module_opers) 1