From 896e5a59a34de51955fa968ff3dc86982acb9152 Mon Sep 17 00:00:00 2001 From: Nathan Fulton Date: Tue, 15 Mar 2016 13:38:36 -0400 Subject: [PATCH] Add /ann command for server announcements Server announcements will be displayed to every player who enters a server created room. Admins can use the /ann command to set or clear the server announcements. --- game/chatter.cpp | 7 +++++-- server/endpoint.cpp | 34 ++++++++++++++++++++++++++++++++-- server/endpoint.h | 3 ++- server/server.cpp | 8 ++++++++ server/server.h | 3 +++ 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/game/chatter.cpp b/game/chatter.cpp index f46242f..b1a9943 100644 --- a/game/chatter.cpp +++ b/game/chatter.cpp @@ -24,8 +24,11 @@ void Chatter::AddChat(const char *player, const char *chat, bool system) { char name[kcbPlayerName]; handler_.GetPlayerName(name, sizeof(name)); if (strcmp(name, player) != 0) { - gsndm.PlaySfx(ksfxGuiCheckBoxTap); - StartBlinking(); + // Blink for player chats but not server messages + if (strcmp(player, "") != 0) { + gsndm.PlaySfx(ksfxGuiCheckBoxTap); + StartBlinking(); + } } } } diff --git a/server/endpoint.cpp b/server/endpoint.cpp index 469dd32..b6b8434 100644 --- a/server/endpoint.cpp +++ b/server/endpoint.cpp @@ -302,8 +302,6 @@ void Endpoint::OnRoomJoin(dword roomid, const char *password) { xpump_.Send(XMsgRoomStatusComplete::ToBuffer()); #if 0 -// This causes the chat button to flash immediately, not good - // If this room is being logged, tell the user if (room->password()[0] == 0) { const char *pszMsg = "Chat is subject to being logged."; @@ -311,6 +309,14 @@ void Endpoint::OnRoomJoin(dword roomid, const char *password) { server_.logger().LogSystemMsg(this, pszMsg); } #endif + + // Broadcast server announcements to the player if they entered a server room. + if (room->creator_id() == 0) { + if (!server().GetAnnouncements().empty()) { + xpump_.Send(XMsgRoomReceiveChat::ToBuffer("", + server().GetAnnouncements().c_str())); + } + } } void Endpoint::OnRoomSendChat(const char *chat) { @@ -698,6 +704,9 @@ ModeratorCommand Endpoint::GetModeratorCommand(const char *chat) { if (strcmp(arg.c_str(), "/flag") == 0) { return kModeratorCommandFlag; } + if (strcmp(arg.c_str(), "/ann") == 0) { + return kModeratorCommandAnnouncements; + } return kModeratorCommandUnknown; } @@ -794,6 +803,7 @@ bool Endpoint::ProcessCommand(const char *chat, std::string *response) { case kModeratorCommandClear: case kModeratorCommandPermanent: case kModeratorCommandRegisteredOnly: + case kModeratorCommandAnnouncements: if (!IsAdmin()) { *response = "You need to be an admin to use this command."; return true; @@ -1306,6 +1316,26 @@ bool Endpoint::ProcessCommand(const char *chat, std::string *response) { *response = "Success"; } break; + + case kModeratorCommandAnnouncements: + { + std::string dummy; + const char *rest; + std::string announcements; + if (GetArgument(chat, 0, &dummy, &rest) && *rest != 0) { + announcements.append(rest); + server().SetAnnouncements(announcements); + + const char *s = base::Format::ToString("Announcements have been set to: %s", rest); + *response = s; + } else { + announcements.clear(); + server().SetAnnouncements(announcements); + *response = "Announcements have been cleared."; + } + return true; + } + break; case kModeratorCommandHelp: if (IsAdmin()) { diff --git a/server/endpoint.h b/server/endpoint.h index 98b0c57..410d361 100644 --- a/server/endpoint.h +++ b/server/endpoint.h @@ -30,7 +30,8 @@ enum ModeratorCommand { kModeratorCommandSee, kModeratorCommandKill, kModeratorCommandPermanent, kModeratorCommandMods, kModeratorCommandWhisper, kModeratorCommandTitle, kModeratorCommandRegisteredOnly, kModeratorCommandAnonBlock, - kModeratorCommandSwap, kModeratorCommandFlag, kModeratorCommandHelp + kModeratorCommandSwap, kModeratorCommandFlag, kModeratorCommandHelp, + kModeratorCommandAnnouncements }; class Endpoint : public base::MessageHandler, XPumpNotify, diff --git a/server/server.cpp b/server/server.cpp index 2207515..e756460 100644 --- a/server/server.cpp +++ b/server/server.cpp @@ -200,6 +200,14 @@ const char *Server::GetChatRules() { return "RULES: No swearing, name calling, sexism, racism, offensive language, or offensive symbolism allowed. No spamming allowed. Repeat offenders may be muted, kicked, banned, and reported to the admin."; } +std::string Server::GetAnnouncements() { + return announcements_; +} + +void Server::SetAnnouncements(std::string announcements) { + announcements_ = announcements; +} + dword Server::GetChatterId(Endpoint *endpointAsker, Endpoint *endpoint) { dword shifted = (endpoint->id() << kcBitsFreeShiftEndpointId); dword h = 0; diff --git a/server/server.h b/server/server.h index 7b12285..cecd4df 100644 --- a/server/server.h +++ b/server/server.h @@ -47,6 +47,8 @@ public: dword GetChatterId(Endpoint *endpointAsker, Endpoint *endpoint); Endpoint *GetEndpointFromChatterId(dword id); const char *GetChatRules(); + std::string GetAnnouncements(); + void SetAnnouncements(std::string announcements); ChatLimiter& chatlimiter() { return chatlimiter_; } LevelInfoCache& cache() { return cache_; } @@ -105,6 +107,7 @@ private: std::vector admin_names_; Tracker tracker_; BadWords badwords_; + std::string announcements_; }; } // namespace wi