Einzelnen Beitrag anzeigen

EinsteinXXL

Registriert seit: 18. Aug 2015
8 Beiträge
 
#1

einString.equals regiert nicht auf Vergleich

  Alt 22. Aug 2015, 19:11
Delphi-Version: 5
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;

Geändert von EinsteinXXL (23. Aug 2015 um 17:24 Uhr)
  Mit Zitat antworten Zitat