Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions client.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -322,3 +322,11 @@ export namespace workshop {
export function getItem(item: bigint, query?: WorkshopItemQuery | undefined | null): Promise<WorkshopItem | null>
export function getItems(items: Array<bigint>, query?: WorkshopItemQuery | undefined | null): Promise<Array<WorkshopItem | undefined | null>>
}
export namespace networking_messages {
export interface Message {
data: Buffer
steamId?: PlayerSteamId
}
export function sendMessageToUser(steamId64: bigint, data: Buffer): void
export function receiveMessagesOnChannel(): Array<Message>
}
1 change: 1 addition & 0 deletions src/api/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ pub mod stats;
pub mod utils;
pub mod workshop;
pub mod workshop_item;
pub mod networking_messages;
73 changes: 73 additions & 0 deletions src/api/networking_messages.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
use napi_derive::napi;

#[napi]
pub mod networking_messages {
use napi::bindgen_prelude::{BigInt, Buffer, Error};
use steamworks::SteamError;
use steamworks::SteamId;
use crate::api::localplayer::PlayerSteamId;
use steamworks::ClientManager;
use steamworks::networking_types::SendFlags;
use steamworks::networking_types::NetworkingIdentity;
use steamworks::networking_types::NetworkingMessage;

#[napi(object)]
pub struct Message {
pub data: Buffer,
pub steam_id: Option<PlayerSteamId>,
}

#[napi]
pub fn send_message_to_user(
steam_id64: BigInt,
data: Buffer
) -> Result<(), Error> {
let client = crate::client::get_client();
let steam_id = SteamId::from_raw(steam_id64.get_u64().1);
let identity = NetworkingIdentity::new_steam_id(steam_id);

fn err(steam_err: SteamError) -> Result<(), Error> {
let mut str: String = "Can't send message: ".to_owned();
let borrowed_string: &str = &steam_err.to_string();

str.push_str(borrowed_string);
Result::Err(
Error::new(
napi::Status::GenericFailure,
str,
)
)
}

client
.networking_messages()
.send_message_to_user(
identity,
SendFlags::RELIABLE_NO_NAGLE & SendFlags::AUTO_RESTART_BROKEN_SESSION,
&data,
0
).or_else(err)
}

#[napi]
pub fn receive_messages_on_channel() -> Vec<Message> {
let client = crate::client::get_client();

client
.networking_messages()
.receive_messages_on_channel(0, 10)
.iter().map(|m:&NetworkingMessage<ClientManager>| {
let steam_id = m.identity_peer().steam_id();

if let Some(steam_id) = steam_id {
let player_steam_id = PlayerSteamId::from_steamid(steam_id);

return Message { data: m.data().into(), steam_id: Some(player_steam_id) };
} else {
return Message { data: m.data().into(), steam_id: None };
}

}).collect()
}

}