IndexOf i dwie tablice

0

Witam, mam problem pewien problem z chat botem do twitcha. Chciałbym, aby odpisywał "Witaj :) . Wylosowałem: LOSOWA_LICZBA" po każdej wiadomości, która w treści będzie miała chociaż jeden element z tablicy dKeywords i chociaż jeden element z tablicy dKeywords1. Próbowałem z array.some();, ale nie wychodzi mi. Jestem, jak widać, zielony i nie ogarniam zbytnio jsa. Męczyłem się z tym ponad 8 godzin, więc pomyślałem, że poproszę o pomoc.

const tmi = require('tmi.js');

const opts = {
  identity: {
		username: "**********",
		password: "**********"
  },
	channels: ["**********", "**********", "**********", "**********", "**********"]

};

const client = new tmi.client(opts);

client.on('message', onMessageHandler);
client.on('connected', onConnectedHandler);

client.connect();

function onMessageHandler (target, context, msg, self) 
{ 
  if (self) { return; } // Ignore messages from the bot

  const aha = msg.toLowerCase();
  const commandName = aha.trim();
  
  const dKeywords1 = ['cześć', 'siema'];
  const dKeywords = ['123', '456'];
  

  if (commandName.indexOf(dKeywords1) !== -1 && commandName.indexOf(dKeywords) !== -1)
  {
    const num = rollDice();
	client.say(target, `Witaj :) . Wylosowałem: ${num}`);
    console.log(`* Wykonano`);
  }
  else
  {
	   console.log(`* ${commandName}`);
  }
  }

function rollDice () {
  const sides = 100;
  return Math.floor(Math.random() * sides) + 1;
}

function onConnectedHandler (addr, port) {
  console.log(`* Connected to ${addr}:${port}`);
}

1
xyz Luffy napisał(a):

Chciałbym, aby odpisywał "Witaj :) . Wylosowałem: LOSOWA_LICZBA" po każdej wiadomości, która w treści będzie miała chociaż jeden element z tablicy dKeywords i chociaż jeden element z tablicy dKeywords1.

Ten akapit nie ma sensu, albo jest on głęboko ukryty :(
Nie mam pojęcia co chcesz zrobić i w zależności od jakich warunków.

0
Freja Draco napisał(a):
xyz Luffy napisał(a):

Chciałbym, aby odpisywał "Witaj :) . Wylosowałem: LOSOWA_LICZBA" po każdej wiadomości, która w treści będzie miała chociaż jeden element z tablicy dKeywords i chociaż jeden element z tablicy dKeywords1.

Ten akapit nie ma sensu, albo jest on głęboko ukryty :(
Nie mam pojęcia co chcesz zrobić i w zależności od jakich warunków.

-Bot rejestruje wszystkie wiadomości wysłane na czacie - jest to już w kodzie i działa
-Gdy pojawia się wiadomość, która posiada przynajmniej jeden element z tablicy dKeywords oraz przynajmniej jeden element z tablicy dKeywords1 - wtedy wysyła na czat tę wiadomość:"Witaj :) . Wylosowałem: LOSOWA_LICZBA"

(Ta wiadomość musi zawierać choć jeden element z tych dwóch tablic, wtedy wysyła tę wiadomość.)

2

Najpierw odnośnie indexOf, działa on tak:

nazwa_tablicy.indexOf("szukane_słowo")
nazwa_tablicy.indexOf(zmienna_zawierajaca_szukane_slowo)

Musisz więc zamiast tego:

if (commandName.indexOf(dKeywords1) !== -1 && commandName.indexOf(dKeywords) !== -1)
// rozbić string na tablicę ze słowami
var TabCommandName = commandName.split(" ");
 
// i przelecieć pętlą całą tabelę, np:
var posiada_element_z_dKeywords = 0;
var posiada_element_z_dKeywords1 = 0;
for (x=0; x++; x<TabcommandName.lenght) {
  if (dKeywords.indexOf(TabCommandName[x]) !==-1) posiada_element_z_dKeywords = 1;
  if (dKeywords1.indexOf(TabCommandName[x]) !==-1) posiada_element_z_dKeyword1 = 1;
}
 
if ((posiada_element_z_dKeywords == 1) && (posiada_element_z_dKeywords == 1)) {
  // zrób co tam trzeba
}

Napisane z palca bez testowania, ale chyba pokazuje o co chodzi?

0

Niestety, dalej nie działa.
Jedyne co zmieniłem to:

if (dKeywords1.indexOf(TabCommandName[x]) !==-1) posiada_element_z_dKeyword1 = 1;
w tej linijce dodałem 's' po 'Keyword'
for (x=0; x++; x<TabcommandName.lenght) {
w tej linijce zamiast 'c' wstawiłem 'C'

Zamiast tego:

// rozbić string na tablicę ze słowami
var TabCommandName = commandName.split(" ");
 
// i przelecieć pętlą całą tabelę, np:
var posiada_element_z_dKeywords = 0;
var posiada_element_z_dKeywords1 = 0;

for (let x=0; x++; x<TabCommandName.lenght) 
{
  if (dKeywords.indexOf(TabCommandName[x]) !==-1) 
  {
	  posiada_element_z_dKeywords = 1;
  }
  if (dKeywords1.indexOf(TabCommandName[x]) !==-1) 
  {
	  posiada_element_z_dKeywords1 = 1;
  }
}
 
if ((posiada_element_z_dKeywords == 1) && (posiada_element_z_dKeywords == 1)) {
	 const num = rollDice();
  	client.say(target, `za 15 minut B)`);
    console.log(`WIADOMOŚĆ`);
}

Wstawiłem:

if (commandName.indexOf('siema')) 
{
	 const num = rollDice();
  	client.say(target, `WIADOMOŚĆ`);
    console.log(`wiadomosc`);
}

i zadziałało więc gdzieś w DRUGIM kodzie problem
2
xyz Luffy napisał(a):

Niestety, dalej nie działa.

Bo były jeszcze trzy głupie błędy, lenght -> length, niepoprawnie zdefiniowana pętla i dwukrotne sprawdzanie posiada_element_z_dKeywords z zagubieniem posiada_element_z_dKeywords1.

Masz sprawdzony, działający demonstrator.
Tylko trzeba dopisać jeszcze jakąś instrukcję zamieniającą w badanej sekwencji kropki, przecinki itp według schematu:
"." -> " .".


const dKeywords1 = ['cześć', 'siema'];
const dKeywords = ['123', '456'];

commandName = "szła pchła koło wody."
commandName = "szła pchła koło wody 123 siema ."

//-------------------------

var TabCommandName = commandName.split(" ");
// i przelecieć pętlą całą tabelę, np:
var posiada_element_z_dKeywords = 0;
var posiada_element_z_dKeywords1 = 0;

for (x=0; x<TabCommandName.length; x++) {
  if (dKeywords.indexOf(TabCommandName[x]) !==-1) posiada_element_z_dKeywords = 1;
  if (dKeywords1.indexOf(TabCommandName[x]) !==-1) posiada_element_z_dKeywords1 = 1;
}

alert(posiada_element_z_dKeywords +"-"+ posiada_element_z_dKeywords1);
 
if ((posiada_element_z_dKeywords == 1) && (posiada_element_z_dKeywords1 == 1)) {
  alert("jest");
} else {
  alert("nie ma");
}
0
Freja Draco napisał(a):
xyz Luffy napisał(a):

Niestety, dalej nie działa.

Bo były jeszcze trzy głupie błędy, lenght -> length, niepoprawnie zdefiniowana pętla i dwukrotne sprawdzanie posiada_element_z_dKeywords z zagubieniem posiada_element_z_dKeywords1.

Masz sprawdzony, działający demonstrator.
Tylko trzeba dopisać jeszcze jakąś instrukcję zamieniającą w badanej sekwencji kropki, przecinki itp według schematu:
"." -> " .".


const dKeywords1 = ['cześć', 'siema'];
const dKeywords = ['123', '456'];

commandName = "szła pchła koło wody."
commandName = "szła pchła koło wody 123 siema ."

//-------------------------

var TabCommandName = commandName.split(" ");
// i przelecieć pętlą całą tabelę, np:
var posiada_element_z_dKeywords = 0;
var posiada_element_z_dKeywords1 = 0;

for (x=0; x<TabCommandName.length; x++) {
  if (dKeywords.indexOf(TabCommandName[x]) !==-1) posiada_element_z_dKeywords = 1;
  if (dKeywords1.indexOf(TabCommandName[x]) !==-1) posiada_element_z_dKeywords1 = 1;
}

alert(posiada_element_z_dKeywords +"-"+ posiada_element_z_dKeywords1);
 
if ((posiada_element_z_dKeywords == 1) && (posiada_element_z_dKeywords1 == 1)) {
  alert("jest");
} else {
  alert("nie ma");
}

Ufff...
Nareszcie działa, musiałem jeszcze zdefiniować x w pętli for i gotowe.
Dzięki bardzo za pomoc, do zamknięcia

1 użytkowników online, w tym zalogowanych: 0, gości: 1