Skip to content

Instantly share code, notes, and snippets.

@olegrewko
Created July 19, 2020 14:55
Show Gist options
  • Save olegrewko/998ea9a850cc78e9d513a439079c0a87 to your computer and use it in GitHub Desktop.
Save olegrewko/998ea9a850cc78e9d513a439079c0a87 to your computer and use it in GitHub Desktop.
SimpleChatBot_02
import javax.swing.*;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.regex.Pattern;
class SimpleChatBot extends JFrame implements ActionListener {
final String TITLE_OF_PROGRAM = "Chatter: simple chatbot";
final int START_LOCATION = 200;
final int WINDOW_WIDTH = 350;
final int WINDOW_HEIGHT = 450;
final String CHB_AI = "AI";
final String BTN_ENTER = "Enter";
JTextPane dialogue; // area for dialog
JCheckBox ai; // enable/disable AI
JTextField message; // field for entering messages
// chat-bot class (in bot package)
SimpleBot sbot; // chat-bot class (in bot package)
SimpleAttributeSet botStyle; // style bot text
public static void main(String[] args) {
new SimpleChatBot();
}
/**
* Constructor:
* Creating a window and all the necessary elements on it
*/
SimpleChatBot() {
setTitle(TITLE_OF_PROGRAM);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(START_LOCATION, START_LOCATION, WINDOW_WIDTH, WINDOW_HEIGHT);
// area for dialog
dialogue = new JTextPane();
dialogue.setEditable(false);
dialogue.setContentType("text/html");
JScrollPane scrollBar = new JScrollPane(dialogue);
// style for bot messages
botStyle = new SimpleAttributeSet();
StyleConstants.setItalic(botStyle, true);
StyleConstants.setForeground(botStyle, Color.blue);
//StyleConstants.setAlignment(botStyle, StyleConstants.ALIGN_RIGHT);
// panel for checkbox, message field and button
JPanel bp = new JPanel();
bp.setLayout(new BoxLayout(bp, BoxLayout.X_AXIS));
ai = new JCheckBox(CHB_AI);
ai.doClick();
message = new JTextField();
message.addActionListener(this);
JButton enter = new JButton(BTN_ENTER);
enter.addActionListener(this);
// adding all elements to the window
bp.add(ai);
bp.add(message);
bp.add(enter);
add(BorderLayout.CENTER, scrollBar);
add(BorderLayout.SOUTH, bp);
setVisible(true);
sbot = new SimpleBot(); // creating bot object
}
/**
* Listener of events from message field and enter button
*/
@Override
public void actionPerformed(ActionEvent event) {
if (message.getText().trim().length() > 0) {
try {
StyledDocument doc = dialogue.getStyledDocument();
doc.insertString(doc.getLength(), message.getText() + "\n",
new SimpleAttributeSet());
doc.insertString(doc.getLength(),
TITLE_OF_PROGRAM.substring(0, 9) +
sbot.sayInReturn(message.getText(), ai.isSelected()) + "\n",
botStyle);
} catch (Exception e) {
}
}
message.setText("");
message.requestFocusInWindow();
}
}
class SimpleBot {
final String[] COMMON_PHRASES = {
"Нет ничего ценнее слов, сказанных к месту и ко времени.",
"Порой молчание может сказать больше, нежели уйма слов.",
"Перед тем как писать/говорить всегда лучше подумать.",
"Вежливая и грамотная речь говорит о величии души.",
"Приятно когда текст без орфографических ошибок.",
"Многословие есть признак неупорядоченного ума.",
"Слова могут ранить, но могут и исцелять.",
"Записывая слова, мы удваиваем их силу.",
"Кто ясно мыслит, тот ясно излагает.",
"Боюсь Вы что-то не договариваете."};
final String[] ELUSIVE_ANSWERS = {
"Вопрос непростой, прошу тайм-аут на раздумья.",
"Не уверен, что располагаю такой информацией.",
"Может лучше поговорим о чём-то другом?",
"Простите, но это очень личный вопрос.",
"Не уверен, что Вам понравится ответ.",
"Поверьте, я сам хотел бы это знать.",
"Вы действительно хотите это знать?",
"Уверен, Вы уже догадались сами.",
"Зачем Вам такая информация?",
"Давайте сохраним интригу?"};
final Map<String, String> PATTERNS_FOR_ANALYSIS = new HashMap<String, String>() {{
// hello
put("хай", "hello");
put("привет", "hello");
put("здорово", "hello");
put("здравствуй", "hello");
// who
put("кто\\s.*ты", "who");
put("ты\\s.*кто", "who");
// name
put("как\\s.*зовут", "name");
put("как\\s.*имя", "name");
put("есть\\s.*имя", "name");
put("какое\\s.*имя", "name");
// howareyou
put("как\\s.*дела", "howareyou");
put("как\\s.*жизнь", "howareyou");
// whatdoyoudoing
put("зачем\\s.*тут", "whatdoyoudoing");
put("зачем\\s.*здесь", "whatdoyoudoing");
put("что\\s.*делаешь", "whatdoyoudoing");
put("чем\\s.*занимаешься", "whatdoyoudoing");
// whatdoyoulike
put("что\\s.*нравится", "whatdoyoulike");
put("что\\s.*любишь", "whatdoyoulike");
// iamfeelling
put("кажется", "iamfeelling");
put("чувствую", "iamfeelling");
put("испытываю", "iamfeelling");
// yes
put("^да", "yes");
put("согласен", "yes");
// whattime
put("который\\s.*час", "whattime");
put("сколько\\s.*время", "whattime");
// bye
put("прощай", "bye");
put("увидимся", "bye");
put("до\\s.*свидания", "bye");
}};
final Map<String, String> ANSWERS_BY_PATTERNS = new HashMap<String, String>() {{
put("hello", "Здравствуйте, рад Вас видеть.");
put("who", "Я обычный чат-бот.");
put("name", "Зовите меня Чаттер :)");
put("howareyou", "Спасибо, что интересуетесь. У меня всё хорошо.");
put("whatdoyoudoing", "Я пробую общаться с людьми.");
put("whatdoyoulike", "Мне нравиться думать что я не просто программа.");
put("iamfeelling", "Как давно это началось? Расскажите чуть подробнее.");
put("yes", "Согласие есть продукт при полном непротивлении сторон.");
put("bye", "До свидания. Надеюсь, ещё увидимся.");
}};
Pattern pattern; // for regexp
Random random; // for random answers
Date date; // for date and time
public SimpleBot() {
random = new Random();
date = new Date();
}
public String sayInReturn(String msg, boolean ai) {
String say = (msg.trim().endsWith("?")) ?
ELUSIVE_ANSWERS[random.nextInt(ELUSIVE_ANSWERS.length)] :
COMMON_PHRASES[random.nextInt(COMMON_PHRASES.length)];
if (ai) {
String message =
String.join(" ", msg.toLowerCase().split("[ {,|.}?]+"));
for (Map.Entry<String, String> o : PATTERNS_FOR_ANALYSIS.entrySet()) {
pattern = Pattern.compile(o.getKey());
if (pattern.matcher(message).find())
if (o.getValue().equals("whattime")) return date.toString();
else return ANSWERS_BY_PATTERNS.get(o.getValue());
}
}
return say;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment