events events blah blah
This commit is contained in:
parent
3c98969448
commit
590b38d9b0
@ -20,17 +20,29 @@ pub fn make_event_derive(input: TokenStream) -> TokenStream {
|
|||||||
|
|
||||||
let mut getters = Vec::new();
|
let mut getters = Vec::new();
|
||||||
let mut setters = Vec::new();
|
let mut setters = Vec::new();
|
||||||
|
let mut new_args = Vec::new();
|
||||||
|
let mut new_inits = Vec::new();
|
||||||
|
let mut has_cancelled_field = false;
|
||||||
|
|
||||||
if let Data::Struct(data) = input.data {
|
if let Data::Struct(data) = input.data {
|
||||||
if let Fields::Named(fields) = data.fields {
|
if let Fields::Named(fields) = data.fields {
|
||||||
for field in fields.named.iter() {
|
for field in fields.named.iter() {
|
||||||
let field_name = &field.ident;
|
let field_name = &field.ident;
|
||||||
let field_ty = &field.ty;
|
let field_ty = &field.ty;
|
||||||
|
|
||||||
|
if field_name.as_ref().map(|name| name == "cancelled").unwrap_or(false) {
|
||||||
|
has_cancelled_field = true;
|
||||||
|
} else {
|
||||||
|
new_args.push(quote! { #field_name: #field_ty });
|
||||||
|
new_inits.push(quote! { #field_name });
|
||||||
|
}
|
||||||
|
|
||||||
getters.push(quote! {
|
getters.push(quote! {
|
||||||
pub fn #field_name(&self) -> &#field_ty {
|
pub fn #field_name(&self) -> &#field_ty {
|
||||||
&self.#field_name
|
&self.#field_name
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if field.attrs.iter().any(|attr| attr.path().is_ident("setter")) {
|
if field.attrs.iter().any(|attr| attr.path().is_ident("setter")) {
|
||||||
let setter_name = format_ident!("set_{}", field_name.as_ref().unwrap());
|
let setter_name = format_ident!("set_{}", field_name.as_ref().unwrap());
|
||||||
setters.push(quote! {
|
setters.push(quote! {
|
||||||
@ -45,13 +57,8 @@ pub fn make_event_derive(input: TokenStream) -> TokenStream {
|
|||||||
panic!("MakeEvent can only be derived for structs with named fields");
|
panic!("MakeEvent can only be derived for structs with named fields");
|
||||||
}
|
}
|
||||||
|
|
||||||
let expanded = quote! {
|
let cancel_methods = if has_cancelled_field {
|
||||||
impl #struct_name {
|
quote! {
|
||||||
#(#getters)*
|
|
||||||
#(#setters)*
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Event for #struct_name {
|
|
||||||
fn cancel(&mut self) {
|
fn cancel(&mut self) {
|
||||||
self.cancelled = true;
|
self.cancelled = true;
|
||||||
}
|
}
|
||||||
@ -59,6 +66,39 @@ pub fn make_event_derive(input: TokenStream) -> TokenStream {
|
|||||||
fn is_cancelled(&self) -> bool {
|
fn is_cancelled(&self) -> bool {
|
||||||
self.cancelled
|
self.cancelled
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
quote! {}
|
||||||
|
};
|
||||||
|
|
||||||
|
let new_method = if has_cancelled_field {
|
||||||
|
quote! {
|
||||||
|
pub fn new(#(#new_args),*) -> Self {
|
||||||
|
Self {
|
||||||
|
#(#new_inits),*,
|
||||||
|
cancelled: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
quote! {
|
||||||
|
pub fn new(#(#new_args),*) -> Self {
|
||||||
|
Self {
|
||||||
|
#(#new_inits),*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let expanded = quote! {
|
||||||
|
impl #struct_name {
|
||||||
|
#(#getters)*
|
||||||
|
#(#setters)*
|
||||||
|
#new_method
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Event for #struct_name {
|
||||||
|
#cancel_methods
|
||||||
|
|
||||||
fn name(&self) -> String {
|
fn name(&self) -> String {
|
||||||
#event_name.to_string()
|
#event_name.to_string()
|
||||||
|
@ -9,7 +9,7 @@ use std::{
|
|||||||
}, thread,
|
}, thread,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{config::ProxyConfig, connection::Player, error::{AsProxyResult, ProxyError}, event::{Event, EventListener}};
|
use super::{config::ProxyConfig, connection::Player, error::{AsProxyResult, ProxyError}, event::{Event, EventListener, StatusEvent}};
|
||||||
|
|
||||||
|
|
||||||
pub struct MeexProx {
|
pub struct MeexProx {
|
||||||
@ -84,9 +84,20 @@ impl MeexProx {
|
|||||||
|
|
||||||
if next_state == 1 {
|
if next_state == 1 {
|
||||||
loop {
|
loop {
|
||||||
server_conn.write_packet(&client_conn.read_packet().as_proxy()?).as_proxy()?;
|
let packet = client_conn.read_packet().as_proxy()?;
|
||||||
|
server_conn.write_packet(&packet).as_proxy()?;
|
||||||
|
if packet.id() == 0x00 {
|
||||||
|
let motd = server_conn.read_packet().as_proxy()?.read_string().as_proxy()?;
|
||||||
|
|
||||||
|
let mut event = StatusEvent::new(addr.clone(), motd, server_address.clone(), server_port, protocol_version);
|
||||||
|
self.trigger_event(&mut event)?;
|
||||||
|
let motd = event.motd();
|
||||||
|
|
||||||
|
client_conn.write_packet(&Packet::build(0x00, |o| o.write_string(&motd)).as_proxy()?).as_proxy()?;
|
||||||
|
} else {
|
||||||
client_conn.write_packet(&server_conn.read_packet().as_proxy()?).as_proxy()?;
|
client_conn.write_packet(&server_conn.read_packet().as_proxy()?).as_proxy()?;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else if next_state == 2 {
|
} else if next_state == 2 {
|
||||||
self.players.write().unwrap().push(Player::read(
|
self.players.write().unwrap().push(Player::read(
|
||||||
&self.config,
|
&self.config,
|
||||||
|
Loading…
Reference in New Issue
Block a user