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.
This commit is contained in:
Nathan Fulton 2016-03-15 13:38:36 -04:00
parent 066e2a4839
commit 896e5a59a3
5 changed files with 50 additions and 5 deletions

View File

@ -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();
}
}
}
}

View File

@ -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()) {

View File

@ -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,

View File

@ -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;

View File

@ -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<std::string> admin_names_;
Tracker tracker_;
BadWords badwords_;
std::string announcements_;
};
} // namespace wi