mirror of
https://github.com/syuilo/ai.git
synced 2024-11-23 21:47:58 +00:00
Merge 94d671af00
into 830c9c2ecd
This commit is contained in:
commit
57c041d64b
|
@ -17,6 +17,7 @@ import Stream from '@/stream.js';
|
|||
import log from '@/utils/log.js';
|
||||
import { sleep } from './utils/sleep.js';
|
||||
import pkg from '../package.json' assert { type: 'json' };
|
||||
import { Note } from '@/misskey/note.js';
|
||||
|
||||
type MentionHook = (msg: Message) => Promise<boolean | HandlerResult>;
|
||||
type ContextHook = (key: any, msg: Message, data?: any) => Promise<void | boolean | HandlerResult>;
|
||||
|
@ -361,7 +362,7 @@ export default class 藍 {
|
|||
*/
|
||||
@bindThis
|
||||
public async post(param: any) {
|
||||
const res = await this.api('notes/create', param);
|
||||
const res = await this.api<{ createdNote: Note }>('notes/create', param);
|
||||
return res.createdNote;
|
||||
}
|
||||
|
||||
|
@ -380,13 +381,13 @@ export default class 藍 {
|
|||
* APIを呼び出します
|
||||
*/
|
||||
@bindThis
|
||||
public api(endpoint: string, param?: any) {
|
||||
public api<ReturnType = unknown>(endpoint: string, param?: any) {
|
||||
this.log(`API: ${endpoint}`);
|
||||
return got.post(`${config.apiUrl}/${endpoint}`, {
|
||||
json: Object.assign({
|
||||
i: config.i
|
||||
}, param)
|
||||
}).json();
|
||||
}).json<ReturnType>();
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -17,9 +17,16 @@ type Config = {
|
|||
memoryDir?: string;
|
||||
};
|
||||
|
||||
import config from '../config.json' assert { type: 'json' };
|
||||
import uncheckedConfig from '../config.json' assert { type: 'json' };
|
||||
|
||||
function validate(config: unknown): Config {
|
||||
// TODO: as を使わずにしっかりと検証を行う
|
||||
return config as Config;
|
||||
}
|
||||
|
||||
const config = validate(uncheckedConfig);
|
||||
|
||||
config.wsUrl = config.host.replace('http', 'ws');
|
||||
config.apiUrl = config.host + '/api';
|
||||
|
||||
export default config as Config;
|
||||
export default config;
|
||||
|
|
|
@ -34,6 +34,7 @@ import NotingModule from './modules/noting/index.js';
|
|||
import PollModule from './modules/poll/index.js';
|
||||
import ReminderModule from './modules/reminder/index.js';
|
||||
import CheckCustomEmojisModule from './modules/check-custom-emojis/index.js';
|
||||
import { User } from '@/misskey/user.js';
|
||||
|
||||
console.log(' __ ____ _____ ___ ');
|
||||
console.log(' /__\\ (_ _)( _ )/ __)');
|
||||
|
@ -61,7 +62,7 @@ promiseRetry(retry => {
|
|||
json: {
|
||||
i: config.i
|
||||
}
|
||||
}).json().catch(retry);
|
||||
}).json<User>().catch(retry);
|
||||
}, {
|
||||
retries: 3
|
||||
}).then(account => {
|
||||
|
|
|
@ -8,6 +8,7 @@ import includes from '@/utils/includes.js';
|
|||
import or from '@/utils/or.js';
|
||||
import config from '@/config.js';
|
||||
import { sleep } from '@/utils/sleep.js';
|
||||
import { Note } from '@/misskey/note.js';
|
||||
|
||||
export default class Message {
|
||||
private ai: 藍;
|
||||
|
@ -61,20 +62,34 @@ export default class Message {
|
|||
this.friend = new Friend(ai, { user: this.user });
|
||||
|
||||
// メッセージなどに付いているユーザー情報は省略されている場合があるので完全なユーザー情報を持ってくる
|
||||
this.ai.api('users/show', {
|
||||
this.ai.api<User>('users/show', {
|
||||
userId: this.userId
|
||||
}).then(user => {
|
||||
this.friend.updateUser(user);
|
||||
});
|
||||
}
|
||||
|
||||
public async reply(text: string, opts?: {
|
||||
file?: any;
|
||||
cw?: string;
|
||||
renote?: string;
|
||||
immediate?: boolean;
|
||||
}): Promise<Note>;
|
||||
|
||||
public async reply(text: string | null, opts?: {
|
||||
file?: any;
|
||||
cw?: string;
|
||||
renote?: string;
|
||||
immediate?: boolean;
|
||||
}): Promise<void>;
|
||||
|
||||
@bindThis
|
||||
public async reply(text: string | null, opts?: {
|
||||
file?: any;
|
||||
cw?: string;
|
||||
renote?: string;
|
||||
immediate?: boolean;
|
||||
}) {
|
||||
}): Promise<Note | void> {
|
||||
if (text == null) return;
|
||||
|
||||
this.ai.log(`>>> Sending reply to ${chalk.underline(this.id)}`);
|
||||
|
|
|
@ -6,6 +6,27 @@ import { renderChart } from './render-chart.js';
|
|||
import { items } from '@/vocabulary.js';
|
||||
import config from '@/config.js';
|
||||
|
||||
type UserNotes = {
|
||||
diffs: {
|
||||
normal: number[],
|
||||
reply: number[],
|
||||
renote: number[]
|
||||
}
|
||||
};
|
||||
|
||||
type LocalRemotePair<T> = {
|
||||
local: T,
|
||||
remote: T
|
||||
};
|
||||
|
||||
type UserFollowing = LocalRemotePair<{
|
||||
followers: {
|
||||
total: number[]
|
||||
}
|
||||
}>;
|
||||
|
||||
type Notes = LocalRemotePair<UserNotes>
|
||||
|
||||
export default class extends Module {
|
||||
public readonly name = 'chart';
|
||||
|
||||
|
@ -48,7 +69,7 @@ export default class extends Module {
|
|||
let chart;
|
||||
|
||||
if (type === 'userNotes') {
|
||||
const data = await this.ai.api('charts/user/notes', {
|
||||
const data = await this.ai.api<UserNotes>('charts/user/notes', {
|
||||
span: 'day',
|
||||
limit: 30,
|
||||
userId: params.user.id
|
||||
|
@ -65,7 +86,7 @@ export default class extends Module {
|
|||
}]
|
||||
};
|
||||
} else if (type === 'followers') {
|
||||
const data = await this.ai.api('charts/user/following', {
|
||||
const data = await this.ai.api<UserFollowing>('charts/user/following', {
|
||||
span: 'day',
|
||||
limit: 30,
|
||||
userId: params.user.id
|
||||
|
@ -80,7 +101,7 @@ export default class extends Module {
|
|||
}]
|
||||
};
|
||||
} else if (type === 'notes') {
|
||||
const data = await this.ai.api('charts/notes', {
|
||||
const data = await this.ai.api<Notes>('charts/notes', {
|
||||
span: 'day',
|
||||
limit: 30,
|
||||
});
|
||||
|
|
|
@ -5,6 +5,12 @@ import config from '@/config.js';
|
|||
import serifs from '@/serifs.js';
|
||||
import { mecab } from './mecab.js';
|
||||
|
||||
type LocalTimeline = {
|
||||
userId: string;
|
||||
text: string | null;
|
||||
cw: string | null;
|
||||
}[];
|
||||
|
||||
function kanaToHira(str: string) {
|
||||
return str.replace(/[\u30a1-\u30f6]/g, match => {
|
||||
const chr = match.charCodeAt(0) - 0x60;
|
||||
|
@ -35,7 +41,7 @@ export default class extends Module {
|
|||
|
||||
@bindThis
|
||||
private async learn() {
|
||||
const tl = await this.ai.api('notes/local-timeline', {
|
||||
const tl = await this.ai.api<LocalTimeline>('notes/local-timeline', {
|
||||
limit: 30
|
||||
});
|
||||
|
||||
|
@ -47,7 +53,8 @@ export default class extends Module {
|
|||
let keywords: string[][] = [];
|
||||
|
||||
for (const note of interestedNotes) {
|
||||
const tokens = await mecab(note.text, config.mecab, config.mecabDic);
|
||||
// TODO: note.text に null チェックが必要?
|
||||
const tokens = await mecab(note.text as string, config.mecab, config.mecabDic);
|
||||
const keywordsInThisNote = tokens.filter(token => token[2] == '固有名詞' && token[8] != null);
|
||||
keywords = keywords.concat(keywordsInThisNote);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue