diff --git a/bin/config_sample/command_extensions.ini b/bin/config_sample/command_extensions.ini index 258534b..771abc8 100644 --- a/bin/config_sample/command_extensions.ini +++ b/bin/config_sample/command_extensions.ini @@ -76,5 +76,8 @@ aliases = updateban [ignore_bglist] aliases = ignorebglist -[ignore_bglist] -aliases = ignorebglist \ No newline at end of file +[togglewtce] +aliases = toggle_wtce + +[toggleshouts] +aliases = toggle_shouts \ No newline at end of file diff --git a/core/include/aoclient.h b/core/include/aoclient.h index 3c06c5c..441d8eb 100644 --- a/core/include/aoclient.h +++ b/core/include/aoclient.h @@ -1065,6 +1065,24 @@ class AOClient : public QObject */ void cmdToggleAreaMessageOnJoin(int argc, QStringList argv); + /** + * @brief Toggles wether the client can use testimony animations in the area. + * + * @details No arguments. + * + * @iscommand + */ + void cmdToggleWtce(int argc, QStringList argv); + + /** + * @brief Toggles wether the client can send game shouts in the area. + * + * @details No arguments. + * + * @iscommand + */ + void cmdToggleShouts(int argc, QStringList argv); + ///@} /** diff --git a/core/include/area_data.h b/core/include/area_data.h index bfe65d6..8512d6a 100644 --- a/core/include/area_data.h +++ b/core/include/area_data.h @@ -860,6 +860,16 @@ class AreaData : public QObject */ void toggleJukebox(); + /** + * @brief Toggles wether testimony animations can be used in the area. + */ + void toggleWtceAllowed(); + + /** + * @brief Toggles wether shouts can be used in the area. + */ + void toggleShoutAllowed(); + /** * @brief Adds a song to the Jukeboxs queue. */ @@ -877,6 +887,20 @@ class AreaData : public QObject */ bool isMessageAllowed() const; + /** + * @brief Returns whatever a wtce packet may be broadcasted or not. + * + * @return True if permitted, false otherwise. + */ + bool isWtceAllowed() const; + + /** + * @brief Returns wether a shout can be used in the area. + * + * @return True if permitted, false otherwise. + */ + bool isShoutAllowed() const; + /** * @brief Starts a timer that determines whatever a game message may be broadcasted or not. * @@ -1161,6 +1185,16 @@ class AreaData : public QObject */ bool m_can_send_ic_messages = true; + /** + * @brief If false, WTCE will be rejected. + */ + bool m_can_send_wtce = true; + + /** + * @brief If false, shouts are stripped from all messages in the area. + */ + bool m_can_use_shouts = true; + private slots: /** * @brief Allow game messages to be broadcasted. diff --git a/core/src/aoclient.cpp b/core/src/aoclient.cpp index 80e18fd..29103bd 100644 --- a/core/src/aoclient.cpp +++ b/core/src/aoclient.cpp @@ -144,7 +144,8 @@ const QMap AOClient::COMMANDS{ {"removeentry", {{ACLRole::CM}, 1, &AOClient::cmdRemoveCategorySong}}, {"toggleroot", {{ACLRole::CM}, 0, &AOClient::cmdToggleRootlist}}, {"clearcustom", {{ACLRole::CM}, 0, &AOClient::cmdClearCustom}}, -}; + {"togglewtce", {{ACLRole::CM}, 0, &AOClient::cmdToggleWtce}}, + {"toggleshouts", {{ACLRole::CM}, 0, &AOClient::cmdToggleShouts}}}; void AOClient::clientData() { @@ -486,6 +487,10 @@ bool AOClient::checkPermission(ACLRole::Permission f_permission) const return true; } + if ((f_permission == ACLRole::CM) && server->getAreaById(m_current_area)->owners().contains(m_id)) { + return true; // I'm sorry for this hack. + } + if (!isAuthenticated()) { return false; } diff --git a/core/src/area_data.cpp b/core/src/area_data.cpp index a02f6a2..a650829 100644 --- a/core/src/area_data.cpp +++ b/core/src/area_data.cpp @@ -36,7 +36,9 @@ AreaData::AreaData(QString p_name, int p_index, MusicManager *p_music_manager = m_statement(0), m_judgelog(), m_lastICMessage(), - m_send_area_message(false) + m_send_area_message(false), + m_can_send_wtce(true), + m_can_use_shouts(true) { QStringList name_split = p_name.split(":"); name_split.removeFirst(); @@ -57,6 +59,8 @@ AreaData::AreaData(QString p_name, int p_index, MusicManager *p_music_manager = m_shownameAllowed = areas_ini->value("shownames_allowed", "true").toBool(); m_ignoreBgList = areas_ini->value("ignore_bglist", "false").toBool(); m_jukebox = areas_ini->value("jukebox_enabled", "false").toBool(); + m_can_send_wtce = areas_ini->value("wtce_enabled", "true").toBool(); + m_can_use_shouts = areas_ini->value("shouts_enabled", "true").toBool(); areas_ini->endGroup(); QTimer *timer1 = new QTimer(); m_timers.append(timer1); @@ -297,6 +301,16 @@ bool AreaData::isMessageAllowed() const return m_can_send_ic_messages; } +bool AreaData::isWtceAllowed() const +{ + return m_can_send_wtce; +} + +bool AreaData::isShoutAllowed() const +{ + return m_can_use_shouts; +} + void AreaData::startMessageFloodguard(int f_duration) { m_can_send_ic_messages = false; @@ -586,6 +600,16 @@ void AreaData::toggleJukebox() } } +void AreaData::toggleWtceAllowed() +{ + m_can_send_wtce = !m_can_send_wtce; +} + +void AreaData::toggleShoutAllowed() +{ + m_can_use_shouts = !m_can_use_shouts; +} + QString AreaData::addJukeboxSong(QString f_song) { if (!m_jukebox_queue.contains(f_song)) { diff --git a/core/src/commands/area.cpp b/core/src/commands/area.cpp index 1deee25..e70cd44 100644 --- a/core/src/commands/area.cpp +++ b/core/src/commands/area.cpp @@ -411,6 +411,28 @@ void AOClient::cmdToggleAreaMessageOnJoin(int argc, QStringList argv) sendServerMessage("Sending message on area join is now " + l_state); } +void AOClient::cmdToggleWtce(int argc, QStringList argv) +{ + Q_UNUSED(argc); + Q_UNUSED(argv); + + AreaData *l_area = server->getAreaById(m_current_area); + l_area->toggleWtceAllowed(); + QString l_state = l_area->isWtceAllowed() ? "enabled." : "disabled."; + sendServerMessage("Using testimony animations is now " + l_state); +} + +void AOClient::cmdToggleShouts(int argc, QStringList argv) +{ + Q_UNUSED(argc); + Q_UNUSED(argv); + + AreaData *l_area = server->getAreaById(m_current_area); + l_area->toggleShoutAllowed(); + QString l_state = l_area->isShoutAllowed() ? "enabled." : "disabled."; + sendServerMessage("Using shouts is now " + l_state); +} + void AOClient::cmdClearAreaMessage(int argc, QStringList argv) { Q_UNUSED(argc); diff --git a/core/src/packets.cpp b/core/src/packets.cpp index f59a36d..d4d89df 100644 --- a/core/src/packets.cpp +++ b/core/src/packets.cpp @@ -376,6 +376,12 @@ void AOClient::pktWtCe(AreaData *area, int argc, QStringList argv, AOPacket pack sendServerMessage("You are blocked from using the judge controls."); return; } + + if (!area->isWtceAllowed()) { + sendServerMessage("WTCE animations have been disabled in this area."); + return; + } + if (QDateTime::currentDateTime().toSecsSinceEpoch() - m_last_wtce_time <= 5) return; m_last_wtce_time = QDateTime::currentDateTime().toSecsSinceEpoch(); @@ -770,15 +776,24 @@ AOPacket AOClient::validateIcPacket(AOPacket packet) l_args.append(l_incoming_args[9].toString()); // objection modifier - if (l_incoming_args[10].toString().contains("4")) { - // custom shout includes text metadata - l_args.append(l_incoming_args[10].toString()); + if (area->isShoutAllowed()) { + if (l_incoming_args[10].toString().contains("4")) { + // custom shout includes text metadata + l_args.append(l_incoming_args[10].toString()); + } + else { + int l_obj_mod = l_incoming_args[10].toInt(); + if ((l_obj_mod < 0) || (l_obj_mod > 4)) { + return l_invalid; + } + l_args.append(QString::number(l_obj_mod)); + } } else { - int l_obj_mod = l_incoming_args[10].toInt(); - if (l_obj_mod != 0 && l_obj_mod != 1 && l_obj_mod != 2 && l_obj_mod != 3) - return l_invalid; - l_args.append(QString::number(l_obj_mod)); + if (l_incoming_args[10].toString() != "0") { + sendServerMessage("Shouts have been disabled in this area."); + } + l_args.append("0"); } // evidence