| 'use strict'; |
| class BotMemory { |
| constructor(store) { |
| this._store = store; |
| this.known = new Map(); |
| this._greetCD = new Map(); |
| } |
|
|
| async load() { |
| try { |
| const d = await this._store.read('memory.json'); |
| if (d && d.players) { |
| for (const [k, v] of Object.entries(d.players)) this.known.set(k, v); |
| } |
| } catch (_) {} |
| } |
|
|
| async save() { |
| try { |
| const obj = { players: {} }; |
| for (const [k, v] of this.known) obj.players[k] = v; |
| await this._store.write('memory.json', obj); |
| } catch (_) {} |
| } |
|
|
| see(name) { |
| if (this.known.has(name)) { |
| this.known.get(name).lastSeen = Date.now(); |
| } else { |
| this.known.set(name, { firstSeen: Date.now(), greetCount: 0, lastSeen: Date.now(), actions: [] }); |
| } |
| } |
|
|
| isKnown(name) { return this.known.has(name); } |
|
|
| canGreet(name) { |
| const l = this._greetCD.get(name) || 0; |
| if (Date.now() - l < 30000) return false; |
| this._greetCD.set(name, Date.now()); |
| return true; |
| } |
|
|
| markGreeted(name) { |
| const p = this.known.get(name); |
| if (p) p.greetCount++; |
| } |
|
|
| recordAction(name, action) { |
| const p = this.known.get(name); |
| if (p) { |
| p.actions = p.actions || []; |
| p.actions.push({ a: action, t: Date.now() }); |
| if (p.actions.length > 20) p.actions.shift(); |
| } |
| } |
|
|
| knownCount() { return this.known.size; } |
|
|
| rememberInteraction(name, type) { |
| const p = this.known.get(name); |
| if (!p) return; |
| p.interactions = p.interactions || []; |
| p.interactions.push({ type, time: Date.now() }); |
| if (p.interactions.length > 50) p.interactions.shift(); |
| } |
|
|
| getPlayerProfile(name) { return this.known.get(name) || null; } |
| } |
| module.exports = { BotMemory }; |
|
|