restemplate/indy/examples/elizaweb/ezpersonality.pas

179 lines
4.4 KiB
Plaintext

{ $HDR$}
{**********************************************************************}
{ Unit archived using Team Coherence }
{ Team Coherence is Copyright 2002 by Quality Software Components }
{ }
{ For further information / comments, visit our WEB site at }
{ http://www.TeamCoherence.com }
{**********************************************************************}
{
$Log: 21834: EZPersonality.pas
Rev 1.0 2003.07.13 12:12:04 AM czhower
Initial checkin
Rev 1.0 2003.05.19 2:54:06 PM czhower
}
unit ezpersonality;
interface
{$ifdef fpc}
{$mode objfpc}{$H+}
{$endif}
uses
Classes;
type
TEZPersonalityAttributes = record
Name: string;
Description: string;
end;
TEZPersonality = class;
TEZPersonalityClass = class of TEZPersonality;
TEZPersonality = class(TCollection)
protected
FKeywords: TStrings;
//
procedure AddReply(const AKeywords: array of string;
const AReplies: array of string); overload;
procedure AddReply(const AKeywords: array of string;
const AReplies: array of string; const ASounds: array of string); overload;
procedure InitReplies; virtual; abstract;
public
class function Attributes: TEZPersonalityAttributes; virtual; abstract;
class function ConstructPersonality(const AName: string): TEZPersonality;
constructor Create; virtual;
destructor Destroy; override;
class procedure PersonalityList(AStrings: TStrings);
class procedure RegisterPersonality;
//
property Keywords: TStrings read FKeywords;
end;
TEZReply = class(TCollectionItem)
protected
FIndex: Integer;
FSound: string;
FSounds: TStrings;
FTexts: TStrings;
public
procedure AddText(const AText: string; const ASound: string = '');
constructor Create(AOwner: TCollection); override;
destructor Destroy; override;
function NextText: string;
//
property Sound: string read FSound;
end;
implementation
uses
SysUtils;
var
GPersonalities: TStringList;
{ TEZReply }
procedure TEZReply.AddText(const AText: string; const ASound: string = '');
begin
FTexts.Add(AText);
FSounds.Add(ASound);
end;
constructor TEZReply.Create(AOwner: TCollection);
begin
inherited;
FSounds := TStringList.Create;
FTexts := TStringList.Create;
end;
destructor TEZReply.Destroy;
begin
FreeAndNil(FTexts);
FreeAndNil(FSounds);
inherited;
end;
function TEZReply.NextText: string;
begin
Result := FTexts[FIndex];
FSound := FSounds[FIndex];
Inc(FIndex);
if FIndex = FTexts.Count then begin
FIndex := 0;
end;
end;
{ TEZPersonality }
procedure TEZPersonality.AddReply(const AKeywords, AReplies: array of string;
const ASounds: array of string);
var
i: integer;
LReply: TEZReply;
begin
LReply := TEZReply.Create(Self);
for i := Low(AReplies) to High(AReplies) do begin
if i <= High(ASounds) then begin
LReply.AddText(AReplies[i], ASounds[i]);
end else begin
LReply.AddText(AReplies[i]);
end;
end;
for i := Low(AKeywords) to High(AKeywords) do begin
FKeywords.AddObject(Uppercase(AKeywords[i]), LReply);
end;
end;
procedure TEZPersonality.AddReply(const AKeywords, AReplies: array of string);
begin
AddReply(AKeywords, AReplies, []);
end;
class function TEZPersonality.ConstructPersonality(
const AName: string): TEZPersonality;
var
i: Integer;
begin
i := GPersonalities.IndexOf(AName);
if i = -1 then begin
raise Exception.Create('Personality not found.');
end;
Result := TEZPersonalityClass(GPersonalities.Objects[i]).Create;
end;
constructor TEZPersonality.Create;
begin
inherited Create(TEZReply);
FKeywords := TStringList.Create;
InitReplies;
end;
destructor TEZPersonality.Destroy;
begin
FreeAndNil(FKeywords);
inherited;
end;
class procedure TEZPersonality.PersonalityList(AStrings: TStrings);
begin
AStrings.AddStrings(GPersonalities);
end;
class procedure TEZPersonality.RegisterPersonality;
begin
GPersonalities.AddObject(Self.Attributes.Name, TObject(Self));
end;
initialization
GPersonalities := TStringList.Create;
GPersonalities.Sorted := True;
finalization
FreeAndNil(GPersonalities)
end.