Friends functionality (#90)

### Description

Implements and closes #86

### Game

Robocraft

### Please confirm

- [x] I am the legal owner or represent the owner of all work submitted
- [x] I consent to my submission being added to this FOSS project
- [ ] This PR used LLMs to generate some or all of the code changes

Reviewed-on: https://git.ngram.ca/OpenJam/rc-servers/pulls/90
Co-authored-by: NG (Graham) <ngniusness@gmail.com>
Co-committed-by: NG (Graham) <ngniusness@gmail.com>
This commit is contained in:
NG (Graham) authored and NGnius committed 2026-02-16 04:28:14 +00:00
1 parent 872f224af6
commit 9502522ac4
30 files changed
+1108 -35

No files matched your search

@@ -0,0 +1,28 @@
pub struct FriendInviteAccepted {
pub friend_public_id: String,
pub friend_display_name: String,
}
impl FriendInviteAccepted {
pub const CODE: u8 = 1;
pub fn as_event_params<C>(&self) -> polariton::operation::ParameterTable<C> {
let mut params = std::collections::HashMap::with_capacity(2);
params.insert(1, polariton::operation::Typed::Str(self.friend_public_id.clone().into()));
params.insert(75, polariton::operation::Typed::Str(self.friend_display_name.clone().into()));
params.into()
}
}
impl <C: Send + 'static> polariton_server::events::IntoEvent<C> for FriendInviteAccepted {
const CHANNEL: u8 = 0;
const ENCRYPT: bool = true;
const RELIABLE: bool = true;
fn into_event(self) -> polariton::operation::Event<C> {
polariton::operation::Event {
code: Self::CODE,
params: self.as_event_params(),
}
}
}
@@ -0,0 +1,28 @@
pub struct FriendInviteCancelled {
pub friend_public_id: String,
pub friend_display_name: String,
}
impl FriendInviteCancelled {
pub const CODE: u8 = 5;
pub fn as_event_params<C>(&self) -> polariton::operation::ParameterTable<C> {
let mut params = std::collections::HashMap::with_capacity(2);
params.insert(1, polariton::operation::Typed::Str(self.friend_public_id.clone().into()));
params.insert(75, polariton::operation::Typed::Str(self.friend_display_name.clone().into()));
params.into()
}
}
impl <C: Send + 'static> polariton_server::events::IntoEvent<C> for FriendInviteCancelled {
const CHANNEL: u8 = 0;
const ENCRYPT: bool = true;
const RELIABLE: bool = true;
fn into_event(self) -> polariton::operation::Event<C> {
polariton::operation::Event {
code: Self::CODE,
params: self.as_event_params(),
}
}
}
@@ -0,0 +1,28 @@
pub struct FriendInviteDeclined {
pub friend_public_id: String,
pub friend_display_name: String,
}
impl FriendInviteDeclined {
pub const CODE: u8 = 2;
pub fn as_event_params<C>(&self) -> polariton::operation::ParameterTable<C> {
let mut params = std::collections::HashMap::with_capacity(2);
params.insert(1, polariton::operation::Typed::Str(self.friend_public_id.clone().into()));
params.insert(75, polariton::operation::Typed::Str(self.friend_display_name.clone().into()));
params.into()
}
}
impl <C: Send + 'static> polariton_server::events::IntoEvent<C> for FriendInviteDeclined {
const CHANNEL: u8 = 0;
const ENCRYPT: bool = true;
const RELIABLE: bool = true;
fn into_event(self) -> polariton::operation::Event<C> {
polariton::operation::Event {
code: Self::CODE,
params: self.as_event_params(),
}
}
}
@@ -0,0 +1,42 @@
pub struct FriendInviteReceived {
pub friend_public_id: String,
pub friend_display_name: String,
pub clan_name: Option<String>,
pub is_online: bool, // when would this ever be false?
pub avatar_id: u32, // direct from database; u32::MAX means it is a custom avatar
}
impl FriendInviteReceived {
pub const CODE: u8 = 0;
pub fn as_event_params<C>(&self) -> polariton::operation::ParameterTable<C> {
let mut params = std::collections::HashMap::with_capacity(8);
params.insert(1, polariton::operation::Typed::Str(self.friend_public_id.clone().into()));
params.insert(75, polariton::operation::Typed::Str(self.friend_display_name.clone().into()));
if let Some(clan_name) = &self.clan_name {
params.insert(31, polariton::operation::Typed::Str(clan_name.into()));
} else {
params.insert(31, polariton::operation::Typed::Null);
}
params.insert(2, polariton::operation::Typed::Bool(self.is_online));
params.insert(9, polariton::operation::Typed::HashMap(vec![
(polariton::operation::Typed::Str("useCustomAvatar".into()), polariton::operation::Typed::Bool(self.avatar_id == u32::MAX)),
(polariton::operation::Typed::Str("avatarId".into()), polariton::operation::Typed::Int(self.avatar_id.try_into().unwrap_or_default())),
].into()));
params.into()
}
}
impl <C: Send + 'static> polariton_server::events::IntoEvent<C> for FriendInviteReceived {
const CHANNEL: u8 = 0;
const ENCRYPT: bool = true;
const RELIABLE: bool = true;
fn into_event(self) -> polariton::operation::Event<C> {
polariton::operation::Event {
code: Self::CODE,
params: self.as_event_params(),
}
}
}
@@ -0,0 +1,28 @@
pub struct FriendRemoved {
pub friend_public_id: String,
pub friend_display_name: String,
}
impl FriendRemoved {
pub const CODE: u8 = 3;
pub fn as_event_params<C>(&self) -> polariton::operation::ParameterTable<C> {
let mut params = std::collections::HashMap::with_capacity(2);
params.insert(1, polariton::operation::Typed::Str(self.friend_public_id.clone().into()));
params.insert(75, polariton::operation::Typed::Str(self.friend_display_name.clone().into()));
params.into()
}
}
impl <C: Send + 'static> polariton_server::events::IntoEvent<C> for FriendRemoved {
const CHANNEL: u8 = 0;
const ENCRYPT: bool = true;
const RELIABLE: bool = true;
fn into_event(self) -> polariton::operation::Event<C> {
polariton::operation::Event {
code: Self::CODE,
params: self.as_event_params(),
}
}
}
@@ -0,0 +1,33 @@
#[derive(Clone)]
pub struct FriendStatus {
pub friend_public_id: String,
pub friend_display_name: String,
pub is_online: bool,
pub invite_status: crate::data::friend::InviteStatus,
}
impl FriendStatus {
pub const CODE: u8 = 4;
pub fn as_event_params<C>(&self) -> polariton::operation::ParameterTable<C> {
let mut params = std::collections::HashMap::with_capacity(4);
params.insert(1, polariton::operation::Typed::Str(self.friend_public_id.clone().into()));
params.insert(75, polariton::operation::Typed::Str(self.friend_display_name.clone().into()));
params.insert(2, polariton::operation::Typed::Bool(self.is_online));
params.insert(3, polariton::operation::Typed::Byte(self.invite_status.as_u8()));
params.into()
}
}
impl <C: Send + 'static> polariton_server::events::IntoEvent<C> for FriendStatus {
const CHANNEL: u8 = 0;
const ENCRYPT: bool = true;
const RELIABLE: bool = true;
fn into_event(self) -> polariton::operation::Event<C> {
polariton::operation::Event {
code: Self::CODE,
params: self.as_event_params(),
}
}
}
+6
View File
@@ -0,0 +1,6 @@
pub mod friend_invite_received;
pub mod friend_invite_accepted;
pub mod friend_invite_declined;
pub mod friend_invite_cancelled;
pub mod friend_removed;
pub mod friend_status;