project cleanup, getplayeridentifiers and sendchatmessage implemented

also adds support for the debug flag :)
This commit is contained in:
Luuk van Oijen
2023-11-25 19:10:19 +01:00
parent 04e058dc0d
commit 56cd0eca11
7 changed files with 66 additions and 23 deletions

View File

@@ -507,12 +507,15 @@ impl Server {
async fn process_lua_events(&mut self) -> anyhow::Result<()> {
// Receive plugin events and process them
for plugin in &mut self.plugins {
for event in plugin.get_events() {
// TODO: Any methods called in this for loop cannot modify the list of plugins.
// If any plugin disappears during this call, it will panic trying to index out of bounds!
for i in 0..self.plugins.len() {
for event in self.plugins[i].get_events() {
debug!("event: {:?}", event);
// TODO: Error handling (?)
match event {
ServerBoundPluginEvent::PluginLoaded => plugin.send_event(PluginBoundPluginEvent::CallEventHandler((ScriptEvent::OnPluginLoaded, None))).await,
ServerBoundPluginEvent::PluginLoaded => self.plugins[i].send_event(PluginBoundPluginEvent::CallEventHandler((ScriptEvent::OnPluginLoaded, None))).await,
ServerBoundPluginEvent::RequestPlayerCount(responder) => { let _ = responder.send(PluginBoundPluginEvent::PlayerCount(self.clients.len() + self.clients_queue.len())); },
ServerBoundPluginEvent::RequestPlayers(responder) => {
trace!("request players received");
@@ -534,6 +537,12 @@ impl Server {
let _ = responder.send(PluginBoundPluginEvent::None);
}
},
ServerBoundPluginEvent::SendChatMessage((pid, msg)) => {
let pid = if pid >= 0 { Some(pid as u8) } else { None };
self.send_chat_message(&msg, pid).await;
},
_ => {},
}
}
@@ -609,12 +618,17 @@ impl Server {
}
pub async fn send_chat_message(&self, message: &str, target: Option<u8>) {
let packet = Packet::Raw(RawPacket::from_str(&format!("C:Server: {message}")));
if let Some(_id) = target {
// TODO: Implement this!
todo!("Sending server chat messages to specific player is not supported yet!");
// info!("[CHAT] Server @ {id}: {message}");
if let Some(id) = target {
let packet = Packet::Raw(RawPacket::from_str(&format!("C:Server @ {id}: {message}")));
info!("[CHAT] Server @ {id}: {message}");
for client in &self.clients {
if id == client.id {
client.queue_packet(packet).await;
break;
}
}
} else {
let packet = Packet::Raw(RawPacket::from_str(&format!("C:Server: {message}")));
info!("[CHAT] Server: {message}");
self.broadcast(packet, None).await;
}

View File

@@ -53,7 +53,7 @@ impl UserData for Context {
});
methods.add_function("GetServerVersion", |_lua, ()| {
Ok((1, 0, 0))
Ok((3, 3, 0))
});
methods.add_function("GetPlayerCount", |lua, ()| {
@@ -96,6 +96,35 @@ impl UserData for Context {
todo!("Receiving a response from the server failed! How?")
}
});
methods.add_function("GetPlayerIdentifiers", |lua, (id,): (u8,)| {
let me: Context = lua.globals().get("MP")?;
let (tx, rx) = oneshot::channel();
if let Err(e) = me.tx.blocking_send(ServerBoundPluginEvent::RequestPlayerIdentifiers((id, tx))) {
error!("Failed to send packet: {:?}", e);
}
let message = rx.blocking_recv();
if let Ok(message) = message {
if let PluginBoundPluginEvent::PlayerIdentifiers(identifiers) = message {
let table = lua.create_table()?;
table.set("id", identifiers.ip)?;
table.set("beammp_id", identifiers.beammp_id)?;
Ok(table)
} else {
unreachable!() // This should really never be reachable
}
} else {
todo!("Receiving a response from the server failed! How?")
}
});
methods.add_function("SendChatMessage", |lua, (id, msg): (isize, String)| {
let me: Context = lua.globals().get("MP")?;
if let Err(e) = me.tx.blocking_send(ServerBoundPluginEvent::SendChatMessage((id, msg))) {
error!("Failed to send packet: {:?}", e);
}
Ok(())
});
}
}

View File

@@ -72,6 +72,8 @@ pub enum ServerBoundPluginEvent {
RequestPlayerCount(oneshot::Sender<PluginBoundPluginEvent>),
RequestPlayers(oneshot::Sender<PluginBoundPluginEvent>),
RequestPlayerIdentifiers((u8, oneshot::Sender<PluginBoundPluginEvent>)),
SendChatMessage((isize, String)),
}
pub struct Plugin {