Add event handler for chat messages

This commit is contained in:
Drew DeVault 2014-12-28 19:18:13 -07:00
parent 152c268fbd
commit c623bb68a5
6 changed files with 56 additions and 8 deletions

View File

@ -0,0 +1,22 @@
using System;
using TrueCraft.API.Networking;
namespace TrueCraft.API.Server
{
public class ChatMessageEventArgs : EventArgs
{
public ChatMessageEventArgs(IRemoteClient client, string message)
{
Client = client;
Message = message;
PreventDefault = false;
}
public IRemoteClient Client { get; set; }
public string Message { get; set; }
/// <summary>
/// If set to true, the server won't send the default message back to the client.
/// </summary>
public bool PreventDefault { get; set; }
}
}

View File

@ -15,6 +15,8 @@ namespace TrueCraft.API.Server
public interface IMultiplayerServer public interface IMultiplayerServer
{ {
event EventHandler<ChatMessageEventArgs> ChatMessageReceived;
IPacketReader PacketReader { get; } IPacketReader PacketReader { get; }
IList<IRemoteClient> Clients { get; } IList<IRemoteClient> Clients { get; }
IList<IWorld> Worlds { get; } IList<IWorld> Worlds { get; }
@ -26,5 +28,6 @@ namespace TrueCraft.API.Server
void AddLogProvider(ILogProvider provider); void AddLogProvider(ILogProvider provider);
void Log(LogCategory category, string text, params object[] parameters); void Log(LogCategory category, string text, params object[] parameters);
IEntityManager GetEntityManagerForWorld(IWorld world); IEntityManager GetEntityManagerForWorld(IWorld world);
void SendMessage(string message, params object[] parameters);
} }
} }

View File

@ -72,6 +72,7 @@
<Compile Include="Logic\IBlockProvider.cs" /> <Compile Include="Logic\IBlockProvider.cs" />
<Compile Include="Logic\IItemProvider.cs" /> <Compile Include="Logic\IItemProvider.cs" />
<Compile Include="ChatColor.cs" /> <Compile Include="ChatColor.cs" />
<Compile Include="Server\ChatMessageEventArgs.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup> <ItemGroup>

View File

@ -30,19 +30,19 @@ namespace TrueCraft.Handlers
client.QueuePacket(new DisconnectPacket("Server has no worlds configured.")); client.QueuePacket(new DisconnectPacket("Server has no worlds configured."));
else else
{ {
server.Log(LogCategory.Notice, "{0} joined the server.", client.Username); // TODO: Mention the same thing in chat
client.LoggedIn = true; client.LoggedIn = true;
client.Entity = new PlayerEntity(client.Username); client.Entity = new PlayerEntity(client.Username);
client.World = server.Worlds[0]; client.World = server.Worlds[0];
server.GetEntityManagerForWorld(client.World).SpawnEntity(client.Entity); server.GetEntityManagerForWorld(client.World).SpawnEntity(client.Entity);
client.QueuePacket(new LoginResponsePacket(0, 0, Dimension.Overworld)); client.QueuePacket(new LoginResponsePacket(0, 0, Dimension.Overworld));
client.ChunkRadius = 2; client.ChunkRadius = 3;
client.UpdateChunks(); client.UpdateChunks();
client.QueuePacket(new WindowItemsPacket(0, client.Inventory.GetSlots())); client.QueuePacket(new WindowItemsPacket(0, client.Inventory.GetSlots()));
client.QueuePacket(new SpawnPositionPacket(0, 16, 0)); client.QueuePacket(new SpawnPositionPacket(0, 16, 0));
client.QueuePacket(new SetPlayerPositionPacket(0, 16, 17, 0, 0, 0, true)); client.QueuePacket(new SetPlayerPositionPacket(0, 16, 17, 0, 0, 0, true));
server.Scheduler.ScheduleEvent(DateTime.Now.AddSeconds(10), client.SendKeepAlive); server.Scheduler.ScheduleEvent(DateTime.Now.AddSeconds(10), client.SendKeepAlive);
server.Scheduler.ScheduleEvent(DateTime.Now.AddSeconds(1), client.ExpandChunkRadius); server.Scheduler.ScheduleEvent(DateTime.Now.AddSeconds(1), client.ExpandChunkRadius);
server.SendMessage(ChatColor.Yellow + "{0} joined the server.", client.Username);
} }
} }
} }

View File

@ -3,6 +3,7 @@ using TrueCraft.API;
using TrueCraft.API.Server; using TrueCraft.API.Server;
using TrueCraft.Core.Networking.Packets; using TrueCraft.Core.Networking.Packets;
using TrueCraft.API.Networking; using TrueCraft.API.Networking;
using TrueCraft.API.Logging;
namespace TrueCraft.Handlers namespace TrueCraft.Handlers
{ {
@ -27,15 +28,16 @@ namespace TrueCraft.Handlers
// TODO // TODO
} }
internal static void HandleChatMessage(IPacket _packet, IRemoteClient _client, IMultiplayerServer server) internal static void HandleChatMessage(IPacket _packet, IRemoteClient _client, IMultiplayerServer _server)
{ {
// TODO: Abstract this to support things like commands // TODO: Abstract this to support things like commands
// TODO: Sanitize messages // TODO: Sanitize messages
var packet = (ChatMessagePacket)_packet; var packet = (ChatMessagePacket)_packet;
foreach (var client in server.Clients) var server = (MultiplayerServer)_server;
{ var args = new ChatMessageEventArgs(_client, packet.Message);
client.SendMessage(ChatColor.Yellow + string.Format("<{0}> {1}", _client.Username, packet.Message)); server.OnChatMessageReceived(args);
} if (!args.PreventDefault)
server.SendMessage("<{0}> {1}", _client.Username, packet.Message);
} }
} }
} }

View File

@ -9,11 +9,14 @@ using System.Collections.Generic;
using TrueCraft.API.World; using TrueCraft.API.World;
using TrueCraft.API.Logging; using TrueCraft.API.Logging;
using TrueCraft.Core.Networking.Packets; using TrueCraft.Core.Networking.Packets;
using TrueCraft.API;
namespace TrueCraft namespace TrueCraft
{ {
public class MultiplayerServer : IMultiplayerServer public class MultiplayerServer : IMultiplayerServer
{ {
public event EventHandler<ChatMessageEventArgs> ChatMessageReceived;
public IPacketReader PacketReader { get; private set; } public IPacketReader PacketReader { get; private set; }
public IList<IRemoteClient> Clients { get; private set; } public IList<IRemoteClient> Clients { get; private set; }
public IList<IWorld> Worlds { get; private set; } public IList<IWorld> Worlds { get; private set; }
@ -104,6 +107,22 @@ namespace TrueCraft
return null; return null;
} }
public void SendMessage(string message, params object[] parameters)
{
var compiled = string.Format(message, parameters);
foreach (var client in Clients)
{
client.SendMessage(compiled);
Log(LogCategory.Notice, compiled);
}
}
protected internal void OnChatMessageReceived(ChatMessageEventArgs e)
{
if (ChatMessageReceived != null)
ChatMessageReceived(this, e);
}
private void DisconnectClient(IRemoteClient _client) private void DisconnectClient(IRemoteClient _client)
{ {
var client = (RemoteClient)_client; var client = (RemoteClient)_client;
@ -130,7 +149,7 @@ namespace TrueCraft
for (int i = 0; i < Clients.Count; i++) for (int i = 0; i < Clients.Count; i++)
{ {
var client = Clients[i] as RemoteClient; var client = Clients[i] as RemoteClient;
if (client.PacketQueue.Count != 0) while (client.PacketQueue.Count != 0)
{ {
IPacket packet; IPacket packet;
while (!client.PacketQueue.TryDequeue(out packet)) { } while (!client.PacketQueue.TryDequeue(out packet)) { }
@ -139,6 +158,7 @@ namespace TrueCraft
{ {
DisconnectClient(client); DisconnectClient(client);
i--; i--;
break;
} }
} }
if (client.DataAvailable) if (client.DataAvailable)