mirror of
https://github.com/syuilo/ai.git
synced 2024-11-22 05:08:00 +00:00
nannka
This commit is contained in:
parent
d7bbd58807
commit
e3140f06fd
|
@ -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)",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
106
src/modules/poll/index.ts
Normal 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,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -425,6 +425,8 @@ export default {
|
||||||
'ふみゃ〜',
|
'ふみゃ〜',
|
||||||
'ふぁ… ねむねむですー',
|
'ふぁ… ねむねむですー',
|
||||||
'ヾ(๑╹◡╹)ノ"',
|
'ヾ(๑╹◡╹)ノ"',
|
||||||
|
'私の"インスタンス"を周囲に展開して分身するのが特技です!\n人数分のエネルギー消費があるので、4人くらいが限界ですけど',
|
||||||
|
'うとうと...',
|
||||||
],
|
],
|
||||||
want: item => `${item}、欲しいなぁ...`,
|
want: item => `${item}、欲しいなぁ...`,
|
||||||
see: item => `お散歩していたら、道に${item}が落ちているのを見たんです!`,
|
see: item => `お散歩していたら、道に${item}が落ちているのを見たんです!`,
|
||||||
|
|
|
@ -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 = [
|
||||||
|
|
Loading…
Reference in a new issue