AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

einString.equals regiert nicht auf Vergleich

Ein Thema von EinsteinXXL · begonnen am 22. Aug 2015 · letzter Beitrag vom 23. Aug 2015
Antwort Antwort
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
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: einString.equals regiert nicht auf Vergleich

  Alt 22. Aug 2015, 20:48
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.
  Mit Zitat antworten Zitat
EinsteinXXL

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

AW: einString.equals regiert nicht auf Vergleich

  Alt 23. Aug 2015, 03:50
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.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.108 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: einString.equals regiert nicht auf Vergleich

  Alt 23. Aug 2015, 07:16
Sicher das "command" nicht zB vorne oder hinten ein Leerzeichen noch hat?
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: einString.equals regiert nicht auf Vergleich

  Alt 23. Aug 2015, 08:17
@EinsteinXXL:

Dann wäre deine Formatierung wenig hilfreich. Du schreibst:
Delphi-Quellcode:
  // - 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;
Meinst du es so wie du es geschrieben hast (mal etwas umformatiert):
Delphi-Quellcode:
  // - 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;
Oder doch eher so:
Delphi-Quellcode:
  // - 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;
In der anderen Prozedur sind auch solche Formatierungen drinne, aber ich habe mal jetzt nur diese als Beispiel genommen.

Geändert von ringli (23. Aug 2015 um 08:22 Uhr)
  Mit Zitat antworten Zitat
EinsteinXXL

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

AW: einString.equals regiert nicht auf Vergleich

  Alt 23. Aug 2015, 16:56
@ 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. Die IsEmpty Prüfung kann nun wieder wegfallen und ich musste nur diese Zeile von...

Code:
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;
auf...
Code:
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;
ändern. tja, manchmal ist man einfahc betriebsblind. Die ParseComandlineArgs Methode sieht jetzt wieder so aus.

Code:
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;
@ Der schöne Günther Danke für den Tip mit dem Leerzeichen.

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.

Geändert von EinsteinXXL (23. Aug 2015 um 17:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: einString.equals regiert nicht auf Vergleich

  Alt 23. Aug 2015, 17:39
Das du bei Delphi-Referenz durchsuchenstring.Split noch einen Parameter angeben kannst, wo leere Strings einfach unterdrückt werden, weißt du?

Delphi-Referenz durchsuchenTStringSplitOptions
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz