Revision: 417
Author:
wid...@gmail.com
Date: Thu Nov 24 20:39:41 2011
Log: Jobs 6.5 release candidate
http://code.google.com/p/anomalyjobs/source/detail?r=417
Added:
/branches/Jobs 6/6.5
/branches/Jobs 6/6.5/CHANGELOG
/branches/Jobs 6/6.5/HOWTO
/branches/Jobs 6/6.5/README
/branches/Jobs 6/6.5/README.MUSH3
/branches/Jobs 6/6.5/README.PENN
/branches/Jobs 6/6.5/README.RHOST
/branches/Jobs 6/6.5/jhelp.txt
/branches/Jobs 6/6.5/jhelp_ansi.txt
/branches/Jobs 6/6.5/jobs-v6-5.patch.txt
/branches/Jobs 6/6.5/jobs-v6-5.txt
/branches/Jobs 6/6.5/license
/branches/Jobs 6/6.5/license/gpl-2.0.txt
/branches/Jobs 6/6.5/plugins
/branches/Jobs 6/6.5/plugins/colorsub.txt
/branches/Jobs 6/6.5/plugins/lcars.skin.txt
/branches/Jobs 6/6.5/plugins/penn-MXP.txt
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/CHANGELOG Thu Nov 24 20:39:41 2011
@@ -0,0 +1,141 @@
+
+CHANGELOG for Anomaly Jobs
+
+Version 6.5
+Bugfixes:
+- +jgroup/member wouldn't remove a member that lost access. Issue 160.
+- +jobs/select stack implementation was lowering max job capacity. Issue
158.
+
+New Features:
+- +job/nospam and +job/silence at global, bucket, and job level. Issue 155.
+
+Version 6.4
+Bugfixes:
+- JOBSELECT attributes weren't parsing &, |, and !. Issue 149.
+- +job/access wasn't giving access to those without jobs access. Issue 150.
+- +job/sumset was checking permissions on job rather than bucket. Issue
151.
+- +job/search wasn't handling multi-word arguments well. Issue 152.
+- Fixed incorrect +job/set error message. Issue 153.
+- Guests aren't forced to run commands they can't. Issue 154.
+
+Version 6.3
+New Features:
+- Players can suppress the system's @aconnect jobs listing. Issue 135.
+- Job Status levels can now be customized by game staff. Issue 138.
+- The +typo command now includes the dbref where it was used. Issue 139.
+- Players can configure whether to auto-untag jobs when read. Issue 143.
+- Commands now accept "me" as a valid player name. Issue 144.
+
+Bugfixes:
+- +job and +myjob listings made more efficient. Issue 141.
+
+Version 6.2
+
+New Features:
+- +job/access command offers more +job and +myjob access choices. Issue
128.
+- +jobs/catchup <expression> will catch up selected jobs. Issue 136.
+- +myjobs/catchup command. Issue 136.
+
+Bugfixes:
+- Tagging behavior made consistent and properly documented. Issue 128.
+- Finding jobs, buckets, and jgroups now prefer Things to Players. Issue
129.
+- New jobs with &JOBSN=1 weren't showing on some Penn games. Issue 130.
+- TRIG_CLEAN functionality expanded. Issue 131.
+- Read jobs and "new" jobs (/catchup) are now tracked separately. Issue
137.
+
+Version 6.1
+
+New Features:
+- Added a fourth argument to hooks, containing original text. Hooks can now
+ replicate/expand the functionality of PLETTERs and MLETTERs. Issue 109.
+- Expanded +jobs/select functionality. Issue 120.
+ - +jobs/select can now use &JOBSELECT aliases in its logic (one level
only).
+ - +jobs/select now takes a sort=<type> field to sort output.
+- +job/due can take additional time formats including time-from-now. Issue
123.
+- New +jobs/due command to sort jobs by due date.
+- New +job/undelete command for inadvertently deleted jobs. Issue 125.
+- New +jobs/from command for jobs opened by <player>. Issue 126.
+- New +myjob/last command similar to +job/last. Issue 110.
+
+Bugfixes:
+- Fixed STAT_ART installation bug on new MUX/TM3 installs. Issue 106.
+- Bargraphs can now handle input up to max integer values. Issue 111.
+- Bargraph heights now round properly. Issue 112.
+- Fixed FN_JGROUPMEMBERS bug affecting all non-Penn installs. Issue 115.
+- TRIG_CREATE now uses job DB instead of # for finding ALETTERS. Issue 116.
+- ALETTERS now use the bucket's permissions to evaluate. Issue 116.
+- Job capacity now respects buffer limits for lcon(). Issue 117.
+- Removed unused/legacy TRIG_DENY call. Issue 122.
+- due<= and due>= weren't working on Penn for empty DUE_ON attribute.
+
+Version 6.0
+
+Major changes:
+- Extended full compatibility to PennMUSH and RhostMUSH servers.
+ - Modified destruction behavior; Jobs will now remain GOING for one
minute
+ after closure in which they may be saved by +job/trans.
+ - Various other changes in functions, flags, @wait, null arguments,
+ integer division, and ansi.
+- Completed full implementation of TinyMUSH 3.1 compatibility.
+- +jobs/select command, allowing filtering of which jobs to display using
+ multiple criteria and logical combinations. Issue 62.
+- +jobs/checkout and /checkin support.
+- Added +jgroups - user groupings for assignment/tagging/source. Issue 22.
+- Added +myjob summaries so users can use +myjob/sumset. Issue 25.
+- Added +jobs/catchup to clear new job indication flags. Issue 91.
+- +jobs/clean command and associated cron-capable &TRIG_CLEAN to remove
+ non-players from jobs data. Issue 9.
+- Variable-width support using width() or user entered value. Issue 84.
+- Custom widths for the fields of the JOBS display attribute. Issue 84.
+- Added action locks to prevent certain actions on buckets. Issue 26.
+- Added BLETTER support, to allow for broadcast customization. Issue 60.
+- BBoards are now stored by dbref to survive board renumbering. Issue 102.
+
+Minor changes:
+- Job numbers and bucket names are now exactly matched. Issue 16.
+- Identify tagged users in jobs header. Issue 77.
+- Added total Job Actions to STATS and ACTIONS reports.
+- Added closure stats to +bucket/info. Issue 12.
+- +job/help <#> is now an alias for +bucket/help. Issue 69.
+- Some general myjob tweaks. Issue 21.
+- +myjobs now follows skinning rules. Issue 63.
+- New WHITEBG skin. Issue 28.
+- Numerous other small bugfixes and command standardization.
+- Removed redundant HOOK_APPROVE, HOOK_DENY, HOOK_COMPLETE, and
HOOK_DELETE. Issue 97.
+- Removed @restart and @startup code made obsolete with @wait rewrite.
Issue 100.
+- All bugfixes from Version 5.2 (never released, see below)
+
+Version 5.1
+- Removed '@trigger %vb/TRIG_APPROVE=%0,%#,%1,[get(%q0/TITLE)]' from the
+job/approve command. This is deprecated code left over from the Jobs 4
days. TRIG_ADD handles the TRIG_APR hook now.
+- Edited the BBoard configuration, making sure that POST_DELETE was set on
the Job Parent Object <JPO> and pointing to the Staff Job Tracker bulletin
board.
+- Fixed bracket matching and missed get() in +myjob/add command attribute.
+- Changed +myjob view command to use @dolist instead of iter(). This stop
the command from hitting buffer limits.
+- Made sure that flag setting on PUB occurred befor teleportation of the
PUB object into storage.
+- Updated the Version and Credits information.
+- Corrected @wait on final restart so it runs after final @pemit.
+- Fixed +job/sumset so that checks are in the correct order.
+- Udpated +job/set in jhelp.txt &commands2
+- Updated +myjob/view with missing @pemit.
+- More fixes and updates to +job/sumset.
+- Pulled out the tagged_for check on +myjob/add for two reasons. First,
the intent is unclear considering the code is buggy. Two, removing it makes
sure the job is only locked by +job/lock, making +myjob/add work like
+job/add.
+- Added Maintainer line to +job/credits.
+
+Version 5.2(release candidate; never released)
+- Updated the manage2 helpfile to correct the +job/set syntax.
+- Added +bucket/check with two entries in jhelp.txt. Issue 15.
+- Removed POST_COMPLETE from the REQ bucket. Issue 18.
+- Changed the @aconnect. Issue 20.
+- Moved most of the installation instructions from the install file into
the README files. 29.
+- Changed the install file name to remove version reference.
+- Formatted the install.
+- Fixed errors in CMD_JOB/DUE2. Issue 30.
+- Various @switch fixes. Isssues 45-47.
+- Fixed JOBS_NUM on install, was skipping job 2 until compressed. Issue 50.
+- Removed stray POST_COMPLETE on the REQ bucket hardcoded to +bboard 11.
Issue 51.
+- Fixed arguments for TRIG_APPLY. Issue 52.
+- One-character bucket name bargraph fix. Issue 53.
+- Fixed a FIL_NEWCOMMENT1 bug.
+- Fixed a CHROME_JOBLIST bug.
+- IS_LOCKED references changed to accept a second parameter (Checkin
support)
+- Conformed behavior of CHROME_BREAK
+- Various helpfile fixes.
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/HOWTO Thu Nov 24 20:39:41 2011
@@ -0,0 +1,226 @@
+Anomaly Jobs 6.5 HOWTO
+-----------------------------------------------------------------------------
+1. Introduction
+2. Integrating Commands with Jobs
+3. Enforcing workflow with hooks
+4. New command aliases
+5. New +job/select options - Red jobs
+6. Recycle bin for deleted jobs
+7. Working around buffer limits and max jobs.
+
+
+1. Introduction
+-----------------------------------------------------------------------------
+This file gives more in-depth examples of integrating Jobs with your game,
+including more complex custom code you might use to customize behavior.
+It is assumed you have already read the README file and appropriate
sections
+of the help files.
+
+If you have custom +jobs additions that you would like to include in this
file
+as an example for other users, please feel free to submit them as an
attachment
+to a new issue at
http://code.google.com/p/anomalyjobs
+
+
+
+2. Integrating Commands with Jobs
+-----------------------------------------------------------------------------
+As noted in the README file, the <Job Database> already includes a quick
+shortcut to add a job to the APPS bucket. The intent is for this to be
+included as a portion of the player's submission process, e.g.,
+
+&CMD_SUBMIT Application Object=$+submit:
+ @pemit %#=You submit your application.;
+ <actions to lock the player's background, etc.>;
+ @trigger <Job Database>/TRIG_APPLY=%#
+
+To adapt other commands to create a job, you can look at TRIG_APPLY to see
+that it's just a preformatted call to TRIG_CREATE:
+
+&TRIG_APPLY Job Database=
+ @trigger %va/TRIG_CREATE=%0,[locate(%vc,APPS,i)],2,Application by
[name(%0)]
+
+Let's assume you have an area where players can request a room to build
with.
+They fill out appropriate information on an "application" type object and
then
+type +submit:
+
+&CMD_SUBMIT BuildRequest Object=$+submit:
+ @pemit %#=You submit your building request.;
+ @trigger %va/TRIG_CREATE=
+ %0,[locate(%vc,BUILD,i)],2,Build request by [name(%0)]
+
+Consult +jhelp TRIG_CREATE to see how you might add more to this.
+
+
+
+3. Enforcing workflow with hooks, triggers, and checkout
+-----------------------------------------------------------------------------
+Continuing the above example, the below is a workflow system actually used
on
+a MUSH running Jobs 6.0:
+
+a) Player requests a build project via a build tracker. This creates a
BUILD
+job and &PROJECT-%# attribute with other information.
+
+b) HOOK_CRE on the BUILD bucket interfaces with a Building Tracker code
object
+based on the zone the player is building in. This stores the job db# on the
+Building Tracker, stores the building Zone on the job, and also checks out
+the job to the Building Tracker:
+&HOOK_CRE BUILD=
+ &JOB-%1 <Building Tracker DB#>=%0;
+ &ZONE <job DB#>=<Building Zone>;
+ &CHECKOUT <job DB#>=<Building Tracker DB#> [secs()];
+
+The checkout prevents the job from being altered outside the Building
Tracker.
+Building tracker code permits adding comments to the job by having the
Tracker
+itself execute +job/add #=<text>.
+
+c) Staff reviews the job and sets up the project as needed with the
Building
+Tracker code. They set a builder, an amount of quota, etc., and then
finalize
+the project. Using JOB-<player>, the Tracker clears the &CHECKOUT
attribute
+on the job. Staff then /approves the job.
+
+d) HOOK_APR triggers a command list that actually pcreates the builder,
+sets its quota, and digs an initial room in the building nexus for the
project.
+The MLETTER_APR gives the player appropriate information to build.
+
+e) The Builder builds their project and submits it for approval. This
creates
+a new job, again checked out to the Building Tracker. Build staff can check
+the project to make sure appropriate attributes are set. Once the staffer
+has reviewed the build, they set a link location, and finalize the build.
+The finalize function removes the checkout.
+
+f) The builder finally approves the job, and the HOOK_APR links it to the
grid.
+
+
+
+4. New command aliases
+-----------------------------------------------------------------------------
+The +jobs/select command is a powerful filtering and sorting tool that can
+replicate the functionality of most of the +jobs/<switch> commands. In
fact,
+most of them are just aliases to the appropriate +jobs/select equivalent.
For
+example:
+ &CMD_JOBS/OVERDUE <JGO>=$+jobs/overdue:@fo %#=+jobs/select overdue
+ &CMD_JOBS/PRI <JGO>=$+jobs/pri:@fo %#=+jobs/select all sort=pri
+
+The &JOBSELECT attribute allows individual players to create their own
custom
+aliases/replacements for jobs commands. To create a permanent global
alias,
+just make a similar command:
+
+ &CMD_JOBS/TRIAGE <JGO>=$+jobs/triage:
+ @fo %#=+jobs/select (overdue & who=none) | mine | new
+
+
+
+5. New +job/select options - Red jobs, more buildercode
+-----------------------------------------------------------------------------
+Valid options in +job/select are not hardcoded; rather, the code simply
checks
+for a &SEL_<option> attribute on the Job Database <JD> object. These are
used
+with filter(), and should return a 1 or 0. (In fact, many of them simply
call
+an existing &FIL_<option> filter.)
+
+There has been some debate on whether +jobs/select pri=red should return
+overdue jobs, or just those with an actual red priority set. The latter
option
+was chosen, but some players/games would still like to treat overdue jobs
as
+red. There are three ways of going about this:
+
+a) Individual players can just define:
+ &JOBSELECT_RED me=pri=red or overdue
+This would allow that player to use "+jobs/select red" (or an expression
using
+red) to get overdue or red priority jobs.
+
+b) The game can create a &CMD_JOBS/RED <JGO> which @forces a player to run
+"+jobs/select pri=red or overdue". This will not allow it to be combined
with
+other +jobs/select options, however.
+
+c) A new "red" selection can be created, so "+jobs/select red" (or an
+expression) will return the appropriate "red" jobs. To do this, just
define
+&SEL_RED to return 1 for both situations:
+ &SEL_RED Job Database <JD>=
+ or(u(%va/FIL_OVERDUE,%0),u(%va/FIL_ESC,%0,3))
+
+For a different application, we'll return to the builder code example
above.
+Assume there are two zones: housing (dbref #123) and apartments (dbref
#234).
+The A register is used if a job selection parameter uses an = sign, such as
++jobs/select zone=housing (housing is stored in %qA). So:
+ &SEL_ZONE Job Database <JD>=
+ eq(
+ match(#123 #234 #-1,default(%0/zone,#-1)),
+ match(housing apartments,%qa*)
+ )
+
+6. Recycle bin for deleted jobs
+-----------------------------------------------------------------------------
+It is an unfortunately common occurrence that a staffer will
approve/complete
+the wrong job. While the default behavior keeps jobs from being
permanently
+deleted for 60 seconds (hopefully long enough to type +job/undelete) it is
+possible to instead send jobs to a recycle "bucket" on completion, removing
+the time pressure and permitting a certain number of jobs to sit in that
bin.
+
+The below hook for job approval clears the GOING attribute, preventing it
+from destruction, re-parents the job effectively /trans-ing it to the
+Rescue and Review <RAR> bucket. The count of 5 children keeps the 5 last
+deleted jobs, permanently deleting older ones.
+
+Substitute <RAR> in the below code with the RAR bucket dbref.
+
+&HOOK_APR <Bucket Parent>=
+ &GOING %0;
+ @parent %0=<RAR>;
+ @switch gt(words(children(<RAR>)),5)=1,{
+ @nuke [first(children(<RAR>))];
+ &GOING [first(children(<RAR>))]=1
+ }
+
+Make an identical one for HOOK_COM, HOOK_DNY, and HOOK_DEL. You may want
+to also set up separate hooks or other permissions for the RAR bucket.
+
+7. Working around buffer limits and max jobs.
+-----------------------------------------------------------------------------
+While the Job Database Object's MAX_JOBS attributes provides a softcode
limit
+to jobs in the system, the actual maximum number of jobs is limited by
buffer
+size, particularly for the many calls to lcon(%va). On a large RhostMUSH
game
+with 5-digit DBREFs (taking 7 bytes per job in a list) and a 4000-byte
byffer,
+the lcon() can fill up with as few as 571 jobs. There are a few
strategies to
+attempt to work around this issue.
+
+a. Parallel +jobs install
+
+It is possible to clone all the jobs objects and change the commands in
order
+to maintain a separate pile of jobs. For example, player +requests could
go
+to the usual +jobs system, and code/build projects could be managed in a
++wizjobs system. Hooks could be used to move jobs between systems if
needed.
+
+b. Multiple job database objects
+
+Similar to (a) but using only one set of jobs commands, jobs could be
stored
+in the usual job database object, or selected jobs could be stored in
another
+object. All the job listing commands could operate on each lcon() list
+sequentially, with the final list combined for output.
+
+c. Compressing the lcon()
+
+By removing the # and using pack() to convert dbrefs to base 64, dbrefs
below
+#262144 would use only 3 digits and permit at least 1000 jobs to be listed.
+The below function would generate a "compressed" lcon() of up to MAX_JOBS
+items:
+
+&FUN_PACKLCON JDO=
+ if(isdbref(setr(a,con(%va))),
+ strcat(
+ setq(b,pack(after(%qa,#))),
+ null(iter(repeat(.%B,get(%va/MAX_JOBS)),
+ switch(setr(a,next(%qa)),
+ #-1,ibreak(),
+ setq(b,cat(%qb,pack(after(%qa,#))))
+ )
+ )),
+ %qb
+ )
+ )
+
+The packed dbref would be passed to the various filters and sorting
functions,
+which would then use strcat(#,unpack(%0)) to restore the full dbref.
Required
+functions to unpack include all the &SORTBY_* and &SEL_* functions, except
+those which call &FIL_* attributes to do the real work (put the unpack in
the
+&FIL). It's a little more work up-front than the other approaches, and
causes
+a few more function invocations, but allows the existing jobs functions to
+work transparently to users.
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/README Thu Nov 24 20:39:41 2011
@@ -0,0 +1,243 @@
+Anomaly Jobs
+-----------------------------------------------------------------------------
+Superior Task Tracking Technology
+Version 6.5
+
+Written by: Starfleet @ Anomaly
+Maintained by: Minion @ Crossroads
+Contributors: Firestorm @ Ephemera (+myjobs, /tags)
+ Halmar @ Gamma One (Past maintainer, Rhost Compat contribs)
+ Ian @ MUX (Pies)
+ Javelin @ PennMUSH (Penn Compat contribs)
+ Minion @ Crossroads (+jobs/select, +jgroups, full compat
fixes)
+Testers: nails @ MUSHpark
+ Sunshine @ Ashes To Ashes
+ Centauri & Pyxis @ Rise From Chaos
+ Minion & Duke @ Outremer
+
+Platforms supported: MUX 2.x, TinyMUSH 3.1, PennMUSH 1.8.2, RhostMUSH
+
+Requirements: Myrddin's BBS, @mail system.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+
+
+Anomaly Jobs 6.5
+-----------------------------------------------------------------------------
+1. Installing Anomaly Jobs 6.5
+2. Buckets
+3. Getting Help
+4. Integrating Applications with Jobs
+5. +job/log - Log File
+6. Automatic Logging
+7. Max Jobs
+8. Automatic Assignment
+9. Access Configuration
+10. Staff Checks
+
+
+
+1. Installing Anomaly Jobs 6.5
+-----------------------------------------------------------------------------
+Installing Jobs 6.5 is fairly straight forward. You quote the install file
to
+your game and the install is automated. However, before you install it read
+the README and the README.<dist> file for your server for any notes, and
+read the install file notes for behavioral changes you might wish to make.
+
+ IMPORTANT!
+
+ * You should install this with a Wizard character, preferably in an
+ account that is not regularly logged into, as the code creates and
+ destroys objects dynamically. This can get spammy.
+
+ * Do not rename your jobs objects. Patch and plugin scripts depend on
+ these names in order to function.
+
+ * You must install using a timed delay. Most clients have an upload-
+ with-delay option. A delay of at least one second is recommended.
+
+ * Be patient. The install script will tell you when it is finished.
+ Don't try to do anything until install is complete.
+
+This code REQUIRES Myrddin's BBS to be installed, as it uses the BBS to
post
+completed/approved/denied jobs to. So long as your BBS is unmodified it
should
+work without problems. There is no need to configure the BBS or create any
+bboards, as it will work its magic automatically. It will automatically
set up
+two BBS boards to use with the system - a public read-only BBS for
game-wide
+progress tracking, and a private, staff-only board for privately tracking
+player requests and other issues.
+
+It also requires hardcoded @mail at this time. The jobs system owner is
+excluded from mailings in the default setup.
+
+This script requires no modification so long as used on the servers listed
+above and you want the behavior to be for staff-only.
+
+If upgrading from a 5.0 install and you have the HOOK_APPROVE, HOOK_DENY,
+HOOK_COMPLETE, or HOOK_DELETE attributes set on your Job Parent Object or
any
+buckets, move these hooks to HOOK_APR, HOOK_DNY, HOOK_COM, and HOOK_DEL,
+respectively. The previous versions were unintentionally redundant in 5.x
and
+will no longer be triggered in Jobs 6. The script will notify you if it
finds
+these outdated hooks.
+
+In addition to quoting the script, you will need to install the help file
on
+your server. Two similar files are provided: jhelp.txt is designed to be
+evaluated (e.g., using "helpfile" in MUX or the textentries() and
textfile()
+functions in PennMUSH) while jhelp_ansi.txt is already preprocessed with
ANSI
+sequences, suitable for "helpfile" in PennMUSH or "raw_helpfile" in MUX.
+
+2. Buckets
+-----------------------------------------------------------------------------
+Jobs are stored in buckets, which is a method of organization that keeps
jobs
+sorted in their proper locations. Jobs are parented to its bucket, allowing
+the bucket settings to cascade down to job level.
+
+The system has several buckets already installed, but you may wish to add
more.
+You can add buckets with the +bucket/add command (see the +help files).
+
+ADMIN General Administration issues.
+APPS Player Applications
+BUILD Building issues and typos (Required bucket).
+CGEN Character Generation issues.
+CODE For coding issues and bug reports (Required bucket).
+FEEP A hidden bucket for creeping features aka feeping creatures.
+FORUM A discussion forum.
+PITCH Plot and game idea pitches (Required bucket).
+PUB Public jobs (Jobs in bucket appear in everyone's +myjobs list).
+QUERY Player queries (Required bucket).
+REQ Player requests (Required bucket).
+RP Hidden bucket for storing future plots.
+TECH Technology issues, such as weapon object distribution, etc.
+THEME Game thematic issues.
+TPS Currently running plots.
+
+A bucket name is 1-5 letters long. WoD games might want to add VAMP, GAROU,
+MAGE, FAE, etc.
+
+The BUILD, CODE, PITCH, QUERY, and REQ buckets are associated with commands
+and should not be deleted; APPS is associated with TRIG_APPLY and should
not
+be deleted if you use that trigger. Other buckets may be removed if
desired.
+
+
+
+3. Getting Help
+-----------------------------------------------------------------------------
+The primary location to get help and report bugs for Jobs 6 is the google
+code site at
http://code.google.com/p/anomalyjobs/
+
+
+
+4. Integrating Applications with Jobs
+-----------------------------------------------------------------------------
+As an optional feature, you can post character application information to
the
++jobs board, and have your approval queue attached to the board. However,
+you must provide your own @trigger for TRIG_APPLY on the database object,
run
+when a new player finished character generation. This trigger puts a
character
+application into the Jobs system. To add this functionality to your game,
you
+must add the following code to your 'please approve me' command:
+
+ @trigger <Job Database>/TRIG_APPLY=<player DB# to be approved>
+
+To change the information presented to player upon application submission,
+see the APPS bucket setup. You can use the HOOK_APR on the APPS bucket to
+take action upon application approval.
+
+
+
+5. +job/log - Log File
+-----------------------------------------------------------------------------
+The LOGFILE attribute is the base name of the log file. On MUX and
RhostMUSH,
+you can change the log file for each bucket (or the default on the Job
+Parent Object) with the LOGFILE attribute.
+
+The two default <logfiles> are 'reqlog' (for all player +requests) and
+'joblog' (for all other buckets). Logs are directed to:
+
+MUX: /game/logs/M-<logfile>.log (Note 1)
+RhostMUSH: /game/<logfile>_manual.log (Note 2)
+TinyMUSH: /game/netmush.log
+PennMUSH: /game/log/command.log
+
+Note 1: This file must exist, or logging will fail. To create an empty
file,
+navigate to the /game/logs directory on the server and "touch
M-joblog.log".
+
+Note 2: RhostMUSH permits subdirectories defined as part of the
logfilename.
+
+
+
+6. Automatic Logging
+-----------------------------------------------------------------------------
+Add the following to your system if you wish automatic logging:
+
+&HOOK_APR Job Parent Object <JPO>=@trigger [v(VA)]/TRIG_LOG=%0,[v(VA)]
+&HOOK_DEL Job Parent Object <JPO>=@trigger [v(VA)]/TRIG_LOG=%0,[v(VA)]
+&HOOK_DNY Job Parent Object <JPO>=@trigger [v(VA)]/TRIG_LOG=%0,[v(VA)]
+&HOOK_COM Job Parent Object <JPO>=@trigger [v(VA)]/TRIG_LOG=%0,[v(VA)]
+
+
+
+7. Max Jobs
+-----------------------------------------------------------------------------
+This attribute controls how many jobs are allowed in the system
+before it halts new job creation. Try to keep this number
+reasonable based on your game's size. A small game can stick with
+200. Larger games may have to boost the number. However, keep in
+mind that boosting it also decreases security, as twinks can
+potentially spam the system through spurious job creation.
+
+Setting this to 0 or a very large number will cause jobs to be limited
+by the system based on buffer size.
+
+&MAX_JOBS Job Database <JD>=200
+
+
+
+8. Automatic Assignment
+-----------------------------------------------------------------------------
+If you would like jobs to automatically assign a job to the
+person who invoked +job/create, then set the following:
+
+&HOOK_CRE Job Parent Object <JPO>=&ASSIGNED_TO %0=%1
+
+For automatic assignment of jobs created other than with +job/create, use:
+
+&HOOK_OTH <JPO or bucket>=&ASSIGNED_TO %0=<player or jgroup dbref>
+
+
+
+9. Access Configuration
+-----------------------------------------------------------------------------
+The following attributes are located on the Jobs Database object and may be
+modified to configure access to the system.
+
+HAS_ACCESS : Return 1 if player can access the +jobs code.
+ADD_ACCESS : Return 1 if player can /add to jobs.
+APPROVE_ACCESS : Return 1 if player can /approve jobs.
+COMPLETE_ACCESS : Return 1 if player can /complete jobs.
+CREATE_ACCESS : Return 1 if player can /create jobs.
+DENY_ACCESS : Return 1 if player can /deny jobs.
+EDIT_ACCESS : Return 1 if player can edit a job.
+GIVE_ACCESS : Return 1 if player can +bucket/access.
+LOG_ACCESS : Return 1 if player can /log a job.
+MAIL_ACCESS : Return 1 if player can /mail regarding a job.
+STATS_ACCESS : Return 1 if player can get reports.
+CONFIG_ACCESS : Return 1 if player can use /sumset.
+
+
+10. Staff Checks
+-----------------------------------------------------------------------------
+The following ufuncs on the Jobs Database are used to check if a player is
+staff. They are tailored to each codebase.
+
+FN_WIZONLY : Return 1 if the player is a wizard or equivalent.
+FN_STAFFALL : Return 1 if the player is a wizard or royalty, or
equivalent.
+
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/README.MUSH3 Thu Nov 24 20:39:41 2011
@@ -0,0 +1,17 @@
+TinyMUSH notes
+
+Anomaly Jobs should be installed as described in the README, with
+the following notes/tweaks:
+
+1.1. On MUSH 3 installations, attribute limits have been cut to 4k due to
+ possible corruption issues of attributes over 4096 bytes in size (a
GDBM
+ database issue, not an issue with Anomaly Jobs). Some debate exists on
+ this point, but rather to be safe than sorry, we've installed a buffer
+ limit for 4k on MUSH 3 and 8k on other servers. If you use a MUSH 3
+ install, we do not recommend that you change the buffer limit (on the
+ Database object as BUFFER), but it can be done if you are sure you
won't
+ have creeping data death. Modify at your own risk.
+
+
+1.2. At present, TinyMUSH does not support logging to arbitrarily-named
+ logfiles. Log functionality is presently directed to netmush.log.
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/README.PENN Thu Nov 24 20:39:41 2011
@@ -0,0 +1,28 @@
+PennMUSH notes
+
+Anomaly Jobs should be installed as described in the README, with
+the following notes/tweaks:
+
+1.1. The Wizard installing Jobs should be set NO_PAY or given
+ a lot of money to perform the installation.
+
+1.2. Since only a Wizard can set the Wizard flag on their own objects,
+ install this from the Wizard character intended to own the code
+ objects, which ideally should not be a frequently used account.
+
+1.3. The default function_invocation_limit of 2500 from older installs
+ may be reached on many +jobs/reports. A value of 25000 is recommended
+ and is the default on newer installs.
+
+1.4. The DAILY attribute on the Job Parent Object <JPO> needs to
+ be triggered on a daily basis, using whatever softcoded cron
+ system you have available.
+
+1.5. PennMUSH does not save @attribute/access changes across reboots.
+ The @attribute/access changes recommended at the end of the install
+ should be done /retroactive and then added to the @startup sequence
+ of a wizard or wizard-flagged object.
+
+1.6. At present, PennMUSH does not support logging to arbitrarily-named
+ logfiles. Log functionality is presently directed to command.log.
+
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/README.RHOST Thu Nov 24 20:39:41 2011
@@ -0,0 +1,33 @@
+RhostMUSH notes
+
+Anomaly Jobs should be installed as described in the README, with
+the following notes/tweaks:
+
+1.1. The Wizard installing Jobs should be set SIDEFX in order to use
+ the create() functions during install. If desired, SIDEFX can be
+ removed after the objects are created and their DBREF #s stored.
+
+1.2. The default function_invocation_limit of 2500 from older installs
+ may be reached on many +jobs/reports. A value of 25000 is recommended
+ and is the default on newer installs.
+
+1.3. The DAILY attribute on the Job Parent Object <JPO> needs to
+ be triggered on a daily basis, using whatever softcoded cron
+ system you have available, or a @daily emulator.
+
+1.4. The mail syntax on the Job Database's &TRIG_MAIL assumes that the user
+ has not @toggled on alternate mail syntax.
+
+1.5. @dest does not permanently delete objects in Rhost. Use @purge
+ periodically to remove old objects.
+
+1.6. Rhost has a hardcode limitation of 2000 sent @mails. On a large game,
+ job status updates may accumulate in staffers mailboxes. To work
around
+ this, the Job Tracker should force players to @mail themselves. The
+ following code can accomplish this and should be put on the Job
Tracker
+ (%VB) object in place of the existing &TRIG_MAIL attribute:
+
+ @dolist [remove( %0, - )]={@force ##={
+ mail/send ##=[lit(%1)]/[ifelse( hastoggle( ##, PENN_MAIL ), , /
)][lit(%2)]
+ } }
+
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/jhelp.txt Thu Nov 24 20:39:41 2011
@@ -0,0 +1,1855 @@
+& help
+ Anomaly Jobs v6.5
+
+ Anomaly Jobs is a feature-rich task-tracker.
+
+ Topic Description
Updated
+
----------------------------------------------------------------------------
+ buckets How to manage buckets.
06Jan30
+ complete How to complete and follow-through on +jobs.
06Jan30
+ config How to configure Anomaly Jobs.
10Jan08
+ commands A list of commands at-a-glance. No details.
10Jan23
+ create How to create +jobs and how users can create them.
06Jan30
+ credits The credits to Anomaly Jobs.
06Jan30
+ jgroups How to manage jgroups (player lists).
10Jan08
+ list Viewing the +jobs list.
06Jan30
+ player Player commands.
06Jan30
+ publication Job publication and player visibility.
06Jan30
+ manage Managing your +jobs board.
10Jan08
+ reports Getting statistics on the system.
06Jan30
+ tagging Tagging jobs for yourself and others.
06Jan30
+
+ Type '+jhelp <Topic>' for more.
+& player
+ Player Commands
+
+ Topic Description
Updated
+
----------------------------------------------------------------------------
+ bug How to submit a bug report.
06Jan30
+ myjobs How players keep track of their issues.
06Jan30
+ pitch How players submit ideas to the game.
06Jan30
+ request How players submit a need to staff.
06Jan30
+ typo How to submit a typo report.
06Jan30
+
+ Type '+jhelp <Topic>' for more.
+& config
+ Config Menu
+
+ Sub Topic Description
Updated
+
----------------------------------------------------------------------------
+ access Access parameters to the Jobs system.
06Jan30
+ aaccess Setting bucket action permission.
10Jan08
+ advanced Advanced configuration.
06Jan30
+ baccess Setting bucket access parameters.
06Jan30
+ bconfig Basic bucket configuration.
06Jan30
+ logging How to set up job logging.
06Jan30
+ uconfig How to configure your personal jobs experience.
10Jan08
+
+ Type '+jhelp <Topic>' for more.
+& advanced
+ Advanced Configuration Menu
+
+ Topic Description
Updated
+
----------------------------------------------------------------------------
+ hooks How to set up action hooks.
06Jan30
+ letters How to mail / bbpost / set automatic job comments.
06Jan30
+ codes A list of default action codes.
06Jan30
+ summary How to set up a Bucket Summary
06Jan30
+ sumsetting How to configure /sumset parameters.
06Jan30
+ trig_add The 'add-to-job' trigger.
06Jan30
+ trig_create The job-creation trigger.
10Jan08
+
+ Type '+jhelp <Topic>' for more.
+& letters
+
+ Anomaly Jobs supports four types of form letters:
+
+ Topic Description
Updated
+
----------------------------------------------------------------------------
+ aletter Addition letters - formatting an added comment.
06Jan30
+ bletter Broadcast letters - formatting broadcast messages.
10Jan08
+ mletter Mail letters - sent to the OPENED_BY list.
06Jan30
+ pletter Post letters - posting a letter to the BBS.
06Jan30
+
+ Type '+jhelp <Topic>' for more.
+& jobs
+
+ [ansi(h,+jobs)]
+
+ This command will invoke the 'main' jobs list. It displays all jobs that
+ you have access to and are presently monitoring. You can tailor this list
+ in several ways: +bucket/monitor will toggle whether or not you are
viewing
+ a particular bucket, the list can be altered to display job information
you
+ want (see 'uconfig').
+& jobs/all
+
+ [ansi(h,+jobs/all)]
+
+ This command behaves exactly like '+jobs' (and can be tailored to your
own
+ tastes, see 'uconfig'), except it does it for all buckets that you have
+ access to.
+& jobs/mine
+
+ [ansi(h,+jobs/mine)]
+
+ This command lists just those jobs that have been assigned to you.
+& jobs/pri
+
+ [ansi(h,+jobs/pri)]
+
+ This sorts all jobs by escalation code, red at top, then yellow, then
green.
+ Note that any jobs that have gone into OVERDUE status are not sorted
as 'red'
+ to keep sorting sane.
+& jobs/clean
+
+ [ansi(h,+jobs/clean)]
+
+ This command will remove all non-players from job entries.
+
+ A &TRIG_CLEAN trigger is provided on the Jobs Database object which may
be
+ called from autonuke code or hooked to @nuke / @dest to execute this
function
+ automatically.
+& jobs/compress
+
+ [ansi(h,+jobs/compress)]
+
+ This command will rename all Job Objects, 1 to X, and then set the next
+ job # to be X+1. This is useful if your jobs start running into less
+ convenient numbers to type, and can be used to correct errors in the job
+ numbering. It is wizard-only.
+& jobs/credits
+
+ [ansi(h,+jobs/credits)]
+
+ Roll the credits.
+& jobs/from
+
+ [ansi(h,+jobs/from <player>)]
+
+ This command will list all jobs opened by <player>.
+& jobs/list
+
+ [ansi(h,+jobs/list <bucket>)]
+
+ This command will list all jobs in <bucket>.
+& jobs/silence
+& job/silence
+
+ [ansi(h,+jobs/silence)]
+ [ansi(h,+jobs/silence <bucket>)]
+ [ansi(h,+job/silence <job #>)]
+
+ These commands will toggle appropriate attributes to suppress broadcasts
+ sent to those monitoring buckets. Without an argument, the commands
+ toggle the player's &JOBS_SILENCE attribute which (globally) suppresses
+ these broadcasts. Suppression can be applied at the bucket level and at
+ the job level.
+& jobs/nospam
+& job/nospam
+& myjobs/nospam
+& myjob/nospam
+
+Staff:
+ [ansi(h,+jobs/nospam)]
+ [ansi(h,+jobs/nospam <bucket>)]
+ [ansi(h,+job/nospam <job #>)]
+
+Players:
+ [ansi(h,+myjobs/nospam)]
+ [ansi(h,+myjob/nospam <job #>)]
+
+ These commands will toggle appropriate attributes to suppress the
automatic
+ @mails sent to the originator of a job. Without an argument, the commands
+ toggle the player's &JOBS_NOSPAM attribute which (globally) suppresses
+ these @mails. Suppression can be applied at the bucket level for staff,
+ and at the job level for everyone.
+& jobs/overdue
+
+ [ansi(h,+jobs/overdue)]
+
+ This command works exactly like '+jobs', except that it only displays
those
+ jobs that are overdue.
+& jobs/reports
+
+ [ansi(h,+jobs/reports %[<report>%])]
+
+ Without <report>, this command displays a list of available job reports.
If
+ <report> is supplied, then that report is displayed. Some reports take
+ additional input, such as ACTBY, for example:
+
+ +jobs/reports actby=add
+
+ This will run a report on all ADD actions across all buckets.
+& jobs/search
+
+ [ansi(h,+jobs/search <pattern>)]
+
+ This will search all jobs for <pattern> and return a list of jobs that
+ have that pattern. It will search the entire object, not necessarily
comments
+ that the player has access to.
+& jobs/select
+
+ [ansi(h,+jobs/select <expression>)]
+
+ In the simplest cases, +jobs/select <text> returns the same list of jobs
+ as the equivalent +jobs/<text> command, such as:
+ +jobs/select all (same as +jobs/all)
+ +jobs/select new (same as +jobs/new)
+ +jobs/select mine (same as +jobs/mine)
+ +jobs/select overdue (same as +jobs/overdue)
+ +jobs/select who=none (same as +jobs/who none)
+
+ However, the +jobs/select command's power is in returning lists of jobs
+ that meet multiple criteria. For example, the command:
+ +jobs/select new or mine
+ would return a list of jobs that appeared in either the +jobs/new OR the
+ +jobs/mine lists. Similarly:
+ +jobs/select new and mine
+ would return a list of jobs that appeared in both +jobs/new AND
+jobs/mine.
+
+ The <expression> may be a single selection criterion or combination of
+ several using the Boolean logic operators AND, OR, or NOT (&, |, or !),
+ along with parentheses if needed, such as:
+ +jobs/select (new | overdue) & ! who=none
+ which would list jobs that are either new or overdue, and not unassigned.
+
+ Continued in: jobs/select2
+& jobs/select2
+
+ Job selection criteria include the following:
+
+ all - all jobs
+ new - new jobs (same criteria as +jobs/new)
+ mine - jobs assigned to or tagged for you (same as +jobs/mine)
+ overdue - jobs past their due date
+ due<=<date/time> - jobs due before the specified date/time
+ due>=<date/time> - jobs due after the specified time or with no due date
+ who=<player or none> - jobs assigned to <player> / unassigned
+ source=<player> - jobs originated by <player>
+ pri=<color> (or esc=<color>) - jobs of green, yellow, or red priority
+ status=<status> - jobs of hold, new, underway, 25, 50, 75, or 100 status
+ bucket=<bucket> - jobs in <bucket>
+ search=<pattern> - jobs including <pattern> in their text
+ viewing (or monitor) - jobs in buckets you have selected to monitor
+ hidden - jobs in buckets designated as hidden
+ public (or myjobs) - jobs in buckets designated public
+ published - jobs which have been published
+ summary - jobs containing summary attribute
+
+ If the selection ends with sort=<sorttype>, the output is sorted. Valid
sort
+ types are jobnum (default), bucket, date, due, and pri. A '-' as the
first
+ character of the <sorttype> reverses the sort. For example:
+ +jobs/select (new | overdue) & mine sort=due
+ returns new or overdue jobs that are assigned to/tagged for you.
+
+ Continued in: jobs/select3
+& jobs/select3
+
+ If a parameter requires spaces (such as dates, player names, or search
+ terms) it must be enclosed in quotation marks. Due dates may be
+ specified as either:
+ - time() format: "Dec 25 00:12:00 2009"
+ - MM/DD/YY: 12/25/09
+ - Time-from-now in days/hours/mins/secs: "1d 12h" or 36h
+
+ Examples:
+
+ +jobs/select viewing
+ - would return output identical to +jobs.
+
+ +jobs/select due<="1d 12h" & (pri=yellow | pri=red) sort=-due
+ - would return jobs of yellow or red priority due in the next 36
hours,
+ sorted from later to earlier due dates.
+
+ +jobs/select (bucket=code | bucket=build) & due<=01/01/10
+ - would return CODE or BUILD jobs due before the New Year
+
+ +jobs/select bucket=TPS & (search=dragon & !search="dragon egg")
+ - would return jobs in the TPS buckets which included the word dragon
+ but did NOT include the words "dragon egg".
+
+ Continued in: jobs/select4
+& jobs/select4
+
+ Similar to the way the &JOBS attribute specifies which columns display
for
+ +jobs, a player may use &JOBSELECT to redefine which jobs will be shown
+ for the +jobs command. For example:
+ &JOBSELECT me=viewing | mine
+
+ This would add jobs from "mine" to the existing list of monitored buckets
+ for that player's +jobs command.
+
+ Players may also store expressions using &JOBSELECT_<name>
me=<expression>
+ and then simply use +jobs/select <name>. For example, if a player
entered:
+ &JOBSELECT_IMMINENT me=bucket=REQ & due<=36h & ! overdue
+ &JOBSELECT_NONGREEN me=esc=Yellow | esc=Red
+ They could then use '+jobs/select imminent' to return REQ bucket jobs
coming
+ due in the next 36 hours. Multiple <name>s may be used with the
+jobs/select
+ command, such as '+jobs/select imminent and nongreen'. Names may also be
+ used in the &JOBSELECT attribute but not in &JOBSELECT_<name> attributes.
+
+ Players may override the default +jobs/all, +jobs/new, +jobs/mine, and
+ +jobs/overdue lists by defining &JOBSELECT_ALL, &JOBSELECT_NEW,
+ &JOBSELECT_MINE, and &JOBSELECT_OVERDUE.
+
+ A game's code staff may add additional criteria by adding &SEL_<criteria>
+ attributes to the Job Database <JD> object. These functions are called by
+ filter%(%) and take %%0 (a job dbref) and %%qa (the argument) and return
1
+ if the job meets that selection criteria.
+& jobs/sort
+
+ [ansi(h,+jobs/sort)]
+
+ This command will display a list of jobs, except the list is organized by
+ bucket.
+& jobs/catchup
+
+ [ansi(h,+jobs/catchup)]
+ [ansi(h,+jobs/catchup <expression>)]
+
+ This command will catch you up on the jobs system, clearing all unread
+ jobs as being new. This works for both versions of new jobs.
+
+ If an <expression> (using +jobs/select syntax) is included then the new
job
+ indicator will be cleared only for those jobs. This only works with the
new
+ version of new jobs (if the user has selected &JOBSN me=1).
+& jobs/date
+
+ [ansi(h,+jobs/date)]
+
+ This command will display a list of jobs, based on when they were last
+ modified.
+& jobs/due
+
+ [ansi(h,+jobs/due)]
+
+ This command will display a list of jobs, based on when they are due.
+& jobs/new
+
+ [ansi(h,+jobs/new)]
+
+ This command will display a list of jobs that have new activity. You can
+ alter how 'new activity' is presented to you - see 'uconfig'.
+& jobs/who
+
+ [ansi(h,+jobs/who <player>)]
+
+ This command lists all jobs that have been assigned to <player>.
+& job
+
+ [ansi(h,+job <#>)]
+
+ This command will display the contents of Job <#>. Only those comments
posted
+ in the job that are human-created (+job/add, +job/mail, etc) are
displayed.
+
+ The number in brackets before each comment is the number of that
comment. A
+ + or - after that number indicates publication status of the comment (a
plus
+ means the comment is published, a minus means the comment is not
published).
+& job/access
+
+ [ansi(h,+job/access <#>=<player>)]
+
+ This command toggles access to Job <#> for <player>. If <player> has
access
+ to the +jobs system this behaves similarly to the +bucket/access command,
+ but for a single job. For players without +jobs system access, this
permits
+ the <player> to use the +myjob commands to list, view, and add to the
job.
+& job/act
+
+ [ansi(h,+job/act <#>)]
+
+ This command will list all comments in Job <#> in an abbreviated format
that
+ indicates what the action code was for that comment, who performed it,
when,
+ and any arbitrary comment information posted with it. In this way, you
can
+ track the action history of a particular job from the time it was opened.
+& job/add
+
+ [ansi(h,+job/add <#>=<comments>)]
+
+ This command adds a <comment> to Job <#>. This also triggers off the ADD
+ hooks.
+& job/create
+
+ [ansi(h,+job/create <bucket>/<title>=<first comment>)]
+
+ This command creates a new job in <bucket>. It triggers off the CRE
hooks.
+ Who can use the create command is governed by the CREATE_ACCESS lock on
the
+ Job Database object.
+& job/approve
+
+ [ansi(h,+job/approve <#>=<comments>)]
+
+ This command approves Job <#>. This will delete the job, post to the
private
+ BBS, and @mails the player that their job is approved. The <comments> are
+ added to the job as an ADD action, and the system finishes up by running
the
+ APR action.
+
+ This is a 'private' command, in that communication between staff and
players
+ is kept confidential.
+& job/deny
+
+ [ansi(h,+job/deny <#>=<comments>)]
+
+ This command denies Job <#>. This will delete the job, post to the
private
+ BBS, and @mails the player that their job is denied. The <comments> are
+ added to the job as an ADD action, and the system finishes up by running
the
+ DEL action.
+
+ This is a 'private' command, in that communication between staff and
players
+ is kept confidential.
+& job/complete
+
+ [ansi(h,+job/complete <#>=<comments>)]
+
+ This command publicly completes Job <#>. It will delete the job and post
the
+ <comments> to the public BBS board. The <comments> are also added to the
job
+ as an ADD action, and the system finishes up by running the COM hooks.
+
+ This command should be used for game-wide information about the
completion
+ of a job, such as rules clarifications, or player notification of a new
part
+ of the grid. Anything posted to the job's first comment and your
<comments>
+ then become public, so be careful when using /complete lest any secret
+ player information become public.
+& job/checkout
+
+ [ansi(h,+job/checkout <#>)]
+
+ This command allows you to check out job <#>. Checked out jobs can only
be
+ modified by you until it is checked back in.
+
+ See also: job/checkin
+& job/checkin
+
+ [ansi(h,+job/checkin <#>)]
+
+ This command allows you to check in job <#>. Wizards and the person who
+ checked out the job are allowed to check them back in.
+
+ See also: job/checkout
+& job/assign
+
+ [ansi(h,+job/assign <#>=<player>)]
+
+ This command assigns <player> as being responsible for Job <#>. It
triggers
+ the ASN hooks.
+& job/claim
+
+ [ansi(h,+job/claim <#>)]
+
+ This command is an alias for +job/assign <#>=<yourself>. It triggers
+ the ASN hooks.
+& job/clone
+
+ [ansi(h,+job/clone <#>)]
+
+ Makes an identical copy of a job from Job <#>. The CLN hooks are run on
the
+ newly created job, not the old job.
+& job/delete
+
+ [ansi(h,+job/delete <#>)]
+
+ This command removes Job <#> from the system. It behaves silently in that
+ it does not issue a broadcast to the rest of the Jobs users. It is
wizard-
+ only.
+& job/due
+
+ [ansi(h,+job/due <#>=<<date>|none>)]
+
+ This sets the due date for a job to <date>. Use the word 'none' if you
want
+ to clear the date. The <date> string looks for the following formats:
+
+ MM/DD/YY or MM/DD/YYYY
+ Example: 3/15/10
+
+ Days, Hours, Minutes, Seconds from now (using ##d ##h ##m ##s)
+ Example: 7d
+ Example: 23h 59m 59s
+
+ Any date string recognized by the convtime() function
+ Example: Mar 15 10:00:00 2010
+ Example: March 15 2010 (depending on server configuration)
+
+ This command also runs the DUE hooks.
+& job/edit
+
+ [ansi(h,+job/edit <#>/<comment#>=<old>/<new>)]
+
+ This edits the contents of Job <#>'s <comment#>, replacing <old> text
with
+ <new> text. You can only edit the ADD and CRE comments. You can only edit
+ comments that belong to you, except in the case of wizards, who can edit
+ anyone's comments. This command triggers the EDT hooks.
+& job/esc
+
+ [ansi(h,+job/esc <#>=<green|yellow|red>)]
+
+ This command changes the job's escalation color (aka priority color). A
green
+ color indicates a low priority. A yellow color indicates that the
priority is
+ elevated. A red color indicates a high priority.
+
+ A job that has gone into overdue status will display as red in priority.
+ However, this does not actually change anything on the job itself. If you
+ set a yellow priority on a job and it goes overdue, you can remove the
due
+ date and it will revert to a yellow priority.
+
+ This command triggers the ESC hooks.
+& job/help
+
+ [ansi(h,+job/help <#>)]
+
+ This command displays the HELP attribute on the bucket that the job is
in. If
+ any MYHELP exists, it will be displayed as well.
+& job/last
+
+ [ansi(h,+job/last <#>=<X>)]
+
+ This command will list the last <X> normally viewable entries in Job <#>.
+& job/lock
+
+ [ansi(h,+job/lock <#>)]
+
+ This command will lock a job from further modifications. The only changes
+ that can be made to a locked job is a transfer to a new bucket (this is
to
+ support locking a bucket, but you may want to move jobs in and out of a
+ locked bucket). This command also runs the LOK hooks.
+
+ See also: job/unlock
+& job/log
+
+ [ansi(h,+job/log <#>)]
+
+ This command dumps Job <#> into its bucket's LOGFILE setting. It also
runs
+ the LOG hooks.
+
+ See also: logging
+& job/mail
+
+ [ansi(h,+job/mail <#>=<message>)]
+
+ This command will send mail to the players listed as the job's source (or
+ Opened By field). It triggers the MAI hooks when enacted.
+
+ See also: job/source
+& job/merge
+
+ [ansi(h,+job/merge <source>=<destination>)]
+
+ Sometimes it becomes necessary to combine jobs, and this command does
just
+ that. It merges <source> into the <destination> job. The MRG hooks are
run on
+ the destination, not the source.
+& job/name
+
+ [ansi(h,+job/name <#>=<title>)]
+
+ This command changes the <title> of Job <#>. It runs the NAM hooks when
+ enacted.
+& job/publish
+
+ [ansi(h,+job/publish <#>%[=<comment>%])]
+
+ If <comment> is provided, then this command publishes (or unpublishes) a
+ comment. Without <comment>, this publishes the whole job. For a
breakdown of
+ publication rules, please see 'publication'. It runs the PUB and UNP
action
+ hooks when activated, depending on whether or not the comment is being
+ published or unpublished.
+
+ See also: publication
+& job/query
+
+ [ansi(h,+job/query <player list>/<title>=<comments>)]
+
+ This command will create a job in the QUERY bucket. It will set the
source
+ of the job to <player list>. It then sends an @mail to <player list> that
+ informs them of the query and how to access it via +myjobs. It also runs
the
+ OTH hooks.
+
+ Once there, the job follows standard myjobs rules: each player can only
see
+ their own comments and the initial comment in the job.
+& job/set
+
+ [ansi(h,+job/set <#>=<hold|new|underway|25|50|75|100>)]
+
+ This command changes the completion/progression status of a job.
+
+ The available settings are:
+
+ hold The job is currently awaiting something and cannot proceed.
+ new Newly created jobs default to this status.
+ underway The job is currently being processed.
+ 25 The job is 1/4 complete.
+ 50 The job is 1/2 complete.
+ 75 The job is 3/4 complete.
+ 100 The job is complete.
+
+ Job status should be periodically updated with the progression of the
work.
+
+ A game's code staff may add additional statuses by adding &STATUS_<value>
+ attributes to the Job Database <JD> object. These are |-delimited
attributes
+ where the first element is displayed in +jobs, the last is used for text
+ output, and all elements are used for matching +job/set input.
+& job/source
+
+ [ansi(h,+job/source <#>=<player list>)]
+
+ This command changes the Opened By list on Job <#> to <player list>.
+& job/summary
+
+ [ansi(h,+job/summary <#>)]
+
+ This command displays the header of the job, the summary of the job, and
+ a staff-only view of settings, readers and statistical information.
+& job/sumset
+
+ [ansi(h,+job/sumset <#>/<setting>=<parameter>)]
+
+ This command changes Job <#>'s summary <setting> to <parameter>. You can
get
+ a list of available <settings> using '+bucket/info <bucket>', where
<bucket>
+ is the bucket that the job is presently in.
+
+ By default, only two buckets come with settings that can be altered: TPS
and
+ RP. These buckets use identical SUMMARY information to assist in the
+ management of plots. It also runs the SUM hooks.
+& job/tag
+
+ [ansi(h,+job/tag <#>%[=<player list>%])]
+
+ This command tags a job for a player, so that it appears in their
+jobs/mine
+ list. Tags are intended to draw multiple players' attention to jobs, and
+ jobs are automatically untagged when read.
+
+ If used without <player list>, the tagging is accomplished for yourself.
It
+ runs the TAG hooks.
+
+ Since version 6.2, tagged jobs no longer provide special access. To allow
+ users to see jobs in buckets they would otherwise not see, use
+job/access.
+& job/untag
+
+ [ansi(h,+job/untag <#>%[=<player list>%])]
+
+ This is the opposite of +job/tag, and will remove <player list> from the
+ list of people that Job <#> is tagged for. If used without <player list>,
+ then the untagging is done for yourself. It runs the TAG hooks.
+& job/trans
+
+ [ansi(h,+job/trans <#>=<bucket>)]
+
+ This command will move Job <#> from its current bucket to a new <bucket>.
+ It also runs the TRN hooks.
+& job/undelete
+
+ [ansi(h,+job/undelete <#>)]
+
+ Jobs which are completed, approved, denied, or deleted remain in the
system
+ for 60 seconds before being permanently deleted. This command restores
+ these "going" jobs. This command runs the UND hooks.
+
+ This command is intended for rare use when jobs are inadvertently
deleted.
+ Note that jobs which were deleted may have run actions associated with
the
+ COM, APR, DNY, and DEL hooks, as well as @mail and bulletin board
postings.
+ Additional actions may be necessary to restore the system to its prior
+ state, or the UND_ACCESS attribute can be used (on buckets or jobs) to
+ prevent restoration when the effects of the previous hooks are
irreversible.
+
+& job/unlock
+
+ [ansi(h,+job/unlock <#>)]
+
+ This command unlocks Job <#>, allowing modifications to be made to the
job
+ once again. This command runs the UNL hooks.
+& bucket/info
+
+ [ansi(h,+bucket/info <bucket>)]
+
+ This command allows you to see detailed configuration information about a
+ <bucket>, including its DB#, most of which can be altered using
+bucket/set.
+
+ See also: bconfig
+& bucket/monitor
+
+ [ansi(h,+bucket/monitor <bucket>)]
+
+ This command toggles whether or not you are viewing a bucket in your
normal
+ +jobs list. If a bucket is not monitored, then jobs in it will not appear
+ on the normal list, but will still appear in places like '+jobs/mine',
+ '+jobs/new', etc.
+& bucket/create
+
+ [ansi(h,+bucket/create <bucket>=<description>)]
+
+ This command creates a new <bucket>, assigning it a <description>. The
locks
+ for the bucket will be set to '1', so you will probably want to change
those.
+ This is a wizard-only command.
+
+ See also: baccess, bconfig
+& bucket/delete
+
+ [ansi(h,+bucket/delete <bucket>)]
+
+ This command destroys <bucket>. The bucket must be empty. This will
destroy
+ the bucket instantly. Wizard only.
+& bucket/access
+
+ [ansi(h,+bucket/access <player>=<bucket>)]
+
+ This gives <player> access to <bucket>, even if the player does not pass
the
+ default bucket locks. They must still pass the system's HAS_ACCESS lock,
+ however.
+
+ See also: access
+& bucket/check
+
+ [ansi(h,+bucket/check <player>)]
+
+ Checks all buckets and lists whether the player has access or not.
+& bucket/set
+
+ [ansi(h,+bucket/set <bucket>/<setting>=<parameter>)]
+
+ This command sets <bucket>'s <setting> to <parameter>.
+
+ See 'bconfig' for information on how to configure your buckets.
+& job/all
+
+ [ansi(h,+job/all <#>)]
+
+ This command will display all actions in detail for Job <#>. It is
similar
+ to an expanded +job/act.
+& bucket/help
+
+ [ansi(h,+bucket/help <bucket>)]
+
+ This command displays help for <bucket>, showing information on how jobs
+ in the bucket should be handled and any setting information. The bucket's
+ HELP file can be set with +bucket/set.
+& commands
+
+ [ansi(h,+jobs)] : List jobs.
+ [ansi(h,+jobs/<all|mine|new|overdue>)] : List
all/yours/new/overdue jobs.
+ [ansi(h,+jobs/catchup)] : Clears new jobs.
+ [ansi(h,+jobs/catchup <expression>)] : Clears selected new
jobs.
+ [ansi(h,+jobs/clean)] : Remove non-players
from job data.
+ [ansi(h,+jobs/compress)] : Compresses job
list. (Wiz)
+ [ansi(h,+jobs/credits)] : Display credit
information.
+ [ansi(h,+jobs/from <player>)] : Lists jobs opened
by a player.
+ [ansi(h,+jobs/list <bucket>)] : List all jobs in
<bucket>.
+ [ansi(h,+jobs/nospam %[<bucket>%])] : Suppress job
@mail.
+ [ansi(h,+jobs/reports %[<report>%])] : Get a report.
+ [ansi(h,+jobs/search <pattern>)] : Search jobs for
<pattern>.
+ [ansi(h,+jobs/select <expression>)] : List jobs matching
<expression>.
+ [ansi(h,+jobs/silence %[<bucket>%])] : Suppress job
broadcasts.
+ [ansi(h,+jobs/<sort|date|pri|due>)] : Sorts jobs by
bucket/mod/pri/due.
+ [ansi(h,+jobs/who <player>)] : Lists jobs assigned
to player.
+
+ You can get details on each command with '+jhelp <command>/<switch>'
without
+ the + symbol. i.e., '+jhelp jobs/all'.
+
+ Continued in: commands2
+& commands2
+
+ [ansi(h,+job <#>)] : View a job.
+ [ansi(h,+job/access <#>=<player>)] : Toggle access to a
job.
+ [ansi(h,+job/act <#>)] : Display actions on
a job.
+ [ansi(h,+job/add <#>=<comments>)] : Add comments to a
job.
+ [ansi(h,+job/all <#>)] : Displays all
comments in a job.
+ [ansi(h,+job/approve <#>=<comment>)] : Approve a player
request.
+ [ansi(h,+job/assign <#>=<<player>|none>)] : Assign a job to
player.
+ [ansi(h,+job/checkin <#>)] : Checks in a job
+ [ansi(h,+job/checkout <#>)] : Checks out a job.
+ [ansi(h,+job/claim <#>)] : Assign a job to
yourself.
+ [ansi(h,+job/clone <#>)] : Clones a job.
+ [ansi(h,+job/complete <#>=<comment>)] : Complete a job.
+ [ansi(h,+job/create <bucket>/<title>=<comments>)] : Create a job
manually.
+ [ansi(h,+job/delete <#>)] : Delete a job. (Wiz)
+ [ansi(h,+job/deny <#>=<comment>)] : Deny a player
request.
+ [ansi(h,+job/due <#>=<<date>|none>)] : Set job due date.
+ [ansi(h,+job/edit <#>/<entry#>=<old>/<new>)] : Edits a job.
+ [ansi(h,+job/esc <#>=<green|yellow|red>)] : Escalate a job's
priority.
+ [ansi(h,+job/help <#>)] : Display help for a
job's bucket.
+
+ You can get details on each command with '+jhelp <command>/<switch>'
without
+ the + symbol. i.e., '+jhelp jobs/all'.
+
+ Continued in: commands3
+& commands3
+
+ [ansi(h,+job/last <#>=<X>)] : List last <X>
entries in <#>.
+ [ansi(h,+job/lock <#>)] : Locks a job and
prevents changes.
+ [ansi(h,+job/log <#>)] : Logs a job.
+ [ansi(h,+job/mail <#>=<message>)] : Mails opener with
<message>.
+ [ansi(h,+job/merge <source>=<destination>)] : Merge <source> into
<destination>.
+ [ansi(h,+job/name <#>=<name>)] : Rename a job.
+ [ansi(h,+job/nospam <#>)] : Suppress job @mail.
+ [ansi(h,+job/publish <#>%[=<comment>%])] : Publishes a job
or <comment>.
+ [ansi(h,+job/query <players>/<title>=<query>)] : Sends a query to
<players>.
+ [ansi(h,+job/set <#>=<status>)] : Set progress status
on a job.
+ [ansi(h,+job/silence <#>)] : Suppress job
broadcasts.
+ [ansi(h,+job/source <#>=<player list>)] : Changes opened-by
to <player list>.
+ [ansi(h,+job/summary <#>)] : Views a job's
header & SUMMARY.
+ [ansi(h,+job/sumset <#>/<set>=<value>)] : Changes a job
SUMMARY setting.
+ [ansi(h,+job/tag <#>%[=<player list>%])] : Tags a job for
you or <player list>.
+ [ansi(h,+job/trans <#>=<bucket>)] : Transfer (or
undelete) a job.
+ [ansi(h,+job/undelete <#>)] : Restores a deleted
job.
+ [ansi(h,+job/unlock <#>)] : Unlocks a job.
+ [ansi(h,+job/untag <#>%[=<player list>%])] : Untags a job for
you or <player list>.
+
+ You can get details on each command with '+jhelp <command>/<switch>'
without
+ the + symbol. i.e., '+jhelp jobs/all'.
+
+ Continued in: commands4
+& commands4
+
+ [ansi(h,+buckets)]
+ [ansi(h,+bucket/info <bucket>)]
+ [ansi(h,+bucket/help <bucket>)]
+ [ansi(h,+bucket/monitor <bucket>)]
+ [ansi(h,+bucket/create <bucket>=<description>)]
+ [ansi(h,+bucket/delete <bucket>)]
+ [ansi(h,+bucket/access <player>=<bucket>)]
+ [ansi(h,+bucket/check <player>)]
+ [ansi(h,+bucket/set <bucket>/<setting>=<value>)]
+
+ [ansi(h,+jgroups)]
+ [ansi(h,+jgroup/info <jgroup>)]
+ [ansi(h,+jgroup/create <jgroup>=<description>)]
+ [ansi(h,+jgroup/delete <jgroup>)]
+ [ansi(h,+jgroup/member <player>=<jgroup>)]
+
+ You can get details on each command with '+jhelp <command>/<switch>'
without
+ the + symbol. i.e., '+jhelp jobs/all'.
+& pitch
+
+ [ansi(h,+pitch <title>=<description>)]
+
+ This command tosses an idea to staff. The idea can be story related or
just
+ an idea on how to make the game better. PITCH jobs are different from
those
+ created with +request. They are not issued due dates. Staff is under no
+ obligation to even answer them. By procedure, they are either discarded
+ with no fanfare, tucked away for future implementation or they are run
with
+ either in modified or unmodified form.
+
+ For story pitches, it puts a story idea into the RP jobs bucket. Now,
this
+ is not a request for a TP, this is a method of giving story ideas, or
theme
+ ideas, to the staff for consideration. If you want to request a scene,
use
+ +request.
+& request
+
+ [ansi(h,+request <title>=<description>)]
+
+ This command requests <title> and <description> from staff. The request
is
+ added to the jobs list and will be tended to as soon as possible. Please
do
+ not bug staff - it will be handled shortly. There is a standard three day
+ turnaround time on +requests.
+& bug
+
+ [ansi(h,+bug <title>=<description>)]
+
+ This command is used for bug reporting. In <title> put the command that
is
+ bugged, or something else appropriate. Please be as descriptive as
possible
+ in the <description> field. What were the results you were expecting?
What
+ happened in its place? By giving lots of detail here, it saves us the
time of
+ tracking you down to drag the information out of you. Thanks.
+& typo
+
+ [ansi(h,+typo <typo description>)]
+
+ This command reports a typo. Please be specific about where the typo is,
what
+ the typo is, and what you think it should be changed to.
+& myjobs
+
+ [ansi(h,+myjobs)]
+ [ansi(h,+myjob <#>)]
+ [ansi(h,+myjob/last <#>=<number of comments>)]
+ [ansi(h,+myjob/add <#>=<comment>)]
+ [ansi(h,+myjobs/catchup)]
+ [ansi(h,+myjobs/nospam)]
+ [ansi(h,+myjob/nospam <#>)]
+
+ This suite of commands allows the submitter to view and modify jobs that
they
+ have submitted to the system. When viewing a job that you own, you can
only
+ see the comments that you have added, not comments added by others.
+myjobs
+ lists your jobs; you can read an individual job or the last comment(s).
You
+ can also add additional comments to the job. Catching up jobs clears
the new
+ job indicator. Nospam suppresses @mails for all jobs, or a single job.
+
+ Staff can give you access to jobs you could not otherwise see. In those
+ instances, you can see all comments added, not just those you have added.
+
+ [ansi(h,+myjob/help <#>)]
+ [ansi(h,+myjob/sumset <#>/<setting>=<value>)]
+
+ If staff has set a MYHELP attribute on the bucket, +myjob/help will
display
+ it, as well as special summary settings, which may be set with
+ +myjob/sumset.
+& myjob/help
+
+ [ansi(h,+myjob/help <#>)]
+
+ This command displays the MYHELP attribute on the bucket that the job is
in.
+ If there are any special sumsettings (summary settings) for the job, the
help
+ for it will be located here.
+
+ See also: MYSUMMARIES, MYJOB/SUMSET
+& mysummaries
+
+ The 'MySummary' block is information that all players can see by looking
at
+ the job in +myjobs. The job could also potentially have settings
associated
+ to it (See: myjob/sumset).
+
+ The MYSUMMARY attribute follows the exact same rules as the SUMMARY does
+ (see 'summaries'). The only difference is that for any /sumset
+ settings, the names of the attributes are:
+
+ MYACCESS_<setting>
+ MYPROCESS_<setting>
+ MYERROR_<setting>
+
+ See also: SUMMARIES, SUMSETTING
+& myjob/sumset
+
+ [ansi(h,+myjob/sumset <#>/<setting>=<value>)]
+
+ This command will set a 'summary setting' on job <#>. If a header called
+ 'MySummary', then there might be settings available for it. In order to
check
+ for valid settings, use '+myjob/help <#>'
+
+ See also: MYSUMMARIES
+
+& publication
+
+ Jobs that are in buckets that are flagged to be Myjobs accessible, or
+ jobs in buckets that have been set with the TRANSPARENT attribute can be
+ seen with the '+myjobs' command. In the instance where a bucket is set up
+ to be transparent, then all jobs in that bucket can be seen by all
players
+ as if they had opened a request.
+
+ When a user views a job with +myjobs, they see the opening comment and
any
+ comments they have added. Anyone who can access the bucket can use the
+ following commands:
+
+ [ansi(h,+job/publish <#>=<Comment#>)] Publish an individual comment.
+ [ansi(h,+job/publish <#>)] Publish a whole job.
+
+ Both of these commands toggle the publication status of the item - to
+ unpublish a comment simply repeat the command on it.
+
+ A job can only be published if it is in a Myjobs accessible bucket. In
+ the default view of a job, a + or - shows whether or not a comment is
+ published.
+
+ Continued in: publication2
+& publication2
+
+ If you publish a whole job, this overrides any individually published
+ comments. You cannot 'unpublish' a comment on a published job. If you
wish
+ to selectively publish comments, you'll have to turn off the job's
+ publication status.
+
+ As you can see, the use of publication can be a powerful communications
tool
+ for players and staff, and you should see the importance of maintaining a
+ professional presence when dealing with Myjobs buckets. It is also
important
+ to review all comments that are going to be published very carefully for
+ any information that would be untoward if released.
+
+ If you /access a job for a player, they can see the whole job no matter
the
+ publication status, and no matter where the job is located.
+
+ By default, +job/mail will set the @mail'd comment published.
+
+ You can change the source (Opened By) of a job to a list of many players
+ which will effectively turn it into a group job. Jobs opened using
+ +job/query defaults to setting the Opened By to the queried players and
+ automatically assigns the job to the command enactor.
+
+ By default, the PUB bucket is the only bucket that is set transparent.
+& access
+
+ Anomaly Jobs has a tiered access structure. By changing who has access to
+ various commands, you can selectively allow players like builders into
the
+ system so they can work. The access locks are on the Job Database <JD>
+ object. Bucket access locks are stored at the bucket level.
+
+ HAS_ACCESS: Returns 1 if a player can access the +jobs system.
+
+ COMPLETE_ACCESS: Returns 1 if a player can /complete jobs.
+ APPROVE_ACCESS: Returns 1 if a player can /approve jobs.
+ DENY_ACCESS: Returns 1 if a player can /deny jobs.
+ CREATE_ACCESS: Returns 1 if a player can use the /create command.
+ ADD_ACCESS: Returns 1 if a player can use the /add command.
+ GIVE_ACCESS: Returns 1 if a player can use +bucket/access.
+ EDIT_ACCCESS: Returns 1 if a player can use the /edit command.
+ STATS_ACCESS: Returns 1 if a player can pull reports on the system.
+ LOG_ACCESS: Returns 1 if a player can /log a job.
+ MAIL_ACCESS: Returns 1 if a player can /query and /mail.
+
+ A player must pass HAS_ACCESS before the other locks are applied.
+
+ Access to buckets are set at the bucket level (see 'baccess').
+ You can also restrict actions by bucket (see 'aaccess').
+
+ See also: aaccess, baccess
+& aaccess
+
+ Actions can be restricted by bucket. This allows you to customize the
+ available actions to, for instance, prevent jobs from being tampered
+ with in automated buckets. The format for this is:
+
+ &<action code>_ACCESS <bucket>=<return 1 to access, 0 to deny>
+
+ The <action>_ACCESS code allows for one argument: %%0 == PlayerDB#.
+
+ Example: If you do not want a job to ever be transferred out
***The diff for this file has been truncated for email.***
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/jhelp_ansi.txt Thu Nov 24 20:39:41 2011
@@ -0,0 +1,1855 @@
+& help
+ Anomaly Jobs v6.5
+
+ Anomaly Jobs is a feature-rich task-tracker.
+
+ Topic Description
Updated
+
----------------------------------------------------------------------------
+ buckets How to manage buckets.
06Jan30
+ complete How to complete and follow-through on +jobs.
06Jan30
+ config How to configure Anomaly Jobs.
10Jan08
+ commands A list of commands at-a-glance. No details.
10Jan23
+ create How to create +jobs and how users can create them.
06Jan30
+ credits The credits to Anomaly Jobs.
06Jan30
+ jgroups How to manage jgroups (player lists).
10Jan08
+ list Viewing the +jobs list.
06Jan30
+ player Player commands.
06Jan30
+ publication Job publication and player visibility.
06Jan30
+ manage Managing your +jobs board.
10Jan08
+ reports Getting statistics on the system.
06Jan30
+ tagging Tagging jobs for yourself and others.
06Jan30
+
+ Type '+jhelp <Topic>' for more.
+& player
+ Player Commands
+
+ Topic Description
Updated
+
----------------------------------------------------------------------------
+ bug How to submit a bug report.
06Jan30
+ myjobs How players keep track of their issues.
06Jan30
+ pitch How players submit ideas to the game.
06Jan30
+ request How players submit a need to staff.
06Jan30
+ typo How to submit a typo report.
06Jan30
+
+ Type '+jhelp <Topic>' for more.
+& config
+ Config Menu
+
+ Sub Topic Description
Updated
+
----------------------------------------------------------------------------
+ access Access parameters to the Jobs system.
06Jan30
+ aaccess Setting bucket action permission.
10Jan08
+ advanced Advanced configuration.
06Jan30
+ baccess Setting bucket access parameters.
06Jan30
+ bconfig Basic bucket configuration.
06Jan30
+ logging How to set up job logging.
06Jan30
+ uconfig How to configure your personal jobs experience.
10Jan08
+
+ Type '+jhelp <Topic>' for more.
+& advanced
+ Advanced Configuration Menu
+
+ Topic Description
Updated
+
----------------------------------------------------------------------------
+ hooks How to set up action hooks.
06Jan30
+ letters How to mail / bbpost / set automatic job comments.
06Jan30
+ codes A list of default action codes.
06Jan30
+ summary How to set up a Bucket Summary
06Jan30
+ sumsetting How to configure /sumset parameters.
06Jan30
+ trig_add The 'add-to-job' trigger.
06Jan30
+ trig_create The job-creation trigger.
10Jan08
+
+ Type '+jhelp <Topic>' for more.
+& letters
+
+ Anomaly Jobs supports four types of form letters:
+
+ Topic Description
Updated
+
----------------------------------------------------------------------------
+ aletter Addition letters - formatting an added comment.
06Jan30
+ bletter Broadcast letters - formatting broadcast messages.
10Jan08
+ mletter Mail letters - sent to the OPENED_BY list.
06Jan30
+ pletter Post letters - posting a letter to the BBS.
06Jan30
+
+ Type '+jhelp <Topic>' for more.
+& jobs
+
+ [1m+jobs [0m
+
+ This command will invoke the 'main' jobs list. It displays all jobs that
+ you have access to and are presently monitoring. You can tailor this list
+ in several ways: +bucket/monitor will toggle whether or not you are
viewing
+ a particular bucket, the list can be altered to display job information
you
+ want (see 'uconfig').
+& jobs/all
+
+ [1m+jobs/all [0m
+
+ This command behaves exactly like '+jobs' (and can be tailored to your
own
+ tastes, see 'uconfig'), except it does it for all buckets that you have
+ access to.
+& jobs/mine
+
+ [1m+jobs/mine [0m
+
+ This command lists just those jobs that have been assigned to you.
+& jobs/pri
+
+ [1m+jobs/pri [0m
+
+ This sorts all jobs by escalation code, red at top, then yellow, then
green.
+ Note that any jobs that have gone into OVERDUE status are not sorted
as 'red'
+ to keep sorting sane.
+& jobs/clean
+
+ [1m+jobs/clean [0m
+
+ This command will remove all non-players from job entries.
+
+ A &TRIG_CLEAN trigger is provided on the Jobs Database object which may
be
+ called from autonuke code or hooked to @nuke / @dest to execute this
function
+ automatically.
+& jobs/compress
+
+ [1m+jobs/compress [0m
+
+ This command will rename all Job Objects, 1 to X, and then set the next
+ job # to be X+1. This is useful if your jobs start running into less
+ convenient numbers to type, and can be used to correct errors in the job
+ numbering. It is wizard-only.
+& jobs/credits
+
+ [1m+jobs/credits [0m
+
+ Roll the credits.
+& jobs/from
+
+ [1m+jobs/from <player> [0m
+
+ This command will list all jobs opened by <player>.
+& jobs/list
+
+ [1m+jobs/list <bucket> [0m
+
+ This command will list all jobs in <bucket>.
+& jobs/silence
+& job/silence
+
+ [1m+jobs/silence [0m
+ [1m+jobs/silence <bucket> [0m
+ [1m+job/silence <job #> [0m
+
+ These commands will toggle appropriate attributes to suppress broadcasts
+ sent to those monitoring buckets. Without an argument, the commands
+ toggle the player's &JOBS_SILENCE attribute which (globally) suppresses
+ these broadcasts. Suppression can be applied at the bucket level and at
+ the job level.
+& jobs/nospam
+& job/nospam
+& myjobs/nospam
+& myjob/nospam
+
+Staff:
+ [1m+jobs/nospam [0m
+ [1m+jobs/nospam <bucket> [0m
+ [1m+job/nospam <job #> [0m
+
+Players:
+ [1m+myjobs/nospam [0m
+ [1m+myjob/nospam <job #> [0m
+
+ These commands will toggle appropriate attributes to suppress the
automatic
+ @mails sent to the originator of a job. Without an argument, the commands
+ toggle the player's &JOBS_NOSPAM attribute which (globally) suppresses
+ these @mails. Suppression can be applied at the bucket level for staff,
+ and at the job level for everyone.
+& jobs/overdue
+
+ [1m+jobs/overdue [0m
+
+ This command works exactly like '+jobs', except that it only displays
those
+ jobs that are overdue.
+& jobs/reports
+
+ [1m+jobs/reports [<report>] [0m
+
+ Without <report>, this command displays a list of available job reports.
If
+ <report> is supplied, then that report is displayed. Some reports take
+ additional input, such as ACTBY, for example:
+
+ +jobs/reports actby=add
+
+ This will run a report on all ADD actions across all buckets.
+& jobs/search
+
+ [1m+jobs/search <pattern> [0m
+
+ This will search all jobs for <pattern> and return a list of jobs that
+ have that pattern. It will search the entire object, not necessarily
comments
+ that the player has access to.
+& jobs/select
+
+ [1m+jobs/select <expression> [0m
+
+ In the simplest cases, +jobs/select <text> returns the same list of jobs
+ as the equivalent +jobs/<text> command, such as:
+ +jobs/select all (same as +jobs/all)
+ +jobs/select new (same as +jobs/new)
+ +jobs/select mine (same as +jobs/mine)
+ +jobs/select overdue (same as +jobs/overdue)
+ +jobs/select who=none (same as +jobs/who none)
+
+ However, the +jobs/select command's power is in returning lists of jobs
+ that meet multiple criteria. For example, the command:
+ +jobs/select new or mine
+ would return a list of jobs that appeared in either the +jobs/new OR the
+ +jobs/mine lists. Similarly:
+ +jobs/select new and mine
+ would return a list of jobs that appeared in both +jobs/new AND
+jobs/mine.
+
+ The <expression> may be a single selection criterion or combination of
+ several using the Boolean logic operators AND, OR, or NOT (&, |, or !),
+ along with parentheses if needed, such as:
+ +jobs/select (new | overdue) & ! who=none
+ which would list jobs that are either new or overdue, and not unassigned.
+
+ Continued in: jobs/select2
+& jobs/select2
+
+ Job selection criteria include the following:
+
+ all - all jobs
+ new - new jobs (same criteria as +jobs/new)
+ mine - jobs assigned to or tagged for you (same as +jobs/mine)
+ overdue - jobs past their due date
+ due<=<date/time> - jobs due before the specified date/time
+ due>=<date/time> - jobs due after the specified time or with no due date
+ who=<player or none> - jobs assigned to <player> / unassigned
+ source=<player> - jobs originated by <player>
+ pri=<color> (or esc=<color>) - jobs of green, yellow, or red priority
+ status=<status> - jobs of hold, new, underway, 25, 50, 75, or 100 status
+ bucket=<bucket> - jobs in <bucket>
+ search=<pattern> - jobs including <pattern> in their text
+ viewing (or monitor) - jobs in buckets you have selected to monitor
+ hidden - jobs in buckets designated as hidden
+ public (or myjobs) - jobs in buckets designated public
+ published - jobs which have been published
+ summary - jobs containing summary attribute
+
+ If the selection ends with sort=<sorttype>, the output is sorted. Valid
sort
+ types are jobnum (default), bucket, date, due, and pri. A '-' as the
first
+ character of the <sorttype> reverses the sort. For example:
+ +jobs/select (new | overdue) & mine sort=due
+ returns new or overdue jobs that are assigned to/tagged for you.
+
+ Continued in: jobs/select3
+& jobs/select3
+
+ If a parameter requires spaces (such as dates, player names, or search
+ terms) it must be enclosed in quotation marks. Due dates may be
+ specified as either:
+ - time() format: "Dec 25 00:12:00 2009"
+ - MM/DD/YY: 12/25/09
+ - Time-from-now in days/hours/mins/secs: "1d 12h" or 36h
+
+ Examples:
+
+ +jobs/select viewing
+ - would return output identical to +jobs.
+
+ +jobs/select due<="1d 12h" & (pri=yellow | pri=red) sort=-due
+ - would return jobs of yellow or red priority due in the next 36
hours,
+ sorted from later to earlier due dates.
+
+ +jobs/select (bucket=code | bucket=build) & due<=01/01/10
+ - would return CODE or BUILD jobs due before the New Year
+
+ +jobs/select bucket=TPS & (search=dragon & !search="dragon egg")
+ - would return jobs in the TPS buckets which included the word dragon
+ but did NOT include the words "dragon egg".
+
+ Continued in: jobs/select4
+& jobs/select4
+
+ Similar to the way the &JOBS attribute specifies which columns display
for
+ +jobs, a player may use &JOBSELECT to redefine which jobs will be shown
+ for the +jobs command. For example:
+ &JOBSELECT me=viewing | mine
+
+ This would add jobs from "mine" to the existing list of monitored buckets
+ for that player's +jobs command.
+
+ Players may also store expressions using &JOBSELECT_<name>
me=<expression>
+ and then simply use +jobs/select <name>. For example, if a player
entered:
+ &JOBSELECT_IMMINENT me=bucket=REQ & due<=36h & ! overdue
+ &JOBSELECT_NONGREEN me=esc=Yellow | esc=Red
+ They could then use '+jobs/select imminent' to return REQ bucket jobs
coming
+ due in the next 36 hours. Multiple <name>s may be used with the
+jobs/select
+ command, such as '+jobs/select imminent and nongreen'. Names may also be
+ used in the &JOBSELECT attribute but not in &JOBSELECT_<name> attributes.
+
+ Players may override the default +jobs/all, +jobs/new, +jobs/mine, and
+ +jobs/overdue lists by defining &JOBSELECT_ALL, &JOBSELECT_NEW,
+ &JOBSELECT_MINE, and &JOBSELECT_OVERDUE.
+
+ A game's code staff may add additional criteria by adding &SEL_<criteria>
+ attributes to the Job Database <JD> object. These functions are called by
+ filter() and take %0 (a job dbref) and %qa (the argument) and return 1
+ if the job meets that selection criteria.
+& jobs/sort
+
+ [1m+jobs/sort [0m
+
+ This command will display a list of jobs, except the list is organized by
+ bucket.
+& jobs/catchup
+
+ [1m+jobs/catchup [0m
+ [1m+jobs/catchup <expression> [0m
+
+ This command will catch you up on the jobs system, clearing all unread
+ jobs as being new. This works for both versions of new jobs.
+
+ If an <expression> (using +jobs/select syntax) is included then the new
job
+ indicator will be cleared only for those jobs. This only works with the
new
+ version of new jobs (if the user has selected &JOBSN me=1).
+& jobs/date
+
+ [1m+jobs/date [0m
+
+ This command will display a list of jobs, based on when they were last
+ modified.
+& jobs/due
+
+ [1m+jobs/due [0m
+
+ This command will display a list of jobs, based on when they are due.
+& jobs/new
+
+ [1m+jobs/new [0m
+
+ This command will display a list of jobs that have new activity. You can
+ alter how 'new activity' is presented to you - see 'uconfig'.
+& jobs/who
+
+ [1m+jobs/who <player> [0m
+
+ This command lists all jobs that have been assigned to <player>.
+& job
+
+ [1m+job <#> [0m
+
+ This command will display the contents of Job <#>. Only those comments
posted
+ in the job that are human-created (+job/add, +job/mail, etc) are
displayed.
+
+ The number in brackets before each comment is the number of that
comment. A
+ + or - after that number indicates publication status of the comment (a
plus
+ means the comment is published, a minus means the comment is not
published).
+& job/access
+
+ [1m+job/access <#>=<player> [0m
+
+ This command toggles access to Job <#> for <player>. If <player> has
access
+ to the +jobs system this behaves similarly to the +bucket/access command,
+ but for a single job. For players without +jobs system access, this
permits
+ the <player> to use the +myjob commands to list, view, and add to the
job.
+& job/act
+
+ [1m+job/act <#> [0m
+
+ This command will list all comments in Job <#> in an abbreviated format
that
+ indicates what the action code was for that comment, who performed it,
when,
+ and any arbitrary comment information posted with it. In this way, you
can
+ track the action history of a particular job from the time it was opened.
+& job/add
+
+ [1m+job/add <#>=<comments> [0m
+
+ This command adds a <comment> to Job <#>. This also triggers off the ADD
+ hooks.
+& job/create
+
+ [1m+job/create <bucket>/<title>=<first comment> [0m
+
+ This command creates a new job in <bucket>. It triggers off the CRE
hooks.
+ Who can use the create command is governed by the CREATE_ACCESS lock on
the
+ Job Database object.
+& job/approve
+
+ [1m+job/approve <#>=<comments> [0m
+
+ This command approves Job <#>. This will delete the job, post to the
private
+ BBS, and @mails the player that their job is approved. The <comments> are
+ added to the job as an ADD action, and the system finishes up by running
the
+ APR action.
+
+ This is a 'private' command, in that communication between staff and
players
+ is kept confidential.
+& job/deny
+
+ [1m+job/deny <#>=<comments> [0m
+
+ This command denies Job <#>. This will delete the job, post to the
private
+ BBS, and @mails the player that their job is denied. The <comments> are
+ added to the job as an ADD action, and the system finishes up by running
the
+ DEL action.
+
+ This is a 'private' command, in that communication between staff and
players
+ is kept confidential.
+& job/complete
+
+ [1m+job/complete <#>=<comments> [0m
+
+ This command publicly completes Job <#>. It will delete the job and post
the
+ <comments> to the public BBS board. The <comments> are also added to the
job
+ as an ADD action, and the system finishes up by running the COM hooks.
+
+ This command should be used for game-wide information about the
completion
+ of a job, such as rules clarifications, or player notification of a new
part
+ of the grid. Anything posted to the job's first comment and your
<comments>
+ then become public, so be careful when using /complete lest any secret
+ player information become public.
+& job/checkout
+
+ [1m+job/checkout <#> [0m
+
+ This command allows you to check out job <#>. Checked out jobs can only
be
+ modified by you until it is checked back in.
+
+ See also: job/checkin
+& job/checkin
+
+ [1m+job/checkin <#> [0m
+
+ This command allows you to check in job <#>. Wizards and the person who
+ checked out the job are allowed to check them back in.
+
+ See also: job/checkout
+& job/assign
+
+ [1m+job/assign <#>=<player> [0m
+
+ This command assigns <player> as being responsible for Job <#>. It
triggers
+ the ASN hooks.
+& job/claim
+
+ [1m+job/claim <#> [0m
+
+ This command is an alias for +job/assign <#>=<yourself>. It triggers
+ the ASN hooks.
+& job/clone
+
+ [1m+job/clone <#> [0m
+
+ Makes an identical copy of a job from Job <#>. The CLN hooks are run on
the
+ newly created job, not the old job.
+& job/delete
+
+ [1m+job/delete <#> [0m
+
+ This command removes Job <#> from the system. It behaves silently in that
+ it does not issue a broadcast to the rest of the Jobs users. It is
wizard-
+ only.
+& job/due
+
+ [1m+job/due <#>=<<date>|none> [0m
+
+ This sets the due date for a job to <date>. Use the word 'none' if you
want
+ to clear the date. The <date> string looks for the following formats:
+
+ MM/DD/YY or MM/DD/YYYY
+ Example: 3/15/10
+
+ Days, Hours, Minutes, Seconds from now (using ##d ##h ##m ##s)
+ Example: 7d
+ Example: 23h 59m 59s
+
+ Any date string recognized by the convtime() function
+ Example: Mar 15 10:00:00 2010
+ Example: March 15 2010 (depending on server configuration)
+
+ This command also runs the DUE hooks.
+& job/edit
+
+ [1m+job/edit <#>/<comment#>=<old>/<new> [0m
+
+ This edits the contents of Job <#>'s <comment#>, replacing <old> text
with
+ <new> text. You can only edit the ADD and CRE comments. You can only edit
+ comments that belong to you, except in the case of wizards, who can edit
+ anyone's comments. This command triggers the EDT hooks.
+& job/esc
+
+ [1m+job/esc <#>=<green|yellow|red> [0m
+
+ This command changes the job's escalation color (aka priority color). A
green
+ color indicates a low priority. A yellow color indicates that the
priority is
+ elevated. A red color indicates a high priority.
+
+ A job that has gone into overdue status will display as red in priority.
+ However, this does not actually change anything on the job itself. If you
+ set a yellow priority on a job and it goes overdue, you can remove the
due
+ date and it will revert to a yellow priority.
+
+ This command triggers the ESC hooks.
+& job/help
+
+ [1m+job/help <#> [0m
+
+ This command displays the HELP attribute on the bucket that the job is
in. If
+ any MYHELP exists, it will be displayed as well.
+& job/last
+
+ [1m+job/last <#>=<X> [0m
+
+ This command will list the last <X> normally viewable entries in Job <#>.
+& job/lock
+
+ [1m+job/lock <#> [0m
+
+ This command will lock a job from further modifications. The only changes
+ that can be made to a locked job is a transfer to a new bucket (this is
to
+ support locking a bucket, but you may want to move jobs in and out of a
+ locked bucket). This command also runs the LOK hooks.
+
+ See also: job/unlock
+& job/log
+
+ [1m+job/log <#> [0m
+
+ This command dumps Job <#> into its bucket's LOGFILE setting. It also
runs
+ the LOG hooks.
+
+ See also: logging
+& job/mail
+
+ [1m+job/mail <#>=<message> [0m
+
+ This command will send mail to the players listed as the job's source (or
+ Opened By field). It triggers the MAI hooks when enacted.
+
+ See also: job/source
+& job/merge
+
+ [1m+job/merge <source>=<destination> [0m
+
+ Sometimes it becomes necessary to combine jobs, and this command does
just
+ that. It merges <source> into the <destination> job. The MRG hooks are
run on
+ the destination, not the source.
+& job/name
+
+ [1m+job/name <#>=<title> [0m
+
+ This command changes the <title> of Job <#>. It runs the NAM hooks when
+ enacted.
+& job/publish
+
+ [1m+job/publish <#>[=<comment>] [0m
+
+ If <comment> is provided, then this command publishes (or unpublishes) a
+ comment. Without <comment>, this publishes the whole job. For a
breakdown of
+ publication rules, please see 'publication'. It runs the PUB and UNP
action
+ hooks when activated, depending on whether or not the comment is being
+ published or unpublished.
+
+ See also: publication
+& job/query
+
+ [1m+job/query <player list>/<title>=<comments> [0m
+
+ This command will create a job in the QUERY bucket. It will set the
source
+ of the job to <player list>. It then sends an @mail to <player list> that
+ informs them of the query and how to access it via +myjobs. It also runs
the
+ OTH hooks.
+
+ Once there, the job follows standard myjobs rules: each player can only
see
+ their own comments and the initial comment in the job.
+& job/set
+
+ [1m+job/set <#>=<hold|new|underway|25|50|75|100> [0m
+
+ This command changes the completion/progression status of a job.
+
+ The available settings are:
+
+ hold The job is currently awaiting something and cannot proceed.
+ new Newly created jobs default to this status.
+ underway The job is currently being processed.
+ 25 The job is 1/4 complete.
+ 50 The job is 1/2 complete.
+ 75 The job is 3/4 complete.
+ 100 The job is complete.
+
+ Job status should be periodically updated with the progression of the
work.
+
+ A game's code staff may add additional statuses by adding &STATUS_<value>
+ attributes to the Job Database <JD> object. These are |-delimited
attributes
+ where the first element is displayed in +jobs, the last is used for text
+ output, and all elements are used for matching +job/set input.
+& job/source
+
+ [1m+job/source <#>=<player list> [0m
+
+ This command changes the Opened By list on Job <#> to <player list>.
+& job/summary
+
+ [1m+job/summary <#> [0m
+
+ This command displays the header of the job, the summary of the job, and
+ a staff-only view of settings, readers and statistical information.
+& job/sumset
+
+ [1m+job/sumset <#>/<setting>=<parameter> [0m
+
+ This command changes Job <#>'s summary <setting> to <parameter>. You can
get
+ a list of available <settings> using '+bucket/info <bucket>', where
<bucket>
+ is the bucket that the job is presently in.
+
+ By default, only two buckets come with settings that can be altered: TPS
and
+ RP. These buckets use identical SUMMARY information to assist in the
+ management of plots. It also runs the SUM hooks.
+& job/tag
+
+ [1m+job/tag <#>[=<player list>] [0m
+
+ This command tags a job for a player, so that it appears in their
+jobs/mine
+ list. Tags are intended to draw multiple players' attention to jobs, and
+ jobs are automatically untagged when read.
+
+ If used without <player list>, the tagging is accomplished for yourself.
It
+ runs the TAG hooks.
+
+ Since version 6.2, tagged jobs no longer provide special access. To allow
+ users to see jobs in buckets they would otherwise not see, use
+job/access.
+& job/untag
+
+ [1m+job/untag <#>[=<player list>] [0m
+
+ This is the opposite of +job/tag, and will remove <player list> from the
+ list of people that Job <#> is tagged for. If used without <player list>,
+ then the untagging is done for yourself. It runs the TAG hooks.
+& job/trans
+
+ [1m+job/trans <#>=<bucket> [0m
+
+ This command will move Job <#> from its current bucket to a new <bucket>.
+ It also runs the TRN hooks.
+& job/undelete
+
+ [1m+job/undelete <#> [0m
+
+ Jobs which are completed, approved, denied, or deleted remain in the
system
+ for 60 seconds before being permanently deleted. This command restores
+ these "going" jobs. This command runs the UND hooks.
+
+ This command is intended for rare use when jobs are inadvertently
deleted.
+ Note that jobs which were deleted may have run actions associated with
the
+ COM, APR, DNY, and DEL hooks, as well as @mail and bulletin board
postings.
+ Additional actions may be necessary to restore the system to its prior
+ state, or the UND_ACCESS attribute can be used (on buckets or jobs) to
+ prevent restoration when the effects of the previous hooks are
irreversible.
+
+& job/unlock
+
+ [1m+job/unlock <#> [0m
+
+ This command unlocks Job <#>, allowing modifications to be made to the
job
+ once again. This command runs the UNL hooks.
+& bucket/info
+
+ [1m+bucket/info <bucket> [0m
+
+ This command allows you to see detailed configuration information about a
+ <bucket>, including its DB#, most of which can be altered using
+bucket/set.
+
+ See also: bconfig
+& bucket/monitor
+
+ [1m+bucket/monitor <bucket> [0m
+
+ This command toggles whether or not you are viewing a bucket in your
normal
+ +jobs list. If a bucket is not monitored, then jobs in it will not appear
+ on the normal list, but will still appear in places like '+jobs/mine',
+ '+jobs/new', etc.
+& bucket/create
+
+ [1m+bucket/create <bucket>=<description> [0m
+
+ This command creates a new <bucket>, assigning it a <description>. The
locks
+ for the bucket will be set to '1', so you will probably want to change
those.
+ This is a wizard-only command.
+
+ See also: baccess, bconfig
+& bucket/delete
+
+ [1m+bucket/delete <bucket> [0m
+
+ This command destroys <bucket>. The bucket must be empty. This will
destroy
+ the bucket instantly. Wizard only.
+& bucket/access
+
+ [1m+bucket/access <player>=<bucket> [0m
+
+ This gives <player> access to <bucket>, even if the player does not pass
the
+ default bucket locks. They must still pass the system's HAS_ACCESS lock,
+ however.
+
+ See also: access
+& bucket/check
+
+ [1m+bucket/check <player> [0m
+
+ Checks all buckets and lists whether the player has access or not.
+& bucket/set
+
+ [1m+bucket/set <bucket>/<setting>=<parameter> [0m
+
+ This command sets <bucket>'s <setting> to <parameter>.
+
+ See 'bconfig' for information on how to configure your buckets.
+& job/all
+
+ [1m+job/all <#> [0m
+
+ This command will display all actions in detail for Job <#>. It is
similar
+ to an expanded +job/act.
+& bucket/help
+
+ [1m+bucket/help <bucket> [0m
+
+ This command displays help for <bucket>, showing information on how jobs
+ in the bucket should be handled and any setting information. The bucket's
+ HELP file can be set with +bucket/set.
+& commands
+
+ [1m+jobs [0m : List jobs.
+ [1m+jobs/<all|mine|new|overdue> [0m : List
all/yours/new/overdue jobs.
+ [1m+jobs/catchup [0m : Clears new jobs.
+ [1m+jobs/catchup <expression> [0m : Clears selected new
jobs.
+ [1m+jobs/clean [0m : Remove non-players
from job data.
+ [1m+jobs/compress [0m : Compresses job list.
(Wiz)
+ [1m+jobs/credits [0m : Display credit
information.
+ [1m+jobs/from <player> [0m : Lists jobs opened by
a player.
+ [1m+jobs/list <bucket> [0m : List all jobs in
<bucket>.
+ [1m+jobs/nospam [<bucket>] [0m : Suppress job @mail.
+ [1m+jobs/reports [<report>] [0m : Get a report.
+ [1m+jobs/search <pattern> [0m : Search jobs for
<pattern>.
+ [1m+jobs/select <expression> [0m : List jobs matching
<expression>.
+ [1m+jobs/silence [<bucket>] [0m : Suppress job
broadcasts.
+ [1m+jobs/<sort|date|pri|due> [0m : Sorts jobs by
bucket/mod/pri/due.
+ [1m+jobs/who <player> [0m : Lists jobs assigned
to player.
+
+ You can get details on each command with '+jhelp <command>/<switch>'
without
+ the + symbol. i.e., '+jhelp jobs/all'.
+
+ Continued in: commands2
+& commands2
+
+ [1m+job <#> [0m : View a job.
+ [1m+job/access <#>=<player> [0m : Toggle access to a
job.
+ [1m+job/act <#> [0m : Display actions on a
job.
+ [1m+job/add <#>=<comments> [0m : Add comments to a job.
+ [1m+job/all <#> [0m : Displays all comments
in a job.
+ [1m+job/approve <#>=<comment> [0m : Approve a player
request.
+ [1m+job/assign <#>=<<player>|none> [0m : Assign a job to
player.
+ [1m+job/checkin <#> [0m : Checks in a job
+ [1m+job/checkout <#> [0m : Checks out a job.
+ [1m+job/claim <#> [0m : Assign a job to
yourself.
+ [1m+job/clone <#> [0m : Clones a job.
+ [1m+job/complete <#>=<comment> [0m : Complete a job.
+ [1m+job/create <bucket>/<title>=<comments> [0m : Create a job manually.
+ [1m+job/delete <#> [0m : Delete a job. (Wiz)
+ [1m+job/deny <#>=<comment> [0m : Deny a player request.
+ [1m+job/due <#>=<<date>|none> [0m : Set job due date.
+ [1m+job/edit <#>/<entry#>=<old>/<new> [0m : Edits a job.
+ [1m+job/esc <#>=<green|yellow|red> [0m : Escalate a job's
priority.
+ [1m+job/help <#> [0m : Display help for a
job's bucket.
+
+ You can get details on each command with '+jhelp <command>/<switch>'
without
+ the + symbol. i.e., '+jhelp jobs/all'.
+
+ Continued in: commands3
+& commands3
+
+ [1m+job/last <#>=<X> [0m : List last <X> entries
in <#>.
+ [1m+job/lock <#> [0m : Locks a job and
prevents changes.
+ [1m+job/log <#> [0m : Logs a job.
+ [1m+job/mail <#>=<message> [0m : Mails opener with
<message>.
+ [1m+job/merge <source>=<destination> [0m : Merge <source> into
<destination>.
+ [1m+job/name <#>=<name> [0m : Rename a job.
+ [1m+job/nospam <#> [0m : Suppress job @mail.
+ [1m+job/publish <#>[=<comment>] [0m : Publishes a job or
<comment>.
+ [1m+job/query <players>/<title>=<query> [0m : Sends a query to
<players>.
+ [1m+job/set <#>=<status> [0m : Set progress status
on a job.
+ [1m+job/silence <#> [0m : Suppress job
broadcasts.
+ [1m+job/source <#>=<player list> [0m : Changes opened-by to
<player list>.
+ [1m+job/summary <#> [0m : Views a job's header
& SUMMARY.
+ [1m+job/sumset <#>/<set>=<value> [0m : Changes a job SUMMARY
setting.
+ [1m+job/tag <#>[=<player list>] [0m : Tags a job for you or
<player list>.
+ [1m+job/trans <#>=<bucket> [0m : Transfer (or
undelete) a job.
+ [1m+job/undelete <#> [0m : Restores a deleted
job.
+ [1m+job/unlock <#> [0m : Unlocks a job.
+ [1m+job/untag <#>[=<player list>] [0m : Untags a job for you
or <player list>.
+
+ You can get details on each command with '+jhelp <command>/<switch>'
without
+ the + symbol. i.e., '+jhelp jobs/all'.
+
+ Continued in: commands4
+& commands4
+
+ [1m+buckets [0m
+ [1m+bucket/info <bucket> [0m
+ [1m+bucket/help <bucket> [0m
+ [1m+bucket/monitor <bucket> [0m
+ [1m+bucket/create <bucket>=<description> [0m
+ [1m+bucket/delete <bucket> [0m
+ [1m+bucket/access <player>=<bucket> [0m
+ [1m+bucket/check <player> [0m
+ [1m+bucket/set <bucket>/<setting>=<value> [0m
+
+ [1m+jgroups [0m
+ [1m+jgroup/info <jgroup> [0m
+ [1m+jgroup/create <jgroup>=<description> [0m
+ [1m+jgroup/delete <jgroup> [0m
+ [1m+jgroup/member <player>=<jgroup> [0m
+
+ You can get details on each command with '+jhelp <command>/<switch>'
without
+ the + symbol. i.e., '+jhelp jobs/all'.
+& pitch
+
+ [1m+pitch <title>=<description> [0m
+
+ This command tosses an idea to staff. The idea can be story related or
just
+ an idea on how to make the game better. PITCH jobs are different from
those
+ created with +request. They are not issued due dates. Staff is under no
+ obligation to even answer them. By procedure, they are either discarded
+ with no fanfare, tucked away for future implementation or they are run
with
+ either in modified or unmodified form.
+
+ For story pitches, it puts a story idea into the RP jobs bucket. Now,
this
+ is not a request for a TP, this is a method of giving story ideas, or
theme
+ ideas, to the staff for consideration. If you want to request a scene,
use
+ +request.
+& request
+
+ [1m+request <title>=<description> [0m
+
+ This command requests <title> and <description> from staff. The request
is
+ added to the jobs list and will be tended to as soon as possible. Please
do
+ not bug staff - it will be handled shortly. There is a standard three day
+ turnaround time on +requests.
+& bug
+
+ [1m+bug <title>=<description> [0m
+
+ This command is used for bug reporting. In <title> put the command that
is
+ bugged, or something else appropriate. Please be as descriptive as
possible
+ in the <description> field. What were the results you were expecting?
What
+ happened in its place? By giving lots of detail here, it saves us the
time of
+ tracking you down to drag the information out of you. Thanks.
+& typo
+
+ [1m+typo <typo description> [0m
+
+ This command reports a typo. Please be specific about where the typo is,
what
+ the typo is, and what you think it should be changed to.
+& myjobs
+
+ [1m+myjobs [0m
+ [1m+myjob <#> [0m
+ [1m+myjob/last <#>=<number of comments> [0m
+ [1m+myjob/add <#>=<comment> [0m
+ [1m+myjobs/catchup [0m
+ [1m+myjobs/nospam [0m
+ [1m+myjob/nospam <#> [0m
+
+ This suite of commands allows the submitter to view and modify jobs that
they
+ have submitted to the system. When viewing a job that you own, you can
only
+ see the comments that you have added, not comments added by others.
+myjobs
+ lists your jobs; you can read an individual job or the last comment(s).
You
+ can also add additional comments to the job. Catching up jobs clears
the new
+ job indicator. Nospam suppresses @mails for all jobs, or a single job.
+
+ Staff can give you access to jobs you could not otherwise see. In those
+ instances, you can see all comments added, not just those you have added.
+
+ [1m+myjob/help <#> [0m
+ [1m+myjob/sumset <#>/<setting>=<value> [0m
+
+ If staff has set a MYHELP attribute on the bucket, +myjob/help will
display
+ it, as well as special summary settings, which may be set with
+ +myjob/sumset.
+& myjob/help
+
+ [1m+myjob/help <#> [0m
+
+ This command displays the MYHELP attribute on the bucket that the job is
in.
+ If there are any special sumsettings (summary settings) for the job, the
help
+ for it will be located here.
+
+ See also: MYSUMMARIES, MYJOB/SUMSET
+& mysummaries
+
+ The 'MySummary' block is information that all players can see by looking
at
+ the job in +myjobs. The job could also potentially have settings
associated
+ to it (See: myjob/sumset).
+
+ The MYSUMMARY attribute follows the exact same rules as the SUMMARY does
+ (see 'summaries'). The only difference is that for any /sumset
+ settings, the names of the attributes are:
+
+ MYACCESS_<setting>
+ MYPROCESS_<setting>
+ MYERROR_<setting>
+
+ See also: SUMMARIES, SUMSETTING
+& myjob/sumset
+
+ [1m+myjob/sumset <#>/<setting>=<value> [0m
+
+ This command will set a 'summary setting' on job <#>. If a header called
+ 'MySummary', then there might be settings available for it. In order to
check
+ for valid settings, use '+myjob/help <#>'
+
+ See also: MYSUMMARIES
+
+& publication
+
+ Jobs that are in buckets that are flagged to be Myjobs accessible, or
+ jobs in buckets that have been set with the TRANSPARENT attribute can be
+ seen with the '+myjobs' command. In the instance where a bucket is set up
+ to be transparent, then all jobs in that bucket can be seen by all
players
+ as if they had opened a request.
+
+ When a user views a job with +myjobs, they see the opening comment and
any
+ comments they have added. Anyone who can access the bucket can use the
+ following commands:
+
+ [1m+job/publish <#>=<Comment#> [0m Publish an individual comment.
+ [1m+job/publish <#> [0m Publish a whole job.
+
+ Both of these commands toggle the publication status of the item - to
+ unpublish a comment simply repeat the command on it.
+
+ A job can only be published if it is in a Myjobs accessible bucket. In
+ the default view of a job, a + or - shows whether or not a comment is
+ published.
+
+ Continued in: publication2
+& publication2
+
+ If you publish a whole job, this overrides any individually published
+ comments. You cannot 'unpublish' a comment on a published job. If you
wish
+ to selectively publish comments, you'll have to turn off the job's
+ publication status.
+
+ As you can see, the use of publication can be a powerful communications
tool
+ for players and staff, and you should see the importance of maintaining a
+ professional presence when dealing with Myjobs buckets. It is also
important
+ to review all comments that are going to be published very carefully for
+ any information that would be untoward if released.
+
+ If you /access a job for a player, they can see the whole job no matter
the
+ publication status, and no matter where the job is located.
+
+ By default, +job/mail will set the @mail'd comment published.
+
+ You can change the source (Opened By) of a job to a list of many players
+ which will effectively turn it into a group job. Jobs opened using
+ +job/query defaults to setting the Opened By to the queried players and
+ automatically assigns the job to the command enactor.
+
+ By default, the PUB bucket is the only bucket that is set transparent.
+& access
+
+ Anomaly Jobs has a tiered access structure. By changing who has access to
+ various commands, you can selectively allow players like builders into
the
+ system so they can work. The access locks are on the Job Database <JD>
+ object. Bucket access locks are stored at the bucket level.
+
+ HAS_ACCESS: Returns 1 if a player can access the +jobs system.
+
+ COMPLETE_ACCESS: Returns 1 if a player can /complete jobs.
+ APPROVE_ACCESS: Returns 1 if a player can /approve jobs.
+ DENY_ACCESS: Returns 1 if a player can /deny jobs.
+ CREATE_ACCESS: Returns 1 if a player can use the /create command.
+ ADD_ACCESS: Returns 1 if a player can use the /add command.
+ GIVE_ACCESS: Returns 1 if a player can use +bucket/access.
+ EDIT_ACCCESS: Returns 1 if a player can use the /edit command.
+ STATS_ACCESS: Returns 1 if a player can pull reports on the system.
+ LOG_ACCESS: Returns 1 if a player can /log a job.
+ MAIL_ACCESS: Returns 1 if a player can /query and /mail.
+
+ A player must pass HAS_ACCESS before the other locks are applied.
+
+ Access to buckets are set at the bucket level (see 'baccess').
+ You can also restrict actions by bucket (see 'aaccess').
+
+ See also: aaccess, baccess
+& aaccess
+
+ Actions can be restricted by bucket. This allows you to customize the
+ available actions to, for instance, prevent jobs from being tampered
+ with in automated buckets. The format for this is:
+
+ &<action code>_ACCESS <bucket>=<return 1 to access, 0 to deny>
+
+ The <action>_ACCESS code allows for one argument: %0 == PlayerDB#.
+
+ Example: If you do not want a job to ever be transferred out
***The diff for this file has been truncated for email.***
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/jobs-v6-5.patch.txt Thu Nov 24 20:39:41 2011
Binary file, no diff available.
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/jobs-v6-5.txt Thu Nov 24 20:39:41 2011
@@ -0,0 +1,540 @@
+@@
+@@ Anomaly Jobs 6.5 Installer
+@@ For new installations or upgrades from 5.0+
+@@ Quote this file from your client with a 1-second delay
+@@
+think [repeat(=,77)]%r%r[center(ansi(hc,Setting up Anomaly Jobs
v6.5),77)]%r%r[repeat(=,77)]
+@set me=quiet
+think [ansi(hc,ANOMALY JOBS:)] Checking current installation.
+@switch
[ifelse(isdbref(setr(0,switch(first(version()),PennMUSH,lsearch(all,eobjects,\[strmatch(name(##),Job
Global Object <JGO>)\]),RhostMUSH,searchng(object=Job Global Object
<JGO>),search(object=Job Global Object
<JGO>)))),setq(1,get(%q0/VA)),[setq(1,switch(first(version()),PennMUSH,lsearch(all,eobjects,\[strmatch(name(##),Job
Database <JD>)\]),RhostMUSH,searchng(object=Job Database
<JD>),search(object=Job Database
<JD>)))][setq(0,loc(%q1))])][isdbref(%q0)][and(isdbref(%q1),gte(edit(first(default(%q1/version,0),.),v,),5))]=0*,{think
[ansi(hc,ANOMALY JOBS:)] No previous jobs installation found. Creating a
new one.;&JOB_GO %#=setr(0,create(Job Global Object
<JGO>,10));&JOB_VA %#=setr(1,create(Job Database
<JD>,10));&JOB_VB %#=setr(2,create(Job
Tracker,10));&JOB_VC %#=setr(3,create(Job Parent Object
<JPO>,10));&JOB_PATCH %#=0;@tel %q1=%q0;@tel %q2=%q0;@tel %q3=%q0;},10*,{think
[ansi(hc,ANOMALY JOBS:)] [ansi(hr,Not a valid Jobs 5 or later
installation.)];think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,Aborting. Cancel
this script in your
client.)];&JOB_GO %#=#-1;&JOB_VA %#=#-1;&JOB_VB %#=#-1;&JOB_VC %#=#-1;&JOB_PATCH %#=1;},{think
[ansi(hc,ANOMALY JOBS:)] Current installation found.
Updating.;&JOB_GO %#=%q0;&JOB_VA %#=%q1;&JOB_VB %#=get(%q0/VB);&JOB_VC %#=get(%q0/VC);&JOB_PATCH %#=1;}
+@dolist GO VA VB VC=@switch [first(version())]=RhostMUSH,{@Desc
[v(JOB_##)]=lit(%r[columns(sort(lattr(me/*)),18,4)]%r%r[center(Please do
not rename this object.,79)])},{@Desc
[v(JOB_##)]=lit(%r[table(sort(lattr(me/*)),18)]%r%r[center(Please do not
rename this object.,79)])}
+think [ansi(hc,ANOMALY JOBS:)] Setting up commands.
+@switch [v(JOB_PATCH)][hasattr(v(JOB_GO),STARTUP)]=11,@Startup [v(JOB_GO)]
+@adisconnect [v(JOB_GO)]=@pemit
me=[ifelse(u(%va/HAS_ACCESS,%#),set(%#,LAST_CONN:[secs()]),)]
+@aconnect [v(JOB_GO)]=@switch
[default(%#/JOBS_LOGIN,1)][u(%va/HAS_ACCESS,%#)][u(%va/FN_GUEST,%#)]=110,{@force %#=+jobs/new},100,{@force %#=+myjobs}
+&CMD_BUCKET/ACCESS [v(JOB_GO)]=$+bucket/access *=*:@switch
[u(%va/GIVE_ACCESS,%#)][setq(0,switch(trim(%0),me,%#,pmatch(trim(%0))))][setq(1,u(%va/FN_FIND-BUCKET,%1))][isdbref(%q0)][isdbref(%q1)][u(%va/HAS_ACCESS,%q0)][u(%va/FN_WIZONLY,%q0)][u(%va/FN_ACCESSCHECK,%q1,%q0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no player by that
name.},110*,{@pemit %#=There is no bucket by that
name.},1110*,{@pemit %#=That player does not have +jobs
access.},11111*,{@pemit %#=That player can always access all
buckets.},111100*,{@pemit %#=You have given [name(%q0)] access to the
[name(%q1)] bucket and all jobs in
it.;&JOBSB %q0=[ifelse(member(get(%q0/JOBSB),u(%va/FN_OBJID,%q1)),remove(get(%q0/JOBSB),u(%va/FN_OBJID,%q1)),setunion(get(%q0/JOBSB),u(%va/FN_OBJID,%q1)))];@dolist
children(%q1)={&JOBACCESS
itext(0)=[remove(get([itext(0)]/JOBACCESS),u(%va/FN_OBJID,%q0))]}},{@pemit %#=You
have removed [name(%q0)]'s access to the [name(%q1)] bucket and all jobs in
it.;&JOBSB %q0=[ifelse(member(get(%q0/JOBSB),u(%va/FN_OBJID,%q1)),remove(get(%q0/JOBSB),u(%va/FN_OBJID,%q1)),setunion(get(%q0/JOBSB),u(%va/FN_OBJID,%q1)))];@dolist
children(%q1)={&JOBACCESS
itext(0)=[remove(get([itext(0)]/JOBACCESS),u(%va/FN_OBJID,%q0))]}}
+&CMD_BUCKET/CHECK [v(JOB_GO)]=$+bucket/check *:@switch
[isdbref(setr(0,switch(trim(%0),me,%#,pmatch(trim(%0)))))]=0,{@pemit %#=There
is no such player.},{@pemit %#=[u(%va/FN_HEADER,Bucket Information For
[name(%q0)])]%r%r[ansi(h,[ljust(Bucket,15)]%bHas
Access?)]%r[iter(lcon(%VC),[ljust(name(itext(0)),15)]%b[ifelse(u(%VA/fn_accesscheck,itext(0),%q0),Yes,No)],%b,%r)];@pemit %#=%r[u(%va/FN_FOOTER)]}
+&CMD_BUCKET/CREATE [v(JOB_GO)]=$+bucket/create *=*:@switch
[setq(0,u(%va/FN_FIND-BUCKET,%0))][u(%va/FN_WIZONLY,%#)][not(isdbref(%q0))][not(gt(strlen(trim(%0)),5))]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is already a bucket by that
name.},110*,{@pemit %#=The name of a bucket is limited to five
letters.},{@pemit %#=You have created a bucket named
[ucstr(trim(%0))].[setq(0,create(ucstr(trim(%0)),10))] Be sure to
change %q0/ACCESS to establish who can access the bucket. Presently, it is
set to 1, which means that anyone who can access +jobs can access the
bucket.;@tel %q0=%vc;@parent %q0=%vc;@desc %q0=[trim(secure(%1))];@set %q0=inherit !safe !halted !no_command;&ACCESS %q0=1;@lock/speech %q0=ACCESS/1}
+@switch [first(version())]=PennMUSH,{@edit
[v(JOB_GO)]/CMD_BUCKET/CREATE=inherit !safe !halted,wizard !safe !halt},TinyMUSH,{@edit
[v(JOB_GO)]/CMD_BUCKET/CREATE=!no_command,commands}
+&CMD_BUCKET/DELETE [v(JOB_GO)]=$+bucket/delete *:@switch
[u(%va/FN_WIZONLY,%#)][setq(0,u(%va/FN_FIND-BUCKET,%0))][isdbref(%q0)][eq(words(remove(children(%q0),#-1)),0)][not(hasflag(%q0,SAFE))]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no bucket by that
name.},110*,{@pemit %#=The bucket is not empty, and cannot be
deleted.},1110*,{@pemit %#=That bucket is required for the system to
operate properly.},{@pemit %#=You have deleted the bucket named
[ucstr(%0)].;@set %q0=DESTROY_OK;@nuke %q0;@dolist
[switch(first(version()),PennMUSH,lsearch(all,type,player),RhostMUSH,searchng(type=player),search(type=player))]={&JOBSH
##=[remove(get(##/JOBSH),%q0)];&JOBSB
##=[remove(get(##/JOBSB),u(%va/FN_OBJID,%q0))]}}
+&CMD_BUCKET/HELP [v(JOB_GO)]=$+bucket/help *:@switch
[setq(0,u(%va/FN_FIND-BUCKET,%0))][u(%va/FN_ACCESSCHECK,%q0,%#)][isdbref(%q0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=That is not a valid bucket.
Type '[ansi(h,+buckets)]' for a list of valid
buckets.},{@pemit %#=[u(%va/FN_HEADER,Bucket Help For
[name(%q0)])];@pemit %#=[u(%q0/HELP)][ifelse(u(%va/FN_HASATTRP,%q0,MYHELP),%r[u(%va/FN_BREAK,[ansi(c,Myjob
Help)])]%r[u(%q0/MYHELP)],)];@pemit %#=[u(%va/FN_FOOTER)]}
+&CMD_BUCKET/INFO [v(JOB_GO)]=$+bucket/info *:@switch
[u(%va/FN_STAFFALL,%#)][setq(0,u(%va/FN_FIND-BUCKET,%0))][isdbref(%q0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no bucket by that
name.},{@pemit %#=[u(%va/FN_HEADER,Bucket Information For
[name(%q0)])]%r[u(%va/DISPLAY_BUCKET)];@pemit %#=[u(%va/DISPLAY_BUCKET2)];@pemit %#=[u(%va/FN_FOOTER)]}
+&CMD_BUCKET/MONITOR [v(JOB_GO)]=$+bucket/monitor *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-BUCKET,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,%q0,%#)][u(%va/FN_MONITORCHECK,%q0,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no bucket by that
name.},110*,{@pemit %#=You do not have access to that
bucket.},1110*,{@pemit %#=You have added bucket [name(%q0)] to your
monitored
list.;&JOBSH %#=[ifelse(u(%va/FN_HASATTR,%q0,HIDDEN),setunion(get(%#/JOBSH),%q0),remove(get(%#/JOBSH),%q0))]},{@pemit %#=You
have removed bucket [name(%q0)] from your monitored
list.;&JOBSH %#=[ifelse(u(%va/FN_HASATTR,%q0,HIDDEN),remove(get(%#/JOBSH),%q0),setunion(get(%#/JOBSH),%q0))]}
+&CMD_BUCKET/SET [v(JOB_GO)]=$+bucket/set */*=*:@switch
[setq(0,u(%va/FN_FIND-BUCKET,%0))][and(u(%va/HAS_ACCESS,%#),u(%va/CONFIG_ACCESS,%#),u(%q0/ACCESS_[trim(%1)],%#))][isdbref(%q0)][u(%va/FN_HASATTRP,%q0,ACCESS_%1)][u(%q0/PROCESS_[trim(%1)],trim(%2),%q0,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no bucket by that name.
See '[ansi(h,+buckets)]' for a list of valid buckets.},110*,{@pemit %#='%1'
is not a valid parameter. Valid parameters for [name(%q0)] are
[u(%va/FN_ITEMIZE,map(%va/MAP_PARAMS,lattr(%vc/PROCESS_*)))].},1110*,{@pemit %#=[u(%q0/ERROR_[trim(%1)]%q2)]},{@pemit %#=[name(%q0)]'s
[ucstr(trim(%1))] successfully updated to: '[trim(%2)]'.;&%q3 %q0=%q1}
+&CMD_BUCKETS [v(JOB_GO)]=$+buckets:@switch
[u(%va/HAS_ACCESS,%#)]=0*,{@pemit %#=Permission
denied.},{@pemit %#=[u(%va/FN_BUCKETHEADER)];think
[setq(x,sortby(%va/SORTBY_NAME,filter(%va/FIL_ISBUCKET,lcon(%vc))))];@pemit %#=[iter(filter(%va/FIL_ACCESS,%qx),u(%va/FN_BUCKETLIST,##),%B,%R)];@pemit %#=[u(%va/FN_FOOTER,[ifelse(u(%va/FN_STAFFALL,%#),ansi(hy,V=Viewing
H=Hidden P=Published M=Myjobs L=Locked S=Summary),)])]}
+&CMD_BUG [v(JOB_GO)]=$+bug *=*:@switch
[u(%va/FN_GUEST,%#)]=1,{@pemit %#=This command is not available to
guests.},{@pemit %#=You have notified production staff of the
[secure(u(%va/FN_STRTRUNC,trim(%0),30))] bug, with the
details '[secure(u(%va/FN_STRTRUNC,trim(%1),get(%va/BUFFER)))]';@trigger %va/TRIG_CREATE=%#,u(%va/FN_FIND-BUCKET,CODE),3,BUG:
[u(%va/FN_STRTRUNC,trim(%0),30)],[u(%va/FN_STRTRUNC,trim(%1),get(%va/BUFFER))],,,5}
+&CMD_JGROUPS [v(JOB_GO)]=$+jgroups:@switch
[u(%va/HAS_ACCESS,%#)][words(remove(lcon(%vb),#-1))]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=No jgroups have been
defined.},{@pemit %#=[u(%va/FN_HEADER,JGroup
List)]%r[ljust(JGroup,15)]Description;@pemit %#=[iter(sortby(%va/SORTBY_NAME,lcon(%vb)),[ljust(name(##),15)][get(##/Desc)],%B,%R)];@pemit %#=[u(%va/FN_FOOTER)]}
+&CMD_JGROUP/CREATE [v(JOB_GO)]=$+jgroup/create *=*:@switch
[u(%va/FN_WIZONLY,%#)][setq(0,u(%va/FN_FIND-JGROUP,%0))][not(isdbref(%q0))][strmatch(%0,+*)][eq(words(%0),1)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is already a jgroup by that
name.},110*,{@pemit %#=Jgroup names must begin with
+.},1110*,{@pemit %#=Jgroup names may not contain spaces.},{@pemit %#=You
have created a jgroup named [trim(%0)].[setq(0,create(trim(%0),10))]
The %q0/ISMEMBER is set to use the %q0/MEMBERLIST attribute and
+jgroup/member command. Override %q0/ISMEMBER if you wish to change
this.;@tel %q0=%vb;@desc %q0=[secure(trim(%1))];&ISMEMBER %q0=lit(t(member(v(MEMBERLIST),%0)));@set %q0=inherit !safe !halted !no_command;}
+@switch [first(version())]=PennMUSH,{@edit
[v(JOB_GO)]/CMD_JGROUP/CREATE=inherit !safe !halted,wizard !safe !halt},TinyMUSH,{@edit
[v(JOB_GO)]/CMD_JGROUP/CREATE=!no_command,commands}
+&CMD_JGROUP/DELETE [v(JOB_GO)]=$+jgroup/delete *:@switch
[u(%va/FN_WIZONLY,%#)][setq(0,u(%va/FN_FIND-JGROUP,%0))][isdbref(%q0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no jgroup by that name.},{@pemit %#=You
have deleted the jgroup named %0.;@set %q0=DESTROY_OK;@nuke %q0;@wait
0=@nuke %q0;}
+&CMD_JGROUP/INFO [v(JOB_GO)]=$+jgroup/info *:@switch
[u(%va/FN_STAFFALL,%#)][setq(0,u(%va/FN_FIND-JGROUP,%0))][isdbref(%q0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no jgroup by that
name.},{@pemit %#=[u(%va/FN_HEADER,JGroup Information For
[name(%q0)])]%rDescription: [get(%q0/Desc)]%rMembers:
[u(%va/FN_ITEMIZE,map(%va/MAP_NAME,u(%va/FN_JGROUPMEMBERS,%q0),%b,|),|
)];@pemit %#=[u(%va/FN_FOOTER)]}
+&CMD_JGROUP/MEMBER [v(JOB_GO)]=$+jgroup/member *=*:@switch
[u(%va/FN_WIZONLY,%#)][setq(0,switch(trim(%0),me,%#,pmatch(trim(%0))))][setq(1,u(%va/FN_FIND-JGROUP,%1))][isdbref(%q0)][isdbref(%q1)][or(u(%va/HAS_ACCESS,%q0),u(%q1/ISMEMBER,%q0))][strmatch(get(%q1/ISMEMBER),*MEMBERLIST*)][u(%q1/ISMEMBER,%q0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no player by that
name.},110*,{@pemit %#=There is no jgroup by that
name.},1110*,{@pemit %#=That player does not have +jobs
access.},11110*,{@pemit %#=Membership in that jgroup is unaffected by this
command.},111110*,{@pemit %#=You have added [name(%q0)] to membership in
the [name(%q1)]
jgroup.;&memberlist %q1=setunion(get(%q1/memberlist),%q0);},{@pemit %#=You
have removed [name(%q0)] from membership in the [name(%q1)]
jgroup.;&memberlist %q1=remove(get(%q1/memberlist),%q0);}
+&CMD_JOB/ACCESS [v(JOB_GO)]=$+job/access *=*:@switch
[u(%va/GIVE_ACCESS,%#)][setq(0,switch(trim(%1),me,%#,pmatch(trim(%1))))][setq(1,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][isdbref(%q1)][u(%va/FN_WIZONLY,%q0)][u(%va/FN_ACCESSCHECK,parent(%q1),%q0,%q1)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no player by that
name.},110*,{@pemit %#=There is no job by that name. Please
type '[ansi(h,+jobs/all)]' for all jobs or '[ansi(h,+jobs/list <bucket>)]'
to list by bucket.},1111*,{@pemit %#=That player can always access all
jobs.},11100*,{@pemit %#=You have given [name(%q0)] access to
[name(%q1)].;&JOBACCESS %q1=[ifelse(member(get(%q1/JOBACCESS),u(%va/FN_OBJID,%q0)),remove(get(%q1/JOBACCESS),u(%va/FN_OBJID,%q0)),setunion(get(%q1/JOBACCESS),u(%va/FN_OBJID,%q0)))]},{@pemit %#=You
have removed [name(%q0)]'s access to
[name(%q1)].;&JOBACCESS %q1=[ifelse(member(get(%q1/JOBACCESS),u(%va/FN_OBJID,%q0)),remove(get(%q1/JOBACCESS),u(%va/FN_OBJID,%q0)),setunion(get(%q1/JOBACCESS),u(%va/FN_OBJID,%q0)))]}
+&CMD_JOB/ACT [v(JOB_GO)]=$+job/act *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][or(u(%va/FN_STAFFALL,%#),u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0))]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that name. Please
type '+jobs/all' for all jobs or '+jobs/<type>' to list by
type.},110*,{@pemit %#=You do not have access to that
job.},{@pemit %#=[u(%va/FN_HEADER,View Job
Number %0)]%r[ulocal(%va/FN_BANNER,%q0)]%r[u(%va/FN_BREAK)];@dolist
sortby(%va/SORTBY_COMMENTS,lattr(%q0/COMMENT_*))={@pemit %#=[rest(convsecs(extract(get(%q0/##),2,1,|
)))]%b[first(get(%q0/##),|
)]%b[ljust(u(%va/FN_STRTRUNC,extract(get(%q0/##),4,1,|
),15),15)]%b[ljust(u(%va/FN_STRTRUNC,u(%va/fn_trim,edit(edit(edit(last(get(%q0/##),|
),@@PIPE@@,|),%r,%b),%t,%b),b),35),35)]};@wait
0={@pemit %#=[u(%va/FN_FOOTER)]};}
+&CMD_JOB/ADD [v(JOB_GO)]=$+job/add *=*:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][not(u(%va/IS_LOCKED,%q0,%#))][udefault(%q0/ADD_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=That is an invalid job number.},110*,{@pemit %#=You
do not have access to that job.},1110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},11110*,{@pemit %#=That action is
not available for that job.},{@pemit %#=Comments to [name(%q0)]
added.;&TAGGED_FOR %q0=[remove(get(%q0/TAGGED_FOR),%#)];@trigger %va/TRIG_ADD=%q0,trim(%1),%#,ADD;@trigger %va/TRIG_BROADCAST=%q0,%#,ADD}
+&CMD_JOB/ALL [v(JOB_GO)]=$+job/all *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that name. Please
type '[ansi(h,+jobs/all)]' for all jobs or '[ansi(h,+jobs/list <bucket>)]'
to list by bucket.},110*,{@pemit %#=You do not have access to that
job.},{@pemit %#=[u(%va/FN_READERS,%q0,%#,1)][u(%va/FN_HEADER,View
[name(%q0)])]%r[ulocal(%va/FN_BANNER,%q0,%#)][ifelse(u(%va/FN_HASATTRP,%q0,SUMMARY),[ulocal(%va/FN_SUMMARY,%q0,%#)],)];@dolist
[sortby(%va/SORTBY_COMMENTS,lattr(%q0/COMMENT_*))]={@pemit %#=[u(%va/FN_READJOB,##,%q0)]};&TAGGED_FOR %q0=[ifelse(default(%#/JOBS_UNTAGREAD,1),setdiff(get(%q0/TAGGED_FOR),%#),get(%q0/TAGGED_FOR))];@wait
0={@pemit %#=[u(%va/FN_FOOTER,u(%va/FN_FLAGS,%q0))]};}
+&CMD_JOB/APPROVE [v(JOB_GO)]=$+job/approve *=*:@switch
[u(%va/HAS_ACCESS,%#)][u(%va/APPROVE_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][not(u(%va/IS_LOCKED,%q0,%#))][udefault(%q0/APR_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=Permission denied.},110*,{@pemit %#=There is no job
by that number.},1110*,{@pemit %#=You do not have access to that
job.},11110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},111110*,{@pemit %#=That action
is not available for that
job.},{@pemit %#=[u(%va/FN_ADDSTAT_ART,parent(%q0),%q0)][u(%va/FN_ADDSTAT_ART,%vc,%q0)]You
have approved [name(%q0)], adding the comments:
[trim(%1)];@trigger %va/TRIG_BROADCAST=%q0,%#,APR;@trigger %va/TRIG_ADD=%q0,[u(%va/FN_STRTRUNC,trim(%1),get(%va/BUFFER))],%#,APR;@trigger %va/TRIG_DESTROY=%q0}
+&CMD_JOB/ASSIGN [v(JOB_GO)]=$+job/assign *=*:@switch
[u(%va/HAS_ACCESS,%#)][setq(1,switch(trim(%1),+*,u(%va/FN_FIND-JGROUP,%1),me,%#,pmatch(trim(%1))))][setq(2,switch(trim(%1),NONE,1,0))][or(isdbref(%q1),%q2)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][not(u(%va/IS_LOCKED,%q0,%#))][udefault(%q0/ASN_ACCESS,1,%#)][switch(1,%q2,1,strmatch(%1,+*),[setq(3,u(%va/FN_JGROUPMEMBERS,%q1))][setq(4,iter(%q3,u(%va/FN_ACCESSCHECK,parent(%q0),itext(0),%q0)))][setq(5,member(%q4,0))][not(gt(%q5,0))],u(%va/FN_ACCESSCHECK,parent(%q0),%q1,%q0))]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no player or jgroup by that
name.},110*,{@pemit %#=That is not a valid job
number.},1110*,{@pemit %#=You do not have access to that
job.},11110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},111110*,{@pemit %#=That action
is not available on that
job.},1111110*,{@pemit %#=[ifelse(strmatch(%1,+*),[name(%q1)] member
[name(extract(%q3,%q5,1))],name(%q1))] does not have access to that
bucket.},{@pemit %#=You have [ifelse(strmatch(%q1,%#),claimed,assigned)]
[name(%q0)][ifelse(strmatch(%q1,%#),.,%bto
[ifelse(isdbref(%q1),name(%q1),nobody)])];&ASSIGNED_TO %q0=[ifelse(%q2,,%q1)];@trigger %va/TRIG_ADD=%q0,[ifelse(%q2,Assignment
removed.,Assigned to
[name(%q1)])].,%#,ASN,%q1;@trigger %va/TRIG_BROADCAST=%q0,%#,ASN,[ifelse(%q2,,%q1)]}
+&CMD_JOB/CHECKOUT [v(JOB_GO)]=$+job/checkout *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][not(u(%va/IS_LOCKED,%q0,%#))][not(u(%va/FN_HASATTR,%q0,CHECKOUT))][udefault(%q0/CKO_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that name. Please
type '[ansi(h,+jobs/all)]' for all jobs or '[ansi(h,+jobs/list <bucket>)]'
to list by bucket.},110*,{@pemit %#=You do not have access to that
job.},1110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)].},11110*,{@pemit %#=That job is
already checked out.},111110*,{@pemit %#=That action is not available on
that job.},1111110*,{@pemit %#=That action is not available for that
job.},{@pemit %#=[u(%va/FN_READERS,%q0,%#)]You have checked out
[name(%q0)]. Nobody but you will be able to modify it until you check it
back in.;&CHECKOUT %q0=%# [secs()];@trigger %va/TRIG_ADD=%q0,Checked out by
[name(%#)].,%#,CKO;@trigger %va/TRIG_BROADCAST=%q0,%#,CKO}
+&CMD_JOB/CHECKIN [v(JOB_GO)]=$+job/checkin *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][u(%va/FN_HASATTR,%q0,CHECKOUT)][or(u(%va/FN_WIZONLY,%#),switch(first(get(%q0/CHECKOUT)),%#,1,0))][udefault(%q0/CKI_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that name. Please
type '[ansi(h,+jobs/all)]' for all jobs or '[ansi(h,+jobs/list <bucket>)]'
to list by bucket.},110*,{@pemit %#=You do not have access to that
job.},1110*,{@pemit %#=That job is not checked out.},11110*,{@pemit %#=You
cannot check that job back in.},111110*,{@pemit %#=That action is not
available for that job.},{@pemit %#=[u(%va/FN_READERS,%q0,%#)]You have
checked [name(%q0)] back
in.;&CHECKOUT %q0=;@trigger %va/TRIG_ADD=%q0,Checked in by
[name(%#)].,%#,CKI;@trigger %va/TRIG_BROADCAST=%q0,%#,CKI}
+&CMD_JOB/CLAIM [v(JOB_GO)]=$+job/claim *:@force %#=+job/assign %0=%#
+&CMD_JOB/CLONE [v(JOB_GO)]=$+job/clone *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][udefault(%q0/CLN_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that
number.},110*,{@pemit %#=You do not have access to that
job.},11110*,{@pemit %#=That action is not available for that job.},{@pemit
[setq(1,inc(get(%va/JOBS_NUM)))]%#=Job copied as
Job %q1.;&JOBS_NUM %va=%q1;@clone %q0=Job %q1;@tel
[setr(2,num(Job %q1))]=%va;@trigger %va/TRIG_ADD=%q2,Cloned
job.,%#,CLN,%q0;@trigger %va/TRIG_BROADCAST=%q0,%#,CLN,%q1}
+&CMD_JOB/COMPLETE [v(JOB_GO)]=$+job/complete *=*:@switch
[u(%va/HAS_ACCESS,%#)][u(%va/COMPLETE_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][not(u(%va/IS_LOCKED,%q0,%#))][udefault(%q0/COM_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=Permission denied.},110*,{@pemit %#=That is not a
valid job #. See '+jobs/all' for valid jobs.},1110*,{@pemit %#=Permission
denied.},11110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},111110*,{@pemit %#=That action
is not available for that
job.},{@pemit %#=[u(%va/FN_ADDSTAT_ART,parent(%q0),%q0)][u(%va/FN_ADDSTAT_ART,%vc,%q0)]You
have completed
[name(%q0)].;@trigger %va/TRIG_ADD=%q0,[u(%va/FN_STRTRUNC,trim(%1),get(%va/BUFFER))],%#,COM;@trigger %va/TRIG_BROADCAST=%q0,%#,COM,%q1;@trigger %va/TRIG_DESTROY=%q0}
+&CMD_JOB/CREATE [v(JOB_GO)]=$+job/create */*=*:@switch
[u(%va/HAS_ACCESS,%#)][u(%va/CREATE_ACCESS,%#)][setq(0,u(%va/FN_FIND-BUCKET,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,%q0,%#,%q0)][udefault(%q0/CRE_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=Permission denied.},110*,{@pemit %#=There is no
bucket by that name. Type '[ansi(h,+buckets)]' to get a list of
buckets.},1110*,{@pemit %#=You cannot access that
bucket.},11110*,{@pemit %#=That action is not available for that
bucket.},{@pemit [setq(1,inc(get(%va/JOBS_NUM)))]%#=You have created job
number %q1
entitled '[u(%va/FN_STRTRUNC,trim(%1),30)]'.;@trigger %va/TRIG_CREATE=%#,%q0,1,[u(%va/FN_STRTRUNC,trim(%1),30)],[u(%va/FN_STRTRUNC,trim(%2),u(%va/BUFFER))],,,1}
+&CMD_JOB/DELETE [v(JOB_GO)]=$+job/delete *:@switch
[u(%va/HAS_ACCESS,%#)][or(u(%va/DELETE_ACCESS,%#),u(%va/FN_WIZONLY,%#),switch(%#,%va,1,0))][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][not(u(%va/IS_LOCKED,%q0,%#))][udefault(%q0/DEL_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=Permission denied.},110*,{@pemit %#=That is not a
valid job number.},1110*,{@pemit %#=You do not have access to that
job.},11110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},111110*,{@pemit %#=That action
is not available for that
job.},{@pemit %#=[u(%va/FN_ADDSTAT_ART,parent(%q0),%q0)][u(%va/FN_ADDSTAT_ART,%vc,%q0)]You
have deleted [name(%q0)].;@trigger %va/TRIG_ADD=%q0,Job %0
Deleted,%#,DEL;@trigger %va/TRIG_DESTROY=%q0}
+&CMD_JOB/DENY [v(JOB_GO)]=$+job/deny *=*:@switch
[u(%va/HAS_ACCESS,%#)][or(u(%va/DENY_ACCESS,%#),u(%va/FN_STAFFALL,%#))][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][not(u(%va/IS_LOCKED,%q0,%#))][udefault(%q0/DNY_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=Permission denied.},110*,{@pemit %#=There is no job
by that number.},1110*,{@pemit %#=You cannot access that
job.},11110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},111110*,{@pemit %#=That action
is not available for that
job.},{@pemit %#=[u(%va/FN_ADDSTAT_ART,parent(%q0),%q0)][u(%va/FN_ADDSTAT_ART,%vc,%q0)]You
have denied
[name(%q0)].;@trigger %va/TRIG_BROADCAST=%q0,%#,DNY;@trigger %va/TRIG_ADD=%q0,[u(%va/FN_STRTRUNC,trim(%1),get(%va/BUFFER))],%#,DNY;@trigger %va/TRIG_DESTROY=%q0}
+&CMD_JOB/DUE [v(JOB_GO)]=$+job/due *=*:@switch
[not(eq(words(trim(%1),/),3))][u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][udefault(%q0/DUE_ACCESS,1,%#)][switch(lcstr(trim(%1)),none,2,ifelse(gt(setr(1,u(%va/FN_STRINGSECS,trim(%1))),0),1[setq(1,add(%q1,secs()))],ifelse(gt(setr(1,convtime(trim(%1))),0),1,ifelse(gt(setr(1,convtime(trim(XXX %1))),0),1,t(gt(setr(1,convtime(trim(%1
23:59:59))),0))))))]=0*,{@@},10*,{@pemit %#=Permission
denied.},110*,{@pemit %#=That is not a valid job
number.},1110*,{@pemit %#=You do not have access to that
job.},11110*,{@pemit %#=That action is not available for that
job.},111110*,{@pemit %#=Invalid date. Use date formatting
as '[rest(time())]'.},111112*,{@pemit %#=You have cleared [name(%q0)]'s
date.;&DUE_ON %q0=;@trigger %va/TRIG_ADD=%q0,Due date
cleared.,%#,DUE;@trigger %va/TRIG_BROADCAST=%q0,%#,DUE},{@pemit %#=You have
set [name(%q0)]'s date to
[convsecs(%q1)].;&DUE_ON %q0=%q1;@trigger %va/TRIG_ADD=%q0,Due on
[secure(%1)].,%#,DUE,[secure(%1)];@trigger %va/TRIG_BROADCAST=%q0,%#,DUE}
+&CMD_JOB/DUE2 [v(JOB_GO)]=$+job/due *=*/*/*:@switch
[u(%va/HAS_ACCESS,%#)][isdbref(setr(0,u(%va/FN_FIND-JOB,%0)))][setq(1,convtime(XXX
[switch([rjust(trim(%1),2,0)],01,Jan,02,Feb,03,Mar,04,Apr,05,May,06,Jun,07,Jul,08,Aug,09,Sep,10,Oct,11,Nov,12,Dec)]
[rjust(trim(%2),2,0)] 23:59:00
[switch(strlen(trim(%3)),2,20[rjust(trim(%3),2,0)],trim(%3))]))][gt(%q1,0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][udefault(%q0/DUE_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=That is not a valid job
number.},110*,{@pemit %#=Invalid date. Use date formatting
as 'MM/DD/YY', '[rest(time())]', 'none' to clear.},1110*,{@pemit %#=You do
not have access to that job.},11110*,{@pemit %#=That action is not
available for that job.},{@pemit %#=You have set [name(%q0)]'s date to
[convsecs(%q1)].;&DUE_ON %q0=%q1;@trigger %va/TRIG_ADD=%q0,Due on
[convsecs(%q1)].,%#,DUE;@trigger %va/TRIG_BROADCAST=%q0,%#,DUE}
+&CMD_JOB/EDIT [v(JOB_GO)]=$+job/edit */*=*/*:@switch
[u(%va/HAS_ACCESS,%#)][u(%va/EDIT_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][setq(1,get(%q0/COMMENT_[trim(%1)]))][switch(first(%q1,|
),ADD,1,CRE,1,0)][not(u(%va/IS_LOCKED,%q0,%#))][switch(extract(%q1,3,1,|
),%#,1,u(%va/FN_WIZONLY,%#))][udefault(%q0/EDT_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=Permission denied.},110*,{@pemit %#=That is an
invalid job number.},1110*,{@pemit %#=You do not have access to that
job.},11110*,{@pemit %#=You cannot modify that
entry.},111110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},1111110*,{@pemit %#=You can only
edit entries that belong to you.},11111110*,{@pemit %#=That action is not
available for that job.},{&COMMENT_[trim(%1)] %q0=[extract(%q1,1,4,|)]|
[edit(last(%q1,|
),edit(%2,|,@@PIPE@@),edit(%3,|,@@PIPE@@))];@pemit %#=Edited:
[last(u(%q0/COMMENT_[trim(%1)]),|)];@trigger %va/TRIG_ADD=%q0,Comment %1
edited
by %n.,%#,EDT,[objeval(%#,secure(%1))];@trigger %va/TRIG_BROADCAST=%q0,%#,EDT}
+&CMD_JOB/ERROR [v(JOB_GO)]=$+job:@switch
[u(%va/HAS_ACCESS,%#)]=0*,{@pemit %#=Use +myjobs to access your
jobs.},{@pemit %#=Type '+jobs' for a list of jobs, or '+job <#>' to view a
specific job.}
+&CMD_JOB/ESC [v(JOB_GO)]=$+job/esc *=*:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][setq(1,match(green
yellow red,[trim(%1)]*))][setq(2,extract(GREEN YELLOW
RED,%q1,1))][gt(%q1,0)][not(u(%va/IS_LOCKED,%q0,%#))][udefault(%q0/ESC_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=That is not a valid job
number.},110*,{@pemit %#=You do not have access to that
job.},1110*,{@pemit %#=That is not a valid escalation code. Valid codes are
red, yellow, and green.},11110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},111110*,{@pemit %#=That action
is not available for that job.},{@pemit %#=You have escalated job # %0
to %q2 status.;&PRIORITY %q0=%q1;@trigger %va/TRIG_ADD=%q0,Priority
To %q2.,%#,ESC,ucstr(trim(%1));@trigger %va/TRIG_BROADCAST=%q0,%#,ESC,%q2}
+&CMD_JOB/HELP [v(JOB_GO)]=$+job/help *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,parent(u(%va/FN_FIND-JOB,%0)))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,%q0,%#,%q0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=That is not a valid job. Type '[ansi(h,+jobs)]' for
a list of valid jobs.},110*,{@pemit %#=You do not have access to that
job.},{@pemit %#=[u(%va/FN_HEADER,Job Help For Bucket
[name(%q0)])];@pemit %#=[u(%q0/HELP)][ifelse(u(%va/FN_HASATTRP,%q0,MYHELP),%r[u(%va/FN_BREAK,[ansi(c,Myjob
Help)])]%r[u(%q0/MYHELP)],)];@pemit %#=[u(%va/FN_FOOTER)]}
+&CMD_JOB/LAST [v(JOB_GO)]=$+job/last *=*:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that name. Please
type '+jobs/all' for all jobs or '+jobs/<type>' to list by
type.},110*,{@pemit %#=You do not have access to that
job.},{@pemit %#=[u(%va/FN_READERS,%q0,%#,1)][u(%va/FN_HEADER,View
[name(%q0)])]%r[ulocal(%va/FN_BANNER,%q0)];@dolist
[extract(setr(1,filter(%va/FIL_COMMENTS,sortby(%va/SORTBY_COMMENTS,lattr(%q0/COMMENT_*)))),ifelse(lt(sub(words(%q1),trim(%1)),1),1,inc(sub(words(%q1),trim(%1)))),inc(trim(%1)))]={@pemit %#=[u(%va/FN_READJOB,##,%q0)]};@wait
0={@pemit %#=[u(%va/FN_FOOTER,u(%va/FN_FLAGS,%q0))]};}
+&CMD_JOB/LOCK [v(JOB_GO)]=$+job/lock *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][not(u(%va/FN_HASATTR,%q0,LOCKED))][udefault(%q0/LOK_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=That is an invalid job number.},110*,{@pemit %#=You
do not have access to that job.},1110*,{@pemit %#=That job is already
locked.},11110*,{@pemit %#=That action is not available for that
job.},{@pemit %#=You have locked [name(%q0)]. No further modifications can
be made to this job until it is
unlocked.;&LOCKED_BY %q0=%#;&LOCKED %q0=1;@trigger %va/TRIG_ADD=%q0,Locked
by %n.,%#,LOK;@trigger %va/TRIG_BROADCAST=%q0,%#,LOK}
+&CMD_JOB/LOG [v(JOB_GO)]=$+job/log *:@switch
[u(%va/HAS_ACCESS,%#)][u(%va/LOG_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][u(%va/FN_HASATTRP,%q0,LOGFILE)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=Permission denied.},110*,{@pemit %#=There is no job
by that name. Please type '+jobs/all' for all jobs or '+jobs/<type>' to
list by type.},1110*,{@pemit %#=You do not have access to that
job.},11110*,{@pemit %#=There is no logfile for that
bucket.},{@pemit %#=Logging [name(%q0)] to
game/[switch(first(version()),PennMUSH,log/command.log,TinyMUSH,netmush.log,RhostMUSH,[get(%q0/LOGFILE)]_manual.log,logs/M-[get(%q0/LOGFILE)].log%rNote
that if the log file does not exist, then it did not get
logged.)];@trigger %va/TRIG_LOG=%q0,%#}
+&CMD_JOB/MAIL [v(JOB_GO)]=$+job/mail *=*:@switch
[u(%va/HAS_ACCESS,%#)][u(%va/MAIL_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][u(%va/IS_PUBLIC,%q0)][not(u(%va/IS_LOCKED,%q0,%#))][udefault(%q0/MAI_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=Permission denied.},110*,{@pemit %#=There is no job
by that number.},1110*,{@pemit %#=You do not have access to that
job.},11110*,{@pemit %#=+job/mail cannot be used on the job because the
bucket in which it is stored is not set
PUBLIC %(+myjobs-accessible%).},111110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},1111110*,{@pemit %#=That action
is not available for that job.},{@pemit %#=You have mailed
[u(%va/FN_PLAYERLIST,%q0)] about [name(%q0)], with the comments:
[trim(%1)];@trigger %va/TRIG_ADD=%q0,[u(%va/FN_STRTRUNC,ansi(h,Mail sent to
[u(%va/FN_PLAYERLIST,%q0)]:)%r%r[trim(%1)],get(%va/BUFFER))],%#,MAI;@trigger %va/TRIG_BROADCAST=%q0,%#,MAI,%q1}
+&CMD_JOB/MERGE [v(JOB_GO)]=$+job/merge *=*:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%1))][setq(1,u(%va/FN_FIND-JOB,%0))][isdbref(%q1)][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][u(%va/FN_ACCESSCHECK,parent(%q1),%#,%q0)][setq(2,u(%q0/NUM_COMMENT))][setq(3,u(%q1/NUM_COMMENT))][and(not(u(%va/IS_LOCKED,%q0,%#)),not(u(%va/IS_LOCKED,%q1,%#)))][not(eq(%0,%1))][udefault(%q0/MRG_ACCESS,1,%#)][udefault(%q1/MRG_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job number %0.},110*,{@pemit %#=There
is no job number %1.},1110*,{@pemit %#=You do not have access to
[name(%q0)].},11110*,{@pemit %#=You do not have access to
[name(%q1)].},111110*,{@pemit %#=One of those jobs is locked or checked
out.},1111110*,{@pemit %#=Sort of like a Klein bottle,
eh?},11111110*,{@pemit %#=That action is not available for
[name(%q0)].},111111110*,{@pemit %#=That action is not available for
[name(%q1)].},{@trigger %va/TRIG_ADD=%q0,[name(%q1)] merged into this
one.,%#,MRG;@trigger %va/TRIG_BROADCAST=%q0,%#,MRG,%q1;@wait 0={@dolist
[sortby(%va/SORTBY_COMMENTS,lattr(%q1/COMMENT_*))]={@cpattr %q1/##=%q0/COMMENT_[get(%q0/NUM_COMMENT)];&NUM_COMMENT %q0=[inc(get(%q0/NUM_COMMENT))]};@trigger %va/TRIG_DESTROY=%q1}};
+&CMD_JOB/NAME [v(JOB_GO)]=$+job/name *=*:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][not(u(%va/IS_LOCKED,%q0,%#))][udefault(%q0/NAM_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that name.},110*,{@pemit %#=You
do not have access to that job.},1110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},11110*,{@pemit %#=That action is
not available for that job.},{@pemit %#=You have changed the name of
[name(%q0)] to
[trim(%1)].;&TITLE %q0=[secure(trim(%1))];@trigger %va/TRIG_ADD=%q0,Renamed
to '[secure(trim(%1))]'.,%#,NAM;@trigger %va/TRIG_BROADCAST=%q0,%#,NAM,[secure(trim(%1))]}
+&CMD_JOB/NEW [v(JOB_GO)]=$+job/new *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][setq(1,default(%#/LAST_CONN,0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that name. Please
type '+jobs/all' for all jobs or '+jobs/<type>' to list jobs by
type.},110*,{@pemit %#=You do not have access to that
job.},{@pemit %#=[u(%va/FN_HEADER,View
[name(%q0)])]%r[ulocal(%va/FN_BANNER,%q0)][ifelse(u(%va/FN_HASATTRP,%q0,SUMMARY),[ulocal(%va/FN_SUMMARY,%q0)],)];@dolist
[filter(%va/FIL_NEWCOMMENTS[default(%#/JOBSN,0)],sortby(%va/SORTBY_COMMENTS,lattr(%q0/COMMENT_*)))]={@pemit %#=[u(%va/FN_READJOB,##,%q0)]};@wait
0={@pemit %#=[ifelse(u(%va/IS_LOCKED,%q0,%#),u(%va/FN_FOOTER,u(%va/FN_FLAGS,%q0)),[u(%va/FN_FOOTER,New
Activity on [name(%q0)] since
[convsecs(%q1)])])][u(%va/FN_READERS,%q0,%#,1)]};}
+&CMD_JOB/NOSPAM [v(JOB_GO)]=$+job/nospam *:@switch
[u(%va/HAS_ACCESS,%#)][setq(1,u(%va/FN_FIND-JOB,%0))][isdbref(%q1)][u(%va/FN_ACCESSCHECK,parent(%q1),%#,%q1)][gt(member(get(%q1/NOSPAM),u(%va/FN_OBJID,%#)),0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that name.},110*,{@pemit %#=You
don't have access to that job.},1110*,{@pemit %#=You will not be mailed
about
[name(%q1)].;&NOSPAM %q1=[setunion(get(%q1/NOSPAM),u(%va/FN_OBJID,%#))];},{@pemit %#=You
will be mailed about
[name(%q1)].;&NOSPAM %q1=[remove(get(%q1/NOSPAM),u(%va/FN_OBJID,%#))];}
+&CMD_JOB/PUBLISH [v(JOB_GO)]=$+job/publish *:@switch
[eq(words(%0,=),1)][u(%va/HAS_ACCESS,%#)][u(%va/EDIT_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][u(%va/FN_HASATTRP,%q0,PUBLIC)][not(u(%va/IS_LOCKED,%q0,%#))][udefault(%q0/PUB_ACCESS,1,%#)][eq(u(%q0/PUBLISH),1)]=0*,@@,10*,{@pemit %#=Permission
denied.},110*,{@pemit %#=Permission denied.},1110*,{@pemit %#=There is no
job by that number.},11110*,{@pemit %#=You do not have access to that
job.},111110*,{@pemit %#=That job is not in a bucket that is accessible to
+myjobs, so publication is moot.},1111110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},11111110*,{@pemit %#=That action
is not available for that job.},111111110*,{@pemit %#=You have published
[name(%q0)].;&PUBLISH %q0=1;@trigger %va/TRIG_ADD=%q0,Published
by %n.,%#,PUB;@trigger %va/TRIG_BROADCAST=%q0,%#,PUB},{@pemit %#=[name(%q0)]
will now no longer be
published.;&PUBLISH %q0=0;@trigger %va/TRIG_ADD=%q0,Unpublished
by %n.,%#,UNP;@trigger %va/TRIG_BROADCAST=%q0,%#,UNP}
+&CMD_JOB/PUBLISH2 [v(JOB_GO)]=$+job/publish *=*:@switch
[u(%va/HAS_ACCESS,%#)][u(%va/EDIT_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][not(u(%va/IS_LOCKED,%q0,%#))][u(%va/IS_PUBLIC,%q0)][u(%va/FN_HASATTRP,%q0,COMMENT_[trim(%1)])][udefault(%q0/PUB_ACCESS,1,%#)][neq(u(%q0/PUBLISH),1)][hasflag(%q0/COMMENT_%1,no_inherit)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=Permission denied.},110*,{@pemit %#=There is no job
by that number.},1110*,{@pemit %#=You do not have access to that
job.},11110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},111110*,{@pemit %#=That job is
not in a bucket that is accessible to +myjobs, so publication is
moot.},1111110*,{@pemit %#=That is not a valid comment
number.},11111110*,{@pemit %#=That action is not available for that
job.},111111110*,{@pemit %#=That job is published. Comment publication has
no effect.},1111111110*,{@pemit %#=You have published Comment [trim(%1)] on
[name(%q0)].;@set %q0/COMMENT_[trim(%1)]=no_inherit;@trigger %va/TRIG_ADD=%q0,Comment
[trim(%1)] published
by %n.,%#,PUB;@trigger %va/TRIG_BROADCAST=%q0,%#,PUB,%1},{@pemit %#=[name(%q0)]/Comment
[trim(%1)] will no longer be
published.;@set %q0/COMMENT_[trim(%1)]=!no_inherit;@trigger %va/TRIG_ADD=%q0,Comment
[trim(%1)] Unpublished
by %n.,%#,UNP;@trigger %va/TRIG_BROADCAST=%q0,%#,UNP,trim(%1)}
+&CMD_JOB/QUERY [v(JOB_GO)]=$+job/query */*=*:@switch
[and(u(%va/HAS_ACCESS,%#),u(%va/MAIL_ACCESS,%#))]=0*,{@pemit %#=Permission
denied.},{@switch
[setq(1,map(%va/MAP_SOURCE,secure(trim(%0))))][setq(2,member(%q1,#-1))][not(gt(%q2,0))]=0,{@pemit %#='[extract(secure(trim(%0)),%q2,1)]'
is not a valid player or jgroup.},{@pemit %#=You have sent a query
to '[trim(%0)]'
regarding '[trim(%1)]'.;@trigger %va/TRIG_CREATE=%#,u(%va/FN_FIND-BUCKET,QUERY),2,[u(%va/FN_STRTRUNC,secure(trim(%1)),30)],Queried
[u(%va/FN_ITEMIZE,map(%va/MAP_NAME,%q1,%b,|),|
)]:%r%r[u(%va/FN_STRTRUNC,trim(%2),get(%va/BUFFER))],%q1,,0}}
+&CMD_JOB/SET [v(JOB_GO)]=$+job/set *=*:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][setq(a,trim(%1))][setq(2,after(first(filter(%va/FIL_STATUS,lattr(%va/STATUS_*))),STATUS_))][gt(strlen(%q2),0)][not(u(%va/IS_LOCKED,%q0,%#))][udefault(%q0/STA_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=That is not a valid job.},110*,{@pemit %#=You do
not have access to that job.},1110*,{@pemit %#=That is an invalid setting.
Valid job settings
are:%r[u(%va/FN_ITEMIZE,iter(lattr(%va/STATUS_*),last(get(%va/[itext(0)]),|
),%b,|),|)].},11110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},111110*,{@pemit %#=That action
is not available for that job.},{@pemit %#=You set [name(%q0)] to
[setr(1,last(get(%va/STATUS_%q2),|))]
status.;&STATUS %q0=%q2;@trigger %va/TRIG_ADD=%q0,Set
to %q1.,%#,STA;@trigger %va/TRIG_BROADCAST=%q0,%#,STA,%q1}
+&CMD_JOB/SILENCE [v(JOB_GO)]=$+job/silence *:@switch
[u(%va/HAS_ACCESS,%#)][setq(1,u(%va/FN_FIND-JOB,%0))][isdbref(%q1)][u(%va/FN_ACCESSCHECK,parent(%q1),%#,%q1)][gt(member(get(%q1/SILENCE),u(%va/FN_OBJID,%#)),0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that name.},110*,{@pemit %#=You
don't have access to that job.},1110*,{@pemit %#=You will not hear
broadcasts about
[name(%q1)].;&SILENCE %q1=[setunion(get(%q1/SILENCE),u(%va/FN_OBJID,%#))];},{@pemit %#=You
will hear broadcasts about
[name(%q1)].;&SILENCE %q1=[remove(get(%q1/SILENCE),u(%va/FN_OBJID,%#))];}
+&CMD_JOB/SOURCE [v(JOB_GO)]=$+job/source *=*:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][not(u(%va/IS_LOCKED,%q0,%#))][setq(1,map(%va/MAP_SOURCE,secure(trim(%1))))][setq(2,member(%q1,#-1))][not(gt(%q2,0))][udefault(%q0/SRC_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that
number.},110*,{@pemit %#=You do not have access to that
job.},1110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},11110*,{@pemit %#='[extract(secure(trim(%1)),%q2,1)]'
is not a valid player or jgroup.},111110*,{@pemit %#=That action is not
available for that job.},{&opened_by %q0=%q1;@pemit %#=You have set job #%0
to have a source of
[u(%va/FN_PLAYERLIST,%q0)].;@trigger %va/TRIG_ADD=%q0,Source changed to
[u(%va/FN_PLAYERLIST,%q0)].,%#,SRC;@trigger %va/TRIG_BROADCAST=%q0,%#,SRC,%q1}
+&CMD_JOB/SUMMARY [v(JOB_GO)]=$+job/summary *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that name. Please
type '[ansi(h,+jobs/all)]' for all jobs or '[ansi(h,+jobs/list <bucket>)]'
to list by bucket.},110*,{@pemit %#=You do not have access to that
job.},{@pemit %#=[u(%va/FN_HEADER,View
[name(%q0)])]%r[ulocal(%va/FN_BANNER,%q0)][ifelse(u(%va/FN_HASATTRP,%q0,SUMMARY),[ulocal(%va/FN_SUMMARY,%q0)],)][ifelse(u(%va/FN_WIZONLY,%#),[ulocal(%va/FN_STAFFSUM,%q0)],)];@wait
0={@pemit %#=[u(%va/FN_FOOTER,u(%va/FN_FLAGS,%q0))]};}
+&CMD_JOB/SUMSET [v(JOB_GO)]=$+job/sumset */*=*:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_HASATTRP,parent(%q0),ACCESS_[trim(%1)])][and(u(%va/CONFIG_ACCESS,%#),u(parent(%q0)/ACCESS_[trim(%1)],%#))][not(u(%va/IS_LOCKED,%q0,%#))][u(parent(%q0)/PROCESS_[trim(%1)],trim(%2),%q0,%#)][udefault(%q0/SUM_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no such job. See '[ansi(h,+jobs)]' for a
list of valid jobs.},110*,{@pemit %#='[trim(%1)]' is not a valid parameter.
Valid parameters for [name(%q0)] are
[u(%va/FN_ITEMIZE,map(%va/MAP_PARAMS,lattr(parent(%q0)/PROCESS_*)))].},1110*,{@pemit %#=You
either can not use the +job/sumset command, or set that
parameter.},11110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},111110*,{@pemit %#=[u(%q0/ERROR_[trim(%1)]%q2)]},1111110*,{@pemit %#=That
action is not available for that
job.},{@trigger %va/TRIG_BROADCAST=%q0,%#,SUM,[ucstr(trim(%1))];&%q3 %q0=%q1;@trigger %va/TRIG_ADD=%q0,[ucstr(trim(%1))]
parameter updated to '[trim(%2)]',%#,SUM}
+&CMD_JOB/TAG [v(JOB_GO)]=$+job/tag *:@switch
[u(%va/HAS_ACCESS,%#)][switch(strmatch(%0,*=*),1,[setq(8,first(%0,=))][setq(9,trim(secure(rest(%0,=))))],[setq(8,%0)][setq(9,%#)])][setq(7,map(%va/MAP_JGROUP,%q9))][setq(6,u(%va/fn_trim,squish(map(%va/MAP_JGROUPERROR,%q9))))][setq(0,u(%va/FN_FIND-JOB,%q8))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][not(u(%va/IS_LOCKED,%q0,%#))][udefault(%q0/TAG_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=That is an invalid job number.},110*,{@pemit %#=You
do not have access to that job.},1110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},11110*,{@pemit %#=That action is
not available for that job.},{@switch
[t(strlen(%q6))]=1,{@pemit %#=%q6},{@switch
[strlen(setdiff(%q7,get(%q0/tagged_for)))]=0,{@pemit %#={[name(%q0)] is
already tagged for the named player(s):
[u(%va/FN_ITEMIZE,map(%va/MAP_NAME,%q7,%b,|),|
)]}},{&tagged_for %q0=[setunion(get(%q0/tagged_for),%q7)];@trigger %va/TRIG_ADD=%q0,Added
tags for [setr(5,u(%va/FN_ITEMIZE,map(%va/MAP_NAME,%q7,%b,|),|
))],%#,TAG,%q7;@trigger %va/TRIG_BROADCAST=%q0,%#,TAG,%q5;@pemit %#={[name(%q0)]
updated - tags added. Now tagged for:
[u(%va/FN_ITEMIZE,map(%va/MAP_NAME,get(%q0/tagged_for),%b,|),|)]}}}}
+&CMD_JOB/TRANS [v(JOB_GO)]=$+job/trans *=*:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][isdbref(setr(1,u(%va/FN_FIND-BUCKET,%1)))][udefault(%q0/TRN_ACCESS,1,%#)][udefault(%q1/TRN_ACCESS,1,%#)][not(u(%va/IS_LOCKED,%q0,%#))]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that
number.},110*,{@pemit %#=You do not have access to that
job.},1110*,{@pemit %#=There is no bucket by that name.
Type '[ansi(h,+buckets)]' for a list of valid
buckets.},11110*,{@pemit %#=You cannot move that job from
there.},111110*,{@pemit %#=You cannot move that job to
there.},1111110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},{@pemit %#=You have transferred
the job from [u(%va/FN_BUCKETNAME,%q0)] to
[name(%q1)].;&going %q0;@parent %q0=%q1;@trigger %va/TRIG_ADD=%q0,Transferred
to [name(%q1)].,%#,TRN;@trigger %va/TRIG_BROADCAST=%q0,%#,TRN,%q1}
+&CMD_JOB/UNDELETE [v(JOB_GO)]=$+job/undelete *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][u(%va/FN_HASATTR,%q0,GOING)][udefault(%q0/UND_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that
number.},110*,{@pemit %#=You do not have access to that
job.},1110*,{@pemit %#=That job has not been
deleted.},11110*,{@pemit %#=That action is not available for that
job.},{@pemit %#=You have restored
[name(%q0)].;&going %q0;@trigger %va/TRIG_ADD=%q0,Undeleted
job.,%#,UND;@trigger %va/TRIG_BROADCAST=%q0,%#,UND,%q1}
+&CMD_JOB/UNLOCK [v(JOB_GO)]=$+job/unlock *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][u(%va/FN_HASATTRP,%q0,LOCKED)][udefault(%q0/UNL_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=That is an invalid job number.},110*,{@pemit %#=You
do not have access to that job.},1110*,{@pemit %#=That job is not
locked.},11110*,{@pemit %#=That action is not available for that
job.},{@pemit %#=You have unlocked
[name(%q0)].;&LOCKED %q0=;&LOCKED_BY %q0=;@trigger %va/TRIG_ADD=%q0,Unlocked
by %n.,%#,UNL;@trigger %va/TRIG_BROADCAST=%q0,%#,UNL}
+&CMD_JOB/UNTAG [v(JOB_GO)]=$+job/untag *:@switch
[u(%va/HAS_ACCESS,%#)][switch(strmatch(%0,*=*),1,[setq(8,first(%0,=))][setq(9,trim(secure(rest(%0,=))))],[setq(8,%0)][setq(9,%#)])][setq(7,map(%va/MAP_JGROUP,%q9))][setq(6,u(%va/fn_trim,squish(map(%va/MAP_JGROUPERROR,%q9))))][setq(0,u(%va/FN_FIND-JOB,%q8))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)][not(u(%va/IS_LOCKED,%q0,%#))][udefault(%q0/TAG_ACCESS,1,%#)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=That is an invalid job number.},110*,{@pemit %#=You
do not have access to that job.},1110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out to
[name(first(get(%q0/CHECKOUT)))],locked)]},11110*,{@pemit %#=That action is
not available for that job.},{@switch
[t(strlen(%q6))]=1,{@pemit %#=%q6},{@switch
[strlen(setinter(%q7,get(%q0/tagged_for)))]=0,{@pemit %#={[name(%q0)] is
not tagged for any of the named player(s):
[u(%va/FN_ITEMIZE,map(%va/MAP_NAME,%q7,%b,|),|
)]}},{&tagged_for %q0=[setdiff(get(%q0/tagged_for),%q7)];@trigger %va/TRIG_ADD=%q0,Removed
tags for [setr(5,u(%va/FN_ITEMIZE,map(%va/MAP_NAME,%q7,%b,|),|
))],%#,TAG;@trigger %va/TRIG_BROADCAST=%q0,%#,TAG,%q5;@pemit %#={[name(%q0)]
updated - tags removed. Now tagged for:
[u(%va/FN_ITEMIZE,map(%va/MAP_NAME,get(%q0/tagged_for),%b,|),|)]}}}}
+&CMD_JOB/VIEW [v(JOB_GO)]=$+job *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,parent(%q0),%#,%q0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no job by that name. Please
type '[ansi(h,+jobs/all)]' for all jobs or '[ansi(h,+jobs/list <bucket>)]'
to list by bucket.},110*,{@pemit %#=You do not have access to that
job.},{@pemit %#=[u(%va/FN_READERS,%q0,%#,1)][u(%va/FN_HEADER,View
[name(%q0)])]%r[ulocal(%va/FN_BANNER,%q0,%#)][ifelse(u(%va/FN_HASATTRP,%q0,SUMMARY),[ulocal(%va/FN_SUMMARY,%q0,%#)],)];@dolist
[filter(%va/FIL_COMMENTS,sortby(%va/SORTBY_COMMENTS,lattr(%q0/COMMENT_*)))]={@pemit %#=[u(%va/FN_READJOB,##,%q0)]};&TAGGED_FOR %q0=[ifelse(default(%#/JOBS_UNTAGREAD,1),setdiff(get(%q0/TAGGED_FOR),%#),get(%q0/TAGGED_FOR))];@wait
0={@pemit %#=[u(%va/FN_FOOTER,u(%va/FN_FLAGS,%q0))]};}
+&CMD_JOBS [v(JOB_GO)]=$+jobs:@force %#=+jobs/select
[switch(u(%va/FN_HASATTR,%#,JOBSELECT),1,get(%#/JOBSELECT),monitor)]
+&CMD_JOBS/ALL [v(JOB_GO)]=$+jobs/all:@force %#=+jobs/select all
+&CMD_JOBS/CATCHUP [v(JOB_GO)]=$+jobs/catchup:@switch
[u(%va/HAS_ACCESS,%#)]=0*,{@pemit %#=Permission denied.},{@pemit %#=You are
now caught up on jobs.;&LAST_CONN %#=[secs()];@dolist lcon(%va)={think
[u(%va/FN_READERS,##,%#)]}}
+&CMD_JOBS/CATCHUP2 [v(JOB_GO)]=$+jobs/catchup *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,lcstr(%0))][setq(0,u(%va/FN_INFIX2POSTFIX,map(%va/MAP_JOBSELECT,u(%va/FN_TOKENLIST,%q0))))][not(strmatch(%qT,#-1
STACK OVERFLOW))][not(strmatch(%q0,*#-1 MISMATCHED
PARENS*))][not(strmatch(%q0,*#-1 SYNTAX
ERROR*))][default(%#/JOBSN,0)]=0*,@pemit %#=Permission
denied.,10*,@pemit %#=Stack overflow. Logic is too
complex.,110*,@pemit %#=Mismatched parentheses.,1110*,@pemit %#=Syntax
error.,11110*,@pemit %#=You must set &JOBSN me=1 to make use of this
command.,{@pemit %#=You are now caught up on jobs matching %q0.;@dolist
[setq(1,filter(%va/FIL_GOING,lcon(%va)))][u(%va/FN_S-INIT)][map(%va/MAP_PARSESTACK,%q0)][u(%va/FN_S-PEEK)]={think
[u(%va/FN_READERS,##,%#)]}}
+&CMD_JOBS/CLEAN [v(JOB_GO)]=$+jobs/clean:@switch
[u(%va/HAS_ACCESS,%#)]=0*,{@pemit %#=Permission
denied.},{@trigger %va/TRIG_CLEAN;@pemit %#=Removing all non-player entries
from Job Data.}
+&CMD_JOBS/COMPRESS [v(JOB_GO)]=$+jobs/compress:@switch
[u(%va/FN_WIZONLY,%#)][words(remove(lcon(%va),#-1))]=0*,{@pemit %#=Permission
denied.},10*,{&JOBS_NUM %va=0;@pemit %#=Compressed. The next job number
will be [inc(get(%va/JOBS_NUM))].},{@dolist
[lnum(1,words(lcon(%va)))]={@name [extract(revwords(lcon(%va)),##,1)]=Job
##};&JOBS_NUM %va=[words(lcon(%va))];@pemit %#=Compressed. The next job
number will be [inc(get(%va/JOBS_NUM))].}
+&CMD_JOBS/CREDITS
[v(JOB_GO)]=$+jobs/credits:@pemit %#=[u(%va/FN_HEADER,Anomaly
Jobs)]%r%rVersion: [u(%va/VERSION)][space(5)]Release:
[u(%va/RELEASE)]%r%rAuthor: [u(%va/CREDITS)]%r%rMaintainer:
[u(%va/MAINTAINER)]%r%rContributors:
[u(%va/CONTRIBUTORS)]%r%r[u(%va/LICENSE)]%r%r[u(%va/FN_FOOTER)]
+&CMD_JOBS/DATE [v(JOB_GO)]=$+jobs/date:@force %#=+jobs/select all sort=date
+&CMD_JOBS/DUE [v(JOB_GO)]=$+jobs/due:@force %#=+jobs/select all sort=due
+&CMD_JOBS/FROM [v(JOB_GO)]=$+jobs/from *:@force %#=+jobs/select source=%0
+&CMD_JOBS/LIST [v(JOB_GO)]=$+jobs/list *:@force %#=+jobs/select bucket=%0
+&CMD_JOBS/MINE [v(JOB_GO)]=$+jobs/mine:@force %#=+jobs/select mine
+&CMD_JOBS/NEW [v(JOB_GO)]=$+jobs/new:@force %#=+jobs/select new
+&CMD_JOBS/NOSPAM [v(JOB_GO)]=$+jobs/nospam *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-BUCKET,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,%q0,%#)][gt(member(get(%#/JOBS_NOSPAM_B),u(%va/FN_OBJID,%q0)),0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no bucket by that
name.},110*,{@pemit %#=You don't have access to that
bucket.},1110*,{@pemit %#=You will not be mailed about jobs in the
[name(%q0)]
bucket.;&JOBS_NOSPAM_B %#=[setunion(get(%#/JOBS_NOSPAM_B),u(%va/FN_OBJID,%q0))];},{@pemit %#=You
will be mailed about jobs in the [name(%q0)]
bucket.;&JOBS_NOSPAM_B %#=[remove(get(%#/JOBS_NOSPAM_B),u(%va/FN_OBJID,%q0))];}
+&CMD_JOBS/NOSPAM2 [v(JOB_GO)]=$+jobs/nospam:@force %#=+myjobs/nospam
+&CMD_JOBS/OVERDUE [v(JOB_GO)]=$+jobs/overdue:@force %#=+jobs/select overdue
+&CMD_JOBS/PRI [v(JOB_GO)]=$+jobs/pri:@force %#=+jobs/select all sort=pri
+&CMD_JOBS/REPORTS [v(JOB_GO)]=$+jobs/reports *:@switch
[and(u(%va/HAS_ACCESS,%#),u(%va/STATS_ACCESS,%#))][u(%va/FN_HASATTR,%va,REPORT_[first(%0,=)])][gt(words(%0,=),1)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no report by that name.
See '[ansi(h,+jobs/reports)]' for a list of valid
reports.},110*,{@pemit %#=[u(%va/FN_HEADER,[secure(ucstr(%0))]
Report)]%r;@pemit %#=[u(%va/REPORT_[secure(%0)])];@pemit %#=[u(%va/FN_FOOTER)]},{@pemit %#=[u(%va/FN_HEADER,[secure(first(ucstr(%0),=))]
Report)]%r;@pemit %#=[u(%va/REPORT_[first(secure(%0),=)],rest(secure(%0),=))];@pemit %#=[u(%va/FN_FOOTER)]}
+&CMD_JOBS/REPORTS2 [v(JOB_GO)]=$+jobs/reports:@switch
[and(u(%va/HAS_ACCESS,%#),u(%va/STATS_ACCESS,%#))]=0,{@pemit %#=Permission
denied.},{@pemit %#=[u(%va/FN_HEADER,Available
Reports)]%r[ansi(hc,[ljust(Name,10)][ljust(Description,u(%va/FN_FLEXWIDTH,59))][rjust(Type,10)])]%r[u(%va/FN_BREAK)];@pemit %#=[iter(sort(ucstr(map(%va/MAP_REPORTS,lattr(%va/REPORT_*)))),[ljust(##,10)][u(%va/FN_STREXACT,rest(get(%va/RTITLE_##),|
),u(%va/FN_FLEXWIDTH,59))][rjust(first(get(%va/RTITLE_##),|
),10)],%B,%R)];@pemit %#=[u(%va/FN_FOOTER,[ansi(h,+jobs/reports
<report>)])]}
+&CMD_JOBS/SEARCH [v(JOB_GO)]=$+jobs/search *:@force %#=+jobs/select
search="%0"
+&CMD_JOBS/SELECT [v(JOB_GO)]=$+jobs/select *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,before(lcstr(%0),sort=))][setq(0,u(%va/FN_INFIX2POSTFIX,map(%va/MAP_JOBSELECT,u(%va/FN_TOKENLIST,%q0))))][not(strmatch(%qT,#-1
STACK OVERFLOW))][not(strmatch(%q0,*#-1 MISMATCHED
PARENS*))][not(strmatch(%q0,*#-1 SYNTAX
ERROR*))][setq(9,u(%va/FN_TRIM,after(lcstr(%0),sort=)))][ifelse(setr(8,strmatch(%q9,-*)),setq(9,mid(%q9,1,dec(strlen(%q9)))),)][setq(9,ifelse(strlen(%q9),%q9,jobnum))][u(%va/FN_HASATTRP,%va,SORTBY_%q9)][setq(1,filter(%va/FIL_GOING,lcon(%va)))][u(%va/FN_S-INIT)][map(%va/MAP_PARSESTACK,%q0)][setq(7,filter(%va/FIL_JOBSELECT,ifelse(%q8,revwords(sortby(%va/SORTBY_%q9,u(%va/FN_S-PEEK))),sortby(%va/SORTBY_%q9,u(%va/FN_S-PEEK)))))]=0*,@pemit %#=Permission
denied.,10*,@pemit %#=Stack overflow. Logic is too
complex.,110*,@pemit %#=Mismatched parentheses.,1110*,@pemit %#=Syntax
error.,11110,@pemit %#=Invalid sort
type.,{@pemit %#=[u(%va/FN_JOBSHEADER,%#)];@dolist %q7=@pemit %#=[u(%va/FN_JOBLIST,##,%#)];@wait
0=@pemit %#=[u(%va/FN_FOOTER,* Denotes New Activity)]}
+&CMD_JOBS/SILENCE [v(JOB_GO)]=$+jobs/silence *:@switch
[u(%va/HAS_ACCESS,%#)][setq(0,u(%va/FN_FIND-BUCKET,%0))][isdbref(%q0)][u(%va/FN_ACCESSCHECK,%q0,%#)][gt(member(get(%#/JOBS_SILENCE_B),u(%va/FN_OBJID,%q0)),0)]=0*,{@pemit %#=Permission
denied.},10*,{@pemit %#=There is no bucket by that
name.},110*,{@pemit %#=You don't have access to that
bucket.},1110*,{@pemit %#=You will not hear broadcasts about jobs in the
[name(%q0)]
bucket.;&JOBS_SILENCE_B %#=[setunion(get(%#/JOBS_SILENCE_B),u(%va/FN_OBJID,%q0))];},{@pemit %#=You
will hear broadcasts about jobs in the [name(%q0)]
bucket.;&JOBS_SILENCE_B %#=[remove(get(%#/JOBS_SILENCE_B),u(%va/FN_OBJID,%q0))];}
+&CMD_JOBS/SILENCE2 [v(JOB_GO)]=$+jobs/silence:@switch
[u(%va/HAS_ACCESS,%#)][default(%#/JOBS_SILENCE,0)]=0*,{@pemit %#=Permission
denied.},10,{@pemit %#=You will not hear broadcasts about
jobs.;&JOBS_SILENCE %#=1;},{@pemit %#=You will hear broadcasts about
jobs.;&JOBS_SILENCE %#;}
+&CMD_JOBS/SORT [v(JOB_GO)]=$+jobs/sort:@force %#=+jobs/select all
sort=bucket
+&CMD_JOBS/WHO [v(JOB_GO)]=$+jobs/who *:@force %#=+jobs/select who=%0
+&CMD_JOBS/WHO2 [v(JOB_GO)]=$+jobs/who:@switch
[u(%va/HAS_ACCESS,%#)]=0*,{@pemit %#=Permission denied.},{@pemit %#=You
must identify a player.}
+&CMD_MYJOB/ADD [v(JOB_GO)]=$+myjob/add *=*:@switch
[not(u(%va/FN_GUEST,%#))][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][or(and(u(%va/IS_PUBLIC,%q0),match(get(%q0/OPENED_BY),%#)),u(%va/FN_MYACCESSCHECK,parent(%q0),%#,%q0),)][not(u(%va/FN_HASATTR,%q0,LOCKED))]=0*,@pemit %#=This
command is not available to guests.,10*,@pemit %#=That is an invalid job
number.,110*,@pemit %#=[name(%q0)] is not yours. You can only modify your
own jobs.,1110*,@pemit %#=That job is locked and cannot be changed at this
time.,{@pemit %#=Comments to [name(%q0)]
added.;&TAGGED_FOR %q0=[remove(get(%q0/TAGGED_FOR),%#)];@trigger %va/TRIG_ADD=%q0,trim(%1),%#,ADD;@trigger %va/TRIG_BROADCAST=%q0,%#,ADD}
+&CMD_MYJOB/HELP [v(JOB_GO)]=$+myjob/help *:@switch
[setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)]=0*,{@pemit %#=That is not a
valid job. Type '[ansi(h,+jobs)]' for a list of valid
jobs.},{@pemit %#=[u(%va/FN_HEADER,MyJob
Help)];@pemit %#=[ifelse(u(%va/FN_HASATTR,parent(%q0),MYHELP),u(%q0/MYHELP),No
+myjob help has been defined for that
bucket.)];@pemit %#=[u(%va/FN_FOOTER)]}
+&CMD_MYJOB/NOSPAM [v(JOB_GO)]=$+myjob/nospam *:@switch
[not(u(%va/FN_GUEST,%#))][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][or(u(%va/FN_MYACCESSCHECK,parent(%q0),%#,%q0),u(%va/IS_TRANSPARENT,%q0),and(get(%q0/PUBLIC),match(get(%q0/OPENED_BY),%#)))][gt(member(get(%q1/NOSPAM),u(%va/FN_OBJID,%#)),0)]=0*,{@pemit %#=This
command is not available to guests.},10*,{@pemit %#=That is not a valid job
number.},110*,{@pemit %#=[name(%q0)] is not yours.},1110*,{@pemit %#=You
will not be mailed about
[name(%q1)].;&NOSPAM %q1=[setunion(get(%q1/NOSPAM),u(%va/FN_OBJID,%#))];},{@pemit %#=You
will be mailed about
[name(%q1)].;&NOSPAM %q1=[remove(get(%q1/NOSPAM),u(%va/FN_OBJID,%#))];}
+&CMD_MYJOBS/NOSPAM [v(JOB_GO)]=$+myjobs/nospam:@switch
[default(%#/JOBS_NOSPAM,0)]=0,{@pemit %#=You will not be mailed about
jobs.;&JOBS_NOSPAM %#=1;},{@pemit %#=You will be mailed about
jobs.;&JOBS_NOSPAM %#;}
+&CMD_MYJOB/SUMSET [v(JOB_GO)]=$+myjob/sumset */*=*:@switch
[not(u(%va/FN_GUEST,%#))][isdbref(setr(0,u(%va/FN_FIND-JOB,%0)))][u(%va/FN_HASATTRP,parent(%q0),MYACCESS_[trim(%1)])][and(u(%va/CONFIG_ACCESS,%#),u(parent(%q0)/MYACCESS_[trim(%1)],%#))][not(u(%va/IS_LOCKED,%q0,%#))][u(parent(%q0)/MYPROCESS_[trim(%1)],trim(%2),%q0,%#)]=0*,{@pemit %#=This
command is not available to guests.},10*,{@pemit %#=There is no such job.
See '[ansi(h,+jobs)]' for a list of valid
jobs.},110*,{@pemit %#='[trim(%1)]' is not a valid parameter. Valid
parameters for [name(%q0)] are
[u(%va/FN_ITEMIZE,map(%va/MAP_PARAMS,lattr(parent(%q0)/MYPROCESS_*)))].},1110*,{@pemit %#=You
either can not use the +myjob/sumset command, or set that
parameter.},11110*,{@pemit %#=That job is presently
[ifelse(u(%va/FN_HASATTRP,%q0,CHECKOUT),checked out
to%b[name(first(get(%q0/CHECKOUT)))],locked)]},111110*,{@pemit %#=[u(%q0/MYERROR_[trim(%1)]%q2)]},{@trigger %va/TRIG_BROADCAST=%q0,%#,MYS,[ucstr(trim(%1))];&%q3 %q0=%q1;@trigger %va/TRIG_ADD=%q0,[ucstr(trim(%1))]
parameter updated to '[trim(%2)]',%#,MYS}
+&CMD_MYJOB/VIEW [v(JOB_GO)]=$+myjob *:@switch
[not(u(%va/FN_GUEST,%#))][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][or(u(%va/FN_MYACCESSCHECK,parent(%q0),%#,%q0),u(%va/IS_TRANSPARENT,%q0),and(get(%q0/PUBLIC),match(get(%q0/OPENED_BY),%#)))]=0*,{@pemit %#=This
command is not available to guests.},10*,{@pemit %#=That is not a valid job
number.},110*,{@pemit %#=[name(%q0)] is not yours. You can only view your
own jobs.},{@pemit %#=[u(%va/FN_READERS,%q0,%#,1)][u(%va/FN_HEADER,View
[name(%q0)])]%r[u(%va/FN_MYBANNER,%q0)][ifelse(u(%va/FN_HASATTRP,%q0,MYSUMMARY),[ulocal(%va/FN_MYSUMMARY,%q0,%#)],)];@dolist
[filter(%va/FIL_PUBLISHED,filter(%va/FIL_COMMENTS,sortby(%va/SORTBY_COMMENTS,lattr(%q0/COMMENT_*))))]={@pemit %#=[u(%va/FN_READJOB,##,%q0)]};@wait
0=@pemit %#=[u(%va/FN_FOOTER)]}
+&CMD_MYJOB/LAST [v(JOB_GO)]=$+myjob/last *=*:@switch
[not(u(%va/FN_GUEST,%#))][setq(0,u(%va/FN_FIND-JOB,%0))][isdbref(%q0)][or(u(%va/FN_MYACCESSCHECK,parent(%q0),%#,%q0),u(%va/IS_TRANSPARENT,%q0),and(get(%q0/PUBLIC),match(get(%q0/OPENED_BY),%#)))]=0*,{@pemit %#=This
command is not available to guests.},10*,{@pemit %#=That is not a valid job
number.},110*,{@pemit %#=[name(%q0)] is not yours. You can only view your
own jobs.},{@pemit %#=[u(%va/FN_READERS,%q0,%#,1)][u(%va/FN_HEADER,View
[name(%q0)])]%r[u(%va/FN_MYBANNER,%q0)][ifelse(u(%va/FN_HASATTRP,%q0,MYSUMMARY),[ulocal(%va/FN_MYSUMMARY,%q0,%#)],)];@dolist
[extract(setr(1,filter(%va/FIL_PUBLISHED,filter(%va/FIL_COMMENTS,sortby(%va/SORTBY_COMMENTS,lattr(%q0/COMMENT_*))))),ifelse(lt(sub(words(%q1),trim(%1)),1),1,inc(sub(words(%q1),trim(%1)))),inc(trim(%1)))]={@pemit %#=[u(%va/FN_READJOB,##,%q0)]};@wait
0=@pemit %#=[u(%va/FN_FOOTER)]}
+&CMD_MYJOBS [v(JOB_GO)]=$+myjobs:@switch
[u(%va/FN_GUEST,%#)][words(setr(0,filter(%va/FIL_MYJOBS,revwords(lcon(%va)))))]=1*,@pemit %#=This
command is not available to guests.,00,@pemit %#=You have no
+myjobs.,{@pemit %#=[u(%va/FN_MYJOBSHEADER,%#)];@dolist %q0=@pemit %#=[u(%va/FN_MYJOBLIST,##,%#)];@wait
0=@pemit %#=[u(%va/FN_FOOTER,[ansi(hr,*)] [ansi(hy,Denotes New Activity)])]}
+&CMD_MYJOBS/CATCHUP [v(JOB_GO)]=$+myjobs/catchup:@pemit %#=You are now
caught up on jobs.;&LAST_CONN %#=[secs()];@dolist lcon(%va)={think
[u(%va/FN_READERS,##,%#)]}
+&CMD_PITCH [v(JOB_GO)]=$+pitch *=*:@switch
[u(%va/FN_GUEST,%#)]=1,{@pemit %#=This command is not available to
guests.},{@pemit %#=You have pitched your idea to staff
about '[trim(secure(%0))]'. Please remember that this is merely an idea
[ansi(hu,pitch)], and not a request. Staff, for one reason or many, may
decide not to go with the
idea.;@trigger %va/TRIG_CREATE=%#,u(%va/FN_FIND-BUCKET,PITCH),1,[u(%va/FN_STRTRUNC,trim(secure(%0)),30)],trim(%1),,,3}
+&CMD_REQUEST [v(JOB_GO)]=$+request *=*:@switch
[u(%va/FN_GUEST,%#)]=1,{@pemit %#=This command is not available to
guests.},{@pemit %#=You have requested
[secure(u(%va/FN_STRTRUNC,trim(%0),30))] from staff. Please allow for some
time to process it. Do not page staff about it - you will hear back
soon.;@trigger %va/TRIG_CREATE=%#,u(%va/FN_FIND-BUCKET,REQ),2,[u(%va/FN_STRTRUNC,trim(secure(%0)),30)],[u(%va/FN_STRTRUNC,trim(%1),get(%va/BUFFER))],,,2}
+&CMD_TYPO [v(JOB_GO)]=$+typo *:@switch
[u(%va/FN_GUEST,%#)]=1,{@pemit %#=This command is not available to
guests.},{@pemit %#=You have notified production staff of the typo, with
the
details '[u(%va/FN_STRTRUNC,trim(%0),get(%va/BUFFER))]';@trigger %va/TRIG_CREATE=%#,u(%va/FN_FIND-BUCKET,BUILD),2,Typo
Reported at %L,[u(%va/FN_STRTRUNC,trim(%0),get(%va/BUFFER))],,,4}
+@dolist VA VB VC={@cpattr %#/JOB_##=[v(JOB_GO)]/##}
+think [ansi(hc,ANOMALY JOBS:)] Setting controlling attributes.
+@switch [v(JOB_PATCH)]=1,{@dolist STARTUP BUCKET_HEADER DATA_CHARS2
DISPLAY_MYHEADERS DISPLAY_MYJOB MYJOBS_HEADER FIL_DELETE FN_ANSIFY
FN_COORD2ANG FN_EASYPIE_PENN FN_EASYPIE_TINY FN_GENDATA MAP_GENDATA
MAP_GENDATA2 PENN_PIE PENN10_PIE PENN12_PIE FN_NEW_JOBS FN_PACK IS_PLAYER
JOBS_HEADER JOBS_HEADER2 MAP_ANSIFY MAP_ARTSGRAPH MAP_NAME2 MAP_NEW
MAP_ISPLAYER MAP_PMATCH MAP_READERS={@switch [hasattr(v(JOB_VA),##)]=1,&##
[v(JOB_VA)]}}
+&CHARGRAPH [v(JOB_VA)]=@+-/!*ox#.X$^`~O>
+&COLORGRAPH_1 [v(JOB_VA)]=gG
+&COLORGRAPH_2 [v(JOB_VA)]=yY
+&COLORGRAPH_3 [v(JOB_VA)]=rR
+&COLORGRAPH_4 [v(JOB_VA)]=cC
+&COLORGRAPH_5 [v(JOB_VA)]=bB
+&COLORGRAPH_6 [v(JOB_VA)]=mM
+&COLORGRAPH_7 [v(JOB_VA)]=wW
+&COLORGRAPH_8 [v(JOB_VA)]=hX
+&COLORGRAPH_9 [v(JOB_VA)]=hC
+&COLORGRAPH_10 [v(JOB_VA)]=hB
+&COLORGRAPH_11 [v(JOB_VA)]=hR
+&COLORGRAPH_12 [v(JOB_VA)]=hY
+&COLORGRAPH_13 [v(JOB_VA)]=hG
+&COLORGRAPH_14 [v(JOB_VA)]=hM
+&COLORGRAPH_15 [v(JOB_VA)]=hW
+&COLORGRAPH_16 [v(JOB_VA)]=hX
+&COLORGRAPH_17 [v(JOB_VA)]=hC
+&DATA_31-15
[v(JOB_VA)]=@@@@####$$$^^^&&&**((())__+++{{}}//;;'':::""<<<>>>???,,,....aaa !!@@@@###$$$^^^&&&**(()))__++{{}}//;;''::""<<<>>???,,,....aaaab !!!!@@@@###$$$^^&&&**(())__++{{}}//;''::"""<<>>???,,,...aaaabbb
~~!!!!@@@@###$$^^^&&**(())_++{{}}/;;''::""<<>>???,,...aaaabbbbc
=~~~~!!!@@@###$$^^^&&**())__+{{}//;;'::""<<>>??,,,..aaabbbbcccc
===~~~~!!!@@@###$$^^&&*(())_++{}//;'':""<<>>??,,..aaabbbbccccdd
--====~~~~!!!@@##$$^^&&*(()_++{}//;'::"<<>??,,...aabbbccccdddde
0----====~~~!!!@@##$$^&&*())_+{}/;;':"<<>??,,..aabbbcccddddeeee
00000----===~~~!!@@#$$^&&*()_+{}/;':"<<>?,,..aabbcccdddeeeeefff
99990000----===~~!!@@#$^^&*()+{}/;':"<>?,..aabbccdddeeeefffffgg
888999990000---==~~!!@##$^&()_+}/':"<>?,.abbccdddeeeffffggggggh
7778888889999000--==~~!@#$^&()+};'"<?,.abbcddeeefffggggghhhhhhh
66777777778888999900--=~!@#^&(+};:<?.abcddeeffgggghhhhhiiiiiiii
566666666666777778889900-=~@$&)}'<,abdeefggghhhiiiiiijjjjjjjjjj
5555555555555555666666778890=@&}<adegghiiijjjjjjjkkkkkkkkkkkkkk
4444444444444444444444444444444llllllllllllllllllllllllllllllll
3333332222222222221111```ZYXVSOHBwusrqppoooonnnnnnnnmmmmmmmmmmm
2222211111111`````ZZZYYXWVUSQOLHEBywvutsrrqqppppoooooooonnnnnnn
1111```````ZZZZYYYXXWWVUTSRQOMKHFDBzywvuutssrrrqqqqppppppoooooo
````ZZZZZZYYYYXXXWWVVUTSRQPOMLJHGECBAyxwwvuuttssrrrrqqqqqpppppp
ZZZZZYYYYXXXXWWWVVUUTSSRQPONLKJHGFDCBAzyxwwvvuuttssssrrrrqqqqqq
YYYYYXXXXWWWWVVUUTTSSRQQPONMLKJHGFEDCBAzyyxwwvvuuutttssssrrrrrq
YXXXXXWWWVVVVUUTTSSRRQPPONMLKJIHGFEDDCBAzzyxxwwvvvuuutttsssssrr
XXWWWWVVVVUUUTTSSRRQQPPONMMLKJIHHGFEDCCBAAzyyxxwwwvvuuuuttttsss
WWWVVVVUUUTTTSSSRRQQPOONNMLKKJIHHGFEEDCCBAAzzyyxxwwwvvvuuuutttt
VVVVUUUUTTTSSSRRQQPPOONNMLLKJJIHHGFFEDDCBBAAzzyyyxxwwwvvvvuuuut
VVUUUUTTTSSSRRRQQPPOONNMMLKKJJIHHGFFEEDDCBBAAzzzyyxxxwwwvvvvuuu
UUUTTTTSSSRRRQQQPPOONNMMLLKKJJIHHGGFFEDDCCBBAAAzzyyyxxxwwwwvvvv
UTTTTSSSSRRRQQPPPOONNNMMLLKKJIIHHGGFFEEDDCCBBAAAzzzyyyxxxwwwwvv
TTTSSSSRRRQQQPPPOONNNMMLLKKJJIIHHGGFFEEDDDCCBBBAAzzzyyyxxxxwwww
TSSSSRRRRQQQPPPOONNNMMLLLKKJJIIHHGGGFFEEDDCCCBBBAAzzzzyyyxxxxww
+&DATA_CHARS
[v(JOB_VA)]=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`1234567890-=~!@#$^&*()_+{}/;':"<>?,.
+&DISPLAY_# [v(JOB_VA)]=[u(%va/FN_STREXACT,%0,default(%#/JOBSWIDTH_#,8))]
+&DISPLAY_A
[v(JOB_VA)]=[u(%va/FN_STREXACT,ifelse(isdbref(get(%0/ASSIGNED_TO)),name(get(%0/ASSIGNED_TO)),-),default(%#/JOBSWIDTH_A,16))]
+&DISPLAY_B
[v(JOB_VA)]=[u(%va/FN_STREXACT,u(%va/FN_BUCKETNAME,%0),default(%#/JOBSWIDTH_B,5))]
+&DISPLAY_C
[v(JOB_VA)]=[u(%va/FN_STREXACT,u(%va/FN_SHORT_DATE,convsecs(get(%0/OPENED_ON))),default(%#/JOBSWIDTH_C,8))]
+&DISPLAY_D
[v(JOB_VA)]=[u(%va/FN_STREXACT,switch(get(%0/STATUS),0,--HOLD--,ifelse(get(%0/DUE_ON),ifelse(gt(secs(),get(%0/DUE_ON)),OVERDUE!,[u(%va/FN_SHORT_DATE,convsecs(get(%0/DUE_ON)))]),--------)),default(%#/JOBSWIDTH_D,8))]
+&DISPLAY_F
[v(JOB_VA)]=[u(%va/FN_STREXACT,[ifelse(u(me/IS_LOCKED,%0),ifelse(u(%va/FN_HASATTRP,%0,CHECKOUT),C,L),-)][ifelse(u(me/IS_PUBLIC,%0),M,-)][ifelse(u(me/IS_TAGGED,%0),T,-)][ifelse(u(me/IS_PUBLISHED,%0),P,-)],default(%#/JOBSWIDTH_F,4))]
+&DISPLAY_M
[v(JOB_VA)]=[u(%va/FN_STREXACT,u(%va/FN_SHORT_DATE,convsecs(get(%0/MODIFIED_ON))),default(%#/JOBSWIDTH_M,8))]
+&DISPLAY_O
[v(JOB_VA)]=[u(%va/FN_STREXACT,name(first(get(%0/OPENED_BY))),default(%#/JOBSWIDTH_O,16))]
+&DISPLAY_S
[v(JOB_VA)]=[u(%va/FN_STRTRUNC,center(switch([u(%va/FN_HASATTRP,%0,LOCKED)][u(%va/FN_HASATTRP,%0,CHECKOUT)],1*,LOCKED,01*,CHECKED,first(get(%va/STATUS_[get(%0/STATUS)]),|
)),default(%#/JOBSWIDTH_S,8)),default(%#/JOBSWIDTH_S,8))]
+&DISPLAY_T
[v(JOB_VA)]=[u(%va/FN_STREXACT,get(%0/TITLE),default(%#/JOBSWIDTH_T,u(%va/FN_LEFTOVER)))]
+&DISPLAY_BUCKET [v(JOB_VA)]=[rjust(ansi(h,Name:),20)] [name(%q0)]
[ifelse(u(%va/FN_STAFFALL,%#),%(%q0%),)] %([words(remove(children(%q0),#-1))]
jobs in bucket%)%r[rjust(ansi(h,Locked To:),20)]
[ifelse(u(%va/FN_HASATTRP,%q0,ACCESS),[get(%q0/ACCESS)]
[ifelse(u(%va/FN_ACCESSCHECK,%q0,%#),%(You have access%),%(You do not have
access%))],*UNLOCKED*)]%r[rjust(ansi(h,Post Data:),20)] %(Job system will
post to these boards%)%r[u(%va/fn_columns,Complete:
[u(%va/FN_FIND-BBNUM,get(%q0/POST_COMPLETE))]|Approve:
[u(%va/FN_FIND-BBNUM,get(%q0/POST_APPROVE))]|Deny:
[u(%va/FN_FIND-BBNUM,get(%q0/POST_DENY))],16,|,21)][ifelse(u(%va/FN_HASATTRP,%q0,TURNAROUND),%r[rjust(ansi(h,Turnaround:),20)]
[get(%q0/TURNAROUND)] hours %([div(get(%q0/TURNAROUND),24)]
days%),)]%r[rjust(ansi(h,Logfile:),20)]
[switch([first(version())]-[u(%va/FN_HASATTRP,%q0,LOGFILE)],PennMUSH-1,command.log,TinyMUSH-1,netmush.log,RhostMUSH-1,[get(%q0/LOGFILE)]_manual.log,*-1,M-[u(%q0/LOGFILE)].log,None)]%r[rjust(ansi(h,Hidden
Status:),20)]
[switch([u(%va/FN_HASATTRP,%q0,HIDDEN)][gt(member(u(%#/JOBSH),%q0),0)],00,Unhidden,01,Locally,11,Globally
Hidden & Locally Watched,10,Globally,UNKNOWN CASE)]%r[rjust(ansi(h,+Myjobs
Status:),20)]
[ifelse(u(%va/FN_HASATTRP,%q0,PUBLIC),Accessible,Inaccessible)]%r[rjust(ansi(h,Avg
Resolve Time:),20)]
[u(%va/fn_trim,u(%va/FN_ART,%q0))]%r[rjust(ansi(h,Closure
Stats:),20)]%b[ljust(Completed: [after(grab(get(%q0/LIST_STATS),COM|*),|
)],16)][ljust(Deleted: [after(grab(get(%q0/LIST_STATS),DEL|*),|
)],16)][ljust(Approved: [after(grab(get(%q0/LIST_STATS),APR|*),|
)],16)]Denied: [after(grab(get(%q0/LIST_STATS),DNY|*),|
)]%r[rjust(ansi(h,Desc:),20)]
[get(%q0/DESC)][ifelse(gt(words(setr(x,setdiff(lattr(%q0),u(%va/LIST_BADATTR,%q0)))),0),%r[rjust(ansi(h,Provides:),20)] %(Attributes
provided to jobs in the
bucket%)%r[u(%va/fn_columns,%qx,16,,21)],)][ifelse(gt(words(lattr(%q0/PROCESS_*)),0),%r[rjust(ansi(h,Settings:),20)] %(+job/sumset
settings%)%r[u(%va/fn_columns,map(MAP_SETTINGS,lattr(%q0/PROCESS_*)),16,,21)],)]
+&DISPLAY_BUCKET2 [v(JOB_VA)]=[rjust(ansi(h,Players:),20)] %(Connected
players with access to this
bucket%)%r[u(%va/fn_columns,[u(%va/fn_trim,squish(iter(edit(objeval(%#,lwho()),%b,|
),ifelse(and(u(%va/HAS_ACCESS,##),u(%va/FN_ACCESSCHECK,%q0,##)),name(##),),|,|
),|),b,|)],16,|,21)]
+&FIL_ACCESS [v(JOB_VA)]=u(%va/FN_ACCESSCHECK,%0,%#)
+&FIL_BROADCAST
[v(JOB_VA)]=ifelse(cor(default(%0/JOBS_SILENCE,0),member(get(%0/JOBS_SILENCE_B),u(%va/FN_OBJID,%q0)),member(get(%qJ/SILENCE),u(%va/FN_OBJID,%0))),0,u(%va/FN_ACCESSCHECK,%q0,%0))
+&FIL_BUCKET [v(JOB_VA)]=t(member(children(%1),%0))
+&FIL_COMMENTS
[v(JOB_VA)]=t(member(get(%va/LIST_VISCOMMENTS),first(get(%q0/%0),|)))
+&FIL_DUEAFTER
[v(JOB_VA)]=or(not(strlen(get(%0/DUE_ON))),eq(get(%0/DUE_ON),0),gt(get(%0/DUE_ON),%1))
+&FIL_ESC [v(JOB_VA)]=eq(get(%0/PRIORITY),%1)
+&FIL_GOING [v(JOB_VA)]=not(default(%0/GOING,0))
+&FIL_ISBUCKET [v(JOB_VA)]=member(%vc,parent(%0))
+&FIL_ISPLAYER
[v(JOB_VA)]=switch(words(%0,:),1,or(hastype(%0,player),member(lcon(%vb),%0)),and(hastype(first(%0,:),player),strmatch(%0,u(%va/FN_OBJID,first(%0,:)))))
+&FIL_JOBSELECT
[v(JOB_VA)]=cor(u(%va/FN_ACCESSCHECK,parent(%0),%#,%0),u(%va/FIL_MINE,%0))
+&FIL_MINE
[v(JOB_VA)]=gt(member([switch(loc(get(%0/assigned_to)),%vb,u(%va/FN_JGROUPMEMBERS,get(%0/assigned_to)),get(%0/assigned_to))]
[get(%0/tagged_for)],%#),0)
+&FIL_MYJOBS
[v(JOB_VA)]=cor(u(%va/FN_MYACCESSCHECK,parent(%0),%#,%0),cor(cand(get([parent(%0)]/PUBLIC),match(get(%0/OPENED_BY),%#)),u(%va/IS_TRANSPARENT,%0)))
+&FIL_NEW [v(JOB_VA)]=u(%va/FIL_NEW0,%0)
+&FIL_NEW0 [v(JOB_VA)]=gt(get(%0/MODIFIED_ON),get(%#/LAST_CONN))
+&FIL_NEW1 [v(JOB_VA)]=or(not(match(get(%0/LIST_JOBSN),%#|
*)),gt(dec(get(%0/NUM_COMMENT)),last(grab(get(%0/LIST_JOBSN),%#|*),|)))
+&FIL_NEWCOMMENTS0 [v(JOB_VA)]=and(gt(extract(get(%q0/%0),2,1,|
),%q1),gt(member(get(%va/LIST_VISCOMMENTS),first(get(%q0/%0),|)),0))
+&FIL_NEWCOMMENTS1
[v(JOB_VA)]=gt(last(%0,_),last(grab(get(%q0/LIST_JOBSN),%#|*),|))
+&FIL_NOSPAM
[v(JOB_VA)]=not(cor(default(%0/JOBS_NOSPAM,0),member(get(%qJ/NOSPAM),u(%va/FN_OBJID,%0)),member(get(%0/JOBS_NOSPAM_B),u(%va/FN_OBJID,%qJ))))
+&FIL_NOTPLAYER [v(JOB_VA)]=not(u(FIL_ISPLAYER,%0))
+&FIL_OVERDUE [v(JOB_VA)]=ifelse(get(%0/DUE_ON),gt(secs(),get(%0/DUE_ON)),0)
+&FIL_PUBLISHED
[v(JOB_VA)]=or(u(%q0/PUBLISH),hasflag(%q0/%0,no_inherit),u(%va/FN_MYACCESSCHECK,parent(%q0),%#,%q0),strmatch(extract(get(%q0/%0),3,1,|
),%#))
+&FIL_SOURCE [v(JOB_VA)]=t(member(get(%0/OPENED_BY),%1))
+&FIL_STAT_STATUS
[v(JOB_VA)]=and(strmatch(get(%0/STATUS),%qa),not(u(%va/FIL_OVERDUE,%0)))
+&FIL_STATUS [v(JOB_VA)]=t(match(get(%va/%0),%qa*,|))
+&FIL_SEARCH [v(JOB_VA)]=t(words(grepi(%0,*,%1)))
+&FIL_WHO [v(JOB_VA)]=strmatch(get(%0/ASSIGNED_TO),%1)
+&FN_ACCESSCHECK
[v(JOB_VA)]=and(u(%va/HAS_ACCESS,%1),or(u(%va/FN_WIZONLY,%1),band(add(elock(%0/speech,%1),gt(member(get(%1/JOBSB),u(FN_OBJID,%0)),0),ifelse(strlen(%2),gt(member(get(%2/JOBACCESS),u(FN_OBJID,%1)),0),0)),1)))
+&FN_MYACCESSCHECK
[v(JOB_VA)]=band(add(elock(%0/speech,%1),gt(member(get(%1/JOBSB),u(FN_OBJID,%0)),0),ifelse(strlen(%2),gt(member(get(%2/JOBACCESS),u(FN_OBJID,%1)),0),0)),1)
+&FN_ADDSTAT
[v(JOB_VA)]=[setq(x,ifelse(u(%va/FN_HASATTR,%1,LIST_STATS),get(%1/LIST_STATS),))][setq(0,match(%qx,%0|
*))][setq(1,grab(%qx,%0|
*))][ifelse(gt(%q0,0),[set(%1,LIST_STATS:[setunion(ldelete(%qx,%q0),[first(%q1,|
)]|[inc(rest(%q1,|))])])],[set(%1,LIST_STATS:[setunion(%qx,%0|1)])])]
+&FN_ADDSTAT_ART
[v(JOB_VA)]=null(set(%0,STAT_ART:[add(first(default(%0/STAT_ART,0
0)),sub(secs(),get(%1/OPENED_ON)))] [inc(last(default(%0/STAT_ART,0 0)))]))
+&FN_ART [v(JOB_VA)]=u(%va/FN_TIME,round(fdiv(first(default(%0/STAT_ART,0
0)),rest(default(%0/STAT_ART,0 1))),0))
+&FN_ASSEMBLEPIE
[v(JOB_VA)]=[setq(1,%1)][setq(0,0)][map(%va/MAP_PIEDATA,%0,switch(%2,,%b,%2),|
)]
+&FN_BANNER [v(JOB_VA)]=u(%va/FN_SKIN,BANNER,%0,%1,%2,%3)
+&FN_BARGRAPH
[v(JOB_VA)]=[setq(4,ifelse(%5,%5,%B))][setq(5,ifelse(%2,%2,2))][setq(6,ifelse(%3,ifelse(gt(%3,16),16,%3),1))][setq(7,switch(%4,,#,%4))][setq(1,ifelse(%1,%1,18))][setq(2,%q1)][setq(0,last(sort(%0,n,%q4,%q4),%q4))][setq(3,fdiv(%q0,%q1))][setq(x,iter(lnum(%q1),[setq(9,0)][switch(%q2,%q1,rjust(u(FN_BARGRAPHAXIS,%q0),5),ifelse(mod(%q1,2),inc(div(%q1,2)),div(%q1,2)),rjust(u(FN_BARGRAPHAXIS,div(%q0,2)),5),[space(5)])]|
[map(MAP_GRAPH,%0,%q4,%b)][setq(2,sub(%q2,1))],%B,%R))]%qx%R[space(4)]0+[repeat(-,dec(add(mul(words(%0,%q4),%q5),words(%0,%q4))))]
+&FN_BARGRAPHAXIS
[v(JOB_VA)]=switch(log(%0),<5,%0,<6,[u(%va/FN_TRIM,u(%va/FN_STRTRUNC,fdiv(%0,1E3),4),r,.)]K,<9,[u(%va/FN_TRIM,u(%va/FN_STRTRUNC,fdiv(%0,1E6),4),r,.)]M,[u(%va/FN_TRIM,u(%va/FN_STRTRUNC,fdiv(%0,1E9),4),r,.)]B)
+&FN_BREAK [v(JOB_VA)]=u(%va/FN_SKIN,BREAK,%0,%1,%2,%3)
+&FN_BUCKETHEADER [v(JOB_VA)]=u(%va/FN_SKIN,BUCKETHEADER,%0,%1,%2,%3)
+&FN_BUCKETLIST [v(JOB_VA)]=u(%va/FN_SKIN,BUCKETLIST,%0,%1,%2,%3)
+&FN_BUCKETNAME
[v(JOB_VA)]=ifelse(get(%0/GOING),GOING,ifelse(isdbref(parent(%0)),name(parent(%0)),ERROR))
+&FN_CLEANFIND [v(JOB_VA)]=t(words(filter(%va/FIL_NOTPLAYER,get(%0/%1))))
+&FN_CLEANFIX
[v(JOB_VA)]=[setq(0,filter(%va/FIL_ISPLAYER,get(%0/%1)))][ifelse(words(%q0),%q0,owner(me))]
+&FN_COLORPIE
[v(JOB_VA)]=setq(0,u(fn_equalizepie,%1,%2))[setq(p,%0)][setq(1,u(%va/fn_rotatestr,setr(1,v(data_chars)),mod(round(fdiv(mul(%3,strlen(%q1)),360),0),360)))][setq(a,%]%])][setq(b,%qa%qa)][setq(c,%qb%qb)][null(map(map_colorpie,%q0,%2))][setq(p,edit(%qp,|,ansi(n,|
)))]%qP
+&FN_COLUMNS
[v(JOB_VA)]=switch(first(version()),RhostMUSH,[columns(%0,min(sub(79,ifelse(gt(%3,78),1,%3)),%1),div(sub(79,ifelse(gt(%3,78),1,%3)),%1),l,,,ifelse(gt(words(%3),0),space(%3)),,,1,%2)],PennMUSH,[align([ifelse(%3,dec(%3),0)]
[sub(78,ifelse(%3,dec(%3),0))],%B,[table(%0,%1,sub(78,ifelse(%3,dec(%3),0)),%2)])],columns(%0,%1,%2,%3))
+&FN_CUTPIE
[v(JOB_VA)]=setq(0,inc(%2))[setq(1,fdiv(%1,%2))][setq(2,power(%3,2))][setq(5,iter(lnum(0,dec(%3)),round(mul(sqrt(sub(%q2,power(add(##,.7),2))),%q1),0)))][setq(5,revwords(%q5)
[setr(8,inc(ceil(mul(%3,2))))] %q5)][iter(lnum(-%3,%3),space(sub(%q8,setr(9,extract(%q5,#@,1))))[mid(extract(%0,add(##,%q0),1),shl(sub(%1,%q9),1),shl(%q9,2))],,|
)]
+&FN_DATECONV [v(JOB_VA)]=switch(words(%0,/),3,convtime(XXX
[switch([rjust(first(%0,/),2,0)],01,Jan,02,Feb,03,Mar,04,Apr,05,May,06,Jun,07,Jul,08,Aug,09,Sep,10,Oct,11,Nov,12,Dec)]
[rjust(extract(%0,2,1,/),2,0)] 23:59:00
[switch(strlen(setr(0,last(%0,/))),2,20[rjust(%q0,2,0)],%q0)]),switch(convtime(%0),*-*,fold(FOLD_DATECONV,%0,secs()),convtime(%0)))
+&FOLD_DATECONV
[v(JOB_VA)]=add(%0,switch(%1,*d*,mul(86400,before(%1,d)),*h*,mul(3600,before(%1,h)),*m*,mul(60,before(%1,m)),*s*,before(%1,s),0))
+&FN_EASYPIE
[v(JOB_VA)]=edit(u(%va/FN_PIELEGEND,u(%va/FN_COLORPIE,u(%va/FN_CUTPIE,foreach(%va/FOREACH_BRACKET,v(DATA_31-15)),31,15,%0),map(%va/MAP_EASYPIE,%1,%2),%2,%4),map(%va/MAP_EASYPIE2,%1,%2),%2,%3),|,%r)
+&FN_EQUALIZEPIE
[v(JOB_VA)]=setq(0,u(FN_LADD,map(%va/MAP_EQUALIZEPIE,%0,%1),%1))[setq(1,strlen(v(DATA_CHARS)))][map(MAP_EQUALIZEPIE2,%0,%1)]
+&FN_FIND-BBDBREF [v(JOB_VA)]=extract(u([get(%vc/BBPOCKET)]/GROUPS),%0,1)
+&FN_FIND-BBNUM [v(JOB_VA)]=member(u([get(%vc/BBPOCKET)]/GROUPS),%0)
+&FN_FIND-BUCKET
[v(JOB_VA)]=localize(ifelse(or(strmatch(name(setr(0,locate(%vc,trim(%0),iT))),trim(%0)),strmatch(%q0,trim(%0))),%q0,#-1))
+&FN_FIND-JGROUP
[v(JOB_VA)]=localize(ifelse(or(strmatch(name(setr(0,locate(%vb,trim(%0),iT))),trim(%0)),strmatch(%q0,trim(%0))),%q0,#-1))
+&FN_FIND-JOB
[v(JOB_VA)]=localize(ifelse(or(strmatch(name(setr(0,locate(%va,Job
[trim(%0)],iT))),Job [trim(%0)]),strmatch(%q0,trim(%0))),%q0,#-1))
+&FN_FLAG [v(JOB_VA)]=[ansi(h,%[)][ansi(switch(%1,,hy,%1),%0)][ansi(h,%])]
+&FN_FLAGS [v(JOB_VA)]=u(%va/FN_SKIN,FLAGS,%0,%1,%2,%3)
+&FN_FLEXWIDTH
[v(JOB_VA)]=add(%0,switch(default(%#/JOBSWIDTH,[width(%#)]),#-1*,0,sub(default(%#/JOBSWIDTH,width(%#)),80)))
+&FN_FOOTER [v(JOB_VA)]=u(%va/FN_SKIN,FOOTER,%0,%1,%2,%3)
+&FN_HASATTR
[v(JOB_VA)]=switch(first(version()),PennMUSH,hasattrval(%0,%1),hasattr(%0,%1))
+&FN_HASATTRP
[v(JOB_VA)]=switch(first(version()),PennMUSH,hasattrpval(%0,%1),hasattrp(%0,%1))
+&FN_HEADER [v(JOB_VA)]=u(%va/FN_SKIN,HEADER,%0,%1,%2,%3)
+&FN_INFIX2POSTFIX
[v(JOB_VA)]=[u(%va/FN_S-INIT)][setq(v,map(%va/MAP_PARAMS,lattr(%va/SEL_*)))][u(%va/FN_TRIM,squish([map(%va/MAP_INFIX2POSTFIX,%0)]%B[u(%va/FN_S-POP-BINARY)][switch(1,t(member(%( %),u(%va/FN_S-PEEK))),#-1
MISMATCHED PARENS)]))]
+&FN_ISNEW [v(JOB_VA)]=u(FIL_NEW[default(%1/JOBSN,0)],%0)
+&FN_ITEMIZE
[v(JOB_VA)]=localize(switch([setr(0,[itemize(%0,%1)])],#-1*,switch([setr(1,[elist(%0,and,%1)])],#-1*,u(fn_pretty,%0,%1),%q1),%q0))
+&FN_JGROUPMEMBERS
[v(JOB_VA)]=switch(first(version()),PennMUSH,lsearch(all,eplayers,\[u(%0/ISMEMBER,##)\]),RhostMUSH,searchng(eplayer=u(%0/ISMEMBER,##)),search(eplayer=u(%0/ISMEMBER,##)))
+&FN_JOBLIST [v(JOB_VA)]=ifelse(t(%0),u(%va/FN_SKIN,JOBLIST,%0,%1,%2,%3),)
+&FN_JOBSHEADER [v(JOB_VA)]=u(%va/FN_SKIN,JOBSHEADER,%0,%1,%2,%3)
+&FN_LADD
[v(JOB_VA)]=switch([ladd(%0,%1)],#-1*,lmath(add,%0,%1),ladd(%0,%1))
+&FN_LEFTOVER
[v(JOB_VA)]=max(5,sub(u(%va/FN_FLEXWIDTH,79),fold(%va/FOLD_ADD,7[foreach(%va/FOREACH_LEFTOVER,%qj)])))
+&FN_MAXWIDTH [v(JOB_VA)]=last(sort(map(map_maxwidth,%0,|,%b),n))
+&FN_MONITORCHECK
[v(JOB_VA)]=and(or(u(%va/FN_ACCESSCHECK,%0,%1),u(%va/FN_WIZONLY,%1)),switch([u(%va/FN_HASATTRP,%0,HIDDEN)][gt(member(get(%1/JOBSH),%0),0)],01,0,10,0,11,1,1),isdbref(parent(%0)))
+&FN_MYBANNER [v(JOB_VA)]=u(%va/FN_SKIN,MYBANNER,%0,%1,%2,%3)
+&FN_MYJOBLIST
[v(JOB_VA)]=ifelse(t(%0),u(%va/FN_SKIN,MYJOBLIST,%0,%1,%2,%3),)
+&FN_MYJOBSHEADER [v(JOB_VA)]=u(%va/FN_SKIN,MYJOBSHEADER,%0,%1,%2,%3)
+&FN_MYSUMMARY [v(JOB_VA)]=u(%va/FN_SKIN,MYSUMMARY,%0,%1,%2,%3)
+&FN_OBJID
[v(JOB_VA)]=localize(switch(1,and(isint(setr(0,convtime(ctime(%0)))),gt(%q0,0)),%0:%q0,and(isint(setr(0,convtime(createtime(%0)))),gt(%q0,0)),%0:%q0,%0))
+&FN_PCT
[v(JOB_VA)]=mul(round(ifelse(gt(get(%va/MAX_JOBS),0),max(fdiv(words(remove(lcon(%va),#-1)),get(%va/MAX_JOBS)),fdiv(strlen(lcon(%va)),get(%va/BUFFER))),fdiv(strlen(lcon(%va)),get(%va/BUFFER))),2),100)
+&FN_PIEESCAPE [v(JOB_VA)]=case(ord(%0),92,%%%\,91,%%%[,93,%%%],37,%%%%,%0)
+&FN_PIELEGEND
[v(JOB_VA)]=[setq(d,inc(u(fn_maxwidth,%0)))][setq(n,%0[repeat(|,max(0,sub(setr(a,add(words(%1,%2),%3)),setr(b,words(%0,|
)))))])][setq(m,repeat(|,%3)[edit(%1,ifelse(%2,%2,%b),|
)][repeat(|,max(0,sub(%qb,%qa)))])][map(map_pielegend,lnum(1,words(%qm,|
)),%b,|)]
+&FN_PLAYERLIST
[v(JOB_VA)]=u(%va/FN_ITEMIZE,map(MAP_NAME,get(%0/OPENED_BY),%b,|),|)
+&FN_PRETTY
[v(JOB_VA)]=switch(words(%0,switch(%1,,%b,%1)),0,%0,1,%0,[ldelete(edit(%0,switch(%1,,%b,%1),%,%b),words(%0,switch(%1,,%b,%1)),%,)]%band%b[last(%0,switch(%1,,%b,%1))])
+&FN_READERS
[v(JOB_VA)]=[ifelse(%2,set(%0,LIST_READERS:[setunion(setdiff(get(%0/LIST_READERS),grab(get(%0/LIST_READERS),%1|
*)),%1|
[dec(get(%0/NUM_COMMENT))])]),)][set(%0,LIST_JOBSN:[setunion(setdiff(get(%0/LIST_JOBSN),grab(get(%0/LIST_JOBSN),%1|
*)),%1|[dec(get(%0/NUM_COMMENT))])])]
+&FN_READJOB [v(JOB_VA)]=u(%va/FN_SKIN,READ,%0,%1,%2,%3)
+&FN_ROTATESTR [v(JOB_VA)]=mid(%0,%1,3999)[mid(%0,0,%1)]
+&FN_S-INIT [v(JOB_VA)]=[setq(S,82)][setq(T,)]
+&FN_S-PUSH
[v(JOB_VA)]=[setq(S,dec(%qS))][ifelse(gte(%qS,66),setq(chr(%qS),%0),setq(T,#-1
STACK OVERFLOW))]
+&FN_S-POP [v(JOB_VA)]=[r(chr(%qS))][setq(S,inc(%qS))]
+&FN_S-PEEK [v(JOB_VA)]=r(chr(%qS))
+&FN_S-POP-BINARY [v(JOB_VA)]=switch(1,t(match(OR
AND,u(fn_s-peek))),[u(fn_s-pop)]%B[u(fn_s-pop-binary)])
+&FN_S-POP-UNARY
[v(JOB_VA)]=switch(1,t(match(NOT,u(fn_s-peek))),[u(fn_s-pop)]%B[u(fn_s-pop-unary)])
+&FN_SHORT_DATE
[v(JOB_VA)]=[switch(extract(%0,2,1),Jan,01,Feb,02,Mar,03,Apr,04,May,05,Jun,06,Jul,07,Aug,08,Sep,09,Oct,10,Nov,11,Dec,12,??)]/[extract(%0,3,1)]/[mid(last(%0),2,2)]
+&FN_SKIN
[v(JOB_VA)]=[setq(z,default(%#/JOBSKIN,DEFAULT))][ifelse(and(u(FN_HASATTR,me,%qz_SKIN),u(FN_HASATTR,me,%qz_%0)),u(%qz_%0,%1,%2,%3,%4),u(DEFAULT_%0,%1,%2,%3,%4))]
+&FN_STAFFSUM [v(JOB_VA)]=u(FN_SKIN,STAFFSUM,%0,%1,%2,%3)
+&FN_STREXACT [v(JOB_VA)]=ljust(u(FN_STRTRUNC,%0,%1),%1)
+&FN_STRINGSECS
[v(JOB_VA)]=switch(first(version()),PennMUSH,stringsecs(%0),ladd(map(MAP_ETIME,%0)))
+&FN_STRTRUNC
[v(JOB_VA)]=localize(switch([setr(0,[strtrunc(%0,%1)])],#-1*,left(%0,%1),%q0))
+&FN_SUMMARY [v(JOB_VA)]=u(FN_SKIN,SUMMARY,%0,%1,%2,%3)
+&FN_TIME
[v(JOB_VA)]=localize([setq(2,mod(%0,86400))][rjust([div(%0,86400)],2,0)]:[rjust(div(%q2,3600),2,0)]:[rjust(div(mod(%q2,3600),60),2,0)]:[rjust(mod(%q2,60),2,0)])
+&FN_TOKENLIST [v(JOB_VA)]=u(fn_trim,squish(foreach(FN_TOKENPARSE,%0)))
+&FN_TOKENPARSE
[v(JOB_VA)]=switch(%0,",setq(Q,switch(%qQ,1,0,1)),%B,switch(%qQ,1,~,%B),|,%BOR%B,&,%BAND%B,!,%BNOT%B,%(,%B%(%B,%),%B%)%B,%0)
+&FN_TRIM
[v(JOB_VA)]=switch(first(version()),PennMUSH,trimtiny(%0,%1,%2),trim(%0,%1,%2))
+&FOLD_ADD [v(JOB_VA)]=add(%0,%1)
+&FOREACH_BRACKET [v(JOB_VA)]=\[%0
+&FOREACH_COLORPIE [v(JOB_VA)]=setq(p,edit(%qp,%[%0,%]))
+&FOREACH_LEFTOVER
[v(JOB_VA)]=%b[inc(switch(%0,#,default(%#/JOBSWIDTH_#,8),A,default(%#/JOBSWIDTH_A,16),B,default(%#/JOBSWIDTH_B,5),C,default(%#/JOBSWIDTH_C,8),D,default(%#/JOBSWIDTH_D,8),F,default(%#/JOBSWIDTH_F,4),M,default(%#/JOBSWIDTH_M,8),O,default(%#/JOBSWIDTH_O,16),S,default(%#/JOBSWIDTH_S,8),0))]
+&HEADER_# [v(JOB_VA)]=u(FN_STREXACT,DB#,default(%#/JOBSWIDTH_#,8))
+&HEADER_A [v(JOB_VA)]=u(FN_STREXACT,Assigned To,default(%#/JOBSWIDTH_A,16))
+&HEADER_B [v(JOB_VA)]=u(FN_STREXACT,Type,default(%#/JOBSWIDTH_B,5))
+&HEADER_C [v(JOB_VA)]=u(FN_STREXACT,Opened,default(%#/JOBSWIDTH_C,8))
+&HEADER_D [v(JOB_VA)]=u(FN_STREXACT,Due On,default(%#/JOBSWIDTH_D,8))
+&HEADER_F [v(JOB_VA)]=u(FN_STREXACT,Flag,default(%#/JOBSWIDTH_F,4))
+&HEADER_M [v(JOB_VA)]=u(FN_STREXACT,Modified,default(%#/JOBSWIDTH_M,8))
+&HEADER_O [v(JOB_VA)]=u(FN_STREXACT,Opened By,default(%#/JOBSWIDTH_O,16))
+&HEADER_S [v(JOB_VA)]=u(FN_STREXACT,Status,default(%#/JOBSWIDTH_S,8))
+&HEADER_T
[v(JOB_VA)]=u(%va/FN_STREXACT,Title,default(%#/JOBSWIDTH_T,u(%va/FN_LEFTOVER)))
+&IS_HIDDEN [v(JOB_VA)]=udefault(%0/HIDDEN,0)
+&IS_LOCKED
[v(JOB_VA)]=ifelse(u(%va/FN_HASATTRP,%0,CHECKOUT),switch(first(get(%0/CHECKOUT)),%1,0,1),udefault(%0/LOCKED,0))
+&IS_PUBLIC [v(JOB_VA)]=udefault(%0/PUBLIC,0)
+&IS_PUBLISHED [v(JOB_VA)]=udefault(%0/PUBLISH,0)
+&IS_SUMMARY [v(JOB_VA)]=u(%va/FN_HASATTRP,%0,SUMMARY)
+&IS_TAGGED [v(JOB_VA)]=t(words(get(%0/TAGGED_FOR)))
+&IS_TRANSPARENT [v(JOB_VA)]=u(%va/FN_HASATTRP,%0,TRANSPARENT)
+&JOBS_DEFAULT [v(JOB_VA)]=BTDAS
+&LIST_ACTIONS [v(JOB_VA)]=ADD Player input|ASN Assignment|CKI Check In|CKO
Check Out|CLN Clone|CRE Create|DUE Due date|EDT Edited job|LOK Locked Job|
MRG Merged job|NAM Re-name job|PUB Publication|SRC Source change|STA Status
change|SUM Sumset change|TAG Job tag|TRN Transfer|UND Undelete job|UNL
Unlock job|UNP Unpublish|COM +job/complete|DNY +job/deny|APR +job/approve|
DEL +job/delete
+&LIST_BADATTR [v(JOB_VA)]=Created Modified ACCESS Desc
[lattr(%0/ACCESS_*)] [lattr(%0/ERROR_*)] [lattr(%0/PROCESS_*)] LIST_STATS
STAT_ART TURNAROUND
+&LIST_VISCOMMENTS [v(JOB_VA)]=ADD CRE COM MAI APR DEL DNY
+&MAP_ACTIONS [v(JOB_VA)]=rest(%0,|)
+&MAP_ACTIONS2 [v(JOB_VA)]=first(%0,|)
+&MAP_COLORPIE
[v(JOB_VA)]=foreach(foreach_colorpie,mid(%q1,0,setr(9,last(%0,:))))[setq(x,before(mid(%0,1,100),:))][setq(h,u(%va/fn_pieescape,mid(%0,0,1)))][setq(i,%qh%qh)][setq(j,%qi%qi)][setq(k,%qj%qj)][setq(p,edit(edit(edit(edit(%qp,%qc,ansi(%qx,%qk)),%qb,ansi(%qx,%qj)),%qa,ansi(%qx,%qi)),%],ansi(%qx,%qh)))][setq(1,mid(%q1,%q9,256))]
+&MAP_EASYPIE [v(JOB_VA)]=extract(%0,1,switch(%0,:*,3,2),:)
+&MAP_EASYPIE2 [v(JOB_VA)]=ldelete(%0,switch(%0,:*,3,2),:)
+&MAP_ETIME
[v(JOB_VA)]=switch(%0,*d,mul(86400,before(%0,d)),*h,mul(3600,before(%0,h)),*m,mul(60,before(%0,m)),*s,before(%0,s),0)
+&MAP_EQUALIZEPIE [v(JOB_VA)]=last(%0,:)
+&MAP_EQUALIZEPIE2
[v(JOB_VA)]=revwords(setr(8,round(fdiv(mul(%q1,setr(7,last(%0,:))),%q0),0))[setq(1,sub(%q1,%q8))][setq(0,sub(%q0,%q7))]:[rest(revwords(%0,:),:)],:)
+&MAP_GRAPH
[v(JOB_VA)]=[setq(9,ifelse(gt(inc(%q9),%q6),1,inc(%q9)))][ifelse(lte(%q2,add(fdiv(%0,%q3),0.5)),ansi(v(COLORGRAPH_%q9),repeat(%q7,%q5)),repeat(%b,%q5))]
+&MAP_INDENT2 [v(JOB_VA)]=%b%b%0
+&MAP_INFIX2POSTFIX
[v(JOB_VA)]=switch(1,t(match(%qv,first(%0,=))),[%0]%B[u(%va/FN_S-POP-UNARY)],t(match(OR
AND,%0)),[u(%va/FN_S-POP-BINARY)][u(%va/FN_S-PUSH,%0)],strmatch(NOT,%0),[u(%va/FN_S-PUSH,%0)],strmatch(%(,%0),[u(%va/FN_S-PUSH,%0)],strmatch(%),%0),[u(%va/FN_S-POP-BINARY)][switch(u(%va/FN_S-PEEK),%(,null(u(%va/FN_S-POP)),#-1
MISMATCHED PARENS)]%B[u(%va/FN_S-POP-UNARY)],#-1 SYNTAX ERROR)
+&MAP_JGROUP
[v(JOB_VA)]=switch(%0,+*,u(%va/FN_JGROUPMEMBERS,u(%va/FN_FIND-JGROUP,%0)),me,%#,pmatch(%0))
+&MAP_JGROUPERROR
[v(JOB_VA)]=ifelse(or(strmatch(%0,me),isdbref(pmatch(%0)),isdbref(u(%va/FN_FIND-JGROUP,%0))),,I
don't recognize '%0' as a player or jgroup.)
+&MAP_JOBSELECT [v(JOB_VA)]=switch(1,t(match(and or not %( %) |
& !,%0)),%0,u(%va/FN_HASATTR,%#,JOBSELECT_%0),u(%va/FN_TOKENLIST,get(%#/JOBSELECT_%0)),%0)
+&MAP_MAXWIDTH [v(JOB_VA)]=strlen(%0)
+&MAP_NAME [v(JOB_VA)]=name(%0)
+&MAP_PARAMS [v(JOB_VA)]=lcstr(rest(%0,_))
+&MAP_PARSESTACK
[v(JOB_VA)]=switch([setr(2,first(%0,=))][setq(a,edit(rest(%0,=),~,%B))],OR,u(%va/FN_S-PUSH,setunion(u(%va/FN_S-POP),u(%va/FN_S-POP))),AND,u(%va/FN_S-PUSH,setinter(u(%va/FN_S-POP),u(%va/FN_S-POP))),NOT,u(%va/FN_S-PUSH,setdiff(%q1,u(%va/FN_S-POP))),u(%va/FN_S-PUSH,filter(%va/SEL_%q2,%q1)))
+&MAP_PIEDATA
[v(JOB_VA)]=[mid(get(%va/CHARGRAPH),%q0,1)][setq(0,inc(%q0))][get(me/COLORGRAPH_%q0)]:%0:[extract(%q1,%q0,1)]
+&MAP_PIELEGEND [v(JOB_VA)]=ljust(extract(%qn,%0,1,|),%qd)
[ansi(before(mid(setr(q,extract(%qm,%0,1,|)),1,10),:),mid(%qq,0,1))]
[switch(%qq,:*,extract(%qq,3,100,:),after(%qq,:))]
+&MAP_REPORTS [v(JOB_VA)]=after(lcstr(%0),_)
+&MAP_SETTINGS [v(JOB_VA)]=rest(%0,_)
+&MAP_SOURCE
[v(JOB_VA)]=switch(%0,+*,u(FN_JGROUPMEMBERS,u(%va/FN_FIND-JGROUP,%0)),me,%#,pmatch(%0))
+&MAP_STAT_ESC
[v(JOB_VA)]=ifelse(and(u(%va/FN_HASATTRP,%0,DUE_ON),gt(secs(),get(%0/DUE_ON))),setq(3,inc(%q3)),switch(default(%0/PRIORITY,1),1,setq(1,inc(%q1)),2,setq(2,inc(%q2)),3,setq(3,inc(%q3)),setq(0,inc(%q0))))
+&MAP_STAT_STATUS
[v(JOB_VA)]=switch(%0,OVERDUE,@Rr:[words(filter(%va/FIL_OVERDUE,lcon(%va)))]:Overdue,[mid(get(%va/CHARGRAPH),dec(%1),1)][get(%va/COLORGRAPH_[switch(%1,3,1,1,3,%1)])]:[setq(a,after(%0,STATUS_))][words(filter(%va/FIL_STAT_STATUS,lcon(%va)))]:[last(get(%va/%0),|
)])
+think [ansi(hc,ANOMALY JOBS:)] Installing reports.
+&REPORT_ACTBY [v(JOB_VA)]=[switch(%0,,This report requires you to supply
an action code.%r%rUse: '+jobs/reports ACTBY=<action
code>'.%r,[setq(0,squish(iter(lcon(%vc),ifelse(eq(words(grab(u(##/LIST_STATS),%0|
*)),0),,##))))][setq(1,squish(iter(%q0,rest(grab(u(##/LIST_STATS),%0|*),|
))))][ifelse(lt(words(%q1),1),There is no action code '[ucstr(%0)]'
presently in the
system.%r,[ulocal(FN_BARGRAPH,%q1,10,2,16,#)]%r[space(6)][iter(%q0,[u(%va/FN_STREXACT,name(##),2)])]%r%r[center([ucstr(%0)]
Actions by Bucket,u(%va/FN_FLEXWIDTH,79))])])]
+&REPORT_ACTIONS
[v(JOB_VA)]=[ulocal(FN_BARGRAPH,setr(0,map(MAP_ACTIONS,v(LIST_STATS))),15,2,16,#)][setq(0,fold(FOLD_ADD,%q0,0))]%r[space(6)][setq(1,map(MAP_ACTIONS2,sort(v(LIST_STATS))))][iter(%q1,[mid(##,0,1)]%b)]%r[space(6)][iter(%q1,[mid(##,1,1)]%b)]%r[space(6)][iter(%q1,[mid(##,2,1)]%b)]%r%r[center(%q0
Actions Performed Since [v(INSTALL_DATE)],u(%va/FN_FLEXWIDTH,79))]
+&REPORT_ARTS
[v(JOB_VA)]=[iter(sortby(%va/SORTBY_NAME,lcon(%vc)),[ifelse(u(%va/FN_HASATTR,##,STAT_ART),u(%va/FN_TIME,round(fdiv(first(get(##/STAT_ART)),rest(get(##/STAT_ART))),0)),[rjust(-,11)])]%b[ljust(ansi(hc,[name(##)]),20)],%B,%R)]%R[rjust(u(%va/FN_TIME,round(fdiv(first(default(%vc/STAT_ART,0
0)),rest(default(%vc/STAT_ART,0 1))),0)),11)]%b[ansi(hy,Total
ART)]%r[center(Average Resolution Times by Bucket,u(%va/FN_FLEXWIDTH,79))]
+&REPORT_ARTSGRAPH
[v(JOB_VA)]=[setq(0,iter(setr(1,sortby(%va/SORTBY_NAME,lcon(%vc))),ifelse(u(%va/FN_HASATTR,##,STAT_ART),[div(round(fdiv(first(get(##/STAT_ART)),rest(get(##/STAT_ART))),0),86400)],0)))][ulocal(%va/FN_BARGRAPH,%q0,15,2,16,#)]%r[space(6)][iter(%q1,mid([name(##)]%B,0,2))]%r%r[center(Average
Resolution Time by Bucket %(in days%),u(%va/FN_FLEXWIDTH,79))]
+&REPORT_BACT [v(JOB_VA)]=[switch(%0,,This report requires you to supply a
bucket name.%r%rUse: '+jobs/reports BACT=<bucket name>' to specify a
bucket.%r,[setq(0,u(%va/FN_FIND-BUCKET,%0))][ifelse(isdbref(%q0),[ulocal(FN_BARGRAPH,map(MAP_ACTIONS,get(%q0/LIST_STATS)),15,1,16,#)]%r[space(6)][setq(1,map(MAP_ACTIONS2,sort(get(%q0/LIST_STATS))))][iter(%q1,mid(##,0,1))]%r[space(6)][iter(%q1,mid(##,1,1))]%r[space(6)][iter(%q1,mid(##,2,1))]%r%r[center(Number
of Actions Performed on Bucket [name(%q0)],u(%va/FN_FLEXWIDTH,79))],That is
not a valid bucket name. See '+buckets' for a list of valid buckets.)])]
+&REPORT_BUCKETS
[v(JOB_VA)]=[u(FN_BARGRAPH,iter(sortby(SORTBY_NAME,lcon(%vc)),words(remove(children(##),#-1))),15,2,16,#)]%r[space(6)][iter(sortby(SORTBY_NAME,lcon(%vc)),mid([name(##)]%b,0,2))]%r%r[center(#
of Jobs in Buckets,u(%va/FN_FLEXWIDTH,79))]
+&REPORT_CLOSURE [v(JOB_VA)]=[setq(0,iter(APR DNY COM
DEL,grab(get(%va/LIST_STATS),##|
*)))][u(%va/FN_EASYPIE,10,ulocal(%va/FN_ASSEMBLEPIE,map(MAP_ACTIONS,%q0),iter(map(MAP_ACTIONS2,%q0),case(##,APR,Approved,DNY,Denied,COM,Completed,Deleted))),|,16,45)]
+&REPORT_CODES [v(JOB_VA)]=[center(List of Action
Codes:,u(%va/FN_FLEXWIDTH,79))]%r%r[setq(0,sort(get(%va/LIST_ACTIONS),b,|,|
))][table(map(%va/MAP_INDENT2,%q0,|,|),25,u(%va/FN_FLEXWIDTH,78),|)]%r
+&REPORT_ESC
[v(JOB_VA)]=[setq(z,[iter(lnum(1,3),setq(##,0))][map(%va/MAP_STAT_ESC,lcon(%va))])][u(FN_EASYPIE,10,@Gg:%q1:Green|
#Yy:%q2:Yellow|.Rr:%q3:Red,|,16,45)]%r%r[center(Job Escalation
Colors,u(%va/FN_FLEXWIDTH,79))]%r
+&REPORT_JACT [v(JOB_VA)]=[switch(%0,,This report requires you to supply a
job.%r%rUse: +jobs/reports
JACT=<#>%r,[setq(0,u(%va/FN_FIND-JOB,%0))][ifelse(isdbref(%q0),[ifelse(u(%va/FN_HASATTR,%q0,LIST_STATS),[ulocal(FN_BARGRAPH,map(MAP_ACTIONS,get(%q0/LIST_STATS)),15,1,16,#)]%r[space(6)][setq(1,map(MAP_ACTIONS2,sort(get(%q0/LIST_STATS))))][iter(%q1,mid(##,0,1))]%r[space(6)][iter(%q1,mid(##,1,1))]%r[space(6)][iter(%q1,mid(##,2,1))],No
actions recorded for this job.)]%r%r[center(Actions Performed on
[name(%q0)],u(%va/FN_FLEXWIDTH,79))],That is not a valid job.%r)])]
+&REPORT_STATS
[v(JOB_VA)]=[rjust(ansi(hc,Install:),20)]%b[get(%va/INSTALL_DATE)]%r[rjust(ansi(hc,Version:),20)]%bAnomaly
Jobs
[get(%va/VERSION)][space(5)]%r[rjust(ansi(hc,Release:),20)]%b[get(%va/RELEASE)]%r[rjust(ansi(hc,Memory:),20)]%b[setr(a,fold(%va/FOLD_ADD,iter(setr(b,[num(me)]
[loc(me)] %vb %vc [lcon(%vc)]
[lcon(me)]),objmem(##))))]%b%([round(fdiv(%qa,1024),1)]k in [words(%qb)]
objects%)%r[rjust(ansi(hc,Open
Jobs:),20)]%b[words(remove(lcon(%va),#-1))]%r[rjust(ansi(hc,Capacity:),20)]%b[u(%va/FN_PCT)]%%
Full%r[rjust(ansi(hc,Next
Job:),20)]%b[inc(u(%va/JOBS_NUM))]%r[rjust(ansi(hc,Buckets:),20)]%b[words(lcon(%vc))]%r[rjust(ansi(hc,Opened:),20)]%b[last(grab(get(%va/LIST_STATS),CRE|
*),|)][setq(x,iter(APR DNY COM DEL,grab(get(%va/LIST_STATS),##|
*)))][setq(y,map(%va/MAP_ACTIONS,%qx))]%r[rjust(ansi(hc,Closed:),20)]%b[fold(%va/FOLD_ADD,%qy,0)]%r[rjust(ansi(hc,Actions
To
Date:),20)]%b[fold(FOLD_ADD,map(MAP_ACTIONS,v(LIST_STATS)),0)]%r[rjust(ansi(hc,ART:),20)]%b[u(%va/FN_ART,%vc)][space(10)]
ART=Average Resolution Time%r[rjust(ansi(hc,REQ
ART:),20)]%b[u(%va/FN_ART,u(%va/FN_FIND-BUCKET,REQ))][space(18)]DD:HH:MM:SS%r[rjust(ansi(hc,CODE
ART:),20)]%b[u(%va/FN_ART,u(%va/FN_FIND-BUCKET,CODE))]%r[rjust(ansi(hc,TPS
ART:),20)]%b[u(%va/FN_ART,u(%va/FN_FIND-BUCKET,TPS))]%r[rjust(ansi(hc,BUILD
ART:),20)]%b[u(%va/FN_ART,u(%va/FN_FIND-BUCKET,BUILD))]%r
+&REPORT_STATUS [v(JOB_VA)]=[u(FN_EASYPIE,12,iter(OVERDUE
[lattr(%va/STATUS_*)],u(%va/MAP_STAT_STATUS,itext(0),inum(0)),%B,|
),|,10,45)]
+&RTITLE_ACTBY [v(JOB_VA)]=BAR|Graph of one action across all buckets
+&RTITLE_ACTIONS [v(JOB_VA)]=BAR|System-wide Actions
+&RTITLE_ARTS [v(JOB_VA)]=STATS|Average Resolution Times by Bucket
+&RTITLE_ARTSGRAPH [v(JOB_VA)]=BAR|Average Resolution Times Graph
+&RTITLE_BACT [v(JOB_VA)]=BAR|All actions on a specified bucket
+&RTITLE_BUCKETS [v(JOB_VA)]=BAR|Job Dispersal Among Buckets
+&RTITLE_CLOSURE [v(JOB_VA)]=PIE|Job Closure Patterns
+&RTITLE_CODES [v(JOB_VA)]=STATS|A list of system-generated action codes
+&RTITLE_ESC [v(JOB_VA)]=PIE|Job Escalation Status
+&RTITLE_JACT [v(JOB_VA)]=BAR|Actions performed on a job
+&RTITLE_STATS [v(JOB_VA)]=STATS|General System Stats
+&RTITLE_STATUS [v(JOB_VA)]=PIE|Job Status Settings
+&SEL_ALL [v(JOB_VA)]=1
+&SEL_NEW [v(JOB_VA)]=u(%va/FIL_NEW[default(%#/JOBSN,0)],%0)
+&SEL_OVERDUE [v(JOB_VA)]=u(%va/FIL_OVERDUE,%0)
+&SEL_MINE [v(JOB_VA)]=u(%va/FIL_MINE,%0)
+&SEL_WHO [v(JOB_VA)]=u(%va/FIL_WHO,%0,switch(%qa,none,,me,%#,pmatch(%qa)))
+&SEL_SOURCE
[v(JOB_VA)]=u(%va/FIL_SOURCE,%0,switch(%qa,none,,me,%#,pmatch(%qa)))
+&SEL_PRI [v(JOB_VA)]=u(%va/SEL_ESC,%0)
+&SEL_ESC [v(JOB_VA)]=u(%va/FIL_ESC,%0,match(green yellow red,%qa*))
+&SEL_STATUS [v(JOB_VA)]=u(%va/FIL_STATUS,STATUS_[get(%0/STATUS)])
+&SEL_BUCKET [v(JOB_VA)]=u(%va/FIL_BUCKET,%0,u(%va/FN_FIND-BUCKET,%qa))
+&SEL_SEARCH [v(JOB_VA)]=u(%va/FIL_SEARCH,%0,%qa)
+&SEL_VIEWING [v(JOB_VA)]=u(%va/SEL_MONITOR,%0)
+&SEL_MONITOR [v(JOB_VA)]=u(%va/FN_MONITORCHECK,parent(%0),%#)
+&SEL_HIDDEN [v(JOB_VA)]=u(%va/IS_HIDDEN,parent(%0))
+&SEL_LOCKED [v(JOB_VA)]=u(%va/IS_LOCKED,%0)
+&SEL_TAGGED [v(JOB_VA)]=u(%va/IS_TAGGED,%0)
+&SEL_MYJOBS [v(JOB_VA)]=u(%va/SEL_PUBLIC,%0)
+&SEL_PUBLIC [v(JOB_VA)]=u(%va/IS_PUBLIC,parent(%0))
+&SEL_PUBLISHED [v(JOB_VA)]=u(%va/IS_PUBLISHED,%0)
+&SEL_SUMMARY [v(JOB_VA)]=u(%va/IS_SUMMARY,parent(%0))
+&SEL_DUE> [v(JOB_VA)]=u(%va/FIL_DUEAFTER,%0,u(FN_DATECONV,%qa))
+&SEL_DUE< [v(JOB_VA)]=not(u(%va/FIL_DUEAFTER,%0,u(FN_DATECONV,%qa)))
+&SORTBY_BUCKET [v(JOB_VA)]=comp(name(parent(%0)),name(parent(%1)))
+&SORTBY_COMMENTS [v(JOB_VA)]=sub(after(%0,_),after(%1,_))
+&SORTBY_DATE [v(JOB_VA)]=sub(get(%0/MODIFIED_ON),get(%1/MODIFIED_ON))
+&SORTBY_DUE [v(JOB_VA)]=comp(get(%0/DUE_ON),get(%1/DUE_ON))
+&SORTBY_JOBNUM [v(JOB_VA)]=sub(last(name(%0)),last(name(%1)))
+&SORTBY_NAME [v(JOB_VA)]=comp(name(%0),name(%1))
+&SORTBY_PRI [v(JOB_VA)]=sub(get(%0/PRIORITY),get(%1/PRIORITY))
+&STATUS_0 [v(JOB_VA)]=--HOLD--|HOLD|On Hold
+&STATUS_1 [v(JOB_VA)]=NEW|New
+&STATUS_2 [v(JOB_VA)]=UNDERWAY|Underway
+&STATUS_3 [v(JOB_VA)]=1/4 DONE|25% Complete
+&STATUS_4 [v(JOB_VA)]=1/2 DONE|50% Complete
+&STATUS_5 [v(JOB_VA)]=3/4 DONE|75% Complete
+&STATUS_6 [v(JOB_VA)]=COMPLETE|Complete
+&TRIG_ADD [v(JOB_VA)]=think
[setq(0,default(%0/NUM_COMMENT,1))][setq(1,last(grab(get(%0/LIST_JOBSN),%2|
*),|
))][setq(2,edit(%1,|,@@PIPE@@))][ifelse(eq(dec(%q0),%q1),set(%0,LIST_JOBSN:[setunion(remove(get(%0/LIST_JOBSN),%2|%q1),%2|%q0)]),)][ulocal(FN_ADDSTAT,%3,%va)][ulocal(FN_ADDSTAT,%3,%0)][ulocal(FN_ADDSTAT,%3,parent(%0))];&COMMENT_%q0 %0=%3|
[secs()]|%2|[name(%2)]|
[ifelse(u(%va/FN_HASATTRP,parent(%0),ALETTER_%3),u(%va/FN_STRTRUNC,u([parent(%0)]/ALETTER_%3,%0,%2,%q2),get(%va/BUFFER)),u(%va/FN_STRTRUNC,%q2,get(%va/BUFFER)))];&NUM_COMMENT %0=[inc(%q0)];&MODIFIED_ON %0=[secs()];&MODIFIED_BY %0=%2;@trigger
parent(%0)/HOOK_%3=%0,%2,[parent(%0)],%1;@trigger %va/TRIG_POST=%0,%3,%2,%1;@trigger %va/TRIG_MAIL=%0,%3,%2,%1
+&TRIG_APPLY
[v(JOB_VA)]=@trigger %va/TRIG_CREATE=%0,u(%va/FN_FIND-BUCKET,APPS),2,Application
by [name(%0)],
+&TRIG_BROADCAST [v(JOB_VA)]=@switch isdbref(%1)=1,{@pemit/list
[setq(0,parent(%0))][setq(J,%0)][setq(0,ifelse(isdbref(%q0),%q0,%vc))][filter(%va/FIL_BROADCAST,setunion(lwho(),))]=[ansi(hc,JOBS:)]%b[u(%q0/BLETTER_%2,%0,%1,%3,%4)]},{@pemit/list
[setq(0,%0)][filter(%va/FIL_BROADCAST,setunion(lwho(),))]=[ansi(hc,JOBS:)]%b%1}
+&TRIG_CLEAN [v(JOB_VA)]=@dolist [lcon(%va)] [lcon(%vb)]={@switch
[u(FN_CLEANFIND,##,OPENED_BY)][u(FN_CLEANFIND,##,ASSIGNED_TO)][u(FN_CLEANFIND,##,TAGGED_FOR)][u(FN_CLEANFIND,##,PLAYERS)][u(FN_CLEANFIND,##,WRITER)][u(FN_CLEANFIND,##,MEMBERLIST)][u(FN_CLEANFIND,##,JOBACCESS)]=1??????,{&OPENED_BY
##=U(FN_CLEANFIX,##,OPENED_BY)},?1?????,{&ASSIGNED_TO
##=U(FN_CLEANFIX,##,ASSIGNED_TO)},??1????,{&TAGGED_FOR
##=U(FN_CLEANFIX,##,TAGGED_FOR)},???1???,{&PLAYERS
##=U(FN_CLEANFIX,##,PLAYERS)},????1??,{&WRITER
##=U(FN_CLEANFIX,##,WRITER)},?????1?,{&MEMBERLIST
##=U(FN_CLEANFIX,##,MEMBERLIST)},??????1,{&JOBACCESS
##=U(FN_CLEANFIX,##,JOBACCESS)}};
+&TRIG_CREATE [v(JOB_VA)]=@switch
gte(u(%va/FN_PCT),100)=1,{@pemit %0=[ansi(hr,JOBS ERROR:)] Creation failed.
The +jobs system is full. Contact staff
immediately.;@trigger %va/TRIG_BROADCAST=%1,JOBS SYSTEM IS FULL! Please
complete jobs or boost your MAX_JOBS configuration.},{think
[setq(0,inc(u(%va/JOBS_NUM)))][setq(1,create(Job %q0,10))][setq(y,case(%7,1,CRE,OTH))];@tel %q1=%va;@link %q1=%va;&OPENED_BY %q1=[switch(%5,,%0,%5)];&OPENED_ON %q1=[secs()];&MODIFIED_ON %q1=[secs()];&STATUS %q1=1;&TITLE %q1=%3;@parent %q1=[u(%va/FN_FIND-BUCKET,%1)];&NUM_COMMENT %q1=2;&PRIORITY %q1=%2;&COMMENT_1 %q1=CRE|
[secs()]|%0|[name(%0)]|
[ifelse(u(%va/FN_HASATTRP,parent(%q1),ALETTER_%qy),u(%va/FN_STRTRUNC,u([parent(%q1)]/ALETTER_%qy,%q1,%0,edit(%4,|,@@PIPE@@)),get(%va/BUFFER)),u(%va/FN_STRTRUNC,edit(%4,|,@@PIPE@@),get(%va/BUFFER)))];&LIST_JOBSN %q1=%0|
1;&ASSIGNED_TO %q1=%6;&JOBS_NUM %va=%q0;&DUE_ON %q1=[ifelse(u(%va/FN_HASATTRP,%q1,TURNAROUND),add(secs(),mul(60,60,get(%q1/TURNAROUND))),)];@trigger %va/TRIG_BROADCAST=%q1,%0,%qy,%3;@trigger %1/HOOK_%qy=%q1,%0,%1,%4;@trigger %va/TRIG_POST=%q1,%qy,%0,%4;@trigger %va/TRIG_MAIL=%q1,%qy,%0,%4;think
[ulocal(FN_ADDSTAT,CRE,%va)][ulocal(FN_ADDSTAT,CRE,parent(%q1))];@switch
gt(u(%va/FN_PCT),95)=1,{@trigger %va/TRIG_BROADCAST=%1,JOBS SYSTEM IS
NEARING CAPACITY! Please complete jobs or boost your MAX_JOBS
configuration.}}
+&TRIG_DESTROY [v(JOB_VA)]=&going %0=1;@wait 60={@switch
get(%0/GOING)=1,{@switch
first(version())=PennMUSH,{@parent %0;@nuke %0;@wait
0=@nuke %0},{@parent %0;@dest/instant %0}}}
+&TRIG_LOG [v(JOB_VA)]=@switch
[setq(0,%0)][setq(1,parent(%q0))][setq(x,u(%va/FN_ITEMIZE,map(MAP_NAME,get(%q0/OPENED_BY),%b,|
),|
))][and(u(%va/FN_HASATTRP,%va,JOB_LOGGING),u(%va/FN_HASATTRP,%q1,LOGFILE))]=0,{@@},{@trigger %va/TRIG_LOG_WRITE=[u(%q1/LOGFILE)],[center(|
[name(%q0)]
|,79,=)];@trigger %va/TRIG_LOG_WRITE=[u(%q1/LOGFILE)],[ljust([rjust(ansi(hc,Bucket:),10)]%b[u(FN_BUCKETNAME,%q0)],40)][rjust(ansi(hc,Due
On:),12)]%b[ifelse(get(%q0/DUE_ON),ifelse(gt(secs(),get(%q0/DUE_ON)),OVERDUE!,convsecs(get(%q0/DUE_ON))),-)];@trigger %va/TRIG_LOG_WRITE=[u(%q1/LOGFILE)],[ljust([rjust(ansi(hc,Title:),10)]%b[get(%q0/TITLE)],40)][rjust(ansi(hc,Assigned
To:),12)]%b[ifelse(isdbref(get(%q0/ASSIGNED_TO)),name(get(%q0/ASSIGNED_TO)),Nobody)];@trigger %va/TRIG_LOG_WRITE=[u(%q1/LOGFILE)],[ljust([rjust(ansi(hc,Opened
On:),10)]%b[convsecs(get(%q0/OPENED_ON))],40)][rjust(ansi(hc,Status:),12)]%b[switch(get(%q0/PRIORITY),1,Green,2,Yellow,3,Red)]%b%([last(get(%va/STATUS_[get(%q0/STATUS)]),|
)]%);@trigger %va/TRIG_LOG_WRITE=[u(%q1/LOGFILE)],[rjust(ansi(hc,Opened
By:),10)] %qx;@dolist
sortby(%va/SORTBY_COMMENTS,lattr(%q0/COMMENT_*))={@trigger %va/TRIG_LOG_WRITE=[u(%q1/LOGFILE)],[repeat(-,79)];@trigger %va/TRIG_LOG_WRITE=[u(%q1/LOGFILE)],[extract(get(%q0/##),4,1,|
)]%badded on%b[convsecs(extract(get(%q0/##),2,1,|
))]:%b[edit(last(get(%q0/##),|),@@PIPE@@,|)]};@wait
1={@trigger %va/TRIG_LOG_WRITE=[u(%q1/LOGFILE)],[repeat(=,79)]}}
+&TRIG_LOG_WRITE [v(JOB_VA)]=@switch
[first(version())]=RhostMUSH,{@log/file %0=%1},PennMUSH,{@log/cmd %1},{@log %0=%1}
+&TRIG_MAIL [v(JOB_VA)]=@switch
[u(%va/FN_HASATTRP,%0,MLETTER_%1)][setq(J,%0)]=1,{@wait
1={@trigger %vb/TRIG_MAIL=[switch(%1,MAI,[get(%0/OPENED_BY)],APR,[get(%0/OPENED_BY)],DNY,[get(%0/OPENED_BY)],filter(%va/FIL_NOSPAM,setunion(get(%0/OPENED_BY),)))],[switch(%1,APR,Approved:,DEL,Deleted:,DNY,Denied:,COM,Complete:,[name(%0)]:)]%b[get(%0/TITLE)],[u(parent(%0)/MLETTER_%1,%0,%1,%2,%3)]};}
+&TRIG_POST [v(JOB_VA)]=@switch [u(%va/FN_HASATTRP,%0,PLETTER_%1)]=1,{@wait
1={@trigger %vb/TRIG_POST=[get(%0/POST_[case(%1,APR,APPROVE,DEL,DELETE,DNY,DENY,COM,COMPLETE,APPROVE)])],[switch(%1,APR,A:,DNY,D:,COM,C:,[name(%0)]:)]%b[get(%0/TITLE)],[u(parent(%0)/PLETTER_%1,%0,%1,%2,%3)]};}
+@dolist VA VB VC={@cpattr %#/JOB_##=[v(JOB_VA)]/##}
+think [ansi(hc,ANOMALY JOBS:)] Installing skins.
+&DEFAULT_SKIN [v(JOB_VA)]=1
+&DEFAULT_BANNER
[v(JOB_VA)]=[setq(0,%0)][setq(x,u(%va/FN_ITEMIZE,map(MAP_NAME,get(%q0/OPENED_BY),%b,|
),|))][setq(y,u(%va/FN_ITEMIZE,map(MAP_NAME,get(%q0/TAGGED_FOR),%b,|),|
))][ljust([rjust(ansi(hc,Bucket:),10)]%b[u(%va/FN_BUCKETNAME,%q0)],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(hc,Due
On:),12)]%b[ifelse(get(%q0/DUE_ON),ifelse(gt(secs(),get(%q0/DUE_ON)),OVERDUE!,convsecs(get(%q0/DUE_ON))),-)]%r[ljust([rjust(ansi(hc,Title:),10)]%b[get(%q0/TITLE)],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(hc,Status:),12)]%b[switch(get(%q0/PRIORITY),1,Green,2,Yellow,3,Red)]%b%([last(get(%va/STATUS_[get(%q0/STATUS)]),|
)]%)%r[ljust([rjust(ansi(hc,Opened On:),10)]
[convsecs(get(%q0/OPENED_ON))],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(hc,Assigned
To:),12)]%b[ifelse(isdbref(get(%q0/ASSIGNED_TO)),name(get(%q0/ASSIGNED_TO)),Nobody)]%r[rjust(ansi(hc,Opened
By:),10)]%b%qx[ifelse(words(%qy),%r[rjust(ansi(hc,Tagged:),10)]%b%qy,)]
+&DEFAULT_BREAK
[v(JOB_VA)]=switch(%0,,repeat(-,u(FN_FLEXWIDTH,79)),rjust(%[%0%],u(FN_FLEXWIDTH,79),-))
+&DEFAULT_BUCKETHEADER [v(JOB_VA)]=[u(FN_HEADER,Bucket
List)]%r[ifelse(u(%va/FN_WIZONLY,%#),[ansi(hc,[ljust(Name,9)][ljust(Flags,6)]%b%b[ljust(Description,u(FN_FLEXWIDTH,30))][rjust(#Jobs,5)][rjust(Pct,5)][space(3)]C%b%bA%b%bD%b%bDue[space(3)]ARTS)],[ansi(hc,[ljust(NAME,8)][ljust(Description,u(FN_FLEXWIDTH,50))]%b[rjust(Viewing,20)])])]%r[u(FN_BREAK)]
+&DEFAULT_BUCKETLIST
[v(JOB_VA)]=[ifelse(u(%va/FN_WIZONLY,%#),[ljust(name(%0),6)]%b%b[ifelse(u(%va/FN_MONITORCHECK,%0,%#),V,-)][ifelse(u(%va/IS_HIDDEN,%0),H,-)][ifelse(u(%va/IS_LOCKED,%0),ifelse(u(%va/FN_HASATTRP,%0,CHECKOUT),C,L),-)][ifelse(u(%va/IS_TAGGED,%0),T,-)][ifelse(u(%va/IS_PUBLIC,%0),M,-)][ifelse(u(%va/IS_PUBLISHED,%0),P,-)][ifelse(u(%va/IS_SUMMARY,%0),S,-)]%b%b[u(%va/FN_STREXACT,get(%0/DESC),u(FN_FLEXWIDTH,30))][rjust(words(remove(children(%0),#-1)),5)][rjust(mul(round(fdiv(words(remove(children(%0),#-1)),max(1,words(lcon(%va)))),2),100)%%,5)]%b%b[rjust(u(%va/FN_FIND-BBNUM,get(%0/POST_COMPLETE)),2)]%b[rjust(u(%va/FN_FIND-BBNUM,get(%0/POST_APPROVE)),2)]%b[rjust(u(%va/FN_FIND-BBNUM,get(%0/POST_DENY)),2)][rjust(default(%0/TURNAROUND,0),5)][rjust([ifelse(u(%va/FN_HASATTR,%0,STAT_ART),[round(fdiv(fdiv(first(get(%0/STAT_ART)),rest(get(%0/STAT_ART))),86400),0)]d,-)],7)],[ljust(name(%0),6)]%b%b[u(%va/FN_STREXACT,get(%0/DESC),u(FN_FLEXWIDTH,50))]%b[rjust(ifelse(u(%va/FN_MONITORCHECK,%0,%#),Yes,-),20)])]
+&DEFAULT_FLAGS
[v(JOB_VA)]=[ifelse(u(me/IS_LOCKED,%0),u(me/FN_FLAG,ifelse(u(%va/FN_HASATTRP,%0,CHECKOUT),CHECKED
OUT,LOCKED),hr),)][ifelse(u(me/IS_PUBLIC,%0),u(me/FN_FLAG,Myjobs),)][ifelse(u(me/IS_PUBLISHED,%0),u(me/FN_FLAG,Published),)]
+&DEFAULT_FOOTER
[v(JOB_VA)]=[switch(%0,,repeat(=,u(FN_FLEXWIDTH,79)),center(| %0
|,u(FN_FLEXWIDTH,79),=))]
+&DEFAULT_HEADER
[v(JOB_VA)]=[switch(%0,,[repeat(=,u(FN_FLEXWIDTH,79))],[center(|
[ansi(hy,%0)] |,u(FN_FLEXWIDTH,79),=)])]
+&DEFAULT_JOBLIST
[v(JOB_VA)]=[setq(j,secure(ifelse(u(%va/FN_HASATTRP,%1,JOBS),lcstr(mid(get(%1/JOBS),0,20)),get(%va/JOBS_DEFAULT))))][setq(1,ifelse(get(%0/DUE_ON),ifelse(gt(secs(),get(%0/DUE_ON)),r,switch(get(%0/PRIORITY),1,g,2,y,3,r,g)),switch(get(%0/PRIORITY),1,g,2,y,3,r)))][ifelse(u(%va/FN_ISNEW,%0,%1),[ansi(hr,*)]%b,%b%b)][ansi(h%q1,[rjust([last(name(%0))],5)]%b[iter(lnum(strlen(%qj)),[u(%va/DISPLAY_[mid(%qj,##,1)],%0,%1)])])]
+&DEFAULT_JOBSHEADER [v(JOB_VA)]=[u(FN_HEADER,Anomaly Jobs
[u(VERSION)])]%r[setq(j,[secure(switch(u(%va/FN_HASATTRP,%0,JOBS),1,lcstr(mid(get(%0/JOBS),0,20)),u(JOBS_DEFAULT)))])][ansi(hc,*%b%b[ljust(Job#,5)][iter(lnum(strlen(%qj)),u(HEADER_[mid(%qj,##,1)]))])]%r[u(FN_BREAK)]
+&DEFAULT_MYJOBLIST
[v(JOB_VA)]=[ifelse(u(FN_ISNEW,%0,%1),[ansi(hr,*)],%b)]%b[setq(j,TDAS)][ansi(n,[rjust([last(name(%0))],5)]%b[iter(lnum(strlen(%qj)),u(DISPLAY_[mid(%qj,##,1)],%0,%1))])]
+&DEFAULT_MYJOBSHEADER [v(JOB_VA)]=[u(FN_HEADER,Anomaly Jobs
[u(VERSION)])]%r[setq(j,TDAS)][ansi(ch,ljust(*%b%b[ljust(Job#,5)][iter(lnum(strlen(%qj)),u(HEADER_[mid(%qj,##,1)]))],[u(FN_FLEXWIDTH,79)]))]%r[u(FN_BREAK)]
+&DEFAULT_MYBANNER
[v(JOB_VA)]=[setq(0,%0)][setq(x,u(%va/FN_ITEMIZE,map(MAP_NAME,get(%q0/OPENED_BY),%b,|
),|
))][ljust([rjust(ansi(hc,Bucket:),10)]%b[u(%va/FN_BUCKETNAME,%q0)],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(hc,Due
On:),12)]%b[ifelse(get(%q0/DUE_ON),ifelse(gt(secs(),get(%q0/DUE_ON)),OVERDUE!,convsecs(get(%q0/DUE_ON))),-)]%r[ljust([rjust(ansi(hc,Title:),10)]%b[get(%q0/TITLE)],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(hc,Assigned
To:),12)]%b[ifelse(isdbref(get(%q0/ASSIGNED_TO)),name(get(%q0/ASSIGNED_TO)),Nobody)]%r[ljust([rjust(ansi(hc,Opened
On:),10)]%b[convsecs(get(%q0/OPENED_ON))],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(hc,Status:),12)]%b[switch(get(%q0/PRIORITY),1,Green,2,Yellow,3,Red)]%b%r[rjust(ansi(hc,Opened
By:),10)]%b%qx
+&DEFAULT_MYSUMMARY
[v(JOB_VA)]=%r[u(FN_BREAK,MySummary)]%r[u(parent(%0)/MYSUMMARY,%0)]
+&DEFAULT_READ
[v(JOB_VA)]=[repeat(-,u(FN_FLEXWIDTH,79))]%r[ifelse(u(%va/EDIT_ACCESS,%#),[ansi(h,%[)][ifelse(and(or(u(%va/IS_PUBLISHED,%1),switch(extract(get(%1/%0),3,1,|
),u(%1/OPENED_BY),1,0),hasflag(%1/%0,no_inherit)),u(%va/IS_PUBLIC,%1)),ansi(hc,[rest(%0,_)]+),ansi(hc,[rest(%0,_)]-))][ansi(h,%])]%b,)][ansi(h,[extract(get(%1/%0),4,1,|
)]%badded on%b[convsecs(extract(get(%1/%0),2,1,|))]:%b
)][edit(last(get(%1/%0),|),@@PIPE@@,|)]
+&DEFAULT_STAFFSUM
[v(JOB_VA)]=%r[repeat(-,u(FN_FLEXWIDTH,79))]%r[rjust(ansi(hc,DB#:),10)] %0[space(10)][rjust(ansi(hc,Comments:),10)]
[setr(z,words(lattr(%0/COMMENT_*)))]%r%r[rjust(ansi(hc,Players:),10)] %(Players
contributing to this
job%)%r[setq(y,setunion(iter(lattr(%0/COMMENT_*),extract(get(%0/##),4,1,|
),%b,|),,|
))][u(%va/fn_columns,%qy,20,|,11)][ifelse(u(%va/FN_HASATTR,%0,LIST_READERS),%r[rjust(ansi(hc,Readers:),10)]%b%(Players
who have read this job in the
past%)%r[setq(z,iter(get(%0/LIST_READERS),first(##,|
)))][u(%va/fn_columns,map(%va/MAP_NAME,%qz,%b,|
),20,|,11)],)]%r[rjust(ansi(hc,Stats:),10)]%r[u(%va/fn_columns,iter(ifelse(u(%va/FN_HASATTR,%0,LIST_STATS),sort(get(%0/LIST_STATS)),),[first(##,|
)]%b[last(##,|)],%b,|),20,|,11)]%r
+&DEFAULT_SUMMARY
[v(JOB_VA)]=%r[repeat(-,u(FN_FLEXWIDTH,79))]%r[u(parent(%0)/SUMMARY,%0)]
+&CHROME_SKIN [v(JOB_VA)]=1
+&CHROME_BANNER
[v(JOB_VA)]=%r[setq(0,%0)][setq(x,u(%va/FN_ITEMIZE,map(MAP_NAME,get(%q0/OPENED_BY),%b,|
),|))][setq(y,u(%va/FN_ITEMIZE,map(MAP_NAME,get(%q0/TAGGED_FOR),%b,|),|
))][ljust([rjust(ansi(hc,Bucket:),10)]%b[u(%va/FN_BUCKETNAME,%q0)],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(hc,Due
On:),12)]%b[ifelse(get(%q0/DUE_ON),ifelse(gt(secs(),get(%q0/DUE_ON)),OVERDUE!,convsecs(get(%q0/DUE_ON))),-)]%r[ljust([rjust(ansi(hc,Title:),10)]%b[get(%q0/TITLE)],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(hc,Status:),12)]%b[switch(get(%q0/PRIORITY),1,Green,2,Yellow,3,Red)]%b%([last(get(%va/STATUS_[get(%q0/STATUS)]),|
)]%)%r[ljust([rjust(ansi(hc,Opened
On:),10)]%b[convsecs(get(%q0/OPENED_ON))],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(hc,Assigned
To:),12)]%b[ifelse(isdbref(get(%q0/ASSIGNED_TO)),name(get(%q0/ASSIGNED_TO)),Nobody)]%r[rjust(ansi(hc,Opened
By:),10)]%b%qx[ifelse(words(%qy),%r[rjust(ansi(hc,Tagged:),10)]%b%qy,)]
+&CHROME_BREAK [v(JOB_VA)]=rjust(ifelse(%0,%[%0%]),u(FN_FLEXWIDTH,79),_)
+&CHROME_FLAGS
[v(JOB_VA)]=[edit(u(%va/fn_trim,squish([ifelse(u(me/IS_LOCKED,%0),%b[ansi(hr,ifelse(u(%va/FN_HASATTRP,%0,CHECKOUT),CHECKED_OUT,LOCKED))]%b,)][ifelse(u(me/IS_PUBLIC,%0),%bMYJOBS%b,)][ifelse(u(me/IS_PUBLISHED,%0),%bPUBLISHED%b,)])),%b,%b-%b)]
+&CHROME_FOOTER
[v(JOB_VA)]=%r[switch(%0,,[repeat(~,u(FN_FLEXWIDTH,79))],[repeat(~,sub(u(FN_FLEXWIDTH,73),strlen(%0)))]|
[ansi(Chw,%b[stripansi(%0)]%b)]|~~)]
+&CHROME_HEADER [v(JOB_VA)]=[switch(%0,,[repeat(_,u(FN_FLEXWIDTH,79))],__|
[ansi(Chw,%b%0%b)]|[repeat(_,sub(u(FN_FLEXWIDTH,73),strlen(%0)))])]
+&CHROME_JOBLIST
[v(JOB_VA)]=[setq(j,secure(ifelse(u(%va/FN_HASATTRP,%1,JOBS),lcstr(mid(get(%1/JOBS),0,20)),get(%va/JOBS_DEFAULT))))][setq(1,ifelse(get(%0/DUE_ON),ifelse(gt(secs(),get(%0/DUE_ON)),h,switch(get(%0/PRIORITY),1,hx,2,n,3,h,hx)),switch(get(%0/PRIORITY),1,hx,2,n,3,h)))][ifelse(u(%va/FN_ISNEW,%0,%1),[ansi(hr,*)]%b,%b%b)][ansi(h%q1,[rjust([last(name(%0))],5)]%b[iter(lnum(strlen(%qj)),[u(%va/DISPLAY_[mid(%qj,##,1)],%0,%1)])])]
+&CHROME_JOBSHEADER [v(JOB_VA)]=[u(FN_HEADER,Anomaly Jobs
[u(VERSION)])]%r[setq(j,[secure(switch(u(%va/FN_HASATTRP,%0,JOBS),1,lcstr(mid(get(%0/JOBS),0,20)),u(JOBS_DEFAULT)))])][setq(2,*%b%b[ljust(Job#,5)][iter(lnum(strlen(%qj)),u(HEADER_[mid(%qj,##,1)]))])][ansi(Chcu,ljust(%q2,u(FN_FLEXWIDTH,79)))]%r
+&CHROME_MYJOBSHEADER [v(JOB_VA)]=[u(FN_HEADER,Anomaly Jobs
[u(VERSION)])]%r[setq(j,TDAS)][ansi(Chcu,ljust(*%b%b[ljust(Job#,5)][iter(lnum(strlen(%qj)),u(HEADER_[mid(%qj,##,1)]))],u(FN_FLEXWIDTH,79)))]%r
+&CHROME_MYJOBLIST
[v(JOB_VA)]=[ifelse(u(FN_ISNEW,%0,%1),[ansi(r,*)]%b,%b%b)]%b[setq(j,TDAS)][ansi(hx,[rjust([last(name(%0))],5)]%b[iter(lnum(strlen(%qj)),u(DISPLAY_[mid(%qj,##,1)],%0,%1))])]
+&CHROME_READ
[v(JOB_VA)]=%r[setq(0,[ifelse(u(%va/EDIT_ACCESS,%#),[ansi(Xhu,%b[rest(%0,_)]:%b)],[ansi(Xhu,%b)])]|
[ansi(Xhc,%b[extract(get(%1/%0),4,1,|)])]%b|
)]%q0[ansi(Xhu,repeat(%b,sub(25,strlen(%q0))))][ifelse(and(or(u(%va/IS_PUBLISHED,%1),switch(extract(get(%1/%0),3,1,|
),u(%1/OPENED_BY),1,0),hasflag(%1/%0,no_inherit)),u(%va/IS_PUBLIC,%1)),[ansi(Xhu,repeat(%b,div(u(FN_FLEXWIDTH,14),2)))]|
[ansi(Xc,%b+Published+%b)]|
[ansi(Xhu,repeat(%b,div(u(FN_FLEXWIDTH,14),2)))],[ansi(Xhu,repeat(%b,u(FN_FLEXWIDTH,29)))])][ansi(Xhu,[convsecs(extract(get(%1/%0),2,1,|
))]%b)]%r[space(4)][edit(last(get(%1/%0),|),@@PIPE@@,|)]
+&CHROME_SUMMARY
[v(JOB_VA)]=%r[repeat(_,u(FN_FLEXWIDTH,79))]%r[u(parent(%0)/SUMMARY,%0)]
+&WHITEBG_SKIN [v(JOB_VA)]=1
+&WHITEBG_JOBLIST
[v(JOB_VA)]=[setq(j,secure(ifelse(u(%va/FN_HASATTRP,%1,JOBS),lcstr(mid(get(%1/JOBS),0,20)),get(%va/JOBS_DEFAULT))))][setq(1,ifelse(get(%0/DUE_ON),ifelse(gt(secs(),get(%0/DUE_ON)),r,switch(get(%0/PRIORITY),1,g,2,y,3,r,g)),switch(get(%0/PRIORITY),1,g,2,y,3,r)))][ifelse(u(%va/FN_ISNEW,%0,%1),[ansi(hr,*)]%b,%b%b)][ansi(%q1,[rjust([last(name(%0))],5)]%b[iter(lnum(strlen(%qj)),[u(%va/DISPLAY_[mid(%qj,##,1)],%0,%1)])])]
+&WHITEBG_FLAGS
[v(JOB_VA)]=[ifelse(u(me/IS_LOCKED,%0),%[[ansi(r,ifelse(u(%va/FN_HASATTRP,%0,CHECKOUT),CHECKED
OUT,LOCKED))]%],)][ifelse(u(me/IS_PUBLIC,%0),%[Myjobs%],)][ifelse(u(me/IS_PUBLISHED,%0),%[Published%],)]
+&WHITEBG_FOOTER
[v(JOB_VA)]=[ansi(x,switch(%0,,repeat(=,u(FN_FLEXWIDTH,79)),center(|
[stripansi(%0)] |,u(FN_FLEXWIDTH,79),=)))]
+&WHITEBG_JOBSHEADER [v(JOB_VA)]=[u(FN_HEADER,Anomaly Jobs
[u(VERSION)])]%r[setq(j,[secure(switch(u(%va/FN_HASATTRP,%0,JOBS),1,lcstr(mid(get(%0/JOBS),0,20)),u(JOBS_DEFAULT)))])][ansi(c,*%b%b[ljust(Job#,5)][iter(lnum(strlen(%qj)),u(HEADER_[mid(%qj,##,1)]))])]%r[u(FN_BREAK)]
+&WHITEBG_MYJOBSHEADER [v(JOB_VA)]=[u(FN_HEADER,Anomaly Jobs
[u(VERSION)])]%r[setq(j,TDAS)][ansi(c,ljust(%b*%b%b[ljust(Job#,5)][iter(lnum(strlen(%qj)),u(HEADER_[mid(%qj,##,1)]))],u(FN_FLEXWIDTH,79)))]%r[u(FN_BREAK)]
+&WHITEBG_MYBANNER
[v(JOB_VA)]=[setq(0,%0)][setq(x,u(%va/FN_ITEMIZE,map(MAP_NAME,get(%q0/OPENED_BY),%b,|
),|
))][ljust([rjust(ansi(c,Bucket:),10)]%b[u(%va/FN_BUCKETNAME,%q0)],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(c,Due
On:),12)]%b[ifelse(get(%q0/DUE_ON),ifelse(gt(secs(),get(%q0/DUE_ON)),OVERDUE!,convsecs(get(%q0/DUE_ON))),-)]%r[ljust([rjust(ansi(c,Title:),10)]%b[get(%q0/TITLE)],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(c,Assigned
To:),12)]%b[ifelse(isdbref(get(%q0/ASSIGNED_TO)),name(get(%q0/ASSIGNED_TO)),Nobody)]%r[ljust([rjust(ansi(c,Opened
On:),10)]%b[convsecs(get(%q0/OPENED_ON))],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(c,Status:),12)]%b[switch(get(%q0/PRIORITY),1,Green,2,Yellow,3,Red)]%b%r[rjust(ansi(c,Opened
By:),10)]%b%qx
+&WHITEBG_HEADER
[v(JOB_VA)]=[ansi(x,switch(%0,,[repeat(=,u(FN_FLEXWIDTH,79))],[center(|
[stripansi(%0)] |,u(FN_FLEXWIDTH,79),=)]))]
+&WHITEBG_READ
[v(JOB_VA)]=[repeat(-,u(FN_FLEXWIDTH,79))]%r[ifelse(u(%va/EDIT_ACCESS,%#),[ansi(x,%[)][ifelse(and(or(u(%va/IS_PUBLISHED,%1),switch(extract(get(%1/%0),3,1,|
),u(%1/OPENED_BY),1,0),hasflag(%1/%0,no_inherit)),u(%va/IS_PUBLIC,%1)),ansi(c,[rest(%0,_)]+),ansi(c,[rest(%0,_)]-))][ansi(x,%])]%b,)][ansi(x,[extract(get(%1/%0),4,1,|
)] added on [convsecs(extract(get(%1/%0),2,1,|
))]: %b)][edit(last(get(%1/%0),|),@@PIPE@@,|)]
+&WHITEBG_BUCKETHEADER [v(JOB_VA)]=[u(FN_HEADER,Bucket
List)]%r[ifelse(u(%va/FN_WIZONLY,%#),[ansi(c,[ljust(Name,9)][ljust(Flags,6)]%b%b[ljust(Description,u(FN_FLEXWIDTH,30))][rjust(#Jobs,5)][rjust(Pct,5)][space(3)]C%b%bA%b%bD%b%bDue[space(3)]ARTS)],[ansi(c,[ljust(NAME,8)][ljust(Description,u(FN_FLEXWIDTH,50))]%b[rjust(Viewing,20)])])]%r[u(FN_BREAK)]
+&WHITEBG_STAFFSUM
[v(JOB_VA)]=%r[repeat(-,u(FN_FLEXWIDTH,79))]%r[rjust(ansi(c,DB#:),10)] %0[space(10)][rjust(ansi(c,Comments:),10)]
[setr(z,words(lattr(%0/COMMENT_*)))]%r%r[rjust(ansi(c,Players:),10)] %(Players
contributing to this
job%)%r[setq(y,setunion(iter(lattr(%0/COMMENT_*),extract(get(%0/##),4,1,|
),%b,|),,|
))][u(%va/fn_columns,%qy,20,|,11)][ifelse(u(%va/FN_HASATTR,%0,LIST_READERS),%r[rjust(ansi(c,Readers:),10)] %(Players
who have read this job in the
past%)%r[setq(z,iter(get(%0/LIST_READERS),first(##,|
)))][u(%va/fn_columns,map(%va/MAP_NAME,%qz,%b,|
),20,|,11)],)][rjust(ansi(c,Stats:),10)]%r[u(%va/fn_columns,iter(ifelse(u(%va/FN_HASATTR,%0,LIST_STATS),sort(get(%0/LIST_STATS)),),[first(##,|
)] [last(##,|)],%b,|),20,|,11)]%r
+&WHITEBG_BANNER
[v(JOB_VA)]=[setq(0,%0)][setq(x,u(%va/FN_ITEMIZE,map(MAP_NAME,get(%q0/OPENED_BY),%b,|
),|))][setq(y,u(%va/FN_ITEMIZE,map(MAP_NAME,get(%q0/TAGGED_FOR),%b,|),|
))][ljust([rjust(ansi(c,Bucket:),10)]
[u(%va/FN_BUCKETNAME,%q0)],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(c,Due
On:),12)]
[ifelse(get(%q0/DUE_ON),ifelse(gt(secs(),get(%q0/DUE_ON)),OVERDUE!,convsecs(get(%q0/DUE_ON))),-)]%r[ljust([rjust(ansi(c,Title:),10)]
[get(%q0/TITLE)],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(c,Status:),12)]
[switch(get(%q0/PRIORITY),1,Green,2,Yellow,3,Red)] %([last(get(%va/STATUS_[get(%q0/STATUS)]),|
)]%)%r[ljust([rjust(ansi(c,Opened On:),10)]
[convsecs(get(%q0/OPENED_ON))],div(u(FN_FLEXWIDTH,80),2))][rjust(ansi(c,Assigned
To:),12)]
[ifelse(isdbref(get(%q0/ASSIGNED_TO)),name(get(%q0/ASSIGNED_TO)),Nobody)]%r[rjust(ansi(c,Opened
By:),10)]%b%qx[ifelse(words(%qy),%r[rjust(ansi(c,Tagged:),10)]%b%qy,)]
+&CREDITS [v(JOB_VA)]=Starfleet@Anomaly
+&MAINTAINER [v(JOB_VA)]=Minion@Crossroads
+&CONTRIBUTORS [v(JOB_VA)]=Firestorm@Ephemera, Grey@Anomaly, Ian@MUX,
Minion@Crossroads
+&LICENSE [v(JOB_VA)]=You may port this code to any game provided that
these credits remain intact. Please report any and all bugs, feedback, etc.
to the project's home:
http://code.google.com/p/anomalyjobs/
+&RELEASE [v(JOB_VA)]=TBD, 2011
+&VERSION [v(JOB_VA)]=v6.5
+&VERSION [v(JOB_VC)]=v6.5
+@switch first(version())=RhostMUSH,{&TRIG_MAIL [v(JOB_VB)]=lit(mail
[remove(%0,owner(me))]=%1//%2)},PennMUSH,{&TRIG_MAIL [v(JOB_VB)]=lit(@mail
[remove(%0,owner(me))]=%1/%2)},{&TRIG_MAIL [v(JOB_VB)]=lit(@mail/quick
[remove(%0,owner(me))]/%1=%2)}
+&TRIG_POST [v(JOB_VB)]=+bbpost %0/%1=%2
+think [ansi(hc,ANOMALY JOBS:)] Setting up master parent.
+&daily [v(JOB_VC)]=@dolist lcon(me)={@switch
[u(%va/FN_HASATTR,##,HOOK_AUT)]=1,{@trigger ##/HOOK_AUT=[u(%va/fn_trim,##
[remove(children(##),#-1)],b)],[owner(%va)]}}
+@switch first(version())=PennMUSH,{think [ansi(hc,ANOMALY JOBS:)] PennMUSH
does not have @daily.%BAdd a daily trigger to [v(JOB_VC)]/DAILY to your
CRON object.},RhostMUSH,{think [ansi(hc,ANOMALY JOBS:)] RhostMUSH does not
have @daily.%BInstall an @daily emulator or add a daily trigger to
[v(JOB_VC)]/DAILY to your CRON object.}
+@switch [v(JOB_PATCH)]=0,{&ACCESS
[v(JOB_VC)]=lit([u(%va/FN_STAFFALL,%#)]);&ACCESS_DESC
[v(JOB_VC)]=lit([u(%va/FN_STAFFALL,%0)]);&ACCESS_HELP
[v(JOB_VC)]=lit([u(%va/FN_STAFFALL,%0)]);&ACCESS_HIDDEN
[v(JOB_VC)]=lit([u(%va/FN_WIZONLY,%0)]);&ACCESS_LOCKED
[v(JOB_VC)]=lit([u(%va/FN_WIZONLY,%0)]);&ACCESS_LOGFILE
[v(JOB_VC)]=lit([u(%va/FN_WIZONLY,%0)]);&ACCESS_MYJOBS
[v(JOB_VC)]=lit([u(%va/FN_WIZONLY,%0)]);&ACCESS_POST_APPROVE
[v(JOB_VC)]=lit([u(%va/FN_WIZONLY,%0)]);&ACCESS_POST_COMPLETE
[v(JOB_VC)]=lit([u(%va/FN_WIZONLY,%0)]);&ACCESS_POST_DENY
[v(JOB_VC)]=lit([u(%va/FN_WIZONLY,%0)]);&ACCESS_TURNAROUND
[v(JOB_VC)]=lit([u(%va/FN_WIZONLY,%0)]);}
+&BLETTER_ADD [v(JOB_VC)]=Comments added to [name(%0)] by [name(%1)].
+&BLETTER_APR [v(JOB_VC)]=[name(%0)] has been approved by [name(%1)].
+&BLETTER_ASN [v(JOB_VC)]=[name(%0)] has been
[ifelse(strmatch(%1,%2),claimed,assigned to [switch(%2,,nobody,name(%2))])]
by [name(%1)].
+&BLETTER_CKI [v(JOB_VC)]=[name(%0)] has been checked in by [name(%1)].
+&BLETTER_CKO [v(JOB_VC)]=[name(%0)] has been checked out by [name(%1)].
+&BLETTER_CLN [v(JOB_VC)]=[name(%0)] has been cloned by [name(%1)].
[name(%2)] is the new job.
+&BLETTER_COM [v(JOB_VC)]=[name(%0)] has been completed by [name(%1)].
+&BLETTER_CRE [v(JOB_VC)]=[name(%0)] has been created by [name(%1)] in
[name(parent(%0))]: %2
+&BLETTER_DNY [v(JOB_VC)]=[name(%0)] has been denied by [name(%1)].
+&BLETTER_DUE [v(JOB_VC)]=[name(%0)]'s due date changed by [name(%1)].
+&BLETTER_DEL [v(JOB_VC)]=[name(%0)] has been deleted by [name(%1)].
+&BLETTER_EDT [v(JOB_VC)]=[name(%0)] has been edited by [name(%1)].
+&BLETTER_ESC [v(JOB_VC)]=[name(%0)] has been escalated to %2 by [name(%1)].
+&BLETTER_LOK [v(JOB_VC)]=[name(%0)] has been locked by [name(%1)].
+&BLETTER_MAI [v(JOB_VC)]=[name(%1)] has sent mail regarding [name(%0)].
+&BLETTER_MRG [v(JOB_VC)]=[name(%2)] has been merged into [name(%0)] by
[name(%1)].
+&BLETTER_MYS [v(JOB_VC)]=[name(%0)]/%2 mysummary setting has been modified
by [name(%1)].
+&BLETTER_NAM [v(JOB_VC)]=[name(%0)] has been renamed to '%2' by [name(%1)].
+&BLETTER_OTH [v(JOB_VC)]=[name(%0)] has been created by [name(%1)] in
[name(parent(%0))]: %2
+&BLETTER_PUB [v(JOB_VC)]=[name(%0)][ifelse(t(strlen(%2)),/Comment %2,)]
has been published by [name(%1)].
+&BLETTER_SRC [v(JOB_VC)]=[name(%0)]'s source has been changed by
[name(%1)].
+&BLETTER_STA [v(JOB_VC)]=[name(%0)]'s status has been changed by
[name(%1)].
+&BLETTER_SUM [v(JOB_VC)]=[name(%0)]/%2 summary setting has been modified
by [name(%1)].
+&BLETTER_TAG [v(JOB_VC)]=[name(%0)]'s tags have been altered by [name(%1)].
+&BLETTER_TRN [v(JOB_VC)]=[name(%0)] has been transferred to the [name(%2)]
bucket by [name(%1)].
+&BLETTER_UND [v(JOB_VC)]=[name(%0)] has been undeleted by [name(%1)].
+&BLETTER_UNL [v(JOB_VC)]=[name(%0)] has been unlocked by [name(%1)].
+&BLETTER_UNP [v(JOB_VC)]=[name(%0)][ifelse(t(strlen(%2)),/Comment %2,)]
has been unpublished by [name(%1)].
+&ERROR_HIDDEN [v(JOB_VC)]=Valid options for the HIDDEN parameter are 'yes'
and 'no'.
+&ERROR_LOCKED [v(JOB_VC)]=Valid settings for the LOCKED parameter
are 'yes' and 'no'.
+&ERROR_MYJOBS [v(JOB_VC)]=Valid settings for the MYJOBS parameter
are 'yes' and 'no'.
+&ERROR_POST_APPROVE [v(JOB_VC)]=The setting for the POST_APPROVE parameter
must be a positive integer.
+&ERROR_POST_COMPLETE [v(JOB_VC)]=The setting for the POST_COMPLETE
parameter must be a positive integer.
+&ERROR_POST_DENY [v(JOB_VC)]=The setting for the POST_DENY parameter must
be a positive integer.
+&ERROR_TURNAROUND [v(JOB_VC)]=You must provide a turnaround time in hours.
+&HELP [v(JOB_VC)]=%rThere is no help available for that bucket. To set
help information for the [name(me)] bucket, use:%r%r[space(5)]+bucket/set
[lcstr(name(me))]/help=<information>%r
+&HOOK_CKO [v(JOB_VC)]=@cpattr %0/ASSIGNED_TO=%0/TEMP_ASN;&ASSIGNED_TO %0=%1
+&HOOK_CKI [v(JOB_VC)]=&ASSIGNED_TO %0=[get(%0/TEMP_ASN)];&TEMP_ASN %0=
+&HOOK_MAI
[v(JOB_VC)]=@set %0/[last(sortby(%va/SORTBY_COMMENTS,lattr(%0/COMMENT_*)))]=no_inherit
+&MLETTER_APR [v(JOB_VC)]=[name(%0)] has been
approved:%r%r[last(get(%0/COMMENT_1),|)]%r[repeat(-,75)]%r[ansi(h,Comments
added by [name(%2)]:)] %3
+&MLETTER_DNY [v(JOB_VC)]=[name(%0)] has been
denied:%r%r[last(get(%0/COMMENT_1),|)]%r[repeat(-,75)]%r[ansi(h,Comments
added by [name(%2)]:)] %3
+&MLETTER_MAI [v(JOB_VC)]=[name(%2)] is mailing you regarding
[name(%0)]:%r%r%3%r[repeat(-,75)]%rUnless this letter indicates otherwise%,
you should respond with the following
command:%r%r[space(5)][ansi(h,+myjob/add [last(name(%0))]=<your comments>)]
+&PLETTER_APR [v(JOB_VC)]=[space(10)][ansi(h,Job:)]
#[last(name(%0))]%r[space(8)][ansi(h,Title:)]
[get(%0/TITLE)]%r[space(4)][ansi(h,Opened By:)]
[u(%va/FN_PLAYERLIST,%0)]%r[space(4)][ansi(h,Opened On:)]
[convsecs(get(%0/OPENED_ON))]%r%b[ansi(h,Completed By:)]
[name(%2)]%r%b[ansi(h,Completed On:)] [time()]%r%r[last(get(%0/COMMENT_1),|
)]%r[repeat(-,78)]%r[ansi(h,Comments from [name(%2)]:)] %3%r%rThis job was
approved.
+&PLETTER_COM [v(JOB_VC)]=Job [last(name(%0))] has been completed by
[name(%2)]:%r%r[last(get(%0/COMMENT_1),|
)]%r[repeat(-,78)]%r[ansi(h,Comments from [name(%2)]:)] %3
+&PLETTER_DNY [v(JOB_VC)]=[space(10)][ansi(h,Job:)]
#[last(name(%0))]%r[space(8)][ansi(h,Title:)]
[get(%0/TITLE)]%r[space(4)][ansi(h,Opened By:)]
[u(%va/FN_PLAYERLIST,%0)]%r[space(4)][ansi(h,Opened On:)]
[convsecs(get(%0/OPENED_ON))]%r%b[ansi(h,Completed By:)]
[name(%2)]%r%b[ansi(h,Completed On:)] [time()]%r%r[last(get(%0/COMMENT_1),|
)]%r[repeat(-,78)]%r[ansi(h,Comments from [name(%2)]:)] %3%r%rThis job was
denied.
+&PROCESS_DESC [v(JOB_VC)]=[setq(3,DESC)][setq(1,%0)]1
+&PROCESS_HELP [v(JOB_VC)]=[setq(3,HELP)][setq(1,%0)]1
+&PROCESS_HIDDEN
[v(JOB_VC)]=[setq(3,HIDDEN)][setq(1,switch(lcstr(%0),yes,1,no,,0))][switch(%q1,,1,%q1)]
+&PROCESS_LOCKED
[v(JOB_VC)]=[setq(3,LOCKED)][setq(1,switch(lcstr(%0),yes,1,no,,0))][switch(%q1,,1,%q1)]
+&PROCESS_LOGFILE [v(JOB_VC)]=[setq(3,LOGFILE)][setq(1,%0)]1
+&PROCESS_MYJOBS
[v(JOB_VC)]=[setq(3,PUBLIC)][setq(1,switch(lcstr(%0),yes,1,no,,0))][switch(%q1,,1,%q1)]
+&PROCESS_POST_APPROVE
[v(JOB_VC)]=[setq(3,POST_APPROVE)][setq(1,u(%va/FN_FIND-BBDBREF,%0))][gt(%0,0)]
+&PROCESS_POST_COMPLETE
[v(JOB_VC)]=[setq(3,POST_COMPLETE)][setq(1,u(%va/FN_FIND-BBDBREF,%0))][gt(%0,0)]
+&PROCESS_POST_DENY
[v(JOB_VC)]=[setq(3,POST_DENY)][setq(1,u(%va/FN_FIND-BBDBREF,%0))][gt(%0,0)]
+&PROCESS_TURNAROUND [v(JOB_VC)]=[setq(3,TURNAROUND)][setq(1,%0)][isnum(%0)]
+@switch [hasattr(v(JOB_VC),STAT_ART)]=0,{&STAT_ART [v(JOB_VC)]=0 0}
+@set [v(JOB_VC)]/STAT_ART=NO_INHERIT
+@dolist VA VB VC={@cpattr %#/JOB_##=[v(JOB_VC)]/##}
+@switch [v(JOB_PATCH)]=0,{think [ansi(hc,ANOMALY JOBS:)] Setting up
buckets.},{think [ansi(hc,ANOMALY JOBS:)] Keeping your current bucket
setup.}
+@switch [v(JOB_PATCH)]=0,{think
[setq(0,create(ADMIN,10))][setq(1,create(Job 1,10))];@Desc %q0=For game
administrative
issues.;@lock/Speech %q0=ACCESS/1;&ACCESS %q0=lit([u(%va/FN_STAFFALL,%#)]);@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)];think
[ansi(hc,ANOMALY JOBS:)] Creating initial
job.;&OPENED_BY %q1=%#;&OPENED_ON %q1=[secs()];&MODIFIED_ON %q1=[secs()];&STATUS %q1=1;&TITLE %q1=Welcome;@parent %q1=%q0;@tel %q1=[v(JOB_VA)];&NUM_COMMENT %q1=3;&LIST_STATS %q1=ADD|
1;&PRIORITY %q1=1;&COMMENT_1 %q1=CRE|[secs()]|#0|Anomaly Jobs|Thank you for
choosing Anomaly Jobs. This is fully-featured task tracking code that helps
to keep games organized. Please see '+jobs/credits' for information on
version, license and other credits.;&COMMENT_2 %q1=ADD|[secs()]|#0|Anomaly
Jobs|Remember that /complete posts to the public BBS (unless changed for a
bucket - see the help file on buckets). /approve and /deny sends mail to
the job-creator, and posts to private BBS.;@set %q1=UNFINDABLE;&JOBS_NUM
[v(JOB_VA)]=1;&MAX_JOBS [v(JOB_VA)]=200;@switch
[first(version())]=TinyMUSH,{@set %q1=!COMMANDS},{@set %q1=NO_COMMAND}}
+@switch [v(JOB_PATCH)]=0,{think
[setq(0,create(APPS,10))];@Desc %q0=Character applications submitted for
review.;@lock/Speech %q0=ACCESS/1;&ALETTER_OTH %q0=lit(Application for
approval submitted by [name(%1)].);&MLETTER_OTH %q0=lit(You have submitted
an application for approval. Please give staff some time to process the
application. You will hear back soon.);&MLETTER_APR %q0=lit(You have been
approved by [name(%2)].);&PLETTER_APR %q0=lit([name(%2)] has approved
[name(get(%0/OPENED_BY))] for
roleplay.);&ACCESS %q0=lit([u(%va/FN_STAFFALL,%#)]);@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{think [setq(0,create(BUILD,10))];@Desc %q0=For
building issues and typo
reports.;@lock/Speech %q0=ACCESS/1;&PUBLIC %q0=1;&ACCESS %q0=lit([or(haspower(%#,builder),u(%va/FN_STAFFALL,%#))]);@set %q0=SAFE;@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{think [setq(0,create(CGEN,10))];@Desc %q0=For
character generation problems and
updates.;@lock/Speech %q0=ACCESS/1;&ACCESS %q0=lit([u(%va/FN_STAFFALL,%#)]);@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{think [setq(0,create(CODE,10))];@Desc %q0=For
bugs and code
enhancements.;@lock/Speech %q0=ACCESS/1;&PUBLIC %q0=1;&ACCESS %q0=lit([u(%va/FN_STAFFALL,%#)]);@set %q0=SAFE;@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{think
[setq(0,create(FEEP,10))];@Desc %q0=Storage for unimplemented game
ideas.;@lock/Speech %q0=ACCESS/1;&HIDDEN %q0=1;&ACCESS %q0=lit([u(%va/FN_STAFFALL,%#)]);@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{think
[setq(0,create(FORUM,10))];@Desc %q0=Tabled discussion jobs. Feedback
needed.;@lock/Speech %q0=ACCESS/1;&ACCESS %q0=lit([u(%va/FN_STAFFALL,%#)]);@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{think
[setq(0,create(PITCH,10))];@Desc %q0=Pitched plots and
stories.;@lock/Speech %q0=ACCESS/1;&ACCESS %q0=lit([u(%va/FN_STAFFALL,%#)]);&HIDDEN %q0=1;@set %q0=SAFE;@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{think [setq(0,create(PUB,10))];@Desc %q0=Public
jobs. Everyone has +myjobs
access.;@lock/Speech %q0=ACCESS/1;&ACCESS %q0=lit([u(%va/FN_STAFFALL,%#)]);&TRANSPARENT %q0=1;&PUBLIC %q0=1;&HOOK_CRE %q0=lit(@set %0/COMMENT_1=no_inherit);@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{think [setq(0,create(QUERY,10))];@Desc %q0=Query
bucket.;@lock/Speech %q0=ACCESS/1;&PRIORITY %q0=2;&PUBLIC %q0=1;&ACCESS %q0=lit([u(%va/FN_STAFFALL,%#)]);&TURNAROUND %q0=168;&HOOK_OTH %q0=lit(@set %0/COMMENT_1=no_inherit;&ASSIGNED_TO %0=%1);&MLETTER_OTH %q0=lit(You
have been issued an official query by the jobs system by [name(%2)]. You
have [div(v(TURNAROUND),24)] days at the time of this mail to respond to
the query%, otherwise staff may need to act on the issue without your
input. To see your query%, please type '+myjob
[last(name(%0))]'.);@set %q0=SAFE;@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{think [setq(0,create(REQ,10))];@Desc %q0=Player
requests.;@lock/Speech %q0=ACCESS/1;&PUBLIC %q0=1;&PRIORITY %q0=2;&ACCESS %q0=lit([u(%va/FN_STAFFALL,%#)]);&TURNAROUND %q0=72;&LOGFILE %q0=reqlog;&MLETTER_OTH %q0=lit(You
have requested '[name(%0)]: [get(%0/TITLE)]' from
staff: %r%r%3%r%r[repeat(-,75)]%rSee '[ansi(h,+help myjobs)]' for help on
how to display and add to your jobs.%r%rPlease give staff at least
[u(me/TURNAROUND)] hours from the date of this mail to process your
request.);@set %q0=SAFE;@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{think [setq(0,create(RP,10))];@Desc %q0=For
storing potential
plots.;@lock/Speech %q0=ACCESS/1;&ACCESS %q0=lit([u(%va/FN_STAFFALL,%#)]);&ACCESS_APPROVED %q0=lit([u(%va/FN_WIZONLY,%0)]);&ACCESS_ARC %q0=lit([u(%va/FN_STAFFALL,%0)]);&ACCESS_PLAYERS %q0=lit([u(%va/FN_STAFFALL,%0)]);&ACCESS_SCHEDULE %q0=lit([u(%va/FN_STAFFALL,%0)]);&ACCESS_STAFF %q0=lit([u(%va/FN_STAFFALL,%0)]);&ACCESS_SYNOPSIS %q0=lit([u(%va/FN_STAFFALL,%0)]);&ERROR_PLAYERS %q0=lit(I
don't recognize [ansi(h,%qp)] as a player.);&ERROR_STAFF %q0=lit(I don't
recognize [ansi(h,%qp)] as a
player.);&HIDDEN %q0=1;&MAP_NAME %q0=lit([name(*%0)]);&PROCESS_APPROVED %q0=lit([setq(3,APPROVED)][setq(1,%0)]1);&PROCESS_ARC %q0=lit([setq(3,PLOT_ARC)][setq(1,u(%va/FN_STRTRUNC,%0,50))]);&PROCESS_PLAYERS %q0=lit([setq(3,PLAYERS)][ifelse(not(gt(strlen(u(%va/fn_trim,squish(iter(%0,ifelse(not(isdbref(pmatch(itext(0)))),setr(p,itext(0)),))))),0)),[setq(9,iter(%0,pmatch(itext(0))))][setq(8,get(%1/PLAYERS))][iter(%q9,ifelse(gt(member(%q8,##),0),setq(8,remove(%q8,##)),setq(8,setunion(%q8,##))))][setq(1,%q8)]1,0)]);&PROCESS_SCHEDULE %q0=lit([setq(3,SCHEDULE)][setq(1,u(%va/FN_STRTRUNC,%0,50))]1);&PROCESS_STAFF %q0=lit([setq(3,WRITER)][ifelse(not(gt(strlen(u(%va/fn_trim,squish(iter(%0,ifelse(not(isdbref(pmatch(itext(0)))),setr(p,itext(0)),))))),0)),[setq(9,iter(%0,pmatch(itext(0))))][setq(8,get(%1/WRITER))][iter(%q9,ifelse(gt(member(%q8,##),0),setq(8,remove(%q8,##)),setq(8,setunion(%q8,##))))][setq(1,%q8)]1,0)]);&PROCESS_SYNOPSIS %q0=lit([setq(3,BRIEF)][setq(1,%0)]1);&SUMMARY %q0=lit([rjust(ansi(hc,Approved:),10)]%b[ifelse(u(%va/FN_HASATTRP,%0,APPROVED),get(%0/APPROVED),Unapproved)]%r[rjust(ansi(hc,Players:),10)]%b[ifelse(u(%va/FN_HASATTRP,%0,PLAYERS),u(%va/FN_ITEMIZE,map(me/MAP_NAME,get(%0/PLAYERS),%b,|
),|
),Nobody)]%r[rjust(ansi(hc,Schedule:),10)]%b[ifelse(u(%va/FN_HASATTRP,%0,SCHEDULE),get(%0/SCHEDULE),Unset)]%r[rjust(ansi(hc,Arc:),10)]%b[ifelse(u(%va/FN_HASATTRP,%0,PLOT_ARC),get(%0/PLOT_ARC),Unset)]%r[rjust(ansi(hc,Staff:),10)]%b[ifelse(u(%va/FN_HASATTRP,%0,WRITER),u(%va/FN_ITEMIZE,map(me/MAP_NAME,get(%0/WRITER),%b,|
),|
),Nobody)]%r[rjust(ansi(hc,Synopsis:),10)]%b[ifelse(u(%va/FN_HASATTRP,%0,BRIEF),get(%0/BRIEF),Unset)]);&HELP %q0=lit(%r[space(5)]This
bucket is for plots that have potential but aren't yet ready to run. Jobs
in this bucket should remain here until the plot is approved to be
run.%r%r[u(%va/FN_BREAK,ansi(hc,Settings for
+job/sumset))]%r[ljust(ansi(h,PLAYERS),10)] Accepts <player> as a valid
parameter.%r[ljust(ansi(h,SCHEDULE),10)] Describe when the plot is in
effect.%r[ljust(ansi(h,ARC),10)] Describes the story arc associated to this
plot.%r[ljust(ansi(h,STAFF),10)] Accepts <player> as a valid
parameter.%r[ljust(ansi(h,SYNOPSIS),10)] A brief synopsis of the
plot.%r[ljust(ansi(h,APPROVED),10)] Wiz-only, for approving plots.
Accepts 'yes' or 'no'.);@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{think
[setq(0,create(TECH,10))];@Desc %q0=Technology issues - weapon objects,
etc.;@lock/Speech %q0=ACCESS/1;&ACCESS %q0=lit([u(%va/FN_STAFFALL,%#)]);@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{think
[setq(0,create(THEME,10))];@Desc %q0=Thematic issues and
discussion.;@lock/Speech %q0=ACCESS/1;&ACCESS %q0=lit([u(%va/FN_STAFFALL,%#)]);@parent %q0=[v(JOB_VC)];@tel %q0=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{think [setq(0,create(TPS,10))];@Desc
TPS=Actively running tiny plots.;@lock/Speech TPS=ACCESS/1;&SUMMARY
TPS=lit([rjust(ansi(hc,Approved:),10)]%b[ifelse(u(%va/FN_HASATTRP,%0,APPROVED),get(%0/APPROVED),Unapproved)]%r[rjust(ansi(hc,Players:),10)]%b[ifelse(u(%va/FN_HASATTRP,%0,PLAYERS),u(%va/FN_ITEMIZE,map(me/MAP_NAME,get(%0/PLAYERS),%b,|
),|
),Nobody)]%r[rjust(ansi(hc,Schedule:),10)]%b[ifelse(u(%va/FN_HASATTRP,%0,SCHEDULE),get(%0/SCHEDULE),Unset)]%r[rjust(ansi(hc,Arc:),10)]%b[ifelse(u(%va/FN_HASATTRP,%0,PLOT_ARC),get(%0/PLOT_ARC),Unset)]%r[rjust(ansi(hc,Staff:),10)]%b[ifelse(u(%va/FN_HASATTRP,%0,WRITER),u(%va/FN_ITEMIZE,map(me/MAP_NAME,get(%0/WRITER),%b,|
),|
),Nobody)]%r[rjust(ansi(hc,Synopsis:),10)]%b[ifelse(u(%va/FN_HASATTRP,%0,BRIEF),get(%0/BRIEF),Unset)]);&MAP_NAME
TPS=lit([name(*%0)]);&ACCESS
TPS=lit([u(%va/FN_STAFFALL,%#)]);&ACCESS_PLAYERS
TPS=lit([u(%va/FN_STAFFALL,%0)]);&PROCESS_PLAYERS
TPS=lit([setq(3,PLAYERS)][ifelse(not(gt(strlen(u(%va/fn_trim,squish(iter(%0,ifelse(not(isdbref(pmatch(itext(0)))),setr(p,itext(0)),))))),0)),[setq(9,iter(%0,pmatch(itext(0))))][setq(8,get(%1/PLAYERS))][iter(%q9,ifelse(gt(member(%q8,##),0),setq(8,remove(%q8,##)),setq(8,setunion(%q8,##))))][setq(1,%q8)]1,0)]);&ERROR_PLAYERS
TPS=lit(I don't recognize [ansi(h,%qp)] as a player.);&ACCESS_SCHEDULE
TPS=lit([u(%va/FN_STAFFALL,%0)]);&PROCESS_SCHEDULE
TPS=lit([setq(3,SCHEDULE)][setq(1,u(%va/FN_STRTRUNC,%0,50))]1);&ERROR_SCHEDULE
TPS=lit(You must enter a valid date string.);&ACCESS_ARC
TPS=lit([u(%va/FN_STAFFALL,%0)]);&PROCESS_ARC
TPS=lit([setq(3,PLOT_ARC)][setq(1,u(%va/FN_STRTRUNC,%0,50))]);&ACCESS_STAFF
TPS=lit([u(%va/FN_STAFFALL,%0)]);&PROCESS_STAFF
TPS=lit([setq(3,WRITER)][ifelse(not(gt(strlen(u(%va/fn_trim,squish(iter(%0,ifelse(not(isdbref(pmatch(itext(0)))),setr(p,itext(0)),))))),0)),[setq(9,iter(%0,pmatch(itext(0))))][setq(8,get(%1/WRITER))][iter(%q9,ifelse(gt(member(%q8,##),0),setq(8,remove(%q8,##)),setq(8,setunion(%q8,##))))][setq(1,%q8)]1,0)]);&ERROR_STAFF
TPS=lit(I don't recognize [ansi(h,%qp)] as a player.);&ACCESS_SYNOPSIS
TPS=lit([u(%va/FN_STAFFALL,%0)]);&PROCESS_SYNOPSIS
TPS=lit([setq(3,BRIEF)][setq(1,%0)]1);&ACCESS_APPROVED
TPS=lit([u(%va/FN_WIZONLY,%0)]);&PROCESS_APPROVED
TPS=lit([setq(3,APPROVED)][setq(1,%0)]1);&HELP TPS=lit(%r[space(5)]This
bucket is for currently active plots that are running on the grid. Care
should be taken to keep the headers of these jobs up-to-date, especially in
terms of Progress settings and due dates. When the plot is completed, the
job should be set complete and left open until follow-up requests are
completed.%r%r[u(%va/FN_BREAK,ansi(hc,Settings for
+job/sumset))]%r[ljust(ansi(h,PLAYERS),10)] Accepts <player> as a valid
parameter.%r[ljust(ansi(h,SCHEDULE),10)] Describe when the plot is in
effect.%r[ljust(ansi(h,ARC),10)] Describes the story arc associated to this
plot.%r[ljust(ansi(h,STAFF),10)] Accepts <player> as a valid
parameter.%r[ljust(ansi(h,SYNOPSIS),10)] A brief synopsis of the
plot.%r[ljust(ansi(h,APPROVED),10)] Wiz-only, for approving plots.
Accepts 'yes' or 'no'.);@parent TPS=[v(JOB_VC)];@tel TPS=[v(JOB_VC)]}
+@switch [v(JOB_PATCH)]=0,{&HAS_ACCESS
[v(JOB_VA)]=lit([or(haspower(%0,builder),u(%va/FN_STAFFALL,%0))]);&ADD_ACCESS
[v(JOB_VA)]=lit([u(%va/FN_STAFFALL,%0)]);&APPROVE_ACCESS
[v(JOB_VA)]=lit([u(%va/FN_STAFFALL,%0)]);&COMPLETE_ACCESS
[v(JOB_VA)]=lit([u(%va/FN_STAFFALL,%0)]);&CREATE_ACCESS
[v(JOB_VA)]=lit([u(%va/FN_STAFFALL,%0)]);&DENY_ACCESS
[v(JOB_VA)]=lit([u(%va/FN_STAFFALL,%0)]);&EDIT_ACCESS
[v(JOB_VA)]=lit([u(%va/FN_STAFFALL,%0)]);&GIVE_ACCESS
[v(JOB_VA)]=lit([u(%va/FN_WIZONLY,%0)]);&LOG_ACCESS
[v(JOB_VA)]=lit([u(%va/FN_WIZONLY,%0)]);&MAIL_ACCESS
[v(JOB_VA)]=lit([u(%va/FN_STAFFALL,%0)]);&STATS_ACCESS
[v(JOB_VA)]=lit([u(%va/FN_STAFFALL,%0)]);&CONFIG_ACCESS
[v(JOB_VA)]=lit([u(%va/FN_STAFFALL,%0)]);}
+@switch first(version())=RhostMUSH,{&FN_WIZONLY
[v(JOB_VA)]=lit([gte(bittype(%0),5)])},{&FN_WIZONLY
[v(JOB_VA)]=lit([hasflag(%0,WIZARD)])}
+@switch first(version())=RhostMUSH,{&FN_STAFFALL
[v(JOB_VA)]=lit([gte(bittype(%0),2)])},PennMUSH,{&FN_STAFFALL
[v(JOB_VA)]=lit([orflags(%0,Wr)])},{&FN_STAFFALL
[v(JOB_VA)]=lit([orflags(%0,WZ)])}
+@switch first(version())=RhostMUSH,{&FN_GUEST
[v(JOB_VA)]=lit([eq(bittype(%0),0)])},{&FN_GUEST
[v(JOB_VA)]=lit([haspower(%0,Guest)])}
+@switch [v(JOB_PATCH)]=0,{&JOB_LOGGING [v(JOB_VA)]=1;&LOGFILE
[v(JOB_VC)]=joblog}
+@switch [first(version())]=TinyMUSH,{&BUFFER
[v(JOB_VA)]=4000},RhostMUSH,{&BUFFER [v(JOB_VA)]=3999},{&BUFFER
[v(JOB_VA)]=8000}
+think [ansi(hc,ANOMALY JOBS:)] Setting flags.
+@switch [first(version())]=PennMUSH,{@set [v(JOB_GO)]=WIZARD},{@set
[v(JOB_GO)]=INHERIT}
+@switch [first(version())]=TinyMUSH,{@set [v(JOB_GO)]=COMMANDS},{@set
[v(JOB_GO)]=!NO_COMMAND}
+@switch [first(version())]=PennMUSH,{@set [v(JOB_GO)]=!HALT},{@set
[v(JOB_GO)]=!HALTED}
+@set [v(JOB_GO)]=UNFINDABLE
+@set [v(JOB_GO)]=SAFE
+@switch [first(version())]=RhostMUSH,{@set [v(JOB_GO)]=SIDEFX}
+@switch [first(version())]=PennMUSH,{@set [v(JOB_VA)]=WIZARD},{@set
[v(JOB_VA)]=INHERIT}
+@set [v(JOB_VA)]=UNFINDABLE
+@switch [first(version())]=TinyMUSH,{@set [v(JOB_VA)]=!COMMANDS},{@set
[v(JOB_VA)]=NO_COMMAND}
+@switch [first(version())]=PennMUSH,{@set [v(JOB_VA)]=!HALT},{@set
[v(JOB_VA)]=!HALTED}
+@set [v(JOB_VA)]=SAFE
+@switch [first(version())]=RhostMUSH,{@set [v(JOB_VA)]=SIDEFX}
+@set [v(JOB_VB)]=UNFINDABLE
+@switch [first(version())]=TinyMUSH,{@set [v(JOB_VB)]=!COMMANDS},{@set
[v(JOB_VB)]=NO_COMMAND}
+@switch [first(version())]=PennMUSH,{@set [v(JOB_VB)]=!HALT},{@set
[v(JOB_VB)]=!HALTED}
+@set [v(JOB_VB)]=SAFE
+@switch [first(version())]=PennMUSH,{@set [v(JOB_VC)]=WIZARD},{@set
[v(JOB_VC)]=INHERIT}
+@set [v(JOB_VC)]=SAFE
+@set [v(JOB_VC)]=UNFINDABLE
+@switch [first(version())]=TinyMUSH,{@set [v(JOB_VC)]=COMMANDS},{@set
[v(JOB_VC)]=!NO_COMMAND}
+@switch [first(version())]=PennMUSH,{@set [v(JOB_VC)]=!HALT},{@set
[v(JOB_VC)]=!HALTED}
+@switch [first(version())]=RhostMUSH,{@set [v(JOB_VC)]=SIDEFX}
+@dolist lcon([v(JOB_VC)])={@switch [first(version())]=PennMUSH,{@set
##=!HALT},{@set ##=!HALTED};@switch [first(version())]=TinyMUSH,{@set
##=!COMMANDS},{@set ##=NO_COMMAND};@set ##=UNFINDABLE;@switch
[first(version())]=PennMUSH,{@set ##=WIZARD},{@set ##=INHERIT};}
+@switch [v(JOB_PATCH)]=0,{&INSTALL_DATE [v(JOB_VA)]=[time()]}
+think [ansi(hc,ANOMALY JOBS:)] Setting locks.
+@lock [v(JOB_GO)]=me
+@lock [v(JOB_VA)]=me
+@lock [v(JOB_VB)]=me
+@lock [v(JOB_VC)]=me
+@switch
[setq(0,switch(first(version()),PennMUSH,lsearch(all,eobjects,\[strmatch(name(##),bbpocket)\]),RhostMUSH,searchng(object=bbpocket),search(object=bbpocket)))][isdbref(%q0)][v(JOB_PATCH)]=0*,{think
[ansi(hc,ANOMALY JOBS:)] Couldn't find Myrddin's BBS. Installation is not
complete.},10,{think [ansi(hc,ANOMALY JOBS:)] Setting up the BBS.;&BBPOCKET
[v(JOB_VC)]=%q0;+bbnewgroup Job Tracker;@wait 2={+bbnewgroup Staff Job
Tracker};@wait 5={&POST_COMPLETE
[setq(1,extract(u(%q0/GROUPS),dec(words(u(%q0/GROUPS))),1))][setq(2,last(u(%q0/GROUPS)))][setq(3,v(JOB_VB))][setq(4,switch(first(version()),RhostMUSH,lit(gte(bittype(%0),2)),PennMUSH,lit(orflags(%0,Wr)),lit(orflags(%0,WZ))))][v(JOB_VC)]=%q1;&POST_APPROVE
[v(JOB_VC)]=%q2;&POST_DENY [v(JOB_VC)]=%q2;&POST_DELETE
[v(JOB_VC)]=%q2;&CANREAD %q1=1;&CANWRITE %q1=%[or%(strmatch%(%%0,%q3%),%q4%)%];&CANREAD %q2=%q4;&CANWRITE %q2=%[or%(strmatch%(%%0,%q3%),%q4%)%];}},{think
[ansi(hc,ANOMALY JOBS:)] Updating BBS settings.;&BBPOCKET
[v(JOB_VC)]=%q0;@dolist [v(JOB_VC)] [lcon(v(JOB_VC))]={@switch
[and(hasattr(##,POST_COMPLETE),isnum(get(##/POST_COMPLETE)))][and(hasattr(##,POST_APPROVE),isnum(get(##/POST_APPROVE)))][and(hasattr(##,POST_DENY),isnum(get(##/POST_DENY)))][and(hasattr(##,POST_DELETE),isnum(get(##/POST_DELETE)))]=1???,{&POST_COMPLETE
##=[extract(u(%q0/GROUPS),get(##/POST_COMPLETE),1)]},?1??,{&POST_APPROVE
##=[extract(u(%q0/GROUPS),get(##/POST_APPROVE),1)]},??1?,{&POST_DENY
##=[extract(u(%q0/GROUPS),get(##/POST_DENY),1)]},???1,{&POST_DELETE
##=[extract(u(%q0/GROUPS),get(##/POST_DELETE),1)]}}}
+&JOBSH me=
+&JOBSB me=
+@switch [v(JOB_PATCH)]=>0,{think [ansi(hc,ANOMALY JOBS:)] Checking hooks
for compatibility.;@dolist [v(JOB_VC)] [lcon(v(JOB_VC))]={@switch
[hasattr(##,HOOK_COMPLETE)][hasattr(##,HOOK_APPROVE)][hasattr(##,HOOK_DENY)][hasattr(##,HOOK_DELETE)]=1???,{think
[ansi(hc,ANOMALY JOBS:)] ##/HOOK_COMPLETE not valid: move to
##/HOOK_COM;},?1??,{think [ansi(hc,ANOMALY JOBS:)] ##/HOOK_APPROVE not
valid: move to ##/HOOK_APR;},??1?,{think [ansi(hc,ANOMALY JOBS:)]
##/HOOK_DENY not valid: move to ##/HOOK_DNY;},???1,{think [ansi(hc,ANOMALY
JOBS:)] ##/HOOK_DELETE not valid: move to ##/HOOK_DEL;}}}
+@switch [v(JOB_PATCH)]=>0,{think [ansi(hc,ANOMALY JOBS:)] Updating special
job access to unique player ID.;@dolist
switch(first(version()),PennMUSH,lsearch(all,eplayers,\[hasattrval(##,JOBSB)\]),RhostMUSH,searchng(eplayer=hasattr(##,JOBSB)),search(eplayer=hasattr(##,JOBSB)))={think
[name(##)] has access to buckets:
[u([v(JOB_VA)]/FN_ITEMIZE,iter(get(##/JOBSB),name(first(itext(0),:)),|),|
)];&JOBSB ##=iter(get(##/JOBSB),u([v(JOB_VA)]/FN_OBJID,first(itext(0),:)))}}
+@switch [v(JOB_PATCH)]=>0,{think [ansi(hc,ANOMALY JOBS:)] Updating new job
indicators.;@dolist lcon(v(JOB_VA))={&LIST_JOBSN
##=[default(##/LIST_JOBSN,get(##/LIST_READERS))];}}
+@wait 10={think [ansi(hc,ANOMALY JOBS:)] Script complete. Thanks for using
Anomaly Jobs! You should drop the Job Global Object <JGO> in the master
room. If you have opened up the system to more than just ROYALTY and
WIZARD, you must have #1 lock and hide the attribute LAST_CONN. You should
hide & lock JOBSH and JOBSB no matter what. For
example:%r%r@attribute/access JOBSB=WIZARD%r@attribute/access
JOBSH=HIDDEN[switch(first(version()),PennMUSH,%r%(On PennMUSH\, you must
use /retroactive and also add these to a wizard's @startup.%))];@set
me=!quiet}
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/license/gpl-2.0.txt Thu Nov 24 20:39:41 2011
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange;
or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free
Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show
w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/plugins/colorsub.txt Thu Nov 24 20:39:41 2011
@@ -0,0 +1,440 @@
+#
+# Color Substitutions Patch For Jobs 6.0/6.1
+# NOTE: This code may be superceded by planned changes to skin structure.
+#
+# Author: Minion@Crossroads
+#
+# Permits substituting colors in the DEFAULT skin
+#
+# To use, set attributes on yourself:
+# &JOBCOLORS me=<from color> <to color>|<from color3> <to color3>|<from
color3> <to color3>
+#
+# Example:
+# &JOBCOLORS me=hr m|hc c
+# substitutes magenta for highlight red and cyan for highlight cyan
+
+@switch
+ [ifelse(
+ isdbref(setr(0,
+ switch(
+ first(version()),
+ PennMUSH,lsearch(all,eobjects,\[strmatch(name(##),Job Global Object
<JGO>)\]),
+ RhostMUSH,searchng(object=Job Global Object <JGO>),
+ search(object=Job Global Object <JGO>)
+ )
+ )),
+ setq(1,get(%q0/VA)),
+ [setq(1,
+ switch(
+ first(version()),
+ PennMUSH,lsearch(all,eobjects,\[strmatch(name(##),Job Database
<JD>)\]),
+ RhostMUSH,searchng(object=Job Database <JD>),
+ search(object=Job Database <JD>)
+ )
+ )]
+ [setq(0,loc(%q1))]
+ )]
+ [isdbref(%q0)]
+ [and(
+ isdbref(%q1),
+ gte(edit(first(default(%q1/version,0),.),v,),6)
+ )]
+ =
+ 0*,{
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,No jobs installation found.)];
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,Aborting. Cancel this script in
your client.)];
+ &JOB_VA %#=#-1;
+ },
+ 10*,{
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,Not a valid Jobs 6 or later
installation.)];
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,Aborting. Cancel this script in
your client.)];
+ &JOB_VA %#=#-1;
+ },{
+ think [ansi(hc,ANOMALY JOBS:)] Jobs 6 installation found. Installing
patch.;
+ &JOB_VA %#=%q1;
+ }
+-
+
+&FN_COLORSUB [v(JOB_VA)]=
+ rest(grab([get(%#/JOBCOLORS)]|%0 %0,%0 *,|))
+-
+
+&DEFAULT_BANNER [v(JOB_VA)]=
+ [setq(0,%0)]
+ [setq(x,
+ u(%va/FN_ITEMIZE,
+ map(MAP_NAME,get(%q0/OPENED_BY),%b,|),
+ |)
+ )]
+ [setq(y,
+ u(%va/FN_ITEMIZE,
+ map(MAP_NAME,get(%q0/TAGGED_FOR),%b,|),
+ |
+ )
+ )]
+ [ljust(
+ [rjust(
+ ansi(u(%va/FN_COLORSUB,hc),Bucket:),
+ 10
+ )]%b
+ [u(%va/FN_BUCKETNAME,%q0)],
+ div(u(FN_FLEXWIDTH,80),2)
+ )]
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Due On:),12)]%b
+ [ifelse(
+ get(%q0/DUE_ON),
+ ifelse(
+ gt(secs(),get(%q0/DUE_ON)),
+ OVERDUE!,
+ convsecs(get(%q0/DUE_ON))
+ ),
+ -
+ )]%r
+ [ljust(
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Title:),10)]%b
+ [get(%q0/TITLE)]
+ ,div(u(FN_FLEXWIDTH,80),2)
+ )]
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Status:),12)]%b
+ [switch(
+ get(%q0/PRIORITY),
+ 1,Green,
+ 2,Yellow,
+ 3,Red
+ )]%b%(
+ [switch(
+ get(%q0/STATUS),
+ 0,On Hold,
+ 1,New,
+ 2,Underway,
+ 3,25%%,
+ 4,50%%,
+ 5,75%%,
+ 6,100%%,
+ ?
+ )]%)%r
+ [ljust(
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Opened On:),10)]
[convsecs(get(%q0/OPENED_ON))],
+ div(u(FN_FLEXWIDTH,80),2)
+ )]
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Assigned To:),12)]%b
+ [ifelse(
+ isdbref(get(%q0/ASSIGNED_TO)),
+ name(get(%q0/ASSIGNED_TO)),
+ Nobody
+ )]%r
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Opened By:),10)]%b%qx
+
[ifelse(words(%qy),%r[rjust(ansi(u(%va/FN_COLORSUB,hc),Tagged:),10)]%b%qy,)]
+-
+
+&DEFAULT_BUCKETHEADER [v(JOB_VA)]=
+ [u(FN_HEADER,Bucket List)]%r
+ [ifelse(
+ u(%va/FN_WIZONLY,%#),
+ [ansi(u(%va/FN_COLORSUB,hc),
+ [ljust(Name,9)]
+ [ljust(Flags,6)]%b%b
+ [ljust(Description,u(FN_FLEXWIDTH,30))]
+ [rjust(#Jobs,5)]
+ [rjust(Pct,5)]
+ [space(3)]C%b%bA%b%bD%b%bDue
+ [space(3)]
+ ARTS
+ )],
+ [ansi(u(%va/FN_COLORSUB,hc),
+ [ljust(NAME,8)]
+ [ljust(Description,u(FN_FLEXWIDTH,50))]%b
+ [rjust(Viewing,20)]
+ )]
+ )]%r
+ [u(FN_BREAK)]
+-
+
+&DEFAULT_BUCKETLIST [v(JOB_VA)]=
+ [ifelse(
+ u(%va/FN_WIZONLY,%#),
+ [ljust(name(%0),6)]%b%b
+ [ifelse(u(%va/FN_MONITORCHECK,%0,%#),V,-)]
+ [ifelse(u(%va/IS_HIDDEN,%0),H,-)]
+
[ifelse(u(%va/IS_LOCKED,%0),ifelse(u(%va/FN_HASATTRP,%0,CHECKOUT),C,L),-)]
+ [ifelse(u(%va/IS_TAGGED,%0),T,-)]
+ [ifelse(u(%va/IS_PUBLIC,%0),M,-)]
+ [ifelse(u(%va/IS_PUBLISHED,%0),P,-)]
+ [ifelse(u(%va/IS_SUMMARY,%0),S,-)]%b%b
+ [u(%va/FN_STREXACT,get(%0/DESC),u(FN_FLEXWIDTH,30))]
+ [rjust(words(remove(children(%0),#-1)),5)]
+ [rjust(
+ mul(
+ round(
+ fdiv(
+ words(remove(children(%0),#-1)),
+ max(1,words(lcon(%va)))
+ ),
+ 2
+ ),
+ 100
+ )%%,
+ 5
+ )]%b%b
+ [rjust(u(%va/FN_FIND-BBNUM,get(%0/POST_COMPLETE)),2)]%b
+ [rjust(u(%va/FN_FIND-BBNUM,get(%0/POST_APPROVE)),2)]%b
+ [rjust(u(%va/FN_FIND-BBNUM,get(%0/POST_DENY)),2)]
+ [rjust(default(%0/TURNAROUND,0),5)]
+ [rjust(
+ [ifelse(
+ u(%va/FN_HASATTR,%0,STAT_ART),
+ [round(
+ fdiv(
+ fdiv(
+ first(get(%0/STAT_ART)),
+ rest(get(%0/STAT_ART))
+ ),
+ 86400
+ ),
+ 0
+ )]d,
+ -
+ )],
+ 7
+ )],
+ [ljust(name(%0),6)]%b%b
+ [u(%va/FN_STREXACT,get(%0/DESC),u(FN_FLEXWIDTH,50))]%b
+ [rjust(
+ ifelse(
+ u(%va/FN_MONITORCHECK,%0,%#),
+ Yes,
+ -
+ ),
+ 20
+ )]
+ )]
+-
+
+&DEFAULT_FLAGS [v(JOB_VA)]=
+ [ifelse(
+ u(me/IS_LOCKED,%0),
+ u(me/FN_FLAG,ifelse(u(%va/FN_HASATTRP,%0,CHECKOUT),CHECKED
OUT,LOCKED),u(%va/FN_COLORSUB,hr)),
+ )]
+ [ifelse(
+ u(me/IS_PUBLIC,%0),
+ u(me/FN_FLAG,Myjobs),
+ )]
+ [ifelse(
+ u(me/IS_PUBLISHED,%0),
+ u(me/FN_FLAG,Published),
+ )]
+-
+
+&DEFAULT_HEADER [v(JOB_VA)]=
+ [switch(
+ %0,
+ ,[repeat(=,u(FN_FLEXWIDTH,79))],
+ [center(| [ansi(u(%va/FN_COLORSUB,hy),%0)] |,u(FN_FLEXWIDTH,79),=)]
+ )]
+-
+
+&DEFAULT_JOBLIST [v(JOB_VA)]=
+ [setq(j,
+ secure(
+ ifelse(
+ u(%va/FN_HASATTRP,%1,JOBS),
+ lcstr(mid(get(%1/JOBS),0,20)),
+ get(%va/JOBS_DEFAULT)
+ )
+ )
+ )]
+ [setq(1,
+ ifelse(
+ get(%0/DUE_ON),
+ ifelse(
+ gt(secs(),get(%0/DUE_ON)),
+ r,switch(
+ get(%0/PRIORITY),
+ 1,g,
+ 2,y,
+ 3,r,
+ g
+ )
+ ),
+ switch(
+ get(%0/PRIORITY),
+ 1,g,
+ 2,y,
+ 3,r
+ )
+ )
+ )]
+ [ifelse(
+ u(%va/FN_ISNEW,%0,%1),
+ [ansi(u(%va/FN_COLORSUB,hr),*)]%b,
+ %b%b
+ )]
+ [ansi(u(%va/FN_COLORSUB,h%q1),
+ [rjust(
+ [last(name(%0))],
+ 5
+ )]%b
+ [iter(
+ lnum(strlen(%qj)),
+ [u(%va/DISPLAY_[mid(%qj,##,1)],%0,%1)]
+ )]
+ )]
+-
+
+&DEFAULT_JOBSHEADER [v(JOB_VA)]=
+ [u(FN_HEADER,Anomaly Jobs [u(VERSION)])]%r
+ [setq(j,
+ [secure(
+ switch(
+ u(%va/FN_HASATTRP,%0,JOBS),
+ 1,lcstr(mid(get(%0/JOBS),0,20)),
+ u(JOBS_DEFAULT)
+ )
+ )]
+ )]
+ [ansi(u(%va/FN_COLORSUB,hc),*%b%b
+ [ljust(Job#,5)]
+ [iter(
+ lnum(strlen(%qj)),
+ u(HEADER_[mid(%qj,##,1)])
+ )]
+ )]%r
+ [u(FN_BREAK)]
+-
+
+&DEFAULT_MYJOBLIST [v(JOB_VA)]=
+ [ifelse(u(FN_ISNEW,%0,%1),[ansi(u(%va/FN_COLORSUB,hr),*)],%b)]
+ %b
+ [setq(j,TDAS)]
+ [ansi(u(%va/FN_COLORSUB,n),[rjust([last(name(%0))],5)]
+ %b
+ [iter(lnum(strlen(%qj)),u(DISPLAY_[mid(%qj,##,1)],%0,%1))]
+ )]
+-
+
+&DEFAULT_MYJOBSHEADER [v(JOB_VA)]=
+ [u(FN_HEADER,
+ Anomaly Jobs [u(VERSION)]
+ )]
+ %r
+ [setq(j,TDAS)]
+ [ansi(u(%va/FN_COLORSUB,hc),ljust(
+ *
+ %b
+ %b
+ [ljust(Job#,5)]
+ [iter(lnum(strlen(%qj)),u(HEADER_[mid(%qj,##,1)]))],
+ [u(FN_FLEXWIDTH,79)])
+ )]
+ %r
+ [u(FN_BREAK)]
+-
+
+&DEFAULT_MYBANNER [v(JOB_VA)]=
+ [setq(0,%0)]
+ [setq(x,u(%va/FN_ITEMIZE,map(MAP_NAME,get(%q0/OPENED_BY),%b,|),|))]
+ [ljust(
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Bucket:),10)]%b
+ [u(%va/FN_BUCKETNAME,%q0)],div(u(FN_FLEXWIDTH,80),2))]
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Due On:),12)]%b
+ [ifelse(get(%q0/DUE_ON),
+ ifelse(gt(secs(),get(%q0/DUE_ON)),
+ OVERDUE!,
+ convsecs(get(%q0/DUE_ON))),
+ -
+ )]
+ %r
+ [ljust(
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Title:),10)]%b
+ [get(%q0/TITLE)],
+ div(u(FN_FLEXWIDTH,80),2)
+ )]
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Assigned To:),12)]%b
+ [ifelse(isdbref(get(%q0/ASSIGNED_TO)),name(get(%q0/ASSIGNED_TO)),Nobody)]
+ %r
+ [ljust(
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Opened On:),10)]%b
+ [convsecs(get(%q0/OPENED_ON))],
+ div(u(FN_FLEXWIDTH,80),2)
+ )]
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Status:),12)]%b
+ [switch(get(%q0/PRIORITY),1,Green,2,Yellow,3,Red)]%b
+ %r
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Opened By:),10)]%b
+ %qx
+-
+
+&DEFAULT_READ [v(JOB_VA)]=
+ [repeat(-,u(FN_FLEXWIDTH,79))]%r
+ [ifelse(
+ u(%va/EDIT_ACCESS,%#),
+ [ansi(u(%va/FN_COLORSUB,h),%[)]
+ [ifelse(
+ and(
+ or(
+ u(%va/IS_PUBLISHED,%1),
+ switch(
+ extract(get(%1/%0),3,1,|),
+ u(%1/OPENED_BY),1,
+ 0),
+ hasflag(%1/%0,no_inherit)
+ ),
+ u(%va/IS_PUBLIC,%1)
+ ),
+ ansi(u(%va/FN_COLORSUB,hc),[rest(%0,_)]+),
+ ansi(u(%va/FN_COLORSUB,hc),[rest(%0,_)]-)
+ )]
+ [ansi(u(%va/FN_COLORSUB,h),%])]%b,
+ )]
+ [ansi(u(%va/FN_COLORSUB,h),[extract(get(%1/%0),4,1,|)]%b
+ added on%b
+ [convsecs(
+ extract(
+ get(%1/%0),2,1,|)
+ )]:%b
+ )]
+ [edit(last(get(%1/%0),|),@@PIPE@@,|)]
+-
+
+&DEFAULT_STAFFSUM [v(JOB_VA)]=
+ %r
+ [repeat(-,u(FN_FLEXWIDTH,79))]%r
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),DB#:),10)] %0[space(10)]
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Comments:),10)]
[setr(z,words(lattr(%0/COMMENT_*)))]%r%r
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Players:),10)] %(Players contributing
to this job%)%r
+ [setq(y,
+ setunion(
+ iter(
+ lattr(%0/COMMENT_*),
+ extract(get(%0/##),4,1,|),%b,|
+ ),,|
+ )
+ )]
+ [u(%va/fn_columns,%qy,20,|,11)]
+ [ifelse(
+ u(%va/FN_HASATTR,%0,LIST_READERS),
+ %r[rjust(ansi(u(%va/FN_COLORSUB,hc),Readers:),10)]%b
+ %(Players who have read this job in the past%)%r
+ [setq(z,
+ iter(
+ get(%0/LIST_READERS),
+ first(##,|)
+ )
+ )]
+ [u(%va/fn_columns,map(%va/MAP_NAME,%qz,%b,|),20,|,11)],
+ )]
+ %r
+ [rjust(ansi(u(%va/FN_COLORSUB,hc),Stats:),10)]%r
+ [u(%va/fn_columns,
+ iter(
+ ifelse(
+ u(%va/FN_HASATTR,%0,LIST_STATS),
+ sort(get(%0/LIST_STATS)),
+ ),
+ [first(##,|)]%b[last(##,|)],%b,|
+ ),20,|,11
+ )]%r
+-
+
+&DEFAULT_SUMMARY
[v(JOB_VA)]=%r[repeat(-,u(FN_FLEXWIDTH,79))]%r[u(parent(%0)/SUMMARY,%0)]
+-
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/plugins/lcars.skin.txt Thu Nov 24 20:39:41 2011
@@ -0,0 +1,467 @@
+#
+# Anomaly Jobs LCARS skin v1.1 by Starfleet
+#
+# Contributor: Minion@Crossroads
+#
+# ----------------------------------------------------------------
+# A Star Trek-themed skin plug-in for Anomaly Jobs 6.x
+#
+# If you do not like the default colors, you can easily modify
+# it by changing: LCARS_COLOR<1-5>
+#
+# ----------------------------------------------------------------
+
+@switch
+ [ifelse(
+ isdbref(setr(0,
+ switch(
+ first(version()),
+ PennMUSH,lsearch(all,eobjects,\[strmatch(name(##),Job Global Object
<JGO>)\]),
+ RhostMUSH,searchng(object=Job Global Object <JGO>),
+ search(object=Job Global Object <JGO>)
+ )
+ )),
+ setq(1,get(%q0/VA)),
+ [setq(1,
+ switch(
+ first(version()),
+ PennMUSH,lsearch(all,eobjects,\[strmatch(name(##),Job Database
<JD>)\]),
+ RhostMUSH,searchng(object=Job Database <JD>),
+ search(object=Job Database <JD>)
+ )
+ )]
+ [setq(0,loc(%q1))]
+ )]
+ [isdbref(%q0)]
+ [and(
+ isdbref(%q1),
+ gte(edit(first(default(%q1/version,0),.),v,),6)
+ )]
+ =
+ 0*,{
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,No jobs installation found.)];
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,Aborting. Cancel this script in
your client.)];
+ &JOB_VA %#=#-1;
+ },
+ 10*,{
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,Not a valid Jobs 6 or later
installation.)];
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,Aborting. Cancel this script in
your client.)];
+ &JOB_VA %#=#-1;
+ },{
+ think [ansi(hc,ANOMALY JOBS:)] Jobs 6 installation found. Installing
skin.;
+ &JOB_VA %#=%q1;
+ }
+-
+
+&LCARS_BREAK [v(JOB_VA)]=
+ [switch(%0,,
+ [ansi(get(%va/LCARS_COLOR1),%b[repeat(_,u(%va/FN_FLEXWIDTH,77))])]
+ %r
+ [ansi(get(%va/LCARS_COLOR1),|[repeat(_,u(%va/FN_FLEXWIDTH,77))]|)],
+ [ansi(get(%va/LCARS_COLOR1),%b[repeat(_,u(%va/FN_FLEXWIDTH,77))])]
+ %r
+ [ansi(get(%va/LCARS_COLOR1),|)]
+
[ansi(get(%va/LCARS_COLOR1),rjust(ansi(get(%va/LCARS_COLOR2),stripansi(%0)),u(%va/FN_FLEXWIDTH,77),_))]
+ [ansi(get(%va/LCARS_COLOR1),|)]
+ )]
+-
+
+&LCARS_BANNER [v(JOB_VA)]=
+ [setq(0,%0)]
+ [setq(x,
+ u(%va/FN_ITEMIZE,
+ map(MAP_NAME,get(%q0/OPENED_BY),%b,|),
+ |
+ )
+ )]
+ [setq(y,
+ u(%va/FN_ITEMIZE,
+ map(MAP_NAME,get(%q0/TAGGED_FOR),%b,|),
+ |
+ )
+ )]
+ [ljust(
+ [rjust(ansi(get(%va/LCARS_COLOR5),Bucket:),10)]%b
+ [u(%va/FN_BUCKETNAME,%q0)],
+ div(u(%va/FN_FLEXWIDTH,80),2)
+ )]
+ [rjust(ansi(get(%va/LCARS_COLOR5),Due On:),12)]%b
+ [ifelse(get(%q0/DUE_ON),
+ ifelse(
+ gt(secs(),get(%q0/DUE_ON)),
+ OVERDUE!,
+ convsecs(get(%q0/DUE_ON))
+ ),
+ -
+ )]
+ %r
+ [ljust(
+ [rjust(ansi(get(%va/LCARS_COLOR5),Title:),10)]%b
+ [get(%q0/TITLE)],
+ div(u(%va/FN_FLEXWIDTH,80),2)
+ )]
+ [rjust(ansi(get(%va/LCARS_COLOR5),Status:),12)]%b
+ [switch(get(%q0/PRIORITY),
+ 1,Green,
+ 2,Yellow,
+ 3,Red
+ )]%b
+ %(
+ [last(get(%va/STATUS_[get(%q0/STATUS)]),|)]
+ %)
+ %r
+ [ljust(
+ [rjust(ansi(get(%va/LCARS_COLOR5),Opened On:),10)]%b
+ [convsecs(get(%q0/OPENED_ON))],
+ div(u(%va/FN_FLEXWIDTH,80),2)
+ )]
+ [rjust(ansi(get(%va/LCARS_COLOR5),Assigned To:),12)]%b
+ [ifelse(
+ isdbref(get(%q0/ASSIGNED_TO)),
+ name(get(%q0/ASSIGNED_TO)),
+ Nobody
+ )]
+ %r
+ [rjust(ansi(get(%va/LCARS_COLOR5),Opened By:),10)]%b%qx
+
[ifelse(words(%qy),%r[rjust(ansi(get(%va/LCARS_COLOR5),Tagged:),10)]%b%qy,)]
+-
+
+&LCARS_BUCKETHEADER [v(JOB_VA)]=
+ [u(%va/FN_HEADER,Bucket List)]
+ %r
+ [ifelse(
+ u(%va/FN_WIZONLY,%#),
+ [ansi(get(%va/LCARS_COLOR5),
+ [ljust(Name,9)]
+ [ljust(Flags,6)]%b%b
+ [ljust(Description,u(%va/FN_FLEXWIDTH,30))]
+ [rjust(#Rpts,5)]
+ [rjust(Pct,5)]
+ [space(3)]
+ C%b%bA%b%bD%b%bDue
+ [space(3)]
+ ARTS
+ )],
+ [ansi(get(%va/LCARS_COLOR5),
+ [ljust(NAME,8)]
+ [ljust(Description,u(%va/FN_FLEXWIDTH,50))]%b
+ [rjust(Viewing,20)]
+ )]
+ )]
+ %r
+ [u(%va/FN_BREAK)]
+-
+
+&LCARS_BUCKETLIST [v(JOB_VA)]=
+ [ifelse(
+ u(%va/FN_WIZONLY,%#),
+ [ljust(name(%0),6)]%b%b
+ [ifelse(
+ u(%va/FN_MONITORCHECK,%0,%#),
+ V,
+ -
+ )]
+ [ifelse(
+ u(%va/IS_HIDDEN,%0),
+ H,
+ -
+ )]
+ [ifelse(
+ u(%va/IS_LOCKED,%0),
+ L,
+ -
+ )]
+ [ifelse(
+ u(%va/IS_TAGGED,%0),
+ T,
+ -
+ )]
+ [ifelse(
+ u(%va/IS_PUBLIC,%0),
+ M,
+ -
+ )]
+ [ifelse(
+ u(%va/IS_PUBLISHED,%0),
+ P,
+ -
+ )]
+ [ifelse(
+ u(%va/IS_SUMMARY,%0),
+ S,
+ -
+ )]
+ %b%b
+ [u(%va/FN_STREXACT,get(%0/DESC),u(%va/FN_FLEXWIDTH,30))]
+ [rjust(words(children(%0)),5)]
+
[rjust(mul(round(fdiv(words(children(%0)),words(lcon(%va))),2),100)%%,5)]%b%b
+ [rjust(u(%va/FN_FIND-BBNUM,get(%0/POST_COMPLETE)),2)]%b
+ [rjust(u(%va/FN_FIND-BBNUM,get(%0/POST_APPROVE)),2)]%b
+ [rjust(u(%va/FN_FIND-BBNUM,get(%0/POST_DENY)),2)]
+ [rjust(default(%0/TURNAROUND,0),5)]
+ [rjust(
+ [ifelse(
+ u(%va/FN_HASATTR,%0,STAT_ART),
+
[round(fdiv(fdiv(first(get(%0/STAT_ART)),rest(get(%0/STAT_ART))),86400),0)]d,
+ -
+ )],
+ 7
+ )],
+ [ljust(name(%0),6)]%b%b
+ [u(%va/FN_STREXACT,get(%0/DESC),u(%va/FN_FLEXWIDTH,50))]%b
+ [rjust(
+ ifelse(
+ u(%va/FN_MONITORCHECK,%0,%#),
+ Yes,
+ -
+ ),
+ 20
+ )]
+ )]
+-
+
+&LCARS_COLOR1 [v(JOB_VA)]=y
+-
+
+&LCARS_COLOR2 [v(JOB_VA)]=hy
+-
+
+&LCARS_COLOR3 [v(JOB_VA)]=Yx
+-
+
+&LCARS_COLOR4 [v(JOB_VA)]=hw
+-
+
+&LCARS_COLOR5 [v(JOB_VA)]=hc
+-
+
+&LCARS_FLAGS [v(JOB_VA)]=
+ [ifelse(
+ u(%va/IS_LOCKED,%0),
+ u(%va/FN_FLAG,LOCKED,hr),
+ )]
+ [ifelse(
+ u(%va/IS_PUBLIC,%0),
+ u(%va/FN_FLAG,Myjobs),
+ )]
+ [ifelse(
+ u(%va/IS_PUBLISHED,%0),
+ u(%va/FN_FLAG,Published),
+ )]
+-
+
+&LCARS_FOOTER [v(JOB_VA)]=
+ [switch(%0,,
+ [ansi(get(%va/LCARS_COLOR1),%b[repeat(_,u(%va/FN_FLEXWIDTH,77))])]
+ %r
+ [ansi(get(%va/LCARS_COLOR1),|[repeat(_,u(%va/FN_FLEXWIDTH,77))]|)],
+ [ansi(get(%va/LCARS_COLOR1),%b[repeat(_,u(%va/FN_FLEXWIDTH,77))])]
+ %r
+ [ansi(get(%va/LCARS_COLOR1),|)]
+
[ansi(get(%va/LCARS_COLOR1),rjust(ansi(get(%va/LCARS_COLOR2),stripansi(%0)),u(%va/FN_FLEXWIDTH,77),_))]
+ [ansi(get(%va/LCARS_COLOR1),|)]
+ )]
+-
+
+&LCARS_HEADER [v(JOB_VA)]=
+ [ansi(get(%va/LCARS_COLOR1),.-----.)]
+ %r
+ [ansi(get(%va/LCARS_COLOR1),|[space(5)]|
)][ansi(get(%va/LCARS_COLOR4),rjust(%0,u(%va/FN_FLEXWIDTH,70)))]
+ %r
+ [ansi(get(%va/LCARS_COLOR1),|
[space(6)]`-[repeat(_,u(%va/FN_FLEXWIDTH,69))])]
+ %r
+ [ansi(get(%va/LCARS_COLOR1),`-[repeat(_,u(%va/FN_FLEXWIDTH,76))]|)]
+-
+
+&LCARS_JOBLIST [v(JOB_VA)]=
+ [setq(j,
+ secure(
+ ifelse(u(%va/FN_HASATTRP,%1,JOBS),
+ lcstr(mid(get(%1/JOBS),0,20)),
+ get(%va/JOBS_DEFAULT)
+ )
+ )
+ )]
+ [setq(1,
+ ifelse(get(%0/DUE_ON),
+ ifelse(gt(secs(),get(%0/DUE_ON)),
+ r,
+ switch(get(%0/PRIORITY),
+ 1,g,
+ 2,y,
+ 3,r,
+ g
+ )
+ ),
+ switch(get(%0/PRIORITY),
+ 1,g,
+ 2,y,
+ 3,r
+ )
+ )
+ )]
+ [ifelse(u(%va/FN_ISNEW,%0,%1),
+ [ansi(hr,*)]%b,
+ %b%b
+ )]
+ [ansi(h%q1,
+ [rjust([last(name(%0))],5)]%b
+ [iter(lnum(strlen(%qj)),
+ [u(%va/DISPLAY_[mid(%qj,itext(0),1)],%0,%1)]
+ )]
+ )]
+-
+
+&LCARS_JOBSHEADER [v(JOB_VA)]=
+ [u(%va/FN_HEADER,Anomaly Jobs [u(VERSION)])]
+ %r
+ [setq(j,
+ [secure(
+ switch(u(%va/FN_HASATTRP,%0,JOBS),
+ 1,lcstr(mid(get(%0/JOBS),0,20)),
+ u(JOBS_DEFAULT)
+ )
+ )]
+ )]
+ [setq(2,
+ *%b%b
+ [ljust(Job#,5)]
+ [iter(lnum(strlen(%qj)),
+ u(HEADER_[mid(%qj,itext(0),1)])
+ )]
+ )]
+ [ansi(get(%va/LCARS_COLOR3),
+ ljust(%q2,u(%va/FN_FLEXWIDTH,79))
+ )]
+-
+
+&LCARS_READ [v(JOB_VA)]=
+ [setq(0,
+ ifelse(
+ u(%va/EDIT_ACCESS,%#),
+ [ansi(n,)]
+ [ansi(get(%va/LCARS_COLOR1),%[)]
+ [ifelse(
+ and(
+ or(
+ u(%va/IS_PUBLISHED,%1),
+ switch(
+ extract(get(%1/%0),3,1,|),
+ u(%1/OPENED_BY),
+ 1,
+ 0
+ ),
+ hasflag(%1/%0,no_inherit)
+ ),
+ u(%va/IS_PUBLIC,%1)
+ ),
+ ansi(get(%va/LCARS_COLOR5),
+ [rest(%0,_)]
+ +
+ ),
+ ansi(get(%va/LCARS_COLOR5),
+ [rest(%0,_)]
+ -
+ )
+ )]
+ [ansi(get(%va/LCARS_COLOR1),%])],
+ )
+ )]
+ [setq(1,ansi(get(%va/LCARS_COLOR4),[extract(get(%1/%0),4,1,|)]))]
+ [setq(2,
+ [ansi(get(%va/LCARS_COLOR1),%[)]
+ [ansi(get(%va/LCARS_COLOR4),
+ [rest(convsecs(setr(x,extract(get(%1/%0),2,1,|))))]%b
+ /%bSD%b
+ [u(%va/FN_SECS2SD,extract(get(%1/%0),2,1,|))]
+ )]
+ [ansi(get(%va/LCARS_COLOR1),%])]
+ )]
+ [setq(y,sub(u(%va/FN_FLEXWIDTH,64),add(strlen(%q0),strlen(%q1),1)))]
+ %b%b%b[ansi(get(%va/LCARS_COLOR1),repeat(_,u(%va/FN_FLEXWIDTH,75)))]
+ %r
+ [ansi(get(%va/LCARS_COLOR1),.-~)]
+ [space(4)]
+ [ansi(get(%va/LCARS_COLOR1),repeat(_,6))]
+ %q0
+ %b
+ %q1
+ %b
+ [ansi(get(%va/LCARS_COLOR1),rjust(%q2,%qy,_))]
+ [ansi(get(%va/LCARS_COLOR1),|)]
+ %r
+ [u(%va/FN_WRAP-L,edit(last(get(%1/%0),|),@@PIPE@@,|
),u(%va/FN_FLEXWIDTH,69),ansi(get(%va/LCARS_COLOR1),|[space(5)]|%b%b))]
+ %r
+ [ansi(get(%va/LCARS_COLOR1),|_____|)]
+-
+
+&LCARS_SKIN [v(JOB_VA)]=1
+-
+
+&LCARS_STAFFSUM [v(JOB_VA)]=
+ %r
+ [repeat(-,u(%va/FN_FLEXWIDTH,79))]
+ [rjust(ansi(get(%va/LCARS_COLOR5),DB#:),10)]%b
+ %0[space(10)]
+ [rjust(ansi(get(%va/LCARS_COLOR5),Comments:),10)]%b
+ [setr(z,words(lattr(%0/COMMENT_*)))]
+ %r%r
+ [rjust(ansi(get(%va/LCARS_COLOR5),Players:),10)]%b
+ %(Players contributing to this job%)%r
+ [setq(y,
+ setunion(
+ iter(
+ lattr(%0/COMMENT_*),
+ extract(get(%0/##),4,1,|),%b,|
+ ),,|
+ )
+ )]
+ [u(%va/fn_columns,%qy,20,|,11)]
+ [ifelse(
+ u(%va/fn_hasattr,%0,LIST_READERS),
+ %r[rjust(ansi(get(%va/LCARS_COLOR5),Readers:),10)]%b
+ %(Players who have read this job in the past%)%r
+ [setq(z,
+ iter(
+ get(%0/LIST_READERS),
+ first(##,|)
+ )
+ )]
+ [u(%va/fn_columns,map(%va/MAP_NAME,%qz,%b,|),20,|,11)],
+ )]
+ %r
+ [rjust(ansi(get(%va/LCARS_COLOR5),Stats:),10)]%r
+ [u(%va/fn_columns,
+ iter(
+ ifelse(
+ u(%va/fn_hasattr,%0,LIST_STATS),
+ sort(get(%0/LIST_STATS)),
+ ),
+ [first(##,|)]%b[last(##,|)],%b,|
+ ),20,|,11
+ )]%r
+-
+
+&LCARS_SUMMARY [v(JOB_VA)]=
+ %r
+ [u(%va/LCARS_FOOTER,SUMMARY)]
+ %r
+ [u(parent(%0)/SUMMARY,%0)]
+-
+
+&FN_SECS2SD [v(JOB_VA)]=
+ [fdiv(
+ div(
+ add(%0,862760000),
+ 3600
+ ),
+ 10
+ )]
+-
+
+&FN_WRAP-L [v(JOB_VA)]=
+ switch(first(version()),PennMUSH,
+ %2[wrap(%0,%1,%1,%R%2)],
+ wrap(%0,%1,l,%2)
+ )
+-
=======================================
--- /dev/null
+++ /branches/Jobs 6/6.5/plugins/penn-MXP.txt Thu Nov 24 20:39:41 2011
@@ -0,0 +1,74 @@
+#
+# Anomaly Jobs MXP (Pueblo) for PennMUSH enhancements by Minion@Crossroads
+#
+# ----------------------------------------------------------------
+# Makes Job #'s clickable (linking to "+job #") in PennMUSH with a
+# XCH_CMD compatible client (e.g.., MUSHclient).
+# ----------------------------------------------------------------
+
+@switch
+ [strmatch(first(version()),PennMUSH)]
+ [ifelse(
+ isdbref(setr(0,
+ lsearch(all,eobjects,\[strmatch(name(##),Job Global Object <JGO>)\])
+ )),
+ setq(1,get(%q0/VA)),
+ [setq(1,
+ lsearch(all,eobjects,\[strmatch(name(##),Job Database <JD>)\])
+ )]
+ [setq(0,loc(%q1))]
+ )]
+ [isdbref(%q0)]
+ [and(
+ isdbref(%q1),
+ gte(edit(first(default(%q1/version,0),.),v,),6)
+ )]
+
[not(words(setunion(grep(%q1,*_JOBLIST,FN_LINKJOB),grep(%q1,BLETTER_*,FN_LINKJOB))))]
+ =
+ 0*,{
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,This plugin only works on
PennMUSH.)];
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,Aborting. Cancel this script in
your client.)];
+ &JOB_VA %#=#-1;
+ &JOB_VC %#=#-1;
+ },
+ 10*,{
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,No jobs installation found.)];
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,Aborting. Cancel this script in
your client.)];
+ &JOB_VA %#=#-1;
+ &JOB_VC %#=#-1;
+ },
+ 110*,{
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,Not a valid Jobs 6 or later
installation.)];
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,Aborting. Cancel this script in
your client.)];
+ &JOB_VA %#=#-1;
+ &JOB_VC %#=#-1;
+ },
+ 1110*,{
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,You've already installed this
plugin.)];
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,Reinstall Jobs before re-running
this script.)];
+ think [ansi(hc,ANOMALY JOBS:)] [ansi(hr,Aborting. Cancel this script in
your client.)];
+ &JOB_VA %#=#-1;
+ &JOB_VC %#=#-1;
+ },{
+ think [ansi(hc,ANOMALY JOBS:)] Jobs 6 installation found. Installing
MXP/Pueblo functions.;
+ &JOB_VA %#=%q1;
+ &JOB_VC %#=get(%q0/VC);
+ }
+-
+
+&FN_LINKJOB [v(JOB_VA)]=
+ [tag(A,XCH_CMD="[ifelse(t(strlen(%1)),%1,%0)]")]%0[endtag(A)]
+-
+
+@edit
[v(JOB_VC)]/BLETTER_*={name(%0)},{u(%va/FN_LINKJOB,name(%0),+[name(%0)])}
+-
+
+@edit
[v(JOB_VC)]/BLETTER_CLN={name(%2)},{u(%va/FN_LINKJOB,name(%2),+[name(%2)])}
+-
+
+@edit
[v(JOB_VC)]/BLETTER_MRG={name(%2)},{u(%va/FN_LINKJOB,name(%2),+[name(%2)])}
+-
+
+@edit
[v(JOB_VA)]/*_JOBLIST={last(name(%0))},{u(%va/FN_LINKJOB,last(name(%0)),+[name(%0)])}
+-
+