Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mój własny bot do konnekta (problem)
Konnekt | Forum > Developerzy > Tworzenie wtyczek
danielg
Witam, od jakiegoś czasu pracuję nad własnym BOT'em.

Funkcjonalność bota sprowadza się do:
- odpowiedzi na pytania / polecenia rozmówców.
- ostrzeganie przed wysyłaniem spamu / łańcuszków
- ( coś się jeszcze wymyśli... )
cały proces opiera się na skrypcie stworzonym w LUA. Jest więc w prosty sposób konfigurowalny bez kolejnych kompilacji wtyczki.

Ale mam pewien problem. Nie mogę nigdzie się dowiedzieć jak po otwarciu okna rozmowy z jakąś osobą z listy i po automatycznym wysłaniu wiadomości do niej żeby w oknie tej że rozmowy dodać wysłaną wiadomość tak aby wyglądało na to że sam ją przed chwilą wpisałem. Myślę, że jest to chyba zrozumiałe smile.gif

aha, no i jeszcze jedno. Jak zmienić własny status np. z "Dostępny" na "Zaraz wracam"... np sieć gg. Tylko proszę o konkretny kod nie jakiś pseudo.
Bo zauważyłem że sporo tutaj tego jest, a to co sam próbowałem zrobić za pomocą SDK nic mi nie dało.

Proszę o pomoc.
dulek000
Co do wiadomości:
CODE
Konnekt::UI::Notify::_insertMsg ni(msg, display, scroll);
ni.act = sUIAction(IMIG_MSGWND, Konnekt::UI::ACT::msg_ctrlview, cntID);
UIActionCall(&ni);
ursus6
Zmiana statusu oraz opisu:

CODE

IMessage(IM_CHANGESTATUS, netgg, IMT_PROTOCOL, status, opis);
danielg
Status zrobiłem, poprawiłem też obsługę przychodzących wiadomość ( we własnym zakresie ), ale nie potrafię dotrzeć do problemu 1.

CODE

Konnekt::UI::Notify::_insertMsg ni(m, "", true);
ni.act = sUIAction( IMIG_MSGWND, Konnekt::UI::ACT::msg_ctrlview, *cntID* );
UIActionCall(&ni);


*cntID* - czy to jest id kontaktu od którego dostajemy wiadomość ?
jak go pobrać ? próbowałem już różnymi metodami np. GETCNTI, ale tam to jest CNT_UID a nie ID czy to to samo ?

Się w tym wszystkim kompletnie pogubiłem.
Mucha
To nie to samo, CNT_UID to np numer gg czy adres w tlenie. Cntid to identyfikator kontaktu dzięki któremu możesz pobrać takie rzeczy jak np CNT_UID. Jeśli chcesz znać cntid kontaktu od którego przyszła wiadomość w IM_MSG_RCV to robisz to np tak:
CODE
var
m: CMessagePtr;
...
CntId := ICMessage(IMC_FINDCONTACT,m^.net,Integer(m^.fromUid));
Zajrzyj do źródeł Cenzury lub Cenzury2, tam masz pokazane jak zrobić obsługę wiadomości przychodzących.
danielg
Wielkie dzięki! zmodyfikowałem to sobie na C++ wstawiłem w odpowiednią funkcję i działa smile.gif
Jeszcze trzeba poprawić żeby ta wiadomość nie była wypisywana wcześniej niż odpowiedź wysyłana przez kontakt... ale to już mniejszy problem ( chyba biggrin.gif )

Jeszcze raz wielkie dzięki za tak szybkie odpowiedzi!

Odezwę się jeszcze...
dulek000
QUOTE(danielg @ 14.01.2007 - 15:41) *

Jeszcze trzeba poprawić żeby ta wiadomość nie była wypisywana wcześniej niż odpowiedź wysyłana przez kontakt... ale to już mniejszy problem ( chyba biggrin.gif )

No niestety najprawdopodobniej się zdziwisz, było z tym kilka problemów. wink.gif Najprostsze rozwiązanie jakie mi przychodzi do głowy to oddzielny wątek, w którym odczekujesz sekundkę i dopiero dodajesz wiadomość.
Olórin
A może dodać tą wiadomość do kolejki, i dopiero gdy będzie ona przetwarzana przez kolejkę (czyli sami dostaniemy o niej info) dodać.
danielg
ahhh, ten problem jeszcze ujdzie, przepraszam ale normalnie jest wściekły, próbuję pobrać nazwę wyświetlną ( CNT_DISPLAY ) z kontaktu.
I tu ot kolejny problem mad.gif. Próbowałem już różnych kombinacji z GETCNTCA, ale za każdym razem pada konnekt.
Chciałem zastosować kAPI, ale są problemy przy kompilacji. Z resztą wolę nie używać takich dodatkowych bibliotek...
I znowu pytanie czy id kontaktu w GETCNTCA( a, b ) to jest a czy b ? bo już spotkałem się na forum z różnymi kolejnościami...
I czy muszę przy id znowu użyć ICMessage( IMC_FINDCONTACT, ... ) ?
Trochę to wszystko dziwne i pogmatwane. API powinno być chyba bardziej przejrzyste żeby tworzenie wtyczek było naprawdę łatwe i przyjemne wink.gif.
I może od razu się zapytam jak zablokować kontakt ?

to narazie tyle...

Przepraszam! Mój błąd problem już rozwiązałem, wszystko jest ok. zrobiłem tak...
CODE

char str[30];
const char *buf = GETCNTCA( ICMessage( IMC_FINDCONTACT, NET_GG, (int)lua_tostring( L, -1 ) ), CNT_DISPLAY );
strcpy( str, buf );
Ctrl->free( &buf );
Mucha
Prościej:
GETCNTC(cntid,CNT_DISPLAY)

EDIT
I pamiętaj że CNT_DISPLAY nie zawsze występuje (np jak kontakt jest spoza listy), wtedy pobierasz CNT_UID
danielg
Zapraszam na oficjalną stronę projektu botA smile.gif

Proszę o wszelkie uwagi i sugestie...

http://bota.wikidot.com
zhvir
moje pierwsze wrażenia:

Wtyczka się uruchomiła, nie było żadnego krytyka... smile.gif Zauważyłem dwie nowe ikonki w głównym oknie, najpierw zrobiłem z nimi porządek, przestawiłem je w odpowiednie miejsce i wziąłem się za konkretne testy. Oczywiście zacząłem od kliknięcia jednej i drugiej ikonki przy czym kliknięcie Edytuj nie wywołało pożądanej reakcji... plik main.lua nie otworzył się. Musiałem więc otworzyć plik ręcznie w notatniku. Na razie niewiele w nim kodu ale zauważyłem że bot powinien odpowiadać na cześć. Bot odpowiada tak jak powinien ale w oknie rozmowy K z włączonym botA najpierw wyświetlana jest odpowiedź bota a dopiero później wiadomość na którą bot odpowiedział... Druga ikonka restart chyba działa poprawnie, po kliknięciu pokazuje w knotify info o załadowaniu skryptu, jednak na razie nie sprawdziłem czy poprawnie odświeża skrypt po zmianach... I to by było na tyle. Ponadto nie widzę żadnych opcji botA w ustawieniach i przydałaby się możliwość włączania/wyłączania bota...

chyba szykuje się hit smile.gif

@down: prędzej czy później ktoś napisze wink.gif
keeveek
QUOTE
chyba szykuje się hit smile.gif


o ile ktoś kto się zna na lua napisze ogromny skrypt wink.gif
Suchy
Wszystko tak samo jak u zhvira. Ale jak np. ustawię sobie, żeby bot ripostował na "cześć" odpowiedzią "siema" i gdy się z kimś przywitam (ja pierwszy napiszę) np. 'witaj!", a ten ktoś odpisze mi "cześć" i bot w tym momencie wyśle "siema" to wyjdę na idiotę. Należałoby zrobić taką funkcję, że bot reaguje tylko wtedy, gdy nasz rozmówca rozpoczyna rozmowę.

@Down
Imo powinno być opcjonalnie, albo najlepiej, żeby można było w pliku ustawić, które funkcje mają działać kiedy nas nie ma, a które wtedy kiedy jesteśmy. (Się rozpędziłem x] )
zhvir
w ogóle bot powinien reagować tylko wtedy gdy nas nie ma przy kompie wink.gif
keeveek
no tak, jakieś podpięcie pod auto away by się przydało, bo tak to jednak niekoniecznie ma sens. oczywiście ręcznie włączanie bota też wskazane.
Aule
To może lepiej dać skryptom możliwość sprawdzania, czy away?
dulek000
Po prostu - skrypt musi mieć dostęp do wielkieeego API. wink.gif

Ale tak to dobra robota, wypadałoby tylko tego buga z odwrotną kolejnością mesegów poprawić. Spróbuj tego co Olórin proponował, tzn. dodawania tego powiadomienia do kolejki.
zhvir
brak odpowiedzi bota w historii rozmowy
danielg
QUOTE
kliknięcie Edytuj nie wywołało pożądanej reakcji

akcja tej ikonki to typowy ShellExecute( ... "open" ... "main.lua" ) należy najpierw ręcznie otworzyć plik i ustawić jakiś program jako domyślny najlepiej Notepad++, gdyż ma on podświetlenie składni lua. Dodam na stronę też własny styl do Notepad'a++ żeby kolorowane były też funkcje i zmienne typowe dla bota.

Nowa wersja: bota.wikidot.com z poprawionymi drobnymi usterkami + przyciski start/stop.

Nie mam pojęcia jak poprawić błąd kolejności wiadomości sad.gif proszę o jakąś konkretną pomoc wraz z kodem...
danielg
QUOTE
To może lepiej dać skryptom możliwość sprawdzania, czy away?


Jest taka możliwość ( czasem zwracała nieprawidłową wartość, teraz jest OK ) wystarczy użyć funkcji GetStatus
CODE

if GetStatus() == status.away then
     Send( id, "Jestem teraz zajęty odpiszę później..." )
end
keeveek
chodziło o to aby wtyczka działała TYLKO wtedy kiedy nas nie ma przy kompie, bo funkcję "sekretarki" spełnia już k.Away
danielg
Chyba czegoś tu nie rozumiem, albo kolega też mnie nie zrozumiał.
QUOTE
wtyczka działała TYLKO wtedy kiedy nas nie ma przy kompie


Co oznacza "nie ma nas przy kompie" ??

Dla mnie znaczy to tyle że jestem albo Niewidoczny, albo Zaraz wracam...
CODE

function onReceived( id, body )
    -- sprawdź czy "jesteśmy przy kompie"
    if GetStatus() ~= status.away and GetStatus() ~= status.hidden then
         return           -- jesteśmy przy kompie to wychodzimy ze skryptu
    end

    -- nie ma nas to tutaj podejmujemy jakieś akcje, np rozmowa z użytkownikiem
    
end


Nie potrzeba wyłączać całej wtyczki za każdym razem kiedy jesteśmy Dostępni, nie ma to większego sensu...
zhvir
autor sie nie odzywa, link do strony nie działa... :/
czy botA (bociK) jest rozwijane?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2012 Invision Power Services, Inc.