Skip to main content

pumpkinplus/modules/mechanics/player/
messages.rs

1//! Messages module - custom join, leave, and kick messages.
2//!
3//! ## Configuration
4//!
5//! | Field       | Default | Description                                                        |
6//! |-------------|---------|--------------------------------------------------------------------|
7//! | `enabled`   | `false` | Whether this module is active                                      |
8//! | `join_msg`  | `""`    | Message broadcast when a player joins                              |
9//! | `leave_msg` | `""`    | Message broadcast when a player leaves                             |
10//! | `kick_msg`  | `""`    | Message shown when a player is kicked during login                 |
11//!
12//! ## Placeholders
13//!
14//! | Placeholder | Available in                                    |
15//! |-------------|-------------------------------------------------|
16//! | `{player}`  | `join_msg`, `leave_msg`, `kick_msg`             |
17
18use crate::config::ConfigManager;
19use crate::mechanics::mechanic::Mechanic;
20use pumpkin_plugin_api::events::{
21    EventData, EventHandler, EventPriority, PlayerJoinEvent, PlayerLeaveEvent, PlayerLoginEvent,
22};
23use pumpkin_plugin_api::{Context, Server, text::TextComponent};
24use serde::{Deserialize, Serialize};
25
26/// Handles player join, leave, and kick messages.
27#[derive(Default)]
28pub struct Messages;
29
30impl Mechanic for Messages {
31    fn enabled(&self) -> bool {
32        ConfigManager::get()
33            .map(|cm| cm.get_config::<MessagesConfig>().enabled)
34            .unwrap_or(true)
35    }
36
37    fn events(&self, context: &Context) {
38        context
39            .register_event_handler::<PlayerJoinEvent, _>(Messages, EventPriority::Highest, true)
40            .expect("failed to register join event handler");
41        context
42            .register_event_handler::<PlayerLeaveEvent, _>(Messages, EventPriority::Highest, true)
43            .expect("failed to register leave event handler");
44        context
45            .register_event_handler::<PlayerLoginEvent, _>(Messages, EventPriority::Highest, true)
46            .expect("failed to register login event handler");
47    }
48}
49
50impl EventHandler<PlayerJoinEvent> for Messages {
51    fn handle(
52        &self,
53        _server: Server,
54        mut event: EventData<PlayerJoinEvent>,
55    ) -> EventData<PlayerJoinEvent> {
56        let config: MessagesConfig = ConfigManager::get()
57            .map(|cm| cm.get_config())
58            .unwrap_or_default();
59        if config.join_msg.is_empty() {
60            return event;
61        }
62        let name = event.player.get_display_name().get_text();
63        event.join_message =
64            TextComponent::text(config.join_msg.replace("{player}", &name).as_str());
65        event
66    }
67}
68
69impl EventHandler<PlayerLeaveEvent> for Messages {
70    fn handle(
71        &self,
72        _server: Server,
73        mut event: EventData<PlayerLeaveEvent>,
74    ) -> EventData<PlayerLeaveEvent> {
75        let config: MessagesConfig = ConfigManager::get()
76            .map(|cm| cm.get_config())
77            .unwrap_or_default();
78        if config.leave_msg.is_empty() {
79            return event;
80        }
81        let name = event.player.get_display_name().get_text();
82        event.leave_message =
83            TextComponent::text(config.leave_msg.replace("{player}", &name).as_str());
84        event
85    }
86}
87
88impl EventHandler<PlayerLoginEvent> for Messages {
89    fn handle(
90        &self,
91        _server: Server,
92        mut event: EventData<PlayerLoginEvent>,
93    ) -> EventData<PlayerLoginEvent> {
94        let config: MessagesConfig = ConfigManager::get()
95            .map(|cm| cm.get_config())
96            .unwrap_or_default();
97        if config.kick_msg.is_empty() {
98            return event;
99        }
100        let name = event.player.get_display_name().get_text();
101        event.kick_message =
102            TextComponent::text(config.kick_msg.replace("{player}", &name).as_str());
103        event
104    }
105}
106
107/// Configuration for the messages module.
108#[derive(Debug, Clone, Default, Serialize, Deserialize)]
109pub struct MessagesConfig {
110    /// Whether this module is active.
111    pub enabled: bool,
112    /// Message broadcast when a player joins. Use `{player}` as a placeholder for the player's name. Leave empty to disable.
113    pub join_msg: String,
114    /// Message broadcast when a player leaves. Use `{player}` as a placeholder for the player's name. Leave empty to disable.
115    pub leave_msg: String,
116    /// Message shown to the player when they are kicked during login. Use `{player}` as a placeholder for the player's name. Leave empty to disable.
117    pub kick_msg: String,
118}