use gateway::InterMessage;
use model::prelude::*;
use super::{ShardClientMessage, ShardRunnerMessage};
use std::sync::mpsc::{SendError, Sender};
use websocket::message::OwnedMessage;
#[derive(Clone, Debug)]
pub struct ShardMessenger {
tx: Sender<InterMessage>,
}
impl ShardMessenger {
#[inline]
pub fn new(tx: Sender<InterMessage>) -> Self {
Self {
tx,
}
}
pub fn chunk_guilds<It>(
&self,
guild_ids: It,
limit: Option<u16>,
query: Option<String>,
) where It: IntoIterator<Item=GuildId> {
let guilds = guild_ids.into_iter().collect::<Vec<GuildId>>();
let _ = self.send(ShardRunnerMessage::ChunkGuilds {
guild_ids: guilds,
limit,
query,
});
}
pub fn set_game<T: Into<Game>>(&self, game: Option<T>) {
self._set_game(game.map(Into::into))
}
fn _set_game(&self, game: Option<Game>) {
let _ = self.send(ShardRunnerMessage::SetGame(game));
}
pub fn set_presence<T: Into<Game>>(
&self,
game: Option<T>,
status: OnlineStatus,
) {
self._set_presence(game.map(Into::into), status)
}
fn _set_presence(&self, game: Option<Game>, mut status: OnlineStatus) {
if status == OnlineStatus::Offline {
status = OnlineStatus::Invisible;
}
let _ = self.send(ShardRunnerMessage::SetPresence(status, game));
}
pub fn set_status(&self, mut online_status: OnlineStatus) {
if online_status == OnlineStatus::Offline {
online_status = OnlineStatus::Invisible;
}
let _ = self.send(ShardRunnerMessage::SetStatus(online_status));
}
pub fn shutdown_clean(&self) {
let _ = self.send(ShardRunnerMessage::Close(1000, None));
}
pub fn websocket_message(&self, message: OwnedMessage) {
let _ = self.send(ShardRunnerMessage::Message(message));
}
#[inline]
fn send(&self, msg: ShardRunnerMessage)
-> Result<(), SendError<InterMessage>> {
self.tx.send(InterMessage::Client(ShardClientMessage::Runner(msg)))
}
}