Merge branch 'permission-overhaul'. Closes #49
Conflicts: Barotrauma/BarotraumaShared/Source/DebugConsole.cs Barotrauma/BarotraumaShared/Source/Networking/ChatMessage.cs
This commit is contained in:
@@ -15,6 +15,8 @@ namespace Barotrauma
|
|||||||
|
|
||||||
private static Queue<ColoredText> queuedMessages = new Queue<ColoredText>();
|
private static Queue<ColoredText> queuedMessages = new Queue<ColoredText>();
|
||||||
|
|
||||||
|
private static GUITextBlock activeQuestionText;
|
||||||
|
|
||||||
public static bool IsOpen
|
public static bool IsOpen
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -69,6 +71,13 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (activeQuestionText != null &&
|
||||||
|
(listBox.children.Count == 0 || listBox.children[listBox.children.Count - 1] != activeQuestionText))
|
||||||
|
{
|
||||||
|
listBox.children.Remove(activeQuestionText);
|
||||||
|
listBox.children.Add(activeQuestionText);
|
||||||
|
}
|
||||||
|
|
||||||
if (PlayerInput.KeyHit(Keys.F3))
|
if (PlayerInput.KeyHit(Keys.F3))
|
||||||
{
|
{
|
||||||
isOpen = !isOpen;
|
isOpen = !isOpen;
|
||||||
@@ -105,7 +114,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (PlayerInput.KeyHit(Keys.Enter))
|
if (PlayerInput.KeyHit(Keys.Enter))
|
||||||
{
|
{
|
||||||
ExecuteCommand(textBox.Text, game);
|
ExecuteCommand(textBox.Text);
|
||||||
textBox.Text = "";
|
textBox.Text = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -134,7 +143,7 @@ namespace Barotrauma
|
|||||||
case "entitylist":
|
case "entitylist":
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
return false;
|
return client.HasConsoleCommandPermission(command);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,13 +186,6 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
|
|
||||||
selectedIndex = Messages.Count;
|
selectedIndex = Messages.Count;
|
||||||
|
|
||||||
if (activeQuestionText != null)
|
|
||||||
{
|
|
||||||
//make sure the active question stays at the bottom of the list
|
|
||||||
listBox.children.Remove(activeQuestionText);
|
|
||||||
listBox.children.Add(activeQuestionText);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void InitProjectSpecific()
|
private static void InitProjectSpecific()
|
||||||
|
|||||||
@@ -115,10 +115,11 @@ namespace Barotrauma
|
|||||||
listBox.AddChild(child);
|
listBox.AddChild(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddItem(string text, object userData = null)
|
public void AddItem(string text, object userData = null, string toolTip = "")
|
||||||
{
|
{
|
||||||
GUITextBlock textBlock = new GUITextBlock(new Rectangle(0,0,0,20), text, "ListBoxElement", Alignment.TopLeft, Alignment.CenterLeft, listBox);
|
GUITextBlock textBlock = new GUITextBlock(new Rectangle(0,0,0,20), text, "ListBoxElement", Alignment.TopLeft, Alignment.CenterLeft, listBox);
|
||||||
textBlock.UserData = userData;
|
textBlock.UserData = userData;
|
||||||
|
textBlock.ToolTip = toolTip;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ClearChildren()
|
public override void ClearChildren()
|
||||||
|
|||||||
@@ -171,12 +171,12 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
for (int i = 0; i < children.Count; i++)
|
for (int i = 0; i < children.Count; i++)
|
||||||
{
|
{
|
||||||
if (!children[i].UserData.Equals(userData)) continue;
|
if ((children[i].UserData != null && children[i].UserData.Equals(userData)) ||
|
||||||
|
(children[i].UserData == null && userData == null))
|
||||||
Select(i, force);
|
{
|
||||||
|
Select(i, force);
|
||||||
//if (OnSelected != null) OnSelected(Selected, Selected.UserData);
|
if (!SelectMultiple) return;
|
||||||
if (!SelectMultiple) return;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,12 +7,8 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
public static List<GUIComponent> MessageBoxes = new List<GUIComponent>();
|
public static List<GUIComponent> MessageBoxes = new List<GUIComponent>();
|
||||||
|
|
||||||
const int DefaultWidth=400, DefaultHeight=250;
|
public const int DefaultWidth = 400, DefaultHeight = 250;
|
||||||
|
|
||||||
//public delegate bool OnClickedHandler(GUIButton button, object obj);
|
|
||||||
//public OnClickedHandler OnClicked;
|
|
||||||
|
|
||||||
//GUIFrame frame;
|
|
||||||
public GUIButton[] Buttons;
|
public GUIButton[] Buttons;
|
||||||
|
|
||||||
public static GUIComponent VisibleBox
|
public static GUIComponent VisibleBox
|
||||||
|
|||||||
@@ -50,8 +50,8 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
base.Rect = value;
|
base.Rect = value;
|
||||||
|
|
||||||
box.Rect = new Rectangle(value.X,value.Y,box.Rect.Width,box.Rect.Height);
|
if (box != null) box.Rect = new Rectangle(value.X,value.Y,box.Rect.Width,box.Rect.Height);
|
||||||
text.Rect = new Rectangle(box.Rect.Right, box.Rect.Y + 2, 20, box.Rect.Height);
|
if (text != null) text.Rect = new Rectangle(box.Rect.Right, box.Rect.Y + 2, 20, box.Rect.Height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
using Lidgren.Network;
|
using Lidgren.Network;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Barotrauma.Networking
|
namespace Barotrauma.Networking
|
||||||
{
|
{
|
||||||
@@ -40,6 +36,10 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
new GUIMessageBox("", txt);
|
new GUIMessageBox("", txt);
|
||||||
}
|
}
|
||||||
|
else if (type == ChatMessageType.Console)
|
||||||
|
{
|
||||||
|
DebugConsole.NewMessage(txt, MessageColor[(int)ChatMessageType.Console]);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GameMain.Client.AddChatMessage(txt, type, senderName, senderCharacter);
|
GameMain.Client.AddChatMessage(txt, type, senderName, senderCharacter);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ namespace Barotrauma.Networking
|
|||||||
private GUITickBox endVoteTickBox;
|
private GUITickBox endVoteTickBox;
|
||||||
|
|
||||||
private ClientPermissions permissions = ClientPermissions.None;
|
private ClientPermissions permissions = ClientPermissions.None;
|
||||||
|
private List<string> permittedConsoleCommands = new List<string>();
|
||||||
|
|
||||||
private bool connected;
|
private bool connected;
|
||||||
|
|
||||||
@@ -598,16 +599,28 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
private void ReadPermissions(NetIncomingMessage inc)
|
private void ReadPermissions(NetIncomingMessage inc)
|
||||||
{
|
{
|
||||||
|
List<string> permittedConsoleCommands = new List<string>();
|
||||||
ClientPermissions newPermissions = (ClientPermissions)inc.ReadByte();
|
ClientPermissions newPermissions = (ClientPermissions)inc.ReadByte();
|
||||||
if (newPermissions != permissions)
|
if (newPermissions.HasFlag(ClientPermissions.ConsoleCommands))
|
||||||
{
|
{
|
||||||
SetPermissions(newPermissions);
|
UInt16 consoleCommandCount = inc.ReadUInt16();
|
||||||
}
|
for (int i = 0; i < consoleCommandCount; i++)
|
||||||
|
{
|
||||||
|
permittedConsoleCommands.Add(inc.ReadString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetPermissions(newPermissions, permittedConsoleCommands);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetPermissions(ClientPermissions newPermissions)
|
private void SetPermissions(ClientPermissions newPermissions, List<string> permittedConsoleCommands)
|
||||||
{
|
{
|
||||||
if (newPermissions == permissions) return;
|
if (!(this.permittedConsoleCommands.Any(c => !permittedConsoleCommands.Contains(c)) ||
|
||||||
|
permittedConsoleCommands.Any(c => !this.permittedConsoleCommands.Contains(c))))
|
||||||
|
{
|
||||||
|
if (newPermissions == permissions) return;
|
||||||
|
}
|
||||||
|
|
||||||
GUIMessageBox.MessageBoxes.RemoveAll(mb => mb.UserData as string == "permissions");
|
GUIMessageBox.MessageBoxes.RemoveAll(mb => mb.UserData as string == "permissions");
|
||||||
|
|
||||||
string msg = "";
|
string msg = "";
|
||||||
@@ -626,8 +639,22 @@ namespace Barotrauma.Networking
|
|||||||
msg += " - " + attributes[0].Description + "\n";
|
msg += " - " + attributes[0].Description + "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
permissions = newPermissions;
|
permissions = newPermissions;
|
||||||
new GUIMessageBox("Permissions changed", msg).UserData = "permissions";
|
this.permittedConsoleCommands = new List<string>(permittedConsoleCommands);
|
||||||
|
GUIMessageBox msgBox = new GUIMessageBox("Permissions changed", msg, GUIMessageBox.DefaultWidth, 0);
|
||||||
|
msgBox.UserData = "permissions";
|
||||||
|
|
||||||
|
if (newPermissions.HasFlag(ClientPermissions.ConsoleCommands))
|
||||||
|
{
|
||||||
|
int listBoxWidth = (int)(msgBox.InnerFrame.Rect.Width - msgBox.InnerFrame.Padding.X - msgBox.InnerFrame.Padding.Z) / 2 - 30;
|
||||||
|
new GUITextBlock(new Rectangle(0, 0, listBoxWidth, 15), "Permitted console commands:", "", Alignment.TopRight, Alignment.TopLeft, msgBox.InnerFrame, true, GUI.SmallFont);
|
||||||
|
var commandList = new GUIListBox(new Rectangle(0, 20, listBoxWidth, 0), "", Alignment.BottomRight, msgBox.InnerFrame);
|
||||||
|
foreach (string permittedCommand in permittedConsoleCommands)
|
||||||
|
{
|
||||||
|
new GUITextBlock(new Rectangle(0, 0, 0, 15), permittedCommand, "", commandList, GUI.SmallFont).CanBeFocused = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GameMain.NetLobbyScreen.SubList.Enabled = Voting.AllowSubVoting || HasPermission(ClientPermissions.SelectSub);
|
GameMain.NetLobbyScreen.SubList.Enabled = Voting.AllowSubVoting || HasPermission(ClientPermissions.SelectSub);
|
||||||
GameMain.NetLobbyScreen.ModeList.Enabled = Voting.AllowModeVoting || HasPermission(ClientPermissions.SelectMode);
|
GameMain.NetLobbyScreen.ModeList.Enabled = Voting.AllowModeVoting || HasPermission(ClientPermissions.SelectMode);
|
||||||
@@ -805,7 +832,7 @@ namespace Barotrauma.Networking
|
|||||||
gameStarted = inc.ReadBoolean();
|
gameStarted = inc.ReadBoolean();
|
||||||
bool allowSpectating = inc.ReadBoolean();
|
bool allowSpectating = inc.ReadBoolean();
|
||||||
|
|
||||||
SetPermissions((ClientPermissions)inc.ReadByte());
|
ReadPermissions(inc);
|
||||||
|
|
||||||
if (gameStarted)
|
if (gameStarted)
|
||||||
{
|
{
|
||||||
@@ -1169,6 +1196,14 @@ namespace Barotrauma.Networking
|
|||||||
return permissions.HasFlag(permission);
|
return permissions.HasFlag(permission);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool HasConsoleCommandPermission(string command)
|
||||||
|
{
|
||||||
|
if (!permissions.HasFlag(ClientPermissions.ConsoleCommands)) return false;
|
||||||
|
|
||||||
|
command = command.ToLowerInvariant();
|
||||||
|
return permittedConsoleCommands.Any(c => c.ToLowerInvariant() == command);
|
||||||
|
}
|
||||||
|
|
||||||
public override void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch)
|
public override void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch)
|
||||||
{
|
{
|
||||||
base.Draw(spriteBatch);
|
base.Draw(spriteBatch);
|
||||||
@@ -1359,6 +1394,25 @@ namespace Barotrauma.Networking
|
|||||||
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SendConsoleCommand(string command)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(command))
|
||||||
|
{
|
||||||
|
DebugConsole.ThrowError("Cannot send an empty console command to the server!\n" + Environment.StackTrace);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetOutgoingMessage msg = client.CreateMessage();
|
||||||
|
msg.Write((byte)ClientPacketHeader.SERVER_COMMAND);
|
||||||
|
msg.Write((byte)ClientPermissions.ConsoleCommands);
|
||||||
|
msg.Write(command);
|
||||||
|
Vector2 cursorWorldPos = GameMain.GameScreen.Cam.ScreenToWorld(PlayerInput.MousePosition);
|
||||||
|
msg.Write(cursorWorldPos.X);
|
||||||
|
msg.Write(cursorWorldPos.Y);
|
||||||
|
|
||||||
|
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tell the server to select a submarine (permission required)
|
/// Tell the server to select a submarine (permission required)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -882,24 +882,54 @@ namespace Barotrauma
|
|||||||
|
|
||||||
playerFrame = new GUIFrame(new Rectangle(0, 0, 0, 0), Color.Black * 0.6f);
|
playerFrame = new GUIFrame(new Rectangle(0, 0, 0, 0), Color.Black * 0.6f);
|
||||||
|
|
||||||
var playerFrameInner = new GUIFrame(new Rectangle(0, 0, 300, 280), null, Alignment.Center, "", playerFrame);
|
var playerFrameInner = new GUIFrame(GameMain.Server != null ? new Rectangle(0, 0, 450, 370) : new Rectangle(0, 0, 450, 150), null, Alignment.Center, "", playerFrame);
|
||||||
playerFrameInner.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f);
|
playerFrameInner.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f);
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(0, 0, 200, 20), component.UserData.ToString(),
|
new GUITextBlock(new Rectangle(0, 0, 200, 20), obj.ToString(),
|
||||||
"", Alignment.TopLeft, Alignment.TopLeft,
|
"", Alignment.TopLeft, Alignment.TopLeft,
|
||||||
playerFrameInner, false, GUI.LargeFont);
|
playerFrameInner, false, GUI.LargeFont);
|
||||||
|
|
||||||
if (GameMain.Server != null)
|
if (GameMain.Server != null)
|
||||||
{
|
{
|
||||||
var selectedClient = GameMain.Server.ConnectedClients.Find(c => c.Name == component.UserData.ToString());
|
var selectedClient = GameMain.Server.ConnectedClients.Find(c => c.Name == obj.ToString());
|
||||||
|
playerFrame.UserData = selectedClient;
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(0, 25, 150, 15), selectedClient.Connection.RemoteEndPoint.Address.ToString(), "", playerFrameInner);
|
new GUITextBlock(new Rectangle(0, 25, 150, 15), selectedClient.Connection.RemoteEndPoint.Address.ToString(), "", playerFrameInner);
|
||||||
|
|
||||||
var permissionsBox = new GUIFrame(new Rectangle(0, 60, 0, 90), null, playerFrameInner);
|
new GUITextBlock(new Rectangle(0, 45, 0, 15), "Rank", "", playerFrameInner);
|
||||||
|
var rankDropDown = new GUIDropDown(new Rectangle(0, 70, 150, 20), "Rank", "", playerFrameInner);
|
||||||
|
rankDropDown.UserData = selectedClient;
|
||||||
|
foreach (PermissionPreset permissionPreset in PermissionPreset.List)
|
||||||
|
{
|
||||||
|
rankDropDown.AddItem(permissionPreset.Name, permissionPreset, permissionPreset.Description);
|
||||||
|
}
|
||||||
|
rankDropDown.AddItem("Custom", null);
|
||||||
|
|
||||||
|
PermissionPreset currentPreset = PermissionPreset.List.Find(p =>
|
||||||
|
p.Permissions == selectedClient.Permissions &&
|
||||||
|
p.PermittedCommands.Count == selectedClient.PermittedConsoleCommands.Count && !p.PermittedCommands.Except(selectedClient.PermittedConsoleCommands).Any());
|
||||||
|
rankDropDown.SelectItem(currentPreset);
|
||||||
|
|
||||||
|
rankDropDown.OnSelected += (c, userdata) =>
|
||||||
|
{
|
||||||
|
PermissionPreset selectedPreset = (PermissionPreset)userdata;
|
||||||
|
if (selectedPreset != null)
|
||||||
|
{
|
||||||
|
var client = playerFrame.UserData as Client;
|
||||||
|
client.SetPermissions(selectedPreset.Permissions, selectedPreset.PermittedCommands);
|
||||||
|
GameMain.Server.UpdateClientPermissions(client);
|
||||||
|
|
||||||
|
playerFrame = null;
|
||||||
|
SelectPlayer(null, client.Name);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
var permissionsBox = new GUIFrame(new Rectangle(0, 125, (int)(playerFrameInner.Rect.Width * 0.5f), 160), null, playerFrameInner);
|
||||||
permissionsBox.Padding = new Vector4(5.0f, 5.0f, 5.0f, 5.0f);
|
permissionsBox.Padding = new Vector4(5.0f, 5.0f, 5.0f, 5.0f);
|
||||||
permissionsBox.UserData = selectedClient;
|
permissionsBox.UserData = selectedClient;
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(0, 0, 0, 15), "Permissions:", "", permissionsBox);
|
new GUITextBlock(new Rectangle(0, 100, permissionsBox.Rect.Width, 15), "Permissions:", "", playerFrameInner);
|
||||||
int x = 0, y = 0;
|
int x = 0, y = 0;
|
||||||
foreach (ClientPermissions permission in Enum.GetValues(typeof(ClientPermissions)))
|
foreach (ClientPermissions permission in Enum.GetValues(typeof(ClientPermissions)))
|
||||||
{
|
{
|
||||||
@@ -910,13 +940,16 @@ namespace Barotrauma
|
|||||||
|
|
||||||
string permissionStr = attributes.Length > 0 ? attributes[0].Description : permission.ToString();
|
string permissionStr = attributes.Length > 0 ? attributes[0].Description : permission.ToString();
|
||||||
|
|
||||||
var permissionTick = new GUITickBox(new Rectangle(x, y + 25, 15, 15), permissionStr, Alignment.TopLeft, GUI.SmallFont, permissionsBox);
|
var permissionTick = new GUITickBox(new Rectangle(x, y, 15, 15), permissionStr, Alignment.TopLeft, GUI.SmallFont, permissionsBox);
|
||||||
permissionTick.UserData = permission;
|
permissionTick.UserData = permission;
|
||||||
permissionTick.Selected = selectedClient.HasPermission(permission);
|
permissionTick.Selected = selectedClient.HasPermission(permission);
|
||||||
|
|
||||||
permissionTick.OnSelected = (tickBox) =>
|
permissionTick.OnSelected = (tickBox) =>
|
||||||
{
|
{
|
||||||
var client = tickBox.Parent.UserData as Client;
|
//reset rank to custom
|
||||||
|
rankDropDown.SelectItem(null);
|
||||||
|
|
||||||
|
var client = playerFrame.UserData as Client;
|
||||||
if (client == null) return false;
|
if (client == null) return false;
|
||||||
|
|
||||||
var thisPermission = (ClientPermissions)tickBox.UserData;
|
var thisPermission = (ClientPermissions)tickBox.UserData;
|
||||||
@@ -931,19 +964,50 @@ namespace Barotrauma
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
y += 20;
|
y += 20;
|
||||||
if (y >= permissionsBox.Rect.Height - 40)
|
if (y >= permissionsBox.Rect.Height - 15)
|
||||||
{
|
{
|
||||||
y = 0;
|
y = 0;
|
||||||
x += 100;
|
x += 120;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
new GUITextBlock(new Rectangle(0, 100, (int)(playerFrameInner.Rect.Width * 0.5f), 15), "Permitted console commands:", "", Alignment.TopRight, Alignment.TopLeft, playerFrameInner, true);
|
||||||
|
var commandList = new GUIListBox(new Rectangle(0, 125, (int)(playerFrameInner.Rect.Width * 0.5f), 160), "", Alignment.TopRight, playerFrameInner);
|
||||||
|
commandList.UserData = selectedClient;
|
||||||
|
foreach (DebugConsole.Command command in DebugConsole.Commands)
|
||||||
|
{
|
||||||
|
var commandTickBox = new GUITickBox(new Rectangle(0, 0, 15, 15), command.names[0], Alignment.TopLeft, GUI.SmallFont, commandList);
|
||||||
|
commandTickBox.Selected = selectedClient.PermittedConsoleCommands.Contains(command);
|
||||||
|
commandTickBox.ToolTip = command.help;
|
||||||
|
commandTickBox.UserData = command;
|
||||||
|
commandTickBox.OnSelected += (GUITickBox tickBox) =>
|
||||||
|
{
|
||||||
|
//reset rank to custom
|
||||||
|
rankDropDown.SelectItem(null);
|
||||||
|
|
||||||
|
Client client = playerFrame.UserData as Client;
|
||||||
|
DebugConsole.Command selectedCommand = tickBox.UserData as DebugConsole.Command;
|
||||||
|
if (client == null) return false;
|
||||||
|
|
||||||
|
if (!tickBox.Selected)
|
||||||
|
{
|
||||||
|
client.PermittedConsoleCommands.Remove(selectedCommand);
|
||||||
|
}
|
||||||
|
else if (!client.PermittedConsoleCommands.Contains(selectedCommand))
|
||||||
|
{
|
||||||
|
client.PermittedConsoleCommands.Add(selectedCommand);
|
||||||
|
}
|
||||||
|
|
||||||
|
GameMain.Server.UpdateClientPermissions(client);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GameMain.Server != null || GameMain.Client.HasPermission(ClientPermissions.Kick))
|
if (GameMain.Server != null || GameMain.Client.HasPermission(ClientPermissions.Kick))
|
||||||
{
|
{
|
||||||
var kickButton = new GUIButton(new Rectangle(0, -50, 100, 20), "Kick", Alignment.BottomLeft, "", playerFrameInner);
|
var kickButton = new GUIButton(new Rectangle(0, 0, 80, 20), "Kick", Alignment.BottomLeft, "", playerFrameInner);
|
||||||
kickButton.UserData = obj;
|
kickButton.UserData = obj;
|
||||||
kickButton.OnClicked += KickPlayer;
|
kickButton.OnClicked += KickPlayer;
|
||||||
kickButton.OnClicked += ClosePlayerFrame;
|
kickButton.OnClicked += ClosePlayerFrame;
|
||||||
@@ -951,12 +1015,12 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (GameMain.Server != null || GameMain.Client.HasPermission(ClientPermissions.Ban))
|
if (GameMain.Server != null || GameMain.Client.HasPermission(ClientPermissions.Ban))
|
||||||
{
|
{
|
||||||
var banButton = new GUIButton(new Rectangle(0, 0, 100, 20), "Ban", Alignment.BottomLeft, "", playerFrameInner);
|
var banButton = new GUIButton(new Rectangle(90, 0, 80, 20), "Ban", Alignment.BottomLeft, "", playerFrameInner);
|
||||||
banButton.UserData = obj;
|
banButton.UserData = obj;
|
||||||
banButton.OnClicked += BanPlayer;
|
banButton.OnClicked += BanPlayer;
|
||||||
banButton.OnClicked += ClosePlayerFrame;
|
banButton.OnClicked += ClosePlayerFrame;
|
||||||
|
|
||||||
var rangebanButton = new GUIButton(new Rectangle(0, -25, 100, 20), "Ban range", Alignment.BottomLeft, "", playerFrameInner);
|
var rangebanButton = new GUIButton(new Rectangle(180, 0, 80, 20), "Ban range", Alignment.BottomLeft, "", playerFrameInner);
|
||||||
rangebanButton.UserData = obj;
|
rangebanButton.UserData = obj;
|
||||||
rangebanButton.OnClicked += BanPlayerRange;
|
rangebanButton.OnClicked += BanPlayerRange;
|
||||||
rangebanButton.OnClicked += ClosePlayerFrame;
|
rangebanButton.OnClicked += ClosePlayerFrame;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace Barotrauma
|
namespace Barotrauma
|
||||||
{
|
{
|
||||||
@@ -16,7 +15,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
while (QueuedCommands.Count>0)
|
while (QueuedCommands.Count>0)
|
||||||
{
|
{
|
||||||
ExecuteCommand(QueuedCommands[0], GameMain.Instance);
|
ExecuteCommand(QueuedCommands[0]);
|
||||||
QueuedCommands.RemoveAt(0);
|
QueuedCommands.RemoveAt(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -742,6 +742,9 @@
|
|||||||
<Content Include="$(MSBuildThisFileDirectory)Data\ContentPackages\Vanilla 0.7.xml">
|
<Content Include="$(MSBuildThisFileDirectory)Data\ContentPackages\Vanilla 0.7.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
<Content Include="$(MSBuildThisFileDirectory)Data\permissionpresets.xml">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<Content Include="$(MSBuildThisFileDirectory)Icon.ico" />
|
<Content Include="$(MSBuildThisFileDirectory)Icon.ico" />
|
||||||
<Content Include="$(MSBuildThisFileDirectory)Mods\info.txt">
|
<Content Include="$(MSBuildThisFileDirectory)Mods\info.txt">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
@@ -1491,6 +1494,7 @@
|
|||||||
<Compile Include="$(MSBuildThisFileDirectory)Source\Networking\BanList.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Source\Networking\BanList.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Source\Networking\ChatMessage.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Source\Networking\ChatMessage.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Source\Networking\Client.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Source\Networking\Client.cs" />
|
||||||
|
<Compile Include="$(MSBuildThisFileDirectory)Source\Networking\ClientPermissions.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Source\Networking\EntitySpawner.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Source\Networking\EntitySpawner.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Source\Networking\FileTransfer\FileSender.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Source\Networking\FileTransfer\FileSender.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Source\Networking\GameServer.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Source\Networking\GameServer.cs" />
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<PermissionPresets>
|
||||||
|
<Preset
|
||||||
|
name="None"
|
||||||
|
description="No special privileges."
|
||||||
|
permissions="None"/>
|
||||||
|
|
||||||
|
<Preset
|
||||||
|
name="Moderator"
|
||||||
|
description="Allowed to manage round settings and kick players."
|
||||||
|
permissions="EndRound,Kick,SelectSub,SelectMode,ManageCampaign,ConsoleCommands">
|
||||||
|
<Command name="clientlist"/>
|
||||||
|
<Command name="autorestart"/>
|
||||||
|
<Command name="autorestartinterval"/>
|
||||||
|
<Command name="autorestarttimer"/>
|
||||||
|
<Command name="kick"/>
|
||||||
|
<Command name="kickid"/>
|
||||||
|
<Command name="campaigninfo"/>
|
||||||
|
<Command name="campaigndestination"/>
|
||||||
|
</Preset>
|
||||||
|
|
||||||
|
<Preset
|
||||||
|
name="Admin"
|
||||||
|
description="Allowed to ban and kick players, manage round settings and use nearly all console commands."
|
||||||
|
permissions="EndRound,Kick,Ban,SelectSub,SelectMode,ManageCampaign,ConsoleCommands">
|
||||||
|
<Command name="clientlist"/>
|
||||||
|
<Command name="autorestart"/>
|
||||||
|
<Command name="autorestartinterval"/>
|
||||||
|
<Command name="autorestarttimer"/>
|
||||||
|
<Command name="kick"/>
|
||||||
|
<Command name="kickid"/>
|
||||||
|
<Command name="campaigninfo"/>
|
||||||
|
<Command name="campaigndestination"/>
|
||||||
|
<Command name="spawn"/>
|
||||||
|
<Command name="spawnitem"/>
|
||||||
|
<Command name="disablecrewai"/>
|
||||||
|
<Command name="enablecrewai"/>
|
||||||
|
<Command name="ban"/>
|
||||||
|
<Command name="banid"/>
|
||||||
|
<Command name="banip"/>
|
||||||
|
<Command name="teleportcharacter"/>
|
||||||
|
<Command name="godmode"/>
|
||||||
|
<Command name="lockx"/>
|
||||||
|
<Command name="locky"/>
|
||||||
|
<Command name="heal"/>
|
||||||
|
<Command name="revive"/>
|
||||||
|
<Command name="freeze"/>
|
||||||
|
<Command name="freecam"/>
|
||||||
|
<Command name="explosion"/>
|
||||||
|
<Command name="fixitems"/>
|
||||||
|
<Command name="fixhulls"/>
|
||||||
|
<Command name="power"/>
|
||||||
|
<Command name="oxygen"/>
|
||||||
|
<Command name="setclientcharacter"/>
|
||||||
|
</Preset>
|
||||||
|
</PermissionPresets>
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
enum ChatMessageType
|
enum ChatMessageType
|
||||||
{
|
{
|
||||||
Default, Error, Dead, Server, Radio, Private, MessageBox
|
Default, Error, Dead, Server, Radio, Private, Console, MessageBox
|
||||||
}
|
}
|
||||||
|
|
||||||
partial class ChatMessage
|
partial class ChatMessage
|
||||||
@@ -25,7 +25,8 @@ namespace Barotrauma.Networking
|
|||||||
new Color(63, 72, 204), //dead
|
new Color(63, 72, 204), //dead
|
||||||
new Color(157, 225, 160), //server
|
new Color(157, 225, 160), //server
|
||||||
new Color(238, 208, 0), //radio
|
new Color(238, 208, 0), //radio
|
||||||
new Color(64, 240, 89) //private
|
new Color(64, 240, 89), //private
|
||||||
|
new Color(255, 255, 255) //console
|
||||||
};
|
};
|
||||||
|
|
||||||
public readonly string Text;
|
public readonly string Text;
|
||||||
|
|||||||
@@ -1,29 +1,10 @@
|
|||||||
using Lidgren.Network;
|
using Lidgren.Network;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace Barotrauma.Networking
|
namespace Barotrauma.Networking
|
||||||
{
|
{
|
||||||
[Flags]
|
|
||||||
enum ClientPermissions
|
|
||||||
{
|
|
||||||
None = 0,
|
|
||||||
[Description("End round")]
|
|
||||||
EndRound = 1,
|
|
||||||
[Description("Kick")]
|
|
||||||
Kick = 2,
|
|
||||||
[Description("Ban")]
|
|
||||||
Ban = 4,
|
|
||||||
[Description("Select submarine")]
|
|
||||||
SelectSub = 8,
|
|
||||||
[Description("Select game mode")]
|
|
||||||
SelectMode = 16,
|
|
||||||
[Description("Manage campaign")]
|
|
||||||
ManageCampaign = 32
|
|
||||||
}
|
|
||||||
|
|
||||||
class Client
|
class Client
|
||||||
{
|
{
|
||||||
public string Name;
|
public string Name;
|
||||||
@@ -96,6 +77,11 @@ namespace Barotrauma.Networking
|
|||||||
public float DeleteDisconnectedTimer;
|
public float DeleteDisconnectedTimer;
|
||||||
|
|
||||||
public ClientPermissions Permissions = ClientPermissions.None;
|
public ClientPermissions Permissions = ClientPermissions.None;
|
||||||
|
public List<DebugConsole.Command> PermittedConsoleCommands
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
private set;
|
||||||
|
}
|
||||||
|
|
||||||
public bool SpectateOnly;
|
public bool SpectateOnly;
|
||||||
|
|
||||||
@@ -130,6 +116,7 @@ namespace Barotrauma.Networking
|
|||||||
this.Name = name;
|
this.Name = name;
|
||||||
this.ID = ID;
|
this.ID = ID;
|
||||||
|
|
||||||
|
PermittedConsoleCommands = new List<DebugConsole.Command>();
|
||||||
kickVoters = new List<Client>();
|
kickVoters = new List<Client>();
|
||||||
|
|
||||||
votes = new object[Enum.GetNames(typeof(VoteType)).Length];
|
votes = new object[Enum.GetNames(typeof(VoteType)).Length];
|
||||||
@@ -171,9 +158,10 @@ namespace Barotrauma.Networking
|
|||||||
return rName;
|
return rName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetPermissions(ClientPermissions permissions)
|
public void SetPermissions(ClientPermissions permissions, List<DebugConsole.Command> permittedConsoleCommands)
|
||||||
{
|
{
|
||||||
this.Permissions = permissions;
|
this.Permissions = permissions;
|
||||||
|
this.PermittedConsoleCommands = new List<DebugConsole.Command>(permittedConsoleCommands);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GivePermission(ClientPermissions permission)
|
public void GivePermission(ClientPermissions permission)
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.IO;
|
||||||
|
using System.Xml.Linq;
|
||||||
|
|
||||||
|
namespace Barotrauma.Networking
|
||||||
|
{
|
||||||
|
[Flags]
|
||||||
|
enum ClientPermissions
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
[Description("End round")]
|
||||||
|
EndRound = 1,
|
||||||
|
[Description("Kick")]
|
||||||
|
Kick = 2,
|
||||||
|
[Description("Ban")]
|
||||||
|
Ban = 4,
|
||||||
|
[Description("Select submarine")]
|
||||||
|
SelectSub = 8,
|
||||||
|
[Description("Select game mode")]
|
||||||
|
SelectMode = 16,
|
||||||
|
[Description("Manage campaign")]
|
||||||
|
ManageCampaign = 32,
|
||||||
|
[Description("Console commands")]
|
||||||
|
ConsoleCommands = 64
|
||||||
|
}
|
||||||
|
|
||||||
|
class PermissionPreset
|
||||||
|
{
|
||||||
|
public static List<PermissionPreset> List = new List<PermissionPreset>();
|
||||||
|
|
||||||
|
public readonly string Name;
|
||||||
|
public readonly string Description;
|
||||||
|
public readonly ClientPermissions Permissions;
|
||||||
|
public readonly List<DebugConsole.Command> PermittedCommands;
|
||||||
|
|
||||||
|
public PermissionPreset(XElement element)
|
||||||
|
{
|
||||||
|
Name = element.GetAttributeString("name", "");
|
||||||
|
Description = element.GetAttributeString("description", "");
|
||||||
|
|
||||||
|
string permissionsStr = element.GetAttributeString("permissions", "");
|
||||||
|
if (!Enum.TryParse(permissionsStr, out Permissions))
|
||||||
|
{
|
||||||
|
DebugConsole.ThrowError("Error in permission preset \"" + Name + "\" - " + permissionsStr + " is not a valid permission!");
|
||||||
|
}
|
||||||
|
|
||||||
|
PermittedCommands = new List<DebugConsole.Command>();
|
||||||
|
if (Permissions.HasFlag(ClientPermissions.ConsoleCommands))
|
||||||
|
{
|
||||||
|
foreach (XElement subElement in element.Elements())
|
||||||
|
{
|
||||||
|
if (subElement.Name.ToString().ToLowerInvariant() != "command") continue;
|
||||||
|
string commandName = subElement.GetAttributeString("name", "");
|
||||||
|
|
||||||
|
DebugConsole.Command command = DebugConsole.FindCommand(commandName);
|
||||||
|
if (command == null)
|
||||||
|
{
|
||||||
|
DebugConsole.ThrowError("Error in permission preset \"" + Name + "\" - " + commandName + "\" is not a valid console command.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
PermittedCommands.Add(command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void LoadAll(string file)
|
||||||
|
{
|
||||||
|
if (!File.Exists(file)) return;
|
||||||
|
|
||||||
|
XDocument doc = XMLExtensions.TryLoadXml(file);
|
||||||
|
if (doc == null || doc.Root == null) return;
|
||||||
|
|
||||||
|
foreach (XElement element in doc.Root.Elements())
|
||||||
|
{
|
||||||
|
List.Add(new PermissionPreset(element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -125,8 +125,9 @@ namespace Barotrauma.Networking
|
|||||||
banList = new BanList();
|
banList = new BanList();
|
||||||
|
|
||||||
LoadSettings();
|
LoadSettings();
|
||||||
|
PermissionPreset.LoadAll(PermissionPresetFile);
|
||||||
LoadClientPermissions();
|
LoadClientPermissions();
|
||||||
|
|
||||||
CoroutineManager.StartCoroutine(StartServer(isPublic));
|
CoroutineManager.StartCoroutine(StartServer(isPublic));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -795,6 +796,11 @@ namespace Barotrauma.Networking
|
|||||||
campaign.ServerRead(inc, sender);
|
campaign.ServerRead(inc, sender);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ClientPermissions.ConsoleCommands:
|
||||||
|
string consoleCommand = inc.ReadString();
|
||||||
|
Vector2 clientCursorPos = new Vector2(inc.ReadSingle(), inc.ReadSingle());
|
||||||
|
DebugConsole.ExecuteClientCommand(sender, clientCursorPos, consoleCommand);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
inc.ReadPadBits();
|
inc.ReadPadBits();
|
||||||
@@ -853,7 +859,7 @@ namespace Barotrauma.Networking
|
|||||||
outmsg.Write(GameStarted);
|
outmsg.Write(GameStarted);
|
||||||
outmsg.Write(AllowSpectating);
|
outmsg.Write(AllowSpectating);
|
||||||
|
|
||||||
outmsg.Write((byte)c.Permissions);
|
WritePermissions(outmsg, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ClientWriteIngame(Client c)
|
private void ClientWriteIngame(Client c)
|
||||||
@@ -1636,6 +1642,18 @@ namespace Barotrauma.Networking
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SendChatMessage(string txt, Client recipient)
|
||||||
|
{
|
||||||
|
ChatMessage msg = ChatMessage.Create("", txt, ChatMessageType.Server, null);
|
||||||
|
SendChatMessage(msg, recipient);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendConsoleMessage(string txt, Client recipient)
|
||||||
|
{
|
||||||
|
ChatMessage msg = ChatMessage.Create("", txt, ChatMessageType.Console, null);
|
||||||
|
SendChatMessage(msg, recipient);
|
||||||
|
}
|
||||||
|
|
||||||
public void SendChatMessage(ChatMessage msg, Client recipient)
|
public void SendChatMessage(ChatMessage msg, Client recipient)
|
||||||
{
|
{
|
||||||
msg.NetStateID = recipient.ChatMsgQueue.Count > 0 ?
|
msg.NetStateID = recipient.ChatMsgQueue.Count > 0 ?
|
||||||
@@ -1936,16 +1954,34 @@ namespace Barotrauma.Networking
|
|||||||
clientPermissions.Add(new SavedClientPermission(
|
clientPermissions.Add(new SavedClientPermission(
|
||||||
client.Name,
|
client.Name,
|
||||||
client.Connection.RemoteEndPoint.Address.ToString(),
|
client.Connection.RemoteEndPoint.Address.ToString(),
|
||||||
client.Permissions));
|
client.Permissions,
|
||||||
|
client.PermittedConsoleCommands));
|
||||||
}
|
}
|
||||||
|
|
||||||
var msg = server.CreateMessage();
|
var msg = server.CreateMessage();
|
||||||
msg.Write((byte)ServerPacketHeader.PERMISSIONS);
|
msg.Write((byte)ServerPacketHeader.PERMISSIONS);
|
||||||
msg.Write((byte)client.Permissions);
|
WritePermissions(msg, client);
|
||||||
|
|
||||||
server.SendMessage(msg, client.Connection, NetDeliveryMethod.ReliableUnordered);
|
server.SendMessage(msg, client.Connection, NetDeliveryMethod.ReliableUnordered);
|
||||||
|
|
||||||
SaveClientPermissions();
|
SaveClientPermissions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void WritePermissions(NetBuffer msg, Client client)
|
||||||
|
{
|
||||||
|
msg.Write((byte)client.Permissions);
|
||||||
|
if (client.Permissions.HasFlag(ClientPermissions.ConsoleCommands))
|
||||||
|
{
|
||||||
|
msg.Write((UInt16)client.PermittedConsoleCommands.Sum(c => c.names.Length));
|
||||||
|
foreach (DebugConsole.Command command in client.PermittedConsoleCommands)
|
||||||
|
{
|
||||||
|
foreach (string commandName in command.names)
|
||||||
|
{
|
||||||
|
msg.Write(commandName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SetClientCharacter(Client client, Character newCharacter)
|
public void SetClientCharacter(Client client, Character newCharacter)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -218,11 +218,11 @@ namespace Barotrauma.Networking
|
|||||||
var savedPermissions = clientPermissions.Find(cp => cp.IP == newClient.Connection.RemoteEndPoint.Address.ToString());
|
var savedPermissions = clientPermissions.Find(cp => cp.IP == newClient.Connection.RemoteEndPoint.Address.ToString());
|
||||||
if (savedPermissions != null)
|
if (savedPermissions != null)
|
||||||
{
|
{
|
||||||
newClient.SetPermissions(savedPermissions.Permissions);
|
newClient.SetPermissions(savedPermissions.Permissions, savedPermissions.PermittedCommands);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
newClient.SetPermissions(ClientPermissions.None);
|
newClient.SetPermissions(ClientPermissions.None, new List<DebugConsole.Command>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,20 +25,23 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
public readonly string IP;
|
public readonly string IP;
|
||||||
public readonly string Name;
|
public readonly string Name;
|
||||||
|
public List<DebugConsole.Command> PermittedCommands;
|
||||||
|
|
||||||
public ClientPermissions Permissions;
|
public ClientPermissions Permissions;
|
||||||
|
|
||||||
public SavedClientPermission(string name, string ip, ClientPermissions permissions)
|
public SavedClientPermission(string name, string ip, ClientPermissions permissions, List<DebugConsole.Command> permittedCommands)
|
||||||
{
|
{
|
||||||
this.Name = name;
|
this.Name = name;
|
||||||
this.IP = ip;
|
this.IP = ip;
|
||||||
|
|
||||||
this.Permissions = permissions;
|
this.Permissions = permissions;
|
||||||
|
this.PermittedCommands = permittedCommands;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public const string SettingsFile = "serversettings.xml";
|
public const string SettingsFile = "serversettings.xml";
|
||||||
public static readonly string ClientPermissionsFile = "Data" + Path.DirectorySeparatorChar + "clientpermissions.txt";
|
public static readonly string PermissionPresetFile = "Data" + Path.DirectorySeparatorChar + "permissionpresets.xml";
|
||||||
|
public static readonly string ClientPermissionsFile = "Data" + Path.DirectorySeparatorChar + "clientpermissions.xml";
|
||||||
|
|
||||||
public Dictionary<string, SerializableProperty> SerializableProperties
|
public Dictionary<string, SerializableProperty> SerializableProperties
|
||||||
{
|
{
|
||||||
@@ -323,12 +326,67 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
public void LoadClientPermissions()
|
public void LoadClientPermissions()
|
||||||
{
|
{
|
||||||
if (!File.Exists(ClientPermissionsFile)) return;
|
clientPermissions.Clear();
|
||||||
|
|
||||||
|
if (File.Exists("Data/clientpermissions.txt") && !File.Exists(ClientPermissionsFile))
|
||||||
|
{
|
||||||
|
LoadClientPermissionsOld("Data/clientpermissions.txt");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
XDocument doc = XMLExtensions.TryLoadXml(ClientPermissionsFile);
|
||||||
|
foreach (XElement clientElement in doc.Root.Elements())
|
||||||
|
{
|
||||||
|
string clientName = clientElement.GetAttributeString("name", "");
|
||||||
|
string clientIP = clientElement.GetAttributeString("ip", "");
|
||||||
|
if (string.IsNullOrWhiteSpace(clientName) || string.IsNullOrWhiteSpace(clientIP))
|
||||||
|
{
|
||||||
|
DebugConsole.ThrowError("Error in " + ClientPermissionsFile + " - all clients must have a name and an IP address.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
string permissionsStr = clientElement.GetAttributeString("permissions", "");
|
||||||
|
ClientPermissions permissions;
|
||||||
|
if (!Enum.TryParse(permissionsStr, out permissions))
|
||||||
|
{
|
||||||
|
DebugConsole.ThrowError("Error in " + ClientPermissionsFile + " - \"" + permissionsStr + "\" is not a valid client permission.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<DebugConsole.Command> permittedCommands = new List<DebugConsole.Command>();
|
||||||
|
if (permissions.HasFlag(ClientPermissions.ConsoleCommands))
|
||||||
|
{
|
||||||
|
foreach (XElement commandElement in clientElement.Elements())
|
||||||
|
{
|
||||||
|
if (commandElement.Name.ToString().ToLowerInvariant() != "command") continue;
|
||||||
|
|
||||||
|
string commandName = commandElement.GetAttributeString("name", "");
|
||||||
|
DebugConsole.Command command = DebugConsole.FindCommand(commandName);
|
||||||
|
if (command == null)
|
||||||
|
{
|
||||||
|
DebugConsole.ThrowError("Error in " + ClientPermissionsFile + " - \"" + commandName + "\" is not a valid console command.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
permittedCommands.Add(command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clientPermissions.Add(new SavedClientPermission(clientName, clientIP, permissions, permittedCommands));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Method for loading old .txt client permission files to provide backwards compatibility
|
||||||
|
/// </summary>
|
||||||
|
private void LoadClientPermissionsOld(string file)
|
||||||
|
{
|
||||||
|
if (!File.Exists(file)) return;
|
||||||
|
|
||||||
string[] lines;
|
string[] lines;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
lines = File.ReadAllLines(ClientPermissionsFile);
|
lines = File.ReadAllLines(file);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -337,36 +395,63 @@ namespace Barotrauma.Networking
|
|||||||
}
|
}
|
||||||
|
|
||||||
clientPermissions.Clear();
|
clientPermissions.Clear();
|
||||||
|
|
||||||
foreach (string line in lines)
|
foreach (string line in lines)
|
||||||
{
|
{
|
||||||
string[] separatedLine = line.Split('|');
|
string[] separatedLine = line.Split('|');
|
||||||
if (separatedLine.Length < 3) continue;
|
if (separatedLine.Length < 3) continue;
|
||||||
|
|
||||||
string name = String.Join("|", separatedLine.Take(separatedLine.Length - 2));
|
string name = string.Join("|", separatedLine.Take(separatedLine.Length - 2));
|
||||||
string ip = separatedLine[separatedLine.Length - 2];
|
string ip = separatedLine[separatedLine.Length - 2];
|
||||||
|
|
||||||
ClientPermissions permissions = ClientPermissions.None;
|
ClientPermissions permissions = ClientPermissions.None;
|
||||||
if (Enum.TryParse<ClientPermissions>(separatedLine.Last(), out permissions))
|
if (Enum.TryParse(separatedLine.Last(), out permissions))
|
||||||
{
|
{
|
||||||
clientPermissions.Add(new SavedClientPermission(name, ip, permissions));
|
clientPermissions.Add(new SavedClientPermission(name, ip, permissions, new List<DebugConsole.Command>()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SaveClientPermissions()
|
public void SaveClientPermissions()
|
||||||
{
|
{
|
||||||
GameServer.Log("Saving client permissions", ServerLog.MessageType.ServerMessage);
|
//delete old client permission file
|
||||||
|
if (File.Exists("Data/clientpermissions.txt"))
|
||||||
|
{
|
||||||
|
File.Delete("Data/clientpermissions.txt");
|
||||||
|
}
|
||||||
|
|
||||||
List<string> lines = new List<string>();
|
Log("Saving client permissions", ServerLog.MessageType.ServerMessage);
|
||||||
|
|
||||||
|
XDocument doc = new XDocument(new XElement("ClientPermissions"));
|
||||||
|
|
||||||
foreach (SavedClientPermission clientPermission in clientPermissions)
|
foreach (SavedClientPermission clientPermission in clientPermissions)
|
||||||
{
|
{
|
||||||
lines.Add(clientPermission.Name + "|" + clientPermission.IP+"|"+clientPermission.Permissions.ToString());
|
XElement clientElement = new XElement("Client",
|
||||||
|
new XAttribute("name", clientPermission.Name),
|
||||||
|
new XAttribute("ip", clientPermission.IP),
|
||||||
|
new XAttribute("permissions", clientPermission.Permissions.ToString()));
|
||||||
|
|
||||||
|
if (clientPermission.Permissions.HasFlag(ClientPermissions.ConsoleCommands))
|
||||||
|
{
|
||||||
|
foreach (DebugConsole.Command command in clientPermission.PermittedCommands)
|
||||||
|
{
|
||||||
|
clientElement.Add(new XElement("command", new XAttribute("name", command.names[0])));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
doc.Root.Add(clientElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
File.WriteAllLines(ClientPermissionsFile, lines);
|
XmlWriterSettings settings = new XmlWriterSettings();
|
||||||
|
settings.Indent = true;
|
||||||
|
settings.NewLineOnAttributes = true;
|
||||||
|
|
||||||
|
using (var writer = XmlWriter.Create(ClientPermissionsFile, settings))
|
||||||
|
{
|
||||||
|
doc.Save(writer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,18 +28,20 @@ namespace Barotrauma.Networking
|
|||||||
Attack,
|
Attack,
|
||||||
Spawning,
|
Spawning,
|
||||||
ServerMessage,
|
ServerMessage,
|
||||||
|
ConsoleUsage,
|
||||||
Error
|
Error
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly Color[] messageColor =
|
private readonly Color[] messageColor =
|
||||||
{
|
{
|
||||||
Color.LightBlue,
|
Color.LightBlue, //Chat
|
||||||
new Color(255, 142, 0),
|
new Color(255, 142, 0), //ItemInteraction
|
||||||
new Color(238, 208, 0),
|
new Color(238, 208, 0), //Inventory
|
||||||
new Color(204, 74, 78),
|
new Color(204, 74, 78), //Attack
|
||||||
new Color(163, 73, 164),
|
new Color(163, 73, 164), //Spawning
|
||||||
new Color(157, 225, 160),
|
new Color(157, 225, 160), //ServerMessage
|
||||||
Color.Red
|
new Color(0, 162, 232), //ConsoleUsage
|
||||||
|
Color.Red //Error
|
||||||
};
|
};
|
||||||
|
|
||||||
private readonly string[] messageTypeName =
|
private readonly string[] messageTypeName =
|
||||||
@@ -50,6 +52,7 @@ namespace Barotrauma.Networking
|
|||||||
"Attack & death",
|
"Attack & death",
|
||||||
"Spawning",
|
"Spawning",
|
||||||
"Server message",
|
"Server message",
|
||||||
|
"Console usage",
|
||||||
"Error"
|
"Error"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user