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/
{
	Delphi IMC3 Client - Channel type and support routines

	Based on client code by Samson of Alsherok.

	$Id: imc3_chan.pas,v 1.1 2003/12/12 13:19:54 druid Exp $
}
unit imc3_chan;

interface


uses
	Classes,
	dtypes,
	fsys,
	LibXmlParser,
	imc3_const;


type
  GChannel_I3 = class
  public
  	local_name : string;
    host_mud : string;
    I3_name : string;
    layout_m, layout_e : string;
    status : integer;
    i3perm : integer;
    history : TStringList;
    flags : integer;
    
  published
  	constructor Create();
  	
  	procedure load(parser : TXmlParser);
  	procedure save(writer : GFileWriter);
  	
  	procedure updateHistory(msg : string);
  end;


var
	chanList : GHashTable;
	
	
function findChannel(name : string) : GChannel_I3;

procedure loadChanList();
procedure saveChanList();

implementation

uses
	SysUtils,
	util;
	

constructor GChannel_I3.Create();
begin
	inherited Create();
	
	history := TStringList.Create();
end;

procedure GChannel_I3.load(parser : TXmlParser);
begin
	while (parser.Scan()) do
		case parser.CurPartType of // Here the parser tells you what it has found
			ptStartTag:
				begin
				end;
			ptContent:
				begin
				if (prep(parser.CurName) = 'NAME') then
					I3_name := parser.CurContent
				else
				if (prep(parser.CurName) = 'MUD') then
					host_mud := parser.CurContent;
				end;
			ptEndTag   : // Process End-Tag here (Parser.CurName)
				begin
				if (prep(parser.CurName) = 'CHANNEL') then
					exit;
				end;
		end;
end;

procedure GChannel_I3.save(writer : GFileWriter);
begin
	writer.writeLine('	<channel status="' + IntToStr(status) + '">');
	writer.writeLine('		<name>' + I3_name + '</name>');
	writer.writeLine('		<mud>' + host_mud + '</mud>');
	writer.writeLine('	</channel>');
end;

procedure GChannel_I3.updateHistory(msg : string);
var
	hist : string;
begin
	hist := '[' + FormatDateTime('hh:nn', Now) + '] ' + msg;
	
	history.Add(hist);
	
	if (history.count > MAX_I3HISTORY) then
		history.Delete(0);
end;
	
function findChannel(name : string) : GChannel_I3;
begin
	Result := GChannel_I3(chanList.get(name));
end;

procedure loadChanList();
var
	parser : TXmlParser;
	channel : GChannel_I3;
begin
	if (not FileExists(I3_CHANLIST_FILE)) then
		exit;

  parser := TXmlParser.Create();
	parser.Normalize := true;
  parser.LoadFromFile(I3_CHANLIST_FILE);

	parser.StartScan();

	while (parser.Scan()) do
		case parser.CurPartType of // Here the parser tells you what it has found
			ptStartTag:
				begin
				if (prep(parser.CurName) = 'CHANNEL') then
					begin
					channel := GChannel_I3.Create();
					channel.status := StrToIntDef(parser.CurAttr.Value(0), 0);
					channel.load(parser);
					chanList.put(channel.I3_name, channel);
					end;
				end;
		end;

	parser.Free();
end;

procedure saveChanList();
var
	iterator : GIterator;
	channel : GChannel_I3;
	writer : GFileWriter;
begin
	iterator := chanList.iterator();
	
	writer := GFileWriter.Create(I3_CHANLIST_FILE);
	
	writer.writeLine('<?xml version="1.0"?>');
	writer.writeLine('<!-- InterMud 3 ChanList -->');
	writer.writeLine('<!-- Autogenerated, do not manually edit -->');
	writer.writeLine('<chanlist>');
	
	while (iterator.hasNext()) do
		begin
		channel := GChannel_I3(iterator.next());
		
		channel.save(writer);
		end;

	writer.writeLine('</chanlist>');
	
	writer.Free();
		
	iterator.Free();
end;

begin
	chanList := GHashTable.Create(256);
	
	loadChanList();
end.