import { Channel } from "./objects/Channel"; import { ConsoleHelper } from "../ConsoleHelper"; import { FunkyArray } from "./objects/FunkyArray"; import { DataStreamArray } from "./objects/DataStreamArray"; import { User } from "./objects/User"; const osu = require("osu-packet"); export class ChatManager { public chatChannels:FunkyArray = new FunkyArray(); public forceJoinChannels:FunkyArray = new FunkyArray(); public streams:DataStreamArray; public constructor(streams:DataStreamArray) { this.streams = streams; } public AddChatChannel(name:string, description:string, forceJoin:boolean = false) : Channel { const stream = this.streams.CreateStream(`chat_channel:${name}`, false); const channel = new Channel(`#${name}`, description, stream); this.chatChannels.add(channel.name, channel); if (forceJoin) { this.forceJoinChannels.add(name, channel); } ConsoleHelper.printChat(`Created chat channel [${name}]`); return channel; } public AddSpecialChatChannel(name:string, streamName:string, forceJoin:boolean = false) : Channel { const stream = this.streams.CreateStream(`chat_channel:${streamName}`, false); const channel = new Channel(`#${name}`, "", stream); this.chatChannels.add(channel.name, channel); if (forceJoin) { this.forceJoinChannels.add(name, channel); } ConsoleHelper.printChat(`Created chat channel [${name}]`); return channel; } public RemoveChatChannel(channel:Channel | string) { if (channel instanceof Channel) { channel.stream.Delete(); this.chatChannels.remove(channel.stream.name); this.forceJoinChannels.remove(channel.stream.name) } else { const chatChannel = this.GetChannelByName(channel); if (chatChannel instanceof Channel) { chatChannel.stream.Delete(); this.chatChannels.remove(chatChannel.stream.name); this.forceJoinChannels.remove(chatChannel.stream.name) } } } public GetChannelByName(channelName:string) : Channel | undefined { return this.chatChannels.getByKey(channelName); } public ForceJoinChannels(user:User) { for (let channel of this.forceJoinChannels.getIterableItems()) { channel.Join(user); } } public SendChannelListing(user:User) { const osuPacketWriter = new osu.Bancho.Writer; for (let channel of this.chatChannels.getIterableItems()) { if (channel.isSpecial) { continue; } osuPacketWriter.ChannelAvailable({ channelName: channel.name, channelTopic: channel.description, channelUserCount: channel.userCount }); } user.addActionToQueue(osuPacketWriter.toBuffer); } }