Лучший способ получить аргументы из строки пользователем для чат-бота - PullRequest
0 голосов
/ 06 марта 2019

Мне нужно принять 2 аргумента: первый аргумент времени, например "1m", "2h 42m", "1d 23h 3s", второй текст.Я подумал, что могу просто преобразовать входную строку в массив и разделить ее на 2 массива с помощью регулярных выражений, может быть, сначала с помощью «d», «h», «m» и «s», затем все остальное и преобразовать обратно в строку.но потом я понимаю, что мне понадобится третий аргумент, который будет необязательным целевым каналом (дм или текущий канал, где была выполнена команда), а также что, если пользователь захочет включить 1 м в свой текст (это команда напоминания)

1 Ответ

0 голосов
/ 06 марта 2019

Самый простой способ сделать это состоит в том, чтобы пользователь разделял каждый аргумент запятой. Хотя это создает проблему, когда пользователь не может использовать запятую в своей текстовой части. Так что, если это не вариант, другой способ сделать это - получить содержимое сообщения и начать с его удаления. Вы начинаете с захвата части времени с помощью регулярного выражения. Затем вы ищите упоминания о каналах и удаляете их. То, что у вас осталось, должно быть только текстом.

Ниже приведен некоторый (не проверенный) код, который может привести вас в правильном направлении. Попробуйте и дайте мне знать, если у вас есть какие-либо проблемы

let msg = {
  content: "1d 3h 45m 52s I feel like 4h would be to long <#222079895583457280>",
  mentions: {
    channels: ['<#222079895583457280>']
  }
};

// Mocked Message object for testing purpose
let messageObject = {
  mentions: {
    CHANNELS_PATTERN: /<#([0-9]+)>/g
  }
}


function handleCommand (message) {
  let content = message.content;
  
  let timeParts = content.match(/^(([0-9])+[dhms] )+/g);
  let timePart = '';
  
  if (timeParts.length) {
    // Get only the first match. We don't care about others
    timePart = timeParts[0];
    
    // Removes the time part from the content
    content = content.replace(timePart, '');
  }
  
  // Get all the (possible) channel mentions
  let channels = message.mentions.channels;
  let channel = undefined;
  
  // Check if there have been channel mentions
  if (channels.length) {
    channel = channels[0];
    
    // Remove each channel mention from the message content
    let channelMentions = content.match(messageObject.mentions.CHANNELS_PATTERN);
    
    channelMentions.forEach((mention) => {
      content = content.replace(mention, '');
    })
  }
  
  console.log('Timepart:', timePart);
  console.log('Channel:', channel, '(Using Discord JS this will return a valid channel to do stuff with)');
  console.log('Remaining text:', content);
}

handleCommand(msg);

Для messageObject.mentions.CHANNEL_PATTERN посмотрите на эту ссылку

...