![]() |
Delphi-Version: 5
einString.equals regiert nicht auf Vergleich
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; |
AW: einString.equals regiert nicht auf Vergleich
Erstmal würde ich an deiner Stelle mal überprüfen ob deine if...then...else Bedingungen so richtig sind bzw. ob da nicht vielleicht das ein oder andere begin..end fehlt. Zumindest deine Einrückungen lassen vermuten das es so ist.
|
AW: einString.equals regiert nicht auf Vergleich
Ich kann da jetzt keine Fehler bei den If Else Bedingungen erkennen. der die Commandline wird ja ordnungsgemäß an ParseComandlineArgs übergeben. Auch das erste Wort (COMMAND) ist genau das was es sein soll. ShowMessage wird ja aufgerufen und zeigt mir den Command "-HELP" an. dann verstehe ich halt nicht wieso if COMMAND.equals('-HELP') .... nicht darauf anspringt.
|
AW: einString.equals regiert nicht auf Vergleich
Sicher das "command" nicht zB vorne oder hinten ein Leerzeichen noch hat?
|
AW: einString.equals regiert nicht auf Vergleich
@EinsteinXXL:
Dann wäre deine Formatierung wenig hilfreich. Du schreibst:
Delphi-Quellcode:
Meinst du es so wie du es geschrieben hast (mal etwas umformatiert):
// - 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;
Delphi-Quellcode:
Oder doch eher so:
// - 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 begin COMMAND := AnsiUpperCase(COMMAND); end; PARAMETER := commandline.Substring(AnsiPos(COMMAND,commandline) + COMMAND.Length).ToLower;
Delphi-Quellcode:
In der anderen Prozedur sind auch solche Formatierungen drinne, aber ich habe mal jetzt nur diese als Beispiel genommen.
// - 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 begin COMMAND := AnsiUpperCase(COMMAND); PARAMETER := commandline.Substring(AnsiPos(COMMAND,commandline) + COMMAND.Length).ToLower; end; |
AW: einString.equals regiert nicht auf Vergleich
@ ringli Danke für deine Hilfe. Aber die IF else Bedingungen waren nicht das Problem, sondern nur der Versuch das eigentliche Problem zu lösen.
In der von mir als erstes geposteten Funktion habe ich ein Leerzeichen vergessen zu entfernen. Mit der Methode DEC_MS.Substring trenne ich das erste wort vom restlichen Text. Der Restliche Text den ich dann an ParseCommandlineArg übergebe enthielt am anfang noch ein Leerzeichen. Das führte in ParseCommandlineArg dazu, dass meine Split Methode eine Leeren String zurückgegeben hat. Mich wunderte es sowieso wieso Split[0] einfach leer war. Dann habe ich sozusgaen gepfuscht und mit " if COMMAND.IsEmpty" versucht das Problem an der falschen Stelle zu lösen. :D Die IsEmpty Prüfung kann nun wieder wegfallen und ich musste nur diese Zeile von...
Code:
auf...
procedure TForm1.IdIRC1ChannelMessage(ASender: TIdContext; const ANickname, AHost, ATarget, AMessage: string);
.... // - Speichere restlichen Text in dden COMMANDLINE String COMMANDLINE := DEC_MSG.Substring(AnsiPos(TRIGGER,DEC_MSG) + TRIGGER.Length); ... end;
Code:
ändern. tja, manchmal ist man einfahc betriebsblind. :D Die ParseComandlineArgs Methode sieht jetzt wieder so aus.
procedure TForm1.IdIRC1ChannelMessage(ASender: TIdContext; const ANickname, AHost, ATarget, AMessage: string);
.... // - Speichere restlichen Text in dden COMMANDLINE String COMMANDLINE := DEC_MSG.Substring(AnsiPos(TRIGGER,DEC_MSG) + TRIGGER.Length + 1); ... end;
Code:
@ Der schöne Günther Danke für den Tip mit dem Leerzeichen. ;)
procedure TForm1.ParseComandlineArgs(IdIRC1: TidIRC; ASender: TIdContext; const ANickname; APassword : PAnsiChar; const ATarget, Commandline: string);
... COMMAND := String(Commandline.Split([' '])[0]); COMMAND := AnsiUpperCase(COMMAND); PARAMETER := commandline.Substring(AnsiPos(COMMAND,commandline) + COMMAND.Length).ToLower; // - help if COMMAND.Equals('-HELP') then begin ShowHelp(APassword, ATarget); end; ... end; PS: Trotzdem vielen Dank an alle welche sich für mich den Kopf zerbrochen haben bzw. so nett waren sich die Zeit für mein Problem zu nehmen. |
AW: einString.equals regiert nicht auf Vergleich
Das du bei
![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz