Greasy Fork is available in English.

[bot]しりとり

しりとり機能を実装します。

// ==UserScript==
// @name         [bot]しりとり
// @version      2.6
// @description  しりとり機能を実装します。
// @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=719796
// @require      https://greasyfork.org/scripts/387372-chatbot/code/Chatbot.js?version=719787
// @grant        GM.setValue
// @grant        GM.getValue
// @grant        GM.xmlHttpRequest
// @namespace https://greasyfork.org/users/263519
// ==/UserScript==
(()=>{
    'use strict';
    const yaju1919 = yaju1919_library;
    let g_superSay, g_name, flag, interval_time, first_flag, win_counter;
    const interval = () => {
        //---敗北判定------------------------------------------------------------------------------------------------------------------
        if(!flag || !serious_flag || first_flag) return;
        const now = new Date().getTime();
        if(now - interval_time > timeLimit()*1000) {
            flag = false;
            g_superSay([`時間切れ!`].concat(makeLoseText(`${timeLimit()}秒以内に答えられなかった`)));
        }
        //---------------------------------------------------------------------------------------------------------------------
    };
    setInterval(interval,1000);
    const makeLoseText = reason => [`${reason}ので${g_name}さんの負けです。`,"なんで負けたか、明日まで考えといてください。"];
    const main = ({text,wait,name}) => {
        if(flag){
            if(first_flag){ // 一番最初
                first_flag = false;
                interval_time = new Date().getTime();
            }
            g_name = name;
            g_superSay = wait();
            const f = word => {
                yaju1919.get("http://siritori.net/apis/you",{
                    json:{
                        word: yaju1919.toHira(word),
                        name: name
                    },
                    success: r => {
                        if(!flag) return;
                        if(/が付いたので.*の負けです|しりとりは既に終了しました|まだしりとりを始めていません/.test(r)){
                            flag = false;
                            return g_superSay(makeLoseText(`「ん」が付いた`));
                        }
                        else if(serious_flag){
                            if(!/始まる言葉を入力|発言は既|言葉はひらがなで入力/.test(r)) {
                                interval_time = new Date().getTime();
                                win_counter++;
                            }
                        }
                        const ar = [r];
                        if(serious_flag && win_counter >= timeWin()){
                            flag = false;
                            ar.push("ゲームクリア!");
                            ar.push(`${timeWin()}回答えられたので${name}さんの勝利です!`);
                        }
                        g_superSay(ar);
                    },
                    fail: r => {
                        if(g_superSay) g_superSay(null);
                    }
                });
            };
            toHira_API(text,f);
            //if(!toHira_API().length) return f(text);
            /*yaju1919.post("https://labs.goo.ne.jp/api/hiragana",{
                json:{
                    app_id: toHira_API(),
                    sentence: text,
                    output_type: "hiragana"
                },
                success: r => {
                    g_API_holder.find("input").css("background-color","white");
                    f(JSON.parse(r).converted);
                },
                fail: () => {
                    g_API_holder.find("input").css("background-color","pink");
                    f(text);
                }
            });*/
        }
        else {
            let m = /^しりとり$/.test(text);
            if(!m) m = /しりとりを?(やろ|しよ|(始|はじ)めよ)う?/.test(text);
            if(!m) m = /しりとりを?(やり|し|(始|はじ)め)(ましょう?|ませんか?)/.test(text);
            if(m) {
                flag = true;
                first_flag = true;
                win_counter = 0;
                yaju1919.get("http://siritori.net/apis/delete");
                const ar = [];
                ar.push("今からしりとりを始めます。");
                //if(!toHira_API().length) text +=`漢字は読めないのでひらがなカタカナで答えてください。`;
                if(serious_flag) {
                    ar.push(`勝利条件は${timeWin()}回答えることです。`);
                    ar.push(`敗北条件は${timeLimit()}秒以内に答えられないことです。`);
                }
                ar.push(`${name}さんからどうぞ。`);
                return ar;
            }
        }
    };
    yaju1919.get("http://siritori.net/apis/delete");
    let serious_flag = true, timeLimit, timeWin;//, toHira_API, g_API_holder;
    const setConfig = () => {
        const h = $("<div>");
        yaju1919.appendCheckButton(h,{
            title: "対戦モード",
            value: serious_flag,
            change: bool => {
                serious_flag = bool;
                set_hh();
            }
        });
        const hh = $("<div>").appendTo(h);
        const set_hh = () => serious_flag ? hh.show() : hh.hide();
        set_hh();
        timeWin = yaju1919.appendInputNumber(hh,{
            title: "勝利条件",
            explain: "[回]",
            min: 0,
            value: 10,
            save: "勝利条件",
        });
        timeLimit = yaju1919.appendInputNumber(hh,{
            title: "敗北条件",
            explain: "[秒]",
            min: 0,
            value: 30,
            save: "敗北条件",
        });
        hh.children().each((i,e)=>$(e).after("<br>"));
        /*g_API_holder = $("<span>").appendTo(h);
        toHira_API = yaju1919.appendInputText(g_API_holder,{
            title: "ひらがな化API",
            explain: "ここにAPIキーを入力",
            save: "API_key"
        });*/
        return h;
    };
    win.Chatbot["しりとり"] = {
        main: main,
        config: setConfig,
        priority: 9
    };
    const toHira_API = (text,callback) => {
        yaju1919.post("https://www.webtoolss.com/ajax/frigana.php",{
            json:{
                sentence: text,
                grade: ""
            },
            success: r => {
                let str = '';
                $(r).find("Word").each((i,e)=>{
                    str += $(e).find("Furigana").first().text();
                });
                callback(str);
            },
            fail: () => callback(text)
        });
    };
})();