{
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.