###############################################################################
### Preconfiguration please don't change...
### Script Logic ## Handle with care!
###############################################################################
set scriptname "AyoChat ZNC"
set scriptOwner "Bang Munthe"
set scriptOwnerMail "dex@ayochat.or.id" 
set scriptchannel "#ZNC"
set scriptOwnerNetwork "irc.ayochat.or.id"
set scriptversion "0.7.0.1"
set scriptdebug 0

putlog "$scriptname loading configuration..."

###############################################################################
### End of Preconfig
###############################################################################


###############################################################################
### Start of config
###############################################################################


### Script --------------------------------------------------------------------
# Script specific settings
# 
# 
###----------------------------------------------------------------------------

## set to 0 to minimize script putlog part
set scriptUseBigHeader 1

## Advertice ScriptOwner
set adverticeScriptOwner 0

## Prefix for triggering Bot Commands things like !request or .request
set scriptCommandPrefix "!"

## Sendmailpath !!!!! YOU REALLY NEED TO CHECK THE PATH !!!!!
set sendmailPath "/usr/sbin/sendmail"

### ZNC -----------------------------------------------------------------------
# Here you can configure your whole ZNC settings
#
# 
###----------------------------------------------------------------------------

## ZNC Network name
set zncnetworkname "AyoChat ZNC"

## The prefix set for Modules for Bot's ZNC-User
set zncprefix "*"

## The DNS-Host of your ZNC Server
set znchost "znc.ayochat.or.id"

## The ZNC NON-SSL Port, if not exists set ""
set zncNonSSLPort "20202"

## The ZNC SSL Port, if not exists set ""
set zncSSLPort ""

## The ZNC-Webinterface NON-SSL Port, if not exists set ""
set zncWebNonSSLPort "20202"

## The ZNC-Webinterface SSL Port, if not exists set ""
set zncWebSSLPort ""

## The Name of server support/admin
set zncAdminName "Admin ZNC"

## The E-Mail address of server support/admin
set zncAdminMail "teamayochat@gmail.com"

## The Level of Security for the random generated password for new ZNC-users (recommanded is 3 means [a-zA-Z0-9])
set zncPasswordSecurityLevel 3

## The Length of the automatic generated password)
set zncPasswordLength 16

### Optional - Preconfiguration -----------------------------------------------
# Default Modules and Networks
# !!!!!!! DISABLED !!!!!!!! FEATURE COMMING SOON !!!!!!!!
# 
###----------------------------------------------------------------------------

## Default User Modules loaded, if not exists set { } if you use arguments do it like that: "autoreply \"I'll be back soon\""
#set defaultUserModules { "chansaver" "controlpanel" "buffextras" "autoreply \"I'll be back soon\""}
set zncDefaultUserModules {  }

## Default User Modules loaded, if not exists set { } if you use arguments do it like that: "autoreply \"I'll be back soon\""
#set defaultUserModules { "chansaver" "controlpanel" "buffextras" "autoreply \"I'll be back soon\""}
set zncDefaultNetworkModules {  }

### Preconfigured Networks
## Enable Preconfigured Networks
set usePreconfiguredNetworks 1

## Array of Preconfigured Networks (only works if usePreconfiguredNetworks is set to 1 )
array set knownNetworks {
	AyoChat  "znc.ayochat.or.id 6667"

}

## Forces to 1 Network  !!!!!!! DISABLED !!!!!!!! FEATURE COMMING SOON !!!!!!!!
#set zncEnforcedNetwork "irc.shivering-isles.de +6697"
set zncEnforcedNetwork "znc.ayochat.or.id 6667"


### Optional - Topic Settings -------------------------------------------------
# Topic Settings
# !!!!!!! DISABLED !!!!!!!! FEATURE COMMING SOON !!!!!!!!
# 
###----------------------------------------------------------------------------

## Change Topic 1 means on 0 means off
set zncTopic 0

## Show Number of ZNC users in Topic
set zncTopicUsercount 1

## Show Serverdata in Topic
set zncTopicServerdata 1

## Show Name of server support/admin
set zncTopicShowAdmin 1

## Topicprefix
set zncTopicPrefix ""

## GreetSuffix
set zncTopicSuffix ""


### Optional - Greeting Settings ----------------------------------------------
# Settings for Greeting 
# !!!!!!! DISABLED !!!!!!!! FEATURE COMMING SOON !!!!!!!!
# 
###----------------------------------------------------------------------------

## Show Greeting 1 means on 0 means off
set zncGreeting 1

## Greet prefix (possible values for replace: %nick% %channel%)
set zncGreetPrefix "\00300,01"

## Greet suffix (possible values for replace: %nick% %channel%)
set zncGreetSuffix "\003"

## Greet Messages (possible values for replace: %nick% %channel% %zncAdminName% %zncAdminMail% %zncNonSSLPort% %zncSSLPort% %zncWebSSLPort% %zncWebNonSSLPort% %znchost%)
set zncGreetings {
 "Selamat Datang %nick%, di %channel% AyoChat. Untuk Request ZNC-Account ketik !help request"
	}


### Optional - Advertice ------------------------------------------------------
# Settings for advertice your network
# !!!!!!! DISABLED !!!!!!!! FEATURE COMMING SOON !!!!!!!!
# 
###----------------------------------------------------------------------------

## Do Advertice 1 means on 0 means off (if 0 scriptAdvertice is off, too)
set zncAdvertice 0

## Show Number of ZNC users in Advertice
set zncAdverticeUsercount 1

## Show Serverdata in Topic
set zncAdverticeServerdata 1

## Show Name of server support/admin
set zncAdverticeShowAdmin 1

## Sentences for Advertice
#set zncAdverticeSenteces { } #disabled
set zncAdverticeSenteces { 
	"Get your Free ZNC now!" 
	""}


###############################################################################
### End of Config
###############################################################################

###############################################################################
### Script Logic ## Handle with care! (If you change 1 character my support ends)
###############################################################################
putlog "$scriptname configuration loaded"
putlog "$scriptname loading script..."

if { $scriptUseBigHeader } {
	putlog "$scriptname is wirtten by $scriptOwner"
	putlog "If you need help join irc://$scriptOwnerNetwork/$scriptchannel"
	putlog "If you can't join or want to contact me inanother way, you can E-Mail to $scriptOwnerMail"
	putlog "Enjoin your work with $scriptname"
}

if { $scriptdebug } {
	putlog "!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!"
	putlog "RUNNING SCRIPT IN DEBUG MODE! DO NOT RUN PRODUCTIVE!"
}

### Bot Commands --------------------------------------------------------------

proc znc:request { nick host handle chan text } {
	global scriptCommandPrefix zncPasswordSecurityLevel zncPasswordLength zncnetworkname zncDefaultUserModules zncDefaultNetworkModules usePreconfiguredNetworks
	set username [lindex $text 0]
	set email [lindex $text 1]
	set networkname [lindex $text 2]
	set server [lindex $text 3]
	set port [lindex $text 4]
	if { $email == ""} { 
		puthelp "NOTICE $nick :${scriptCommandPrefix}request contoh  \"${scriptCommandPrefix}request <zncusername> <e-mail-address> \[<networkname> \[<serveraddress> <\[+\]port>\]\]\" atau ketik  \"${scriptCommandPrefix}help request\""
		return
	} else {
		set password [znc:helpfunction:generatePassword  $zncPasswordSecurityLevel $zncPasswordLength ]
		if [ adduser $username ] {
			setuser $username COMMENT $email
			chattr $username +ZC
			znc:controlpanel:AddUser $username $password 
			znc:blockuser:block $username 
			znc:helpfunction:loadModuleList $username $zncDefaultUserModules
			if { $networkname != ""} {
				set preServer ""
				if { $usePreconfiguredNetworks } {
					set preServer [array names knownNetworks -exact [string tolower $networkname]]
				}
				znc:controlpanel:AddNetwork $username $networkname
				znc:helpfunction:loadNetModuleList $username $networkname $zncDefaultNetworkModules
				if { $preServer != "" } {
					foreach {networkname networkserver} [array get knownNetworks [string tolower $networkname]] {
						znc:controlpanel:AddServer $username $networkname $networkserver 
					}
				} else {
					if { $port != "" } {
						znc:controlpanel:AddServer $username $networkname "$server $port"
					}
				}
			}
			puthelp "NOTICE $nick :Hai $nick, Permintaan ZNC dengan username " $username " telah di sampaikan ke Admin, setelah di dikonfirmasi oleh Admin, Anda akan mendapatkan email untuk login ZNC."
		} else {
			puthelp "NOTICE $nick :Maaf, Username yang anda inginkan sudah ada di database..."
		}
	}
}

proc znc:confirm {nick host handle chan text} {
	global scriptCommandPrefix zncPasswordSecurityLevel zncPasswordLength
	set username [lindex $text 0]
	if {$username == "" } {
		puthelp "NOTICE $nick :${scriptCommandPrefix}Confirm Perintah \"${scriptCommandPrefix}Confirm <zncusername>\" atau \"${scriptCommandPrefix}help Confirm"
	}
	if [ matchattr $username C] {
		set password [znc:helpfunction:generatePassword $zncPasswordSecurityLevel $zncPasswordLength ]
		znc:controlpanel:Set "password" $username $password 
		mail:simply:sendUserRequest $username $password 
		znc:blockuser:unblock $username 
		chattr $username -C
		puthelp "NOTICE $nick :$username di konfirmasi."
	} elseif [ validuser $username ] {
		puthelp "NOTICE $nick :$username sudah ada di database."
	} else {
		puthelp "NOTICE $nick :$username tidak ada"
	}
}

proc znc:deny {nick host handle chan text} {
	global scriptCommandPrefix
	set username [lindex $text 0]
	if {$username == "" } {
		puthelp "NOTICE $nick :${scriptCommandPrefix}Deny Perintah \"${scriptCommandPrefix}Deny <zncusername>\" atau \"${scriptCommandPrefix}help Deny"
	}
	if [ matchattr $username C ] {
		znc:controlpanel:DelUser $username 
		deluser $username
		puthelp "NOTICE $nick :$username di tolak."
	} elseif [ validuser $username ] {
		puthelp "NOTICE $nick :$username di konfirmasi. ketik \"${scriptCommandPrefix}DelUser <username>\" untuk menghapus"
	} else {
		puthelp "NOTICE $nick :$username tidak ada"
	}
}

proc znc:delUser {nick host handle chan text} {
	global scriptCommandPrefix
	set username [lindex $text 0]
	if {$username == "" } {
		puthelp "NOTICE $nick :${scriptCommandPrefix}DelUser Perintah \"${scriptCommandPrefix}DelUser <zncusername>\" atau \"${scriptCommandPrefix}help DelUser"
	}
	if [ validuser $username ] {
		znc:controlpanel:DelUser $username 
		deluser $username
		puthelp "NOTICE $nick :$username di hapus."
	} else {
		puthelp "NOTICE $nick :$username tidak ada"
	}
}

proc znc:listUnconfirmed {nick host handle chan text} {
	global scriptCommandPrefix
	set UnConfirmedList [join [ userlist C ] ,]
	if { $UnConfirmedList != "" } {
		puthelp "NOTICE $nick :Permintaan ZNC: $UnConfirmedList"
	} else {
		puthelp "NOTICE $nick :Permintaan ZNC tidak ada."
	}
}

proc znc:help {nick host handle chan text} {
	global scriptCommandPrefix zncAdminName scriptname botnick
	set helpcontext [lindex $text 0]
	if { $helpcontext != "" } {
		switch [string tolower $helpcontext] {
			request {
				puthelp "NOTICE $nick :#Peraturan untuk Request ZNC"
				puthelp "NOTICE $nick :#1. Free ZNC khusus Network AyoChat IRC Network"
				puthelp "NOTICE $nick :#2. Permintaan ZNC isi server dengan znc.ayochat.or.id"
             puthelp "NOTICE $nick :#3. Isi Email saat melakukan registrasi NickName"
				puthelp "NOTICE $nick :#-----------------"
				if { $chan != $nick } {
					puthelp "NOTICE $nick :#Perintah:"
					puthelp "NOTICE $nick :#   ${scriptCommandPrefix}request <zncusername> <e-mail-address> \[<networkname> \[<serveraddress> <\[+\]port>\]\]"
					puthelp "NOTICE $nick :#Contoh:"
					puthelp "NOTICE $nick :#   ${scriptCommandPrefix}request dex dex@aychat.or.id ayochat znc.ayochat.or.id 6667"
				} else {
					puthelp "NOTICE $nick :#Perintah:"
					puthelp "NOTICE $nick :#   /msg $botnick request <zncusername> <e-mail-address> \[<networkname> \[<serveraddress> <\[+\]port>\]\]"
					puthelp "NOTICE $nick :#Contoh:"
					puthelp "NOTICE $nick :#   /msg $botnick request dex dex@ayochat.or.id ayochat znc.ayochat.or.id 6667"
				}
				puthelp "NOTICE $nick :### End of Help ###"
			}
			listunconfirmedusers {
				puthelp "NOTICE $nick :#Help untuk ${scriptCommandPrefix}ListUnconfirmedUsers"

			 	   puthelp "NOTICE $nick :#-----------------"
				if { $chan != $nick } {
					puthelp "NOTICE $nick :#Perintah:"
					puthelp "NOTICE $nick :#   ${scriptCommandPrefix}ListUnconfirmedUsers"
					puthelp "NOTICE $nick :#Perintah:"
					puthelp "NOTICE $nick :#   ${scriptCommandPrefix}ListUnconfirmedUsers"
				} else {
					puthelp "NOTICE $nick :#Syntax:"
					puthelp "NOTICE $nick :#   /msg $botnick ListUnconfirmedUsers"
					puthelp "NOTICE $nick :#Syntax:"
					puthelp "NOTICE $nick :#   /msg $botnick ListUnconfirmedUsers"
				}
				puthelp "NOTICE $nick :### End of Help ###"
			}
			confirm {
				puthelp "NOTICE $nick :#Help for ${scriptCommandPrefix}Confirm"
				   puthelp "NOTICE $nick :#-----------------"
				if { $chan != $nick } {
					puthelp "NOTICE $nick :#Perintah:"
					puthelp "NOTICE $nick :#   ${scriptCommandPrefix}Confirm <zncusername>"
					puthelp "NOTICE $nick :#Contoh:"
				puthelp "NOTICE $nick :#   ${scriptCommandPrefix}Confirm dex"
				} else {
					puthelp "NOTICE $nick :#Syntax:"
					puthelp "NOTICE $nick :#  /msg $botnick Confirm <zncusername>"
					puthelp "NOTICE $nick :#Example:"
					puthelp "NOTICE $nick :#   /msg $botnick Confirm dex"
				}
				puthelp "NOTICE $nick :### End of Help ###"
			}
			deny {
				puthelp "NOTICE $nick :#Help for ${scriptCommandPrefix}Deny"

				   puthelp "NOTICE $nick :#-----------------"
				if { $chan != $nick } {
					puthelp "NOTICE $nick :#Perintah:"
					puthelp "NOTICE $nick :#   ${scriptCommandPrefix}Deny <zncusername>"
					puthelp "NOTICE $nick :#Contoh:"
					puthelp "NOTICE $nick :#   ${scriptCommandPrefix}Deny dex"
				} else {
					puthelp "NOTICE $nick :#Syntax:"
					puthelp "NOTICE $nick :#   /msg $botnick Deny <zncusername>"
					puthelp "NOTICE $nick :#Example:"
					puthelp "NOTICE $nick :#   /msg $botnick Deny dex"
				}
				puthelp "NOTICE $nick :### End of Help ###"
			}
			deluser {
				puthelp "NOTICE $nick :#Help for ${scriptCommandPrefix}DelUser"
				   puthelp "NOTICE $nick :#-----------------"
				if { $chan != $nick } {
					puthelp "NOTICE $nick :#Perintah:"
					puthelp "NOTICE $nick :#   ${scriptCommandPrefix}DelUser <zncusername>"
					puthelp "NOTICE $nick :#Contoh:"
					puthelp "NOTICE $nick :#   ${scriptCommandPrefix}DelUser dex"
				} else {
					puthelp "NOTICE $nick :#Syntax:"
					puthelp "NOTICE $nick :#   /msg $botnick DelUser <zncusername>"
					puthelp "NOTICE $nick :#Example:"
					puthelp "NOTICE $nick :#   /msg $botnick DelUser Foo"
				}
				puthelp "NOTICE $nick :### End of Help ###"
			}
			help {
				puthelp "NOTICE $nick :#Help for ${scriptCommandPrefix}help"

				   puthelp "NOTICE $nick :#-----------------"
				if { $chan != $nick } {
					puthelp "NOTICE $nick :#Perintah:"
					puthelp "NOTICE $nick :#   ${scriptCommandPrefix}help \[<command>\]"
					puthelp "NOTICE $nick :#Contoh:"
					puthelp "NOTICE $nick :#   ${scriptCommandPrefix}help request"
				} else {
					puthelp "NOTICE $nick :#Syntax:"
					puthelp "NOTICE $nick :#   /msg $botnick help \[<command>\]"
					puthelp "NOTICE $nick :#Example:"
					puthelp "NOTICE $nick :#   /msg $botnick help request"
				}
				puthelp "NOTICE $nick :### End of Help ###"
			}
			default {
				if { $chan != $nick } {
					puthelp "NOTICE $nick :#Ketik ${scriptCommandPrefix}help untuk melihat perintah yang ada"
				} else {
					puthelp "NOTICE $nick :#please use /msg $botnick help without parameters for full command list"
				}
				puthelp "NOTICE $nick :### End of Help ###"
			}
		}
	} else {
		puthelp "NOTICE $nick :#Permintaan $scriptname"
		puthelp "NOTICE $nick :#-----------------"
		if { $chan != $nick } {
			puthelp "NOTICE $nick :#Gunakan Perintah:"
			puthelp "NOTICE $nick :#   ${scriptCommandPrefix}help request"
		} else {
			puthelp "NOTICE $nick :#Syntax:"
			puthelp "NOTICE $nick :#   /msg $botnick help \[<command>\]"
			puthelp "NOTICE $nick :#Example:"
			puthelp "NOTICE $nick :#   /msg $botnick help request"
		}
		puthelp "NOTICE $nick :### End of Help ###"
	}
}


### ZNC - Functions -----------------------------------------------------------

proc znc:controlpanel:AddNetwork { username network } {
	znc:sendTo:Controlpanel "AddNetwork $username $network"
}

proc znc:controlpanel:AddServer { username network server } {
	znc:sendTo:Controlpanel "AddServer $username $network $server "
}

proc znc:controlpanel:AddUser { username password } {
	znc:sendTo:Controlpanel "AddUser $username $password"
}

proc znc:controlpanel:DelNetwork { username network } {
	znc:sendTo:Controlpanel "DelNetwork $username $network"
}

proc znc:controlpanel:DelUser { username } {
	znc:sendTo:Controlpanel "DelUser $username"
}

proc znc:controlpanel:Disconnect { username network } {
	znc:sendTo:Controlpanel "Disconnect $username $network"
}

proc znc:controlpanel:LoadModule { username modulename {args ""} } {
	if { $args == ""} {
		znc:sendTo:Controlpanel "LoadModule $username $modulename"
	} else {
		znc:sendTo:Controlpanel "LoadModule $username $modulename $args"
	}
}

proc znc:controlpanel:LoadNetModule { username network modulename {args ""} } {
	if { $args == ""} {
		znc:sendTo:Controlpanel "LoadNetModule $username $network $modulename"
	} else {
		znc:sendTo:Controlpanel "LoadNetModule $username $network $modulename $args"
	}
}

proc znc:controlpanel:Reconnect { username network } {
		znc:sendTo:Controlpanel "Reconnect $username $network"
}

proc znc:controlpanel:Set { variable username value } {
	znc:sendTo:Controlpanel "Set $variable $username $value"
}

proc znc:controlpanel:SetChan { variable username network chan value } {
	znc:sendTo:Controlpanel "SetChan $variable $username $network $chan $value"
}

proc znc:controlpanel:SetNetwork { variable username network value } {
	znc:sendTo:Controlpanel "SetNetwork $variable $username $network $value"
}

proc znc:blockuser:block { username } {
	znc:sendTo:blockuser "block $username"
}

proc znc:blockuser:unblock { username } {
	znc:sendTo:blockuser "unblock $username"
}


### Help functions ------------------------------------------------------------
proc znc:helpfunction:generatePassword { secureityLevel passwordLength } {
	set return "" 
	if { $secureityLevel >0 } {
	set pool {"1" "2" "3" "4" "5" "6" "7" "8" "9"}
	}
	if { $secureityLevel >1 } {
	lappend pool "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"	
	}
	if { $secureityLevel >2 } {
	lappend pool "A" "B" "C" "D" "E" "F" "G" "H" "T" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
	}
	if { $secureityLevel > 3 } {
	lappend pool "%" "&" "@" "_" "-" "!" "\$" "/" "\\" "." "," ";" "#" "+" "*" "~" "?" "="
	}
	if { $secureityLevel > 4 } {
	lappend pool "ä" "ö" "ü" "Ä" "Ü" "Ö" "ß" "<" ">" "|" "á" "ú" "ó" "é" "à" "ò" "ù" "è" "€" "â" "ô" "ê" "û"
	}
	if { $pool == "" } { return }
	for { set i 1 } { $i < $passwordLength } { incr i } {
		set return [string append $return [znc:helpfunction:randelem $pool]]
	}
	return $return
}


### Helpfunction for znc:helpfunction:generatePassword
if {[catch {string append}]} then {
    rename string STRING_ORIGINAL
    proc string {cmd args} {
        switch -regexp -- $cmd {
            ^a(p(p(e(n(d)?)?)?)?)?$ {
                uplevel [list join $args {}]
            }
            default {
                if {[catch {
                    set result [uplevel [list STRING_ORIGINAL $cmd] $args]
                } err]} then {
                    return -code error\
                        [STRING_ORIGINAL map\
                             [list\
                                  STRING_ORIGINAL string\
                                  ": must be bytelength,"\
                                  ": must be append, bytelength,"]\
                             $err]
                } else {
                    set result
                }
            }
        }
    }
 }
###----------------------------------------------------------------------------
proc znc:helpfunction:randelem {list} {
    lindex $list [expr {int(rand()*[llength $list])}]
}

proc znc:helpfunction:loadModuleList { username list } {
    foreach module $list {
		znc:controlpanel:LoadModule $username $module
	}
}

proc znc:helpfunction:loadNetModuleList { username network list} {
    foreach module $list {
		znc:controlpanel:LoadNetModule $username $network $module
	}
}

proc mail:simply:send { usermail subject content } {
	global zncAdminMail
	mail:sendTo:user $zncAdminMail $usermail $subject $content 
}

proc mail:simply:sendUserRequest { username password } {
	global zncnetworkname znchost zncNonSSLPort zncSSLPort zncWebNonSSLPort zncWebSSLPort zncAdminName zncAdminMail 
	set email [getuser $username COMMENT]
	set content "Hai $username,\n\n Permintaan $zncnetworkname\nTelah di setujui oleh Admin.\nData untuk login:\n\n"
	if { $zncNonSSLPort != "" } {
	append content \n\n "Server ZNC: ${znchost}:${zncNonSSLPort}"
	}
	if { $zncSSLPort != "" } {
	append content \n "To connect your IRC Client via SSL connect to: ${znchost}:${zncSSLPort}"
	}
	append content \n "ZNC Username: $username"
	append content \n "ZNC Password: $password"
	append content \n\n "Untuk connect IRC: \n/server ${znchost}:${zncNonSSLPort} ${username}:${password}"
	if { $zncWebNonSSLPort != "" } {
	append content \n "Webpanel: \nhttp://${znchost}:${zncWebNonSSLPort}"
	}
	if { $zncWebSSLPort != "" } {
	append content \n "To login via SSL-Webinterface goto: https://${znchost}:${zncWebSSLPort}"
	}
	if { $zncAdminMail != "" } {
	append content \n\n\n\n "Butuh bantuan pv/pm nick dex, Jangan di balas ke $zncAdminMail"
	}
	mail:simply:send $email "Permintaan $zncnetworkname" $content 
}

proc eggdrop:helpfunction:isNotZNCChannel { chan } {
	return [expr ! [channel get $chan znc]]
}

proc debug:helpfunction:test { nick host handle text } {
	puthelp "PRIVMSG $nick :Channels: [join [channels] ,]"
	puthelp "PRIVMSG $nick :[eggdrop:helpfunction:isNotZNCChannel "#ZNC" ]"
}

proc debug:helpfunction:testchan { nick host handle chan text } {
	global zncPasswordSecurityLevel zncPasswordLength
	puthelp "PRIVMSG $nick :$chan"
	puthelp "PRIVMSG $nick :[znc:helpfunction:generatePassword  $zncPasswordSecurityLevel $zncPasswordLength ]"
}

### sendTo - Functions --------------------------------------------------------
proc znc:sendTo:Controlpanel { command } {
	global zncprefix
	putquick "PRIVMSG ${zncprefix}controlpanel :$command"
}

proc znc:sendTo:blockuser { command } {
	global zncprefix
	putquick "PRIVMSG ${zncprefix}blockuser :$command"
}

proc mail:sendTo:user { from to subject content {cc "" } } {
	global sendmailPath
	set msg {From: $from}
	append msg \n "To: " [join $to , ]
	append msg \n "Cc: " [join $cc , ]
	append msg \n "Subject: $subject"
	append msg \n\n $content

	exec $sendmailPath -oi -t << $msg
}


### Commands - Functions ------------------------------------------------------

## Request Commands
proc znc:PUB:request {nick host handle chan text} {
	if [eggdrop:helpfunction:isNotZNCChannel $chan ] { return }
	znc:request $nick $host $handle $chan $text
}

proc znc:MSG:request {nick host handle text} {
	znc:request $nick $host $handle $nick $text
}

## Confirm Commands
proc znc:PUB:confirm {nick host handle chan text} {
	if [eggdrop:helpfunction:isNotZNCChannel $chan ] { return }
	znc:confirm $nick $host $handle $chan $text
}

proc znc:MSG:confirm {nick host handle text} {
	znc:confirm $nick $host $handle $nick $text
}

## Deny Commands
proc znc:PUB:deny {nick host handle chan text} {
	if [eggdrop:helpfunction:isNotZNCChannel $chan ] { return }
	znc:deny $nick $host $handle $chan $text
}

proc znc:MSG:deny {nick host handle text} {
	znc:deny $nick $host $handle $nick $text
}

## DelUser Commands
proc znc:PUB:delUser {nick host handle chan text} {
	if [eggdrop:helpfunction:isNotZNCChannel $chan ] { return }
	znc:delUser $nick $host $handle $chan $text
}

proc znc:MSG:delUser {nick host handle text} {
	znc:delUser $nick $host $handle $nick $text
}

## ListUnconfirmedUsers Commands
proc znc:PUB:listUnconfirmed {nick host handle chan text} {
	if [eggdrop:helpfunction:isNotZNCChannel $chan ] { return }
	znc:listUnconfirmed $nick $host $handle $chan $text
}

proc znc:MSG:listUnconfirmed {nick host handle text} {
	znc:listUnconfirmed $nick $host $handle $nick $text
}

## Help Commands
proc znc:PUB:help {nick host handle chan text} {
	if [eggdrop:helpfunction:isNotZNCChannel $chan ] { return }
	znc:help $nick $host $handle $chan $text
}

proc znc:MSG:help {nick host handle text} {
	znc:help $nick $host $handle $nick $text
}


### custom flags --------------------------------------------------------------

## ZNC Channel flag
setudef flag znc


### binds ---------------------------------------------------------------------

## public binds ---------------------------------------------------------------
bind PUB - "${scriptCommandPrefix}Request" znc:PUB:request
bind PUB Y "${scriptCommandPrefix}Terima" znc:PUB:confirm
bind PUB Y "${scriptCommandPrefix}Tolak" znc:PUB:deny
bind PUB Y "${scriptCommandPrefix}Hapus" znc:PUB:delUser
bind PUB Y "${scriptCommandPrefix}ListUnconfirmedUsers" znc:PUB:listUnconfirmed
bind PUB Y "${scriptCommandPrefix}LIST" znc:PUB:listUnconfirmed
bind PUB - "${scriptCommandPrefix}help" znc:PUB:help

## private binds --------------------------------------------------------------
bind MSG - "Request" znc:MSG:request
bind MSG Y "Terima" znc:MSG:confirm
bind MSG Y "Tolak" znc:MSG:deny
bind MSG Y "Hapus" znc:MSG:delUser
bind MSG Y "ListUnconfirmedUsers" znc:MSG:listUnconfirmed
bind MSG Y "LIST" znc:MSG:listUnconfirmed
bind MSG - "help" znc:MSG:help

## debug binds ----------------------------------------------------------------
if {$scriptdebug} {
	bind PUB n "!test" debug:helpfunction:testchan
	bind MSG n "test" debug:helpfunction:test
}


### End of Script -------------------------------------------------------------
putlog "$scriptname version $scriptversion loaded"

