-
Notifications
You must be signed in to change notification settings - Fork 31
Expand file tree
/
Copy pathChannelMapper.java
More file actions
85 lines (71 loc) · 3.66 KB
/
ChannelMapper.java
File metadata and controls
85 lines (71 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package at.helpch.chatchat.config.mapper;
import at.helpch.chatchat.api.channel.Channel;
import at.helpch.chatchat.api.format.PriorityFormat;
import at.helpch.chatchat.channel.ChannelTypeRegistryImpl;
import at.helpch.chatchat.config.holder.FormatsHolderImpl;
import io.leangen.geantyref.TypeToken;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.configurate.ConfigurationNode;
import org.spongepowered.configurate.serialize.SerializationException;
import org.spongepowered.configurate.serialize.TypeSerializer;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Map;
public final class ChannelMapper implements TypeSerializer<Channel> {
private static final String TOGGLE_COMMAND = "toggle-command";
private static final String MESSAGE_PREFIX = "message-prefix";
private static final String CHANNEL_PREFIX = "channel-prefix";
private static final String FORMATS = "formats";
private static final String RADIUS = "radius";
private static final String CROSS_SERVER = "cross-server";
private static final String TYPE = "type";
private static final TypeToken<Map<String, PriorityFormat>> FORMATS_MAP_TYPE = new TypeToken<>() {};
private final ChannelTypeRegistryImpl registry;
public ChannelMapper(final ChannelTypeRegistryImpl registry) {
this.registry = registry;
}
private ConfigurationNode nonVirtualNode(final ConfigurationNode source, final Object... path) throws SerializationException {
if (!source.hasChild(path)) {
throw new SerializationException("Required field " + Arrays.toString(path) + " was not present in node");
}
return source.node(path);
}
@Override
public Channel deserialize(Type type, ConfigurationNode node) throws SerializationException {
final var keyNode = node.key();
if (keyNode == null) {
throw new SerializationException("A config key cannot be null!");
}
final var key = keyNode.toString();
final var commandName = nonVirtualNode(node, TOGGLE_COMMAND).getList(String.class);
if (commandName == null) {
throw new SerializationException("Command name for " + key + " cannot be null!");
}
final var messagePrefix = node.node(MESSAGE_PREFIX).getString("");
final var channelPrefix = node.node(CHANNEL_PREFIX).getString("");
final var formatsMap = node.node(FORMATS).get(FORMATS_MAP_TYPE, Map.of());
final var formats = new FormatsHolderImpl(formatsMap);
final var radius = node.node(RADIUS).getInt(-1);
final var crossServer = node.node(CROSS_SERVER).getBoolean(false);
final var channelType = node.node(TYPE).getString("default").toLowerCase();
final var builder = registry.builders().get(channelType);
if (builder == null) {
throw new SerializationException("Channel " + key + " has unknown channel type " + channelType + ", " +
"ignoring.");
}
return builder.build(key, messagePrefix, commandName, channelPrefix, formats, radius, crossServer);
}
@Override
public void serialize(Type type, @Nullable Channel channel, ConfigurationNode target) throws SerializationException {
if (channel == null) {
target.raw(null);
return;
}
target.node(TOGGLE_COMMAND).set(channel.commandNames());
target.node(MESSAGE_PREFIX).set(channel.messagePrefix());
target.node(CHANNEL_PREFIX).set(channel.channelPrefix());
target.node(FORMATS).set(channel.formats().formats());
target.node(RADIUS).set(channel.radius());
target.node(CROSS_SERVER).set(channel.crossServer());
}
}