/// <reference types="xmpp__jid" />
/// <reference types="node" />
import type { Bot } from './bot';
import { Logger } from './logger';
import type { Stanza, MessageStanza, PresenceStanza } from './stanza';
import type { Reference } from './reference';
import type { Handler } from './handlers/abstract';
import EventEmitter from 'events';
import { JID } from '@xmpp/jid';
import { RoomUser } from './user';
declare interface Room {
    on: (((event: 'room_joined', listener: (user: RoomUser) => void) => this) & ((event: 'room_parted', listener: (user: RoomUser) => void) => this) & ((event: 'room_nick_changed', listener: (user: RoomUser, previousJID: JID) => void) => this) & ((event: 'room_roster_initialized', listener: (OnlineUsers: RoomUser[]) => void) => this) & ((event: 'room_message', listener: (stanza: MessageStanza, fromUser: RoomUser) => void) => this) & ((event: 'room_mentionned', listener: (stanza: MessageStanza, fromUser: RoomUser) => void) => this) & ((event: 'room_command', listener: (command: string, parameters: string[], stanza: MessageStanza, fromUser: RoomUser) => void) => this));
    emit: (((event: 'room_joined', user: RoomUser) => boolean) & ((event: 'room_parted', user: RoomUser) => boolean) & ((event: 'room_nick_changed', user: RoomUser, previousJID: JID) => boolean) & ((event: 'room_roster_initialized', onlineUsers: RoomUser[]) => boolean) & ((event: 'room_message', stanza: MessageStanza, fromUser: RoomUser) => boolean) & ((event: 'room_mentionned', stanza: MessageStanza, fromUser: RoomUser) => boolean) & ((event: 'room_command', command: string, parameters: string[], stanza: MessageStanza, fromUser: RoomUser) => boolean));
}
declare class Room extends EventEmitter {
    protected readonly bot: Bot;
    protected readonly roomJID: JID;
    protected state: 'offline' | 'online';
    protected userJID: JID | undefined;
    protected readonly roster: Map<string, RoomUser>;
    readonly logger: Logger;
    protected readonly handlers: {
        [id: string]: Handler;
    };
    constructor(bot: Bot, roomJID: JID);
    reset(): void;
    isOnline(): boolean;
    onlineUserCount(): number;
    getOnlineUsers(): RoomUser[];
    get myNick(): string | undefined;
    get jid(): JID;
    join(nick: string): Promise<void>;
    part(): Promise<void>;
    changeNickname(nick: string): Promise<void>;
    sendGroupchat(msg: string, references?: Reference[]): Promise<void>;
    moderateMessage(stanza: MessageStanza, reason?: string): Promise<void>;
    receiveStanza(stanza: Stanza): void;
    receivePresenceStanza(stanza: PresenceStanza): void;
    protected receiveMessageStanza(stanza: MessageStanza): void;
    attachHandler(handler: Handler): void;
    detachHandlers(): void;
    getHandlerById(id: string): Handler | null;
    detachHandlerById(id: string): void;
}
export { Room, RoomUser };
