Ogłoszenie

Zwiń
No announcement yet.

Zapisywanie wiadomości do pliku .txt oraz zagnieżdżanie warunku.

Zwiń
X
 
  • Filtr
  • Czas
  • Pokaż
Wyczyść wszystko
new posts

    Zapisywanie wiadomości do pliku .txt oraz zagnieżdżanie warunku.

    Witam.
    Mam problem z zapisywaniem wiadomości wysyłanych do bota w plik .txt. Chciałbym, aby każda wiadomość była zapisywana w nowym wierszu. Świetnie byłoby, jakby jeszcze do tego był dodawany numer osoby piszącej. Problem polega na tym, że udaje mi się tylko zapisywać jedną linię ciągłą i takie coś jest kompletnie nieczytelne. Zrobiłem to tak:

    Kod php:
    $dane $HTTP_RAW_POST_DATA;
    $file "informacje.txt";
    $fp fopen($file"a+");
    fwrite($fp$dane);
    fclose($fp); 
    Potem próbowałem, aby każda wiadomość była w nowej linii dodając $HTTP_RAW_POST_DATA = "\n"; ale to jedynie skutkowało tworzeniu się nowych pustych linii.
    Nie wiem jak to rozwiązać.

    Od razu mam też drugie pytanie.
    Chciałem zrobić zagnieżdżanie warunków, gdzie spełnieniem warunku byłoby odpowiadanie na pytanie - coś w rodzaju quizu. Aby móc później to rozwinąć, na przykład za odpowiedź dać punkt chciałem rozbić switch, gdyż wcześniej na tym to opierałem. Wadą switcha jest to, że na przykład można było udzielić odpowiedzi na następne pytanie, a z warunkiem if wyobrażałem to sobie, że nie jest możliwe przejście do następnego pytania bez poprawnej odpowiedzi na aktualne. Również możliwe jest wtedy napisanie kilka wariantów odpowiedzi, tzn. że nie musi się akurat zaczynać wielką literą, bądź małą, czyli można to uwzględnić poprzez || w warunku.
    Przykład jak chciałem to rozwiązać, a nie wychodzi:
    Kod php:
    $początek "zaczynajmy";
    $początek2 "Zaczynajmy";
    $odp "tak";
    $odp2 "nie";
    if((
    $początek == $HTTP_RAW_POST_DATA) || ($początek2 == $HTTP_RAW_POST_DATA)) {
        
    $M->addText("Oczywiście. Czy ptaki latają? A. Nie \n B. Tak"); 
        
        
      if(
    $odp $HTTP_RAW_POST_DATA) {
        
    $M->addText("Dobrze. Następne pytanie...");
      }
        if( 
    $coś tam $HTTP_RAW_POST_DATA) {
          
    $M->addText("I tak dalej...");
        }
    }
    else {
        
    $M->addBBcode('Napisz [u]zaczynajmy[/u]');
        }; 
    Przy czym "zaczynamy" jakby rozpoczyna "moduł" quizu. Niestety to nie działa tak jak myślałem. Chyba zachodzi kolizja w $HTTP_RAW_POST_DATA. Domyślanie chciałem, aby po "zaczynamy" następowało pytanie. Udzieleniem dobrej odpowiedzi, a więc spełnienie następnego warunku przenosi do następnego pytania i następny warunek. A więc zagnieżdżone w sobie if.
    A może inaczej to rozwiązać? Może kombinacja if i switch?
    Dziękuję z góry.

    #2
    Jak już to robisz to z kropką
    Kod:
    $HTTP_RAW_POST_DATA [B].[/B]= "\n";
    Numer GG osoby wysyłającej wiadomość uzyskasz z $_GET['from'].

    Co do drugiego:
    a jak ktoś wpisze przypadkiem "ZAczynajmy" bo shifta nie puści na czas? :> Najlepiej zmienić wszystkie litery w $HTTP_RAW_POST_DATA na małe literki. strtolower Ci w tym pomoże. Nie zaszkodzi też dać trim na wynik funkcji, gdyż ktoś może przypadkiem wysłać białe znaki w wiadomości.
    Zagnieżdżanie ifaniewiele Ci pomoże bo musisz gdzieś przechowywać informację o stanie gry. Kiedy napiszę "Zaczynajmy" to wykonany jest skrypt od początku do końca, nie zatrzymuje się nigdzie i nie czeka aż udzielimy odpowiedzi. Obecnie wygląda to tak:
    Ja: Zaczynajmy
    Bot: Oczywiście. Czy ptaki latają? A. Nie \n B. Tak
    Ja: A
    Bot: Napisz zaczynajmy
    i bot na "A" nie odpowie tak jak powinien, bo gdy napiszę "A" to skrypt znowu wykonuje się od początku.

    Generalnie jeśli budujesz quiz to warto zrobić bazę pytań (np. w pliku) i losować je użytkownikowi. Dodatkowo gdzieś w bazie (lub pliku) przechowywać informację o tym na odpowiedź do którego pytania skrypt oczekuje przy danym użytkowniku np.
    Jeśli pisze GG:100, to wysłana odpowiedź dotyczy pytania nr. 123
    Ostatnio edytowany przez Qrix; [ARG:4 UNDEFINED].

    Komentarz


      #3
      Jak ogarniasz MySQL to ci nawet mogę taki skrypcik na Quiz podesłać. Akurat dzisiaj sb napisałem.
      W skrypcie jest tak:
      -Dodawanie zagadki wraz z odp(odp to jedno słowo ale można to zmienić).
      -Losowanie zagadki co 60 sekund,
      -Po dobrej odp losowanie zagadki,
      -Zagadka się zgadnie jeżeli w zdaniu pojawi się słowo z odpowiedzią.

      Komentarz


        #4
        Kod php:
        $dane $HTTP_RAW_POST_DATA " " $_GET['from'] . "\n"
        $file "informacje.txt";
        $fp fopen($file"a+");
        fwrite($fp$dane);
        fclose($fp); 
        Działa idealnie. Właśnie taki efekt chciałem osiągnąć. Nie wiem czemu sam na takie proste rozwiązanie nie wpadłem. Jeśli będzie naraz więcej osób korzystało z bota, to żeby nie było problemów z zapisywanie to trzeba zastosować blokowanie pliku przy zapisywaniu? Na przykład poprzez fclose($fp); Nie wiem czy to jest konieczne.
        Również strtolower działa poprawnie. Zastosowałem to w if przy $HTTP_RAW_POST_DATA.
        Kod php:
        if($początek == strtolower($HTTP_RAW_POST_DATA)) 
        Dzięki temu oszczędzi mi się wiele pisania. Dziękuję.

        Jednak będę musiał zrobić bazę pytań w pliku. Domyślam się, że wtedy każde pytanie w oddzielnej linii i losować po prostu linie. Wtedy też w oddzielnym pliku, jak wspomniał Qrix, odpowiedzi i zrobić warunek?
        Załóżmy, że tak:
        $linia_z_pliku = fgets($pytania); // to wyciągnie nam jedno pytanie (zakładające, że każde pytanie to oddzielna linia) z bazy pytań w pliku.
        To teraz jak zrobić losowanie? Jak użyję switch i rand to minie się z celem. Może użyć if z rand, ale jak losować wtedy linię i w dodatku przyporządkować dobrą odpowiedź do tego? Nie za bardzo wiem jak nad tym zapanować.

        Niestety nie ogarniam MySQL, ale będę chciał spróbować.

        Komentarz


          #5
          Najlepiej jeśli chociaż te logi (punkt pierwszy) zapisywać będziesz w bazie - nie będziesz musiał się bawić w blokowanie zapisu do pliku

          co do pytań w pliku to ja bym zrobił je w formie pliku PHP, gdzie pytania będą trzymane w tablicy. Przykładowo pytanie numer 3:
          Kod php:
          $pytanie[3]['tresc']='Stolicą Polski jest...';
          $pytanie[3]['podpowiedzi']='A: Warszawa, B: Wisła, C: Europa';
          $pytanie[3]['odpowiedz']='a'
          Pytania numerując od 0. Znając ich liczbę możesz wtedy losować sobie numer pytania:
          Kod php:
          $numerPytania=rand ILOSC_PYTAN );
          $M->addBBCode($pytanie[$numerPytania]['tresc']); 
          Taki plik z pytaniami zwyczajnie includujesz, np. include('pytania.php'); albo bardziej poprawnie w tym wypadku include_once('pytania.php');
          Ostatnio edytowany przez Qrix; [ARG:4 UNDEFINED].

          Komentarz


            #6
            Qurix a nie łatwiej byłoby stworzyć normalny plik txt i do niego zapisywać tablicę po serialize. ? W pliku php musiał by dodawac pytania manualnie a tak mogł by dodac je przez gg np. :p i w rand musi być o ile wiem $ilośc_pytan - 1 bo tablice liczone są od 0

            Komentarz


              #7
              Jakoś nie zależy mi na dodawaniu pytań przez GG. Baza pytań ewentualnie będzie lekko modyfikowana. Bardziej by mi zależało na zliczaniu punktów i tutaj może być chyba decydujące, czy w pliku, czy w skrypcie. Myślałem tak, że np. jak w pliku to do każdej odpowiedzi dopisywać ; i wtedy rozbijać tablicę do średnika, gdzie byłaby cyfra 1. Wtedy utworzyć funkcje function dodaj i jako argumenty dać wartości rozbite z tablicy i potem instrukcję dodającą te argumenty. Możliwe, że ja myślę teraz bardzo okrężnie i niepotrzebnie komplikuję sprawę. Co by oczywiście chyba wymagało kolejnego pliku, w którym byłby trzymany wynik typu "top 3".

              Jakoś nie za bardzo wyszło mi to co podałeś, Qrix. Coś muszę robić źle, albo nie zrozumiałem do końca.
              Utworzyłem bazę pytań z trzema przykładowymi pytaniami licząc od zera:
              Kod php:
              <?
                ///TABLICA PYTAŃ///
                 
                  $pytanie[0]['treść'] = 'Mickiewicz to:';
                  $pytanie[0]['warianty'] = 'A. Poeta, B. Pisarz, C. Kucharz, D. Lotnik';
                  $pytanie[0]['odpowiedź'] = 'a';
                  $pytanie[1]['treść'] = 'Polska to:';
                  $pytanie[1]['warianty'] = 'A. Kraj, B. Kontynent, C. Morze, D. Owoc';
                  $pytanie[1]['odpowiedź'] = 'a';
                  $pytanie[2]['treść'] = 'Treść pytania';
                  $pytanie[2]['warianty'] = 'A. WA, B. WB, C. WC, D. WD';
                  $pytanie[2]['odpowiedź'] = 'b';
              ?>
              Chyba, że to miałem stworzyć za pomocą array.
              W skrypcie głównym dołączyłem bazę za pomocą include_once. A potem skrypt do odtwarzania pytań:
              Kod php:
              $numerPytania=rand );
              $M->addBBCode($pytanie[$numerPytania]['tresc']); 
              Ale niestety nie daje to żadnego efektu. Mam jeszcze zdefiniować $numerPytania? Bo chyba coś brakuje.

              Komentarz


                #8
                Oczywiście Ruloo ma rację i w rand ilość pytań musisz pomniejszyć o 1 czyli
                Kod php:
                $numerPytania=rand ILOSC_PYTAN -); 
                a w Twoim konkretnym wypadku
                Kod php:
                $numerPytania=rand 2); 
                Błąd masz tutaj:

                $pytanie[0]['treść'] = 'Mickiewicz to:';

                $M->addBBCode($pytanie[$numerPytania]['tresc']);
                Po prostu nie używaj polskich znaków w indeksach tablicy lub przyjmij jakąś inną konwencję by Ci się nie myliło


                Jeśli chcesz zrobić ranking użytkowników, to bazą będzie łatwiej. W pliku możesz zrobić to w ten sposób w jaki podałeś, ale bezpieczniej będzie zapisywać i trzymać wyniki dla każdego użytkownika z osobna. Wtedy nie powinny pojawić się konflikty w dostępie do pliku gdy kilku użytkowników będzie korzystać z quizu, a i zapis wyników powinien być szybszy.
                Ostatnio edytowany przez Qrix; [ARG:4 UNDEFINED].

                Komentarz


                  #9
                  Po zamienieniu znaków polskich z indeksów tablicy działa tak jak zakładało się.
                  Tylko teraz nachodzi mnie kolejne pytanie. Skoro ma generować cały czas pytania, to jak zrobić warunek, żeby przy dobrej odpowiedzi generowało następne. Chyba danie warunku typu
                  Kod php:
                  if($HTTP_RAW_POST_DATA == $pytanie[$numerPytania]['odpowiedz'])
                      
                  $M->addText("dobrze"); 
                  za wiele nie da. Trzeba by było generować zaraz następne po wpisaniu dobrej odpowiedzi.

                  A może zastosować pętlę for? Wtedy będzie inicjacją wyświetlenie pytania, warunkiem podanie dobrej odpowiedzi, a zmianą spełnienie warunku. Czyli tak trochę na odwrót. Chyba coś pokręciłem.

                  Chodzi Tobie, że w bazie trzymać dla każdego z osoba? W sumie to tak...
                  Może doradzicie jakiś dobry poradnik/kurs MySQL internetowy? Jak spojrzałem na tę bazę to nie miałem pojęcia co i jak. Dodam, że tam mam phpAdmin. Albo może Wy pomożecie mi to pojąć?
                  Ostatnio edytowany przez Artyliusz; [ARG:4 UNDEFINED]. Powód: Pętla for

                  Komentarz


                    #10
                    Ciekawy kurs MySQL masz na tej stronie
                    Już niedługo...

                    Komentarz


                      #11
                      Ten kurs rzeczywiscie chyba jest najlepszy co nie zmiena faktu ze mogl by byc lepszy. Jezeli chvesz się czegos porządnie nauczyc to kup sb ksiąźkę a nie z kursow online.

                      Losowanie nowego pytania powinno byc w warunku
                      Kod php:
                       if($HTTP_RAW_POST_DATA == $pytanie[$numerPytania]['odpowiedz']){
                      $M->addText("dobrze");
                      Losowanie nowego pytania;

                      Komentarz


                        #12
                        Już częściowo korzystałem z tego kursu. Dobry jest do włączania SQL w kod PHP. Do phpAdmin są "lekcje" wideo w serwisie YouTube. Wczoraj się nauczyłem coś z nich. Ale i tak, jak się okazało, muszę zmienić hosting z CBA.pl na jakiś inny, gdyż nie obsługuje curl, co jest wymagane dla platformy BotApi. Wiem, że jest temat o polecanych hostingach, ale może coś się zmieniło? Na CBA zapłaciłem te niecałe 5 złotych za zdjęcie reklam, na darmo.

                        Wracając do kodu.
                        To co podałeś powoduje wyświetlenie się zdublowanych pytań. A jeśli się odpowie na pytanie dobrze poprzez np. wpisanie "a", to jeśli następne pytanie będzie też zawierało "a" jako poprawną odpowiedź to też będzie wiadomość "dobrze".
                        Mój kod wygląda tak:
                        Kod php:
                        $numerPytania=rand (0,2);
                        $M->addBBCode($pytanie[$numerPytania]['tresc']);  
                        $M->addBBCode($pytanie[$numerPytania]['warianty']);
                        if(
                        $HTTP_RAW_POST_DATA == $pytanie[$numerPytania]['odpowiedz']) {
                        $M->addText("\ndobrze");
                        $numerPytania=rand (0,2);

                        }
                        $M->addBBCode($pytanie[$numerPytania]['tresc']);  
                        $M->addBBCode($pytanie[$numerPytania]['warianty']);
                        if(
                        $HTTP_RAW_POST_DATA == $pytanie[$numerPytania]['odpowiedz']) {
                        $M->addText("\ndobrze");
                        $numerPytania=rand (0,2);

                        Z założenia ta sekwencja ma być powtarzana. Chyba, że miałem zagnieździć odpowiedzi. Oczywiście powinno być też else, gdzie przy złej odpowiedzi byłoby "źle" wyświetlane.
                        Ale Powyższy kod nie działa tak jak w założeniu.

                        Komentarz


                          #13
                          Musisz gdzieś zapisac do pliku txt odpowiedź bądz numer zagadki i wtedy z zytywac wedlug tego. Do tego twoj kod jest zle skonstruowany poniweż będzie losował zagadke podczas każdego napisania na bota. Dlatego mówiłem żeby najlepiej z mysql bo wtedy zmieniasz wartość wybranego pytania na jeden i zapisujesz czas jego wylosowania. I wtedy podczas napisania na bota skrypt sprawdza czy czas obecny minus iles tam minut jest większy od czasu wyslania tamtego pytania, jezeli tak to losuje nowe pytanie, jeżeli nie to sprawdza odpowiedz zagadki z wartiscią 1(zagadka wylosowana), jezeli odpowiedz się zgadza to pisze okej, dodaje userowi punkt i losuje nowe pytanie i zmiena jego wartosci. Tak po krótce opisalem. Myślę że powinieneś zrozumieć
                          Ostatnio edytowany przez Wazniak96; [ARG:4 UNDEFINED].

                          Komentarz


                            #14
                            Jeśli sekwencja losowania pytania ma być w kodzie powtarzana, to opakuj ją w funkcję np: losujPytanie i wewnątrz funkcji dokonuj losowania. Pamiętaj o użyciu zmiennych lokalnych i globalnych (czyli takich, jakie mają być potem widoczne poza funkcją).

                            Jak już będziesz miał to zrealizowane jako funkcję, to po prostu ją wywołujesz w odpowiednim miejscu: przy starcie quizu lub po udzieleniu poprawnej odpowiedzi.

                            Komentarz


                              #15
                              Szczerze mówiąc nie za bardzo rozumiem.
                              Ale z tego co zrozumiałem mam utworzyć funkcję typu function losujPytanie() i wewnątrz tej funkcji utworzyć losowanie.
                              A więc tak to chyba będzie się przedstawiać:
                              Kod php:
                               function losujPytanie() 
                              {
                              $numerPytania=rand (0,2);

                              Chyba, że chodziło coś w rodzaju funkcji kompleksowej.
                              I wtedy takie coś
                              Kod php:
                              function losujPytanie($numerPytania=rand (0,2)) 
                              {
                              if(
                              $HTTP_RAW_POST_DATA == $pytanie[$numerPytania]['odpowiedz'])
                              $M->addText("dobrze");
                               } 
                              Chyba, że odwrotnie. W sumie to coś mi dzwoni, ale nie wiem, w którym kościele.

                              Po czasie wpadłem na takie rozwiązanie:
                              Kod php:
                              function losujPytanie($HTTP_RAW_POST_DATA$pytanie[$numerPytania]['odpowiedz'])
                              {
                              global 
                              $numerPytania=rand (0,2) = $HTTP_RAW_POST_DATA == $pytanie[$numerPytania]['odpowiedz'];
                              return 
                              $numerPytania

                              Parametrami będzie wiadomość od użytkownika i poprawna odpowiedź. Jeśli będzie zachodzić równość pomiędzy odpowiedzią udzieloną przez użytkownika, a tą znajdującą się w tablicy nastąpi losowanie następnego pytania, gdzie zmienna $numerPytania jest o zasięgu globalnym, gdyż nie występuje tylko w tej funkcji. Chociaż chyba zrobię tablicę asocjacyjną $GLOBALS. Mam nadzieję, że dobrze to zrozumiałem. Nie jestem jeszcze pewny do użycia return.
                              Jak się okazało nie funkcjonuje mi to.

                              Co do MySQL, to zamierzam użyć do przypisywaniu nicku do numeru i wyniku. Wynik chcę otrzymywać poprzez inkrementację. Do końca nie wiem jak to zrealizować, ale też nie zastanawiałem się głębiej nad tym.
                              Ostatnio edytowany przez Artyliusz; [ARG:4 UNDEFINED]. Powód: Sprawdzenie kodu.

                              Komentarz

                              Pracuję...
                              X