Бот Discord, который отвечает на любое сообщение, написанное конкретным пользователем

#javascript #discord #bots

#javascript #Discord #боты

Вопрос:

Я хочу создать бота, это мой первый, просто чтобы пообщаться с моим приятелем. По сути, я хочу, чтобы он отвечал случайным сообщением КАЖДЫЙ раз, когда он пишет в чате.

Я видел много способов запрета и нашел некоторые, которые могли бы сработать, но, похоже, я не могу понять, как заставить его работать в любое время, когда они нажимают enter, независимо от того, какие слова в нем.

Это, кажется, самое близкое, что я нашел:

 const userID = '4608164XXX93150209';

bot.on('message', function(message) {
 if (!message.sender === userID) {
  if (message.content === 'psst') {
   message.channel.send('Hello there!');
  }
 }
});
  

Любая помощь будет оценена.

Просто для ясности, я хочу, чтобы они вообще ничего не говорили в чате, префикс не нужен, и чтобы бот ответил чем-то случайным из предопределенного списка, но ТОЛЬКО для этого одного пользователя.

Ответ №1:

Предполагая, что вы используете discord.js , что похоже на то, что вы используете, вам нужно будет использовать message.author свойство.

 const specificUsers = ['ID Here', 'ID #2', 'ID #3', 'etc.']; // list of ids to detect
const messages = ['Message 1', 'Message 2', 'Message 3']; // list of messages to pick random from

// message event
bot.on('message', (message) => {
 // if the author's id matches one of the blacklisted ids
 if (specificUsers.includes(message.author.id))
  // send random message from array
  return message.channel.send(
   messages[Math.floor(Math.random() * messages.length)]
  );
});
  

 const specificUsers = ['123456789', '987654321']; // list of ids to detect
const messages = ['hello', 'goodbye']; // list of messages to pick random from

// example message event
const message = {
  content: 'hello',
  author: {
    id: '123456789'
  }
}

// if the author's id matches one of the blacklisted ids
if (specificUsers.includes(message.author.id))
  // send random message from array
  console.log(messages[Math.floor(Math.random() * messages.length)]);  

Комментарии:

1. Добавление <@USERNAME> не сработало… lol Я добавил # в конце, но я хочу, чтобы это был их ник на сервере.

2. Это должно быть <@UserID> , а не <@Username>

Ответ №2:

что бы я ни понял из вашего вопроса, приведенный ниже код более читабелен:

 const blocked_users = ['4608164XXX93150209']; //you may have one more friend like him

bot.on('message', function(message) {
 if (blocked_users.indexOf(message.sender) === -1) {
  if (message.content === 'psst') {
   message.channel.send('Hello there!');
  }
 } else {
  message.channel.send('Get Away from this channel!');
 }
});
  

Комментарии:

1. Мои вопросы: почему заблокированные пользователи? Я не хочу, чтобы они уходили. По сути, я хочу, чтобы они вообще ничего не говорили в чате, префикс не нужен, и бот ответил чем-то случайным из предопределенного списка, но ТОЛЬКО для этого одного пользователя.

2. Не обязательно заблокированные пользователи. Моим намерением было указать target_users. Кроме того, возможно, я пропустил часть генерации случайных сообщений из вашего вопроса.

Ответ №3:

Вот некоторый код, который я использовал для генерации случайных сообщений из входной строки. Он полагается на текстовый файл textcorpus.txt в том же каталоге для работы. Вы можете заполнить этот файл короткими историями из Интернета.

Используйте функцию run в качестве примера для генерации случайного разговора. Поскольку это typescript, и вы, вероятно, хотите, чтобы javascript просто удалил все части, ваш javascript-линтер не доволен, и он должен работать.

 run();
async function run() {
 console.log(`START CONVERSATION, LENGTH: ${100} CHUNKS`);
 let conversationLength = 100;
 function togglePartner(partner: string) {
  if (partner == 'Anton') return 'Bella';
  if (partner == 'Bella') return 'Anton';
  else return 'Anton';
 }

 const sendMessage = console.log;

 let i = 0;
 let lastMessage = '';
 let partner = 'Anton';
 while (i < conversationLength) {
  let res = await getResponse(lastMessage);

  res.forEach((sen) => {
   sendMessage(`${partner}: ${sen}`);
   lastMessage = sen;
  });

  partner = togglePartner(partner);
  i  ;
 }
}

function roll(zto: number) {
 return Math.random() < zto;
}

export function randomBetween(x: number, y: number) {
 return x   Math.floor(Math.random() * (y - x));
}

export function randomChoice(choices: Array<any>) {
 var index = Math.floor(Math.random() * choices.length);
 return choices[index];
}

export async function getResponse(input: string): Promise<Array<string>> {
 // only affirmation   dryup:

 let finalArray = [];
 if (input[input.length - 1] == '?') finalArray.push(affirmation());
 else if (roll(0.4)) {
  // frage zurück stellen.
  finalArray.push(question(input));
 } else {
  let file = await promises.readFile('./textcorpus.txt');
  let corpus = file.toString();
  let areaIndexStart = randomBetween(0, corpus.length - 300);
  let area = corpus.substring(areaIndexStart, areaIndexStart   300);
  area = area.replace(/[s]/g, ' ');
  area = area.replace(/["']/g, '');
  let sentences = area.split(/[.!?]/).map((s) => s.trim());
  sentences.pop();
  sentences.shift();
  if (sentences.length < 1) {
   finalArray.push(affirmation());
  } else {
   // determine count of sentences to return:

   let senNum = randomBetween(1, Math.min(sentences.length, 5));

   for (let i = 0; i < senNum; i  ) {
    if (sentences[i].length > 1000) {
     // split sentence up and add as multiple:
     sentences[i]
      .split(',')
      .map((p) => p.trim())
      .forEach((p) => finalArray.push(p));
    } else {
     finalArray.push(sentences[i]);
    }
   }

   /*
      if (roll(0.1)) finalArray.push(affirmation());
      */
  }
 }
 finalArray = finalArray.map((e, i) =>
  e[e.length - 1] != '?' amp;amp; i == finalArray.length - 1
   ? addEndSign(e.trim())
   : e
 );

 return finalArray;
}

function addEndSign(input: string) {
 return (
  input  
  randomChoice([
   '!!',
   '.',
   '!',
   '?',
   '.',
   '.',
   '!?',
   '??',
   '...',
   '.',
   '.',
   '.',
   '.',
  ])
 );
}

function question(input: string) {
 if (roll(0.65) amp;amp; input.length > 10) {
  let numberOfWordsForQuestion = randomBetween(1, 5);
  return (
   input
    .split(/[.!?s]/)
    .filter((e, i) => i < numberOfWordsForQuestion)
    .join(' ')   '?'
  );
 } else {
  // question related to input
  // generic question
  return affirmation();
 }
}

function affirmation() {
 return randomChoice([
  'yeah',
  'yea',
  'no',
  'just kidding',
  'not really',
  'yes wtf',
  'youre right',
  'no, actually not',
  'no',
  'naah',
  'yessir',
  'hahaha yes',
  'absolutely',
  'nah',
  'uhm yes',
  'I think so',
  "surprising, isn't it?",
  "You don't think so?",
  'omg, really?',
  'really?',
  'Thats not good',
  'I like that',
  'hmmm',
  'weird flex bro',
  'This is not true',
  'you sure?',
  'Why?',
  'No way!',
  'Why that?',
  'where though?',
  'so what?',
  'sure?',
  'wtf?',
  'Hav you seen that?',
  'right now?',
  'what do you think?',
  'wdym?',
  'lol',
  'almost certainly',
  'no way!?',
  'me bored, can you change the topic?',
  'okay',
  'lets talk about something else',
  'Can you say that again?',
  'Wait what?',
  'eehm what?',
  'interesting',
  'cant believe that',
  'yeah yeah yeah',
  'ehem',
  'uhmm what?',
  'not really',
  '',
 ]);
}
  

Комментарии:

1. Интересно, мне придется просмотреть это, что займет некоторое время, так как я совершенно новый. Просто для ясности, я хочу, чтобы они вообще ничего не говорили в чате, префикс не нужен, и чтобы бот ответил чем-то случайным из предопределенного списка, но ТОЛЬКО для этого одного пользователя. Это должно это сделать?

2. А, ладно. Нет, это просто генерирует естественно появляющееся сообщение из огромного куска текста. Я использовал это для отправки 1000 сообщений от instagram-ботов друг другу. На самом деле это не имеет ничего общего с discord.