diff options
author | rubidium <rubidium@openttd.org> | 2010-10-17 17:40:18 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2010-10-17 17:40:18 +0000 |
commit | d9602f4ef936b79c1d1ee785477323618e46f9cf (patch) | |
tree | 1420d0f86e4559de83ab250a109d2c7f7bca5f53 /src/network/network_admin.cpp | |
parent | 459514afe4f550a08d98958745d6cd8311c53fdd (diff) | |
download | openttd-d9602f4ef936b79c1d1ee785477323618e46f9cf.tar.xz |
(svn r20973) -Add: chat sending and receiving support for remote admins (dihedral)
Diffstat (limited to 'src/network/network_admin.cpp')
-rw-r--r-- | src/network/network_admin.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp index 7a86a4892..565976c70 100644 --- a/src/network/network_admin.cpp +++ b/src/network/network_admin.cpp @@ -45,6 +45,7 @@ static const AdminUpdateFrequency _admin_update_type_frequencies[] = { ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_AUTOMATIC, ///< ADMIN_UPDATE_COMPANY_INFO ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_WEEKLY | ADMIN_FREQUENCY_MONTHLY | ADMIN_FREQUENCY_QUARTERLY | ADMIN_FREQUENCY_ANUALLY, ///< ADMIN_UPDATE_COMPANY_ECONOMY ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_WEEKLY | ADMIN_FREQUENCY_MONTHLY | ADMIN_FREQUENCY_QUARTERLY | ADMIN_FREQUENCY_ANUALLY, ///< ADMIN_UPDATE_COMPANY_STATS + ADMIN_FREQUENCY_AUTOMATIC, ///< ADMIN_UPDATE_CHAT }; assert_compile(lengthof(_admin_update_type_frequencies) == ADMIN_UPDATE_END); @@ -384,6 +385,20 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyStats() return NETWORK_RECV_STATUS_OKAY; } +NetworkRecvStatus ServerNetworkAdminSocketHandler::SendChat(NetworkAction action, DestType desttype, ClientID client_id, const char *msg, int64 data) +{ + Packet *p = new Packet(ADMIN_PACKET_SERVER_CHAT); + + p->Send_uint8 (action); + p->Send_uint8 (desttype); + p->Send_uint32(client_id); + p->Send_string(msg); + p->Send_uint64(data); + + this->Send_Packet(p); + return NETWORK_RECV_STATUS_OKAY; +} + /*********** * Receiving functions ************/ @@ -496,6 +511,33 @@ DEF_ADMIN_RECEIVE_COMMAND(Server, ADMIN_PACKET_ADMIN_POLL) return NETWORK_RECV_STATUS_OKAY; } +DEF_ADMIN_RECEIVE_COMMAND(Server, ADMIN_PACKET_ADMIN_CHAT) +{ + if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + + NetworkAction action = (NetworkAction)p->Recv_uint8(); + DestType desttype = (DestType)p->Recv_uint8(); + int dest = p->Recv_uint32(); + + char msg[NETWORK_CHAT_LENGTH]; + p->Recv_string(msg, NETWORK_CHAT_LENGTH); + + switch (action) { + case NETWORK_ACTION_CHAT: + case NETWORK_ACTION_CHAT_CLIENT: + case NETWORK_ACTION_CHAT_COMPANY: + case NETWORK_ACTION_SERVER_MESSAGE: + NetworkServerSendChat(action, desttype, dest, msg, _network_own_client_id, 0, true); + break; + + default: + DEBUG(net, 3, "[admin] Invalid chat action %d from admin '%s' (%s).", action, this->admin_name, this->admin_version); + return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET); + } + + return NETWORK_RECV_STATUS_OKAY; +} + /* * Useful wrapper functions */ @@ -613,6 +655,22 @@ void NetworkAdminCompanyRemove(CompanyID company_id, AdminCompanyRemoveReason bc } } + +/** + * Send chat to the admin network (if they did opt in for the respective update). + */ +void NetworkAdminChat(NetworkAction action, DestType desttype, ClientID client_id, const char *msg, int64 data, bool from_admin) +{ + if (from_admin) return; + + ServerNetworkAdminSocketHandler *as; + FOR_ALL_ADMIN_SOCKETS(as) { + if (as->update_frequency[ADMIN_UPDATE_CHAT] & ADMIN_FREQUENCY_AUTOMATIC) { + as->SendChat(action, desttype, client_id, msg, data); + } + } +} + /** * Send a Welcome packet to all connected admins */ |