use polariton_server::operations::{Operation, OperationCode}; use rand::Rng; use oj_rc_core::ConfigProvider; const MAX_DELTA: u64 = 60 * 60 * 24; // 1 day const CODE: u8 = 8; const MESSAGE_PARAM_KEY: u8 = 2; const DISPLAY_TIME_PARAM_KEY: u8 = 15; pub struct DevMessageProvider { messages: oj_rc_core::persist::config::DevMessageProvider, } impl DevMessageProvider { async fn do_handling(&self, params: polariton::operation::ParameterTable, user: &crate::UserTy) -> Result, i16> { let mut params = params.to_dict(); let user_info = user.user()?; let last_seen = user_info.last_seen().await?; let now = chrono::Utc::now().timestamp() as u64; if (now - last_seen) > MAX_DELTA { let index = rand::rng().random::(); let dev_msg = self.messages.get(index as _); params.insert(MESSAGE_PARAM_KEY, dev_msg.message); params.insert(DISPLAY_TIME_PARAM_KEY, dev_msg.display_time); } else { let dev_msg = self.messages.get_empty(); params.insert(MESSAGE_PARAM_KEY, dev_msg.message); params.insert(DISPLAY_TIME_PARAM_KEY, dev_msg.display_time); } Ok(params.into()) } } #[async_trait::async_trait] impl Operation for DevMessageProvider { type User = crate::UserTy; async fn handle_async(&self, params: polariton::operation::ParameterTable, user: &Self::User) -> polariton::operation::OperationResponse { polariton_server::operations::result_to_op_resp::(self.do_handling(params, user).await) } } impl OperationCode for DevMessageProvider { fn op_code() -> u8 { CODE } } pub(super) fn dev_message_provider(conf: &oj_rc_core::ConfigImpl) -> DevMessageProvider<()> { let messages = conf.login_messages(); DevMessageProvider { messages } }