49 lines
No EOL
1.7 KiB
JavaScript
49 lines
No EOL
1.7 KiB
JavaScript
// this is a method to wait for someone to rejoin a voice channel
|
|
import { EventEmitter } from "events";
|
|
import { random } from "./misc.js";
|
|
|
|
class AwaitRejoin extends EventEmitter {
|
|
constructor(channel, anyone, memberID) {
|
|
super();
|
|
this.member = memberID;
|
|
this.anyone = anyone;
|
|
this.channel = channel;
|
|
this.rejoined = false;
|
|
this.ended = false;
|
|
this.bot = channel.guild ? channel.guild.shard._client : channel._client;
|
|
this.listener = (member, newChannel) => this.verify(member, newChannel);
|
|
this.bot.on("voiceChannelJoin", this.listener);
|
|
this.bot.on("voiceChannelSwitch", this.listener);
|
|
this.stopTimeout = setTimeout(() => this.stop(), 10000);
|
|
this.checkInterval = setInterval(() => this.verify({ id: memberID }, channel, true), 1000);
|
|
}
|
|
|
|
verify(member, channel, checked) {
|
|
if (this.channel.id === channel.id) {
|
|
if ((this.member === member.id && this.channel.voiceMembers.has(member.id)) || (this.anyone && !checked)) {
|
|
clearTimeout(this.stopTimeout);
|
|
this.rejoined = true;
|
|
this.stop(member);
|
|
return true;
|
|
} else if (this.anyone && (!checked || this.channel.voiceMembers.size > 1)) {
|
|
clearTimeout(this.stopTimeout);
|
|
this.rejoined = true;
|
|
this.stop(random(this.channel.voiceMembers.filter((i) => i.id !== this.bot.user.id && !i.bot)));
|
|
return true;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
stop(member) {
|
|
if (this.ended) return;
|
|
this.ended = true;
|
|
clearInterval(this.checkInterval);
|
|
this.bot.removeListener("voiceChannelJoin", this.listener);
|
|
this.bot.removeListener("voiceChannelSwitch", this.listener);
|
|
this.emit("end", this.rejoined, member);
|
|
}
|
|
}
|
|
|
|
export default AwaitRejoin; |