mirror of https://github.com/OpenTTD/OpenTTD
Codechange: also allow removing clients from the company allow lists
parent
8a6745b26f
commit
fea9ffa808
|
@ -295,7 +295,7 @@ enum Commands : uint16_t {
|
||||||
|
|
||||||
CMD_CREATE_SUBSIDY, ///< create a new subsidy
|
CMD_CREATE_SUBSIDY, ///< create a new subsidy
|
||||||
CMD_COMPANY_CTRL, ///< used in multiplayer to create a new companies etc.
|
CMD_COMPANY_CTRL, ///< used in multiplayer to create a new companies etc.
|
||||||
CMD_COMPANY_ADD_ALLOW_LIST, ///< Used in multiplayer to add a client's public key to the company's allow list.
|
CMD_COMPANY_ALLOW_LIST_CTRL, ///< Used in multiplayer to add/remove a client's public key to/from the company's allow list.
|
||||||
CMD_CUSTOM_NEWS_ITEM, ///< create a custom news message
|
CMD_CUSTOM_NEWS_ITEM, ///< create a custom news message
|
||||||
CMD_CREATE_GOAL, ///< create a new goal
|
CMD_CREATE_GOAL, ///< create a new goal
|
||||||
CMD_REMOVE_GOAL, ///< remove a goal
|
CMD_REMOVE_GOAL, ///< remove a goal
|
||||||
|
|
|
@ -979,16 +979,46 @@ CommandCost CmdCompanyCtrl(DoCommandFlag flags, CompanyCtrlAction cca, CompanyID
|
||||||
return CommandCost();
|
return CommandCost();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool ExecuteAllowListCtrlAction(CompanyAllowListCtrlAction action, Company *c, const std::string &public_key)
|
||||||
|
{
|
||||||
|
switch (action) {
|
||||||
|
case CALCA_ADD:
|
||||||
|
return c->allow_list.Add(public_key);
|
||||||
|
|
||||||
|
case CALCA_REMOVE:
|
||||||
|
return c->allow_list.Remove(public_key);
|
||||||
|
|
||||||
|
default:
|
||||||
|
NOT_REACHED();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the given public key to the allow list of this company.
|
* Add or remove the given public key to the allow list of this company.
|
||||||
* @param flags Operation to perform.
|
* @param flags Operation to perform.
|
||||||
* @param public_key The public key of the client to add.
|
* @param action The action to perform.
|
||||||
|
* @param public_key The public key of the client to add or remove.
|
||||||
* @return The cost of this operation or an error.
|
* @return The cost of this operation or an error.
|
||||||
*/
|
*/
|
||||||
CommandCost CmdCompanyAddAllowList(DoCommandFlag flags, const std::string &public_key)
|
CommandCost CmdCompanyAllowListCtrl(DoCommandFlag flags, CompanyAllowListCtrlAction action, const std::string &public_key)
|
||||||
{
|
{
|
||||||
|
Company *c = Company::GetIfValid(_current_company);
|
||||||
|
if (c == nullptr) return CMD_ERROR;
|
||||||
|
|
||||||
|
/* The public key length includes the '\0'. */
|
||||||
|
if (public_key.size() != NETWORK_PUBLIC_KEY_LENGTH - 1) return CMD_ERROR;
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case CALCA_ADD:
|
||||||
|
case CALCA_REMOVE:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return CMD_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
if (Company::Get(_current_company)->allow_list.Add(public_key)) {
|
if (ExecuteAllowListCtrlAction(action, c, public_key)) {
|
||||||
InvalidateWindowData(WC_CLIENT_LIST, 0);
|
InvalidateWindowData(WC_CLIENT_LIST, 0);
|
||||||
SetWindowDirty(WC_COMPANY, _current_company);
|
SetWindowDirty(WC_COMPANY, _current_company);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ enum ClientID : uint32_t;
|
||||||
enum Colours : uint8_t;
|
enum Colours : uint8_t;
|
||||||
|
|
||||||
CommandCost CmdCompanyCtrl(DoCommandFlag flags, CompanyCtrlAction cca, CompanyID company_id, CompanyRemoveReason reason, ClientID client_id);
|
CommandCost CmdCompanyCtrl(DoCommandFlag flags, CompanyCtrlAction cca, CompanyID company_id, CompanyRemoveReason reason, ClientID client_id);
|
||||||
CommandCost CmdCompanyAddAllowList(DoCommandFlag flags, const std::string &public_key);
|
CommandCost CmdCompanyAllowListCtrl(DoCommandFlag flags, CompanyAllowListCtrlAction action, const std::string &public_key);
|
||||||
CommandCost CmdGiveMoney(DoCommandFlag flags, Money money, CompanyID dest_company);
|
CommandCost CmdGiveMoney(DoCommandFlag flags, Money money, CompanyID dest_company);
|
||||||
CommandCost CmdRenameCompany(DoCommandFlag flags, const std::string &text);
|
CommandCost CmdRenameCompany(DoCommandFlag flags, const std::string &text);
|
||||||
CommandCost CmdRenamePresident(DoCommandFlag flags, const std::string &text);
|
CommandCost CmdRenamePresident(DoCommandFlag flags, const std::string &text);
|
||||||
|
@ -26,7 +26,7 @@ CommandCost CmdSetCompanyManagerFace(DoCommandFlag flags, CompanyManagerFace cmf
|
||||||
CommandCost CmdSetCompanyColour(DoCommandFlag flags, LiveryScheme scheme, bool primary, Colours colour);
|
CommandCost CmdSetCompanyColour(DoCommandFlag flags, LiveryScheme scheme, bool primary, Colours colour);
|
||||||
|
|
||||||
DEF_CMD_TRAIT(CMD_COMPANY_CTRL, CmdCompanyCtrl, CMD_SPECTATOR | CMD_CLIENT_ID | CMD_NO_EST, CMDT_SERVER_SETTING)
|
DEF_CMD_TRAIT(CMD_COMPANY_CTRL, CmdCompanyCtrl, CMD_SPECTATOR | CMD_CLIENT_ID | CMD_NO_EST, CMDT_SERVER_SETTING)
|
||||||
DEF_CMD_TRAIT(CMD_COMPANY_ADD_ALLOW_LIST, CmdCompanyAddAllowList, CMD_NO_EST, CMDT_SERVER_SETTING)
|
DEF_CMD_TRAIT(CMD_COMPANY_ALLOW_LIST_CTRL, CmdCompanyAllowListCtrl, CMD_NO_EST, CMDT_SERVER_SETTING)
|
||||||
DEF_CMD_TRAIT(CMD_GIVE_MONEY, CmdGiveMoney, 0, CMDT_MONEY_MANAGEMENT)
|
DEF_CMD_TRAIT(CMD_GIVE_MONEY, CmdGiveMoney, 0, CMDT_MONEY_MANAGEMENT)
|
||||||
DEF_CMD_TRAIT(CMD_RENAME_COMPANY, CmdRenameCompany, 0, CMDT_COMPANY_SETTING)
|
DEF_CMD_TRAIT(CMD_RENAME_COMPANY, CmdRenameCompany, 0, CMDT_COMPANY_SETTING)
|
||||||
DEF_CMD_TRAIT(CMD_RENAME_PRESIDENT, CmdRenamePresident, 0, CMDT_COMPANY_SETTING)
|
DEF_CMD_TRAIT(CMD_RENAME_PRESIDENT, CmdRenamePresident, 0, CMDT_COMPANY_SETTING)
|
||||||
|
|
|
@ -72,4 +72,12 @@ enum CompanyCtrlAction : uint8_t {
|
||||||
CCA_END, ///< Sentinel for end.
|
CCA_END, ///< Sentinel for end.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** The action to do with CMD_COMPANY_ALLOW_LIST_CTRL. */
|
||||||
|
enum CompanyAllowListCtrlAction : uint8_t {
|
||||||
|
CALCA_ADD, ///< Create a public key.
|
||||||
|
CALCA_REMOVE, ///< Remove a public key.
|
||||||
|
|
||||||
|
CALCA_END, ///< Sentinel for end.
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* COMPANY_TYPE_H */
|
#endif /* COMPANY_TYPE_H */
|
||||||
|
|
|
@ -1519,7 +1519,7 @@ private:
|
||||||
static void OnClickClientAuthorize([[maybe_unused]] NetworkClientListWindow *w, [[maybe_unused]] Point pt, ClientID client_id)
|
static void OnClickClientAuthorize([[maybe_unused]] NetworkClientListWindow *w, [[maybe_unused]] Point pt, ClientID client_id)
|
||||||
{
|
{
|
||||||
AutoRestoreBackup<CompanyID> cur_company(_current_company, NetworkClientInfo::GetByClientID(_network_own_client_id)->client_playas);
|
AutoRestoreBackup<CompanyID> cur_company(_current_company, NetworkClientInfo::GetByClientID(_network_own_client_id)->client_playas);
|
||||||
Command<CMD_COMPANY_ADD_ALLOW_LIST>::Post(NetworkClientInfo::GetByClientID(client_id)->public_key);
|
Command<CMD_COMPANY_ALLOW_LIST_CTRL>::Post(CALCA_ADD, NetworkClientInfo::GetByClientID(client_id)->public_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1117,11 +1117,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cp.cmd == CMD_COMPANY_ADD_ALLOW_LIST) {
|
if (cp.cmd == CMD_COMPANY_ALLOW_LIST_CTRL) {
|
||||||
/* Maybe the client just got moved before allowing? */
|
/* Maybe the client just got moved before allowing? */
|
||||||
if (ci->client_id != CLIENT_ID_SERVER && ci->client_playas != cp.company) return NETWORK_RECV_STATUS_OKAY;
|
if (ci->client_id != CLIENT_ID_SERVER && ci->client_playas != cp.company) return NETWORK_RECV_STATUS_OKAY;
|
||||||
|
|
||||||
std::string public_key = std::get<0>(EndianBufferReader::ToValue<CommandTraits<CMD_COMPANY_ADD_ALLOW_LIST>::Args>(cp.data));
|
/* Only allow clients to add/remove currently joined clients. The server owner does not go via this method, so is allowed to do more. */
|
||||||
|
std::string public_key = std::get<1>(EndianBufferReader::ToValue<CommandTraits<CMD_COMPANY_ALLOW_LIST_CTRL>::Args>(cp.data));
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (const NetworkClientInfo *info : NetworkClientInfo::Iterate()) {
|
for (const NetworkClientInfo *info : NetworkClientInfo::Iterate()) {
|
||||||
if (info->public_key == public_key) {
|
if (info->public_key == public_key) {
|
||||||
|
@ -2164,7 +2165,7 @@ void NetworkServerNewCompany(const Company *c, NetworkClientInfo *ci)
|
||||||
* different state/president/company name in the different clients, we need to
|
* different state/president/company name in the different clients, we need to
|
||||||
* circumvent the normal ::Post logic and go directly to sending the command.
|
* circumvent the normal ::Post logic and go directly to sending the command.
|
||||||
*/
|
*/
|
||||||
Command<CMD_COMPANY_ADD_ALLOW_LIST>::SendNet(STR_NULL, c->index, ci->public_key);
|
Command<CMD_COMPANY_ALLOW_LIST_CTRL>::SendNet(STR_NULL, c->index, CALCA_ADD, ci->public_key);
|
||||||
Command<CMD_RENAME_PRESIDENT>::SendNet(STR_NULL, c->index, ci->client_name);
|
Command<CMD_RENAME_PRESIDENT>::SendNet(STR_NULL, c->index, ci->client_name);
|
||||||
|
|
||||||
NetworkServerSendChat(NETWORK_ACTION_COMPANY_NEW, DESTTYPE_BROADCAST, 0, "", ci->client_id, c->index + 1);
|
NetworkServerSendChat(NETWORK_ACTION_COMPANY_NEW, DESTTYPE_BROADCAST, 0, "", ci->client_id, c->index + 1);
|
||||||
|
|
Loading…
Reference in New Issue