Do not Disturb - A QuakeNet pm blocker
From Scriptwiki
Revision as of 15:05, 24 April 2006 by Shenghi (talk | contribs) (Fixed a bug with %dnd not being set when the script loads. Also added checks for existing files/hash table to prevent interfering with already existing scripts.)
Do not Disturb is a QuakeNet pm blocker based on Q account. It will not work on other networks!
; - - - - - - - - - - - - - - - - - - - - - - - - - ; Do Not Disturb ; ; Written by Shenghi ; Contact at #help.script @ irc.quakenet.org ; ; dnd.mrc ; dnd.dnd ; dnd.ini ; - - - - - - - - - - - - - - - - - - - - - - - - - ; A QuakeNet pm blocker based on Q auth ; Usage: ; /dnd [on|off|allow|block|remove] ; if no argument is passed a configuration dialog will pop up ; this is coming in a later version ; ; on|off turns pm blocking on or off ; ; allow|block allows or blocks a Q auth ; ; remove removes a Q auth ; - - - - - - - - - - - - - - - - - - - - - - - - - ; Version 1.11 ; - - - - - - - - - - - - - - - - - - - - - - - - - ;;;;;;;;;;;;;;;;;;;;;;;;; EVENTS ;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;; ; on LOAD ; ;;;;;;;;;;; on *:load:{ linesep -s ;; check whether or not there already is a file called dnd.ini if ($isfile(dnd.ini)) { echo -s Options file (dnd.ini) already exists. Unloading script... unload -rs $script linesep -s return } ;; check whether or not there already is a file called dnd.dnd if ($isfile(dnd.dnd)) { echo -s User list (dnd.dnd) already exists. Unloading script... unload -rs $script linesep -s return } ;; check whether or not there already is a hashtable called hDnd if ($hget(hDnd)) { echo -s User hash (hDnD) already exists. Unloading script... unload -rs $script linesep -s return } if ($var(%dnd)) { echo -s Backing up %dnd in $eval(%__dbd__backup__,0) set %__dnd__backup__ %dnd } echo -s Turning on DnD set %dnd on echo -s Writing the options file writeini -n dnd.ini options cc block writeini -n dnd.ini options showcc false writeini -n dnd.ini options showblocked false writeini -n dnd.ini options showaccepted true writeini -n dnd.ini options showunknown true writeini -n dnd.ini options blockunknown false writeini -n dnd.ini options echoactive true writeini -n dnd.ini options nickcolor 1 echo -s Loaded Do Not Disturb linesep -s } ;;;;;;;;;;;; ; on START ; ;;;;;;;;;;;; on *:start:{ ;; free and create hDnd hashtable if ($hget(hDnd)) hfree hDnd hmake hDnd ;; if dnd.dnd file exists, load allow/block hashtables if ($isfile(dnd.dnd)) hload -b hDnd dnd.dnd ;; check if %dnd exists, if it doesn't, set it on if (!$var(%dnd)) set %dnd on } ;;;;;;;;;;; ; on OPEN ; ;;;;;;;;;;; on ^*:OPEN:?:{ ;; check if it happens on QNet if (*.??.quakenet.org !iswm $server) || (%dnd == off) return ;; notice the user that his query is pending .notice $nick Query pending... ;; halt the default opening of the window haltdef ;; check for control codes -- this should block most porn spam if ($strip($1-) != $1-) && ($readini(dnd.ini,options,cc) == block) { dnd_echo Blocked query from $nick ( $+ $fulladdress $+ ) containing control codes $+ $iif($readini(dnd.ini,options,showcc) == true,: $1-,.) .notice $nick Query denied, message blocked. } ;; now it's time to check regular messages ;; first, the easy part -- check if the user has usermode +x and if so ;; use it to extract the Q auth if ($right($site,19) == .users.quakenet.org) { ;; $gettok($site,1,46) holds the users Q auth ;; if the user is allowed to message, notice the query is accepted and let the query window open if ($hget(hDnd,$gettok($site,1,46)) == allow) { dnd_echo Accepted query from $nick ( $+ $fulladdress $+ ) $+ $iif($readini(dnd.ini,options,showaccepted) == true,: $1-,.) if ($readini(dnd.ini,options,echoactive) == true) && (!$away) echo -ta �[ DND ]� Accepted query from $nick ( $+ $fulladdress $+ ) query -n $nick echo $nick $timestamp < $+ � $+ $readini(dnd.ini,options,nickcolor) $+ $nick $+ � $+ > $1- window -g[1] $nick .notice $nick Query accepted. } elseif ($hget(hDnd,$gettok($site,1,46)) == block) { dnd_echo Blocked query from $nick ( $+ $fulladdress $+ ) $+ $iif($readini(dnd.ini,options,showblocked) == true,: $1-,.) if ($readini(dnd.ini,options,echoactive) == true) && (!$away) echo -ta �[ DND ]� Blocked query from $nick ( $+ $fulladdress $+ ) .notice $nick Query denied, message blocked. } ;; if a user is unknown we let faith (read: options) decide whether to accept or decline else { if ($readini(dnd.ini,options,blockunknown) == true) { dnd_echo Denied query from $nick ( $+ $fulladdress $+ ) $+ $iif($readini(dnd.ini,options,showunknown) == true,: $1-,.) if ($readini(dnd.ini,options,echoactive) == true) && (!$away) echo -ta �[ DND ]� Denied query from $nick ( $+ $fulladdress $+ ) .notice $nick Query denied. } else { dnd_echo Accepted query from $nick ( $+ $fulladdress $+ ) $+ $iif($readini(dnd.ini,options,showaccepted) == true,: $1-,.) if ($readini(dnd.ini,options,echoactive) == true) && (!$away) echo -ta �[ DND ]� Accepted query from $nick ( $+ $fulladdress $+ ) query -n $nick echo $nick $timestamp < $+ � $+ $readini(dnd.ini,options,nickcolor) $+ $nick $+ � $+ > $1- window -g[1] $nick .notice $nick Query accepted. } } ;; closing if ($right($site,19) == .users.quakenet.org) } ;; if the user wasn't using usermode +x we store the message and send a who to the server ;; the query window remains closed so far, we can always open it later if the user is allowed to pm else { set %dndQueryAuth [ $+ [ $nick ] ] 1 set %dndQueryMessage [ $+ [ $nick ] ] $1- set %dndQueryFulladdress [ $+ [ $nick ] ] $fulladdress who $nick n%nat,990 } } ;;;;;;;;;;; ; RAW 354 ; ;;;;;;;;;;; ;; RAW 354 is the servers answer to the who request ;; reference 990 is used to make sure it came from the on OPEN event ;; if the user is authed with Q %dndQueryAuth [ $+ [ $nick ] ] is set to the auth, if he is not it remains 1 raw 354:& 990 & *: { set %dndQueryAuth [ $+ [ $3 ] ] $iif($4,$v1,1) halt } ;; reference 991 is used to make sure the raw reply comes from a menu request raw 354:& 991 & *:{ set %dndAddAuth [ $+ [ $3 ] ] $iif($4,$v1,1) halt } ;;;;;;;;;;; ; RAW 315 ; ;;;;;;;;;;; ;; unfortunately, raw 315 (End of /WHO list) does not have this reference raw 315:*:{ ;;;;;;;;;;;;;;;;; ; QUERY REQUEST ; ;;;;;;;;;;;;;;;;; if (%dndQueryAuth [ $+ [ $2 ] ]) { ;; if the user was authed if ($v1 != 1) { ;; run the same check as in the on OPEN event if ($hget(hDnd,%dndQueryAuth [ $+ [ $2 ] ]) == allow) { dnd_echo Accepted query from $2 ( $+ %dndQueryFulladdress [ $+ [ $2 ] ] $+ ) $+ $iif($readini(dnd.ini,options,showaccepted) == true,: %dndQueryMessage [ $+ [ $2 ] ],.) if ($readini(dnd.ini,options,echoactive) == true) && (!$away) echo -ta �[ DND ]� Accepted query from $2 ( $+ %dndQueryFulladdress [ $+ [ $2 ] ] $+ ) query -n $2 echo $2 $timestamp < $+ � $+ $readini(dnd.ini,options,nickcolor) $+ $2 $+ � $+ > %dndQueryMessage [ $+ [ $2 ] ] window -g[1] $2 .notice $2 Query accepted. } elseif ($hget(hDnd,%dndQueryAuth [ $+ [ $2 ] ]) == block) { dnd_echo Blocked query from $2 ( $+ %dndQueryFulladdress [ $+ [ $2 ] ] $+ ) $+ $iif($readini(dnd.ini,options,showblocked) == true,: %dndQueryMessage [ $+ [ $2 ] ],.) if ($readini(dnd.ini,options,echoactive) == true) && (!$away) echo -ta �[ DND ]� Blocked query from $2 ( $+ %dndQueryFulladdress [ $+ [ $2 ] ] $+ ) .notice $2 Query denied, message blocked. } ;; if a user is unknown we let faith (read: options) decide whether to accept or decline else { if ($readini(dnd.ini,options,blockunknown) == true) { dnd_echo Denied query from $2 ( $+ %dndQueryFulladdress [ $+ [ $2 ] ] $+ ) $+ $iif($readini(dnd.ini,options,showunknown) == true,: %dndQueryMessage [ $+ [ $2 ] ],.) if ($readini(dnd.ini,options,echoactive) == true) && (!$away) echo -ta �[ DND ]� Denied query from $2 ( $+ %dndQueryFulladdress [ $+ [ $2 ] ] $+ ) .notice $2 Query denied. } else { dnd_echo Accepted query from $2 ( $+ %dndQueryFulladdress [ $+ [ $2 ] ] $+ ) $+ $iif($readini(dnd.ini,options,showaccepted) == true,: %dndQueryMessage [ $+ [ $2 ] ],.) if ($readini(dnd.ini,options,echoactive) == true) && (!$away) echo -ta �[ DND ]� Accepted query from $2 ( $+ %dndQueryFulladdress [ $+ [ $2 ] ] $+ ) query -n $2 echo $2 $timestamp < $+ � $+ $readini(dnd.ini,options,nickcolor) $+ $2 $+ � $+ > %dndQueryMessage [ $+ [ $2 ] ] window -g[1] $2 .notice $2 Query accepted. } } } ;; if the user was not authed else { if ($readini(dnd.ini,options,blockunknown) == true) { dnd_echo Denied query from $2 ( $+ %dndQueryFulladdress [ $+ [ $2 ] ] $+ ) $+ $iif($readini(dnd.ini,options,showunknown) == true,: %dndQueryMessage [ $+ [ $2 ] ],.) if ($readini(dnd.ini,options,echoactive) == true) && (!$away) echo -ta �[ DND ]� Denied query from $2 ( $+ %dndQueryFulladdress [ $+ [ $2 ] ] $+ ) .notice $2 Query denied. } else { dnd_echo Accepted query from $2 ( $+ %dndQueryFulladdress [ $+ [ $2 ] ] $+ ) $+ $iif($readini(dnd.ini,options,showaccepted) == true,: %dndQueryMessage [ $+ [ $2 ] ],.) if ($readini(dnd.ini,options,echoactive) == true) && (!$away) echo -ta �[ DND ]� Accepted query from $2 ( $+ %dndQueryFulladdress [ $+ [ $2 ] ] $+ ) query -n $2 echo $2 $timestamp < $+ � $+ $readini(dnd.ini,options,nickcolor) $+ $2 $+ � $+ > %dndQueryMessage [ $+ [ $2 ] ] window -g[1] $2 .notice $2 Query accepted. } } unset %dndQueryAuth [ $+ [ $2 ] ] unset %dndQueryMessage [ $+ [ $2 ] ] unset %dndQueryFulladdress [ $+ [ $2 ] ] } ;;;;;;;;;;;; ; ADD USER ; ;;;;;;;;;;;; elseif (%dndAddAuth [ $+ [ $2 ] ]) { if ($v1 != 1) { if (%dndAddAction [ $+ [ $2 ] ] == remove) { hdel hDnd %dndAddAuth [ $+ [ $2 ] ] echo - $+ $iif($readini(dnd.ini,options,echoactive) == true,ta,s) �[ DND ]� Removed Q auth %dndAddAuth [ $+ [ $2 ] ] hsave -b hDnd dnd.dnd } else { hadd hDnd %dndAddAuth [ $+ [ $2 ] ] %dndAddAction [ $+ [ $2 ] ] hsave -b hDnd dnd.dnd echo - $+ $iif($readini(dnd.ini,options,echoactive) == true,ta,s) �[ DND ]� $iif(%dndAddAction [ $+ [ $2 ] ] == allow,Allowing,Blocking) queries from Q auth %dndAddAuth [ $+ [ $2 ] ] } } else echo - $+ $iif($readini(dnd.ini,options,echoactive) == true,ta,s) �[ DND ]� User not authed with Q. unset %dndAddAuth [ $+ [ $2 ] ] unset %dndAddAction [ $+ [ $2 ] ] } halt } ;;;;;;;;;;;;;;;;;;;;;;;;; PUBLIC ALIASES ;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; ; DND ; ;;;;;;; alias dnd { ;; syntax check ;; turn dnd on/off if ($regex($1-,/^(on|off)$/)) { set %dnd $regml(1) echo - $+ $iif($readini(dnd.ini,options,echoactive) == true,ta,s) �[ DND ]� Do Not Disturb turned $iif($regml(1) == on,on,off) } ;; allow/block a user elseif ($regex($1-,/^(allow|block)\s(\w+)$/)) { hadd hDnd $regml(2) $regml(1) hsave -b hDnd dnd.dnd echo - $+ $iif($readini(dnd.ini,options,echoactive) == true,ta,s) �[ DND ]� $iif($regml(1) == allow,Allowing,Blocking) queries from Q auth $regml(2) } ;; remove a user elseif ($regex($1-,/^remove\s(\w+)$/)) { hdel hDnd $regml(1) hsave -b hDnd dnd.dnd echo - $+ $iif($readini(dnd.ini,options,echoactive) == true,ta,s) �[ DND ]� Removed Q auth $regml(1) } ;; dialog elseif (!$0) { } ;; else the syntax is wrong -- output an error else echo -s * /dnd - Error: erronious syntax. } ;;;;;;;;;;;;;;;;;;;;;;;;; PRIVATE ALIASES ;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;; ; dnd_echo ; ;;;;;;;;;;;; alias -l dnd_echo { if (!$window(@AllScripts)) { window -hk0nx @AllScripts } echo @Allscripts � $+ $color(normal text) $+ $timestamp � $+ $color(info2 text) $+ $chr(91) DND $chr(93) � $+ $color(normal text) $+ $1- } ;;;;;;;;;;;;;;;;;;;;; ; dndMenuQueryAllow ; ;;;;;;;;;;;;;;;;;;;;; alias -l dndMenuQueryAllow { ;; check for mode +x if ($right($ial($1).host,19) == .users.quakenet.org) { ;; get Q auth from address and add it to hDnd hadd hDnd $gettok($ial($1).host,1,46) allow hsave -b hDnd dnd.dnd echo - $+ $iif($readini(dnd.ini,options,echoactive) == true,ta,s) �[ DND ]� Allowing queries from Q auth $gettok($ial($1).host,1,46) } ;; if the user did not have mode +x do a /WHO else { set %dndAddAuth [ $+ [ $1 ] ] 1 set %dndAddAction [ $+ [ $1 ] ] allow who $1 n%nat,991 } } ;;;;;;;;;;;;;;;;;;;;; ; dndMenuQueryBlock ; ;;;;;;;;;;;;;;;;;;;;; alias -l dndMenuQueryBlock { ;; check for mode +x if ($right($ial($1).host,19) == .users.quakenet.org) { ;; get Q auth from address and add it to hDnd hadd hDnd $gettok($ial($1).host,1,46) block hsave -b hDnd dnd.dnd echo - $+ $iif($readini(dnd.ini,options,echoactive) == true,ta,s) �[ DND ]� Blocking queries from Q auth $gettok($ial($1).host,1,46) } ;; if the user did not have mode +x do a /WHO else { set %dndAddAuth [ $+ [ $1 ] ] 1 set %dndAddAction [ $+ [ $1 ] ] block who $1 n%nat,991 } } ;;;;;;;;;;;;;;;;;;;;;; ; dndMenuQueryRemove ; ;;;;;;;;;;;;;;;;;;;;;; alias -l dndMenuQueryRemove { ;; check for mode +x if ($right($ial($1).host,19) == .users.quakenet.org) { ;; get Q auth from address and delete it from hDnd hdel hDnd $gettok($ial($1).host,1,46) hsave -b hDnd dnd.dnd echo - $+ $iif($readini(dnd.ini,options,echoactive) == true,ta,s) �[ DND ]� Removed Q auth $gettok($ial($1).host,1,46) } ;; if the user did not have mode +x do a /WHO else { set %dndAddAuth [ $+ [ $1 ] ] 1 set %dndAddAction [ $+ [ $1 ] ] remove who $1 n%nat,991 } } ;;;;; To prevent possible flooding, only 5 nicks will be allowed/blocked/removed at a time ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;; ; dndMenuNicklistAllow ; ;;;;;;;;;;;;;;;;;;;;;;;; alias -l dndMenuNicklistAllow { var %i = 1 while ($gettok($1-,%i,32)) { var %nick = $v1 ;; check for mode +x if ($right($ial(%nick).host,19) == .users.quakenet.org) { ;; get Q auth from address and add it to hDnd hadd hDnd $gettok($ial(%nick).host,1,46) allow hsave -b hDnd dnd.dnd echo - $+ $iif($readini(dnd.ini,options,echoactive) == true,ta,s) �[ DND ]� Allowing queries from Q auth $gettok($ial(%nick).host,1,46) } ;; if the user did not have mode +x do a /WHO else { set %dndAddAuth [ $+ [ %nick ] ] 1 set %dndAddAction [ $+ [ %nick ] ] allow who %nick n%nat,991 } inc %i } } ;;;;;;;;;;;;;;;;;;;;;;;; ; dndMenuNicklistBlock ; ;;;;;;;;;;;;;;;;;;;;;;;; alias -l dndMenuNicklistBlock { var %i = 1 while ($gettok($1-,%i,32)) { var %nick = $v1 ;; check for mode +x if ($right($ial(%nick).host,19) == .users.quakenet.org) { ;; get Q auth from address and add it to hDnd hadd hDnd $gettok($ial(%nick).host,1,46) block hsave -b hDnd dnd.dnd echo - $+ $iif($readini(dnd.ini,options,echoactive) == true,ta,s) �[ DND ]� Blocking queries from Q auth $gettok($ial(%nick).host,1,46) } ;; if the user did not have mode +x do a /WHO else { set %dndAddAuth [ $+ [ %nick ] ] 1 set %dndAddAction [ $+ [ %nick ] ] block who %nick n%nat,991 } inc %i } } ;;;;;;;;;;;;;;;;;;;;;;;;; ; dndMenuNicklistRemove ; ;;;;;;;;;;;;;;;;;;;;;;;;; alias -l dndMenuNicklistRemove { var %i = 1 while ($gettok($1-,%i,32)) { var %nick = $v1 ;; check for mode +x if ($right($ial(%nick).host,19) == .users.quakenet.org) { ;; get Q auth from address and add it to hDnd hdel hDnd $gettok($ial(%nick).host,1,46) hsave -b hDnd dnd.dnd echo - $+ $iif($readini(dnd.ini,options,echoactive) == true,ta,s) �[ DND ]� Removed Q auth $gettok($ial(%nick).host,1,46) } ;; if the user did not have mode +x do a /WHO else { set %dndAddAuth [ $+ [ %nick ] ] 1 set %dndAddAction [ $+ [ %nick ] ] Remove who %nick n%nat,991 } inc %i } } ;;;;;;;;;;;;;;;;;;;;;;;;; MENU ITEMS ;;;;;;;;;;;;;;;;;;;;;;;;; menu channel,status { - DnD $iif(%dnd == on,off,on):dnd $iif(%dnd == on,off,on) } menu query { - DnD .Allow:dndMenuQueryAllow $1 .Block:dndMenuQueryBlock $1 .Remove:dndMenuQueryRemove $1 } menu nicklist { - DnD .Allow:dndMenuNicklistAllow $snick(#,1) $snick(#,2) $snick(#,3) $snick(#,4) $snick(#,5) .Block:dndMenuNicklistBlock $snick(#,1) $snick(#,2) $snick(#,3) $snick(#,4) $snick(#,5) .Remove:dndMenuNicklistRemove $snick(#,1) $snick(#,2) $snick(#,3) $snick(#,4) $snick(#,5) }
This pm blocker will log some things to a hidden window called @AllScripts. To view/hide this window by pressing the F11 key add the following code to the script.
alias F11 { if ($window(@AllScripts).state == maximized) { window -n @AllScripts } elseif ($window(@AllScripts).state == hidden) { window -x @AllScripts } elseif ($window(@AllScripts).state == normal) { window -x @AllScripts } }