001/*
002 * Trident - A Multithreaded Server Alternative
003 * Copyright 2014 The TridentSDK Team
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *    http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018package net.tridentsdk.server.packets.play.in;
019
020import io.netty.buffer.ByteBuf;
021import net.tridentsdk.event.player.PlayerChatEvent;
022import net.tridentsdk.meta.MessageBuilder;
023import net.tridentsdk.registry.Registered;
024import net.tridentsdk.server.event.EventProcessor;
025import net.tridentsdk.server.netty.ClientConnection;
026import net.tridentsdk.server.netty.Codec;
027import net.tridentsdk.server.netty.packet.InPacket;
028import net.tridentsdk.server.netty.packet.Packet;
029import net.tridentsdk.server.packets.play.out.PacketPlayOutChat;
030import net.tridentsdk.server.player.PlayerConnection;
031import net.tridentsdk.server.player.TridentPlayer;
032
033public class PacketPlayInChat extends InPacket {
034
035    /**
036     * Message sent by the client, represented in JSON  TODO: provide example
037     */
038    protected String message;
039
040    @Override
041    public int id() {
042        return 0x02;
043    }
044
045    @Override
046    public Packet decode(ByteBuf buf) {
047        this.message = Codec.readString(buf);
048
049        return this;
050    }
051
052    public String message() {
053        return this.message;
054    }
055
056    @Override
057    public void handleReceived(ClientConnection connection) {
058        PlayerConnection pc = (PlayerConnection) connection;
059        TridentPlayer player = pc.player();
060
061        if(message.startsWith("/")) {
062            Registered.commands().handle(message.substring(1), player);
063            return;
064        } else {
065            PlayerChatEvent event = EventProcessor.fire(new PlayerChatEvent(player, message));
066            if(event.isIgnored()) {
067                return;
068            }
069        }
070
071        PacketPlayOutChat packet = new PacketPlayOutChat();
072
073        String identifier = Registered
074                .chatFormatter()
075                .format(player.name() + "> ", player)
076                .replaceAll("%p", "")
077                .replaceAll("%n", player.name())
078                .replaceAll("%s", "")
079                .replaceAll("%d", "> ");
080
081        packet.set("jsonMessage", new MessageBuilder(identifier + message).build().asJson());
082        packet.set("position", PacketPlayOutChat.ChatPosition.CHAT);
083
084        TridentPlayer.sendAll(packet);
085    }
086}