import { EventEmitter } from 'events' import { Sayable, } from './config' import { Contact } from './contact' import { Message, MediaMessage, } from './message' import { StateMonitor } from './state-monitor' import { Room } from './room' // type ContactGetterFunc = { // (id: string): Promise // } /** * Abstract Puppet Class */ export abstract class Puppet extends EventEmitter implements Sayable { public userId: string | null public user: Contact | null public abstract getContact(id: string): Promise public state = new StateMonitor<'live', 'dead'>('Puppet', 'dead') constructor() { super() } public abstract async init(): Promise public abstract self(): Contact public abstract send(message: Message | MediaMessage): Promise public abstract say(content: string): Promise public abstract reset(reason?: string): void public abstract logout(): Promise public abstract quit(): Promise public abstract ding(): Promise /** * FriendRequest */ public abstract friendRequestSend(contact: Contact, hello?: string): Promise public abstract friendRequestAccept(contact: Contact, ticket: string): Promise /** * Room */ public abstract roomAdd(room: Room, contact: Contact): Promise public abstract roomDel(room: Room, contact: Contact): Promise public abstract roomTopic(room: Room, topic: string): Promise public abstract roomCreate(contactList: Contact[], topic?: string): Promise public abstract roomFind(filterFunc: string): Promise /** * Contact */ public abstract contactFind(filterFunc: string): Promise public abstract contactAlias(contact: Contact, alias: string|null): Promise }