Dołącz do zespołu ekspertów! Backend lub Frontend Developer?

Sprawdź najnowsze oferty pracy naszego partnera - 8lines.io!

Problem z zapisaniem warunku

PHP/MYSQL  Założony przez  Qwizi.

Witam, piszę aktualnie plugin na bota pod dvz shoutbox, smiga wszystko ładnie tylko mam taki problem (nie wiem  czy wgl jest to wykonalne)

Otóż mam tak aktualnie (fragment)
function dvz_shoutbox_bot_action($data){
 global 
$db$mybb;
 if (
$mybb->settings['dvz_shoutbox_bot_on_action'])
 {
 if(
$data['text'] == "test")
 {
 
$query = array(
 
"id" => $data['id'],
 
"uid" => $mybb->settings['dvz_shoutbox_bot_id'],
 
"text" => "Testowa wiadomość",
 
"date" => TIME_NOW,
 
"modified" => "",
 
"ipaddress" => "",
 );
 
$db->insert_query("dvz_shoutbox"$query);
 }
 }


Działa to tak
   

I teraz wpadłem na taki pomysl aby zrobic tak jakby komendę !bot <pytanie> <odpowiedź>, która wysyłałaby to pytanie i odpowiedz do bazy danych. Tylko teraz własnie nie wiem za bardzo jak się za to zabrać, żeby po !bot pytanie wrzucało do 1 zmiennej a odpowiedz do drugiej. 
To odpowiada za sprawdzanie tekstu.

if($data['text'] == ""
Skoro masz całego stringa w jednej zmiennej to wystarczy go podzielić na dwa według jakiś wytycznych. Przykładowo, jeśli pytanie i odpowiedź jest w nawiasach < > możesz polecieć preg_match() i pokombinować z wyrażeniami regularnymi. Ale jeszcze łatwiej byłoby zmienić trochę syntax komendy na coś w stylu !bot | pytanie | odpowiedź wtedy wystarczyłoby:


$var = explode("|", $data['text']);
$var[1] // pytanie
$var[2] // odpowiedź
"Try not. Do... or do not. There is no try."
Poświęć 5 minut. Nie bądź ignorantem!  -  Jak zbadać element?
(21.09.2017, 19:07)ficus napisał(a): Skoro masz całego stringa w jednej zmiennej to wystarczy go podzielić na dwa według jakiś wytycznych. Przykładowo, jeśli pytanie i odpowiedź jest w nawiasach < > możesz polecieć preg_match() i pokombinować z wyrażeniami regularnymi. Ale jeszcze łatwiej byłoby zmienić trochę syntax komendy na coś w stylu !bot | pytanie | odpowiedź wtedy wystarczyłoby:


$var = explode("|", $data['text']);
$var[1] // pytanie
$var[2] // odpowiedź

No dobra, tylko jak zapisać warunek? Żeby było !bot | ciąg znaków | ciąg znaków
Wybacz, źle zrozumiałem istotę pytania. Można by utworzyć wyrażenie regularne dla tej formułki, ale problem zaczyna się trochę dalej - zakładając, że bot będzie miał więcej możliwości, komenda powinna zawierać akcję. W tym przypadku zawiera tylko parametry (pytanie i odpowiedź). 

Przykład: !bot addQuestion | ciąg znaków | ciąg znaków
Całość trafia do zmiennej $data['text'], wtedy możesz w warunku sprawdzić na kilka sposobów jaka komenda została użyta.

$str '!bot addQuestion | pytanie | odpowiedź';
if (
strpos($str'!bot addQuestion') === 0)
{
 
   $arr explode(' | '$str);
 
   var_dump($arr);
} else {
 
   echo 'brak komendy';


Czego wynikiem będzie:

array (size=3)
 
 0 => string '!bot addQuestion' (length=16)
 
 1 => string 'pytanie' (length=7)
 
 2 => string 'odpowiedź' (length=10

Albo od razu rozdzielać sobie stringa pobranego z czatu:

$str '!bot addQuestion | pytanie | odpowiedź';
$arr explode(' | '$str);

if(
$arr[0] === '!bot addQuestion') {
 
   echo 'yup';
} else {
 
   echo 'brak komendy';



Wtedy możesz machnąć np switcha w zależności od $arr[0].
"Try not. Do... or do not. There is no try."
Poświęć 5 minut. Nie bądź ignorantem!  -  Jak zbadać element?
(23.09.2017, 10:58)ficus napisał(a): Wybacz, źle zrozumiałem istotę pytania. Można by utworzyć wyrażenie regularne dla tej formułki, ale problem zaczyna się trochę dalej - zakładając, że bot będzie miał więcej możliwości, komenda powinna zawierać akcję. W tym przypadku zawiera tylko parametry (pytanie i odpowiedź). 

Przykład: !bot addQuestion | ciąg znaków | ciąg znaków
Całość trafia do zmiennej $data['text'], wtedy możesz w warunku sprawdzić na kilka sposobów jaka komenda została użyta.

$str '!bot addQuestion | pytanie | odpowiedź';
if (
strpos($str'!bot addQuestion') === 0)
{
 
   $arr explode(' | '$str);
 
   var_dump($arr);
} else {
 
   echo 'brak komendy';


Czego wynikiem będzie:

array (size=3)
 
 0 => string '!bot addQuestion' (length=16)
 
 1 => string 'pytanie' (length=7)
 
 2 => string 'odpowiedź' (length=10

Albo od razu rozdzielać sobie stringa pobranego z czatu:

$str '!bot addQuestion | pytanie | odpowiedź';
$arr explode(' | '$str);

if(
$arr[0] === '!bot addQuestion') {
 
   echo 'yup';
} else {
 
   echo 'brak komendy';



Wtedy możesz machnąć np switcha w zależności od $arr[0].

Zrobiłem tak 
else if($data['text'] = "!bot addQuestion | pytanie | odpowiedź")
 {
 
$arr explode(' | '$data['text']);
 if(
$arr[0] === '!bot addQuestion') {
 
$query = array(
 
  "id" => $data['id'],
 
  "uid" => $mybb->settings['dvz_shoutbox_bot_id'],
 
  "text" => "Podaj argumenty",
 
  "date" => TIME_NOW,
 
  "modified" => "",
 
  "ipaddress" => "",
 
  );
 
  $db->insert_query("dvz_shoutbox"$query);
 } else {
 
$query = array(
 
 "id" => $data['id'],
 
 "uid" => $mybb->settings['dvz_shoutbox_bot_id'],
 
 "text" => "Brak komendy",
 
 "date" => TIME_NOW,
 
 "modified" => "",
 
 "ipaddress" => "",
 );
 
$db->insert_query("dvz_shoutbox"$query);
 }
 } 
I jak wpisze byle co na sb, to wysyła $arr[0] Podaj argumenty
Taki fragment wyjęty z nie wiadomo czego nie jest zbyt pomocny. Pokaż całość tej funkcji jeśli to ma jakiś sens.  
Przede wszystkim:

(23.09.2017, 12:31)Qwizi napisał(a): I jak wpisze byle co na sb,
else if($data['text'] = "!bot addQuestion | pytanie | odpowiedź")

"Byle co" nie spełnia tego warunku. Pomijając fakt, że w warunku podałeś pełnego stringa uniemożliwiając wpisanie użytkownikowi czegokolwiek innego, to warunek nadal nie ma sensu skoro wewnątrz niego sprawdzasz drugi raz to samo. To tak jakbyś kupił banany, sprawdzał czy zakupiony towar to banan, a potem czy zakupiony towar to owoc.

Zakładam, że sprawdzasz już czy wiadomość do bota zawiera "!bot" na początku i dopiero potem przystępujesz dalej.
To następnie rozdziel stringa odebranego z czatu ($data['text']) na części, dzięki czemu $arr[0] zawsze będzie zawierało fragment !bot komenda (!bot możesz sobie na upartego wyciąć dodatkowo) dzięki czemu będziesz mógł rozpoznać jaką komendę wywołuje użytkownik.

Teraz, skoro znasz już samą komendę to możesz jechać switchem albo if else na zasadzie:

$arr = explode(' | ', $data['text']); // rozdzial stringa na czesci

//...początek warunku ktorego nie wkleiłeś
else if($arr[0] === '!bot addQuestion') // jeśli komenda to addQuestion
{
   $question = $arr[1]; // parametr 1 z tej komendy
   $answer = $arr[2]; // parametr 2 z tej komendy
   
   //zapytanie query wstawiające pytanie i odpowiedź do upragnionej tabeli
   //wyświetlenie na czacie informacji zwrotnej dla użytkownika
} else { // zwroc uwage, to już tylko else, nie else if

  //  wyświetlenie na czacie, że podana komenda nie istnieje
}

ps. w tej sytuacji WSZYSTKIE komendy na czacie powinny mieć podobny syntax - zaczynać się conajmniej od !bot jakaś_komenda | cokolwiek dalej.
"Try not. Do... or do not. There is no try."
Poświęć 5 minut. Nie bądź ignorantem!  -  Jak zbadać element?
Dziękuję, już wszystko zrozumiałem.



Użytkownicy przeglądający ten wątek:

2 gości