Files
Quadraludi/LobbyServer/LobbyServer.cs

119 lines
3.4 KiB
C#

using System.Linq;
using System.Net;
using System.Net.Sockets;
using System;
namespace LobbyServer
{
class LobbyServer
{
public static LobbyServer Instance { get; private set; }
public ChatManager ChatManager { get; }
public ScoresManager ScoresManager { get; }
public LobbyServer()
{
Instance = this;
Console.WriteLine("Starting LobbyServer...");
ChatManager = new ChatManager();
ScoresManager = new ScoresManager();
Console.WriteLine("LobbyServer started");
}
public void Start()
{
var listener = new TcpListener(IPAddress.Any, 1409);
listener.Start();
while (true)
{
Console.WriteLine("Waiting client...");
using (var client = listener.AcceptTcpClient())
{
ClientLoop(client);
}
}
}
public void Stop()
{
Console.WriteLine("Stopping LobbyServer...");
ScoresManager.Save();
Console.WriteLine("LobbyServer stopped");
}
public void ClientLoop(TcpClient client)
{
Console.WriteLine($"Client connected: {client.Client.RemoteEndPoint}");
var stream = new CommandStream(client.GetStream());
while (true)
{
try
{
var packet = stream.Receive();
Console.WriteLine(packet);
switch (packet.Command)
{
case Command.ChatAdd:
ChatAdd(packet);
break;
case Command.ChatRequest:
ChatRequest(stream, packet);
break;
case Command.ScoreAdd:
ScoreAdd(packet);
break;
case Command.ScoreRequest:
ScoreRequest(stream, packet);
break;
case Command.Invalid:
throw new InvalidOperationException("Received invalid command");
}
}
catch (Exception e)
{
Console.WriteLine($"Client disconnected: {e.Message}");
break;
}
}
}
private void ChatAdd(CommandPacket packet)
{
var message = new Message(packet.Content);
ChatManager.Add(message);
}
private void ChatRequest(CommandStream stream, CommandPacket packet)
{
var messages = ChatManager.Messages.Select(x => x.ToString());
string data = string.Join('@', messages);
stream.Send(new CommandPacket(Command.ChatRequest, data));
}
private void ScoreAdd(CommandPacket packet)
{
var score = new ScoreEntry(packet.Content);
ScoresManager.Add(score);
}
private void ScoreRequest(CommandStream stream, CommandPacket packet)
{
var scores = ScoresManager.Scores.Select(x => x.ToString());
string data = string.Join('@', scores);
stream.Send(new CommandPacket(Command.ScoreRequest, data));
}
}
}