From the NannyMUD documentation

LAST CHANGE

2000-12-16

NAME

        board - Information on the std board system.

DESCRIPTION

	This file contains a very short description of the /std/boards and the
	system around them.

	First some simple rules on what is allowed and what is not:
	1. It is not allowed to create a postoffice that is accessible
	   by mortals (other than the one that exist in the village).

	   If you prefer to read boards with a reader that does not
	   support reading from afar you might like to make a room
	   that is not accessible by mortals a postoffice (e.g.
	   your workroom). This is done easilly (assuming your
	   workroom supports propertys), just add the line
	   add_property("postoffice");
	   in reset-function in your workroom.

	2. If you want a private board in your workroom have a look
	   in the file /std/board/examples/private_board.c

	3. If you want a board for another reason e.g. for a club
	   or guild or something have a look at files in
	   /std/board/*board.c and /std/board/examples/*.c
           Make sure to give the set_name(...) begining with lowercase.

	4. If your not satisfied with the boardreader you have do
	   on of the following:
	   * Try to change to another boardreader located in
	     /std/board/reader/
	     Currently there are five readers available, but
             only two are supported by admin (advanced and
             compat).

	   * If it is just a minor change send a mail to the admin in charge
	     and ask if it can be inserted in the reader you currently use.

	   * Write a reader of your own that works exactly the way you want.
	     You probably want to inherit /std/board/reader/reader_base.c
             (if you don't use reader_base.c you will at least need to
              implement some of its features if mortals are going to be
              able to use the reader.)
	     You are NOT allowed to make a copy of an existing
	     boardreader and change a little code in it, however
             it is allowed to inherit another reader if the creator of
             that reader approves.
	     Some reasons for not copying and change an existing reader:
	     1. This will make more almost identical readers loaded
	        in memory, thus consuming unnessecary memory.
	     2. It will be harder to maintain the readers.
	     3. It will be almost identical to the existing readers.
	     4. Admin will not be happy when you waste CPU, memory
	        and work in ways that creates unnessecary bugs.

           * Be brave and use "patch" from the wizmod to do everything
	     (for brave people that don't want fancy GUI's).
        
	     If you really want to use patch or code a reader on your own
	     and don't have access to /admin you probably want to talk to
	     the admin to get the design specifications. Beware, the design
	     is written in Swedish only.

	     It might also be possible to inherit (NOT copy) another reader,
	     if you want to do this _always_ talk to the admin first since the
	     readers are not intended to be used for further inheritance.

	     Both readers that admin supports inherit reader_base.c, but
             some of the other readers (rather old ones) inherit other readers
             (since the coders was to lazy to code a few extra lines).


	Coding tricks:
        Example of easiest way to make a public board:
	(put code in reset(0) in room to contain the board and make sure
         that room is loaded when the MUD boots).
	ob=clone_object("/std/board/mortalboard"); // The basic board thing.
	ob->set_name("monks public");
	ob->set_long("This board can be used for non-monks to express their "+
		     "opinion about monks.\n");
	ob->set_location("/guilds/monks/rooms/board_room");
	ob->init_board(); // Makes the board do what it needs.
        
        Example of easiest way to make a guild/club board:
	(put code in reset(0) in room to contain the board and make sure
         that room is loaded when the MUD boots).
	ob=clone_object("/std/board/guildboard");
	ob->set_name("monks private");
	ob->set_long("This is a board used for monks to discussions.\n");
	ob->set_guild_mark_name("monks_board"); // Use a unique namn of the guildmark.
	ob->set_location("/guilds/monks/rooms/corridor3"); // Filename of board position.
	ob->init_board(); // Makes the board do what it needs.

        Coding you own board reader:
	If you are about to add/change commands from advanced reader you
	should look at the following functions:
	overloadable_reader_help(string)
	overloadable_check_commandloop(string, string)
        _signal_short(object) // reader can redefine how short for board should
          look like for the player. The object is the board_object.
	_signal_callback_long(object)  // same as callback_short but for long.

	Example of cool tricks made by various wizards with the boards:
	// A redefinition of short function to show number of unread notes.
	// Example from knights guilds
	get_short() {
	// This prolly deserves the price for ugliest hack, but anyway
	   int unread;
	   object reader;
	   mixed ge;

	   reader = present("konfreader", this_player());
	   if(reader)
	      reader -> __exit();
	   ge = this_player() -> getenv("BOARDS");
	   if(ge && mappingp(ge)) {
	      ge = ge[query_name()];
	      if(ge) {
	         ge=ge["read"];
	         if(ge)
	           return "The Guild Head board, containing "+
	                  sizeof(m_indices(note_headers))+
	          " notes, "+sizeof(unread_notes(ge))+" unread";
	      }
	   }
	   return "The Guild Head board, containing "+
	     sizeof(m_indices(note_headers))+" notes";
	}