mirror of
https://git.ngram.ca/OpenJam/rc-servers
synced 2026-08-23 23:08:52 +00:00
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:
@@ -16,4 +16,90 @@ impl AvatarInfo {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO pub struct FriendInfo {}
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct FriendInfo {
|
||||
pub status: InviteStatus,
|
||||
pub is_online: bool,
|
||||
pub public_id: String,
|
||||
pub display_name: String,
|
||||
pub clan_name: String,
|
||||
}
|
||||
|
||||
impl FriendInfo {
|
||||
pub(super) fn dump(&self, w: &mut dyn std::io::Write) -> std::io::Result<usize> {
|
||||
w.write_all(&[
|
||||
self.status.as_u8(),
|
||||
self.is_online as u8,
|
||||
])?;
|
||||
let mut total = 2;
|
||||
total += oj_rc_core::data::write_str_for_binreader(&self.public_id, w)?;
|
||||
total += oj_rc_core::data::write_str_for_binreader(&self.display_name, w)?;
|
||||
total += oj_rc_core::data::write_str_for_binreader(&self.clan_name, w)?;
|
||||
Ok(total)
|
||||
}
|
||||
|
||||
pub(super) fn parse(r: &mut dyn std::io::Read) -> std::io::Result<Self> {
|
||||
let mut buf = [0u8; 2];
|
||||
r.read_exact(&mut buf)?;
|
||||
let status = InviteStatus::from_u8(buf[0]).ok_or_else(|| std::io::Error::other(format!("Invalid invite status {}", buf[0])))?;
|
||||
let is_online = buf[1] != 0;
|
||||
let public_id = oj_rc_core::data::read_str_for_binwriter(r)?;
|
||||
let display_name = oj_rc_core::data::read_str_for_binwriter(r)?;
|
||||
let clan_name = oj_rc_core::data::read_str_for_binwriter(r)?;
|
||||
Ok(Self {
|
||||
status,
|
||||
is_online,
|
||||
public_id,
|
||||
display_name,
|
||||
clan_name,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(u8)]
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub enum InviteStatus {
|
||||
InviteSent = 0,
|
||||
InvitePending = 1,
|
||||
Accepted = 2,
|
||||
None = 3
|
||||
}
|
||||
|
||||
impl InviteStatus {
|
||||
#[inline]
|
||||
pub fn from_u8(num: u8) -> Option<Self> {
|
||||
match num {
|
||||
0 => Some(Self::InviteSent),
|
||||
1 => Some(Self::InvitePending),
|
||||
2 => Some(Self::Accepted),
|
||||
3 => Some(Self::None),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn as_u8(&self) -> u8 {
|
||||
*self as u8
|
||||
}
|
||||
|
||||
pub fn from_core(core: &oj_rc_core::persist::user::FriendInviteStatus) -> Self {
|
||||
match core {
|
||||
oj_rc_core::persist::user::FriendInviteStatus::InviteSent => Self::InviteSent,
|
||||
oj_rc_core::persist::user::FriendInviteStatus::InvitePending => Self::InvitePending,
|
||||
oj_rc_core::persist::user::FriendInviteStatus::Accepted => Self::Accepted,
|
||||
oj_rc_core::persist::user::FriendInviteStatus::Declined
|
||||
| oj_rc_core::persist::user::FriendInviteStatus::Cancelled
|
||||
| oj_rc_core::persist::user::FriendInviteStatus::Removed => Self::None,
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn reciprocal(&self) -> Self {
|
||||
match self {
|
||||
Self::InviteSent => Self::InvitePending,
|
||||
Self::InvitePending => Self::InviteSent,
|
||||
Self::Accepted => Self::Accepted,
|
||||
Self::None => Self::None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user