summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-03-22 13:13:40 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-03-22 15:02:46 +0800
commit36d47ef1f390a7abe71045d1f9aa37278d22225d (patch)
tree8a24c9315a9ef61c56eeeef578746e8267a1f276 /src
parent3acfd38a49f906b818e932ba2de89b7c31c3c932 (diff)
feat: ability to mute/unmute clients (#12)
Diffstat (limited to 'src')
-rw-r--r--src/chatManager.cpp5
-rw-r--r--src/commands.cpp61
-rw-r--r--src/session.cpp8
-rw-r--r--src/session.hpp4
4 files changed, 70 insertions, 8 deletions
diff --git a/src/chatManager.cpp b/src/chatManager.cpp
index 4392e00..3b8c82d 100644
--- a/src/chatManager.cpp
+++ b/src/chatManager.cpp
@@ -13,6 +13,11 @@ CChatManager::~CChatManager() {
void CChatManager::newMessage(const SMessage &msg) {
log(LOG, "{}: {}", msg.username, msg.msg);
+ const auto session = g_pSessionManager->getByName(msg.username);
+ if (session && session->isMuted()) {
+ session->write("You are muted");
+ return;
+ }
g_pSessionManager->broadcastChat(msg);
m_vMessages.push_back(msg);
}
diff --git a/src/commands.cpp b/src/commands.cpp
index 1db5d43..4e67962 100644
--- a/src/commands.cpp
+++ b/src/commands.cpp
@@ -7,11 +7,16 @@ struct SKickArgs {
std::string reason;
};
+struct SMuteArgs {
+ std::string target;
+ std::string reason;
+};
+
void registerCommands() {
g_pCommandHandler->registerCommand({.name = "raw", .parser = [](const std::string &args) -> CCommandHandler::SParseResult { return {.data = args, .good = true}; }, .exe = [](const std::any &parsed) -> CCommandHandler::SResult {
- const std::string &data = std::any_cast<const std::string &>(parsed);
- g_pSessionManager->broadcast(data);
- return {.result = "Broadcasted: " + data, .good = true}; }});
+ const std::string &data = std::any_cast<const std::string &>(parsed);
+ g_pSessionManager->broadcast(data);
+ return {.result = "Broadcasted: " + data, .good = true}; }});
g_pCommandHandler->registerCommand(CCommandHandler::makeCommand<SKickArgs>({.name = "kick", .parser = [](const std::string &args) -> std::pair<SKickArgs, bool> {
size_t pos = args.find(' ');
@@ -37,10 +42,50 @@ void registerCommands() {
g_pSessionManager->kick(session, true, data.reason);
return {.result = "Kicked '" + data.target + "': " + data.reason, .good = true}; }}));
- g_pCommandHandler->registerCommand({.name = "list", .parser = [](const std::string &args) -> CCommandHandler::SParseResult { return {.good = true}; }, .exe = [](const std::any &parsed) -> CCommandHandler::SResult {
- std::string result = "Clients:\n";
- for (const auto &session : g_pSessionManager->getSessions())
- result += session->getName() + "\t" + session->getIp() + "\n";
+ g_pCommandHandler->registerCommand({.name = "list", .parser = [](const std::string &args) -> CCommandHandler::SParseResult {
+ (void)args;
+ return {.data = std::any(), .good = true}; }, .exe = [](const std::any &parsed) -> CCommandHandler::SResult {
+ (void)parsed;
+ std::string result = "Clients:\n";
+ for (const auto &session : g_pSessionManager->getSessions())
+ result += session->getName() + "\t" + session->getIp() + "\t" + (session->isMuted() ? "[MUTED]" : "[UNMUTED]") + "\n";
+
+ return {.result = result, .good = true}; }});
+
+ g_pCommandHandler->registerCommand(CCommandHandler::makeCommand<SMuteArgs>({.name = "mute", .parser = [](const std::string &args) -> std::pair<SMuteArgs, bool> {
+ size_t pos = args.find(' ');
+ std::string target = args;
+ std::string reason = "No reason specified";
+
+ if (pos != std::string::npos) {
+ target = args.substr(0, pos);
+ reason = args.substr(pos + 1);
+ if (reason.empty())
+ reason = "Muted: No reason specified";
+ }
+
+ if (target.empty())
+ return {SMuteArgs{}, false};
+
+ return {SMuteArgs{.target=target, .reason=reason}, true}; }, .exe = [](const SMuteArgs &data) -> CCommandHandler::SResult {
+ const auto session = g_pSessionManager->getByName(data.target);
+ if (!session)
+ return {.result = "User '" + data.target + "' not found", .good = false};
+
+ session->setMuted(true);
+ session->write("You have been muted");
+ return {.result = "Muted '" + data.target + "': " + data.reason, .good = true}; }}));
+
+ g_pCommandHandler->registerCommand(CCommandHandler::makeCommand<SMuteArgs>({.name = "unmute", .parser = [](const std::string &args) -> std::pair<SMuteArgs, bool> {
+ if (args.empty())
+ return {SMuteArgs{}, false};
+
+ return {SMuteArgs{.target=args, .reason="Unmuted"}, true}; }, .exe = [](const SMuteArgs &data) -> CCommandHandler::SResult {
+ const auto session = g_pSessionManager->getByName(data.target);
+ if (!session)
+ return {.result = "User '" + data.target + "' not found", .good = false};
- return {.result = result, .good = true}; }});
+ session->setMuted(false);
+ session->write("You have been unmuted");
+ return {.result = "Unmuted '" + data.target + "'", .good = true}; }}));
}
diff --git a/src/session.cpp b/src/session.cpp
index 5edfa56..526e041 100644
--- a/src/session.cpp
+++ b/src/session.cpp
@@ -139,6 +139,14 @@ void CSession::run() {
g_pSessionManager->kick(self);
}
+bool CSession::isMuted() const {
+ return m_isMuted;
+}
+
+void CSession::setMuted(bool mute) {
+ m_isMuted = mute;
+}
+
bool CSession::registerSession() {
auto recvData = read("Name: ");
if (!recvData->good)
diff --git a/src/session.hpp b/src/session.hpp
index 1b7b8db..070a8d4 100644
--- a/src/session.hpp
+++ b/src/session.hpp
@@ -35,6 +35,9 @@ class CSession {
bool write(eFormatType type, std::format_string<Args...> fmt, Args &&...args);
void writeChat(const CChatManager::SMessage &msg);
+ bool isMuted() const;
+ void setMuted(bool mute);
+
void run();
bool isValid();
@@ -57,6 +60,7 @@ class CSession {
bool m_isAdmin = false;
bool m_isReading = false;
+ bool m_isMuted = false;
void recvLoop();
bool registerSession();