+
+/*
+ * Mod channels
+ */
+
+
+bool Server::joinModChannel(const std::string &channel)
+{
+ return m_modchannel_mgr->joinChannel(channel, PEER_ID_SERVER) &&
+ m_modchannel_mgr->setChannelState(channel, MODCHANNEL_STATE_READ_WRITE);
+}
+
+bool Server::leaveModChannel(const std::string &channel)
+{
+ return m_modchannel_mgr->leaveChannel(channel, PEER_ID_SERVER);
+}
+
+bool Server::sendModChannelMessage(const std::string &channel, const std::string &message)
+{
+ if (!m_modchannel_mgr->canWriteOnChannel(channel))
+ return false;
+
+ broadcastModChannelMessage(channel, message, PEER_ID_SERVER);
+ return true;
+}
+
+ModChannel* Server::getModChannel(const std::string &channel)
+{
+ return m_modchannel_mgr->getModChannel(channel);
+}
+
+void Server::broadcastModChannelMessage(const std::string &channel,
+ const std::string &message, session_t from_peer)
+{
+ const std::vector<u16> &peers = m_modchannel_mgr->getChannelPeers(channel);
+ if (peers.empty())
+ return;
+
+ if (message.size() > STRING_MAX_LEN) {
+ warningstream << "ModChannel message too long, dropping before sending "
+ << " (" << message.size() << " > " << STRING_MAX_LEN << ", channel: "
+ << channel << ")" << std::endl;
+ return;
+ }
+
+ std::string sender;
+ if (from_peer != PEER_ID_SERVER) {
+ sender = getPlayerName(from_peer);
+ }
+
+ NetworkPacket resp_pkt(TOCLIENT_MODCHANNEL_MSG,
+ 2 + channel.size() + 2 + sender.size() + 2 + message.size());
+ resp_pkt << channel << sender << message;
+ for (session_t peer_id : peers) {
+ // Ignore sender
+ if (peer_id == from_peer)
+ continue;
+
+ Send(peer_id, &resp_pkt);
+ }
+
+ if (from_peer != PEER_ID_SERVER) {
+ m_script->on_modchannel_message(channel, sender, message);
+ }
+}