use crate::GAME;
use anyhow::{Context, Result};
use netxclient::prelude::*;
use super::interface::*;
pub struct MasterController {
server_id: u32,
server: NetxClientArcDef,
}
impl MasterController {
pub fn new(server_id: u32, server: NetxClientArcDef) -> Self {
Self { server_id, server }
}
}
#[build(MasterController)]
pub trait IMasterController {
#[tag(connect)]
async fn connected(&self) -> Result<()>;
#[tag(disconnect)]
async fn disconnect(&self) -> Result<()>;
#[tag(1000)]
async fn ping(&self, time: i64) -> Result<i64>;
}
#[build_impl]
impl IMasterController for MasterController {
#[inline]
async fn connected(&self) -> Result<()> {
let server = impl_ref!(self.server=>IMaster);
if server.register_slot_server(self.server_id).await? {
log::info!("connect master server Ok");
} else {
panic!("register server id fail,check server id!!")
}
Ok(())
}
#[inline]
async fn disconnect(&self) -> Result<()> {
GAME.get()
.context("not found GAME?")?
.peers
.clear_all()
.await;
Ok(())
}
#[inline]
async fn ping(&self, time: i64) -> Result<i64> {
log::debug!("master ping:{time}");
Ok(time)
}
}