grendel-1.0.0a7/backup/
grendel-1.0.0a7/bin/
grendel-1.0.0a7/boards/
grendel-1.0.0a7/clans/
grendel-1.0.0a7/documentation/todo/
grendel-1.0.0a7/help/
grendel-1.0.0a7/logs/
grendel-1.0.0a7/players/
grendel-1.0.0a7/progs/
grendel-1.0.0a7/races/
grendel-1.0.0a7/src/contrib/
grendel-1.0.0a7/src/modules/speller/
grendel-1.0.0a7/src/modules/status/
grendel-1.0.0a7/src/tests/
grendel-1.0.0a7/src/tests/dunit/
{
  Summary:
  	Abstract(Bulletinboard (noteboard) interface
  	
	## $Id: bulletinboard.pas,v 1.6 2004/04/10 22:24:03 druid Exp $
}

unit bulletinboard;

interface

uses
    dtypes;

type
    GNote = class
    public
      board, number : integer;
      date, author, subject : string;
      text : string;
    end;

var
   notes : GDLinkedList;

procedure load_notes(const fname : string);
procedure save_notes();
function findNote(board, number : integer) : GNote;
function noteNumber(board : integer) : integer;
procedure postNote(c : pointer; const text : string);

procedure initNotes();
procedure cleanupNotes();

implementation

uses
    SysUtils,
    constants,
    strip,
    chars,
    fsys,
    player;

procedure load_notes(const fname : string);
var
  af : GFileReader;
  note : GNote;
  s, g : string;
  board, number : integer;
  date, author, subject, text : string;
begin
	board := 0;
	number := 0;
	
  try
    af := GFileReader.Create('boards\' + fname);
  except
    exit;
  end;

  repeat
    s := af.readLine();

    if (pos('#',s) = 1) then
      begin
      g := uppercase(left(s,'='));

      if (g = '#BOARD') then
        board := StrToIntDef(rightr(s,'='), 0)
      else
      if (g = '#NUMBER') then
        number := StrToIntDef(rightr(s,'='), 0)
      else
      if (g = '#DATE') then
        date := rightr(s,'=')
      else
      if (g = '#AUTHOR') then
        author := rightr(s,'=')
      else
      if (g = '#SUBJECT') then
        subject := rightr(s,'=')
      else
      if (g = '#TEXT') then
        begin
        text := '';

        repeat
          s := af.readLine();

          if (s <> '~') then
            text := text + s + #13#10;
        until (s = '~');
        end
      else
      if (g = '#END') then
        begin
        note := GNote.Create();

        note.board := board;
        note.number := number;
        note.date := date;
        note.author := author;
        note.subject := subject;
        note.text := text;

        notes.insertLast(note);
        end
      else
      if (g = '#INCLUDE') then
        load_notes(rightr(s,'='));
      end;

  until (af.eof());

  af.Free();
end;

procedure save_notes();
var 
	iterator : GIterator;
	f : textfile;
	note : GNote;
	i : integer;
begin
  for i:=1 to BOARD_MAX-1 do
    begin
    assignfile(f, translateFileName('boards\' + board_names[i] + '.brd'));
    rewrite(f);

    iterator := notes.iterator();

    while (iterator.hasNext()) do
      begin
			note := GNote(iterator.next());

      if (note.board = i) then
        begin
        writeln(f, '#BOARD=' + inttostr(note.board));
        writeln(f, '#NUMBER=' + inttostr(note.number));
        writeln(f, '#DATE=' + note.date);
        writeln(f, '#AUTHOR=' + note.author);
        writeln(f, '#SUBJECT=' + note.subject);
        writeln(f, '#TEXT');
        writeln(f, note.text);
        writeln(f, '~');
        writeln(f, '#END');
        writeln(f);
        end;
			end;
			
		iterator.Free();

    closefile(f);
    end;
end;

function findNote(board, number : integer) : GNote;
var 
	iterator : GIterator;
	note : GNote;
begin
  Result := nil;

	iterator := notes.iterator();

	while (iterator.hasNext()) do
		begin
		note := GNote(iterator.next());

    if (note.board = board) and (note.number = number) then
      begin
      Result := note;
      exit;
      end;
    end;
    
	iterator.Free();
end;

function noteNumber(board : integer) : integer;
var
	iterator : GIterator;
	note : GNote;
	number : integer;
begin
  number := 0;
	iterator := notes.iterator();

	while (iterator.hasNext()) do
		begin
		note := GNote(iterator.next());

    if (note.board = board) and (note.number > number) then
      number := note.number;
    end;
    
	iterator.Free();

  Result := number + 1;
end;

procedure postNote(c : pointer; const text : string);
var
	note : GNote;
  ch : GPlayer;
begin
  ch := c;

  note := GNote.Create();

  note.board := ch.active_board;
  note.number := noteNumber(ch.active_board);
  note.date := DateTimeToStr(Now);
  note.author := ch.name;
  note.subject := ch.subject;
  note.text := text;

  notes.insertLast(note);
  save_notes;
end;

procedure initNotes();
begin
  notes := GDLinkedList.Create();
end;

procedure cleanupNotes();
begin
  notes.clear();
  notes.Free();
end;

end.