cuffeo/src/clients/slack.mjs
2019-11-16 07:54:04 +01:00

96 lines
2.2 KiB
JavaScript

import fetch from "flumm-fetch-cookies";
import EventEmitter from "events";
import ws from "ws";
export default class slack extends EventEmitter {
constructor(options) {
super();
this.options = options || {};
this.token = options.token || null;
this.set = this.options.set || "all";
this.network = "Slack";
this.api = `https://slack.com/api`;
this.socket = null;
this.server = {
set: this.set,
channel: null,
user: null,
wss: {
link: null,
socket: null
},
me: {}
};
return (async () => {
await this.connect();
return this;
})();
}
async connect() {
const res = await (await fetch(`${this.api}/rtm.connect?token=${this.token}`)).json();
if (!res.ok)
throw this.emit("data", ["error", res.description]); // more infos
this.server.me = {
id: res.self.id,
nickname: res.self.name,
};
this.server.wss.link = res.url;
this.server.team = res.team;
this.server.channel = res.channel;
this.server.wss.socket = new ws(this.server.wss.link, {
perMessageDeflate: false
});
this.server.wss.socket.on("error", error => {
console.error(error);
});
this.server.wss.socket.on("message", async data => {
data = JSON.parse(data);
if(data.type !== "message")
return false;
return this.emit("data", ["message", this.reply(data)]);
});
console.log(res);
}
async send(channel, text) {
return this.server.wss.socket.send(JSON.stringify({
type: "message",
channel: channel,
text: text
}));
}
reply(tmp) {
return {
type: "slack",
network: "Slack",
channel: tmp.channel, // get channelname
channelid: tmp.channel,
user: {
prefix: `${tmp.user}!${tmp.user}`, // get username
nick: tmp.user, // get username
username: tmp.user, // get username
account: tmp.user
},
self: this.server,
message: tmp.text,
time: ~~(Date.now() / 1000),
raw: tmp,
reply: msg => this.send(tmp.channel, msg),
replyAction: msg => this.send(tmp.channel, `Uwe ${msg}`),
replyNotice: msg => this.send(tmp.channel, msg)
};
}
}