zalogowany2013 Napisano Listopad 14, 2013 Zgłoś Share Napisano Listopad 14, 2013 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 More sharing options...
olesio Napisano Listopad 14, 2013 Zgłoś Share Napisano Listopad 14, 2013 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 More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.