All pastes #465007 Raw Edit

Someone

public text v1 · immutable
#465007 ·published 2007-04-29 21:21 UTC
rendered paste body
# This is the voting module duplicated from Impious
# Some improvements made
# poutine 2007-02-17

## basic Configuration

# Command prefixes
set vote_config(cmd_prefix) "@"

# Which channel should this run in
set vote_config(chan) "#php"

# Who should this bot send votes to?
# Separate nicks with a , no spaces
set vote_config(notify) "Rex_Goodheart,poutine"

# Path to the citizens file
set vote_config(citizens_file) "text/citizens.txt"

# Path to log file
set vote_config(log_file) "text/vote-log.txt"

## vote throttling

# Throttling mode 0 = off, 1 = user, 2 = chan
set vote_config(throttle_mode) 1

# How long in seconds to wait until a user/chan can call for
# another kick vote
# 10 minutes = 600 seconds
set vote_config(throttle_kick) 600

# How long in seconds to wait until a user/chan can call for
# another ban vote
# 10 minutes = 600 seconds
set vote_config(throttle_ban) 600

# How long in seconds to wait until a user/chan can call for
# another elect vote
# 10 minutes = 600 seconds
set vote_config(throttle_elect) 600

# How long in seconds to wait until a user/chan can call for
# another impeach vote
# 10 minutes = 600 seconds
set vote_config(throttle_impeach) 600


# How long in seconds to wait until a user/chan can call for
# another ban vote
# 10 minutes = 600 seconds
set vote_config(throttle_ban) 600

# How long in seconds to wait until a user/chan can call for
# another kick vote
# 10 minutes = 600 seconds
set vote_config(throttle_kick) 600

# How long in seconds to wait until a user/chan can call for
# another censure vote
# 10 minutes = 600 seconds
set vote_config(throttle_censure) 600

# How long in seconds to wait until a user/chan can call for
# another trivia on/off vote
# 10 minutes = 600 seconds
set vote_config(throttle_trivia) 600

# How long in seconds to wait until a user/chan can call for
# another frenzy on/off vote
# 10 minutes = 600 seconds
set vote_config(throttle_frenzy) 600

## Advanced Bans

# Advanced bans
# Advanced bans are bans for a specified amount of time
# its inclusion in the !ban trigger is optional
# You need to setup times for bans, and a default ban time
# You can ignore this if disabled. set this to 0 to disable.
set vote_config(advanced_bans) 1

# Time limits in seconds for bans
# 10 minutes, 30 minutes, 1 hour, 6 hours, 1 day
set vote_config(advanced_ban_times) "600 1800 3600 21600 86400"

set vote_config(advanced_ban_vote_start) 3

set vote_config(advanced_ban_vote_increment) 1

set vote_config(advanced_ban_default_time) "600"


## Basic Vote Counts

# Each setting is self explanatory, vote counts for each punishment

set vote_config(count_impeach) 6
set vote_config(count_elect) 4
set vote_config(cit_count_ban) 5
set vote_config(count_ban) 3

set vote_config(cit_count_kick) 4
set vote_config(count_kick) 3

set vote_config(cit_count_censure) 3
set vote_config(cit_count_trivia) 3
set vote_config(cit_count_frenzy) 3

set vote_config(elect_vote_time) 60
set vote_config(ban_vote_time) 60
set vote_config(kick_vote_time) 60
set vote_config(impeach_vote_time) 60

## COLOR/CONTROL CODES
set vote_config(code1) ""
set vote_config(code2) ""


#### INITIALIZATION ####

# This shouldn't be messed with

set vote_config(impeach_last_time) 0
set vote_config(ban_last_time) 0
set vote_config(elect_last_time) 0
set vote_config(kick_last_time) 0

set vote_config(voteyescount) 0
set vote_config(votenocount)  0

# pending votes
set vote_config(pvoteyescount) 0 
set vote_config(pvotenocount) 0

# pending votes waiting for results
set vote_config(pvotewait) 0

set vote_config(invote) 0

set vote_config(vote_type) "ban"
set vote_config(vote_victim) "poutine"
set vote_config(vote_timer) 0

set vote_config(votes) ""  

bind pub - "$vote_config(cmd_prefix)confirm" impious:confirm
bind pub - "$vote_config(cmd_prefix)ban"     impious:vote_ban
bind pub - "$vote_config(cmd_prefix)crucify" impious:vote_ban
bind pub - "$vote_config(cmd_prefix)elect"   impious:vote_elect
bind pub - "$vote_config(cmd_prefix)impeach" impious:vote_impeach
bind pub - "$vote_config(cmd_prefix)kick"    impious:vote_kick
bind pub - "$vote_config(cmd_prefix)voice"   impious:vote_voice
bind pub - "$vote_config(cmd_prefix)devoice" impious:vote_devoice
bind pub - "$vote_config(cmd_prefix)censure" impious:vote_devoice


bind join - "$vote_config(chan) *" impious:deauth_join
bind nick - "$vote_config(chan) *" impious:deauth_nick

bind raw - "307"      impious:verify_cit

proc impious:deauth_join { nick uhost hand chan } {
  global vote_config

  set vote_config(${nick}_auth) 0

  putserv "whois $nick"
} 

proc impious:deauth_nick { nick uhost hand chan newnick } {
  global vote_config

  set vote_config($newnick_auth) 0

  putserv "whois $nick"
}


proc vote:yes { nick uhost hand arg } {
  global vote_config

  set cit [check_cit $nick]

  if {$cit == -1} {
    return
  } elseif {$cit == 0} {
    # Citizen is pending, set what it should do when decided
    set vote_config(${nick}_onverify) "vote:yes \{$nick\} \{\} \{\} \{$chan\} \{\}"
    return
  }

  if {[lsearch $vote_config(votes) "$nick*"] == -1} {
    lappend vote_config(votes) "$nick 1"
    incr vote_config(voteyescount)
    puthelp "PRIVMSG $nick :Your voting eligibility has been confirmed as  $nick addr: [getchanhost $nick] ip: 00.00.00.00 Votes: 1.  Your vote has been recorded as YES."
  } 
}

proc vote:no { nick uhost hand arg } {
  global vote_config

  set cit [check_cit $nick]

  if {$cit == -1} {
    return
  } elseif {$cit == 0} {
    # Citizen is pending, set what it should do when decided
    set vote_config(${nick}_onverify) "vote:no \{$nick\} \{\} \{\} \{$chan\} \{\}"
    return
  }

  if {[lsearch $vote_config(votes) "$nick*"] == -1} {
    lappend vote_config(votes) "$nick 0"
    incr vote_config(votenocount)
    puthelp "PRIVMSG $nick :Your voting eligibility has been confirmed as  $nick addr: [getchanhost $nick] ip: 00.00.00.00 Votes: 1.  Your vote has been recorded as  NO."
  }

}

proc end_kick { nick chan victim } {
  global vote_config botnick

  if {$vote_config(voteyescount) >= $vote_config(count_kick)} {
    if {$vote_config(voteyescount) > $vote_config(votenocount)} {
      set status "passed"
    } else {
      set status "failed"
    }
  } else {
    set status "failed"
  }

  puthelp "PRIVMSG $chan :$vote_config(code1)The motion to kick $vote_config(code2)$victim $vote_config(code1)has $status. The vote was $vote_config(code2)YES $vote_config(voteyescount) - NO $vote_config(votenocount). $vote_config(code1)($vote_config(count_kick) votes required for passage)"
 
  unbind msg - "yes" vote:yes
  unbind msg - "no"  vote:no

  if {$status == "passed"} {
    putkick $chan $victim "requested by $nick"
  }

  set vote_config(kick_last_time) [unixtime]
}

proc end_ban { nick chan victim } {
  global vote_config botnick

  if {$vote_config(voteyescount) >= $vote_config(count_ban)} {
    if {$vote_config(voteyescount) > $vote_config(votenocount)} {
      set status "passed"
    } else {
      set status "failed"
    }
  } else {
    set status "failed"
  }

  puthelp "PRIVMSG $chan :$vote_config(code1)The motion to ban $vote_config(code2)$victim $vote_config(code1)has $status. The vote was $vote_config(code2)YES $vote_config(voteyescount) - NO $vote_config(votenocount). $vote_config(code1)($vote_config(count_ban) votes required for passage)"

  unbind msg - "yes" vote:yes
  unbind msg - "no"  vote:no

  set vote_config(ban_last_time) [unixtime]
}

proc end_impeach { nick chan victim } {
  global vote_config botnick

  if {$vote_config(voteyescount) >= $vote_config(count_impeach)} {
    if {$vote_config(voteyescount) > $vote_config(votenocount)} {
      set status "passed"
    } else {
      set status "failed"
    }
  } else {
    set status "failed"
  }

  puthelp "PRIVMSG $chan :$vote_config(code1)The motion to impeach $vote_config(code2)$victim $vote_config(code1)has $status. The vote was $vote_config(code2)YES $vote_config(voteyescount) - NO $vote_config(votenocount). $vote_config(code1)($vote_config(count_impeach) votes required for passage)"
 
  unbind msg - "yes" vote:yes
  unbind msg - "no"  vote:no

  set vote_config(impeach_last_time) [unixtime]
}

proc end_elect { nick chan victim } {
  global vote_config botnick

  if {$vote_config(voteyescount) >= $vote_config(count_elect)} {
    if {$vote_config(voteyescount) > $vote_config(votenocount)} {
      set status "passed"
    } else {
      set status "failed"
    }
  } else {
    set status "failed"
  }

  puthelp "PRIVMSG $chan :$vote_config(code1)The motion to elect $vote_config(code2)$victim $vote_config(code1)has $status. The vote was $vote_config(code2)YES $vote_config(voteyescount) - NO $vote_config(votenocount). $vote_config(code1)($vote_config(count_elect) votes required for passage)"

  unbind msg - "yes" vote:yes
  unbind msg - "no"  vote:no

  set vote_config(elect_last_time) [unixtime]
}

proc impious:vote_impeach { nick uhost hand chan arg } {
  global vote_config botnick

  if {$vote_config(chan) != $chan} {
    return
  }

  set cit [check_cit $nick]

  if {$cit == -1} {
    return
  } elseif {$cit == 0} {
    # Citizen is pending, set what it should do when decided
    set vote_config(${nick}_onverify) "impious:vote_impeach \{$nick\} \{\} \{\} \{$chan\} \{$arg\}"
    return
  }

  if {[expr [unixtime] - $vote_config(impeach_last_time)] < $vote_config(throttle_impeach)} {
    set secs [expr $vote_config(throttle_impeach) - ([unixtime] - $vote_config(impeach_last_time))]
    puthelp "PRIVMSG $chan :$vote_config(code1)Sorry... another impeach vote will not be allowed for another $secs seconds"
    return;
  }

  set victim [lindex $arg 0]
  set reason ""

  if {[llength $arg] == 1} {
    puthelp "PRIVMSG $chan :$vote_config(code1)$nick has called for a vote to impeach $vote_config(code2)$victim . $vote_config(code1)You have one minute to vote by messaging $botnick with a $vote_config(code2)YES or NO."
  } elseif {[llength $arg] > 1} {
    set reason [lrange $arg 1 end]

    puthelp "PRIVMSG $chan :$vote_config(code1)$nick has called for a vote to impeach $vote_config(code2)$victim . $vote_config(code1)Stated reason: $vote_config(code2)$reason . $vote_config(code1)You have one minute to vote by messaging $botnick with a $vote_config(code2)YES or NO."
  }

  bind msg - "yes" vote:yes
  bind msg - "no" vote:no

  set vote_config(voteyescount) 0
  set vote_config(votenocount) 0
  set vote_config(votes) ""

  utimer $vote_config(impeach_vote_time) "end_impeach $nick $chan $victim"
}

proc impious:vote_elect { nick uhost hand chan arg } {
  global vote_config botnick

  if {$vote_config(chan) != $chan} {
    return
  }

  set cit [check_cit $nick]

  if {$cit == -1} {
    return
  } elseif {$cit == 0} {
    # Citizen is pending, set what it should do when decided
    set vote_config(${nick}_onverify) "impious:vote_elect \{$nick\} \{\} \{\} \{$chan\} \{$arg\}"
    return
  }

  if {[expr [unixtime] - $vote_config(elect_last_time)] < $vote_config(throttle_elect)} {
    set secs [expr $vote_config(throttle_elect) - ([unixtime] - $vote_config(elect_last_time))]
    puthelp "PRIVMSG $chan :$vote_config(code1)Sorry... another elect vote will not be allowed for another $secs seconds"
    return;
  }

  set victim [lindex $arg 0]
  set reason ""

  if {[llength $arg] == 1} {
    puthelp "PRIVMSG $chan :$vote_config(code1)$nick has called for a vote to elect $vote_config(code2)$victim . $vote_config(code1)You have one minute to vote by messaging $botnick with a $vote_config(code2)YES or NO."
  } elseif {[llength $arg] > 1} {
    set reason [lrange $arg 1 end]

    puthelp "PRIVMSG $chan :$vote_config(code1)$nick has called for a vote to elect $vote_config(code2)$victim . $vote_config(code1)Stated reason: $vote_config(code2)$reason . $vote_config(code1)You have one minute to vote by messaging $botnick with a $vote_config(code2)YES or NO."
  }

  bind msg - "yes" vote:yes
  bind msg - "no" vote:no

  set vote_config(voteyescount) 0
  set vote_config(votenocount) 0
  set vote_config(votes) ""

  utimer $vote_config(elect_vote_time) "end_elect $nick $chan $victim"
}

proc impious:vote_kick { nick uhost hand chan arg } {
  global vote_config botnick

  if {$vote_config(chan) != $chan} {
    return
  }

  set cit [check_cit $nick]

  if {$cit == -1} {
    return
  } elseif {$cit == 0} {
    # Citizen is pending, set what it should do when decided
    set vote_config(${nick}_onverify) "impious:vote_kick \{$nick\} \{\} \{\} \{$chan\} \{$arg\}"
    return
  }

  if {[expr [unixtime] - $vote_config(kick_last_time)] < $vote_config(throttle_kick)} {
    set secs [expr $vote_config(throttle_kick) - ([unixtime] - $vote_config(kick_last_time))]
    puthelp "PRIVMSG $chan :$vote_config(code1)Sorry... another kick vote will not be allowed for another $secs seconds"
    return;
  }

  set victim [lindex $arg 0]
  set reason ""

  if {[llength $arg] == 1} {
    puthelp "PRIVMSG $chan :$vote_config(code1)$nick has called for a vote to kick $vote_config(code2)$victim . $vote_config(code1)You have one minute to vote by messaging $botnick with a $vote_config(code2)YES or NO."
  } elseif {[llength $arg] > 1} {
    set reason [lrange $arg 1 end]

    puthelp "PRIVMSG $chan :$vote_config(code1)$nick has called for a vote to kick $vote_config(code2)$victim . $vote_config(code1)Stated reason: $vote_config(code2)$reason . $vote_config(code1)You have one minute to vote by messaging $botnick with a $vote_config(code2)YES or NO."
  }

  bind msg - "yes" vote:yes
  bind msg - "no" vote:no

  set vote_config(voteyescount) 0
  set vote_config(votenocount) 0
  set vote_config(votes) ""


  utimer $vote_config(kick_vote_time) "end_kick $nick $chan $victim"
}

proc impious:vote_ban { nick uhost hand chan arg } {
  global vote_config botnick

  if {$vote_config(chan) != $chan} {
    return
  }

  set cit [check_cit $nick]

  if {$cit == -1} {
    return
  } elseif {$cit == 0} {
    # Citizen is pending, set what it should do when decided
    set vote_config(${nick}_onverify) "impious:vote_ban \{$nick\} \{\} \{\} \{$chan\} \{$arg\}"
    return
  }

  if {[expr [unixtime] - $vote_config(ban_last_time)] < $vote_config(throttle_ban)} {
    set secs [expr $vote_config(throttle_ban) - ([unixtime] - $vote_config(ban_last_time))]
    puthelp "PRIVMSG $chan :$vote_config(code1)Sorry... another ban vote will not be allowed for another $secs seconds"
    return;
  }

  set vote_config(votes) ""

  set victim [lindex $arg 0]

  if {[llength $arg] == 1} {
    set reason ""
    puthelp "PRIVMSG $chan :$vote_config(code1)$nick has called for a vote to ban $vote_config(code2)$victim . $vote_config(code1)You have one minute to vote by messaging $botnick with a $vote_config(code2)YES or NO."
  } elseif {[llength $arg] > 1} {
    set reason [lrange $arg 1 end]
  
    puthelp "PRIVMSG $chan :$vote_config(code1)$nick has called for a vote to ban $vote_config(code2)$victim . $vote_config(code1)Stated reason: $vote_config(code2)$reason . $vote_config(code1)You have one minute to vote by messaging $botnick with a $vote_config(code2)YES or NO."
  }

  bind msg - "yes" vote:yes
  bind msg - "no" vote:no

  set vote_config(voteyescount) 0
  set vote_config(votenocount) 0
  set vote_config(votes) ""


  utimer $vote_config(ban_vote_time) "end_ban $nick $chan $victim"

}

proc impious:confirm { nick uhost hand chan arg } {
  global vote_config

  if {$vote_config(chan) != $chan} {
    return
  }

  if {[llength $arg] > 0} {
    set victim [lindex $arg 0]
  } else {
    set victim $nick
  }

  set cit [check_cit $victim]

  if {$cit == -1} {
    puthelp "PRIVMSG $chan :$vote_config(code1)$victim is not a registered citizen of this channel."
    return
  } elseif {$cit == 0} {
    set vote_config(${victim}_onverify) "impious:confirm \{$victim\} \{\} \{\} \{$chan\} \{\}"
    return
  } else {
    set vhost [lindex [split [getchanhost $victim $chan] "@"] 1]
    puthelp "PRIVMSG $chan :$vote_config(code1)$victim $chan citizenship = $vote_config(code2)$victim addr: $vhost ip: 00.00.00.00 Votes: 1"
  }
}

proc impious:verify_cit { from keyword text } {
  global vote_config
  
  set nick [lindex $text 1]

  set vote_config(${nick}_auth) 1

  eval "$vote_config(${nick}_onverify)"
}

proc check_cit { nick } {
  global vote_config
 
  if {[lsearch $vote_config(citizens) $nick] == -1} {
    return -1;
  }

  if {![info exists vote_config(${nick}_auth)] || $vote_config(${nick}_auth) == 0} {
    # Cit check pending
    putserv "WHOIS $nick"
    return 0;
  } else {
    # Definitely not a cit
    if {$vote_config(${nick}_auth) == -1} {
      return -1
    }

    return 1;
  }
}

proc load_citizens { } {
  global vote_config

  set fd [open $vote_config(citizens_file) "r"]
  set vote_config(citizens) [split [read $fd] "\n"]
  close $fd
}


load_citizens