ai/src/friend.ts

177 lines
3.6 KiB
TypeScript
Raw Normal View History

2019-01-15 03:29:11 +00:00
import autobind from 'autobind-decorator';
2018-08-27 11:22:59 +00:00
import from './ai';
import IModule from './module';
2018-08-28 00:12:59 +00:00
import getDate from './utils/get-date';
import { User } from './misskey/user';
2020-08-25 01:08:27 +00:00
import { itemPrefixes, items, and } from './vocabulary';
2018-08-27 11:22:59 +00:00
export type FriendDoc = {
userId: string;
2018-08-28 00:12:59 +00:00
user: User;
2018-08-27 11:22:59 +00:00
name?: string;
love?: number;
lastLoveIncrementedAt?: string;
todayLoveIncrements?: number;
perModulesData?: any;
2019-02-01 17:06:51 +00:00
married?: boolean;
2020-08-25 01:08:27 +00:00
transferCode?: string;
2018-08-27 11:22:59 +00:00
};
export default class Friend {
private ai: ;
public get userId() {
return this.doc.userId;
}
public get name() {
return this.doc.name;
}
public get love() {
return this.doc.love || 0;
}
2019-02-01 17:06:51 +00:00
public get married() {
return this.doc.married;
}
2018-08-27 11:22:59 +00:00
public doc: FriendDoc;
2018-08-28 04:36:23 +00:00
constructor(ai: , opts: { user?: User, doc?: FriendDoc }) {
2018-08-27 11:22:59 +00:00
this.ai = ai;
if (opts.user) {
this.doc = this.ai.friends.findOne({
userId: opts.user.id
});
if (this.doc == null) {
this.doc = this.ai.friends.insertOne({
userId: opts.user.id,
user: opts.user
});
} else {
this.doc.user = opts.user;
this.save();
}
} else {
this.doc = opts.doc;
}
}
2019-01-15 03:29:11 +00:00
@autobind
public updateUser(user: User) {
2018-08-27 11:22:59 +00:00
this.doc.user = user;
this.save();
}
2019-01-15 03:29:11 +00:00
@autobind
public getPerModulesData(module: IModule) {
2018-08-27 11:22:59 +00:00
if (this.doc.perModulesData == null) {
this.doc.perModulesData = {};
this.doc.perModulesData[module.name] = {};
this.save();
} else if (this.doc.perModulesData[module.name] == null) {
this.doc.perModulesData[module.name] = {};
this.save();
}
return this.doc.perModulesData[module.name];
}
2019-01-15 03:29:11 +00:00
@autobind
public setPerModulesData(module: IModule, data: any) {
2018-08-27 11:22:59 +00:00
if (this.doc.perModulesData == null) {
this.doc.perModulesData = {};
}
this.doc.perModulesData[module.name] = data;
this.save();
}
2019-01-15 03:29:11 +00:00
@autobind
public incLove() {
2018-08-28 00:12:59 +00:00
const today = getDate();
2018-08-27 11:22:59 +00:00
if (this.doc.lastLoveIncrementedAt != today) {
this.doc.todayLoveIncrements = 0;
}
// 1日に上げられる親愛度は最大3
if (this.doc.lastLoveIncrementedAt == today && this.doc.todayLoveIncrements >= 3) return;
if (this.doc.love == null) this.doc.love = 0;
this.doc.love++;
2018-09-01 10:36:58 +00:00
// 最大 100
if (this.doc.love > 100) this.doc.love = 100;
2018-08-27 11:22:59 +00:00
this.doc.lastLoveIncrementedAt = today;
this.doc.todayLoveIncrements = (this.doc.todayLoveIncrements || 0) + 1;
this.save();
}
2019-01-15 03:29:11 +00:00
@autobind
public decLove() {
2018-09-01 10:36:58 +00:00
if (this.doc.love == null) this.doc.love = 0;
this.doc.love--;
// 最低 -30
if (this.doc.love < -30) this.doc.love = -30;
// 親愛度マイナスなら名前を忘れる
if (this.doc.love < 0) {
this.doc.name = null;
}
this.save();
}
2019-01-15 03:29:11 +00:00
@autobind
public updateName(name: string) {
2018-08-27 11:22:59 +00:00
this.doc.name = name;
this.save();
}
2019-01-15 03:29:11 +00:00
@autobind
public save() {
2018-08-27 11:22:59 +00:00
this.ai.friends.update(this.doc);
}
2020-08-25 01:08:27 +00:00
@autobind
public generateTransferCode(): string {
let code = '';
code += itemPrefixes[Math.floor(Math.random() * itemPrefixes.length)];
code += items[Math.floor(Math.random() * items.length)];
code += and[Math.floor(Math.random() * and.length)];
code += itemPrefixes[Math.floor(Math.random() * itemPrefixes.length)];
code += items[Math.floor(Math.random() * items.length)];
this.doc.transferCode = code;
this.save();
return code;
}
@autobind
public transferMemory(code: string): boolean {
const src = this.ai.friends.findOne({
transferCode: code
});
if (src == null) return false;
this.doc.name = src.name;
this.doc.love = src.love;
this.doc.married = src.married;
this.doc.perModulesData = src.perModulesData;
this.save();
// TODO: 合言葉を忘れる
return true;
}
2018-08-27 11:22:59 +00:00
}