This commit is contained in:
syuilo 2020-09-12 19:46:33 +09:00
parent d7bbd58807
commit e3140f06fd
7 changed files with 139 additions and 1 deletions

View file

@ -13,6 +13,7 @@ Misskey用の日本語Botです。
{ {
"host": "https:// + あなたのインスタンスのURL (末尾の / は除く)", "host": "https:// + あなたのインスタンスのURL (末尾の / は除く)",
"i": "藍として動かしたいアカウントのアクセストークン", "i": "藍として動かしたいアカウントのアクセストークン",
"master": "管理者のユーザー名(オプション)",
"keywordEnabled": "キーワードを覚える機能 (MeCab が必要) を有効にする場合は true を入れる (無効にする場合は false)", "keywordEnabled": "キーワードを覚える機能 (MeCab が必要) を有効にする場合は true を入れる (無効にする場合は false)",
"chartEnabled": "チャート機能を無効化する場合は false を入れてください", "chartEnabled": "チャート機能を無効化する場合は false を入れてください",
"reversiEnabled": "藍とリバーシで対局できる機能を有効にする場合は true を入れる (無効にする場合は false)", "reversiEnabled": "藍とリバーシで対局できる機能を有効にする場合は true を入れる (無効にする場合は false)",

View file

@ -1,5 +1,5 @@
{ {
"_v": "1.1.2", "_v": "1.2.0",
"main": "./built/index.js", "main": "./built/index.js",
"scripts": { "scripts": {
"start": "node ./built", "start": "node ./built",

View file

@ -1,6 +1,7 @@
type Config = { type Config = {
host: string; host: string;
i: string; i: string;
master?: string;
wsUrl: string; wsUrl: string;
apiUrl: string; apiUrl: string;
keywordEnabled: boolean; keywordEnabled: boolean;

View file

@ -30,6 +30,7 @@ import MazeModule from './modules/maze';
import ChartModule from './modules/chart'; import ChartModule from './modules/chart';
import SleepReportModule from './modules/sleep-report'; import SleepReportModule from './modules/sleep-report';
import NotingModule from './modules/noting'; import NotingModule from './modules/noting';
import PollModule from './modules/poll';
console.log(' __ ____ _____ ___ '); console.log(' __ ____ _____ ___ ');
console.log(' /__\\ (_ _)( _ )/ __)'); console.log(' /__\\ (_ _)( _ )/ __)');
@ -82,6 +83,7 @@ promiseRetry(retry => {
new ChartModule(), new ChartModule(),
new SleepReportModule(), new SleepReportModule(),
new NotingModule(), new NotingModule(),
new PollModule(),
]); ]);
}).catch(e => { }).catch(e => {
log(chalk.red('Failed to fetch the account')); log(chalk.red('Failed to fetch the account'));

106
src/modules/poll/index.ts Normal file
View file

@ -0,0 +1,106 @@
import autobind from 'autobind-decorator';
import Message from '../../message';
import Module from '../../module';
import serifs from '../../serifs';
import { genItem } from '../../vocabulary';
import config from '../../config';
export default class extends Module {
public readonly name = 'poll';
@autobind
public install() {
setInterval(() => {
if (Math.random() < 0.1) {
this.post();
}
}, 1000 * 60 * 60);
return {
mentionHook: this.mentionHook,
timeoutCallback: this.timeoutCallback,
};
}
@autobind
private async post() {
const duration = 1000 * 60 * 30;
const polls = [ // TODO: Extract serif
['いちばん珍しそうなもの', 'みなさんは、どれがいちばん珍しいと思いますか? ヽ(・∀・)'],
['いちばん美味しそうなもの', 'みなさんは、どれがいちばん美味しいと思いますか? ヽ(・∀・)'],
['いちばん重そうなもの', 'みなさんは、どれがいちばん重いと思いますか? ヽ(・∀・)'],
['いちばん欲しいもの', 'みなさんは、どれがいちばん欲しいですか? ヽ(・∀・)'],
['無人島に持っていきたいもの', 'みなさんは、無人島にひとつ持っていけるとしたらどれにしますか? ヽ(・∀・)'],
];
const poll = polls[Math.floor(Math.random() * polls.length)];
const note = await this.ai.post({
text: poll[1],
poll: {
choices: [
genItem(),
genItem(),
genItem(),
genItem(),
],
expiredAfter: duration,
multiple: false,
}
});
// タイマーセット
this.setTimeoutWithPersistence(duration + 3000, {
title: poll[0],
noteId: note.id,
});
}
@autobind
private async mentionHook(msg: Message) {
if (!msg.or(['/poll']) || msg.user.username !== config.master) {
return false;
} else {
this.log('Manualy poll requested');
}
this.post();
return true;
}
@autobind
private async timeoutCallback({ title, noteId }) {
const note = await this.ai.api('notes/show', { noteId });
const choices = note.poll.choices;
let mostVotedChoice;
for (const choice of choices) {
if (mostVotedChoice == null) {
mostVotedChoice = choice;
continue;
}
// TODO: 同数一位のハンドリング
if (choice.votes > mostVotedChoice.votes) {
mostVotedChoice = choice;
}
}
if (mostVotedChoice.votes === 0) {
this.ai.post({ // TODO: Extract serif
text: '投票はありませんでした',
renoteId: noteId,
});
} else {
this.ai.post({ // TODO: Extract serif
cw: `${title}アンケートの結果発表です!`,
text: `結果は「${mostVotedChoice.text}」でした!`,
renoteId: noteId,
});
}
}
}

View file

@ -425,6 +425,8 @@ export default {
'ふみゃ〜', 'ふみゃ〜',
'ふぁ… ねむねむですー', 'ふぁ… ねむねむですー',
'ヾ(๑╹◡╹)ノ"', 'ヾ(๑╹◡╹)ノ"',
'私の"インスタンス"を周囲に展開して分身するのが特技です!\n人数分のエネルギー消費があるので、4人くらいが限界ですけど',
'うとうと...',
], ],
want: item => `${item}、欲しいなぁ...`, want: item => `${item}、欲しいなぁ...`,
see: item => `お散歩していたら、道に${item}が落ちているのを見たんです!`, see: item => `お散歩していたら、道に${item}が落ちているのを見たんです!`,

View file

@ -82,6 +82,14 @@ export const itemPrefixes = [
'ホログラフィックな', 'ホログラフィックな',
'油圧式', '油圧式',
'辛そうで辛くない少し辛い', '辛そうで辛くない少し辛い',
'焦げた',
'宇宙',
'電子',
'陽電子',
'量子力学的',
'シュレディンガーの',
'分散型',
'卵かけ',
]; ];
export const items = [ export const items = [
@ -207,6 +215,24 @@ export const items = [
'宇宙', '宇宙',
'素粒子', '素粒子',
'ごま油', 'ごま油',
'卵かけご飯',
'ダークマター',
'ブラックホール',
'太陽',
'石英ガラス',
'ダム',
'ウイルス',
'細菌',
'アーチ式コンクリートダム',
'重力式コンクリートダム',
'フラッシュバルブ',
'ヴィブラスラップ',
'オブジェ',
'原子力発電所',
'原子炉',
'エラトステネスの篩',
'ブラウン管',
'タキオン',
]; ];
export const and = [ export const and = [