diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/chatManager.cpp | 5 | ||||
| -rw-r--r-- | src/commands.cpp | 61 | ||||
| -rw-r--r-- | src/session.cpp | 8 | ||||
| -rw-r--r-- | src/session.hpp | 4 |
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(); |
