@q
@program wizlog.muf
1 9999 d
i

( wizlog.muf    v1.0    Jessy @ FurryMUCK    6/97

       Wizlog.muf allows wizards to edit and view a list stored on players.
       It's intended use is for recording administrative information, such
       as warnings about AUP violations.

 INSTALLATION:

       Port the program and set it Wizard. Link a global action with a
       name such as @wizlog or wizlog to it. Wizlog.muf requires lib-lmgr
       and a pmatch macro, both of which should be available on any
       established MUCK.

 USAGE:

   <cmd> <player> = <entry> .. Make a log entry for <player>
   <cmd> <player> ............ Display log for <player>
               <cmd> #clear <player> ..... Clear log for <player>


 Wizlog.muf may be freely ported. Please comment any changes.
)

(2345678901234567890123456789012345678901234567890123456789012345678901)

$include $lib/lmgr

$define Tell me @ swap notify $enddef

lvar ourArg         (* string: arg passed to command; may be modified *)
lvar ourPlayer                         (* dbref: player we're logging *)

: DoHelp  (  --  )                                (* show help screen *)

       " " Tell
       prog name " (#" prog intostr strcat ")" strcat Tell " " Tell

       "The wiz-only " command @ strcat
       " command allows wizards to record and view log entries for "
       "specific players." strcat Tell " " Tell

       "Syntax:" Tell " " Tell

       "  $command <player> = <entry> .... Make a log entry for <player>"
       command @ "$command" subst Tell
       "  $command <player> .............. View log entries for <player>"
       command @ "$command" subst Tell
       "  $command #clear <player> ....... Clear log for <player>"
       command @ "$command" subst Tell " " Tell
;

: DoAddListLine  ( s --  )    (* add a line to @/wizlog# on ourPlayer *)

 "@/wizlog" swap over ourPlayer @
       LMGR-GetCount 1 + 3 pick ourPlayer @
       LMGR-PutElem pop
;

: DoShowList  ( d s --  )               (* display list s on object d *)

 "@/wizlog" ourPlayer @ LMGR-GetList
       begin
         dup while
               swap Tell
               1 -
       repeat
       pop
       ">>  Done." Tell
;

: DoLogEntry  (  --  )       (* add an entry to specifed player's log *)

       me @ "W" flag? not if                           (* check permission *)
         ">>  Permission denied." Tell exit
       then

 ourArg @ dup "=" instr strcut strip ourArg !
       dup if
   strip dup strlen 1 - strcut pop strip
               .pmatch dup if                                     (* find player *)
     dup #-2 dbcmp if
                         ">>  Ambiguous. I'm not sure who you mean." Tell pop exit
                       else
                         ourPlayer !
                 then
               else
                 ">>  Player not found." Tell pop exit
               then
                                                     (* format entry *)
               "$me %D : " ourArg @ strcat
               me @ name "$me" subst
               systime timefmt dup ourArg !
               DoAddListLine                                       (* add to log *)
               ">>  " ourArg @ strcat Tell
               ">>  Entry created for $player"
               ourPlayer @ name "$player" subst Tell
       else
   DoHelp exit
       then
;

: DoShowLog  (  --  )                (* show log for specified player *)

       me @ "W" flag? not if                           (* check permission *)
         ">>  Permission denied." Tell exit
       then

 ourArg @ strip .pmatch                               (* find player *)
       dup if
   dup #-2 dbcmp if
                 ">>  Ambiguous. I'm not sure who you mean." Tell
               else
                 ourPlayer !                                         (* show log *)
                 ">>  WizLog entries for $player:"
                       ourPlayer @ name "$player" subst Tell
                       DoShowList
               then
       else
         ">>  Player not found." Tell
       then
;

: DoClear  ( s --  )                          (* clear log for player *)

       me @ "W" flag? not if                           (* check permission *)
         ">>  Permission denied." Tell exit
 then
                                                      (* find player *)
 ourArg @ dup " " instr strcut swap pop strip .pmatch
       dup if
   dup #-2 dbcmp if
                 ">>  Ambiguous. I'm not sure who you mean." Tell pop exit
               else
                 ourPlayer !
               then
       else
         ">>  Player not found." Tell pop exit
       then

       begin                                           (* get confirmation *)
         ">>  Please confirm: You wish to clear the wizlog for $player? (y/n)"
               ourPlayer @ name "$player" subst Tell
               read
                                                        (* clear log *)
               "yes" over stringpfx if
                 ourPlayer @ "@/wizlog#/" nextprop
                       begin
                         dup while
                               ourPlayer @ over nextprop
                               ourPlayer @ rot remove_prop
                       repeat
                       pop
                       ourPlayer @ "@/wizlog#" remove_prop
                       ">>  Log cleared for $player."
                       ourPlayer @ name "$player" subst Tell exit
               else
                 "no" swap stringpfx if
                         ">>  Aborted." Tell exit
                       else
                         ">>  Entry not understood." pop
                       then
               then
       repeat
;

: main

       "me" match me !                                 (* make sure I'm me *)

       dup if                                           (* parse and route *)
         ourArg !
       else
         DoHelp exit
       then

       "#help"  ourArg @ stringpfx if DoHelp  exit then
       ourArg @ dup " " instr strcut pop strip
       dup if
         "#clear" swap stringpfx if
           DoClear exit
         then
 then

       ourArg @ "=" instr if
         DoLogEntry
       else
         DoShowLog
       then
;