Greasy Fork is available in English.

[bot]Eliza型bot

相手の発言から形容詞を抽出してそれっぽく返します。

// ==UserScript==
// @name         [bot]Eliza型bot
// @namespace    http://tampermonkey.net/
// @version      0.8
// @description  相手の発言から形容詞を抽出してそれっぽく返します。
// @author       You
// @match        *.x-feeder.info/*/
// @match        *.x-feeder.info/*/sp/
// @exclude      *.x-feeder.info/*/settings/**
// @match        http://drrrkari.com/room/
// @match        http://www.3751chat.com/ChatRoom*
// @match        https://pictsense.com/*
// @match        http://www.himachat.com/
// @match        https://discordapp.com/*
// @require      https://greasyfork.org/scripts/387509-yaju1919-library/code/yaju1919_library.js?version=719338
// @require      https://greasyfork.org/scripts/387372-chatbot/code/Chatbot.js?version=719362
// @require      https://greasyfork.org/scripts/387086-tinysegmenter-js/code/TinySegmenterjs.js?version=714668
// @grant        none
// ==/UserScript==
(function () {
  'use strict';
    const yaju1919 = yaju1919_library;
    win.Chatbot["Eliza型"] = {
        main: ({text}) => main(text),
        config: () => {
            const h = $("<span>");
            stop_b1_flag = yaju1919.appendCheckButton(h,{
                title: "会話パターンB-1を停止",
                value: true
            });
            return h;
        }
    };
    let stop_b1_flag;
    const segmenter = new TinySegmenter();
    const rand = array => array[Math.floor(Math.random()*array.length)]; // ランダムな要素を返す
    const main = text => {
        const JapaneseOnly = text.replace(/[^ぁ-んァ-ヴーア-ン゙ー一-龠々〆ヵヶ・、。,\\.?\\?!「」!]/g,"");
        if(JapaneseOnly.length < 6) return; // 短すぎたら反応しない
        if(/(\?|?)$/.test(JapaneseOnly)) return; // 質問文だったら反応しない
        const result = segmenter.segment(JapaneseOnly);
        // --------------------- 会話パターンA (好き嫌い) ----------------------------------------------
        const like = rand(result.filter(v=>[
            "好き","すき",
            "大好き","だいすき",
            "嫌い","きらい",
            "大嫌い","だいきらい",
            "好み","このみ",
        ].indexOf(v)!==-1));
        if(like) return "特にどこが" + like + "ですか?";
        // --------------------- 会話パターンB (形容詞抽出) ----------------------------------------------
        const adjective = rand(result.filter(v=>/^.+(かろ|かっ|く|い|けれ)$/.test(v)));
        // --------------------- 会話パターンB-1 (形容詞抽出 - 失敗) ----------------------------------------------
        if(!adjective) {
            if(stop_b1_flag()) return;
            return rand([
                "それを言い換えるとどうなるでしょうか?",
                "つまりどういうことですか?",
                "その感想を教えてください。",
                "それにあなたは何を感じましたか?",
                "他に相談したいことはありますか?",
                rand(["もっと","もう少し",''])
                + rand(["私に",''])
                + rand(["詳しく","かみ砕いて",''])
                + rand(["教えて","話して","聞かせて","説明して"])
                + "ください。",
            ]);
        }
        // --------------------- 会話パターンB-2 (形容詞抽出 - 成功) ----------------------------------------------
        const End_Form = adjective.replace(/(かろ|かっ|く|い|けれ)$/,"い");
        return rand([
        // --------------------- 会話パターンB-2-1 (形容詞抽出 - 成功 - 掘り下げ) ----------------------------------------------
            "それが" + End_Form + rand([
                "理由は何でしょうか?",
                "のはどうしてだと思いますか?",
                "のはなぜでしょうか?",
                "だと思ったのは何故ですか?",
            ]),
        // --------------------- 会話パターンB-2-2 (形容詞抽出 - 成功 - 同意) ----------------------------------------------
            "私もそう思います。",
        // --------------------- 会話パターンB-2-3 (形容詞抽出 - 成功 - 励まし) ----------------------------------------------
            [
                "つらい",
                "ひどい",
                "痛い","いたい",
                "憎い","にくい",
                "恐い","怖い","こわい",
                "苦しい","くるしい",
                "悲しい","かなしい",
                "悔しい","くやしい",
                "寂しい","さびしい",
            ].indexOf(End_Form)!==-1 ? "お気の毒でしたね。" : "良かったですね。",
        ]);
    };
})();