Hallo,
ich schreibe zur zeit einen
irc bot der auf diverse befehle (zb. !Nickname -help) reagieren soll. Das tut er auch schön brav, bis auf einen Bug den ich mir nicht erklären kann.
Die erste Funktion reagiert auf eine Eingabe eines Users in einem
IRC Channel und übergibt den nach dem Trigger (das wort woraus er reagieren soll) an eine zweite Funktion. Wenn ich also im
IRC Channel "!TEST-Nickname -help" eingebe funktioniert alles ohne Probleme. Wenn ich nun aber "Test-Nickname -help" eingebe regiert meine Bedingung "if COMMAND.Equals('-HELP') Then ....) nicht auf den String "-HELP", abwohl dieser laut meiner Debug Ausgabe genau dieser Bedingung entspricht. Was mich richtig verwirrt ist, dass dies davon abhängig ist, ob der Trigger nun groß ("!TEST-Nickname") oder klein ("Test-Nickname") geschrieben ist, obwohl meine erste procedure das längst berücksichtigt hat, indem ich alles vor der Prüfung des Triggers in Uppercase wandle. Zudem wird der Trigger in der ParseComandlineArgs Funktion überhaupt nicht beachtet oder überhaupt angewendet, da sowieso nur der Text nach dem Trigger an diese Funktion übergeben wird.
Ich hoffe jemand kann mir helfen.
PS: Delphi Version ist nicht Delphi 5, sondern ich benutze XE8 als
IDE.
Code:
procedure TForm1.IdIRC1ChannelMessage(ASender: TIdContext; const ANickname, AHost, ATarget, AMessage: string);
var
OK_MSG: PAnsiChar;
ENC_MSG: PAnsiChar;
DEC_MSG: String;
PASSWORD: PAnsiChar;
TRIGGER: String;
COMMANDLINE: String;
OWNNICK: String;
begin
// - Prefex von Blishfish für verschlüsselten Text
OK_MSG := PAnsiChar(AnsiString(AMessage.Split([' '])[0]));
// - Trenne Prefix vom verschlüsselten text
ENC_MSG := PAnsiChar(AnsiString(AMessage.Split([' '])[1]));
// - Setze Passwort
PASSWORD:= PAnsiChar(AnsiString(cbcPrefix + 'blabla'));
// - Prüfe auf Prefix (+OK)
if (OK_MSG = '+OK') then
begin
DEC_MSG := String(DecryptString('blabla', ENC_MSG, nil ,3072));
// - trenne erstes Wort vom restlichen Text ab
TRIGGER := String(DEC_MSG.Split([' '])[0]);
// - Formatiere das erste Wort zu Uppercase
TRIGGER := TRIGGER.ToUpper;
// - Formatiere das bot Nickname zu Uppercase
OWNNICK := IdIRC1.Nickname.ToUpper;
// - Prüfe erstes Wort ob es dem Nickname mit einem vorrausgestellten Ausrufezeichen entspricht
if TRIGGER.Equals('!' + OWNNICK) Then begin
// - Prüfe ob nach dem ersten wort (Trigger) weiterer Text enthalten ist
if COMMANDLINE.IsEmpty = false then
// - Speichere restlichen Text in dden COMMANDLINE String
COMMANDLINE := DEC_MSG.Substring(AnsiPos(TRIGGER,DEC_MSG) + TRIGGER.Length);
// - übergebe COMMANDLINE an die procedure "ParseComandlineArgs"
ParseComandlineArgs(IdIRC1, ASender, ANickname, PASSWORD, ATarget, COMMANDLINE)
else
ShowHelp(PASSWORD, ATarget);
end;
// - test ausgabe wenn channel text nicht verschlüsselt ist
end
else if (AMessage = '!' + IdIRC1.Nickname) then
IdIRC1.Say(ATarget, 'Hello '+ANickname);
end;
procedure TForm1.ParseComandlineArgs(IdIRC1: TidIRC; ASender: TIdContext; const ANickname; APassword : PAnsiChar; const ATarget, Commandline: string);
var
COMMAND, PARAMETER: String;
PList : TStringList;
i: Integer;
begin
// - Trenne erstes Wort vom restlichen text
COMMAND := String(Commandline.Split([' '])[0]);
// - Wenn nur ein Wort vohanden war, ist aus mir unverstandlichen Gründen COMMAND leer, obwohl
// - ja mindestens ein Wort vohanden ist. deswegen der nachfolgende code
// - Prüfe ob COMMAND leer ist, wenn ja, dann COMMAND String ist Commandline, rest sollte selbsterklärend sein
if COMMAND.Empty then begin
COMMAND := AnsiUpperCase(Commandline);
end
else
COMMAND := AnsiUpperCase(COMMAND);
PARAMETER := commandline.Substring(AnsiPos(COMMAND,commandline) + COMMAND.Length).ToLower;
// - Debug Ausgabe (Ausgabe ist dann "-HELP")
ShowMessage(COMMAND);
// - help
if COMMAND.Equals('-HELP') then begin
ShowHelp(APassword, ATarget);
end;
end;