Greasy Fork is available in English.

[bot-manager]botマネージャー ( feederチャット版 )

複数のbotを管理します。

// ==UserScript==
// @name         [bot-manager]botマネージャー ( feederチャット版 )
// @namespace    http://tampermonkey.net/
// @version      6.0
// @description  複数のbotを管理します。
// @author       You
// @match        *.x-feeder.info/*/
// @match        *.x-feeder.info/*/sp/
// @exclude      *.x-feeder.info/*/settings/**
// @require      https://greasyfork.org/scripts/373658-feeder-chat-library/code/feeder-chat-library.js?version=715078
// @require      https://greasyfork.org/scripts/387509-yaju1919-library/code/yaju1919_library.js?version=726702
// @require      https://greasyfork.org/scripts/387372-chatbot/code/Chatbot.js?version=726700
// @grant        GM.setValue
// @grant        GM.getValue
// ==/UserScript==
(function () {
  'use strict';
    const yaju1919 = yaju1919_library;
    const feeder = Feeder_Chat_Library;
    //---------------------------------------------------------------------------------
    let not_quote_flag = false, quote_log;
    const post = str => {
        feeder.toMultiInputForm(); // 強制的に複数行モードに変える
        const quote = Quote_flag() && !not_quote_flag && quote_log !== logId ? ">>"+logId+'\0' : "";
        quote_log = logId;
        not_quote_flag = false;
        if(str.length > 1000) return;
        feeder.post(quote + str);
    };
    //---------------------------------------------------------------------------------
    let logId = 0;
    const update = ()=>{ // 新しい発言内容の文字列を返す
        const topId = feeder.getPostId().top; // 一番上の投稿番号
        if(logId >= topId) return; // 投稿番号が小さかったら処理を終了
        logId = topId;
        const post = feeder.getPostInfo(topId,ableReadQuote_flag());
        const myName = feeder.getMyName();
        if(input_trip().length){ // トリップが設定されていたらそれ優先
            if(input_trip() === post.trip) return;
        }
        else if(post.name === myName) return; // 自分だったら処理を終了
        return { name: post.name, text: post.text, myName: myName };
    };
    const rand = array => array[Math.floor(Math.random() * array.length)]; // ランダムな要素を返す
    //---------------------------------------------------------------------------------
    let enter_log;
    const entered_array = [];
    const greet = () =>{ // 自動挨拶
        const r = feeder.getEnter();
        if(!r) return;
        const name = r.name;
        const id = name + r.join;
        if(id === enter_log) return;
        enter_log = id;
        if(name === feeder.getMyName()) return;
        not_quote_flag = true;
        let first_flag = false;
        if(entered_array.indexOf(r.name) === -1){
            if(r.name !== "名無し") entered_array.push(r.name);
            first_flag = true;
        }
        return r.join ? (
            first_flag ? rand([ // 初対面
                `${name}さん、はじめまして`,
                `${name}さんこんにちは`,
                `${name}さん、オッスオッス!`,
                `ご機嫌よう${name}さん`,
                `${name}さん、ゆっくりしていってね`,
                `グーテンモルゲン!${name}さん。`,
            ]) : rand([ // 2回目以降
                `${name}さん、おかえり`,
                `また来たの?${name}さん`,
                `【朗報】${name}さん帰還`,
                `お帰りなさいませ、${name}様`,
                `${name}さん久しぶり~`,
                `あら!いらっしゃいご無沙汰じゃないっすか!${name}さん`,
            ])
        ) : rand([ // 別れ
            `${name}さん、さようなら`,
            `バイバイ${name}さん`,
            `またね!${name}さん`,
            `${name}さん乙です。`,
            `Good Bye ${name}さん`,
            `${name}さん退室しちゃった。`,
        ]);
    };
    //---------------------------------------------------------------------------------
    const auto = () =>{ // 定期投稿
        not_quote_flag = true;
        return rand([
            '過疎',
            '放置',
            '退屈',
            '憂鬱だなぁ…',
            '暇だなー',
            '暇定期',
            '腹減った',
            '眠い',
            '腹痛い',
            'もうこんな時間か',
            '・・・',
            'しーん',
            'とりあえず何か発言してみる',
            '潮が引いたように静寂が訪れた',
            'そして誰もいなくなった・・・',
            'この時間帯は人いないのかな?',
            "近所の犬うるさい",
            "(・ω・)",
            "(-_-).zZ乙",
            "_(:3」∠)_",
            rand([ // 定期発狂
                "\( 'ω')/ウオオオオオアアアーーーッ!",
                "(っ'ヮ'c)ウゥッヒョオアアァアアアァ",
                "( ^o^)<ンンンンンンンンンンンンンンンwww",
            ]),
        ]);
    };
    //---------------------------------------------------------------------------------
    const UI = appendChatbotManager({
        update: update,
        post: post,
        greet: greet,
        auto: auto,
        //font: "lime", // 文字色の変更
        //back: "green" // 背景色の変更
    });
    const Quote_flag = yaju1919.appendCheckButton(UI,{title: "発言時引用"});
    const ableReadQuote_flag = yaju1919.appendCheckButton(UI,{title: "引用も読む"});
    const input_trip = yaju1919.appendInputText(UI.append("<br>"),{
        title: "trip",
        placeholder: "半角8文字",
        max: 8,
        save: "trip"
    });
})();