1
0
mirror of https://github.com/Rogiel/l2jserver2 synced 2025-12-06 07:32:46 +00:00

HTML Markup engine

Signed-off-by: Rogiel <rogiel@rogiel.com>
This commit is contained in:
2011-05-19 18:14:58 -03:00
parent 2d1181483a
commit 1de8662be6
31 changed files with 16586 additions and 79 deletions

14
pom.xml
View File

@@ -113,6 +113,20 @@
<type>jar</type>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.htmlparser</groupId>
<artifactId>htmlparser</artifactId>
<version>2.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.htmlparser</groupId>
<artifactId>sitecapturer</artifactId>
<version>2.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
<issueManagement>

View File

@@ -75,7 +75,8 @@ public class L2JGameServerMain {
.getInstance(NPCTemplateIDProvider.class);
final NPCIDProvider provider = injector
.getInstance(NPCIDProvider.class);
final SpawnService spawnService = injector.getInstance(SpawnService.class);
final SpawnService spawnService = injector
.getInstance(SpawnService.class);
final NPCTemplateID id = templateProvider.createID(12077);
final NPC npc = id.getTemplate().create();

View File

@@ -27,7 +27,11 @@ import com.l2jserver.game.net.codec.Lineage2Encrypter;
import com.l2jserver.game.net.codec.Lineage2PacketReader;
import com.l2jserver.game.net.codec.Lineage2PacketWriter;
import com.l2jserver.game.net.packet.ServerPacket;
import com.l2jserver.game.net.packet.server.ActionFailedPacket;
import com.l2jserver.game.net.packet.server.SystemMessagePacket;
import com.l2jserver.model.id.object.CharacterID;
import com.l2jserver.model.template.ItemTemplate;
import com.l2jserver.model.world.Item;
import com.l2jserver.model.world.L2Character;
import com.l2jserver.service.game.world.WorldService;
import com.l2jserver.service.game.world.filter.impl.CharacterBroadcastFilter;
@@ -242,6 +246,71 @@ public class Lineage2Connection {
return channel.write(packet);
}
/**
* Sends a string message to this client
*
* @param message
* the message
* @return the {@link ChannelFuture} that will be notified once the packet
* has been written.
*/
public ChannelFuture sendMessage(String message) {
return write(new SystemMessagePacket(SystemMessage.S1)
.addString(message));
}
/**
* Sends a {@link SystemMessage} to this client
*
* @param message
* the {@link SystemMessage}
* @return the {@link ChannelFuture} that will be notified once the packet
* has been written.
*/
public ChannelFuture sendSystemMessage(SystemMessage message) {
return write(message.packet);
}
/**
* Sends a {@link SystemMessage} to this client
*
* @param message
* the {@link SystemMessage}
* @param args
* the arguments of the message, they will be automatically
* detected and inserted. See {@link SystemMessagePacket} for
* more about supported formats.
* @return the {@link ChannelFuture} that will be notified once the packet
* has been written.
* @see SystemMessagePacket
*/
public ChannelFuture sendSystemMessage(SystemMessage message,
Object... args) {
final SystemMessagePacket packet = new SystemMessagePacket(message);
for (final Object obj : args) {
if (obj instanceof String)
packet.addString((String) obj);
else if (obj instanceof ItemTemplate)
packet.addItem((ItemTemplate) obj);
else if (obj instanceof Item)
packet.addItem((Item) obj);
}
return write(message.packet);
}
/**
* Sends a {@link ActionFailedPacket} to the client.
* <p>
* This is an convenience method for <blockquote><code>
* conn.write(ActionFailedPacket.SHARED_INSTANCE);</code></blockquote>
*
* @return the {@link ChannelFuture} that will be notified once the packet
* has been written.
*/
public ChannelFuture sendActionFailed() {
return write(ActionFailedPacket.SHARED_INSTANCE);
}
/**
* Broadcast a packet to all characters in this character knownlist.
* <p>
@@ -261,7 +330,7 @@ public class Lineage2Connection {
.iterable(new CharacterBroadcastFilter(characterID.getObject()))) {
final Lineage2Connection conn = networkService.discover(character
.getID());
if(conn == null)
if (conn == null)
continue;
futures.add(conn.write(packet));
}

File diff suppressed because it is too large Load Diff

View File

@@ -42,9 +42,6 @@ public class CharacterActionPacket extends AbstractClientPacket {
*/
public static final int OPCODE = 0x1f;
private final Logger log = LoggerFactory.getLogger(this.getClass());
private final WorldService worldService;
private final ObjectIDResolver idResolver;
private int objectId;
@@ -73,9 +70,7 @@ public class CharacterActionPacket extends AbstractClientPacket {
}
@Inject
public CharacterActionPacket(WorldService worldService,
ObjectIDResolver idResolver) {
this.worldService = worldService;
public CharacterActionPacket(ObjectIDResolver idResolver) {
this.idResolver = idResolver;
}
@@ -90,9 +85,13 @@ public class CharacterActionPacket extends AbstractClientPacket {
@Override
public void process(final Lineage2Connection conn) {
// since this is an erasure type, this is safe.
System.out.println(objectId);
final ObjectID<NPC> id = idResolver.resolve(objectId);
if (!(id instanceof NPCID))
if (!(id instanceof NPCID)) {
System.out.println("Incorrect type: " + id);
conn.sendActionFailed();
return;
}
final NPC npc = id.getObject();
npc.action(conn.getCharacter(), action);
}

View File

@@ -21,9 +21,14 @@ import org.jboss.netty.buffer.ChannelBuffer;
import com.google.inject.Inject;
import com.l2jserver.game.net.Lineage2Connection;
import com.l2jserver.game.net.packet.AbstractClientPacket;
import com.l2jserver.game.net.packet.server.ActionFailedPacket;
import com.l2jserver.service.game.chat.ChatMessageDestination;
import com.l2jserver.service.game.chat.ChatService;
import com.l2jserver.service.game.chat.channel.PublicChatChannel;
import com.l2jserver.service.game.chat.ChatService.CannotChatToSelfChatServiceException;
import com.l2jserver.service.game.chat.ChatService.ChatBanActiveChatServiceException;
import com.l2jserver.service.game.chat.ChatService.TargetNotFoundChatServiceException;
import com.l2jserver.util.BufferUtils;
import com.l2jserver.util.exception.L2ChatServiceException;
/**
* Completes the creation of an character. Creates the object, inserts into the
@@ -44,54 +49,7 @@ public class CharacterChatMessagePacket extends AbstractClientPacket {
private final ChatService chatService;
private String message;
private MessageDestination destination;
public enum MessageDestination {
/**
* Everyone
*/
ALL(0),
/**
* !
*/
SHOUT(1),
/**
* Private message
*/
TELL(2),
/**
* #
*/
PARTY(3),
/**
* @
*/
CLAN(4), GM(5), PETITION_PLAYER(6), PETITION_GM(7),
/**
* +
*/
TRADE(8),
/**
* $
*/
ALLIANCE(9), ANNOUNCEMENT(10), BOAT(11), L2FRIEND(12), MSNCHAT(13), PARTYMATCH_ROOM(
14), PARTYROOM_COMMANDER(15), PARTYROOM_ALL(16), HERO_VOICE(17), CRITICAL_ANNOUNCE(
18), SCREEN_ANNOUNCE(19), BATTLEFIELD(20), MPCC_ROOM(21);
public final int id;
MessageDestination(int id) {
this.id = id;
}
public static MessageDestination fromID(int id) {
for (final MessageDestination dest : values()) {
if (dest.id == id)
return dest;
}
return null;
}
}
private ChatMessageDestination destination;
private String target;
@@ -103,16 +61,32 @@ public class CharacterChatMessagePacket extends AbstractClientPacket {
@Override
public void read(Lineage2Connection conn, ChannelBuffer buffer) {
this.message = BufferUtils.readString(buffer);
this.destination = MessageDestination.fromID(buffer.readInt());
if (this.destination == MessageDestination.TELL) { // private message
this.destination = ChatMessageDestination.fromID(buffer.readInt());
if (this.destination == ChatMessageDestination.TELL) { // private
// message
this.target = BufferUtils.readString(buffer);
}
}
@Override
public void process(final Lineage2Connection conn) {
final PublicChatChannel channel = chatService.getGlobalChannel();
// TODO handle chat destination!!!
channel.send(conn.getCharacterID(), message);
if (message.length() == 0 || destination == null) {
conn.write(ActionFailedPacket.SHARED_INSTANCE);
conn.close();
}
try {
chatService.send(conn.getCharacterID(), destination, message, target);
} catch (TargetNotFoundChatServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CannotChatToSelfChatServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ChatBanActiveChatServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

View File

@@ -20,9 +20,9 @@ import org.jboss.netty.buffer.ChannelBuffer;
import com.l2jserver.game.net.Lineage2Connection;
import com.l2jserver.game.net.packet.AbstractServerPacket;
import com.l2jserver.game.net.packet.client.CharacterChatMessagePacket.MessageDestination;
import com.l2jserver.game.net.packet.server.CharacterCreateFailPacket.Reason;
import com.l2jserver.model.world.L2Character;
import com.l2jserver.service.game.chat.ChatMessageDestination;
import com.l2jserver.util.BufferUtils;
/**
@@ -42,12 +42,12 @@ public class ActorChatMessagePacket extends AbstractServerPacket {
* The selected character
*/
private final L2Character character;
private MessageDestination destination;
private ChatMessageDestination destination;
private String message = null;
private int messageID = 0;
public ActorChatMessagePacket(L2Character character,
MessageDestination destination, String message) {
ChatMessageDestination destination, String message) {
super(OPCODE);
this.character = character;
this.destination = destination;

View File

@@ -0,0 +1,53 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.game.net.packet.server;
import org.htmlparser.tags.Html;
import org.jboss.netty.buffer.ChannelBuffer;
import com.l2jserver.game.net.Lineage2Connection;
import com.l2jserver.game.net.packet.AbstractServerPacket;
import com.l2jserver.model.world.NPC;
import com.l2jserver.util.BufferUtils;
/**
* This packet sends an HTML message to be displayed in the client.
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class NPCHtmlMessagePacket extends AbstractServerPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x19;
private final NPC npc;
private final Html html;
public NPCHtmlMessagePacket(NPC npc, Html html) {
super(OPCODE);
this.npc = npc;
this.html = html;
}
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeInt(npc.getID().getID());
BufferUtils.writeString(buffer, html.toHtml());
buffer.writeInt(0x00); // item id
}
}

View File

@@ -0,0 +1,256 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.game.net.packet.server;
import java.util.List;
import org.jboss.netty.buffer.ChannelBuffer;
import com.l2jserver.game.net.Lineage2Connection;
import com.l2jserver.game.net.SystemMessage;
import com.l2jserver.game.net.packet.AbstractServerPacket;
import com.l2jserver.model.game.Fort;
import com.l2jserver.model.game.Skill;
import com.l2jserver.model.template.ItemTemplate;
import com.l2jserver.model.template.SkillTemplate;
import com.l2jserver.model.world.Item;
import com.l2jserver.model.world.capability.Actor;
import com.l2jserver.util.BufferUtils;
import com.l2jserver.util.factory.CollectionFactory;
/**
* This packet sends an System Message to the client. Most messages appear in
* the console.
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class SystemMessagePacket extends AbstractServerPacket {
/**
* The packet OPCODE
*/
public static final int OPCODE = 0x62;
/**
* The System message id
*/
private int id;
/**
* The system message parameters
*/
private List<SystemMessagePacketParameter> params = CollectionFactory
.newList();
public interface SystemMessagePacketParameter {
public static final byte TYPE_SYSTEM_STRING = 13;
public static final byte TYPE_PLAYER_NAME = 12;
// id 11 - unknown
public static final byte TYPE_INSTANCE_NAME = 10;
public static final byte TYPE_ELEMENT_NAME = 9;
// id 8 - same as 3
public static final byte TYPE_ZONE_NAME = 7;
public static final byte TYPE_ITEM_NUMBER = 6;
public static final byte TYPE_CASTLE_NAME = 5;
public static final byte TYPE_SKILL_NAME = 4;
public static final byte TYPE_ITEM_NAME = 3;
public static final byte TYPE_NPC_NAME = 2;
public static final byte TYPE_NUMBER = 1;
public static final byte TYPE_TEXT = 0;
void write(Lineage2Connection conn, ChannelBuffer buffer);
}
/**
* Creates a new instance
*/
public SystemMessagePacket(SystemMessage message) {
super(OPCODE);
this.id = message.id;
}
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeInt(id);
buffer.writeInt(params.size());
for (final SystemMessagePacketParameter param : params) {
param.write(conn, buffer);
}
}
public final SystemMessagePacket addString(final String text) {
params.add(new SystemMessagePacketParameter() {
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeInt(TYPE_TEXT);
BufferUtils.writeString(buffer, text);
}
});
return this;
}
/**
* Castlename-e.dat<br>
* 0-9 Castle names<br>
* 21-64 CH names<br>
* 81-89 Territory names<br>
* 101-121 Fortress names<br>
*
* @param number
* @return
*/
public final SystemMessagePacket addFort(final Fort fort) {
params.add(new SystemMessagePacketParameter() {
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeInt(TYPE_CASTLE_NAME);
buffer.writeInt(fort.getID().getID());
}
});
return this;
}
public final SystemMessagePacket addNumber(final int number) {
params.add(new SystemMessagePacketParameter() {
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeInt(TYPE_NUMBER);
buffer.writeInt(number);
}
});
return this;
}
public final SystemMessagePacket addItemCount(final long number) {
params.add(new SystemMessagePacketParameter() {
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeInt(TYPE_ITEM_NUMBER);
buffer.writeLong(number);
}
});
return this;
}
public final SystemMessagePacket addActorName(final Actor actor) {
// params.add(new SystemMessagePacketParameter() {
// @Override
// public void write(Lineage2Connection conn, ChannelBuffer buffer) {
// // buffer.writeInt(TYPE_TEXT);
// // buffer.writeInt(number);
// // TODO
// }
// });
return this;
}
public final SystemMessagePacket addItem(final ItemTemplate item) {
params.add(new SystemMessagePacketParameter() {
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeInt(TYPE_ITEM_NAME);
buffer.writeInt(item.getID().getID());
}
});
return this;
}
public final SystemMessagePacket addItem(final Item item) {
return addItem(item.getTemplateID().getTemplate());
}
public final SystemMessagePacket addZoneName(final int x, final int y,
final int z) {
params.add(new SystemMessagePacketParameter() {
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeInt(TYPE_ZONE_NAME);
buffer.writeInt(x);
buffer.writeInt(y);
buffer.writeInt(z);
}
});
return this;
}
public final SystemMessagePacket addSkill(final SkillTemplate skill,
final int level) {
params.add(new SystemMessagePacketParameter() {
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeInt(TYPE_SKILL_NAME);
buffer.writeInt(skill.getID().getID());
buffer.writeInt(level);
}
});
return this;
}
public final SystemMessagePacket addSkill(final Skill skill) {
return addSkill(skill.getSkillTemplate(), skill.getLevel());
}
/**
* Elemental name - 0(Fire) ...
*
* @param type
* @return
*/
public final SystemMessagePacket addElemntal(final int type) {
params.add(new SystemMessagePacketParameter() {
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeInt(TYPE_ELEMENT_NAME);
buffer.writeInt(type);
}
});
return this;
}
/**
* ID from sysstring-e.dat
*
* @param type
* @return
*/
public final SystemMessagePacket addSystemString(final int type) {
params.add(new SystemMessagePacketParameter() {
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeInt(TYPE_SYSTEM_STRING);
buffer.writeInt(type);
}
});
return this;
}
/**
* Instance name from instantzonedata-e.dat
*
* @param type
* id of instance
* @return
*/
public final SystemMessagePacket addInstanceName(final int type) {
params.add(new SystemMessagePacketParameter() {
@Override
public void write(Lineage2Connection conn, ChannelBuffer buffer) {
buffer.writeInt(TYPE_INSTANCE_NAME);
buffer.writeInt(type);
}
});
return this;
}
}

View File

@@ -19,6 +19,7 @@ package com.l2jserver.model.template;
import com.google.inject.Inject;
import com.l2jserver.game.net.Lineage2Connection;
import com.l2jserver.game.net.packet.client.CharacterActionPacket.CharacterAction;
import com.l2jserver.game.net.packet.server.NPCHtmlMessagePacket;
import com.l2jserver.model.id.template.ItemTemplateID;
import com.l2jserver.model.id.template.NPCTemplateID;
import com.l2jserver.model.id.template.provider.ItemTemplateIDProvider;
@@ -29,6 +30,9 @@ import com.l2jserver.model.world.capability.Actor;
import com.l2jserver.service.game.CharacterService;
import com.l2jserver.service.network.NetworkService;
import com.l2jserver.util.calculator.Calculator;
import com.l2jserver.util.html.markup.Markup;
import com.l2jserver.util.html.markup.Markup.Builder;
import com.l2jserver.util.html.markup.MarkupTag;
/**
* Template for {@link NPC}
@@ -103,7 +107,19 @@ public abstract class NPCTemplate extends ActorTemplate<NPC> {
.getID());
if (conn == null)
return;
// target this npc
charService.target(character, npc);
// generate not implemented message
final Markup markup = new Markup(name + " - Notice", new Builder() {
@Override
public void build(MarkupTag body) {
body.text("This NPC is not yet implemented!");
body.addLink("Click me!", "test");
}
});
conn.write(new NPCHtmlMessagePacket(npc, markup.build()));
}
/**

View File

@@ -18,7 +18,7 @@ package com.l2jserver.service.game;
import com.google.inject.Inject;
import com.l2jserver.game.net.Lineage2Connection;
import com.l2jserver.game.net.packet.client.CharacterChatMessagePacket.MessageDestination;
import com.l2jserver.game.net.SystemMessage;
import com.l2jserver.game.net.packet.server.ActionFailedPacket;
import com.l2jserver.game.net.packet.server.ActorChatMessagePacket;
import com.l2jserver.game.net.packet.server.ActorMovementPacket;
@@ -46,6 +46,7 @@ import com.l2jserver.model.world.npc.event.NPCSpawnEvent;
import com.l2jserver.service.AbstractService;
import com.l2jserver.service.AbstractService.Depends;
import com.l2jserver.service.game.ai.AIService;
import com.l2jserver.service.game.chat.ChatMessageDestination;
import com.l2jserver.service.game.chat.ChatService;
import com.l2jserver.service.game.chat.channel.ChatChannel;
import com.l2jserver.service.game.chat.channel.ChatChannelListener;
@@ -120,7 +121,15 @@ public class CharacterServiceImpl extends AbstractService implements
public void onMessage(ChatChannel channel, CharacterID source,
String message) {
conn.write(new ActorChatMessagePacket(source.getObject(),
MessageDestination.ALL, message));
ChatMessageDestination.ALL, message));
}
};
final ChatChannelListener tradeChatListener = new ChatChannelListener() {
@Override
public void onMessage(ChatChannel channel, CharacterID source,
String message) {
conn.write(new ActorChatMessagePacket(source.getObject(),
ChatMessageDestination.TRADE, message));
}
};
@@ -158,6 +167,8 @@ public class CharacterServiceImpl extends AbstractService implements
// remove chat listeners
chatService.getGlobalChannel().removeChatChannelListener(
globalChatListener);
chatService.getTradeChannel().removeChatChannelListener(
tradeChatListener);
// remove broadcast listener
eventDispatcher.removeListener(broadcastListener);
@@ -170,6 +181,7 @@ public class CharacterServiceImpl extends AbstractService implements
// register global chat listener
chatService.getGlobalChannel().addChatChannelListener(
globalChatListener);
chatService.getTradeChannel().addChatChannelListener(tradeChatListener);
// send this user information
conn.write(new CharacterInformationPacket(character));
@@ -177,6 +189,10 @@ public class CharacterServiceImpl extends AbstractService implements
conn.write(new GameGuardQueryPacket());
conn.write(new CharacterInventoryPacket(character.getInventory()));
conn.sendSystemMessage(SystemMessage.WELCOME_TO_LINEAGE);
conn.sendMessage("This an an development version for l2jserver 2.0");
conn.sendMessage("Please note that many of the features are not yet implemented.");
// characters start in run mode
run(character);
@@ -237,6 +253,8 @@ public class CharacterServiceImpl extends AbstractService implements
eventDispatcher.dispatch(new CharacterTargetSelectedEvent(
character, target));
conn.write(new CharacterTargetSelectedPacket(target));
} else {
conn.sendActionFailed();
}
}

View File

@@ -0,0 +1,64 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.game.chat;
public enum ChatMessageDestination {
/**
* Everyone
*/
ALL(0),
/**
* !
*/
SHOUT(1),
/**
* Private message
*/
TELL(2),
/**
* #
*/
PARTY(3),
/**
* @
*/
CLAN(4), GM(5), PETITION_PLAYER(6), PETITION_GM(7),
/**
* +
*/
TRADE(8),
/**
* $
*/
ALLIANCE(9), ANNOUNCEMENT(10), BOAT(11), L2FRIEND(12), MSNCHAT(13), PARTYMATCH_ROOM(
14), PARTYROOM_COMMANDER(15), PARTYROOM_ALL(16), HERO_VOICE(17), CRITICAL_ANNOUNCE(
18), SCREEN_ANNOUNCE(19), BATTLEFIELD(20), MPCC_ROOM(21);
public final int id;
ChatMessageDestination(int id) {
this.id = id;
}
public static ChatMessageDestination fromID(int id) {
for (final ChatMessageDestination dest : values()) {
if (dest.id == id)
return dest;
}
return null;
}
}

View File

@@ -23,6 +23,7 @@ import com.l2jserver.service.Service;
import com.l2jserver.service.game.chat.channel.ChatChannel;
import com.l2jserver.service.game.chat.channel.PrivateChatChannel;
import com.l2jserver.service.game.chat.channel.PublicChatChannel;
import com.l2jserver.util.exception.L2ChatServiceException;
/**
* This service chatting in the server
@@ -30,6 +31,29 @@ import com.l2jserver.service.game.chat.channel.PublicChatChannel;
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public interface ChatService extends Service {
/**
* Sends a message to a public chat channel.
*
* @param sender
* the sender
* @param chat
* the chat type
* @param message
* the message
* @param extra
* the the extra message field
* @throws TargetNotFoundChatServiceException
* if target object not found
* @throws CannotChatToSelfChatServiceException
* if trying to send a private message to self
* @throws ChatBanActiveChatServiceException
* if there is chat ban active
*/
void send(CharacterID sender, ChatMessageDestination chat, String message,
String extra) throws TargetNotFoundChatServiceException,
CannotChatToSelfChatServiceException,
ChatBanActiveChatServiceException;
/**
* Get the Global {@link ChatChannel}. Messages sent in this chat are
* broadcasted to everyone online.
@@ -38,6 +62,22 @@ public interface ChatService extends Service {
*/
PublicChatChannel getGlobalChannel();
/**
* Get the Trade {@link ChatChannel}. Messages sent in this chat are
* broadcasted to everyone online.
*
* @return the trade {@link ChatChannel}
*/
PublicChatChannel getTradeChannel();
/**
* Get the Announcement {@link ChatChannel}. Messages sent in this chat are
* broadcasted to everyone online.
*
* @return the announcement {@link ChatChannel}
*/
PublicChatChannel getAnnouncementChannel();
/**
* Get the Region {@link ChatChannel}. Messages sent in this chat are
* broadcasted to everyone nearby.
@@ -69,4 +109,19 @@ public interface ChatService extends Service {
PublicChatChannel getChannel(ClanID clan);
// TODO party chat
public class TargetNotFoundChatServiceException extends
L2ChatServiceException {
private static final long serialVersionUID = 1L;
}
public class CannotChatToSelfChatServiceException extends
L2ChatServiceException {
private static final long serialVersionUID = 1L;
}
public class ChatBanActiveChatServiceException extends
L2ChatServiceException {
private static final long serialVersionUID = 1L;
}
}

View File

@@ -20,6 +20,7 @@ import java.util.Map;
import java.util.Set;
import com.google.inject.Inject;
import com.l2jserver.db.dao.CharacterDAO;
import com.l2jserver.model.id.object.CharacterID;
import com.l2jserver.model.id.object.ClanID;
import com.l2jserver.model.world.Clan;
@@ -42,12 +43,27 @@ import com.l2jserver.util.factory.CollectionFactory;
*/
// @Depends(RegionService.class)
public class SimpleChatService extends AbstractService implements ChatService {
/**
* The {@link RegionService}
*/
private final RegionService regionService;
/**
* The {@link L2Character} DAO
*/
private final CharacterDAO charDao;
/**
* The global chat channel
* The global {@link ChatChannel}
*/
private GlobalChatChannelImpl global;
/**
* The trade {@link ChatChannel}
*/
private TradeChatChannelImpl trade;
/**
* The announcement {@link ChatChannel}
*/
private AnnouncementChatChannelImpl announcement;
/**
* The list of private chat channels
*/
@@ -70,24 +86,70 @@ public class SimpleChatService extends AbstractService implements ChatService {
* the region service
*/
@Inject
public SimpleChatService() {
public SimpleChatService(CharacterDAO charDao) {
// this.regionService = regionService;
this.regionService = null;
this.charDao = charDao;
}
@Override
protected void doStart() throws ServiceStartException {
this.global = new GlobalChatChannelImpl();
this.trade = new TradeChatChannelImpl();
this.announcement = new AnnouncementChatChannelImpl();
this.privateChannels = CollectionFactory.newMap();
this.clanChannels = CollectionFactory.newMap();
this.regionChannels = CollectionFactory.newMap();
}
@Override
public void send(CharacterID sender, ChatMessageDestination chat,
String message, String extra)
throws TargetNotFoundChatServiceException,
CannotChatToSelfChatServiceException {
final ChatChannel channel;
switch (chat) {
case ALL:
channel = getGlobalChannel();
break;
case TRADE:
channel = getTradeChannel();
break;
case CLAN:
channel = getChannel(sender.getObject().getClanID());
break;
case TELL:
final L2Character character = charDao.selectByName(extra);
if (character == null)
throw new TargetNotFoundChatServiceException();
if (character.equals(sender))
throw new CannotChatToSelfChatServiceException();
channel = getChannel(character.getID());
break;
case ANNOUNCEMENT:
channel = getAnnouncementChannel();
break;
default:
return;
}
channel.send(sender, message);
}
@Override
public PublicChatChannel getGlobalChannel() {
return global;
}
@Override
public PublicChatChannel getTradeChannel() {
return trade;
}
@Override
public PublicChatChannel getAnnouncementChannel() {
return announcement;
}
@Override
public PublicChatChannel getRegionChannel(L2Character character) {
final Region region = regionService.getRegion(character);
@@ -101,6 +163,8 @@ public class SimpleChatService extends AbstractService implements ChatService {
@Override
public PrivateChatChannel getChannel(CharacterID character) {
if (character == null)
return null;
PrivateChatChannelImpl channel = privateChannels.get(character);
if (channel == null) {
channel = new PrivateChatChannelImpl(character);
@@ -111,6 +175,8 @@ public class SimpleChatService extends AbstractService implements ChatService {
@Override
public PublicChatChannel getChannel(ClanID clan) {
if (clan == null)
return null;
ClanChatChannelImpl channel = clanChannels.get(clan);
if (channel == null) {
channel = new ClanChatChannelImpl(clan);
@@ -171,13 +237,13 @@ public class SimpleChatService extends AbstractService implements ChatService {
}
@Override
public CharacterID getTarget() {
public CharacterID getDestination() {
return character;
}
}
/**
* Global {@link PublicChatChannel} implemenetation
* Global {@link PublicChatChannel} implementation
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
@@ -186,7 +252,25 @@ public class SimpleChatService extends AbstractService implements ChatService {
}
/**
* {@link PublicChatChannel} implemenetation for {@link Clan clans}
* Trade {@link PublicChatChannel} implementation
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
private class TradeChatChannelImpl extends ChatChannelImpl implements
PublicChatChannel {
}
/**
* Announcement {@link PublicChatChannel} implementation
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
private class AnnouncementChatChannelImpl extends ChatChannelImpl implements
PublicChatChannel {
}
/**
* {@link PublicChatChannel} implementation for {@link Clan clans}
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
@@ -209,7 +293,7 @@ public class SimpleChatService extends AbstractService implements ChatService {
}
/**
* {@link PublicChatChannel} implemenetation for {@link Region regions}
* {@link PublicChatChannel} implementation for {@link Region regions}
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/

View File

@@ -22,13 +22,13 @@ import com.l2jserver.model.id.object.CharacterID;
* An private {@link ChatChannel}. Please note that the concept of "private"
* does not mean it requires a password or something like that to join, but the
* message is only broadcasted to a single character (i.e. private messages).
* The target can be retrieved by {@link #getTarget()}.
* The destination can be retrieved by {@link #getDestination()}.
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public interface PrivateChatChannel extends ChatChannel {
/**
* @return the target of this private chat channel.
* @return the destination of this private chat channel.
*/
CharacterID getTarget();
CharacterID getDestination();
}

View File

@@ -78,7 +78,7 @@ public class CachedWorldIDService extends AbstractService implements
cache = new Cache(new CacheConfiguration("id-cache",
IDAllocator.ALLOCABLE_IDS)
.memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LRU)
.overflowToDisk(true).eternal(false).timeToLiveSeconds(60)
.overflowToDisk(true).eternal(true).timeToLiveSeconds(60)
.timeToIdleSeconds(30).diskPersistent(false)
.diskExpiryThreadIntervalSeconds(0));
cacheService.register(cache);
@@ -113,6 +113,7 @@ public class CachedWorldIDService extends AbstractService implements
public <I extends ObjectID<?>> void add(I id) {
if(id == null)
return;
System.out.println("Registering ID: "+id);
cache.put(new Element(id.getID(), id));
}

View File

@@ -0,0 +1,40 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.exception;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class L2ChatServiceException extends L2ServiceException {
private static final long serialVersionUID = 1L;
public L2ChatServiceException() {
super();
}
public L2ChatServiceException(String message, Throwable cause) {
super(message, cause);
}
public L2ChatServiceException(String message) {
super(message);
}
public L2ChatServiceException(Throwable cause) {
super(cause);
}
}

View File

@@ -0,0 +1,57 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.exception;
/**
* Base exception for Lineage 2
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class L2ServiceException extends Exception {
/**
* Default Serial Version UID
*/
private static final long serialVersionUID = 1L;
/**
* @see Exception#Exception()
*/
public L2ServiceException() {
super();
}
/**
* @see Exception#Exception(String, Throwable)
*/
public L2ServiceException(String message, Throwable cause) {
super(message, cause);
}
/**
* @see Exception#Exception(String)
*/
public L2ServiceException(String message) {
super(message);
}
/**
* @see Exception#Exception(Throwable)
*/
public L2ServiceException(Throwable cause) {
super(cause);
}
}

View File

@@ -0,0 +1,38 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.html;
import org.htmlparser.Tag;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.BodyTag;
import org.htmlparser.util.NodeList;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class L2BodyTag extends BodyTag {
private static final long serialVersionUID = 1L;
public L2BodyTag() {
super.setTagName("body");
Tag end = new TagNode();
end.setTagName("/body");
super.setEndTag(end);
super.setChildren(new NodeList());
}
}

View File

@@ -0,0 +1,37 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.html;
import org.htmlparser.Tag;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.Span;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class L2BrTag extends Span {
private static final long serialVersionUID = 1L;
public L2BrTag() {
super.setTagName("br");
Tag end = new TagNode();
end.setTagName("/br");
super.setEndTag(end);
super.setEmptyXmlTag(true);
}
}

View File

@@ -0,0 +1,36 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.html;
import org.htmlparser.Tag;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.Span;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class L2CenterTag extends Span {
private static final long serialVersionUID = 1L;
public L2CenterTag() {
super.setTagName("center");
Tag end = new TagNode();
end.setTagName("/center");
super.setEndTag(end);
}
}

View File

@@ -0,0 +1,38 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.html;
import org.htmlparser.Tag;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.Div;
import org.htmlparser.util.NodeList;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class L2DivTag extends Div {
private static final long serialVersionUID = 1L;
public L2DivTag() {
super.setTagName("div");
Tag end = new TagNode();
end.setTagName("/div");
super.setEndTag(end);
super.setChildren(new NodeList());
}
}

View File

@@ -0,0 +1,38 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.html;
import org.htmlparser.Tag;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.Span;
import org.htmlparser.util.NodeList;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class L2FontTag extends Span {
private static final long serialVersionUID = 1L;
public L2FontTag() {
super.setTagName("font");
Tag end = new TagNode();
end.setTagName("/font");
super.setEndTag(end);
super.setChildren(new NodeList());
}
}

View File

@@ -0,0 +1,37 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.html;
import org.htmlparser.Tag;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.HeadTag;
import org.htmlparser.util.NodeList;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class L2HeadTag extends HeadTag {
private static final long serialVersionUID = 1L;
public L2HeadTag() {
super.setTagName("head");
Tag end = new TagNode();
end.setTagName("/head");
super.setEndTag(end);
super.setChildren(new NodeList());
}
}

View File

@@ -0,0 +1,38 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.html;
import org.htmlparser.Tag;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.Html;
import org.htmlparser.util.NodeList;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class L2HtmlTag extends Html {
private static final long serialVersionUID = 1L;
public L2HtmlTag() {
super.setTagName("html");
Tag end = new TagNode();
end.setTagName("/html");
super.setEndTag(end);
super.setChildren(new NodeList());
}
}

View File

@@ -0,0 +1,36 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.html;
import org.htmlparser.Tag;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.ImageTag;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class L2ImageTag extends ImageTag {
private static final long serialVersionUID = 1L;
public L2ImageTag() {
super.setTagName("img");
Tag end = new TagNode();
end.setTagName("/img");
super.setEndTag(end);
super.setEmptyXmlTag(true);
}
}

View File

@@ -0,0 +1,38 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.html;
import org.htmlparser.Tag;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class L2LinkTag extends LinkTag {
private static final long serialVersionUID = 1L;
public L2LinkTag() {
super.setTagName("a");
Tag end = new TagNode();
end.setTagName("/a");
super.setEndTag(end);
super.setChildren(new NodeList());
super.setEmptyXmlTag(true);
}
}

View File

@@ -0,0 +1,37 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.html;
import org.htmlparser.Tag;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.Span;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class L2NewLineTag extends Span {
private static final long serialVersionUID = 1L;
public L2NewLineTag() {
super.setTagName("p");
Tag end = new TagNode();
end.setTagName("/pp");
super.setEndTag(end);
super.setEmptyXmlTag(true);
}
}

View File

@@ -0,0 +1,37 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.html;
import org.htmlparser.Tag;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.TitleTag;
import org.htmlparser.util.NodeList;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class L2TitleTag extends TitleTag {
private static final long serialVersionUID = 1L;
public L2TitleTag() {
super.setTagName("title");
Tag end = new TagNode();
end.setTagName("/title");
super.setEndTag(end);
super.setChildren(new NodeList());
}
}

View File

@@ -0,0 +1,57 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.html.markup;
import org.htmlparser.nodes.TextNode;
import org.htmlparser.tags.HeadTag;
import org.htmlparser.tags.Html;
import org.htmlparser.tags.TitleTag;
import com.l2jserver.util.html.L2HeadTag;
import com.l2jserver.util.html.L2HtmlTag;
import com.l2jserver.util.html.L2TitleTag;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class Markup {
private final Builder builder;
private final String title;
public Markup(String title, Builder builder) {
this.builder = builder;
this.title = title;
}
public Html build() {
final Html html = new L2HtmlTag();
final HeadTag head = new L2HeadTag();
final TitleTag title = new L2TitleTag();
head.getChildren().add(head);
head.getChildren().add(title);
title.getChildren().add(new TextNode(this.title));
this.builder.build(new MarkupTag(html));
return html;
}
public interface Builder {
void build(MarkupTag body);
}
}

View File

@@ -0,0 +1,123 @@
/*
* This file is part of l2jserver <l2jserver.com>.
*
* l2jserver is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* l2jserver is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.util.html.markup;
import org.htmlparser.Tag;
import org.htmlparser.nodes.TextNode;
import com.l2jserver.util.html.L2BrTag;
import com.l2jserver.util.html.L2CenterTag;
import com.l2jserver.util.html.L2DivTag;
import com.l2jserver.util.html.L2FontTag;
import com.l2jserver.util.html.L2ImageTag;
import com.l2jserver.util.html.L2LinkTag;
import com.l2jserver.util.html.L2NewLineTag;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class MarkupTag {
private final Tag tag;
private final MarkupTag parent;
public MarkupTag(Tag tag, MarkupTag parent) {
this.tag = tag;
this.parent = parent;
}
public MarkupTag(Tag tag) {
this(tag, null);
}
public MarkupTag attr(String name, String value) {
tag.setAttribute(name, value);
return this;
}
public MarkupTag text(String text) {
tag.getChildren().add(new TextNode(text));
return this;
}
public MarkupTag text(String text, String color) {
final Tag font = new L2FontTag();
font.setAttribute("color", color);
font.getChildren().add(new TextNode(text));
this.tag.getChildren().add(font);
return this;
}
public MarkupTag div() {
final Tag tag = new L2DivTag();
this.tag.getChildren().add(tag);
return new MarkupTag(tag, this);
}
public MarkupTag br() {
final Tag tag = new L2BrTag();
this.tag.getChildren().add(tag);
return this;
}
public MarkupTag p() {
final Tag tag = new L2NewLineTag();
this.tag.getChildren().add(tag);
return this;
}
public MarkupTag center() {
final Tag tag = new L2CenterTag();
this.tag.getChildren().add(tag);
return new MarkupTag(this.tag, this);
}
public MarkupTag addImage(String src, int height, int width) {
final Tag tag = new L2ImageTag();
this.tag.getChildren().add(tag);
tag.setAttribute("height", Integer.toString(height));
tag.setAttribute("width", Integer.toString(width));
tag.setAttribute("src", src);
return this;
}
public MarkupTag addLink(String text, String action) {
final Tag tag = new L2LinkTag();
this.tag.getChildren().add(tag);
tag.setAttribute("action", "bypass -h " + action);
tag.getChildren().add(new TextNode(text));
return this;
}
public MarkupTag close() {
return parent;
}
/**
* @return the tag
*/
public Tag getTag() {
return tag;
}
/**
* @return the parent
*/
public MarkupTag getParent() {
return parent;
}
}