hackmud-chat
Version:
A hackmud chat api wrapper for nodejs.
75 lines (66 loc) • 2.55 kB
text/typescript
import * as Debug from "debug";
import { ChannelMessage } from "./channel.message";
import { HackmudApi } from "./hackmud.api";
import { Message } from "./message";
import { PrivateMessage } from "./private.message";
import { User } from "./user";
const debug = Debug("hackmud-chat:account");
/**
* Represents a hackmud account with it's users.
*/
export class Account {
/**
* The users of the account.
*/
public users: User[];
private api: HackmudApi;
constructor(api: HackmudApi, users: User[]) {
this.api = api;
this.users = users;
}
/**
* Returns the account user from the given name.
* @param name The user name
*/
public getUserByName(name: string) {
return this.users.filter((x) => x.name === name)[0];
}
/**
* Get the new messages every interval specified by `frequency`.
* @param cb
* @param frequency
*/
public poll(cb: (messages: Message[]) => void, frequency: number = 1200) {
// It looks like its ignoring the interval
let time = (Date.now() / 1000);
return setInterval(async () => {
const messages = await this.api.getChats(this.users.map((x) => x.name), time);
let msgArr: Message[] = [];
for (const user in messages.chats) {
if (messages.chats[user]) {
for (const msg in messages.chats[user]) {
if (messages.chats[user][msg] && messages.chats[user][msg].channel) {
const msgInfo = messages.chats[user][msg];
const channel = this.users.filter((x) => x.name === user)[0]
.channels.filter((x) => x.name === messages.chats[user][msg].channel)[0];
msgArr.push(new ChannelMessage(this.users.filter((x) => x.name === user)[0], msgInfo.from_user,
msgInfo.msg, msgInfo.t, msgInfo.id,
channel, msgInfo.is_join || false,
msgInfo.is_leave || false));
} else if (messages.chats[user][msg]) {
const msgInfo = messages.chats[user][msg];
msgArr.push(new PrivateMessage(this.users.filter((x) => x.name === user)[0],
msgInfo.from_user, msgInfo.msg,
msgInfo.t, msgInfo.id, msgInfo.to_user));
}
}
}
}
msgArr = msgArr.sort((a, b) => a.t - b.t);
if (msgArr[msgArr.length - 1] && msgArr[msgArr.length - 1].t) {
time = msgArr[msgArr.length - 1].t + 0.01;
}
if (cb) { cb(msgArr); }
}, frequency);
}
}