Skocz do zawartości

Kopiowanie kawałka stringa


zalogowany2013

Polecane posty

Pisze bardzo prostego bota który działa jako service na serwerze IRC który mam uruchomione u siebie, zdaje sobie sprawę z tego ze do obsługi protokołu IRC są przeznaczone do tego komponenty jednak ja postanowiłem użyć socketów z racji tego że wtedy jest możliwość napisania wszystkiego od podstaw i nie ma prawie żadnych ograniczeń (w porównaniu z gotowymi komponentami) Oczywiście ustanowiłem połączenie, bot się loguje, odbiera komendy od serwera które wyświetla w memo itp ale chciałbym go nieco rozbudować bo co to za bot który prawie nic nie robi? Najpierw chciałbym aby bot po wyrzuceniu z kanału wszedł na niego ponownie, niezależnie od tego jaki to kanał i w tym celu napisałem taki kawałek kodu.

 

If pos('KICK',Dane) > 0 then begin
Clientsocket1.Socket.SendText(':ChanServ JOIN #' + copy(Dane,pos('#',Dane) + 1,length(Dane) - pos('#',Dane)) +CRLF);

 

Niestety kod nie jest idealny i gdy bot odbierze np komendę ":tester KICK #test ChanServ test" to zamiast odpowiedzieć komendą "ChanServ JOIN #test" odpowiada "ChanServ JOIN #test test" czyli kopiuje zbyt wiele ze stringa i rezultat jest taki jak napisałem. W jaki sposób najlepiej wyeliminować ten problem i dodatkowo zabepieczyć bota przed wystąpieniem zdefiniowanych słów w stringu na który ma odpowiedzieć, przykład: "AnyUser PRIVMSG #test tester KICK #test ChanServ" gdy bot otrzyma takiego stringa to również będzie próbował wejść na kanał (sprawdziłem snifferem)

Link do komentarza
Udostępnij na innych stronach

Na 4p dostałeś już masę pomocnych odpowiedzi. No ale może tutaj chcesz uzyskać kolejną garść informacji, którą i tak pewnie zignorujesz :/ Ja będę uparty. Jeżeli chcesz mieć największą kontrolę, a nie umiesz używac Copy (bo u siebie kopiujesz za dużą ilość znaków po prostu według mnie), to skorzystaj na prawdę z modułu TRegExpr. Link już podawałem na 4p. Są tam dema i dokumentacja, a na google po wpisaniu frazy "wyrażenia regularne" masz mnóstwo stron z pomocą.

 

Ktoś powie, że użycie wyrażeń regularnych tutaj to jak porywanie się z armatą do zabicia muchy. Ale na prawdę będzie Tobie prościej. Dodatkowo skoro chcesz wyodrębnić z jednego stringa kawałek innego, to ja posługuję się w swoich programach poniższą funkcją, którą kiedyś podpowiedział mi Misiekd. Udziełał się on dość dawno temu na forum 4p. Podajesz od jakiego znaku do jakiego i w jakim stringu ma Ci wyodrębnić string. Działa dla pierwszego wystąpienia, można też podawać jako początek lub koniec '' i ważna jest wielkość znaków.

function SimpleParse(StrBegin, StrEnd, Str : string) : string;
var
 B, E : integer;
begin
 Result := '';
 if StrBegin = '' then
 begin
B := 1;
 end
 else
 begin
B := Pos(StrBegin, Str);
 end;
 if B > 0 then
 begin
Str := Copy(Str, B + Length(StrBegin), MaxInt);
if StrEnd = '' then
begin
 	E := Length(Str) + 1;
end
else
begin
 	E := Pos(StrEnd, Str);
end;
if E > 0 then
begin
 	Result := Copy(Str, 1, E - 1);
end;
 end;
end;

EDIT: Powyżej kod się rozjechał. Anyway, ale jeśli dobrze zrozumiałem co chcesz osiągnąc to załatwi to poniższy kod. Ale jakbyś się nie upierał olewać wyrażenia regularne to dało by się to zrobić w około 5 linijek prostego kodu.

function GetKickData(DataToParse : string; var AKickedBy, AChannel, AReason : string) : boolean;
const
 Kick_Marker = 'KICK #';
var
 X : integer;
begin
 AChannel := '';
 AReason := '';
 X := Pos(':', DataToParse);
 Result := X = 1;
 if Result then
 begin
X := Pos(' ', DataToParse);
Result := X > 0;
if Result then
begin
 	AKickedBy := Copy(DataToParse, 2, X - 1);
 	X := Pos('!', AKickedBy);
 	AKickedBy := Copy(AKickedBy, 1, X - 1);
 	X := Pos(Kick_Marker, AnsiUpperCase(DataToParse));
 	Result := X > 0;
 	if Result then
 	begin
   	AChannel := Copy(DataToParse, X + Length(Kick_Marker) - 1, MaxInt);
   	AReason := AChannel;
   	X := Pos(' ', AChannel);
   	AChannel := Copy(AChannel, 1, X - 1);
   	X := Pos(':', AReason);
   	AReason := Copy(AReason, X + 1, MaxInt);
 	end;
end
else
begin
 	AKickedBy := '';
end;
 end;
end;
procedure TForm1.Button1Click(Sender : TObject);
const
 Source_Data = ':olesio!olesio@XXXXX.chello.pl KICK #v5 oles` :powood';
var
 KickedBy, Chn, Rsn : string;
begin
 if GetKickData(Source_Data, KickedBy, Chn, Rsn) then
 begin
Memo1.Clear;
Memo1.Lines.Add('Wykopano z kanału: ' + Chn);
Memo1.Lines.Add('Wykopany przez: ' + KickedBy);
Memo1.Lines.Add('I powód wykopania: ' + Rsn);
   Clientsocket1.Socket.SendText((':ChanServ JOIN ' + Chn);
 end;
end;

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...