alternate implementation using Box<MessageSender> and clone
This commit is contained in:
parent
5b9f1610dd
commit
66180578d6
@ -1,8 +1,8 @@
|
|||||||
use {Channel, User};
|
use {Channel, User};
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub enum Event<'a> {
|
pub enum Event {
|
||||||
Message { sender: User<'a>, channel: Option<Channel<'a>>, content: String },
|
Message { sender: User, channel: Option<Channel>, content: String },
|
||||||
Join { channel: Channel<'a> },
|
Join { channel: Channel },
|
||||||
Quit { channel: Channel<'a> }
|
Quit { channel: Channel }
|
||||||
}
|
}
|
||||||
|
27
src/lib.rs
27
src/lib.rs
@ -79,27 +79,38 @@ impl Tenquestionmarks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Channel<'a> {
|
pub struct Channel {
|
||||||
name: String,
|
name: String,
|
||||||
description: String,
|
description: String,
|
||||||
topic: String,
|
topic: String,
|
||||||
send_function: &'a Fn(&Channel, &str)
|
sender: Box<MessageSender>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Channel<'a> {
|
impl Channel {
|
||||||
pub fn send (&self, message: &str) {
|
pub fn send (&self, message: &str) {
|
||||||
(self.send_function)(self, message);
|
self.sender.send_message(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct User<'a> {
|
pub struct User {
|
||||||
name: String,
|
name: String,
|
||||||
send_function: &'a Fn(&User, &str)
|
sender: Box<MessageSender>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> User<'a> {
|
impl User {
|
||||||
pub fn send (&self, message: &str) {
|
pub fn send (&self, message: &str) {
|
||||||
(self.send_function)(self, message);
|
self.sender.send_message(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait MessageSender : Sync + Send {
|
||||||
|
fn box_clone (&self) -> Box<MessageSender>;
|
||||||
|
fn send_message (&self, message: &str) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Clone for Box<MessageSender> {
|
||||||
|
fn clone (&self) -> Box<MessageSender> {
|
||||||
|
self.box_clone()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ use toml::Table;
|
|||||||
use event;
|
use event;
|
||||||
use std::sync::mpsc::Sender;
|
use std::sync::mpsc::Sender;
|
||||||
|
|
||||||
|
use MessageSender;
|
||||||
use User;
|
use User;
|
||||||
use Channel;
|
use Channel;
|
||||||
|
|
||||||
@ -29,6 +30,21 @@ impl DiscordPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct DiscordMessageSender {
|
||||||
|
name: String
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MessageSender for DiscordMessageSender {
|
||||||
|
fn box_clone (&self) -> Box<MessageSender> {
|
||||||
|
Box::new((*self).clone())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn send_message (&self, message: &str) {
|
||||||
|
println!("send to {:?}: {:?}", self.name, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Plugin for DiscordPlugin {
|
impl Plugin for DiscordPlugin {
|
||||||
fn produce_events<'a>(&'a self, sender: Sender<event::Event>) {
|
fn produce_events<'a>(&'a self, sender: Sender<event::Event>) {
|
||||||
let discord = Discord::from_bot_token(&self.token[..]).expect("Login failed");
|
let discord = Discord::from_bot_token(&self.token[..]).expect("Login failed");
|
||||||
@ -36,10 +52,10 @@ impl Plugin for DiscordPlugin {
|
|||||||
loop {
|
loop {
|
||||||
match connection.recv_event() {
|
match connection.recv_event() {
|
||||||
Ok(Event::MessageCreate(message)) => {
|
Ok(Event::MessageCreate(message)) => {
|
||||||
let author = User {
|
/*let author = User {
|
||||||
name: message.author.name,
|
name: message.author.name,
|
||||||
send_function: &(|user: &User, message: &str| {
|
sender: &(DiscordMessageSender {
|
||||||
println!("Send to {:?}: {:?}", user.name, message);
|
name: message.author.name
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -47,12 +63,12 @@ impl Plugin for DiscordPlugin {
|
|||||||
name: String::from("channel"),
|
name: String::from("channel"),
|
||||||
description: String::from(""),
|
description: String::from(""),
|
||||||
topic: String::from(""),
|
topic: String::from(""),
|
||||||
send_function: &(|channel: &Channel, message: &str| {
|
sender: &(DiscordMessageSender {
|
||||||
println!("Send to {:?}: {:?}", channel.name, message);
|
name: String::from("channel")
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
sender.send(event::Event::Message { sender: author, content: message.content, channel: Option::Some(channel) });
|
sender.send(event::Event::Message { sender: author, content: message.content, channel: Option::Some(channel) });*/
|
||||||
}
|
}
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
Err(discord::Error::Closed(code, body)) => {
|
Err(discord::Error::Closed(code, body)) => {
|
||||||
|
@ -4,12 +4,28 @@ use plugins::Plugin;
|
|||||||
use toml::Table;
|
use toml::Table;
|
||||||
|
|
||||||
use User;
|
use User;
|
||||||
|
use MessageSender;
|
||||||
|
|
||||||
use std::sync::mpsc::Sender;
|
use std::sync::mpsc::Sender;
|
||||||
use event::Event;
|
use event::Event;
|
||||||
|
|
||||||
pub struct StdinPlugin {}
|
pub struct StdinPlugin {}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct StdinMessageSender {
|
||||||
|
name: String
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MessageSender for StdinMessageSender {
|
||||||
|
fn box_clone (&self) -> Box<MessageSender> {
|
||||||
|
Box::new((*self).clone())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn send_message (&self, message: &str) {
|
||||||
|
println!("send to {:?}: {:?}", self.name, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl StdinPlugin {
|
impl StdinPlugin {
|
||||||
pub fn new (configuration: &Table) -> Box<Plugin> {
|
pub fn new (configuration: &Table) -> Box<Plugin> {
|
||||||
Box::new(StdinPlugin {})
|
Box::new(StdinPlugin {})
|
||||||
@ -20,8 +36,8 @@ impl Plugin for StdinPlugin {
|
|||||||
fn produce_events<'a>(&'a self, sender: Sender<Event>) {
|
fn produce_events<'a>(&'a self, sender: Sender<Event>) {
|
||||||
let user = User {
|
let user = User {
|
||||||
name: String::from("Dave"),
|
name: String::from("Dave"),
|
||||||
send_function: &(|user: &User, message: &str| {
|
sender: Box::new(StdinMessageSender {
|
||||||
println!("Send to {:?}: {:?}", user.name, message);
|
name: String::from("Dave")
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user