@q @program top10.muf 1 99999 d i ( top10.muf v1.0 Jessy @ FurryMUCK 11/99 A program with a very low usefulness to processor tics ratio: it outputs a list of the top 10 most often used Programs, Commands, and Players. INSTALLATION: Link a global action with a name such as 'top10' to this program. Top10.muf must be set at least M3. On a very large MUCK -- where it might not be a good idea to have it in the first place -- it may need to be set Wizard, to avoid max-instruction-count-exceeded errors. Top10.muf requires lib-sort. USE: Typing the command name lists the ten Programs, Commands, and Players with the highest usecount. Player objects set guest_player?:yes or _prefs/top10:no are not included in the count. Top10.muf may be freely ported. Please comment any changes. ) $include $lib/sort lvar ourCounter ! lvar ourPrograms lvar ourExits lvar ourPlayers : DoTops ( s -- ) (* show top 10 programs, commands, and players *) ">> Scanning dbase for Top $count..." ourCounter @ intostr "$count" subst .tell background (* go background... may take a while *) begin depth while pop repeat (* clear stack *) 0 (* put a counter on stack *) begin (* begin object scanning loop *) dup dbref dup dbtop dbcmp not while (* check: more objects to check? *) dup ok? if dup "_prefs/top10" getprop if pop 1 + continue then dup program? if (* record program use *) dup timestamps swap pop swap pop swap pop 2140000000 over - intostr "0000000000000000000" swap strcat dup strlen 12 - strcut swap pop prog "_programs/" rot strcat 4 pick name "(" strcat 4 rotate intostr strcat ")" strcat setprop else dup exit? if (* record command use *) dup timestamps swap pop swap pop swap pop 2140000000 over - intostr "0000000000000000000" swap strcat dup strlen 12 - strcut swap pop prog "_exits/" rot strcat 4 pick name dup ";" instr if dup ";" instr 1 - strcut pop then "(" strcat 4 rotate intostr strcat ")" strcat setprop else dup player? if (* record player use *) dup "guest_player?" getprop not if (* skip guests *) dup timestamps swap pop swap pop swap pop 2140000000 over - intostr "0000000000000000000" swap strcat dup strlen 12 - strcut swap pop prog "_players/" rot strcat 4 pick name "(" strcat 4 rotate intostr strcat ")" strcat setprop then then then then then pop 1 + repeat pop pop (* initialize a prop counter for each category *) prog "_programs/" nextprop ourPrograms ! prog "_exits/" nextprop ourExits ! prog "_players/" nextprop ourPlayers ! 1 me @ (* show header *) " Programs Commands Players" notify me @ " --------------------------------------------------" notify begin (* show top 10 of each category *) dup ourCounter @ <= while dup intostr ") " strcat 4 strcut pop ourPrograms @ " " smatch if " " else prog ourPrograms @ getpropstr strcat " " then strcat 28 strcut pop ourExits @ " " smatch if " " else prog ourExits @ getpropstr strcat " " then strcat 48 strcut pop ourPlayers @ " " smatch if " " else prog ourPlayers @ getpropstr then strcat me @ swap notify prog ourPrograms @ nextprop dup if ourPrograms ! else pop " " ourPrograms ! then prog ourExits @ nextprop dup if ourExits ! else pop " " ourExits ! then prog ourPlayers @ nextprop dup if ourPlayers ! else pop " " ourPlayers ! then 1 + repeat pop (* clear record props *) prog "_programs/" nextprop begin dup while prog over nextprop prog rot remove_prop repeat pop prog "_exits/" nextprop begin dup while prog over nextprop prog rot remove_prop repeat pop prog "_players/" nextprop begin dup while prog over nextprop prog rot remove_prop repeat pop ">> Done." .tell ; : main dup if atoi dup not if pop 10 then else 10 then ourCounter ! "me" match me ! DoTops ; . c q