1
0
Fork 0

Ajout des parties et meilleur /help

This commit is contained in:
sheychen 2016-11-06 10:59:05 +01:00
parent c8920ef977
commit 1cee2fc962
23 changed files with 792 additions and 44 deletions

View File

@ -6,6 +6,11 @@ namespace Galactic_Colors_Control_GUI
{ {
static class Utilities static class Utilities
{ {
/// <summary>
/// Load Texture2D from files
/// </summary>
/// <param name="path">File .png path</param>
/// <param name="sprite">Result sprite</param>
static public void SpriteFromPng(string path, ref Texture2D sprite, GraphicsDevice graphics) static public void SpriteFromPng(string path, ref Texture2D sprite, GraphicsDevice graphics)
{ {
if (File.Exists(path)) if (File.Exists(path))
@ -17,6 +22,11 @@ namespace Galactic_Colors_Control_GUI
} }
} }
/// <summary>
/// Load SoundEffect from files
/// </summary>
/// <param name="path">File .mp3 path</param>
/// <param name="sound">Result sound</param>
static public void SoundFromMp3(string path, ref SoundEffect sound) static public void SoundFromMp3(string path, ref SoundEffect sound)
{ {
if (File.Exists(path)) if (File.Exists(path))

View File

@ -9,7 +9,7 @@ namespace Galactic_Colors_Control_Server.Commands
{ {
public string Name { get { return "help"; } } public string Name { get { return "help"; } }
public string DescText { get { return "Shows the help."; } } public string DescText { get { return "Shows the help."; } }
public string HelpText { get { return "Use /help [command] to display command help."; } } public string HelpText { get { return "Use /help [command] to display command help. (-all for full help)"; } }
public Manager.CommandGroup Group { get { return Manager.CommandGroup.root; } } public Manager.CommandGroup Group { get { return Manager.CommandGroup.root; } }
public bool IsServer { get { return true; } } public bool IsServer { get { return true; } }
public bool IsClient { get { return true; } } public bool IsClient { get { return true; } }
@ -20,7 +20,14 @@ namespace Galactic_Colors_Control_Server.Commands
public void Execute(string[] args, Socket soc, bool server = false) public void Execute(string[] args, Socket soc, bool server = false)
{ {
if(args.Length == 1) bool isGroup = false;
bool isAll = false;
if (args.Length == 2)
{
isGroup = Enum.GetNames(typeof(Manager.CommandGroup)).Contains(args[1]);
isAll = (args[1] == "-all");
}
if (args.Length == 1 || (isGroup || isAll))
{ {
int maxLen = 0; int maxLen = 0;
List<ICommand> list = new List<ICommand>(); List<ICommand> list = new List<ICommand>();
@ -28,8 +35,11 @@ namespace Galactic_Colors_Control_Server.Commands
{ {
if(Manager.CanAccess(com, soc, server)) if(Manager.CanAccess(com, soc, server))
{ {
list.Add(com); if (!isGroup || (isGroup && com.Group == (Manager.CommandGroup)Enum.Parse(typeof(Manager.CommandGroup), args[1])))
if(com.Name.Length + (com.Group == 0 ? 0 : 4) > maxLen) { maxLen = com.Name.Length + (com.Group == 0 ? 0 : 4); } {
list.Add(com);
if (com.Name.Length + (com.Group == 0 ? 0 : 4) > maxLen) { maxLen = com.Name.Length + (com.Group == 0 ? 0 : 4); }
}
} }
} }
list.Sort((x,y) => x.Group.CompareTo(y.Group)); list.Sort((x,y) => x.Group.CompareTo(y.Group));
@ -39,10 +49,13 @@ namespace Galactic_Colors_Control_Server.Commands
{ {
if(com.Group != actualGroup) if(com.Group != actualGroup)
{ {
text += (Environment.NewLine + " " + com.Group.ToString() + Environment.NewLine); text += (Environment.NewLine + " " + com.Group.ToString() + Environment.NewLine + ((isGroup || isAll) ? "" : (" Use /help " + com.Group.ToString())));
actualGroup = com.Group; actualGroup = com.Group;
} }
text += (" " + (com.Group != 0 ? new string(' ',4) : "") + com.Name + new string(' ', maxLen - com.Name.Length - (com.Group == 0 ? 0 : 4)) + " : " + com.DescText + Environment.NewLine); if ((!(isGroup || isAll) && com.Group == 0) || (isGroup || isAll))
{
text += (" " + (com.Group != 0 ? new string(' ', 4) : "") + com.Name + new string(' ', maxLen - com.Name.Length - (com.Group == 0 ? 0 : 4)) + " : " + com.DescText + Environment.NewLine);
}
} }
Utilities.Return(text, soc, server); Utilities.Return(text, soc, server);
} }

View File

@ -44,7 +44,7 @@ namespace Galactic_Colors_Control_Server.Commands
} }
else else
{ {
if (args.Length > command.minArgs) if (args.Length - (command.Group == 0 ? 0 : 1) > command.minArgs)
{ {
if (args.Length - (command.Group == 0 ? 1 : 2) <= command.maxArgs) if (args.Length - (command.Group == 0 ? 1 : 2) <= command.maxArgs)
{ {
@ -52,7 +52,7 @@ namespace Galactic_Colors_Control_Server.Commands
} }
else else
{ {
Utilities.Return("Command " + CommandToString(command) + " require at most " + command.minArgs + " argument(s).", soc, server); Utilities.Return("Command " + CommandToString(command) + " require at most " + command.maxArgs + " argument(s).", soc, server);
} }
} }
@ -81,6 +81,10 @@ namespace Galactic_Colors_Control_Server.Commands
return text; return text;
} }
/// <summary>
/// Convert command args in readable string
/// </summary>
/// <param name="args">Command args</param>
public static string CommandToString(string[] args) public static string CommandToString(string[] args)
{ {
if (args.Length > 0) if (args.Length > 0)
@ -98,6 +102,12 @@ namespace Galactic_Colors_Control_Server.Commands
} }
} }
/// <summary>
/// Try to get a command
/// </summary>
/// <param name="args">command args</param>
/// <param name="command">Command result</param>
/// <returns>Correct command</returns>
public static bool TryGetCommand(string[] args, ref ICommand command) public static bool TryGetCommand(string[] args, ref ICommand command)
{ {
if (args.Length > 0) if (args.Length > 0)

View File

@ -0,0 +1,33 @@
using System;
using System.Net.Sockets;
namespace Galactic_Colors_Control_Server.Commands
{
public class PartyClientCommand : ICommand
{
public string Name { get { return "client"; } }
public string DescText { get { return "Lists party clients."; } }
public string HelpText { get { return "Use /party client to show party clients list."; } }
public Manager.CommandGroup Group { get { return Manager.CommandGroup.party; } }
public bool IsServer { get { return true; } }
public bool IsClient { get { return true; } }
public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 0; } }
public int maxArgs { get { return 0; } }
public void Execute(string[] args, Socket soc, bool server = false)
{
int partyId = -1;
if (Utilities.AccessParty(ref partyId, false, soc, server))
{
string text = " ";
foreach(Socket client in Program.parties[partyId].clients)
{
text += (Utilities.GetName(client) + Environment.NewLine + " ");
}
Utilities.Return(text, soc, server);
}
}
}
}

View File

@ -0,0 +1,35 @@
using System.Net.Sockets;
namespace Galactic_Colors_Control_Server.Commands
{
public class PartyCloseCommand : ICommand
{
public string Name { get { return "close"; } }
public string DescText { get { return "Closes party."; } }
public string HelpText { get { return "Use /party close to close party for join."; } }
public Manager.CommandGroup Group { get { return Manager.CommandGroup.party; } }
public bool IsServer { get { return true; } }
public bool IsClient { get { return true; } }
public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 0; } }
public int maxArgs { get { return 0; } }
public void Execute(string[] args, Socket soc, bool server = false)
{
int partyId = -1;
if (Utilities.AccessParty(ref partyId, true,soc, server))
{
if (Program.parties[partyId].open)
{
Program.parties[partyId].open = false;
Utilities.Return("Party closed", soc, server);
}
else
{
Utilities.Return("Party allready close", soc, server);
}
}
}
}
}

View File

@ -0,0 +1,62 @@
using System.Net.Sockets;
namespace Galactic_Colors_Control_Server.Commands
{
public class PartyCreateCommand : ICommand
{
public string Name { get { return "create"; } }
public string DescText { get { return "Create new party."; } }
public string HelpText { get { return "Use /party create [name] [size] to create new party."; } }
public Manager.CommandGroup Group { get { return Manager.CommandGroup.party; } }
public bool IsServer { get { return true; } }
public bool IsClient { get { return true; } }
public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 2; } }
public int maxArgs { get { return 2; } }
public void Execute(string[] args, Socket soc, bool server = false)
{
if (server || (!server && Program.clients[soc].partyID == -1))
{
int size;
if (int.TryParse(args[3], out size))
{
if (size > 0)
{
if (size <= Program.config.size)
{
Logger.Write("Party " + args[2] + " create with " + size + " slots as " + Program.partyID, Logger.logType.info);
Program.AddParty(new Party(args[2], size, Utilities.GetName(soc)));
if (server)
{
Program.selectedParty = Program.partyID-1;
}
else
{
Program.clients[soc].partyID = Program.partyID-1;
Utilities.Return("Party " + args[2] + " create with " + size + " slots as " + (Program.partyID-1), soc, server);
}
}
else
{
Utilities.Return("Too big size", soc, server);
}
}
else
{
Utilities.Return("Too small size", soc, server);
}
}
else
{
Utilities.Return("Incorrect argument " + args[3], soc, server);
}
}
else
{
Utilities.Return("Allready in a party.", soc, server);
}
}
}
}

View File

@ -0,0 +1,81 @@
using System;
using System.Net.Sockets;
namespace Galactic_Colors_Control_Server.Commands
{
public class PartyJoinCommand : ICommand
{
public string Name { get { return "join"; } }
public string DescText { get { return "Join a party."; } }
public string HelpText { get { return "Use /party join [id] <password> to join a party."; } }
public Manager.CommandGroup Group { get { return Manager.CommandGroup.party; } }
public bool IsServer { get { return true; } }
public bool IsClient { get { return true; } }
public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 1; } }
public int maxArgs { get { return 2; } }
public void Execute(string[] args, Socket soc, bool server = false)
{
if ((server && Program.selectedParty == -1) || (!server && Program.clients[soc].partyID == -1))
{
int id;
if (int.TryParse(args[2], out id))
{
if (Program.parties.ContainsKey(id))
{
Party party = Program.parties[id];
if (args.Length == 3)
{
Array.Resize(ref args, 4);
args[3] = "";
}
if (server || (!server && party.TestPassword(args[3])))
{
if(server)
{
Program.selectedParty = id;
}
else
{
if(party.open)
{
if (party.clients.Count < party.size)
{
Program.clients[soc].partyID = id;
Utilities.BroadcastParty(Utilities.GetName(soc) + " join the party", Galactic_Colors_Control_Common.Common.dataType.message, id);
}
else
{
Utilities.Return("Party is full", soc, server);
}
}
else
{
Utilities.Return("Party close", soc, server);
}
}
}
else
{
Utilities.Return("Wrong party password", soc, server);
}
}
else
{
Utilities.Return("Can't find party " + id, soc, server);
}
}
else
{
Utilities.Return("Incorrect argument " + args[3], soc, server);
}
}
else
{
Utilities.Return("Allready in a party.", soc, server);
}
}
}
}

View File

@ -0,0 +1,49 @@
using Galactic_Colors_Control_Common;
using System.Net.Sockets;
namespace Galactic_Colors_Control_Server.Commands
{
public class PartyKickCommand : ICommand
{
public string Name { get { return "kick"; } }
public string DescText { get { return "Kick player from party."; } }
public string HelpText { get { return "Use /party kick [name] <reason> to kick palyer from party"; } }
public Manager.CommandGroup Group { get { return Manager.CommandGroup.party; } }
public bool IsServer { get { return true; } }
public bool IsClient { get { return true; } }
public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 1; } }
public int maxArgs { get { return 2; } }
public void Execute(string[] args, Socket soc, bool server = false)
{
int partyId = -1;
if (Utilities.AccessParty(ref partyId, true, soc, server))
{
Socket target = null;
foreach (Socket client in Program.parties[partyId].clients)
{
if (Utilities.GetName(client) == args[2]) { target = client; }
}
if (target != null)
{
Utilities.BroadcastParty(args[2] + " was kick", Common.dataType.message, partyId);
if (args.Length > 3)
{
Utilities.Send(target, "/party kick " + args[3], Common.dataType.message);
}
else
{
Utilities.Send(target, "/party kick", Common.dataType.message);
}
Manager.Execute(new string[2] { "party", "leave" },target,false);
}
else
{
Utilities.Return("Can't find " + args[2] + "in party", soc, server);
}
}
}
}
}

View File

@ -0,0 +1,42 @@
using System.Net.Sockets;
namespace Galactic_Colors_Control_Server.Commands
{
public class PartyLeaveCommand : ICommand
{
public string Name { get { return "leave"; } }
public string DescText { get { return "Leave party."; } }
public string HelpText { get { return "Use /party leave to leave current party"; } }
public Manager.CommandGroup Group { get { return Manager.CommandGroup.party; } }
public bool IsServer { get { return true; } }
public bool IsClient { get { return true; } }
public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 0; } }
public int maxArgs { get { return 0; } }
public void Execute(string[] args, Socket soc, bool server = false)
{
if (server)
{
Program.selectedParty = -1;
}
else
{
int partyId = -1;
if (Utilities.AccessParty(ref partyId, false, soc, server))
{
if (!Program.parties[partyId].IsOwner(Utilities.GetName(soc)))
{
Utilities.BroadcastParty(Utilities.GetName(soc) + " leave the party", Galactic_Colors_Control_Common.Common.dataType.message, partyId);
Program.clients[soc].partyID = -1;
}
else
{
Utilities.Return("Owner can't leave party. Look for /party stop", soc, server);
}
}
}
}
}
}

View File

@ -0,0 +1,30 @@
using System;
using System.Net.Sockets;
namespace Galactic_Colors_Control_Server.Commands
{
public class PartyListCommand : ICommand
{
public string Name { get { return "list"; } }
public string DescText { get { return "Shows parties list."; } }
public string HelpText { get { return "Use /party list to show parties list."; } }
public Manager.CommandGroup Group { get { return Manager.CommandGroup.party; } }
public bool IsServer { get { return true; } }
public bool IsClient { get { return true; } }
public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 0; } }
public int maxArgs { get { return 0; } }
public void Execute(string[] args, Socket soc, bool server = false)
{
string text = " ";
foreach (int key in Program.parties.Keys)
{
Party party = Program.parties[key];
text += (key + " : " + party.name + " : " + party.count + "/" + party.size + " : " + (party.open ? (party.isPrivate ? "private" : "open") : "close") + Environment.NewLine + " ");
}
Utilities.Return(text, soc, server);
}
}
}

View File

@ -0,0 +1,35 @@
using System.Net.Sockets;
namespace Galactic_Colors_Control_Server.Commands
{
public class PartyOpenCommand : ICommand
{
public string Name { get { return "open"; } }
public string DescText { get { return "Opens party."; } }
public string HelpText { get { return "Use /party open to open party for join."; } }
public Manager.CommandGroup Group { get { return Manager.CommandGroup.party; } }
public bool IsServer { get { return true; } }
public bool IsClient { get { return true; } }
public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 0; } }
public int maxArgs { get { return 0; } }
public void Execute(string[] args, Socket soc, bool server = false)
{
int partyId = -1;
if (Utilities.AccessParty(ref partyId, true, soc, server))
{
if (!Program.parties[partyId].open)
{
Program.parties[partyId].open = true;
Utilities.Return("Party opened", soc, server);
}
else
{
Utilities.Return("Party allready open", soc, server);
}
}
}
}
}

View File

@ -0,0 +1,40 @@
using System;
using System.Net.Sockets;
namespace Galactic_Colors_Control_Server.Commands
{
public class PartyPasswordCommand : ICommand
{
public string Name { get { return "password"; } }
public string DescText { get { return "Set party password."; } }
public string HelpText { get { return "Use /party password [newPass] [oldPass] to set party private with password."; } }
public Manager.CommandGroup Group { get { return Manager.CommandGroup.party; } }
public bool IsServer { get { return true; } }
public bool IsClient { get { return true; } }
public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 1; } }
public int maxArgs { get { return 2; } }
public void Execute(string[] args, Socket soc, bool server = false)
{
int partyId = -1;
if (Utilities.AccessParty(ref partyId, true, soc, server))
{
if (args.Length == 3)
{
Array.Resize(ref args, 4);
args[3] = "";
}
if (Program.parties[partyId].SetPassword(args[2],args[3]))
{
Utilities.Return("Password changed", soc, server);
}
else
{
Utilities.Return("Can't change password", soc, server);
}
}
}
}
}

View File

@ -0,0 +1,33 @@
using System;
using System.Net.Sockets;
namespace Galactic_Colors_Control_Server.Commands
{
public class PartyStatusCommand : ICommand
{
public string Name { get { return "status"; } }
public string DescText { get { return "Shows party status."; } }
public string HelpText { get { return "Use /party status to show party status."; } }
public Manager.CommandGroup Group { get { return Manager.CommandGroup.party; } }
public bool IsServer { get { return true; } }
public bool IsClient { get { return true; } }
public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 0; } }
public int maxArgs { get { return 0; } }
public void Execute(string[] args, Socket soc, bool server = false)
{
int partyId = -1;
if (Utilities.AccessParty(ref partyId, false, soc, server))
{
Party party = Program.parties[partyId];
string text = "";
text += ("Name: " + party.name + Environment.NewLine);
text += ("Count: " + party.count + "/" + party.size + Environment.NewLine);
text += ("Status: " + (party.isPrivate ? "private" : (party.open ? "open" : "close")));
Utilities.Return(text,soc,server);
}
}
}
}

View File

@ -0,0 +1,33 @@
using System.Net.Sockets;
namespace Galactic_Colors_Control_Server.Commands
{
public class PartyStopCommand : ICommand
{
public string Name { get { return "stop"; } }
public string DescText { get { return "Stop party."; } }
public string HelpText { get { return "Use /party stop to stop current party"; } }
public Manager.CommandGroup Group { get { return Manager.CommandGroup.party; } }
public bool IsServer { get { return true; } }
public bool IsClient { get { return true; } }
public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 0; } }
public int maxArgs { get { return 0; } }
public void Execute(string[] args, Socket soc, bool server = false)
{
int partyId = -1;
if (Utilities.AccessParty(ref partyId, true, soc, server))
{
foreach(Socket client in Program.parties[partyId].clients)
{
Manager.Execute(new string[4] { "party","kick",Utilities.GetName(client),"stop_party" } ,soc,server);
}
Logger.Write("Party " + Program.parties[partyId].name + " closed", Logger.logType.info);
if(Program.selectedParty == partyId) { Program.selectedParty = -1; }
Program.parties.Remove(partyId);
}
}
}
}

View File

@ -14,7 +14,7 @@ namespace Galactic_Colors_Control_Server.Commands
public bool IsClientSide { get { return false; } } public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } } public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 0; } } public int minArgs { get { return 0; } }
public int maxArgs { get { return 1; } } public int maxArgs { get { return 0; } }
public void Execute(string[] args, Socket soc, bool server = false) public void Execute(string[] args, Socket soc, bool server = false)
{ {
@ -25,7 +25,7 @@ namespace Galactic_Colors_Control_Server.Commands
} }
else else
{ {
Utilities.ConsoleWrite("Server already close"); Utilities.ConsoleWrite("Server allready close");
} }
} }
} }

View File

@ -14,7 +14,7 @@ namespace Galactic_Colors_Control_Server.Commands
public bool IsClientSide { get { return false; } } public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } } public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 0; } } public int minArgs { get { return 0; } }
public int maxArgs { get { return 1; } } public int maxArgs { get { return 0; } }
public void Execute(string[] args, Socket soc, bool server = false) public void Execute(string[] args, Socket soc, bool server = false)
{ {
@ -25,7 +25,7 @@ namespace Galactic_Colors_Control_Server.Commands
} }
else else
{ {
Utilities.ConsoleWrite("Server already open"); Utilities.ConsoleWrite("Server allready open");
} }
} }
} }

View File

@ -0,0 +1,26 @@
using Galactic_Colors_Control_Common;
using System;
using System.Net.Sockets;
namespace Galactic_Colors_Control_Server.Commands
{
public class ServerStopCommand : ICommand
{
public string Name { get { return "stop"; } }
public string DescText { get { return "Stop the server."; } }
public string HelpText { get { return "Use /server stop to completly stop server."; } }
public Manager.CommandGroup Group { get { return Manager.CommandGroup.server; } }
public bool IsServer { get { return true; } }
public bool IsClient { get { return false; } }
public bool IsClientSide { get { return false; } }
public bool IsNoConnect { get { return false; } }
public int minArgs { get { return 0; } }
public int maxArgs { get { return 0; } }
public void Execute(string[] args, Socket soc, bool server = false)
{
Program._run = false;
Utilities.ConsoleWrite("Stop server");
}
}
}

View File

@ -59,6 +59,17 @@
<Compile Include="Client.cs" /> <Compile Include="Client.cs" />
<Compile Include="Commands\ClearCommand.cs" /> <Compile Include="Commands\ClearCommand.cs" />
<Compile Include="Commands\Client\StatusCommand.cs" /> <Compile Include="Commands\Client\StatusCommand.cs" />
<Compile Include="Commands\Party\PartyLeaveCommand.cs" />
<Compile Include="Commands\Party\PartyCreateCommand.cs" />
<Compile Include="Commands\Party\PartyJoinCommand.cs" />
<Compile Include="Commands\Party\PartyCloseCommand.cs" />
<Compile Include="Commands\Party\PartyClientCommand.cs" />
<Compile Include="Commands\Party\PartyStopCommand.cs" />
<Compile Include="Commands\Party\PartyPasswordCommand.cs" />
<Compile Include="Commands\Party\PartyListCommand.cs" />
<Compile Include="Commands\Party\PartyOpenCommand.cs" />
<Compile Include="Commands\Party\PartyStatusCommand.cs" />
<Compile Include="Commands\Party\PartyKickCommand.cs" />
<Compile Include="Commands\PingCommand.cs" /> <Compile Include="Commands\PingCommand.cs" />
<Compile Include="Commands\Server\ServerOpenCommand.cs" /> <Compile Include="Commands\Server\ServerOpenCommand.cs" />
<Compile Include="Commands\ConnectCommand.cs" /> <Compile Include="Commands\ConnectCommand.cs" />
@ -106,9 +117,7 @@
<Name>Galactic Colors Control Common</Name> <Name>Galactic Colors Control Common</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup />
<Folder Include="Commands\Party\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View File

@ -0,0 +1,73 @@
using System.Collections.Generic;
using System.Net.Sockets;
namespace Galactic_Colors_Control_Server
{
public class Party
{
public string name = "";
private string password = "";
public int size = 0;
public bool open = false;
private string owner = "";
public bool isPrivate { get { return password != ""; } }
public Party(string Name, int Size, string Owner)
{
name = Name;
size = Size;
owner = Owner;
}
public bool IsOwner(string name)
{
return owner == name;
}
public bool TestPassword(string pass)
{
if (isPrivate)
{
return (password == pass) ;
}
else
{
return true;
}
}
public bool SetPassword(string newPass, string oldPass)
{
if (TestPassword(oldPass))
{
password = newPass;
return true;
}
else
{
return false;
}
}
public int count
{
get
{
return clients.Count;
}
}
public List<Socket> clients
{
get
{
List<Socket> list = new List<Socket>();
foreach(Socket soc in Program.clients.Keys)
{
if(Program.clients[soc].party == this) { list.Add(soc); }
}
return list;
}
}
}
}

View File

@ -19,10 +19,16 @@ namespace Galactic_Colors_Control_Server
private static readonly byte[] buffer = new byte[BUFFER_SIZE]; private static readonly byte[] buffer = new byte[BUFFER_SIZE];
public static Dictionary<Socket, Client> clients { get; private set; } = new Dictionary<Socket, Client>(); public static Dictionary<Socket, Client> clients { get; private set; } = new Dictionary<Socket, Client>();
public static List<Party> parties { get; private set; } = new List<Party>();
public static int partyID = 0;
public static Dictionary<int,Party> parties { get; private set; } = new Dictionary<int,Party>();
public static int selectedParty = -1;
public static Config config = new Config(); public static Config config = new Config();
/// <summary>
/// Server Main thread
/// </summary>
private static void Main(string[] args) private static void Main(string[] args)
{ {
Console.Title = "Galactic Colors Control Server"; Console.Title = "Galactic Colors Control Server";
@ -176,35 +182,36 @@ namespace Galactic_Colors_Control_Server
var data = new byte[received]; var data = new byte[received];
Array.Copy(buffer, data, received); Array.Copy(buffer, data, received);
try { //Server crash on command Exception
byte[] type = new byte[4]; //try {
type = data.Take(4).ToArray(); byte[] type = new byte[4];
type.Reverse(); type = data.Take(4).ToArray();
Common.dataType dtype = (Common.dataType)BitConverter.ToInt32(type, 0); type.Reverse();
byte[] bytes = null; Common.dataType dtype = (Common.dataType)BitConverter.ToInt32(type, 0);
bytes = data.Skip(4).ToArray(); byte[] bytes = null;
switch (dtype) bytes = data.Skip(4).ToArray();
{ switch (dtype)
case Common.dataType.message: {
string text = Encoding.ASCII.GetString(bytes); case Common.dataType.message:
ExecuteMessage(text, current); string text = Encoding.ASCII.GetString(bytes);
break; ExecuteMessage(text, current);
break;
case Common.dataType.data: case Common.dataType.data:
Console.WriteLine("data"); Console.WriteLine("data");
break; break;
default: default:
Logger.Write("Unknow type data form" + Utilities.GetName(current), Logger.logType.error); Logger.Write("Unknow type data form" + Utilities.GetName(current), Logger.logType.error);
break; break;
}
if (clients.ContainsKey(current)) { current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current); }
} }
if (clients.ContainsKey(current)) { current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current); }
/*}
catch (Exception) { catch (Exception) {
Logger.Write("Client forcefully disconnected from " + Utilities.GetName(current) + " : ReceiveException", Logger.logType.info); Logger.Write(Utilities.GetName(current) + " : ReceiveException", Logger.logType.info);
if (clients.ContainsKey(current)) { clients.Remove(current); } //if (clients.ContainsKey(current)) { clients.Remove(current); }
} }*/
} }
/// <summary> /// <summary>
@ -239,11 +246,29 @@ namespace Galactic_Colors_Control_Server
} }
else else
{ {
Logger.Write(Utilities.GetName(soc) + " : " + text, Logger.logType.info); int party = -1;
Utilities.Broadcast(Utilities.GetName(soc) + " : " + text, Common.dataType.message); if (server)
{
party = selectedParty;
}
else
{
party = clients[soc].partyID;
}
Utilities.BroadcastParty(Utilities.GetName(soc) + " : " + text, Common.dataType.message, party);
} }
} }
} }
} }
/// <summary>
/// Add new party with index
/// </summary>
/// <param name="party">Party to add</param>
public static void AddParty(Party party)
{
parties.Add(partyID, party);
partyID++;
}
} }
} }

View File

@ -64,6 +64,8 @@ namespace Galactic_Colors_Control_Server
/// Write line in console with correct colors /// Write line in console with correct colors
/// </summary> /// </summary>
/// <param name="v">Text to write</param> /// <param name="v">Text to write</param>
/// <param name="Fore">Foreground color</param>
/// <param name="Back">Background color</param>
public static void ConsoleWrite(string v, ConsoleColor Fore = ConsoleColor.White, ConsoleColor Back = ConsoleColor.Black) public static void ConsoleWrite(string v, ConsoleColor Fore = ConsoleColor.White, ConsoleColor Back = ConsoleColor.Black)
{ {
Console.Write("\b"); Console.Write("\b");
@ -136,6 +138,25 @@ namespace Galactic_Colors_Control_Server
{ {
Send(soc, data, dtype); Send(soc, data, dtype);
} }
if (dtype == Common.dataType.message) { ConsoleWrite((string)data); }
}
/// <summary>
/// Send data to all client of the party
/// </summary>
/// <param name="data">Data to send</param>
/// <param name="dtype">Type of data</param>
/// <param name="party">Id of the party</param>
public static void BroadcastParty(object data, Common.dataType dtype, int party)
{
foreach(Socket soc in Program.clients.Keys)
{
if (Program.clients[soc].partyID == party)
{
Send(soc, data, dtype);
}
}
if (dtype == Common.dataType.message) { if (Program.selectedParty == party) { ConsoleWrite((string)data); } }
} }
/// <summary> /// <summary>
@ -155,5 +176,69 @@ namespace Galactic_Colors_Control_Server
Send(soc, message, Common.dataType.message); Send(soc, message, Common.dataType.message);
} }
} }
/// <summary>
/// Try get party of the socket
/// </summary>
/// <param name="partyId">Result party ID</param>
/// <param name="needOwn">Return true only for owner and server</param>
/// <param name="soc">Target socket</param>
/// <param name="server">Is server?</param>
/// <returns>Can access?</returns>
public static bool AccessParty(ref int partyId, bool needOwn, Socket soc = null, bool server = false)
{
if (server)
{
if(Program.selectedParty != -1)
{
if (Program.parties.ContainsKey(Program.selectedParty))
{
partyId = Program.selectedParty;
return true;
}
else
{
Logger.Write("Can't find party " + Program.selectedParty, Logger.logType.error);
Program.selectedParty = -1;
return false;
}
}
else
{
ConsoleWrite("Join a party before");
return false;
}
}
else
{
if(Program.clients[soc].partyID != -1)
{
if (Program.parties.ContainsKey(Program.clients[soc].partyID))
{
if (Program.parties[Program.clients[soc].partyID].IsOwner(GetName(soc)) || !needOwn)
{
partyId = Program.clients[soc].partyID;
return true;
}
else
{
Send(soc, "You are not owner", Common.dataType.message);
return false;
}
}
else
{
Send(soc, "Can't find party " + Program.clients[soc].partyID, Common.dataType.message);
Program.clients[soc].partyID = -1;
return false;
}
}
else
{
Send(soc, "Join a party before", Common.dataType.message);
return false;
}
}
}
} }
} }

View File

@ -271,6 +271,24 @@ namespace Galactic_Colors_Control
_run = false; _run = false;
break; break;
case "party":
if (array[1] == "kick")
{
if (array.Length > 2)
{
Output.Add("Kick from party : " + array[2]);
}
else
{
Output.Add("Kick from party");
}
}
else
{
Output.Add("Unknown action from server");
}
break;
default: default:
Output.Add("Unknown action from server"); Output.Add("Unknown action from server");
break; break;

View File

@ -12,9 +12,14 @@ GCC is a cross plateforme C# minimal RTS.
Download last version for your system Download last version for your system
Linux
```
sudo apt-get install libopenal-dev mono-runtime
```
## Running ## Running
* Galactic_Colors_Control.exe => Client without GUI * Galactic_Colors_Control_Console.exe => Client without GUI
* Galactic_Colors_Control_GUI.exe => Client * Galactic_Colors_Control_GUI.exe => Client
* Galactic_Colors_Control_Server.exe => Server (Use --debug for DEBUG MODE) * Galactic_Colors_Control_Server.exe => Server (Use --debug for DEBUG MODE)
@ -30,6 +35,7 @@ mono <program>.exe --args
## Contributing ## Contributing
Get [Monogame](https://github.com/MonoGame/MonoGame) sdk and [MyMonoGame.GUI](https://github.com/sheychen290/MyMonoGame)
As you wish, I am opened to new ideas. As you wish, I am opened to new ideas.
## Author ## Author